All work

True North Housing Alliance · 2026

True North Work Hub

Web AppCivicNext.js

A local-first case management tool for housing caseloads — clients, households, meetings, notes, and reports — where the caseload data never leaves the caseworker's machine.

Local-first
No server, no account, no upload of client data
AES-GCM
Optional passphrase encryption of the case file
2 → 1
Two disagreeing single-file tools merged into one app
Problem
Caseworkers were running two separate single-file HTML tools over one shared data file, and the two disagreed — one rebuilt the file from a fixed key list on every save, silently destroying anything it didn't recognize, while creating duplicate household records the other tool couldn't see.
Solution
I merged both into one Next.js application that reads and writes the same local caseload file, with no server and no account: connect your file, and every change auto-saves back to it. The old versions stay reachable read-only for comparison, but only the merged app can write.
Result
Live in production, handling real caseloads for housing caseworkers — client PII stays on the caseworker's own device by design, with optional AES-GCM passphrase encryption for the file itself.

The brief

A caseworker's tool has one hard requirement before any feature matters: the data has to be trustworthy. True North's caseworkers were running two apps — an original Work Hub and a parallel Compass build — over what was meant to be one shared workhub-data.json file. It wasn't shared correctly: Work Hub rewrote the file from a fixed key list on save, quietly dropping any field it predated, and its client-creation flow built a one-member household record that Compass's household view couldn't see. Two tools, one file, actively corrupting each other's work.

What was built

One application, reading and writing one file format, with the two originals frozen alongside it as read-only reference (old.compass.html, old.workhub.html — the latter write-disabled specifically because saving from it loses data). The merged app covers the actual casework: a needs-attention queue and caseload stats on the Hub, a searchable and filterable client grid, household grouping, meeting and task tracking, document checklists, an Outlook calendar sync that matches events to clients by attendee and name (every match approved by the caseworker before it applies), a weekly supervisor summary, and global search. Every feature module can be switched on or off per user in Settings, so the tool scales from a bare client list up to the full casework suite.

Under the hood

Rebuilt on Next.js, TypeScript, and Vitest from what was originally a zero-build single HTML file — the local-first constraint carried forward into the rebuild rather than being designed away. There is still no server and no account: the caseload file lives wherever the caseworker puts it (a synced folder if their organization wants a backup — their call, not the app's), and nothing personal is baked into the shipped source. An optional passphrase encrypts the file with AES-GCM, key-stretched from the passphrase, with no recovery path if it's lost — nobody, including the app, can open an encrypted file without it.

Where it stands

Live at workhub.quengadesigns.dev, in production use for real housing caseloads. The two-tools-disagreeing problem that started this rebuild is gone by construction: there's exactly one write path now.