<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>Elson Tan · Writing</title><description>Elson Tan builds and scales technology platforms. Writing on AI, agent infrastructure, and enterprise digital cost optimisation.</description><link>https://elsontan.com/</link><language>en</language><copyright>© 2026 Elson Tan</copyright><item><title>The job was never the code</title><link>https://elsontan.com/blog/from-coding-to-architecting/</link><guid isPermaLink="true">https://elsontan.com/blog/from-coding-to-architecting/</guid><description>Most of my code is now written by an agent, and my output went up rather than down. That is not a story about typing speed. It is about what the job always was underneath the typing.</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/from-coding-to-architecting.png" type="image/png" length="0"/><category>Agents</category><category>Architecture</category><author>Elson Tan</author></item><item><title>Metering tokens when the bill is the product</title><link>https://elsontan.com/blog/metering-llm-tokens-for-billing/</link><guid isPermaLink="true">https://elsontan.com/blog/metering-llm-tokens-for-billing/</guid><description>Billing per message is easy and wrong: one user sends a sentence, another uploads a report. Metering the tokens you actually spend is harder, and the hard parts are idempotency, allowance checks and what to do mid-conversation.</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/metering-llm-tokens-for-billing.png" type="image/png" length="0"/><category>LLM</category><category>Cost</category><category>Architecture</category><author>Elson Tan</author></item><item><title>Route cheap models to orchestration, not to the work</title><link>https://elsontan.com/blog/routing-cheap-models-to-orchestration/</link><guid isPermaLink="true">https://elsontan.com/blog/routing-cheap-models-to-orchestration/</guid><description>Most agent platforms pick one model and use it everywhere. Splitting model selection by role rather than by task is where the cost curve actually bends.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/routing-cheap-models-to-orchestration.png" type="image/png" length="0"/><category>LLM</category><category>Architecture</category><category>Cost</category><author>Elson Tan</author></item><item><title>Citations that survive the question</title><link>https://elsontan.com/blog/rag-citations-that-trace-to-source/</link><guid isPermaLink="true">https://elsontan.com/blog/rag-citations-that-trace-to-source/</guid><description>A RAG answer with a source name under it is not a citation. If a teacher cannot open the page and see the sentence, the system has not shown its work. Carrying page numbers through retrieval is most of the job.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/rag-citations-that-trace-to-source.png" type="image/png" length="0"/><category>RAG</category><category>LLM</category><category>Architecture</category><author>Elson Tan</author></item><item><title>One Durable Object per agent</title><link>https://elsontan.com/blog/one-durable-object-per-agent/</link><guid isPermaLink="true">https://elsontan.com/blog/one-durable-object-per-agent/</guid><description>Why I gave every AI agent its own Durable Object with a SQLite task ledger, and what that bought in state, concurrency and debuggability.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/one-durable-object-per-agent.png" type="image/png" length="0"/><category>Cloudflare</category><category>Architecture</category><category>Agents</category><author>Elson Tan</author></item><item><title>Sandboxing code an agent wrote for you</title><link>https://elsontan.com/blog/sandboxing-agent-written-code/</link><guid isPermaLink="true">https://elsontan.com/blog/sandboxing-agent-written-code/</guid><description>Once an agent writes and runs code, you are executing untrusted input on your infrastructure. The isolation question has known answers. The harder problems are quotas, cancellation and getting results out.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/sandboxing-agent-written-code.png" type="image/png" length="0"/><category>Agents</category><category>Security</category><category>Architecture</category><author>Elson Tan</author></item><item><title>Persist once, reference by id, hydrate on demand</title><link>https://elsontan.com/blog/persistent-file-context-for-agents/</link><guid isPermaLink="true">https://elsontan.com/blog/persistent-file-context-for-agents/</guid><description>An agent that reads your uploaded file perfectly and then forgets it on the next turn is not a memory bug. It is a context design where file content was only ever turn-transient. The fix also cuts token cost.</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/persistent-file-context-for-agents.png" type="image/png" length="0"/><category>LLM</category><category>Agents</category><category>Cost</category><author>Elson Tan</author></item><item><title>Reasoning effort is a cost dial, not a quality setting</title><link>https://elsontan.com/blog/reasoning-effort-as-a-cost-dial/</link><guid isPermaLink="true">https://elsontan.com/blog/reasoning-effort-as-a-cost-dial/</guid><description>Every major provider now exposes a knob for how hard the model thinks. Left at its default it burns tokens on arithmetic. Set per role, it is one of the largest cost reductions available without changing models.</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/reasoning-effort-as-a-cost-dial.png" type="image/png" length="0"/><category>LLM</category><category>Cost</category><author>Elson Tan</author></item><item><title>Crawling a knowledge base without a crawler service</title><link>https://elsontan.com/blog/crawling-without-a-crawler-service/</link><guid isPermaLink="true">https://elsontan.com/blog/crawling-without-a-crawler-service/</guid><description>Rendering every page in a headless browser is the expensive way to import a website. Discovery through robots.txt and sitemaps costs almost nothing, and most pages never need a browser at all.</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/crawling-without-a-crawler-service.png" type="image/png" length="0"/><category>Cloudflare</category><category>Architecture</category><category>Cost</category><author>Elson Tan</author></item><item><title>Confidence scores are only useful if something acts on them</title><link>https://elsontan.com/blog/confidence-scores-and-human-review/</link><guid isPermaLink="true">https://elsontan.com/blog/confidence-scores-and-human-review/</guid><description>An LLM that returns a per-field confidence score has told you nothing until a threshold routes the low ones to a person. How to design the routing, calibrate the threshold, and build a review queue people can actually clear.</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/confidence-scores-and-human-review.png" type="image/png" length="0"/><category>LLM</category><category>Documents</category><category>Architecture</category><author>Elson Tan</author></item><item><title>Signing webhooks, and the SSRF hole nobody patches</title><link>https://elsontan.com/blog/signing-and-hardening-webhooks/</link><guid isPermaLink="true">https://elsontan.com/blog/signing-and-hardening-webhooks/</guid><description>Most webhook guides stop at HMAC signatures. The bigger risk is on your side: a customer-supplied delivery URL turns your sender into a proxy for your own private network. Here is the full path.</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/signing-and-hardening-webhooks.png" type="image/png" length="0"/><category>Security</category><category>Architecture</category><author>Elson Tan</author></item><item><title>An event-sourced ledger a regulator can replay</title><link>https://elsontan.com/blog/event-sourced-double-entry-ledger/</link><guid isPermaLink="true">https://elsontan.com/blog/event-sourced-double-entry-ledger/</guid><description>Regulated lending needs a financial history you can reconstruct, not one you infer from mutable rows. Event sourcing plus double-entry bookkeeping gives you that, provided you get the arithmetic and the correction path right.</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/event-sourced-double-entry-ledger.png" type="image/png" length="0"/><category>Architecture</category><category>Fintech</category><author>Elson Tan</author></item><item><title>Alarm-driven task queues without a queue service</title><link>https://elsontan.com/blog/alarm-driven-task-queues/</link><guid isPermaLink="true">https://elsontan.com/blog/alarm-driven-task-queues/</guid><description>A Durable Object alarm gives you a scheduler, a retry policy and exactly-one-worker-per-task, using storage you already have. Here is how to build a task queue on it, and where it stops being the right tool.</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><dc:creator>Elson Tan</dc:creator><enclosure url="https://elsontan.com/og/blog/alarm-driven-task-queues.png" type="image/png" length="0"/><category>Cloudflare</category><category>Architecture</category><author>Elson Tan</author></item></channel></rss>