central/planner

Mission control for your research — every task runs its own Claude session.

Central Planner is a local dashboard for research projects. Each task launches a real Claude coding session, and the rest of the working loop is built around it: a live console that narrates whole agent teams, HTML and PDF artifact viewers, a genuine LaTeX environment with live recompile, change history with one-click rewind, and a ledger that knows where the week went.

The Central Planner workbench: a Claude session console mid-conversation on the left, the task's HTML artifact and session composer on the right, pinned context files and the week's ledger in the sidebar.
The workbench. A session’s console mid-turn, the artifact it just refreshed, pinned context and the week’s token ledger — one screen per project, one tab per task.
Sessions

One task, one resumable Claude session.

Tasks are organized by project and category. Each launch assembles a context packet — the project’s living abstract, a category primer, upstream handoffs, pinned files — and streams the session into the console. When a task finishes, it proposes a structured handoff; accept it and downstream tasks inherit the summary, artifacts, and decisions as context. Oversight is a per-task dial:

AUTO

Runs to completion. Come back to a handoff proposal.

PROPOSE

Plan first. Nothing executes until you approve it.

COOP

Turn by turn — the conversation you see in these shots.

MANUAL

No agent at all. Some tasks are just yours.

The console

Watch the whole team work.

The console narrates everything a turn does — including the subagents it fans out. Each ◆ agent announces what it was asked, streams live summaries of what it’s doing with tool and token counts, and reports back ✓ done. A running ledger tallies the turn’s file edits as they land. And when the session starts a long Julia, R, or Python job, a live job card rides the stream: elapsed, %CPU, memory, and a ⊘ stop that terminates the real process tree.

Detached runs (nohup, trailing &) keep their card after the turn ends — it lives until the process itself exits. Scripts you launch yourself with ▶ get honest progress bars: parsed iteration counters, ETAs, and an amber quiet-clock when a run has printed nothing lately.

A live session console: two subagents running with live summaries, a file-edit tally, and a job card for a running Julia script showing elapsed time, CPU, memory, and a stop button. The sidebar shows task lineage, pinned files, deadlines, and recent activity.
Mid-sweep: two agents auditing moments and chasing citations, four files already edited, and sweep/fig3.jl at 342% CPU with a stop button that means it. Lineage, deadlines, and the activity feed keep the sidebar honest.
§LaTeX

A genuine LaTeX environment, not a text box.

Pin a .tex and it opens with math-aware highlighting; watch it and latexmk -pvc recompiles on every save into an in-app PDF pane that keeps your scroll and zoom, swapping pages only when their fresh pixels are ready. SyncTeX works both ways — double-click the PDF to jump to the source line, ⌘J to flash your line in the PDF. Completions cover \cite keys from your .bib files, \labels across the whole project, environments with auto-\end, and command skeletons. Compile errors land in a strip under the editor with the offending lines tinted — click to jump.

The LaTeX workbench: highlighted TeX source with a label-completion popup open, and the live-compiled PDF of the paper beside it.
The draft on the left, its live-compiled PDF on the right, a \ref completion popup listing every label in the project.
Claude fix

Build breaks come back as suggestions, not edits.

When a compile failure kills the PDF, one click sends a sandboxed read-only Claude session to study the failure. Suggestions highlight in place: the offending text struck through, a pane right below it with the complete replacement and the reason — Apply or Dismiss where you’re already reading. Applying patches your unsaved draft, so you can keep typing the whole time and nothing on disk changes until you save. A suggestion you’ve already fixed yourself quietly retires.

A Claude fix suggestion superimposed on the LaTeX editor: a misspelled command struck through in red, with the proposed replacement and its reason shown in a card directly beneath, offering Apply and Dismiss buttons.
The misspelled command that killed the build, struck through — the fix and its why one keystroke away, for $0.14.
ΔChange history

Every turn that edits files records a change-set. Every change-set rewinds.

The Δ tab lists each turn’s files grouped by folder — verb, edit count, ±lines — with a per-file ⟲ rewind. Click a file and it opens as a full inline unified diff: removals struck red, additions washed green, long unchanged runs folded into a clickable row, an edit k/M stepper to hop between hunks. Rewinds are themselves recorded, so they can be undone. Edits to granted external files are tracked too.

The change-history tab showing an inline unified diff of a Julia calibration script: removed lines struck through in red, added lines highlighted green, a folded run of unchanged lines, and a rewind-file button in the header.
What the session actually did to calibrate.jl, line by line — and the one-click path back if you disagree.
Overview

An overview that knows where the time went.

The home screen shows live sessions, what’s waiting on you, the week’s Claude tokens per project against your targets, and the freshest live-compiled deck. Underneath it all is an append-only plain-JSONL ledger of your seconds and Claude’s tokens — readable with your own tools, no export step. Light and dark themes, switchable in Settings or following the OS.

The overview screen in light mode: live Claude sessions, an up-next queue of tasks, a weekly token ring at 7.9 million tokens, and a per-project ledger table.
The overview in light mode — sessions, the up-next queue, the week’s token ring, and the per-project ledger.
Phone

The same server, in your pocket.

The one Node process also serves a PWA-installable phone view — check what’s running, read a session, add a task from the hallway, browse artifacts. For always-on use, run the server on a desk machine and reach it over a private Tailscale network; the repo’s REMOTE.md walks through it. It has no authentication by design — keep it off the public internet.

The phone view: a running task with a live status chip, three queued tasks across projects, and the week's hours and token count in the header.
And the rest of the loop

Small tools that add up to a working day.

Pins that respect your data

Code pins are read on demand. Data pins (.csv, .parquet, .dta, .xlsx…) inject a generated schema card — columns, types, sample rows — never the contents. Folder pins inject a size-annotated tree.

A file runner

▶ runs the open .jl / .py / .r / .sh file with output streaming into a tab; .sql runs through DuckDB in place over your parquet and CSVs; ▶ on a .tex compiles it into its own PDF tab.

Artifact viewers

New .html and .pdf files in a project surface automatically. HTML pages are editable in place — WYSIWYG, scripts paused — and save back to disk faithfully.

A warm Julia REPL

Projects with Julia code get a persistent Kaimon session — packages and state stay loaded across turns instead of respawning julia for every iteration.

Deadlines & calendar

◆ Next up counts down the project’s next dated things. Connect Google Calendar by secret iCal URL — read-only forever, no OAuth — and file each meeting series to its project once.

A live activity feed

The sidebar keeps a timeline of what just happened — edits with ±line counts, finished runs with durations, completed tasks. Every row goes somewhere: the diff, the output, the archived task.

A sign-in card, not a mystery

If the dashboard can’t reach Claude — login expired, key gone bad — an amber card names the problem and one click runs the official CLI sign-in. ↻ Retry turn re-runs the turn that died.

Self-updating

Once a day it checks whether your checkout is behind its repo. Settings lists what’s new; ⬆ Update now fast-forwards only when that’s safe, and refuses if you have local edits.

$Quickstart

Two ways in. One of them is just asking Claude.

the easy way — let Claude set you up
git clone \
  https://github.com/grahamelewis/central-planner.git
cd central-planner && claude
> /setup   # Claude reads the docs and walks you
          # through install, config, and launch —
          # pausing for your OK at each step
or by hand
cd app && npm install && cd ..
export ANTHROPIC_API_KEY=sk-ant-...
cp config.example.json config.json  # name + projects
cd app && npm start                 # → localhost:4242

Node ≥ 20 and access to Claude (an ANTHROPIC_API_KEY, or an existing Claude Code login). LaTeX features want latexmk; the runner wants whichever of julia / python / R you use.

Real, billed Claude calls. Task launches and messages spend your own credits, and there is no spend cap. The dashboard binds to localhost and ships no authentication — keep it there, and use a private network like Tailscale (never a public tunnel) if you want it on other devices.