File Format (.dplan)

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.

Saving and Opening

Replace discards all unsaved in-memory work immediately. Always save your current state (Ctrl+S) before opening a different file with Replace.

Top-Level File Structure

{
  "version": "1.0",
  "exportedAt": "2025-03-15T14:32:00Z",
  "projects": [ ... ]
}
FieldTypeDescription
versionStringFile format version. DPlan uses this to detect files from older versions and apply migrations if needed.
exportedAtISO 8601 stringUTC timestamp of when the file was saved. Informational only.
projectsArrayOne or more project objects. Most users have a single project per file, but Portfolio saves embed multiple projects.

Project Object Schema

{
  "id": "proj_a1b2c3",
  "name": "Website Redesign",
  "status": "active",
  "currency": "£",
  "createdAt": "2025-01-10T09:00:00Z",
  "tasks": [ ... ],
  "resources": [ ... ],
  "holidays": [ ... ],
  "events": [ ... ],
  "baseline": { ... } | null,
  "settings": { ... }
}
FieldTypeDescription
idStringUnique identifier for this project. Generated on creation, never changes. Prevents ID collisions when merging files.
nameStringDisplay name. Used as filename stem on export.
statusStringOne of planning, active, on-hold, completed.
currencyStringCurrency symbol for cost display (e.g., £, $, ). Display only — no conversion.
createdAtISO 8601Project creation timestamp.
tasksArrayOrdered array of task objects. Order matches display order in the task table. Hierarchy is encoded via the indent field, not nesting.
resourcesArrayResource pool for this project.
holidaysArrayNon-working day definitions.
eventsArrayTeam event definitions.
baselineObject or nullBaseline snapshot, or null if no baseline has been captured.
settingsObjectProject-level settings (see below).

Task Object Schema

{
  "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
}
FieldTypeDescription
idStringUnique task identifier. Referenced in dependency predecessorId fields and resource assignment arrays.
nameStringTask display name.
typeStringtask, milestone, or summary.
indentIntegerHierarchy 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.
startYYYY-MM-DDTask start date.
finishYYYY-MM-DDTask finish date.
durationIntegerDuration in working days. Derived field — computed from start/finish on load, but stored for performance.
progressInteger (0–100)Completion percentage.
statusStringnot-started, in-progress, completed, on-hold, cancelled.
priorityStringlow, medium, high, critical.
fixedCostNumberOne-time fixed cost in project currency. 0 if none.
constraintStringasap, alap, snet, snlt, fnet, mso.
constraintDateYYYY-MM-DD or nullDate for SNET/SNLT/FNET/MSO constraints. Null for ASAP/ALAP.
anchoredBooleanIf true, auto-scheduler will not move this task's start date.
resourcesArray of IDsResource IDs from the project's resource pool assigned to this task.
dependenciesArray of objectsEach object: { predecessorId, lag }. lag is in working days — positive = delay, negative = overlap (lead).
barColorCSS color string or nullCustom bar color override. Null = use theme default.
deadlineYYYY-MM-DD or nullAdvisory deadline. Warning shown if finish exceeds this date.
notesStringFree-form notes. Empty string if none.
collapsedBooleanFor summary tasks: whether children are hidden in the view. Preserved on save.
recurrenceObject or nullRecurrence rule object for recurring tasks. See Recurring Tasks. Null for non-recurring tasks.

Resource Object Schema

{
  "id": "res_r1s2t3",
  "name": "Alice Chen",
  "role": "Frontend Developer",
  "dayRate": 450
}
FieldTypeDescription
idStringUnique resource identifier. Referenced in task resources arrays.
nameStringDisplay name. Shown in task bars, table, and exports.
roleStringJob title or role description. Informational, shown in Excel Resources sheet.
dayRateNumberCost per working day. Used in cost calculations when Cost Tracking is enabled.

Holiday and Event Schemas

// 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.

Baseline Object

{
  "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.

Settings Object

{
  "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.

Auto-Save to localStorage

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.

Clearing browser data, browsing history, or site data will erase localStorage, losing any unsaved work. The .dplan file is the only reliable long-term backup. Export it at the end of every session.

Portability and Forward Compatibility