The Clanker Support Journal · Est. 2026
Field notes on AI support
Announcements, practical guides, and the engineering decisions behind a support widget that answers from your docs — and knows when to step aside.
We diffed our marketing site against our codebase. Six claims didn't survive
We put the homepage in one tab and the repo in the other and checked every falsifiable sentence against the code that would have to make it true. Six claims failed, one page undersold us, and an adversarial re-pass caught overclaims we wrote during the honesty pass itself. Every fix shipped in one public pull request.
Two messages, one sequence number: the concurrency bug that never threw
An escalation marker and the AI reply it interrupted landed in the same conversation with the same sequence number. No exception, no log line, both inserts succeeded, and the thread quietly rendered out of order. This is the read-then-write bug that passes every test, the three-part fix whose deploy order is the point, and the five-second code search that tells you whether your codebase has it too.
'Additive columns are always safe' is wrong on Drizzle, Prisma, and preview deploys
Everyone agrees an additive column is the one schema change that can't hurt you. Then a one-line ALTER TABLE on our user table turned out to be capable of 500ing every authenticated request — because Drizzle projects every mapped column, Better Auth reads the user table on every session check, and preview deploys skip migrations. Here is the two-PR discipline we ship our riskiest schema changes with, and the one column we keep out of the ORM entirely.
We set a cache trap for our own support agent — in our own llms.txt headers
URL knowledge sources are snapshots, and everyone knows snapshots go stale. What we missed is that the refresh itself can be served by any CDN cache between the crawler and the origin — so "Recrawl → success" can silently re-store the pre-deploy content. The trap on our own site was set by our own cache headers.
Our AI support agent doesn't use RAG — here's the math
Clanker Support has no vector database. We put the entire knowledge base into the system prompt on every request, and for KBs measured in kilobytes, the math says that's the right call.
We moved our SaaS backend to workerd and every Node SDK broke
The Resend SDK, the Stripe Node SDK, and Better Auth's passkey plugin all got cut from our workerd build — each over something the package dragged in, not code we call. Here is each casualty, the fetch-and-crypto.subtle code that replaced it, and an honest accounting of whether it was worth it.
Everything that broke while shipping an embeddable AI widget
A support widget runs inside a DOM you don't control. Here's every way host pages broke ours — :empty selectors, 62.5% root font-sizes, null currentScript — and the rule we extracted from each fix.
Why we built on LLM Gateway instead of calling OpenAI directly
Our reasoning for using a model abstraction layer from day one — and why it's already paid off twice.
The case for self-hostable AI support
Why open architecture matters for tools that sit between you and your customers.