<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Elvis Sautet, engineering writing</title><description>Notes from building and operating production systems. Engine design, interface craft, and what broke on the way.</description><link>https://elvissautet.com/</link><language>en</language><item><title>What I write down, and why</title><link>https://elvissautet.com/writing/what-i-write-down-and-why/</link><guid isPermaLink="true">https://elvissautet.com/writing/what-i-write-down-and-why/</guid><description>Two documents, doing different jobs. A plan that tracks reality while work is in flight, and a handoff that records what surprised me once it ships.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Three correct fixes that all failed</title><link>https://elvissautet.com/writing/three-correct-fixes-that-all-failed/</link><guid isPermaLink="true">https://elvissautet.com/writing/three-correct-fixes-that-all-failed/</guid><description>A site ranked as one page. Three commits added the right tag and changed nothing, because everybody read the source and the truth was in the output.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How to make a system explain itself when you are the only one asking</title><link>https://elvissautet.com/solutions/observability-when-you-are-the-only-engineer/</link><guid isPermaLink="true">https://elvissautet.com/solutions/observability-when-you-are-the-only-engineer/</guid><description>Not dashboards. Four questions the system must answer without you reading logs, and the cheapest way to make each one answerable.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Astro against Next for content sites, dogfooded on this one</title><link>https://elvissautet.com/decisions/astro-vs-nextjs-for-content-sites/</link><guid isPermaLink="true">https://elvissautet.com/decisions/astro-vs-nextjs-for-content-sites/</guid><description>This site is the argument. Zero JavaScript on every content page, a canonical that cannot be got wrong, and a build that fails on SEO mistakes.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How to move off a legacy system without a big bang</title><link>https://elvissautet.com/solutions/legacy-system-migration/</link><guid isPermaLink="true">https://elvissautet.com/solutions/legacy-system-migration/</guid><description>Run both, compare in production, and move traffic one surface at a time. The comparison log is the most valuable artefact in the whole project.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How to ship alone without the wheels coming off</title><link>https://elvissautet.com/solutions/shipping-alone-without-a-team/</link><guid isPermaLink="true">https://elvissautet.com/solutions/shipping-alone-without-a-team/</guid><description>With no reviewer, correctness has to be structural rather than checked. Six practices that replace the things a team does for you.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How to make a site that ranks, verified against the output</title><link>https://elvissautet.com/solutions/ssr-seo-and-core-web-vitals/</link><guid isPermaLink="true">https://elvissautet.com/solutions/ssr-seo-and-core-web-vitals/</guid><description>Read the served HTML rather than the source, make the invariants structural, and fail the build on the mistakes that quietly cost you every ranking.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How to build for connections that drop, on devices that are old</title><link>https://elvissautet.com/solutions/building-for-low-bandwidth-markets/</link><guid isPermaLink="true">https://elvissautet.com/solutions/building-for-low-bandwidth-markets/</guid><description>The primary answer must survive the worst connection your users have. Everything visual is an enhancement on top of it, and the ordering is not negotiable.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Read the output, not the source</title><link>https://elvissautet.com/writing/reading-the-output-not-the-source/</link><guid isPermaLink="true">https://elvissautet.com/writing/reading-the-output-not-the-source/</guid><description>The source is what somebody intended. The output is what is true. Stuck debugging is usually time spent in the first when the answer is in the second.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Loading, empty and error, the three states every demo skips</title><link>https://elvissautet.com/interface/loading-empty-and-error-states/</link><guid isPermaLink="true">https://elvissautet.com/interface/loading-empty-and-error-states/</guid><description>A demo shows the filled state. Real users meet the other three on day one, and those are the ones that decide whether a product feels solid or broken.</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate></item><item><title>When one number has four owners</title><link>https://elvissautet.com/writing/when-one-number-has-four-owners/</link><guid isPermaLink="true">https://elvissautet.com/writing/when-one-number-has-four-owners/</guid><description>Four subsystems each computed the same balance and three disagreed. I spent two weeks making them agree, which held for a month.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Forms that do not lose work, and errors people can act on</title><link>https://elvissautet.com/interface/forms-that-do-not-lose-work/</link><guid isPermaLink="true">https://elvissautet.com/interface/forms-that-do-not-lose-work/</guid><description>Surface every error in three places, validate when it helps rather than when it is easy, and never punish somebody for a slow network they did not choose.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate></item><item><title>When to build an API and when to build the web app</title><link>https://elvissautet.com/solutions/when-to-build-an-api-vs-a-web-app/</link><guid isPermaLink="true">https://elvissautet.com/solutions/when-to-build-an-api-vs-a-web-app/</guid><description>Building an API first for a single web client is a cost with no buyer. Here is the test for whether a second consumer is real or imagined.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to add realtime without four sockets per browser tab</title><link>https://elvissautet.com/solutions/realtime-without-websocket-sprawl/</link><guid isPermaLink="true">https://elvissautet.com/solutions/realtime-without-websocket-sprawl/</guid><description>One connection per application, events multiplexed by type, and a resume token so a reconnect does not lose the events that happened while you were away.</description><pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Tables people actually use, and the four rules behind them</title><link>https://elvissautet.com/interface/tables-people-actually-use/</link><guid isPermaLink="true">https://elvissautet.com/interface/tables-people-actually-use/</guid><description>One search per table, search where the data lives, keep the previous page while the next loads, and let the table own its empty state. Four rules.</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Why adding more workers made it slower</title><link>https://elvissautet.com/writing/why-more-workers-made-it-slower/</link><guid isPermaLink="true">https://elvissautet.com/writing/why-more-workers-made-it-slower/</guid><description>I doubled the workers and throughput fell. The work was contention bound, so every additional worker was buying lock contention instead of capacity.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to change a database schema while people are using it</title><link>https://elvissautet.com/solutions/zero-downtime-migrations/</link><guid isPermaLink="true">https://elvissautet.com/solutions/zero-downtime-migrations/</guid><description>The expand, migrate, contract sequence, what each phase must never do, and why the dangerous migration is the one that looks trivial.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to build an approval workflow an auditor cannot break</title><link>https://elvissautet.com/solutions/approval-workflows-that-survive-audit/</link><guid isPermaLink="true">https://elvissautet.com/solutions/approval-workflows-that-survive-audit/</guid><description>Snapshot the policy at filing, make the decision log the truth, fingerprint the intent, and never let a timeout count as agreement.</description><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Designing dense screens for people who use them all day</title><link>https://elvissautet.com/interface/designing-dense-operational-screens/</link><guid isPermaLink="true">https://elvissautet.com/interface/designing-dense-operational-screens/</guid><description>Software used all day by somebody with a queue in front of them obeys different rules from software used once a week. Whitespace is not always kindness.</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Early work, kept on the site deliberately</title><link>https://elvissautet.com/work/early-work/</link><guid isPermaLink="true">https://elvissautet.com/work/early-work/</guid><description>Small business sites from the start of my career. They are here on purpose, because the trajectory is more informative than any single project.</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to make a slow Postgres query fast, in order</title><link>https://elvissautet.com/solutions/postgres-query-and-index-tuning/</link><guid isPermaLink="true">https://elvissautet.com/solutions/postgres-query-and-index-tuning/</guid><description>Read the plan before changing anything. Then fix the access path, then the join, then the index, and measure the tail rather than the average.</description><pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate></item><item><title>At least once is the only honest guarantee</title><link>https://elvissautet.com/writing/at-least-once-is-the-only-honest-guarantee/</link><guid isPermaLink="true">https://elvissautet.com/writing/at-least-once-is-the-only-honest-guarantee/</guid><description>Nobody can sell you exactly once across a network. Stop trying to buy it and make running twice harmless, which is a problem you can actually solve.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate></item><item><title>How to design a rules engine, and when not to build one</title><link>https://elvissautet.com/engines/designing-a-rules-engine/</link><guid isPermaLink="true">https://elvissautet.com/engines/designing-a-rules-engine/</guid><description>A rules engine is how you stop shipping a release for every policy change. It is also how you build a programming language by accident. Here is the line.</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate></item><item><title>An internet provider site where the first question is coverage</title><link>https://elvissautet.com/work/tabasamu-fibre/</link><guid isPermaLink="true">https://elvissautet.com/work/tabasamu-fibre/</guid><description>Every visitor arrives with one question, can I get this at my address. Answering it in the first screen changed what the whole site was for.</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate></item><item><title>Postgres against Mongo for multi-tenant systems</title><link>https://elvissautet.com/decisions/postgres-vs-mongodb-for-multi-tenant/</link><guid isPermaLink="true">https://elvissautet.com/decisions/postgres-vs-mongodb-for-multi-tenant/</guid><description>The question is rarely the data model. It is whether the system has money in it, because money means constraints, and constraints are what Postgres is for.</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate></item><item><title>The second dealership, and what I reused rather than rebuilt</title><link>https://elvissautet.com/work/lamad-motors/</link><guid isPermaLink="true">https://elvissautet.com/work/lamad-motors/</guid><description>The second build of a similar thing is where you find out which decisions were principles and which were accidents that happened to work once.</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate></item><item><title>How to build role based access that survives five years</title><link>https://elvissautet.com/solutions/role-based-access-that-scales/</link><guid isPermaLink="true">https://elvissautet.com/solutions/role-based-access-that-scales/</guid><description>Permissions on actions rather than roles, checked in one place, with the interface derived from the same source. The four rules that stop it rotting.</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate></item><item><title>Snapshot the approver, not the role</title><link>https://elvissautet.com/writing/snapshot-the-approver/</link><guid isPermaLink="true">https://elvissautet.com/writing/snapshot-the-approver/</guid><description>An auditor asked who was allowed to approve a payment in March. The system answered with who is allowed today, which is a different question entirely.</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate></item><item><title>How to design a notification engine with one ledger and real lanes</title><link>https://elvissautet.com/engines/designing-a-notification-engine/</link><guid isPermaLink="true">https://elvissautet.com/engines/designing-a-notification-engine/</guid><description>Many channels, one message ledger, and priority lanes so a one time password never waits behind a bulk send of forty thousand messages.</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate></item><item><title>How to fix a queue that is slower after you added workers</title><link>https://elvissautet.com/solutions/background-jobs-and-queue-throughput/</link><guid isPermaLink="true">https://elvissautet.com/solutions/background-jobs-and-queue-throughput/</guid><description>Concurrency only helps when the workers are waiting. When they are competing, more workers buy contention. Here is how to tell which one you have.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>A dealership platform the owner could run without me</title><link>https://elvissautet.com/work/charlies-motors/</link><guid isPermaLink="true">https://elvissautet.com/work/charlies-motors/</guid><description>A public inventory site with real search and real leads, built so the owner could run it alone. Handover is a design requirement, not a document.</description><pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate></item><item><title>Measure the tail, not the average</title><link>https://elvissautet.com/writing/measuring-the-tail-not-the-average/</link><guid isPermaLink="true">https://elvissautet.com/writing/measuring-the-tail-not-the-average/</guid><description>The average said the page was fast. One request in twenty took two seconds, every day, and nobody reported it because complaining requires a comparison.</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate></item><item><title>How to make a payment webhook safe to receive twice</title><link>https://elvissautet.com/solutions/idempotent-payment-webhooks/</link><guid isPermaLink="true">https://elvissautet.com/solutions/idempotent-payment-webhooks/</guid><description>A step by step build of a webhook that survives retries, crashes and duplicates, with the failure each step exists to prevent and how to verify it.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate></item><item><title>How to design a reconciliation engine that assumes the worker died</title><link>https://elvissautet.com/engines/designing-a-reconciliation-engine/</link><guid isPermaLink="true">https://elvissautet.com/engines/designing-a-reconciliation-engine/</guid><description>Money arrives over a network you do not control, twice, out of order, or not at all. A reconciler is the component that assumes all three happened at once.</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Database per tenant against a shared schema, decided properly</title><link>https://elvissautet.com/solutions/database-per-tenant-vs-shared-schema/</link><guid isPermaLink="true">https://elvissautet.com/solutions/database-per-tenant-vs-shared-schema/</guid><description>The choice is not about isolation, both can be safe. It is about how many tenants you will have and what a migration across all of them costs you.</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Migrations while people are using it</title><link>https://elvissautet.com/writing/migrations-while-people-are-using-it/</link><guid isPermaLink="true">https://elvissautet.com/writing/migrations-while-people-are-using-it/</guid><description>The migration that took the system down was one line and looked completely safe. Here is what I actually check now, before running anything.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Screens for people with a queue standing in front of them</title><link>https://elvissautet.com/work/operations-interface/</link><guid isPermaLink="true">https://elvissautet.com/work/operations-interface/</guid><description>Dense operational software used all day by staff under pressure. Where clarity beats beauty, where it does not, and how the two get measured.</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Server sent events against WebSockets, and why I usually pick SSE</title><link>https://elvissautet.com/decisions/sse-vs-websockets/</link><guid isPermaLink="true">https://elvissautet.com/decisions/sse-vs-websockets/</guid><description>Most realtime features only need the server to talk to the browser. That is one direction, and SSE does it over plain HTTP with no new infrastructure.</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate></item><item><title>Dense screens are a different craft</title><link>https://elvissautet.com/writing/dense-screens-are-a-different-craft/</link><guid isPermaLink="true">https://elvissautet.com/writing/dense-screens-are-a-different-craft/</guid><description>I made an operational screen prettier and it tested worse. Whitespace pushed content below the fold and added a scroll to a constant task.</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate></item><item><title>How to design an approval engine that survives an audit</title><link>https://elvissautet.com/engines/designing-an-approval-engine/</link><guid isPermaLink="true">https://elvissautet.com/engines/designing-an-approval-engine/</guid><description>Permissions decide who gets the screen. They must never decide who has authority. Here is the separation, and the guarantees an engine owes you.</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate></item><item><title>How to build multi-tenant SaaS where isolation cannot be forgotten</title><link>https://elvissautet.com/solutions/multi-tenant-saas-architecture/</link><guid isPermaLink="true">https://elvissautet.com/solutions/multi-tenant-saas-architecture/</guid><description>Isolation as a structural property rather than a filter somebody remembers. Six layers, in the order to build them, with the test that proves each one.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Queues against cron, and when cron is still the right answer</title><link>https://elvissautet.com/decisions/queues-vs-cron/</link><guid isPermaLink="true">https://elvissautet.com/decisions/queues-vs-cron/</guid><description>Cron is not obsolete and a queue is not always an upgrade. The line is whether you need to know what happened, and whether a failure can be retried.</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate></item><item><title>The alias you forgot</title><link>https://elvissautet.com/writing/the-alias-you-forgot/</link><guid isPermaLink="true">https://elvissautet.com/writing/the-alias-you-forgot/</guid><description>Soft deletes are convenient until you write raw SQL. One join without the predicate and deleted records reappear in a report somebody will sign.</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate></item><item><title>How to design a scheduler engine that holds ten million future jobs</title><link>https://elvissautet.com/engines/designing-a-scheduler-engine/</link><guid isPermaLink="true">https://elvissautet.com/engines/designing-a-scheduler-engine/</guid><description>Most schedulers put every pending job in Redis and fall over. Three tier time routing keeps memory flat while the table grows into the millions.</description><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate></item><item><title>A scheduler holding ten million future jobs on flat memory</title><link>https://elvissautet.com/work/scheduling-and-automation/</link><guid isPermaLink="true">https://elvissautet.com/work/scheduling-and-automation/</guid><description>Every pending job in Redis is the default design and it does not survive scale. Three tier time routing cut memory by about ninety percent.</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate></item><item><title>When one number has four owners, three of them are wrong</title><link>https://elvissautet.com/work/financial-correctness/</link><guid isPermaLink="true">https://elvissautet.com/work/financial-correctness/</guid><description>Four subsystems each calculated the same financial figure and three disagreed. Making them agree failed. Removing their right to an opinion worked.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate></item><item><title>The two minute rule that decides whether a site survives</title><link>https://elvissautet.com/writing/the-two-minute-rule-for-client-work/</link><guid isPermaLink="true">https://elvissautet.com/writing/the-two-minute-rule-for-client-work/</guid><description>Most small business sites die the same way. If a routine update cannot be done on a phone in two minutes, the content goes stale and starts doing harm.</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate></item><item><title>Sole engineer on a school platform used by 112 schools</title><link>https://elvissautet.com/work/enaton-school-platform/</link><guid isPermaLink="true">https://elvissautet.com/work/enaton-school-platform/</guid><description>Zero customers to 112 schools, one engineer. What being the only person who can fix it forces you to design differently, and what it costs.</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate></item></channel></rss>