The download is the product — one self-contained file. Save it, open it offline, done.
⚠️ This is a proof of concept.
An exploratory prototype — not a production-authorized system. It has not undergone a Privacy Impact
Assessment, threat/risk assessment, or security authorization, and must not be used with real personnel data.
🔌 Meant to run offline.
The real deployment is the single index.htmldownloaded and opened locally
(file://) on a controlled machine — no server, no network. The app even forbids network access at
runtime via Content-Security-Policy: connect-src 'none'. The hosted demo below is for convenience
only.
🧪 All data is fictional.
The bundled dataset — a “Juárez Police Department” with sample officers, badges, salaries, positions, and
neighbourhoods — is entirely synthetic and invented for demonstration. It does not represent real people or
units; any resemblance is coincidental.
What it is
A workforce-planning HRIS: officers, positions, assignments, live staffing gaps, payroll, and a SQL console.
Runs SQLite (cr-sqlite) in the browser via WebAssembly — the whole engine is inlined into one file.
The database lives only in memory; the only things written to disk are encrypted files.
Built with Vite; ships as a single ~5 MB self-contained index.html.
Security model
Encrypted at rest — AES-256-GCM, PBKDF2-SHA-256 (250k iterations), per-file salt + IV.
Non-extractable keys — the raw key never exists in JavaScript and can't be exported.
No exfiltration — a strict CSP (connect-src 'none') blocks every network API; the
WASM is inlined and never fetched, so that rule holds.
No plaintext at rest — no plain .sqlite/.csv export; result exports are
encrypted too.
Morning — a coordinator hands out one encrypted truth.hrisdump and the day's passphrase.
Work offline — each planner opens the truth, picks their identity, and edits with no network.
Export changes — at day's end each exports an encrypted .hrischanges delta.
Merge — right in the app. A coordinator opens the truth, loads everyone's change files, and
merges them in the browser — no install, no admin rights, no Node. cr-sqlite (a CRDT) converges
divergent edits deterministically, so nobody's work is lost. The product is just the one index.html.
Run it offline
Hit Download index.html above to save the one
file, then double-click it — it works with no server and no connection. (Or clone the repo and run
npm run build to produce your own dist/index.html.) New to it? See the
how-to guide, with short screen recordings of every task.