Inspiration
Teletext (Ceefax 1974-2012, Oracle, and their cousins) was the original glanceable public information service: no ads, no tracking, no login, fast on any connection, readable on any screen. It was switched off, not replaced. Today the same kind of public data is scattered across dozens of APIs nobody opens.
What it does
CRYPTEXT serves 28 live teletext pages built from keyless US public APIs: 8-city weather and NWS alerts, today's earthquakes with mosaic histograms, NOAA space weather with a Kp sparkline and aurora outlook, the national debt to the penny and a debt clock, the week's biggest federal contract actions, the newest Federal Register documents, FDA food and drug recalls, and Hacker News. Every page names its source on row 24 and says SERVICE INTERRUPTED instead of inventing numbers when a feed fails.
One page, five outputs: a haunted CRT in the browser (remote control, Fastext keys, page-search counter, double height, flash, reveal), ANSI for curl, JSON, an MCP server for AI agents (list_pages, read_page), and TTI files that VBIT2 on a Raspberry Pi broadcasts as a real teletext signal for an analogue TV. Page 666 is haunted.
How we built it (how Kiro was used)
Built with Kiro CLI 2.37 on the V3 engine, run headless on the free plan (mostly Claude Haiku 4.5, about 38 credits).
- Steering: product, tech, structure, and a condensed ETS 300 706 Level 1 teletext reference loaded by fileMatch only when Kiro touches the engine, encoders or pages. With the spec in context Kiro got the attribute state machine and TTI escaping right first time.
- Specs: 5. cryptext-core (56 tasks, EARS requirements, design with interfaces, data flow and correctness properties), two Bugfix Specs written from code review (live-feed-fixes: invented fixtures and four wrong endpoints; mcp-deploy-header: a non-compliant MCP server, header bug, broken deploy config), pages-v1 (run by a custom agent), layout-properties (66 property and unit tests).
- Hooks: PostFileSave re-runs engine and encoder tests; PostFileSave house-style check; a Stop hook renders every page from recorded fixtures and checks grid, codes, footer and links before the agent can finish.
- Custom agent: page-designer (V3 Markdown agent), writes only to pages, tests and fixtures, denied the engine, with the project's MCP server in its toolset.
- MCP: the app's own MCP server is registered in .kiro/settings/mcp.json; the page-designer agent previewed its pages through read_page(n, "text").
- Property-based testing with fast-check: grid invariant, encoders never throw, TTI round-trips, double-height rows, mosaic code ranges. 159 tests.
- Permissions: a headless run killed every Node process with Stop-Process -Name node; a user-level permissions.yaml now denies broad process kills.
- Spec vs vibe: the design doc fixed the interfaces before any code, so a small model could implement one phase at a time without drifting, and bugfix specs turned review findings into regression-tested fixes.
- Outside Kiro: Claude Code reviewed each Kiro run against the live APIs (findings became the bugfix specs) and, in review, rewrote the page layouts on a new helper module, the browser viewer and the ANSI encoder; Kiro then wrote the property tests for that code.
Challenges
Teletext's attribute codes occupy a cell and change everything after them on the row, so layout is a puzzle. Double-height rows hide the row below. Real public APIs drift: four of eight endpoints in the first design were wrong, and the first fixtures for two feeds were invented, which the bugfix spec caught.
Accomplishments
A real Level 1 teletext service on live data that works in four places at once, including a real TV through TTI; an MCP server an agent can use; 159 tests including property tests; honest failure pages.
What we learned
Steering is where domain knowledge pays off; bugfix specs are a clean way to feed code review back to an agent; give headless agents a permissions deny list before you trust all tools.
What's next
More feeds (air quality, FEMA declarations, SEC filings), subpages, regional editions, and a ready-made Raspberry Pi image that broadcasts CRYPTEXT to any old TV.
Links
- Live: https://cryptext-nine.vercel.app (try
curl "https://cryptext-nine.vercel.app/api/page?n=300&format=ansi") - Code (MIT,
.kiroat the root): https://github.com/Mattbusel/cryptext - Full Kiro write-up: https://github.com/Mattbusel/cryptext#how-kiro-built-it
Built With
- fast-check
- javascript
- kiro
- model-context-protocol
- node.js
- teletext
- typescript
- vercel
- vitest
Log in or sign up for Devpost to join the conversation.