Farfield Systems
The content backend for iammatthias.com — a set of small, single-binary Go services. Each app is an HTML admin UI for writing and moderating content, plus a public JSON API the website reads.
Stack
The standard library plus exactly one dependency: modernc.org/sqlite, a pure-Go SQLite driver. No cgo, so every build is a static binary. HTTP is net/http, templates are html/template, assets are embedded with embed, logging is log/slog. No web framework, no ORM, no router library.
Core Ideas
- Content-addressed. Every record carries a CID — a sha-256 hash of its content — for verification, change detection, and ETag caching.
- Self-migrating. A database migrates its own schema when it is opened; deploying new code is the migration step.
- One aesthetic. The admin UIs share a Braun × JPL × vintage-NASA instrument-panel look.
Services
apex
farfield.systems
Landing page and documentation host
content
content.farfield.systems
Collections, entries, and series fragments
feed
feed.farfield.systems
Ephemeral short-form posts
blobs
blobs.farfield.systems
Image/media bytes + metadata, on Cloudflare R2
calendar
calendar.farfield.systems
Daily photo calendar: NASA APOD + UFO easter egg
bookmarks
bookmarks.farfield.systems
Curated public/private link list with OG metadata
qr
qr.farfield.systems
Direct and editable-proxy QR codes
bard
bard.farfield.systems
Onchain GPT: Shakespeare weights streamed from Ethereum, verified and run in the browser
dead presidents
dead-presidents.farfield.systems
Char-level GPT trained on presidential speeches, streamed and run entirely in the browser
backup
tailnet-only
Snapshots every app's database into R2
skills
.claude/skills
Content-addressing, farfield-stack, self-migrating-sqlite, farfield-style
Conventions
- Reads are public — no auth — and send
Access-Control-Allow-Origin: *, so the browser can fetch them directly. - Writes need a key — send
X-API-KeyorAuthorization: Bearer. - Every record has a stable key (its slug) and a CID (sha-256 hash). The key never changes; the CID changes when content changes.
- Single-record endpoints send the CID as a strong
ETag. SendIf-None-Matchfor conditional GET. - Timestamps are RFC3339 UTC strings.
- The public API returns published entries only; drafts never appear.