Open source · Apache 2.0 · v1.0

The spreadsheet and its drawings,
on one screen

PlanLink reads a tracker straight out of the Excel file, derives each record's status from its dates, checks that answer against the workbook's own formulas, and puts the matching drawing on screen beside it. Pure standard-library Python plus one HTML file — nothing to install, nothing to sign into, and no network request in the whole system.

Download PlanLink v1.0 Read the build story Free · Apache 2.0 · pure standard library

What you're downloading

This is code you adapt to your own tracker with an AI coding assistant — Claude Code, Cursor, or Codex — not a turnkey app. The repo carries a CLAUDE.md/AGENTS.md map written for exactly that: here is the architecture, and here is what to tell your assistant about your own columns and status rules.

It ships with a complete fictional demo, so git clone and a double-click on index.html is the entire tour — Python optional for the read-only view.

What it does

0
Installs required
Python and a browser are the whole stack; the database is SQLite, which ships inside Python. No admin request, no procurement, no account.
.xlsx
Reads and writes Excel — without Excel
The tracker is read straight out of the file, and reports come back out as real workbooks, live formulas included.
Columns
Discovered, not declared
Matched by header text, never position. Add a column and it appears; rename one and its history carries across.
Every cell
The audit trail Excel doesn't keep
Each refresh diffs the workbook against the database — old value, new value, and the run that saw it.
SQLite
A real database, fully self-contained
One file, no server, built into Python. The workbook stays the single source of truth — the database is a cache, so deleting it is a non-event.
Paired
Every record with its drawings
Drawings are classified by the folder they were filed in and shown beside their row — and a small PDF reader checks each title block against the tracker.
2 ladders
Status derived, then reconciled
Python derives each record's status from its dates and reports wherever the workbook's own formulas disagree.
1 file
The whole viewer
A single HTML page that opens by double-click — no server needed — and syncs to the team like any shared folder.

Why you can trust it beside your tracker

The pipeline runs one way: the workbook is the single source of truth and nothing here ever writes to it. Everything else is derived, and can be deleted and rebuilt identically.

Where the data is ambiguous — a duplicated row, an import that changes a quarter of the cells — it refuses with a message naming the file and the row, rather than guessing and reporting success while being wrong.

PlanLink's one-way pipeline: the Excel tracker and drawing folders flow into standard-library Python, which builds a SQLite cache with a per-cell change log, pairs and checks the drawings, and outputs a single-file browser viewer. The master workbook is never written.

Inside the app

PlanLink's Summary view for a fictional streetscape register: 27 site records with drawing-stage and approvals-stage bars, every number counted from the dates in the register.
The Summary view — every number counted from the dates in the register. Demo data, entirely fictional.
PlanLink showing one record with two synthetic drawings side by side — a survey and a site markup — with the record's details in a side panel.
One screen: the record, its status, and two drawings side by side.

Roadmap

Allow-listed write endpoint CMap support in the PDF reader A second worked example

Support this work

PlanLink is free and stays free. If it collapsed some of your daily clicks, you can chip in — it funds the next release.

Secure checkout on Stripe · shown in USD, or CAD in Canada

PlanLink releases are announced in the grndtech newsletter below. To follow the code itself, watch the repo on GitHub — or read MinuteKit, its sibling for meeting minutes.

Provided as is, without warranty — test against a copy of your own data before you rely on it, and before any commercial use. Not a substitute for a qualified review. Terms