Planner format
One JSON object describes one week. The Weekly Planner skill, the offline dashboard.html, and the online planner all read and write it.
- The skill saves it as
skillplug-state/planner/week-plan.json. - The offline dashboard reads it from
planner/dashboard/planner-data.jsaswindow.SKILLPLUG_PLANNER_DATA = { ... }; - Both planners export it with More, then Export a backup and load it with More, then Import a plan.
The planners are forgiving: unknown fields are ignored and missing ones get defaults.
Example
week-plan.json
{ "schema": "skillplug-planner/1", "updatedAt": "2026-10-19T07:05:00-05:00", "source": "agent", "title": "My cardio block week", "weekOf": "2026-10-19", "focus": "Finish the cardio block with daily Anki and 40 questions a day.", "countdowns": [{ "id": "c1", "label": "Cardio block exam", "date": "2026-10-30" }], "goals": [{ "id": "g1", "text": "200 cardio questions", "done": false }], "sections": [ { "id": "mon", "kind": "day", "title": "Monday", "date": "2026-10-19", "color": "sky", "tasks": [ { "id": "t1", "text": "Anki reviews", "done": false, "tag": "anki", "mins": 45, "carried": false, "carries": 0 }, { "id": "t2", "text": "20 cardio questions, tutor mode, full review", "done": false, "tag": "qbank", "mins": 60, "carried": false, "carries": 0 } ] }, { "id": "dump", "kind": "list", "title": "Brain dump", "date": null, "color": "zinc", "tasks": [] } ], "tags": [{ "id": "anki", "name": "Anki", "color": "violet" }], "notes": "", "history": [{ "weekOf": "2026-10-12", "done": 31, "total": 38 }], "settings": { "showWeekend": true, "compact": false, "layout": "grid", "widgets": { "countdown": true, "progress": true, "focus": true, "notes": true } }}Top level
| Field | Type | Notes |
|---|---|---|
schema | string | Always "skillplug-planner/1" |
updatedAt | string | ISO time of the last change. The newer copy wins on open. |
source | string | "agent" from the skill; exports say "dashboard" or "web" |
title | string | Week name shown at the top |
weekOf | string | The Monday, YYYY-MM-DD |
focus | string | One sentence: what makes this week a win |
countdowns | array | { id, label, date }; the first is shown big |
goals | array | { id, text, done }, 1 to 3 measurable goals |
sections | array | Days and lists, in display order |
tags | array | { id, name, color } |
notes | string | Free text, up to 5,000 characters |
history | array | Past weeks { weekOf, done, total }, newest last, at most 12 (drives the chart) |
settings | object | showWeekend, compact, layout ("grid" or "columns"), and widgets |
Colors: sky, periwinkle, indigo, violet, amber, rose, teal, orange, zinc. Older plans that use lime open as sky.
Sections
| Field | Type | Notes |
|---|---|---|
id | string | Stable id, kept across updates |
kind | string | "day" (has a date) or "list" (for example Brain dump, Patient topics, Life admin) |
title | string | "Monday" or any name you chose. Agents never rename what you renamed. |
date | string or null | YYYY-MM-DD for days, null for lists |
color | string | One of the colors above |
collapsed | boolean | Optional |
tasks | array | Tasks in order |
Tasks
| Field | Type | Notes |
|---|---|---|
id | string | Stable id, so checkmarks survive updates |
text | string | Verb, amount, and scope, up to 300 characters |
done | boolean | Checked off |
tag | string or null | A tag id (defaults: anki, qbank, lecture, review, clinical, life) |
mins | number | Estimate in minutes, 0 if none |
carried | boolean | Moved from an earlier day |
carries | number | Times carried. Two or more means shrink or drop it. |
Rules for agents
- Import the latest export before writing.
- Keep ids stable. Change
done,text, or order instead of recreating tasks. - Valid JSON only: double quotes, no comments, no trailing commas.
- No patient identifiers, passwords, or exam IDs in any field.