v3.3.9 6 February 2026 Feature Fix
Features Page & Header Navigation
Features Page
New /features page presenting the platform’s technical capabilities for a developer audience. Not a feature matrix — a curated walkthrough of the things that make SpeyBooks different.
Spotlight
- Developer Shell — full-width section with custom terminal SVG showing a live GET /invoices request, JSON response with clickable prefixed IDs, ghost-text hints, and minor units annotation
Deep-Dive Sections
- API-First Design — prefixed IDs, minor units, idempotency keys, Zod validation. Includes curl code block with sample response
- Double-Entry Accounting — trigger-enforced balanced transactions with custom SVG showing a split journal entry alongside the PostgreSQL constraint. Database stats: 37 tables, 78 foreign keys, 28 CHECK constraints
- Display Math Only — server-authoritative arithmetic. Reuses the architecture diagram from the About page
- Scoped API Keys — 17 granular permissions across 9 resources with custom SVG showing a key card and permission matrix. Argon2id hashing, 403 rejection example
- Dark Mode — semantic token system with colour swatches and CSS custom property preview
Everything Else Grid
Twelve cards covering the remaining platform capabilities in a 4×3 responsive grid:
- Invoicing & Quotes, Bank Reconciliation, VAT Returns, Expense Tracking, Contact Management, Financial Reports, API Request Log, Audit Trail, Public Bug Transparency, Webhooks, No Tracking
Technical
- Three custom SVGs:
devshell.svg,double-entry.svg,api-keys.svg - Anchor IDs on all seven sections for future deep-linking (
#developer-shell,#api-first,#double-entry,#display-math,#api-keys,#dark-mode,#more)
Header Navigation
Added Features and About to the site header navigation (desktop and mobile).
New order: Features → Pricing → Docs → About → Changelog → Transparency
Conversion path first, reference second, trust signals last.
Fix: Astro JSX Brace Escaping
Literal { and } characters in the API-first JSON code block and dark mode CSS preview were consumed by Astro’s JSX parser, collapsing the DOM tree from the first occurrence downward. All ten literal braces now wrapped in {'{'} / {'}'} expressions.