Posts

I had the OS piece before OpenClaw existed. I had to stop building the OS to ship it.

Curtis started as an AI operating system built months before OpenClaw dropped — control plane, IDP, policy engine, the whole stack diagram. When OpenClaw arrived I spent months comparing systems instead of shipping. What unstuck it was pulling the OS back out: three tools, one history format, and a rebrand done by reclaiming the name instead of inventing one.

Gearing up

The anchor job moves from signed to underway. Short notes on mobilizing a chain buildout: materials ordered against the takeoff, the schedule treated like a bid line, and paperwork done the day it happens — because the next five sites are watching this one.

New venture: Onionbreath

The next venture is not software. Onionbreath — onion-themed food under its own brand. It started, as most of my ideas do, with a devotion I never planned to monetize: I love onions.

newell.ink — the typeface gets its own address

Newell, the geometric display face built from three primitives and zero curves, shipped as an alpha in July. Now it has a proper specimen site: newell.ink. Live, on its own domain, because a typeface without a specimen page is a font file with no front door.

The signal was public for six months

MedRecall ingested 17.4M adverse-event reports the FDA publishes and ranks a manufacturer's device portfolio for post-market review, daily, with a ~6-month horizon. Why I built it: the drift that precedes a recall is public data — ranked nowhere, read by no one in time.

Three agents, one file: dogfooding Curtis AI Audit

Shipped today: Curtis AI Audit v0.3.1, an Obsidian plugin that gives every AI agent action an append-only markdown receipt in your vault — and three of my fleet agents are now filing receipts every six hours into a ledger I can read, verify, and sync. No database, no telemetry. Files.

The repo was never the leak surface

TokenHunt v0.1.0 shipped: 48 rules, 53 provider families, six hook surfaces, on PyPI. What shipping it settled: git-time scanning watches the wrong layer. The leak surface is chat time — the paste, the read, the tool return.

Killing the mail layer gave the name a better job

Wrangle Mail — the fleet's self-hosted alias layer — died with a server in July and nobody noticed, because nobody was using it. Tonight I deleted what was left. The research into what wranglebot.com should be instead found a market hostile to paying, a build that's feasible, and one very good reason to exist: being the first consumer of .curt.

WrangleBot v0.1: what two weeks buys

The v0.1 scope for WrangleBot — a supervisor daemon that gates agent tools, breaks runaway loops, scopes worktree diffs, and writes .curt sessions. What's in the two-week slice, what's deliberately out, and the one metric that decides round two.

The Curtis line is brewing — 2.0.0 carries the plugin into 2027

v1.0.0 shipped 2026-07-23 with a promise: there will be more. Twelve releases later the more has a shape — a portable chat format, an editor agent, a compliance line, and a staged 2.0.0 that turns chat history into files you own. The state of the Curtis ecosystem, with receipts.

Curtis Porter — one file, one chat, no hostages

Shipped today: a local-first converter that reads every hostile AI chat export — ChatGPT branch trees, Claude content blocks, Grok archives, Gemini Takeout, pasted transcripts in English or Chinese — and hands back .curt files and vault markdown you own. v0.2.0 ports both directions: continuation packs, ChatGPT-shape JSON, API JSONL. MIT, no accounts, no uploads, no telemetry.

Three incidents, four days, one root cause: the unattended fleet's September bill

The fleet ran unattended for two months while the site sat on a splash page. Between 2026-09-25 and 2026-09-28 the deferred maintenance billed all at once — OOM loops at half the memory cap, ~800 wasted model runs a day from a default-ON heartbeat, and a billing suspension every liveness check called alive. One shared root cause: defaults and alerts that assumed someone was watching.