.modpack files
A MODPACK project = one .modpack file: UTF-8 JSON,
indented, with a stable field order — readable by eye and diffable in
Git, the draw.io spirit. It is the only source of truth.
New, Open, Save
- New creates a genuinely blank project: the default scale, no sprint, no backlog.
- Open loads a file through the browser's picker. An invalid file (encoding, version, missing field) is refused with a precise message, never overwriting your current project.
- Save downloads
<project-name>.modpack. A cancelled save is not a save: the "modified" indicator stays.
Never a silent loss
- Unsaved changes announce themselves: a "● modified" indicator in the bar, an accented "Save" button.
- Internal exits ("New", "Open", sample project) open a three-choice modal: Save and continue, Continue without saving, Cancel (the safe default).
- Closing the tab, refreshing or navigating away triggers the browser's native warning while changes are unsaved.
The schema
The format is deliberately simple â here it is in full, comments included. Unknown fields are ignored; an invalid field is refused on open with a precise message, without touching the current project. Fields marked "optional" may be omitted.
{
"version": 1,
"name": "My project",
"accentColor": "#3F51B5", // optional: project accent
"mode": "free", // optional: "free" | "tetris"
"tetrisEnabled": false, // optional: offer Tetris mode
"defaults": { // optional: new-sprint defaults
"sprintName": "Sprint",
"sprintCapacity": 45
},
"unitScale": {
"name": "T-shirt", // scale name
"unitLabel": "pts", // displayed unit label
"sizes": [ // ordered by increasing value
{ "label": "XS", "value": 5 },
{ "label": "S", "value": 10 },
{ "label": "M", "value": 20 },
{ "label": "L", "value": 40 },
{ "label": "XL", "value": 80 }
]
},
"tasks": [
{
"id": "t-001",
"title": "Map component: workspace setup",
"scope": "Mapping", // functional scope (optional)
"description": "Base map + business layers.", // optional
"value": 10, // estimation in points = cell count
"color": "#90CAF9", // optional: block color
"dependsOn": ["t-000"], // optional: prerequisite tasks
"position": { "x": 720, "y": 96 }, // optional: block laid on the board
"width": 5 // optional: chosen silhouette on the board
}
],
"sprints": [
{
"id": "s-001",
"name": "Sprint 1",
"capacity": 45, // points = grid cells
"position": { "x": 96, "y": 48 }, // optional: position on the board
"dependsOn": ["s-000"], // optional: prerequisite sprints
"placements": [
// anchor: anchor cell; width: width chosen when reshaping â
// both omitted when automatic.
{ "taskId": "t-001", "anchor": 5, "width": 5 }
]
}
]
}
The scale above is a new project's default (t-shirt, XS=5 ⦠XL=80, 45-pt sprints).
Local-first, by design
There is no auto-save and no browser storage: the file is the only source of truth — you keep it, version it and share it however you like. Only interface preferences (theme, language) live on your machine. Nothing goes to a server — see Your data.