<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Ahmad Sadiq: Narrative]]></title><description><![CDATA[the main series essays in order]]></description><link>https://ahmadmicro.substack.com/s/narrative</link><image><url>https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png</url><title>Ahmad Sadiq: Narrative</title><link>https://ahmadmicro.substack.com/s/narrative</link></image><generator>Substack</generator><lastBuildDate>Sun, 10 May 2026 21:44:14 GMT</lastBuildDate><atom:link href="https://ahmadmicro.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Ahmad Sadiq]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[ahmadmicro@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[ahmadmicro@substack.com]]></itunes:email><itunes:name><![CDATA[Ahmad Sadiq]]></itunes:name></itunes:owner><itunes:author><![CDATA[Ahmad Sadiq]]></itunes:author><googleplay:owner><![CDATA[ahmadmicro@substack.com]]></googleplay:owner><googleplay:email><![CDATA[ahmadmicro@substack.com]]></googleplay:email><googleplay:author><![CDATA[Ahmad Sadiq]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Voice Calling Saga]]></title><description><![CDATA[A Day With An AI Coding Assistant]]></description><link>https://ahmadmicro.substack.com/p/the-voice-calling-saga</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/the-voice-calling-saga</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Thu, 07 May 2026 08:09:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>A field journal from the day Pulse got voice calling, May 5&#8211;6, 2026.</em></p><p>A break from the strategic essays this week. I have spent the last two days getting voice calling working on Pulse &#8212; the customer-support agent that lives at pulse.faxter.com, and the second module in the suite I have been writing about. The way the day actually went is, I think, a more useful artifact of what &#8220;vibe coding&#8221; looks like in practice than another piece of theory.</p><p>So this week, an interlude. A field journal. A real engineering arc that started with a question and ended at 1:30 AM with a hundred and fifty lines of replacement code that should not have had to exist.</p><p>Strategic essays resume next week.</p><h2>Setup</h2><p>It started with a single question: <em>what do you think about adding voice call to Pulse?</em> That kicked off about fourteen hours of dense collaboration with an AI coding assistant. Most of it productive. The last six hours a debugging marathon I won&#8217;t forget.</p><p>By the end, Pulse could receive WhatsApp voice calls, ring every available staff dashboard, and let an agent answer with their browser microphone. The customer hears them. They hear the customer. Real audio over a real WebRTC pipeline.</p><p>But the story is not really about voice calls. It is about how a human and an AI assistant work through a hard problem when the easy answers run out.</p><h2>The Clean Half</h2><p>The first eight hours felt like flow.</p><p>We started by <em>thinking before building</em>. Architecture, then UI, then a roadmap. The assistant pushed back on my initial impulse to dive in &#8212; <em>let&#8217;s settle the open questions first, then the roadmap writes itself</em>. It wasn&#8217;t wrong. We made decisions about transport (WebRTC for free, Twilio for paid features), about ringing behaviour (simultaneous, fastest finger), about transfer (in-browser staff transfer for both, WA-number transfer Twilio-only). Each one captured in a docs file with the <em>why</em> attached.</p><p>Then we shipped Phase 0 &#8212; the schema, the Call model, the webhook dispatch &#8212; in one tight commit. I placed a real call to my business number and we both watched the engine.io payload arrive in the logs. Field names matched. The plan worked.</p><p>Phase 1 was the part I&#8217;m proudest of. The work split cleanly into a backend half (Meta API client + answer/end wiring) and a frontend half (incoming-call toast + WebRTC SDP exchange + in-call panel). The assistant suggested we lock the contract surface between them &#8212; <em>the call:incoming socket payload shape, the answer endpoint signature</em> &#8212; and then dispatched two agents in parallel, each on its own git worktree. They came back roughly an hour later. The merges were clean because the contract was locked. That part was a small revelation: parallel AI work isn&#8217;t fragile if you treat the integration boundary like an API.</p><h2>The Trouble Starts</h2><p>It was about commit fifteen of the day when the first cracks appeared. A crash about timezone arithmetic. A 400 from Meta about a deprecated <code>typing_indicator</code>. Some 500s from the Baileys sidecar replaying buffered messages that included WhatsApp Status updates from <code>status@broadcast</code>.</p><p>Each of these was a real bug, none of them caused by our voice work directly, but all of them surfaced <em>because</em> our voice work created new sessions and new database states and new restart events that exposed latent issues. We fixed them one by one. The assistant pushed back when I said one was &#8220;new&#8221; &#8212; <em>the constraint has been there since the initial migration, the bug is pre-existing</em>. I pushed back harder &#8212; <em>I was running this without errors before our changes</em>. We were both kind of right. The bugs were latent; our changes activated them.</p><p>Each fix was small. Each one mattered. And each one was followed by <em>&#8220;now real-time should work&#8221;</em> &#8212; and it didn&#8217;t.</p><h2>The Mystery</h2><p>By midnight I had voice working in test calls but the dashboard wasn&#8217;t updating live. Messages would arrive in the database. The agent would reply. The customer would receive the reply. But on the staff screen, nothing &#8212; until I pressed F5.</p><p>The assistant and I went through a dozen hypotheses. None of them right.</p><ul><li><p><em>It&#8217;s the auth token expiring.</em> It wasn&#8217;t.</p></li><li><p><em>It&#8217;s WORKERS=4 without proper Redis fanout.</em> We set it to 1; still broken.</p></li><li><p><em>It&#8217;s nginx misconfigured.</em> I pasted my config; textbook correct.</p></li><li><p><em>It&#8217;s the Service Worker caching old JS.</em> Tested in Incognito; same problem.</p></li><li><p><em>It&#8217;s the </em><code>wss://</code><em> URL scheme tripping socket.io-client.</em> Coerced to <code>https://</code>; same problem.</p></li><li><p><em>It&#8217;s the explicit transports config.</em> Removed it; same problem.</p></li></ul><p>Around hour three of this I made a decision that turned the whole night around. I asked the assistant to instrument the transport itself &#8212; to monkey-patch <code>WebSocket.prototype.send</code> at the very top of the entry point and log every byte that left the browser. <em>Stop guessing. Show me the wire.</em></p><p>What I saw next is what I want to remember.</p><p>The browser sent <code>2probe</code> (engine.io upgrade probe). It sent <code>5</code> (engine.io UPGRADE commit). It PONGed back when the server PINGed. It did everything <em>except</em> send the one packet that mattered: <code>40{"token":"..."}</code> &#8212; the Socket.IO namespace-connect packet. The auth callback was firing &#8212; socket.io-client <em>thought</em> it was sending &#8212; but the bytes never made it to the wire.</p><p>To prove the wire wasn&#8217;t the problem, we did a brutal test: I pasted a raw WebSocket connection into my browser console, manually typed <code>40{"token":"..."}</code> and called <code>ws.send</code>. The server received it. The connect handler ran. Everything that should have worked, worked &#8212; bypassing socket.io-client entirely.</p><p>That was the moment I understood: the library itself was lying about what it was doing.</p><h2>The Pivot</h2><p>There&#8217;s a cliff in any project where you stop trying to fix something and start trying to replace it. We were standing at that cliff at 1:30 AM. The assistant proposed it cleanly &#8212; <em>Branch B4: write a raw-WebSocket adapter</em>. About 150 lines. We knew the protocol; we&#8217;d just used it manually. There was no real reason to keep fighting socket.io-client.</p><p>I said yes.</p><p>The adapter went in fast. The assistant wrote it; I reviewed; we shipped. The first version had a small race condition &#8212; emits dispatched before the connect ack got dropped &#8212; and we fixed it by adopting socket.io-client&#8217;s own pattern: buffer pre-connect, flush on connect.</p><p>Then real-time worked.</p><p>A WhatsApp message arrived at the dashboard live. An incoming-call toast appeared the instant a call came in. Six hours of debugging ended in a single page reload that did everything it was supposed to do.</p><h2>What I&#8217;m Taking From This</h2><p>A few things I want to remember the next time I do this.</p><p><strong>Plan before you build.</strong> The hour we spent on the architecture doc and the contract lock saved us at least three later. When the parallel agents merged cleanly, that was the dividend.</p><p><strong>The assistant proposes; you verify.</strong> Several of my best moments in this session were pushing back. <em>No, I really was running this without errors. No, that&#8217;s not enough evidence to commit a fix. Show me the actual diff.</em> The assistant is excellent at making plausible hypotheses, and plausible hypotheses are not the same as true ones.</p><p><strong>Instrument before you fix.</strong> Until I saw <code>[ws.send] data=40{...}</code> <em>not</em> appearing on the wire, every fix was a guess. The diagnostic patch was the real breakthrough; everything before it was theatre.</p><p><strong>Bypass beats heroics.</strong> When socket.io-client wouldn&#8217;t cooperate after four config combinations and a version downgrade, the right move was not to keep configuring. It was to ship 150 lines of replacement code and stop depending on the broken thing.</p><p><strong>Persist your findings.</strong> We saved memory entries &#8212; <em>if real-time looks broken, check these three things in this order</em> &#8212; so the next session doesn&#8217;t redebug from scratch. That&#8217;s a discipline, not a feature.</p><p><strong>The marathon is part of the work.</strong> I almost gave up around hour four. The assistant didn&#8217;t, partly because it doesn&#8217;t get tired, partly because debugging is what it&#8217;s actually good at when you give it the right tools. There&#8217;s something useful about having a partner who&#8217;ll sit with you in the same problem at 1 AM and not flinch.</p><p>I&#8217;m going to bed. The dashboard is updating live. The voice toast pops up the moment a call rings. Customers can hear staff. Staff can hear customers.</p><p>Eight hundred lines of new code. Twenty-seven commits. One latent bug from a year ago, one new library written from scratch, and one really long night.</p><p>Worth it.</p>]]></content:encoded></item><item><title><![CDATA[The Accidental Product]]></title><description><![CDATA[How Clerk Was Born From Scratching My Own Itch]]></description><link>https://ahmadmicro.substack.com/p/the-accidental-product</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/the-accidental-product</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Thu, 30 Apr 2026 08:43:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A vendor sends me an invoice. I am in a coffee shop, between meetings, with maybe ninety seconds before I need to be somewhere else. I open Clerk in a browser tab and drop the PDF into the chat. Within twenty seconds it replies: a draft bill, the right vendor, the right amount, the right due date, a question about which project to charge it to, and a note that this vendor&#8217;s last invoice was paid eleven days late &#8212; would I like a reminder this time? I click &#8220;Project A&#8221; and &#8220;yes.&#8221; The bill is filed. The reminder is set. The journal entry will post when the bill is paid. I close the tab and walk to the next meeting.</p><p>That interaction was not possible eighteen months ago. Not in any product, on any platform, at any price. The thing that made it possible &#8212; a model competent enough to read a document, hold a memory of past behavior, ask the right clarifying question, and take a real action on the user&#8217;s behalf, all in the time it takes to stir a cup of coffee &#8212; only exists now. The thing I built on top of it, which is what I want to write about today, was not supposed to be a product. It was a tool I built so I could stop hating my own bookkeeping.</p><p>This essay is about how it stopped being mine.</p><h2>What Clerk actually is, in concrete terms</h2><p>The previous essays in this series have talked about Clerk in the abstract &#8212; as a thesis, as a bet, as the first agent in a Business Operating System. I have not, until now, told you what it actually does, and I think the abstraction is starting to work against me. So before anything else, here is the product, in the order a real user encounters it.</p><p><strong>You sign up.</strong> You tell Clerk what kind of business you run. It uses that to set up a chart of accounts that fits &#8212; sole proprietorship, professional services, retail, non-profit. Five steps. Under five minutes. By the end of onboarding you have a working accounting system, configured for your jurisdiction, with the right tax codes already wired in.</p><p><strong>You connect a bank account.</strong> Either you upload a CSV from your bank &#8212; which is what most Nigerian users do, because the bank APIs here are not great &#8212; or you connect through Mono if your bank supports it, or Plaid if you are somewhere else. Either way, the transactions land in Clerk. Within a minute, they have all been categorized. Not with keyword matching, the way QuickBooks does it. The model actually reads each transaction and decides what it is in the context of your business. The first round of categorizations will get a few things wrong. You correct them. The corrections become rules. Next month, those same patterns get caught automatically.</p><p><strong>You start sending Clerk documents.</strong> A receipt photo from your phone. A vendor&#8217;s invoice that arrived in your email. A scanned expense report from a colleague. A bank statement PDF. Clerk reads them, extracts what is relevant, links them to the right transactions, and stores them permanently. Six months later, every transaction in your books has a source document attached to it that you can pull up in two clicks. This is the part that changes the relationship a small business owner has with their books, and I will come back to it because it is more important than it sounds.</p><p><strong>You ask questions.</strong> <em>&#8220;What&#8217;s my profit this month?&#8221;</em> gives you a real answer with the numbers and a quick explanation of what changed. <em>&#8220;Why did expenses jump in March?&#8221;</em> pulls the actual transactions that drove the jump, grouped by category, and tells you which lines are out of pattern. <em>&#8220;Send me a balance sheet for the auditor&#8221;</em> generates a PDF in three seconds and emails it where you ask. The asking happens in the same chat window you used to upload the receipt, or over WhatsApp, or in Slack, or in the web app. Clerk is the same agent in every channel, with the same memory, the same tools, the same opinion about how your books should be kept.</p><p><strong>You generate invoices.</strong> You say <em>&#8220;send Acme an invoice for the web design work, three hundred thousand naira, due in thirty days&#8221;</em> and Clerk drafts it, asks for whatever it does not already know, sends it, books the receivable, and tracks the payment status until the money comes in. When the payment lands in your bank account, Clerk recognizes it, matches it to the invoice, marks it paid, and posts the journal entry. The whole loop &#8212; invoice, reminder, payment, reconciliation &#8212; happens without you opening a screen.</p><p><strong>You run payroll.</strong> Clerk knows your employees, knows the statutory deductions for your jurisdiction, and runs the calculation when you tell it to. PAYE, pension, NHF for Nigerian users. PAYE and NICs for UK users on the partner&#8217;s instance. The payroll journal entries post automatically. The payslips generate automatically. The compliance filings draft themselves.</p><p><strong>You forecast.</strong> <em>&#8220;What does my cash flow look like for the next six months at our current burn?&#8221;</em> gets you a real ML-based projection &#8212; ARIMA on the revenue side, Prophet for seasonality, monte carlo for the scenarios. Clerk shows the assumptions it is making and lets you change them. What if we land that contract. What if FX moves five percent. What if the new hire starts a month later. You can save scenarios, compare them, and walk into a board meeting with a real model rather than a wishful spreadsheet.</p><p><strong>You collaborate.</strong> If you have a bookkeeper, an accountant, or a co-founder, they get their own login with the right permissions. The system is multi-user from the start. They can edit what they are allowed to edit. The audit trail records every change. You can leave each other comments on transactions. You can share a report with your investor in one click &#8212; they get a read-only view scoped to exactly what you want them to see.</p><p>That is, roughly, the product. There is more &#8212; a spreadsheet editor with formula support, a plugin system for custom workflows, a knowledge base for tax and accounting rules, executive dashboards &#8212; but the core, the thing that does most of the heavy lifting, is what I just described. A small business&#8217;s entire back office, run by a competent agent that you can talk to in any channel, with documents linked to everything and tax compliance built in.</p><p>This is what people are asking me for when they ask if they can use it. Not the abstract Business Operating System. This.</p><h2>Why accounting was waiting for this</h2><p>There is a deeper question lurking under the product description, and I want to answer it before I go any further, because I think it is the most under-discussed thing about why Clerk works at all.</p><p>Why is accounting <em>uniquely</em> suited to be solved by a competent AI, in a way that a lot of other small-business pain is not?</p><p>The pat answer is that accounting is &#8220;structured&#8221; &#8212; that the rules of double-entry bookkeeping are well-defined, that there is a right answer to every question, that this is the kind of domain where a precise system can shine. That answer is wrong, or at least it misses the point. The right answer is closer to the opposite. Accounting is uniquely suited to AI because the rules are structured but the <em>inputs are unstructured to the point of hostile</em>, and bridging that gap is exactly what large language models are good at.</p><p>Think about what a bookkeeper actually does. They look at a bank statement that says <code>TRSF FRM/MUSA/RECON</code> and decide whether that is a customer payment, a personal transfer, a vendor refund, or a loan repayment from a friend. They look at a receipt scan that is blurry, partially in another language, missing the date, and figure out what it represents and which account it should hit. They look at an invoice that uses one set of terminology in a vendor&#8217;s industry-specific format and translate it into the standard chart of accounts. They look at a payment that does not quite match any open invoice and decide whether it is a partial payment, a duplicate, or for something that has not been billed yet. The judgments are constant. They require context &#8212; about the business, about the people, about the history. The volume is high enough that no software written in the last forty years has gotten close to handling them without a trained human in the loop.</p><p>Traditional accounting software gives up on this problem. It accepts that the inputs are messy, refuses to do the judgment, and pushes the messiness onto the user. <em>Categorize this. Match this. Reconcile this.</em> The user, if they are not a trained accountant, mostly gets it wrong, gives up, and the books get worse over time. That is the failure mode of QuickBooks and Xero and every other product in this category. It is not a failure of the software. It is the software doing exactly what it was designed to do, and what it was designed to do is help an accountant &#8212; which would be fine, except that most small businesses do not have an accountant, and that is the actual problem.</p><p>A capable AI does not give up on the messy input. It reads <code>TRSF FRM/MUSA/RECON</code> and asks who Musa is and what kind of relationship you have with him, and once you tell it, it remembers. It looks at the blurry receipt and pulls out the date, the vendor, the amount, the line items, and asks about the one field it could not read. It looks at the partial payment that does not match any open invoice and proposes three explanations, ranked by likelihood, and asks you which is right. It bridges the gap between what the world actually gives you &#8212; bank statement narrations, smartphone photos of receipts, emails from suppliers, voice notes from your delivery guy &#8212; and what the books require, which is consistency, completeness, and double-entry discipline.</p><p>That gap is the gap small businesses have been falling into forever. It is the reason their books are always behind, always slightly wrong, always too painful to reconcile. The gap is bridgeable now. It was not bridgeable a year ago, not at this quality, not at this price. And once it is bridgeable, accounting stops being a thing small businesses do badly because they cannot afford to do it well, and starts being a thing that runs in the background, like email, or maps.</p><p>This is what makes Clerk a <em>category change</em>, not a feature update. We are not building a better accounting app. We are building the first accounting system that does not require a trained human to operate. That is a different thing, and the difference is most of why this works.</p><h2>How I noticed it had stopped being mine</h2><p>I was using Clerk to run Microscale. The books were cleaner than they had ever been. I was spending maybe a tenth of the time on accounting that I had been spending before, and the time I did spend was almost all <em>reviewing</em> decisions Clerk had already made, rather than making decisions from scratch.</p><p>I was telling people about it, the way you tell people about any piece of software that has materially improved your week. The conversations started to repeat themselves. I would mention, in passing, that I had built a thing. The other person would ask what it did. I would explain. The other person would be quiet for a beat, and then they would ask &#8212; not politely, but with something close to urgency &#8212; whether they could use it. Whether I would sell it. Whether I could give them a login for their company.</p><p>The first few times, I was flattered. By the fifth time I started to notice something. By the tenth time I could not un-notice it.</p><p>What I noticed was this. Every single person was describing the same pain. Not a related pain. Not a cousin of the pain. The exact same pain, in the exact same words. <em>I cannot afford an accountant. The software is too complicated. My books are always behind. I am scared of what due diligence will turn up. I know what I am doing wrong but I cannot fix it.</em> Different industries. Different sizes. Different cities. Different people. The same words.</p><p>I had assumed my situation was specific. It was not. It was shared, by roughly every small business owner without a finance team &#8212; which is most of the small businesses in the world. The pain was universal. The thing I had built to fix my own version of it was, without my trying, the thing a large number of other people were also trying and failing to fix. The reason nobody had built it was that until very recently, building it had been impossible. Now it was possible. I happened to be one of the first people to have built it and lived with it long enough to know it actually worked.</p><p>This is the moment I want to be honest about, because I think it is the most repeatable lesson in this essay. I did not have a flash of entrepreneurial insight. Insights are guesses about markets you have not entered. I had a flash of <em>recognition</em>, which is a different and more reliable thing. Recognition is just seeing that the thing in front of you is also in front of other people. You are not predicting anything. You are noticing something. The difference between the people who build accidental products and the people who do not is mostly the willingness to notice.</p><h2>The hard part of the transition</h2><p>I want to spend a paragraph on the part of this story that I find people consistently underestimate, because I think it is where most internal tools die when they try to become products.</p><p>The naive view is that the gap between &#8220;a thing I use&#8221; and &#8220;a thing other people can use&#8221; is a <em>features</em> gap. You built it for yourself, so now you have to add multi-tenancy, permissions, onboarding, billing, a hundred things you did not need when you were the only user. That gap is real. It is also the easy part. Features are tractable.</p><p>The hard part is that when you open your tool up to other people, you lose the feedback loop that made the tool work. You were building for you, and the tightness of that loop &#8212; every broken thing surfacing within a day, on real data, with real consequences &#8212; was what let you ship fast and prioritize ruthlessly. The moment you have other users, you have to start building for people who are not you, and if you are not careful you slide into exactly the kind of composite-user guessing game you had successfully avoided. The accidental product starts becoming a deliberate product, and deliberate products are often worse.</p><p>The thing that has rescued me here, and that I think is going to keep rescuing Clerk as it grows, is that I never stopped being a customer. I am still using Clerk to run Microscale. I am still the first user of every feature. I still feel the pain before any of my paying customers feel it. Microscale is not just a customer; it is a reference implementation. As long as Microscale&#8217;s books are the ones I care about most &#8212; and they are, and will be for a long time &#8212; there is at least one real user with a real life depending on this software, and that is enough to keep the product honest.</p><p>The lesson, for anyone reading this and wondering whether their own internal tool is secretly a product, is that the test is not &#8220;are other people interested.&#8221; Of course other people are interested. There is a new capability in the world, and any tool built on top of it feels interesting to anyone who does not have one. The real test is whether you can open the tool up to other people <em>without breaking the thing that made it good in the first place</em>. Whether you can keep the honest feedback loop alive while adding the features and the scaffolding and the multi-tenancy that opening up requires. Most builders fail this test. I am trying very hard not to.</p><h2>The shape of an accidental product</h2><p>There is a category of product emerging right now that I think is going to define a lot of the next few years of software, and I want to name it explicitly because the name has not settled yet. Call it the <em>accidental product</em>. The defining features:</p><p>It was built to solve one specific person&#8217;s problem, by that person, using AI tools that did not exist eighteen months ago.</p><p>It works <em>unusually well</em> in its core use case, because the builder was the user and the feedback loop was tight enough that everything that did not work got fixed within a day.</p><p>It is <em>unusually opinionated</em>, because the builder did not have to compromise with a market.</p><p>It is <em>idiosyncratic</em> in ways that look like flaws to a market researcher and like virtues to other people with the same problem.</p><p>It is <em>hard to copy</em>, because the thing that made it good was not a feature list or a market insight. It was a specific person solving a specific problem with a tight feedback loop, and copying that without the specific person is harder than it looks.</p><p>These products do not look like venture-backed software. They are not designed to be unicorns. They are scrappy and narrow and full of assumptions that only make sense if you are the exact person who built them. But because the pain was real and the feedback loop was tight, the tool <em>works</em>. It actually solves the problem. And then, almost inevitably, it turns out the pain is not unique to the builder, and the tool gets pulled out of its creator&#8217;s hands by people who also need it.</p><p>I think this is going to be a dominant pattern for software in the small-business space for the next several years. Not because solo founders are going to displace SaaS companies overnight, but because the new tools have made it possible for a single person with a real problem to build a real solution without any of the apparatus a software company traditionally requires. No team to convince. No market to validate. No deck to pitch. Just the problem, the builder, and a model competent enough to do most of the typing. The thing that this changes is not how much software gets built. It is <em>who gets to build it</em>. And the products that come out of that shift are going to be different &#8212; more opinionated, more specific, harder to imitate &#8212; than the products that came out of the previous era.</p><p>Clerk is one of those products. Pulse, the customer support agent already running at pulse.faxter.com, is another. The next agent in the suite will be a third. I am not the only person noticing this pattern, and I do not need to be. The pattern is inevitable now. What I am doing &#8212; writing this series, hiring a team, building the rest of the suite &#8212; is just the part of the inevitability that I happen to be participating in.</p><h2>What I think this means for you</h2><p>I want to end with a question rather than a conclusion, because I think the question is more useful.</p><p>Is there a tool you have built for yourself in the last twelve months that you have stopped being able to live without? Not an experiment. Not a script. A tool you actually use, on real work, that has materially changed how you do something. If yes, the next question &#8212; the one I want to leave you with &#8212; is whether you have noticed yet that other people have the same problem you built it to solve.</p><p>They probably do. They are probably already telling you about it, in passing, the way the people in my conversations were telling me. You are probably explaining it away as flattery. It is probably not flattery.</p><p>If that is true, then the only thing standing between you and an accidental product is the willingness to notice, the willingness to take it seriously, and the willingness to do the unglamorous work of opening it up to other people without breaking the thing that made it good in the first place. Most of the people who build internal tools never do this. The ones who do are going to define the next several years of software.</p><p>I noticed mine. This series is what I am building from the noticing.</p><p>If you noticed yours, I hope you build it.</p>]]></content:encoded></item><item><title><![CDATA[Vibe Coding with Claude Code]]></title><description><![CDATA[What a Year Inside the Loop Taught Me]]></description><link>https://ahmadmicro.substack.com/p/vibe-coding-with-claude-code</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/vibe-coding-with-claude-code</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Thu, 23 Apr 2026 08:01:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I have been writing software with LLMs in the loop for about two years now. The first year was Faxter. The second year has been Clerk. The difference between those two years is so large that I have trouble explaining it to people who weren&#8217;t paying close attention, and I think the difference is worth writing down, because I suspect a lot of founders and engineers are still calibrated to what the first year felt like and have not yet updated to what the second year actually is.</p><p>This essay is about that update.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Year one: vibe coding as glorified autocomplete</h2><p>When we were building Faxter, &#8220;AI-assisted coding&#8221; meant something specific and limited. You had a chat window open in one monitor and your editor in the other. You described what you wanted. The model gave you a block of code. You read it, understood it, usually rewrote half of it, and pasted the rest. Then you debugged, because the model had hallucinated an API that didn&#8217;t exist, or used a library version from two years ago, or confidently produced something that would compile and run and silently corrupt your data.</p><p>It was useful. It was genuinely useful. I built, largely alone, a working public cloud platform &#8212; virtualization, billing, the control plane, the whole software stack &#8212; at a speed that would have required a real engineering team a few years earlier. But the <em>human</em> was doing all the thinking. The model was a faster way to produce boilerplate and a pretty good rubber duck for design questions. It was not, in any meaningful sense, a collaborator.</p><p>The mental model I had then was: the AI is a very fast junior who cannot be trusted with anything load-bearing. Every line it produced passed through my head before it reached the repo. That was the correct mental model for the tools available. It is not the correct mental model anymore, and the fact that a lot of smart people still hold it is why I keep having the same conversation at dinners.</p><h2>Year two: the model can hold a problem in its head</h2><p>Sometime in late 2025 and through the first quarter of 2026, this changed. Not gradually. The models stopped producing snippets and started producing <em>work</em>. You could describe a feature, point at a repository, and get back a change set that understood the existing code, touched the right files, matched the conventions, and ran. You could ask for a refactor that spanned a dozen files and get it done in a single pass. You could say &#8220;the bug is somewhere in how we handle VAT on imported goods&#8221; and come back twenty minutes later to find it diagnosed, fixed, and tested.</p><p>The thing that had changed was not just code quality. It was <em>duration of coherent reasoning</em>. The old models lost the plot after a few hundred lines. The new ones could stay on task for a whole feature. That sounds like a small difference. It is not. It is the difference between a tool and a collaborator, and everything downstream of that distinction &#8212; how you plan work, how you structure a codebase, how many people you need, what a &#8220;team&#8221; even is &#8212; changes.</p><p>I started building Clerk right as this shift was happening, and the journey from the first commit to where I am now is the clearest picture I have of what vibe coding actually is in 2026.</p><h2>The first architecture was a mistake. So were the next four.</h2><p>I started by trying to build an agent from scratch. This was a mistake, but it was the kind of mistake you have to make in person to understand. I had opinions about how an AI agent should be structured &#8212; planning layer, execution layer, orchestration layer, response formatter &#8212; and I built all of it by hand. It worked, in the sense that it ran. It did not work, in the sense that every new feature was harder than the last one, and I spent more time maintaining my own scaffolding than I spent on the accounting logic that was the actual point.</p><p>So I threw it away and tried a second design. Then a third. Then a fourth. Each one was a different theory of how to decompose the problem &#8212; a tiered planner that routed simple queries to cheap paths, a composite-operations framework that let me define workflows declaratively, a three-stage response pipeline, a dual-agent system where a custom orchestrator handled the cost-sensitive cases and something smarter handled the rest. Each of these sounded like a good idea at the whiteboard. Each of these was, in retrospect, a version of the same mistake: I was building a <em>framework</em> when I should have been building a <em>product</em>.</p><p>The fifth attempt was LangGraph&#8217;s ReAct pattern. It worked on the first try. Not because LangGraph is magic, but because it stopped me from building the scaffolding I kept insisting on building. ReAct is almost embarrassingly simple: the agent reasons, picks a tool, acts, observes the result, reasons again. That&#8217;s it. There is no planner, no orchestrator, no tiered router. The model handles complexity natively because the model is actually capable of handling complexity now, and every layer I had been lovingly constructing around it was just a cage that constrained what a capable model could do.</p><p>This is the single most important thing I have learned from vibe coding in 2026, and it is counterintuitive enough that I want to say it plainly: <strong>the better the model gets, the less software you should write around it.</strong> Every abstraction you add is a bet that the model is dumber than it actually is. That bet kept being wrong. It kept being wrong faster than I could take it off the table.</p><h2>The clean restart</h2><p>By early 2026 the codebase was an archaeology of good intentions. Four agent architectures&#8217; worth of dead code, two parallel agent systems, a 2,500-line response formatter, a capability registry with forty entries, composite operations defined in JSON-like structures, hardcoded tax rules, template-based responses that felt robotic, and a planning layer I could no longer justify. It worked. Users used it. But every change was painful, every bug fix risked breaking something else, and onboarding a new contributor &#8212; even an AI one &#8212; was an exercise in forensic anthropology.</p><p>I did something I had not done before. I asked Claude Code to read the entire project and summarize, in brutal detail, what we had learned. What worked. What didn&#8217;t. What we&#8217;d do differently. What anti-patterns we kept falling into. No diplomacy. No face-saving. Just the lessons.</p><p>It produced ten articles&#8217; worth of prose. I read it twice. Most of it was things I already knew but had not let myself say out loud: the dual-agent system was fundamentally flawed because users needed one way to do things, not two. Templates were a mistake because every response felt generic when it should have felt like a conversation. Accounting rules should have been data, not code, because tax laws change and jurisdictions differ. The &#8220;just one more layer&#8221; instinct had cost me more than any other single habit. The 80% of features half-finished were worth less than the 20% finished to 100%.</p><p>Then I did the thing you are not supposed to do. I started over. I used the ten articles as the prompt. I told Claude Code to build Clerk again from scratch, with those lessons as hard constraints, and I sat with it for a week.</p><p>The new codebase was done in seven days. 100% AI-generated code. Not &#8220;AI-assisted with heavy human rewriting.&#8221; AI-generated. I read every diff, I made decisions at every fork, I redirected when it went off course, but I did not <em>write</em> the code. I <em>directed</em> the code. The distinction matters.</p><p>The rebuilt system was smaller than the one it replaced, cleaner, faster, and &#8212; this is the part that still surprises me &#8212; more capable. The discipline of the lessons-learned prompt forced it to refuse the abstractions I had been too attached to delete by hand. A human rewrite would have smuggled half of the old complexity back in out of sentimentality. The AI had no sentimentality. It just built the thing.</p><h2>What I actually do now</h2><p>People ask me what &#8220;vibe coding&#8221; looks like in practice in 2026, so here is the honest version, from the inside.</p><p>I spend most of my time doing three things: deciding what to build next, reading diffs, and arguing with the model when its first instinct is wrong. The actual typing of code &#8212; the thing I used to think of as &#8220;programming&#8221; &#8212; is now the smallest part of the loop. Most days I don&#8217;t touch the keyboard to write code at all. I touch it to write prompts, to read what came back, and to say &#8220;no, do it this way instead, and here is why.&#8221;</p><p>The skill that matters is not prompt engineering in the sense of magic incantations. It is <em>taste</em>. It is knowing, when the model shows you a diff, whether the diff is right. It is knowing which of the four reasonable-looking approaches it just proposed is the one that will compound into a clean codebase six months from now versus the one that will metastasize. The model can generate five plausible architectures in the time it takes you to read one of them. The value you add is picking the right one and refusing the other four, fast, with conviction.</p><p>The other skill that matters, and that I did not expect, is <em>refusing to intervene</em>. When you are used to writing code by hand, watching an agent work is excruciating. It goes down paths you wouldn&#8217;t have taken. It tries things you know won&#8217;t work. Your instinct is to stop it, grab the wheel, and do it yourself. That instinct is almost always wrong now. Most of the time the agent recovers. Most of the time its path, even when it&#8217;s not the one you would have taken, arrives somewhere fine. Every time you interrupt, you are trading a small amount of its momentum for a small amount of your control, and the exchange rate is worse than it feels.</p><p>I have had to unlearn the habit of mid-air corrections. I try to set the agent up well, let it work, and review the result. If the result is wrong, I tell it what was wrong and let it fix it. The temptation to micromanage is strong and almost always counterproductive.</p><h2>The rules I now refuse to break</h2><p>After two years of this, I have a short list of rules that I will not violate, because each of them was earned by ignoring it and paying for it:</p><p><strong>One way to do things.</strong> If your system has two agents, two codepaths, two ways to reach the same outcome, you will spend the rest of the project&#8217;s life paying for the choice. Pick one. Delete the other. If you can&#8217;t decide, flip a coin &#8212; being wrong is cheaper than being split.</p><p><strong>No templates for anything the user reads.</strong> If a human is going to read it, a model should write it. Templates feel robotic because they are robotic. The entire point of an AI-native product is that the product can talk. Don&#8217;t gag it.</p><p><strong>No hardcoded rules for anything that changes.</strong> Tax rates change. Jurisdictions differ. Accounting standards evolve. Anything that lives in the world, and the world gets to modify, belongs in a knowledge base the model can read &#8212; not in an <code>if</code> statement.</p><p><strong>The minimum path from API to database.</strong> If your request diagram has more than four boxes, you have too many boxes. Every layer is a bet that you are smarter than the compiler and the model combined. You are not.</p><p><strong>Read the lessons before starting work.</strong> I keep a <code>LESSONS-LEARNED.md</code> file in the repo and I load it into context at the start of every serious session. It is the cheapest insurance I have ever bought. The anti-patterns you fell into last month are the anti-patterns you will fall into this month if no one reminds you.</p><p><strong>Let the model finish.</strong> Whatever is happening, let it finish. Then judge. Interrupting is almost always worse than reviewing.</p><p><strong>Finish the 20% before you touch the 80%.</strong> At every stage of Clerk I have had the temptation to start the next shiny feature before the current one is actually done. Every time I have given in, I have ended up with another 80%-complete feature in a codebase that already had too many. Finish. Ship. Then expand.</p><h2>What this changes</h2><p>The question I get asked most often is whether this is real leverage or a party trick. Is a solo founder with Claude Code genuinely equivalent to a team of five, or are we all going to wake up in a year and find out the code we shipped at 3x speed is unmaintainable garbage?</p><p>My honest answer, after two years of actually doing this: it is real leverage, but it is leverage that rewards a specific kind of operator. If you have taste, if you can read a diff and know whether it&#8217;s right, if you can hold a product vision in your head and steer toward it, if you can resist the urge to micromanage and also the urge to trust too much &#8212; then yes, the multiplier is large, maybe larger than people are willing to say in public. I have shipped more working software in the last year, alone, than a funded team of engineers would have shipped on the same problem a few years ago &#8212; and the difference is not me. The difference is the tools.</p><p>If you don&#8217;t have those things, the leverage is still there, but it cuts both ways. You will produce more code, faster, and some of that code will be wrong in ways you cannot see, and by the time you find out the pile will be too tall to excavate. The failure mode is not &#8220;AI writes bad code.&#8221; The failure mode is &#8220;human who cannot evaluate AI output accumulates bad code faster than ever before.&#8221;</p><p>The thing I believe, and that I am betting Clerk on, is that the people who learn to do this well will have a window of a few years where they can build entire products that would previously have required entire companies. Not because they are smarter. Because the cost of converting a decision into working software has collapsed, and the bottleneck has moved upstream to the decisions themselves.</p><p>That is what the year of vibe coding with Claude Code taught me. The bottleneck moved. You either moved with it, or you are still writing code by hand and wondering why the people who didn&#8217;t are shipping so much faster.</p><p>I know which side I&#8217;m on. The next essay is about what you build when you&#8217;re on that side &#8212; and how the tool you built to run your own business starts turning into a business of its own.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[From Embedded Systems to AI-Native: Why Microscale Is Betting the Company on LLMs]]></title><description><![CDATA[I spent a weekend last year trying to make QuickBooks Online work.]]></description><link>https://ahmadmicro.substack.com/p/from-embedded-systems-to-ai-native</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/from-embedded-systems-to-ai-native</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Thu, 16 Apr 2026 08:01:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I spent a weekend last year trying to make QuickBooks Online work. I signed up. I connected it to our Shopify store. I imported the bank statements. I sat with the transactions view for a few hours &#8212; clicking through categories, guessing at account mappings, trying to figure out what the software wanted from me. Then I closed the browser, and I did not open it again.</p><p>That weekend was the beginning of this story, though I did not know it yet.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I run Microscale, an embedded systems company in Abuja. We design hardware and we write firmware. Accounting is not what we do. What we had, up until that weekend, was an Excel workbook &#8212; an income-and-expenditure tracker that balanced, in the sense that the columns added up, but that was only as complete as the transactions we remembered to type into it. Which, honestly, was never all of them. A real business does not run on a workbook that depends on whoever happens to be paying attention that week. Ours had been getting away with it, but we both knew it.</p><h2>What was wrong with QuickBooks</h2><p>The problem was not that QuickBooks was bad. QuickBooks is not bad. QuickBooks is, by any reasonable measure, a competent piece of software that does what it says it does, at a price that is fair for the work involved. The problem was that QuickBooks was not built for me.</p><p>What QuickBooks was built for is a person who already knows how to do accounting and who wants software that accelerates the work they would otherwise do by hand. When that person sees a screen full of uncategorized transactions, they know what to do with it. They look at the list, they apply their judgment, and they go. When <em>I</em> saw a screen full of uncategorized transactions, I stared at it. What account does a cash withdrawal at a bank ATM go under? What about the dozen transfers to names I half-recognized? What about the Shopify payouts &#8212; gross or net of fees? What about the transfers that looked like they were between my own accounts but might not have been? I did not know. I knew the <em>business</em>. I did not know the <em>books</em>. And QuickBooks had no opinion about that gap, because it was not designed to. It was designed for someone who had already crossed it.</p><p>That is &#8212; and this is the important part &#8212; the normal outcome for a small business owner who tries to set up accounting software without an accountant next to them. You do not fail loudly. You do not throw your hands up and curse the product. You put in a few hours, you hit a wall, you promise yourself you will come back to it over the weekend, and you do not. It is not a failure of will or intelligence. It is the software assuming a skill you do not have, and declining to close the gap on your behalf.</p><h2>Why I was trying in the first place</h2><p>Two things had me trying at all.</p><p>We were preparing to raise, and investor diligence is not compatible with &#8220;my books are roughly okay.&#8221; Every number has to tie out. Every transaction has to have a story. You need to be able to explain why this line moved and where that payment went, without qualifying the answer.</p><p>The second was Nigeria&#8217;s 2026 tax law, which was moving through the legislature at the time and is now in force. The old regime had a lot of slack in it &#8212; informal reconciliation, patchy filings, a tolerance for small-business messiness. The new regime has less slack, and more of what slack remains is going to be audited out over the next few years. The writing was on the wall. If we did not get our accounting house in order voluntarily, we were going to be forced to do it involuntarily, and more painfully.</p><p>There was also a third thing that nobody on the outside could see yet. Jim &#8212; my co-founder, who had come over from our previous company, Faxter &#8212; and I had been having a recurring conversation for months. Faxter had not worked. We had shut down the infrastructure business, and the shutdown had left us with something unusual: runway. Not enough to start something ambitious from scratch, but enough to place a real bet on the next thing. We had been brainstorming what that next thing should be, and the shape of our conversations kept coming back to AI. Not because &#8220;AI is hot&#8221; &#8212; that much was obvious to everyone &#8212; but because the part of AI that was becoming genuinely capable was the part we were best positioned to build with. Agents that could do real work inside real businesses.</p><p>We did not know what the first product was yet. We knew there was funding, we knew there was a window, and we knew we wanted to spend both on something in AI. Beyond that, we were waiting for a problem that was sharp enough to justify building a solution.</p><p>Clerk presented itself.</p><h2>The weekend with the bank statements</h2><p>A few weeks after the QuickBooks attempt, I decided to try something different. I had all three of our bank statements as CSV files. I had a year&#8217;s worth of transactions. I had been using Claude Code heavily for engineering work. I dropped the CSVs into a session, described the business, and asked it to help me figure out where the money had gone in 2025.</p><p>It came up with a lot more than I expected.</p><p>Over the course of a long weekend, working through the transactions interactively, Claude Code did real double-entry bookkeeping. Not keyword categorization. Real journal entries, a trial balance, an income statement, and a balance sheet. Every entry balanced. Every account reconciled.</p><p>The part that convinced me was not the automation. It was the conversation. Nigerian bank statement narrations are messy &#8212; the bank truncates names, merchants use aliases, and half the transactions are human-readable only if you know who the humans are. A lot of the work was me explaining. <em>This transfer to Musa? He is an FX intermediary; sometimes those payments are for goods, sometimes they are investor loan repayments &#8212; you will have to check the context for each one.</em> <em>That transfer to my own name? Not a drawing. I was paying for freight.</em> <em>Only the transactions literally tagged &#8220;DRAWING&#8221; are actual owner drawings.</em> Each time I clarified, the classifications adjusted. The model did not argue. It did not re-make the same mistake two transactions later. It held the context.</p><p>And it did the accounting itself. I was bringing the judgment about what transactions <em>were</em>; it was bringing the discipline of what to do with them. Somewhere around hour four, I realized I had started to understand things I had never understood before. Double-entry bookkeeping &#8212; the idea that every transaction moves two accounts at once, and that the whole system stays honest because those two sides always have to agree &#8212; had, up until that weekend, been a piece of accountant jargon I nodded at politely. Now I was watching it in motion, line by line, on my own numbers, and it finally made sense. COGS. Accruals. The logic of why a cash movement and a revenue event are not the same thing. I was not being taught the concepts. I was being <em>shown</em> them, in the context of data I already understood, by a collaborator who had the patience to walk each one through as it came up. By the end of the weekend I had, almost as a byproduct, learned more real accounting than I had in years of skimming blog posts about it.</p><p>When I came up for air at the end of the weekend, I had a set of books that were, for the first time in the company&#8217;s history, actually complete. I had a clear picture of what we had earned, what we had spent, where the money sat, and the audit trail I had been unable to produce in QuickBooks. I had the understanding of our year that I had been trying to buy from an accountant.</p><p>I had not meant to build a product. I had been trying to close my books. But I had, in the course of closing my books, accidentally built the kind of accounting software I had wanted QuickBooks to be &#8212; except it existed only inside a Claude Code session, inside the specific problem I had been solving, for the specific business I ran.</p><p>That was the moment the question changed. It stopped being &#8220;which accounting package should I buy?&#8221; and became &#8220;what if the accountant is the software?&#8221;</p><h2>The decision</h2><p>I did not decide to turn this into a company in a single moment. The decision accumulated.</p><p>I showed Jim what I had done. He looked at it for a long time. We had been waiting for a problem sharp enough to justify a product, and this was one: my own frustration, my own solution, and &#8212; if the weekend with the CSVs was any indication &#8212; a capability gap between what AI could now do and what commercial accounting software was shaped like. The gap was wide enough to build a company in.</p><p>We also had the context to move fast. I had spent the Faxter years doing AI-assisted coding and knew what the newer agents could ship. We had the runway. We had a market we both understood &#8212; Nigerian small businesses, of which Microscale was one. And we had the 2026 tax law as a forcing function that would, over the next few years, push every small business in the country toward better books whether they wanted it or not.</p><p>So we started building. Not as a side project, not as a hack. A real system, built to the standard that a company about to raise money needs its books to meet, with Microscale as the first customer and a long list of future ones lining up behind it.</p><h2>What I took from those first weeks</h2><p>I want to leave you with the specific thing I learned that first month, because it is the thing the rest of this series is downstream of.</p><p>The dividing line between accounting software that works and accounting software that does not is whether it can close the gap between someone who understands their business and someone who understands accounting. QuickBooks does not close that gap. It is built for people who have already closed it. Most small business owners never close it, because the economics do not justify hiring a full-time person who has, and the software does not substitute for that person.</p><p>A capable AI can close the gap. Not by being &#8220;better software&#8221; &#8212; by being a different <em>shape</em> of software. One that can hold a conversation about messy transactions, take judgment inputs, apply accounting discipline, and produce books a human can actually use. That is not an incremental improvement over QuickBooks. It is a different category of tool.</p><p>Clerk is our bet that building in that category, for a market that has been underserved for a long time, with the tools that have only just become capable enough, is the right thing to spend the next few years doing.</p><p>The rest of the series is about what building it has actually looked like.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[I'm Writing a Series. Here's What It's About.]]></title><description><![CDATA[A field report from inside Faxter.]]></description><link>https://ahmadmicro.substack.com/p/im-writing-a-series-heres-what-its</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/im-writing-a-series-heres-what-its</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Fri, 10 Apr 2026 08:01:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>For the last year I have been quietly building something I was not expecting to build, and I have decided to start writing about it in public.</p><p>The short version is this. I run an embedded systems company called Microscale. Sometime last year, I needed an accountant and could not justify hiring one, so I built one out of an AI. The thing I built turned out to be good enough that I started running my own company&#8217;s books on it. Then other people started asking if they could use it too. Then a British ERP company found it and decided, in a fifteen-minute meeting, that they wanted to resell it in the UK. Then I realised the thing I had accidentally built was not really an accounting app &#8212; it was the first module of something much larger. A suite of AI co-workers. A Business Operating System. The kind of thing that twelve months ago would have been impossible to build alone, and that today I am building anyway, mostly alone, with a co-founder and a lot of help from AI coding agents.</p><p>I want to write about it because I think the story is worth telling and because I think the moment we are living in &#8212; the moment where a single person can build software that used to require a whole company &#8212; is not being talked about honestly enough. Most of what I read about AI is either hype from people who are not actually shipping anything or fear from people who have not actually used the tools. I have been shipping, and I have been using the tools, and I have opinions. I want to express my thoughts in writing.</p><h2>What the series covers</h2><p>Over the coming weeks I am going to publish a series of essays about all of the following:</p><p><strong>The origin story.</strong> Why an embedded systems company decided to bet on AI. What the forcing functions were. How a failed cloud startup two years ago turned out to be the foundation for the thing I am building now.</p><p><strong>Vibe coding with Claude Code.</strong> What it is actually like to ship production software almost entirely through AI agents in 2026. The rules I have had to learn the hard way. The mistakes I made and the architectures I threw away before one of them worked. A technical companion piece for the engineers who want the gory details.</p><p><strong>The accidental product.</strong> How an internal tool becomes a company, and how you know when it has. The moment I stopped calling Clerk &#8220;my accounting app&#8221; and started calling it something much larger.</p><p><strong>The Business Operating System thesis.</strong> Why I believe the future of small-business software is not better apps but a coordinated team of AI co-workers. What the suite looks like. Why I started with accounting. Why a second agent is already in production.</p><p><strong>Our first reseller.</strong> How a British ERP company found the product and decided to resell it in the UK after a fifteen-minute demo. What the deal taught me about the difference between a product and a platform.</p><p><strong>Hiring the founding team.</strong> An open call for the people I need to build the Nigerian operation. This is the most actionable essay in the series &#8212; if you are a salesperson, a customer success specialist, an accountant, or an engineer reading this and thinking &#8220;wait, is he talking about me?&#8221; &#8212; you are the reason I am writing it.</p><p><strong>Lessons learned.</strong> What I got wrong about building with LLMs and what I would tell myself a year ago. What I got right about dogfooding. The partnership that makes all of this possible and why I am not actually a solo founder even though it sometimes looks like I am.</p><p><strong>The deep cuts.</strong> The design philosophy behind an AI-native product. Why I refuse to template any response the user reads. Why every UI feature has to come with an agent tool. Why the small business owner, not the accountant, is the user.</p><h2>Who this is for</h2><p>If you are a founder thinking about AI, I wrote this for you.</p><p>If you are an engineer wondering whether &#8220;vibe coding&#8221; is real leverage or a party trick, I wrote this for you.</p><p>If you are a small business owner wondering why your accounting software feels like it was written for someone else, I wrote this for you.</p><p>If you are thinking about joining an early-stage company and trying to figure out which ones are serious, I wrote this for you &#8212; the recruitment essay in particular.</p><p>And if you are just curious about what one person in Lagos is doing with the AI tools the rest of the world is still figuring out, I wrote this for you too.</p><h2>The cadence</h2><p>I am going to publish weekly, starting next week, on this Substack. Each essay will also go out in shorter form on LinkedIn, Twitter, and Facebook, but the canonical version lives here. If you want to read the whole thing in order, subscribe. If you want to read only the essays that look interesting to you, the titles will make it clear which ones those are.</p><p>A couple of essays will publish out of sequence because they are time-sensitive. The hiring essay in particular &#8212; I need the team now, not in three months when it happens to come up in the running order &#8212; so expect that one to drop early and to be pinned to the top of the page while I am still reading applications.</p><h2>One more thing</h2><p>I am going to write honestly. I am going to tell you about the things that worked and the things that did not. I am going to tell you about the architectures I threw away, the deals that died, the mistakes that cost me months, the partnerships that saved me, and the decisions I am still not sure about. I am not writing a victory lap. I am writing a field report from inside a thing that is still in motion, and I do not know how it ends any better than you do.</p><p>But I think the view from here is worth sharing, and I think the people who want to read it will recognize themselves quickly, and I think the ones who don&#8217;t want to read it will also recognize themselves quickly, and both of those outcomes are fine.</p><p>The first essay goes up next week. Subscribe if you want to read it the moment it drops.</p><p>See you then.</p>]]></content:encoded></item><item><title><![CDATA[Start Here]]></title><description><![CDATA[This is a series of essays about Faxter &#8212; the company I am building on top of a suite of AI agents &#8212; and about what it has been like to build production software almost entirely through AI coding agents in 2026.]]></description><link>https://ahmadmicro.substack.com/p/start-here</link><guid isPermaLink="false">https://ahmadmicro.substack.com/p/start-here</guid><dc:creator><![CDATA[Ahmad Sadiq]]></dc:creator><pubDate>Thu, 09 Apr 2026 16:07:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ouyC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2af30fbe-a07d-48db-b284-23968e525d90_968x968.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>This is a series of essays about Faxter &#8212; the company I am building on top of a suite of AI agents &#8212; and about what it has been like to build production software almost entirely through AI coding agents in 2026.</p><p>If you are new here, start with the intro post below, or jump straight to whichever essay matches why you are reading.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>What this series is about</h2><p>I run an embedded systems company called Microscale. Last year, I needed an accountant and could not justify hiring one, so I built one out of an AI. That tool turned out to work, so I started running my own company&#8217;s books on it. Then other people started asking if they could use it. Then a British ERP company signed on to resell it in the UK. Then I realized the thing I had accidentally built was not really an accounting app &#8212; it was the first module of something larger. A suite of AI co-workers. A Business Operating System. The kind of product that twelve months ago would have been impossible to build alone.</p><p>This series is the field report from inside that build. What I am shipping, what I am learning, what I am getting wrong, what I am betting on, and who I am looking for to help me do it.</p><h2>If you only read one essay, read this one</h2><p>&#8594; <strong><a href="https://ahmadmicro.substack.com/p/im-writing-a-series-heres-what-its">#0 &#8212; I&#8217;m Writing a Series. Here&#8217;s What It&#8217;s About.</a></strong><br>The intro post. Tells you everything in five minutes and points you at the rest.</p><h2>If you have a specific reason for being here</h2><p><strong>You are a founder thinking about AI.</strong><br>&#8594; Start with <a href="https://ahmadmicro.substack.com/p/from-embedded-systems-to-ai-native">#1 &#8212; From Embedded Systems to AI-Native</a>, then #4 &#8212; Clerk Is Not an Accounting App for the business thesis, then #3 &#8212; The Accidental Product for how internal tools become companies.</p><p><strong>You are an engineer curious about vibe coding.</strong><br>&#8594; Start with <a href="https://open.substack.com/pub/ahmadmicro/p/vibe-coding-with-claude-code?r=zdcjy&amp;utm_campaign=post&amp;utm_medium=web&amp;showWelcomeOnShare=true">#2 &#8212; Vibe Coding with Claude Code</a>, then the technical companion #2.5 &#8212; The Five Architectures I Threw Away Before Clerk Worked. Those two together are the engineering spine of the series.</p><p><strong>You are a small business owner wondering why accounting software feels like it was written for someone else.</strong><br>&#8594; Start with #3 &#8212; The Accidental Product and then #7 &#8212; The Small Business Owner Is the User, Not the Accountant.</p><p><strong>You are looking for a job at an early-stage company and wondering if this is a serious one.</strong><br>&#8594; Go straight to #9 &#8212; Help Me Build This. It is the recruitment essay. It tells you who I am hiring, what the work is, what the trade looks like, and how to apply.</p><p><strong>You are here because of the UK reseller story.</strong><br>&#8594; #8 &#8212; Our First Reseller is the one you want. How a dead deal from two years ago came back to life and became the first commercial partnership for the new company.</p><p><strong>You are just curious.</strong><br>&#8594; Read them in order. The titles and descriptions below will tell you what is in each one.</p><h2>The series, in order</h2><p>The essays are being published weekly, with a couple dropping out of sequence when they are time-sensitive. Subscribe to get each one as it lands.</p><h3>The origin story</h3><p><strong><a href="https://ahmadmicro.substack.com/p/from-embedded-systems-to-ai-native">#1 &#8212; From Embedded Systems to AI-Native: Why Microscale Is Betting the Company on LLMs</a></strong><br>Why an embedded systems company decided to bet on AI. What the forcing functions were &#8212; a raise, a new tax regime, and accounting software that is not actually built for business owners. How Claude Code reading a bank statement changed everything.</p><p><strong>#2 &#8212; Vibe Coding with Claude Code: What a Year Inside the Loop Taught Me</strong><br>What it is actually like to ship production software almost entirely through AI coding agents. The difference between &#8220;year one&#8221; vibe coding (copy-paste) and &#8220;year two&#8221; vibe coding (collaborator). The rules I now refuse to break. Why the better the model gets, the less software you should build around it.</p><p><strong>#2.5 &#8212; The Five Architectures I Threw Away Before Clerk Worked</strong><br><em>Technical companion to #2, for engineers.</em> The monolith. The wrappers. The &#8220;Accounting OS&#8221; refactor. The dual-agent system. The clean rebuild. What I learned about local rationality, smart frameworks, and why a rewrite done by an AI is less sentimental than one done by a human.</p><p><strong>#3 &#8212; The Accidental Product: How Clerk Was Born From Scratching My Own Itch</strong><br>The moment an internal tool becomes a company, and how you know when it has. The difference between &#8220;I should build an accounting startup&#8221; and &#8220;I should build myself a thing that does this automatically.&#8221; Why building for yourself first is not a clich&#233; but a specific kind of feedback loop that cannot be faked.</p><h3>The thesis</h3><p><strong>#4 &#8212; Clerk Is Not an Accounting App &#8212; It&#8217;s the First Module of a Business Operating System</strong><br>The BOS thesis. Why the future of small-business software is not better apps but a coordinated team of AI co-workers. Why accounting is the correct beachhead. Why a second agent is already in production. What the full suite looks like and why it is only possible to build right now.</p><h3>The traction</h3><p><strong>#8 &#8212; Our First Reseller: How a British Company Found Clerk and What the UK Deal Looks Like</strong><br>A dead deal from two years ago came back and became a reseller partnership in fifteen minutes. What the meeting actually looked like. What a reseller tells you about your product that your own customers cannot. Why the relationships you keep after the deal dies are worth more than the ones you build from scratch.</p><p><strong>#9 &#8212; Help Me Build This: An Open Call for the Founding Team</strong><br><em>The recruitment essay.</em> Who I am hiring, what the work is, what the trade looks like, and how to apply. Sales Lead, Customer Success, Accounting Advisor, and senior engineers. If you have been reading the rest of the series and wondering how to get involved, this is the essay that tells you.</p><h3>The team</h3><p><strong>#10 &#8212; Two Markets, One Codebase: Serving Nigerian and UK SMEs From the Same Platform</strong><br>Multi-tenancy, tax regimes, currency, compliance, and the discipline of not forking. What the UK reseller forced me to build, what I refused to build, and why serving two markets from one codebase is the test that separates a product from a script.</p><p><strong>#11 &#8212; Small Teams With Armies of Agents: Team Size in the LLM Era</strong><br>How much leverage is real, where it breaks, and what kind of team you actually need when a single engineer with a good agent can ship what used to require ten. Why I am hiring anyway.</p><p><strong>#14 &#8212; The Partnership: Why I&#8217;m Not Actually a Solo Founder</strong><br>Jim, my co-founder &#8212; university friend, the one who joined me from Faxter and runs the business side while I run the technical side. Why the &#8220;solo founder with an army of agents&#8221; story is incomplete without him, and what a real technical/business co-founder partnership looks like at this stage.</p><h3>The reflection</h3><p><strong>#12 &#8212; What I Got Wrong Building With LLMs (And What I&#8217;d Tell Myself a Year Ago)</strong><br>The lessons-learned essay. The anti-patterns I keep falling into, the mistakes that cost me months, and the things I would send back in time if I could.</p><p><strong>#13 &#8212; Dogfooding Clerk to Run Microscale: Running a Real Business on Software You&#8217;re Still Building</strong><br>The feedback loop of being your own most demanding customer. What breaks when the software you ship is also the software your company runs on. Why I am never going to stop.</p><h3>The deep cuts</h3><p><strong>#5 &#8212; AI-Native vs AI-Bolted-On: A Design Manifesto</strong><br>Single LangGraph agent. Tools as the unit of extensibility. No hardcoded rules. Documents as first-class citizens. The principles behind Clerk, stated as a manifesto for anyone building something similar.</p><p><strong>#6 &#8212; Every UI Feature Needs an Agent Tool: Designing for Two Interfaces at Once</strong><br>The parity rule. Why I refuse to ship any feature that the AI cannot also reach. What this rule costs, and why I am convinced it is right.</p><p><strong>#7 &#8212; The Small Business Owner Is the User, Not the Accountant</strong><br>Why most accounting software gets this wrong, and why getting it right changes everything about how the product is designed. Persona-driven design for an audience that has been ignored.</p><h2>Stay updated</h2><p>New essays drop weekly, with time-sensitive ones published out of sequence. Subscribe below to get each one in your inbox the moment it lands, or follow along on LinkedIn, Twitter, or Facebook for shorter excerpts.</p><p>If any of this resonates, I would love to hear from you &#8212; hit reply to any email, leave a comment on any essay, or email me directly. I read everything.</p><p>&#8212; Ahmad</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://ahmadmicro.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>