A .dplan file is a plain UTF-8 JSON file with the .dplan extension. It contains the complete state of one or more projects — tasks, resources, scheduling settings, baseline, holidays, and events. It is human-readable, version-control friendly, and portable across any device with a modern browser.
Website-Redesign.dplan).
{
"version": "1.0",
"exportedAt": "2025-03-15T14:32:00Z",
"projects": [ ... ]
}
| Field | Type | Description |
|---|---|---|
version | String | File format version. DPlan uses this to detect files from older versions and apply migrations if needed. |
exportedAt | ISO 8601 string | UTC timestamp of when the file was saved. Informational only. |
projects | Array | One or more project objects. Most users have a single project per file, but Portfolio saves embed multiple projects. |
{
"id": "proj_a1b2c3",
"name": "Website Redesign",
"status": "active",
"currency": "£",
"createdAt": "2025-01-10T09:00:00Z",
"tasks": [ ... ],
"resources": [ ... ],
"holidays": [ ... ],
"events": [ ... ],
"baseline": { ... } | null,
"settings": { ... }
}
| Field | Type | Description |
|---|---|---|
id | String | Unique identifier for this project. Generated on creation, never changes. Prevents ID collisions when merging files. |
name | String | Display name. Used as filename stem on export. |
status | String | One of planning, active, on-hold, completed. |
currency | String | Currency symbol for cost display (e.g., £, $, €). Display only — no conversion. |
createdAt | ISO 8601 | Project creation timestamp. |
tasks | Array | Ordered array of task objects. Order matches display order in the task table. Hierarchy is encoded via the indent field, not nesting. |
resources | Array | Resource pool for this project. |
holidays | Array | Non-working day definitions. |
events | Array | Team event definitions. |
baseline | Object or null | Baseline snapshot, or null if no baseline has been captured. |
settings | Object | Project-level settings (see below). |
{
"id": "task_x9y8z7",
"name": "Design wireframes",
"type": "task",
"indent": 1,
"start": "2025-03-10",
"finish": "2025-03-14",
"duration": 5,
"progress": 60,
"status": "in-progress",
"priority": "high",
"fixedCost": 0,
"constraint": "asap",
"constraintDate": null,
"anchored": false,
"resources": ["res_r1s2t3"],
"dependencies": [
{ "predecessorId": "task_a1b2c3", "lag": 0 }
],
"barColor": null,
"deadline": null,
"notes": "Acceptance criteria: responsive at 320px, 768px, 1440px.",
"collapsed": false,
"recurrence": null
}
| Field | Type | Description |
|---|---|---|
id | String | Unique task identifier. Referenced in dependency predecessorId fields and resource assignment arrays. |
name | String | Task display name. |
type | String | task, milestone, or summary. |
indent | Integer | Hierarchy depth. 0 = top-level. 1 = child of the nearest parent at depth 0. Used to reconstruct the WBS tree on load — no actual JSON nesting. |
start | YYYY-MM-DD | Task start date. |
finish | YYYY-MM-DD | Task finish date. |
duration | Integer | Duration in working days. Derived field — computed from start/finish on load, but stored for performance. |
progress | Integer (0–100) | Completion percentage. |
status | String | not-started, in-progress, completed, on-hold, cancelled. |
priority | String | low, medium, high, critical. |
fixedCost | Number | One-time fixed cost in project currency. 0 if none. |
constraint | String | asap, alap, snet, snlt, fnet, mso. |
constraintDate | YYYY-MM-DD or null | Date for SNET/SNLT/FNET/MSO constraints. Null for ASAP/ALAP. |
anchored | Boolean | If true, auto-scheduler will not move this task's start date. |
resources | Array of IDs | Resource IDs from the project's resource pool assigned to this task. |
dependencies | Array of objects | Each object: { predecessorId, lag }. lag is in working days — positive = delay, negative = overlap (lead). |
barColor | CSS color string or null | Custom bar color override. Null = use theme default. |
deadline | YYYY-MM-DD or null | Advisory deadline. Warning shown if finish exceeds this date. |
notes | String | Free-form notes. Empty string if none. |
collapsed | Boolean | For summary tasks: whether children are hidden in the view. Preserved on save. |
recurrence | Object or null | Recurrence rule object for recurring tasks. See Recurring Tasks. Null for non-recurring tasks. |
{
"id": "res_r1s2t3",
"name": "Alice Chen",
"role": "Frontend Developer",
"dayRate": 450
}
| Field | Type | Description |
|---|---|---|
id | String | Unique resource identifier. Referenced in task resources arrays. |
name | String | Display name. Shown in task bars, table, and exports. |
role | String | Job title or role description. Informational, shown in Excel Resources sheet. |
dayRate | Number | Cost per working day. Used in cost calculations when Cost Tracking is enabled. |
// Holiday
{ "date": "2025-12-25", "name": "Christmas Day" }
// Event
{ "id": "evt_e1f2g3", "date": "2025-03-01", "name": "Sprint 5 Demo", "color": "#9c59d1" }
Holidays are simple date + name pairs. Events additionally carry an ID and a color for rendering on the Gantt and Calendar.
{
"capturedAt": "2025-02-01T08:00:00Z",
"tasks": [
{ "id": "task_x9y8z7", "start": "2025-03-10", "finish": "2025-03-14" },
...
]
}
The baseline stores the snapshot start and finish dates for every task at the time SCHEDULE → Set Baseline was triggered. On load, DPlan compares current task dates against baseline dates to render variance bars. See Baseline.
{
"progressRollup": true,
"costTracking": false,
"baselineVarianceBars": false,
"notesHoverPreview": true,
"dragDropReorder": true
}
These are the five feature toggles from the Settings panel, saved per-project. Note that theme is not stored here — it is a device-level preference stored separately in localStorage and never written to the .dplan file.
DPlan automatically saves the current in-memory project state to localStorage after every meaningful change: adding/editing/deleting a task, changing dates, updating progress, etc. This provides session recovery if the browser closes unexpectedly. On next open, DPlan restores the last auto-saved state.
localStorage limits vary by browser but are typically 5–10 MB per origin. A project with hundreds of tasks and detailed notes may approach this limit. DPlan does not currently warn when approaching the limit — save a .dplan file regularly to ensure you have a recoverable backup outside the browser.