All notable changes to this project are documented here. The format follows
Keep a Changelog, and the project aims to
follow Semantic Versioning. The packet format and the
verification protocol are versioned independently (see docs/evidence-method.md).
Alpha hardening and reviewer-handoff release. Still alpha — do not rely on it for a real legal matter yet. This release closes out the maintainer-only "Phase 0" work: durable proofs, a frozen threat-model baseline, automated assurance, and the materials an external auditor, accessibility tester, or pilot partner needs.
- Archive (re-)timestamping.
habitable retimestampre-stamps each capture's most recent token before the issuing authority's certificate or hash algorithm ages out (RFC 4998-style chaining). Existence stays anchored at the primary token's time; packets carryarchive_timestampsper item and the standalone verifier walks the chain, failing closed on any break. (tsa.retimestamp,tsa.verify_archive_chain,capture.retimestamp_all.) - Vault key lifecycle.
habitable key rotate | backup | restore— passphrase rotation and an independent-passphrase recovery blob, with a non-technical-organizer walkthrough indocs/key-management.md. - Backward-compatibility guard. A versioned packet/protocol contract in the verifier plus a committed golden-packet corpus, so every format version ever emitted must keep verifying and a newer-than-supported packet is rejected cleanly, never mis-verified.
- Assurance automation. A verifier fuzz/property harness; a scheduled, network-gated public-TSA integration job (DigiCert + FreeTSA); and a signed build-provenance + CycloneDX SBOM release pipeline.
- Invariant guard tests.
tests/test_guards.pyand hardened sync tests pin two promises: no plaintext (note text, image bytes, or a sender identity) reaches a relay or on-disk mailbox, and importinghabitable.verifypulls in only the Apache-2.0 verification subset — no AGPL-only/heavy modules. - Frozen threat-model baseline B1. A content-pinned (
SHA-256) freeze of the threat model for external review, with a section-by-section re-review and an append-only baseline trail (docs/audits/threat-model-baseline.md, tagthreat-model-baseline-B1). - Reviewer/pilot handoff docs.
docs/audits/onboarding.md, a DPIA-styledocs/privacy.md,docs/sustainability.md(incl. bus-factor minimum), and a multi-yearROADMAP.md. - Accessibility. Automated keyboard-navigation and 320 px reflow checks added to the a11y gate.
- The verification subset (
verify/tsa/exif) now writes its multi-typeexceptclauses with explicit parentheses — behaviour-identical, but valid on every Python 3 and unambiguous to auditors and legal-aid embedders of the Apache-2.0 verifier (no reliance on the PEP 758 syntax that 3.14 newly accepts). docs/governance.md"Releases" reconciled with the actual signed/provenanced pipeline.
- RFC 3161 interoperability with real public authorities. The client now reads
PKIStatuswhether rendered as an int or a name, follows the token's own digest algorithm instead of assuming SHA-256, and dispatches signature verification for both RSA (PKCS#1 v1.5) and ECDSA — verified against DigiCert and FreeTSA. - Two verifier robustness bugs found by the fuzz harness: invalid-UTF-8 bundle bytes and a malformed custody chain are now clean rejections, never a crash.
- Custody-actor identity and tenant filename no longer leak into exported packets.
The importing peer's fingerprint (
details.from) and the original source filename (details.source) were being carried in the signed, sharedbundle.json, weakening the "exports name no one" guarantee. They now live in a vault-onlyprivate_detailsfield that is never hashed and never exported, while the union keeps them for its own audit. Previously-produced packets still verify unchanged. Regression-guarded bytests/test_guards.py.
0.1.0 — 2026-06-17
First public release. Alpha — a working reference implementation; do not rely on it for real legal matters yet. It pairs the evidence spine with a local app, accessibility gates, mobile/PWA install, an optional relay deploy, and a static preview site.
- Local app.
habitable appruns a loopback-only HTTP server that holds the unlocked vault and serves an accessible, bilingual (English/Spanish) web client — capture, timeline, status, resolve, and export-and-verify over a small JSON API; nothing leaves the device. Installable PWA (manifest, maskable/Apple icons, and an offline service worker that is network-only for/api/). - axe-core accessibility gate. A real WCAG scan of the running app in English
and Spanish (Playwright/Chromium), blocking on any moderate/serious/critical
violation, in a dedicated
a11yCI workflow andmake a11y; the app reports zero violations. Manual NVDA/VoiceOver/keyboard/zoom protocol documented indocs/accessibility/manual-testing.md. - Accessible HTML packet. Every export also produces
packet.html— a self-contained WCAG 2.2 AA rendering that passes the same axe gate — alongside a PDF that declares its language, setsDisplayDocTitle, and carries a navigable outline; all bundle-derived text is escaped before rendering. - Configurable packet templates (per-jurisdiction wording, presentation only).
- Optional relay deploy. A dependency-free, non-root, read-only container and a
one-command
docker composefor the ciphertext-only sync relay (docs/relay-deploy.md). - Docs & preview. Setup guide, mobile guide, and a static landing page with a live sample packet (GitHub Pages).
A recorded human screen-reader pass (protocol shipped), a fully tagged PDF/UA structure tree (not available in reportlab's open-source API — the HTML packet is the accessible rendering until then), and signed native app-store binaries (the installable PWA covers mobile today) remain — see the ACR and the build plan.
- Evidence core. Streaming SHA-256 fixity and an append-only, hash-linked chain of custody whose entry hashes commit to salted actor commitments, so an exported chain verifies as intact without revealing who viewed or copied an item. Tamper, deletion, and reordering are all detectable.
- Trusted timestamping. Real RFC 3161 (a local issuer for offline use/tests
and an HTTP client for production) plus a clearly non-production offline dev
TSA. The verifier enforces digest binding, validates the CMS signature and
certificate chain, and detects
genTimetampering. - Encryption. ChaCha20-Poly1305 vault encryption under a scrypt-wrapped data key (cheap passphrase rotation and encrypted recovery backups), Ed25519 device identity, and an X25519 sealed box for end-to-end sync.
- Offline-first model. A CRDT case document (LWW registers, an OR-Set of issues, append-only timeline/captures) with commutative, associative, idempotent merge.
- Vault + capture. Encrypted on-disk case vault with fixity re-checked on read; capture pipeline that hashes, seals, and records custody offline, then obtains a trusted timestamp when online (queuing otherwise).
- Packet + verify. Deterministic signed
bundle.json, location-stripped shared media, and an accessible paginated PDF; a standalone verifier (additionally Apache-2.0) that re-derives hashes, validates tokens and the producer signature, and walks custody. - Sync + relay. End-to-end-encrypted peer-to-peer sync over a shared directory or an optional ciphertext-only relay.
- CLI.
habitable init|id|issue|capture|timeline|status|resolve|export|verify|sync|relay|demo, pluspython -m habitable. - Engineering. uv project on Python 3.14;
ruff+mypy --strict; pytest with property-based and tamper-detection tests (make verifygreen, ~85% coverage); SHA-pinned GitHub Actions, CodeQL, Dependabot,pip-audit.