v0.1.4 — IndieAuth login + Micropub note posting
First functional end-to-end release. v0.1.0 was the scaffold; v0.1.4 is the first version that actually posts a note.
What works on staging
Open /post/ on a phone, sign in with IndieAuth, post an h-entry note via Micropub, see the new post URL. Smoke test signed off on iPhone Safari + USB-attached desktop Safari Web Inspector across all 6 stages including AES-GCM IV-freshness verification.
Highlights
/post/*PWA shell with Vite + TypeScript + Preact, mounted on a hard-typed React-like component tree with strict TS settings.- Companion-plugin gate —
Outpost_Companion_Detectorshort-circuits on the upstream-first dependency chain (indieauth/indieauth.php→micropub/micropub.php); admin notices and the PWA install prompt share one source of truth. - IndieAuth client — discovery (Link header → HTML link rel → a rel), PKCE 256-bit verifier + SHA-256 challenge, code exchange, encrypted IndexedDB token storage with non-extractable
CryptoKey. - Micropub client — discover endpoint, POST
h=entry&content=<text>with bearer token, parse Location header. 201 Created and 202 Accepted both treated as success. - Hard Contract honored — every paint property goes through
var(--outpost-*, theme-fallback). Plugin owns layout, theme owns paint. - 117 passing tests — 59 PHPUnit (1 skipped pending wp-env) + 58 vitest. PHPCS + PHPStan both clean.
Known follow-ups
docs/A3-REQUIREMENTS.md— apple-touch-icon link, status-bar-style tuning, icon-192/512.png assets land in A3 (next style/asset session).- Phase C — the actual composer modes (Note refinement, Reply/Like/Repost, Photo, Listen group, Article).
Managed-WordPress hosting gotchas captured
Eight discovered during staging verification, all locked in CLAUDE.md:
- Rewrite-rule flush on version mismatch (rsync deploys don't fire activation hooks)
template_redirectpriority 1 (beatsredirect_canonical)- SW URL extension-less (
/post/sw, not.js— managed-WP nginx short-circuits.jsrequests) nocache_headers()on every HTML response (Varnish / nginx FastCGI cache)?_cb=<timestamp>cache-buster for staging verify (GoDaddy edge cache promotes 302/301 to cached entries)OUTPOST_VERSIONbumps with every deployable behaviour changebuild/pwa/committed to git (gd-wordpress-deployer rsync reflects working tree)Outpost_PWA_Shell::halt()after every render (or WP appends theme template)
Full changelog
See CHANGELOG.md.