Open-source save editor for Devil May Cry HD Collection (Steam) — built for personal use and as an educational project on binary data manipulation.
DMC Save Editor lets you load, inspect, and modify .sav files from the Devil May Cry HD Collection on Steam — directly in the browser, with no server involved. Everything happens client-side.
The project was also born as a study on binary file manipulation: understanding endianness, raw memory layout, and how game save data is structured at the byte level. If you're curious about those topics, this codebase is meant to be readable and educational.
Sound assets and textures used in the UI were extracted from the game via Devil May Cry HD Collection – Extract All Assets (Nexus Mods).
| Game | Status | Checksum |
|---|---|---|
| Devil May Cry 1 | ✅ Supported | None |
| Devil May Cry 2 | 🔜 Coming soon | None |
| Devil May Cry 3 | 🔜 Coming soon | Required (auto-recalculated on save) |
- Import
.savfiles via drag & drop or file picker - Select from up to 10 save slots per file
- Edit save data: current mission, difficulty, orbs, playtime, vitality, devil trigger
- Download the modified
.savfile, ready to drop back into your game - Automatic game detection from magic bytes
- Browser language detection (English and Portuguese)
| Layer | Technology |
|---|---|
| UI Framework | React 19 + TypeScript 5.7 |
| Build Tool | Vite 6 + SWC |
| Styling | Tailwind CSS v4 + shadcn/ui |
| Forms | React Hook Form + Zod |
| i18n | react-i18next |
| State | React Context |
| Routing | React Router v7 |
| Testing | Vitest + Testing Library |
| Package Manager | Bun |
# Install dependencies
bun install
# Start the dev server
bun run dev
# Run tests
bun run test
# Production build
bun run buildsrc/
├── components/ # Reusable UI components
│ ├── dmc1-editor/ # DMC1-specific form fields
│ ├── layout/ # App shell (header/footer)
│ └── ui/ # shadcn/ui primitives
├── contexts/ # React context (global game file state)
├── enums/ # Game version and difficulty enums
├── hooks/ # Custom React hooks
├── i18n/ # Translations (pt-BR, en)
├── interfaces/ # TypeScript interfaces for save data
├── screens/ # Page-level components (home, dmc1 editor)
├── stores/ # Zustand stores
├── types/ # Global type declarations
└── utils/
├── parsers.ts # Binary read/write logic (core)
├── detect-game.ts # Magic byte game detection
└── data.ts # Formatting helpers
- User drops a
.savfile onto the page - The file is read as an
ArrayBuffer(raw binary) detect-game.tschecks magic bytes to identify the game- The appropriate parser (e.g.
parseDmc1Slots) reads field values usingDataViewwith Little Endian offsets - Values are displayed in a form — user edits them
- On download,
serializeDmc1Slotwrites the values back into the buffer at the correct offsets - The buffer is exported as a
.savfile via a blob download
See docs/dmc1-format.md for a full breakdown of the binary format.
| Document | Description |
|---|---|
| docs/dmc1-format.md | DMC1 save file binary format, all offsets, data types |
| docs/architecture.md | Codebase architecture and how to add a new game |
| docs/contributing.md | How to contribute, conventions, and workflow |
Contributions are welcome! Whether you've mapped new offsets, found a bug, or want to add DMC2/DMC3 support — open an issue or pull request.
Please read docs/contributing.md before submitting.
This project is licensed under CC BY-NC-SA 4.0.
- ✅ Personal and educational use
- ✅ Modification and contribution
- ✅ Redistribution under the same license
- ❌ Commercial use
- ❌ Publishing as your own product without the original author's permission
Disclaimer: This project is not affiliated with, endorsed by, or connected to Capcom Co., Ltd. Devil May Cry is a registered trademark of Capcom Co., Ltd. All rights reserved.