<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Writing by Wayne George</title>
    <link>https://www.waynegeorge.uk/writing/</link>
    <atom:link href="https://www.waynegeorge.uk/writing/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Articles by Wayne George, software engineer and founder of Frontier Consulting, London.</description>
    <language>en-gb</language>
    <lastBuildDate>Thu, 10 Sep 2026 09:00:00 +0000</lastBuildDate>
    <image>
      <url>https://www.waynegeorge.uk/images/wayne-george-avatar-320.jpg</url>
      <title>Writing by Wayne George</title>
      <link>https://www.waynegeorge.uk/writing/</link>
    </image>
    <item>
      <title>You&#x27;re asking AI the wrong questions</title>
      <link>https://www.waynegeorge.uk/writing/youre-asking-ai-the-wrong-questions/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/youre-asking-ai-the-wrong-questions/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>Asking AI to write emails is the least valuable thing you can do with it. The better question is which of your processes should not involve a human at all.</description>
      <content:encoded><![CDATA[<p>My LinkedIn headline says &ldquo;You&rsquo;re asking AI the wrong questions&rdquo;. It is a slightly cheeky line, but I mean it. When I talk to business owners about AI, almost all of them are asking it to write emails, tidy up proposals and summarise documents. Those are reasonable requests. They are also the least valuable things you can do with the technology, and they steer you away from the question that actually matters: which of your processes should not involve a human at all?</p>
<p>I&rsquo;m Wayne George, a software engineer in London. I have spent more than a decade building bespoke control systems for large corporate clients, and in 2024 I founded <a href="https://frontierconsulting.ai/">Frontier Consulting</a> to build custom software and AI systems for UK businesses (some of it is on the <a href="/work/">work page</a>). What follows is the reframing I would rather we started with.</p>
<h2 id="the-questions-everyone-asks">The questions everyone asks</h2>
<p>&ldquo;Write me a follow-up email.&rdquo; &ldquo;Summarise this contract.&rdquo; &ldquo;Draft a job advert.&rdquo;</p>
<p>There is nothing wrong with any of these. They save minutes, and minutes add up. But look at what they have in common. In every case a person opens a tool, types a request, reads the answer, edits it and does something with it. The person is still the engine. The work still happens at the speed of one human&rsquo;s attention, and it stops when they go on holiday.</p>
<p>That is AI as a slightly better keyboard. It makes your existing process a bit faster without changing its shape. If you run a business, the shape is the problem.</p>
<h2 id="the-question-worth-asking">The question worth asking</h2>
<p>The question I would rather you asked is this: which of our processes should not involve a human at all?</p>
<p>Not &ldquo;how can AI help my team with their work?&rdquo; That framing assumes every task deserves a person and just needs a bit of help. Most businesses are full of tasks that do not deserve a person. They got one because, at the time, a person was the only option.</p>
<p>Think about what a human is genuinely for in a business. Judgement. Relationships. Noticing that something is off. Deciding what to do when the rules run out. Those things are worth a salary. Re-keying numbers from one system into another is not; nor is reading forty near-identical enquiries to work out which ones deserve a quote.</p>
<p>The real value of AI, used alongside ordinary software, is that it lets you take whole processes off people&rsquo;s desks rather than shaving minutes off each step. That only happens if you go looking for processes instead of prompts.</p>
<h2 id="start-from-the-outcome-not-the-tool">Start from the outcome, not the tool</h2>
<p>Here is how I reframe it in practice. It is deliberately unglamorous.</p>
<h3 id="find-the-friday-spreadsheet">Find the Friday spreadsheet</h3>
<p>Every business has one. It is the report somebody compiles every Friday afternoon by copying figures out of three places into a fourth. It is the quote that takes three days because it queues behind the one person who knows how to price it. It is the invoice chase, the timesheet reconciliation, the supplier order that starts as a photo of a whiteboard.</p>
<p>You are looking for work with three properties. It has the same shape every time. The information it needs already exists somewhere, usually in an email, a PDF or another spreadsheet. And it spends most of its life waiting for a person rather than being worked on.</p>
<p>Do not start with &ldquo;what could AI do here?&rdquo; Start with &ldquo;what do we do that nobody would miss doing?&rdquo; Ask your team. They know exactly which jobs they resent, and resentment is a surprisingly good signal.</p>
<h3 id="map-the-inputs-and-outputs">Map the inputs and outputs</h3>
<p>Take one candidate and write it down, in plain words, as it happens today.</p>
<p>Where does the information come from, and in what form? An email with a PDF attached. A phone call scribbled on a pad. What comes out the other end, and who consumes it? A quote as a PDF. A row in a spreadsheet. What does &ldquo;done&rdquo; look like, and how would you know if it had gone wrong?</p>
<p>Then, crucially, list the exceptions. The enquiry with no measurements. The customer on stop. The supplier price that has changed since the list was last updated. Exceptions are where the humans currently earn their keep, and they tell you precisely where a human should stay.</p>
<p>Most people skip this step because it feels like admin. It is the whole job. Once the process is on paper, the technology decisions become almost obvious.</p>
<h3 id="decide-where-a-model-belongs-and-where-plain-software-belongs">Decide where a model belongs and where plain software belongs</h3>
<p>This is the part that gets muddled, because &ldquo;AI&rdquo; has become shorthand for all software. It is not, and the distinction matters for cost, reliability and how far you can trust the result.</p>
<p>Plain software is deterministic. Given the same input it produces the same output every time. It is cheap to run, easy to test, and it does arithmetic without ever being confidently wrong. If the input is already structured and you can write the rule down, that is what you want. Pricing a job from a rate card. Moving a row from one system to another. Generating a PDF from a template. None of that needs a language model, and using one for it makes the process slower, dearer and less predictable.</p>
<p>A language model earns its place at the messy edges. When the input is free text, a scanned document, a photo or a voice note. When the task is to read something written by a human and work out what they meant. When the output needs to be written in sentences rather than filled into fields. That is the part plain software has never been able to do.</p>
<p>So the shape of almost every good automation is a pipeline. A model at the front, turning messy human input into structured data. Plain software in the middle, applying the rules and doing the sums. Plain software at the back, producing the document or the message. And a person at the exceptions, looking only at the cases where judgement is needed.</p>
<p>I used the same split when I compiled <a href="/grin-a-brief-story.html">Grin: A Brief Story</a>, a history of a cryptocurrency assembled from forum archives spanning 2018 to 2025 (<a href="/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/">I wrote up how</a>). Pulling the posts out through the forum&rsquo;s API and scoring the topics was ordinary scripting. Reading the ones that scored well and drafting chapters was where the model did work no script could. And the judgement about what the score had missed came from me, and then from the people who had lived through it once the draft was published.</p>
<h2 id="a-worked-example">A worked example</h2>
<p>Let me make this concrete with an imaginary firm. None of the details are real; the pattern is.</p>
<p>Imagine a twelve-person joinery business in Kent that makes fitted wardrobes and kitchens. Enquiries arrive by email: a few paragraphs of description, some rough measurements and a handful of phone photos. The owner reads each one, works out what is being asked for, checks sheet material prices in a supplier spreadsheet, applies labour rates that mostly live in his head, and types up a quote in Word. Because he also runs the workshop, a quote takes about three days, and a fair number of customers have gone elsewhere by then.</p>
<p>Map it. The inputs are an email (free text and photos), a supplier price list (a spreadsheet), the firm&rsquo;s labour rates (undocumented, so the first job is to write them down) and a folder of past quotes. The outputs are a PDF quote, a reply email and a new row in the jobs spreadsheet. The exceptions are enquiries with missing measurements, unusual materials, and anything structural that needs a site visit.</p>
<p>Now decide. Reading the email and photos and turning them into a structured job description, with rooms, dimensions, materials, finish and deadline, is model work; nothing else can do it. Pricing that structured job against the price list and the labour rates is arithmetic, so it is plain software, and it will be right every time. Producing the PDF and the covering email is templating, plain software again.</p>
<p>Spotting that measurements are missing is a simple check, and drafting the polite email that asks for them is a small model task. The one place a person stays is at the end, reviewing the priced quote for a minute before it goes out. Is this a job we want? Is the margin right? That minute of judgement is what the owner is actually for.</p>
<p>In our imaginary firm, a quote is ready for review within the hour instead of three days, and the owner&rsquo;s involvement drops to a few minutes per enquiry. Nobody asked a chatbot to write anything. The process changed shape.</p>
<h2 id="where-it-goes-wrong">Where it goes wrong</h2>
<p>Three mistakes come up again and again.</p>
<p>Asking the model to do the sums. Language models are not calculators, and using them as one is how you end up with a confident, plausible, wrong quote. Do the maths in code and let the model do the reading.</p>
<p>Automating something nobody has written down. If the process only exists in one person&rsquo;s head, the first deliverable is a description of it, not software.</p>
<p>Removing the human from the judgement step first. It is tempting to start with the interesting bit, the decision. Do the opposite. Take away the re-keying and the reading and leave the person the decision, at least to begin with. Trust in a system is earned by watching it get the boring parts right.</p>
<h2 id="what-to-bring">What to bring</h2>
<p>The three steps above are the whole conversation, and none of them need a laptop open. Come with a process rather than a tool. Not &ldquo;we are thinking about AI&rdquo;, but &ldquo;every Friday somebody spends two hours copying figures out of three systems into a fourth, and here is how they do it, step by step, including the bit where they have to ring someone&rdquo;.</p>
<p>Twenty minutes of that is enough to get somewhere useful. What you want at the end is a short list of candidate processes, a rough view of which parts are plain software and which genuinely need a model, and a sense of which one to do first. The first one is almost never the most exciting. It is the one with the clearest inputs and outputs and the most people quietly furious about it. That is the one that pays for the next.</p>
<p>If you run a UK business and you recognise your own Friday spreadsheet in any of this, you can book a free <a href="https://calendly.com/w4ynegeorge/20-minute-strategy-session">20-minute strategy session</a> with Frontier Consulting: no obligation and no sales pitch. If you would rather start smaller, the free <a href="https://discovery.frontierconsulting.ai/">discovery test</a> on the Frontier Consulting site is three questions and takes about two minutes. Either way, bring the process, not the prompt.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/youre-asking-ai-the-wrong-questions/">https://www.waynegeorge.uk/writing/youre-asking-ai-the-wrong-questions/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>From control rooms to AI: what a decade of AV engineering taught me about software that cannot fail</title>
      <link>https://www.waynegeorge.uk/writing/from-control-rooms-to-ai/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/from-control-rooms-to-ai/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>Ten years building boardroom control systems for banks and tech firms taught me how software that cannot fail gets built. Six lessons I now apply to AI.</description>
      <content:encoded><![CDATA[<p>Picture a boardroom on the fortieth floor. A dozen executives around the table, one more dialling in from another continent, a presentation that took weeks to prepare, and a screen that has just gone black. Nobody in that room cares how elegant the code behind the wall panel is. They care that it worked this morning and it does not work now. I have spent more than a decade building software for rooms like that, and it shaped how I think about every system I build today, including the AI systems I now design for businesses through Frontier Consulting.</p>
<h2 id="where-i-started">Where I started</h2>
<p>I&rsquo;m Wayne George, <a href="/about/">a software engineer in London</a>. I began my career at Row Seven, a company in the AV software industry, which merged with Lucid Partnership in 2016. I have been a software engineer at Lucid since April 2016, building bespoke control systems for corporate clients and working on Blueprint, the company&rsquo;s control software platform. I also lead the QA team, which is where much of what follows was learnt.</p>
<p>Since January 2024 I have also run my own company, Frontier Consulting, doing custom software and AI work for UK businesses, and I publish iOS apps under my own name. The <a href="/work/">things I have built</a> come out of the same habits, whatever the size of the room.</p>
<p>If you have never worked in AV, the short version is this. Modern meeting rooms, auditoriums and event spaces are full of equipment: displays, cameras, microphones, video conferencing codecs, audio processors, lighting, blinds, room booking panels. Somebody has to write the software that makes all of it behave as one system, so that a person walks in, taps &ldquo;Start meeting&rdquo; on a touch panel, and everything simply happens. For more than ten years, that somebody has been me.</p>
<p>The tools of that trade are specialised. Crestron processors are programmed in SIMPL and its extensions: <a href="https://www.crestron.com/Products/Control-Hardware-Software/Software/Control-System-Software/SW-SIMPL-PLUS">SIMPL+</a>, which will feel familiar to anyone who knows C, and <a href="https://www.crestron.com/Products/Catalog/Control-and-Management/Software/Programming-Commissioning/SW-SIMPL-SHARP-PRO">SIMPL#</a>, which bridges the processor to C# itself, because Crestron builds its control systems on the Microsoft .NET framework. Q-SYS audio and control platforms are scripted in <a href="https://help.qsys.com/Content/Control_Scripting/Using_Lua_in_Q-Sys/01_Using_Lua_in_Q-Sys_Overview.htm">Lua</a>. I hold Crestron&rsquo;s Certified Programmer (Masters) qualification from 2017, a Q-SYS advanced Lua scripting certification, and a Microsoft Certified Professional qualification in C# programming.</p>
<p>The clients I have built control systems for at Lucid include Google, Apple, UBS, JPMorgan Chase and Morgan Stanley. I will not go into specifics about any of them; that is not how this industry works. The point is what those environments demand.</p>
<h2 id="lesson-one-the-room-is-unforgiving">Lesson one: the room is unforgiving</h2>
<p>Software in most contexts gets a second chance. A web page can show a spinner. A mobile app can retry quietly in the background. A boardroom cannot. When the meeting starts at nine, the system either works at nine or it has failed, and the failure is public, immediate and expensive. There is no &ldquo;refresh&rdquo;. There is a room full of senior people looking at a facilities manager who is looking at you.</p>
<p>That shaped a habit I have never lost: I assume the worst moment is the one that will happen. The network will drop mid-call. A display will be switched off at the wall. Someone will press three buttons in an order nobody anticipated. If the system cannot survive that, it is not finished.</p>
<p>AI systems for businesses are the same, except that the failure is quieter and therefore more dangerous. A language model that invents a figure in a customer email, or confidently approves something it should have flagged, does not go black. It carries on. The people relying on it may not notice for weeks. So the discipline is the same: assume the worst input will arrive, and build for it before it does.</p>
<h2 id="lesson-two-deterministic-behaviour-is-the-whole-product">Lesson two: deterministic behaviour is the whole product</h2>
<p>The most valuable property a control system can have is that pressing the same button produces the same result, every time, in every room. Not most of the time. Every time. Most of the engineering effort in a serious control system goes into exactly that: no way to drive the system into a state that should not exist, sequences that always complete or roll back cleanly, and interfaces that report what the equipment is actually doing rather than what we hope it is doing.</p>
<p>Large language models are, by design, not deterministic. The same prompt can produce a different answer on a different day. That is fine for brainstorming and a real problem for a business process. So the way I build AI systems now looks a lot like the way I build control systems: a deterministic shell around a probabilistic core.</p>
<p>The model does the part only a model can do, such as reading an unstructured document or drafting a reply. Ordinary, testable code does everything else. Validation, business rules, permissions, and anything that touches money or a customer record live in plain code, where they behave the same way every time. In AI circles these are called guardrails. To me they are simply the control layer, and the model is one more device on the network that cannot be fully trusted to report its own state.</p>
<h2 id="lesson-three-test-as-if-the-room-is-full">Lesson three: test as if the room is full</h2>
<p>Leading QA in AV has taught me that testing is not a phase; it is a protocol. Commissioning a room properly means exercising every function against a written plan: every source to every display, every failure path, power loss and recovery, what happens when a device is unplugged mid-sequence. You do not sign off because it worked when you tried it. You sign off because a documented set of checks passed and somebody put their name to it.</p>
<p>For AI systems the equivalent is an evaluation suite: a fixed set of realistic inputs, including the awkward ones, each with an expected outcome, run every time the prompt, the model or the surrounding code changes. Model providers update their models. A system that passed in March can drift by June without anyone touching it. If you cannot re-run your checks in an afternoon, you do not really know what you have shipped.</p>
<h2 id="lesson-four-fail-gracefully-and-out-loud">Lesson four: fail gracefully, and out loud</h2>
<p>When a control system loses contact with a device, the wrong response is to pretend nothing happened, and the next-worst is to lock up entirely. The right response is to degrade: keep the parts that still work working, tell the user clearly what has failed, and give them a way forward, even if that way forward is &ldquo;call this number&rdquo;. A blank screen with no explanation is the worst outcome, because it leaves people guessing.</p>
<p>I apply the same rule to AI. Every step that calls a model needs a defined fallback. If the model is slow, unavailable, or returns something that fails validation, what happens next? Sometimes the answer is to retry with a stricter prompt. Sometimes it is to fall back to a simpler, rules-based path. Very often it is to stop and hand the item to a person, with the context they need to finish the job in seconds rather than minutes.</p>
<p>Keeping a human in the loop is not an admission of failure. It is the same instinct as putting a physical help button on a touch panel. The system should know the limits of its own competence and act on them.</p>
<h2 id="lesson-five-if-it-is-not-written-down-it-does-not-exist">Lesson five: if it is not written down, it does not exist</h2>
<p>A control system can run for years. The person who maintains it in year four is rarely the person who wrote it. In AV, documentation is not a nicety; it is how a room gets fixed at seven in the morning by somebody who has never seen it before. Drawings, address schedules, the reasoning behind odd decisions, the exact order of a start-up routine: all of it needs to live somewhere other than one engineer&rsquo;s head.</p>
<p>AI systems have an extra documentation problem. Much of the behaviour lives in prompts, which are easy to edit and easy to lose. I treat prompts as source code: versioned, reviewed, and tied to the tests that prove they work.</p>
<p>I also insist on observability. Every model call wants a record of its input, output, latency and cost, so that when someone asks &ldquo;why did the system do that?&rdquo; there is an answer. In a control room the equivalent is the device log that tells you the codec dropped at three minutes past nine. In AI it is the trace that tells you which document the model was actually looking at when it produced the wrong figure. That need only grows when several models are working at once, which is a subject in its own right and one I have <a href="/writing/mission-control-running-several-ai-agents-at-once/">written about separately</a>.</p>
<h2 id="lesson-six-the-touch-of-a-button-is-a-promise-you-have-to-keep">Lesson six: &ldquo;the touch of a button&rdquo; is a promise you have to keep</h2>
<p>The phrase every AV brochure uses is &ldquo;at the touch of a button&rdquo;. It is true, and it hides an enormous amount of work. Behind one button on a panel might sit a dozen devices from a dozen manufacturers, a handful of edge cases nobody documented, and a room design that changed twice during the build. The user experiences none of that, which is exactly the point. Simplicity on the surface is bought with complexity underneath, and somebody has to own the complexity.</p>
<p>AI has its own version: &ldquo;just ask it&rdquo;. Behind a genuinely useful business assistant sits retrieval from the right documents, permissions so that the model only sees what that user is allowed to see, integration with the systems that hold the real data, and the guardrails, fallbacks and logging described above. Anyone who tells you the model is the hard part has not shipped one. The model is the display. The integration is the control system.</p>
<h2 id="what-this-means-if-you-are-buying-an-ai-system">What this means if you are buying an AI system</h2>
<p>If you are weighing up AI for your business, here is the practical version of everything above. Ask the supplier what happens when the model is wrong. Ask how the system is tested when the model changes. Ask what you will be able to see when something goes wrong, and who gets told. Ask where a person can step in. If the answers are vague, you are being sold a demo, not a product.</p>
<p>That is the standard I hold myself to at <a href="https://frontierconsulting.ai/">Frontier Consulting</a>, and it is the standard I learnt in rooms where there was no hiding from a failure. The tools have broadened: alongside SIMPL+ and Lua I now work in Swift, TypeScript and Python, and the devices include models and APIs. The job has not changed. Make it work every time, make it fail well when it cannot, and make sure somebody can understand it later.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/from-control-rooms-to-ai/">https://www.waynegeorge.uk/writing/from-control-rooms-to-ai/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Building an iOS app with no accounts and no data collection: lessons from Mood Share</title>
      <link>https://www.waynegeorge.uk/writing/ios-app-with-no-accounts-and-no-data-collection/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/ios-app-with-no-accounts-and-no-data-collection/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>Why Mood Share keeps every check-in on the phone with SwiftData, how sharing works with no server behind it, and what that promise costs in return.</description>
      <content:encoded><![CDATA[<p>Mood Share is a small iOS app for telling the people close to you how you are feeling before you walk through the door, and for keeping a private record of your moods over time. It has no sign-up screen, no backend, no usage analytics and no third-party SDKs, and its App Store privacy section is one sentence long: &ldquo;The developer does not collect any data from this app.&rdquo; This article is about the decisions behind that sentence, the trade-offs they forced, and why I think keeping everything on the device should be the default for any app that handles personal data.</p>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. By day I build control systems, and through <a href="https://frontierconsulting.ai/">Frontier Consulting</a> I build custom software and AI systems for UK businesses. Mood Share is one of the <a href="/work/">two apps I publish</a> on the App Store; it went up in May 2024, it is free, and its source is <a href="https://github.com/waynegeorge/moodshare">public on GitHub</a>, so nothing here has to be taken on trust. Public to read, that is: there is no licence file in the repository, so it is source available rather than open source.</p>
<h2 id="what-the-app-actually-does">What the app actually does</h2>
<p>A check-in is a card, and filling one in takes three screens. The first is the score: a wheel from one to ten, each number paired with a face. The second is headed &ldquo;Select words&rdquo; and offers a list of twenty-eight, running from Happy, Hopeful and Calm through to Anxious, Lonely and Overwhelmed; you tap as many as fit. The third asks for the &ldquo;Reason for your score&rdquo;, in your own words. The finished card shows the score, the words and the reason, and the card is what you share. Cards collect on the Home tab, are charted over the past 7 or 30 days under Analytics, and are kept in an Archive you can scroll back through. A daily reminder nudges you if you have not logged anything.</p>
<p>That is the whole feature set. The app has two jobs: letting a partner or a family member know your mood before you get home, and tracking patterns you might want to reflect on or take to a therapist.</p>
<h2 id="why-on-device-only">Why on-device only</h2>
<p>Start with the data. The app records how a person feels, every day, in their own words. That is about as personal as data gets, and the honest question is not &ldquo;how do I protect this on my server?&rdquo; but &ldquo;why is it on my server at all?&rdquo;</p>
<p>I could not find a reason. Neither of the app&rsquo;s jobs needs a copy of the data anywhere except the phone, and once I accepted that, a great deal of work simply disappeared: no user database, no password reset flow, no data subject access requests, no breach that could ever include Mood Share, no server bill, and no privacy policy that needs a lawyer. The policy is a few lines saying the app collects no personal data, because it does not.</p>
<p>Apple&rsquo;s rules push the same way. Guideline 5.1.1 of the App Store Review Guidelines says: &ldquo;If your app doesn&rsquo;t include significant account-based features, let people use it without a login.&rdquo; Most apps treat that as a hurdle to argue past. I treated it as the design.</p>
<p>An account is also a promise: that data will follow someone to a new phone, survive a reinstall and be recoverable when they forget a password. Each of those is a system you have to build and then operate for years. No account, no promise.</p>
<h2 id="swiftdata-instead-of-a-backend">SwiftData instead of a backend</h2>
<p>The app is written in SwiftUI with <a href="https://developer.apple.com/documentation/swiftdata">SwiftData</a> for storage, which is why it requires iOS 17 or later. SwiftData sits on top of Core Data&rsquo;s persistence and lets you declare your model layer with macros, which removes most of the boilerplate that used to make local storage feel like more effort than calling a REST API.</p>
<p>The entire schema for Mood Share is one class. The initialiser, which only supplies defaults, is omitted here:</p>
<pre><code class="language-swift">@Model
class Card: Identifiable {
    var date: Date
    var complete: Bool
    var score: Int
    var words: [String]
    var positives: String
    var liked: String
    var toShare: String
}
</code></pre>
<p>The reason you type on the third screen lands in <code>toShare</code>. Two of the other fields, <code>positives</code> and <code>liked</code>, appear only in the model and in the sample data used for previews; no screen in the app reads them. An unused column in a local store costs nothing, so they stay.</p>
<p>The app attaches a container at the root with <code>.modelContainer(for: Card.self)</code>, views read cards with <code>@Query</code>, and a new check-in is a <code>modelContext.insert(...)</code>. There is no repository layer, no networking code and no cache invalidation: the store is the source of truth, and it lives in the app&rsquo;s own sandboxed container on the phone.</p>
<p>Two things about that store matter. The first is that being on the device buys you encryption you did not have to write. In Apple&rsquo;s own description, &ldquo;every time a file on the data volume is created, Data Protection creates a new 256-bit key (the per-file key) and gives it to the hardware AES Engine, which uses the key to encrypt the file as it&rsquo;s being written to flash storage&rdquo; (<a href="https://support.apple.com/en-gb/guide/security/secf6276da8a/web">Apple Platform Security</a>). The second is that a SwiftData store can be synced through iCloud, but only if you opt in: the framework &ldquo;requires two separate capabilities to perform automatic iCloud sync: the iCloud capability, which lets you configure CloudKit, and the Background Modes capability, which lets your app receive remote notifications from CloudKit&rdquo; (<a href="https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices">Syncing model data across a person&rsquo;s devices</a>). Mood Share adds neither; the project has no entitlements file at all. That was a choice, and I come back to it below.</p>
<p>The reminders follow the same pattern: local notifications scheduled on the device with a calendar trigger (<a href="https://developer.apple.com/documentation/usernotifications/scheduling-a-notification-locally-from-your-app">UserNotifications</a>), so there is no push server and no device token to store. The only other persistent state is two values in UserDefaults: the appearance setting and the date you last logged a mood.</p>
<h2 id="what-sharing-means-without-a-server">What &ldquo;sharing&rdquo; means without a server</h2>
<p>The name sounds as though it needs a network: accounts, a contacts list, and a server that pushes your mood to your partner&rsquo;s phone. That design would have needed everything I had just avoided.</p>
<p>Instead, sharing in Mood Share is an image. When you tap Share, the app takes a snapshot of the card as it appears on screen and hands it to the standard iOS share sheet, <a href="https://developer.apple.com/documentation/uikit/uiactivityviewcontroller">UIActivityViewController</a>. From there it goes wherever you already talk to that person: Messages, Mail, or any messaging app you have installed. The social network destinations are excluded from the sheet, because a mood card is meant for one person, not a feed. The recipient does not need the app or an account, and nothing passes through anything I run. Showing a therapist how a month has gone works the same way: you show them the phone, or you send them the cards.</p>
<p>Rendering the card is the least glamorous code in the project: a small <code>UIView</code> extension that opens an image context and calls UIKit&rsquo;s <a href="https://developer.apple.com/documentation/uikit/uiview/drawhierarchy(in:afterscreenupdates:)"><code>drawHierarchy(in:afterScreenUpdates:)</code></a> to snapshot the view into it. SwiftUI&rsquo;s <a href="https://developer.apple.com/documentation/swiftui/imagerenderer">ImageRenderer</a> has been in the framework since iOS 16, so it was there from the first line of an app that requires iOS 17; it would have done the same job without dropping into UIKit, and I reached for the UIKit route out of habit. The lesson is that &ldquo;sharing&rdquo; is very often just &ldquo;export in a format the other person can already open&rdquo;; you do not need a protocol when a picture will do. The one bug fix I shipped after launch was to this flow. Version 1.0.2 went out four days after release, and its release note is the whole story: &ldquo;Bug fix: Initial share attempt failure now fixed.&rdquo;</p>
<h2 id="the-app-store-privacy-label">The App Store privacy label</h2>
<p>Every app on the App Store carries a privacy section, and Mood Share&rsquo;s is the shortest kind there is: &ldquo;The developer does not collect any data from this app.&rdquo; Both of the apps I publish carry that line, <a href="/writing/why-i-built-nvr-companion/">NVR Companion</a> as well. It is worth being clear about what it does and does not say.</p>
<p>What it says turns on Apple&rsquo;s definition of &ldquo;collect&rdquo;, which &ldquo;refers to transmitting data off the device in a way that allows you and/or your third-party partners to access it for a period longer than what is necessary to service the transmitted request in real time&rdquo;; by the same definition, &ldquo;data that is processed only on device is not &lsquo;collected&rsquo; and does not need to be disclosed in your answers&rdquo; (<a href="https://developer.apple.com/app-store/app-privacy-details/">App privacy details</a>). So an app can handle deeply personal data and still truthfully carry that line, as long as the data never leaves the phone. That is where Mood Share stays.</p>
<p>What it does not say is that anyone has checked. The information is self-reported, and Apple says so directly: it &ldquo;is self-reported by the developer&rdquo; (<a href="https://support.apple.com/en-gb/102399">About privacy information on the App Store</a>). That is one reason the source is public. If you want to know whether the claim is honest, you can read the code and search it for a networking call: every import across the app&rsquo;s Swift files is an Apple framework, and the Xcode project does not declare a single package dependency. For a mood app, that is a better promise than any policy.</p>
<h2 id="the-trade-offs">The trade-offs</h2>
<p>None of this is free, and the costs deserve stating plainly.</p>
<p><strong>There is no sync.</strong> Your cards live on one phone. If you get a new one and do not restore from a backup, the app starts empty.</p>
<p><strong>There is no recovery I can offer.</strong> Delete the app and the cards go with it. Lose the phone and the only route back is your own device backup: &ldquo;iCloud Backup includes app data for the apps you&rsquo;ve downloaded on your device&rdquo; (<a href="https://support.apple.com/en-gb/108770">What does iCloud back up?</a>), so a restore brings the store back with it. That is Apple&rsquo;s mechanism rather than mine, and it depends on backups being switched on. Nobody can email me for their history, because I have never had it.</p>
<p><strong>There is no telemetry.</strong> Nothing in the app reports back, so I only find out what is wrong when someone tells me at hello@waynegeorge.uk or leaves an App Store review. That slows improvement down, and I accept it.</p>

<p><strong>Sharing is one-way and manual.</strong> Nobody learns you are having a bad day unless you choose to tell them. Some people would prefer that to be automatic; I think manual is healthier, but it is a real difference.</p>
<p>Most of these could be solved with iCloud sync, which SwiftData makes fairly painless and which would keep the data in the user&rsquo;s own Apple account rather than on a server of mine. I may still add it. But it would have to be opt-in, it would turn a one-sentence privacy answer into something that needs explaining, and it would introduce the first class of bug I cannot reproduce on my own phone. For version one, the simpler promise was worth more than the feature.</p>
<h2 id="why-this-should-be-the-default">Why this should be the default</h2>
<p>I am not arguing that every app should work like Mood Share. Plenty are genuinely about collaboration, or about data that only makes sense on a server. I am arguing that for apps whose data is about one person, &ldquo;on the device, no account, nothing collected&rdquo; should be where you start, and the burden of proof should sit with every feature that wants to move away from it.</p>
<p>Three reasons. First, the platform now makes it the easy path: SwiftData for storage, Data Protection for encryption, local notifications for reminders, the share sheet for getting things to other people. The convenience used to live on the backend; for personal data it no longer does.</p>
<p>Second, you cannot lose what you do not hold. Every breach notice you have ever received was for data that somebody decided to keep. Not keeping it is the only mitigation that works every time.</p>
<p>Third, trust. A mood tracker asks people for the most honest thing they have. If the truthful answer to &ldquo;where does this go?&rdquo; is &ldquo;nowhere&rdquo;, they will tell it the truth, which is what makes the app worth using.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/ios-app-with-no-accounts-and-no-data-collection/">https://www.waynegeorge.uk/writing/ios-app-with-no-accounts-and-no-data-collection/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>How I compiled a book from eight years of forum posts with Claude Code</title>
      <link>https://www.waynegeorge.uk/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>How I turned 2,930 Grin forum topics into a short history with the Discourse API, Claude Code and Opus 4.5, and what the community found missing.</description>
      <content:encoded><![CDATA[<p>Grin has never had a company behind it, a marketing department or an official historian. Almost everything that happened to the project between 2018 and 2025 happened in public on its forum: the emission debate, the scheduled hard forks, the founder&rsquo;s disappearance, the day somebody tried to create coins out of nothing. That is a wonderful record and a terrible way to read one. So in January 2026 I compiled the forum into a short book, <em>Grin: A Brief Story</em>, using the Discourse API and Claude Code. This is how I did it, where the judgement had to come from, and what the community caught that the model missed.</p>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. I wrote an open-source Grin wallet for iOS, so this was a project I cared about rather than a demo, and you can read the result at <a href="/grin-a-brief-story.html">/grin-a-brief-story.html</a>. The <a href="https://github.com/waynegeorge/grin-book">grin-book repository on GitHub</a> holds the finished book as Markdown, EPUB and HTML, the ten chapters beside the raw source files they were drafted from, the two scoring files, the attribution notice and the script that builds the EPUB. It does not hold the fetching and scoring code itself, so what follows is a description of the method rather than a tour of the repository.</p>
<h2 id="why-a-book">Why a book</h2>
<p><a href="https://grin.mw">Grin</a> is the first implementation of the Mimblewimble protocol (<a href="/writing/grin-and-mimblewimble-in-plain-english/">I have written a plain-English explainer</a> if the name means nothing to you). The whitepaper was <a href="https://docs.grin.mw/about-grin/story/">shared in the #bitcoin-wizards IRC channel on 1 August 2016</a> by a pseudonymous user; the genesis block was mined on 15 January 2019; and Ignotus Peverell, the developer who started the project, &ldquo;disappeared and has yet to return&rdquo;. The community has run it ever since.</p>
<p>Projects like that do not write their own histories. When contributors drift away the context goes with them, leaving thousands of threads that only make sense if you were there. I wanted one narrative someone could read on a Kindle in an evening.</p>
<p>My first attempt was a retrieval system: index every post, then ask it questions. It worked, but it only ever answered what I thought to ask. A book forces a decision about what matters, and that decision turned out to be the hard part.</p>
<h2 id="getting-the-posts-out-of-discourse">Getting the posts out of Discourse</h2>
<p>The forum runs on Discourse, which <a href="https://meta.discourse.org/t/discourse-rest-api-documentation/22706">describes itself plainly</a>: &ldquo;Discourse is backed by a complete JSON api. Anything you can do on the site you can also do using the JSON api.&rdquo; Every topic page has a JSON twin — <a href="https://meta.discourse.org/t/how-to-reverse-engineer-the-discourse-api/20576">append <code>.json</code> to its URL</a> and the posts come back as structured data, with no key needed for public content.</p>
<p>With Claude Code I wrote a fetcher that walked the topic listings year by year, pulled every post for every topic and saved one JSON file per topic in a folder per year. That gave me 2,930 topics from 2018 to 2025 and 33,658 posts between them. The launch year, 2019, was by far the loudest, with 1,064 topics on its own. Those fetched files are not in the repository, but the scoring output is, and it still records the per-year path each topic was saved to.</p>
<h2 id="scoring-topics-for-significance">Scoring topics for significance</h2>
<p>Thirty-three thousand posts will not fit in any model&rsquo;s working memory, and they should not: most are price chatter, mining questions and broken wallets. I needed a way to find the threads where something actually happened.</p>
<p>The scoring pass gives each topic a single number, and the file it writes records what went into it: views, replies and likes; which of the project&rsquo;s core contributors posted; and keyword matches across nine themes — wallets, privacy, governance, proof-of-work, launch, emission, the protocol itself, hard forks and conferences. The full output is <code>all_topic_scores.json</code>. The 150 topics that made the cut are in <code>selected_topics.json</code>, spread across ten chapters running from &ldquo;MimbleWimble Origins&rdquo; to &ldquo;Legacy &amp; Future&rdquo;.</p>
<p>It is worth being honest about how crude this is. The highest-scoring topic in the whole forum is a 1,061-post market shitposting thread, which matched none of the nine themes and got there on engagement alone. Engagement measures heat, not importance, and no formula was going to know that a quiet two-post announcement mattered more than a hundred-post argument. That is a judgement, and judgement is exactly the thing you cannot outsource.</p>
<h2 id="drafting-with-claude-code">Drafting with Claude Code</h2>
<p>For each of the ten chapters the pipeline produced a raw file: the selected topics in date order, each under a header giving the forum link and its score, with every post reproduced under its author and date. The raw material for the governance chapter runs to about 300 KB; the finished chapter is 6 KB.</p>
<p><a href="https://code.claude.com/docs/en/overview">Claude Code</a> is Anthropic&rsquo;s agentic coding tool, which by its own documentation &ldquo;reads your codebase, edits files, runs commands, and integrates with your development tools&rdquo;. I used it with <a href="https://www.anthropic.com/news/claude-opus-4-5">Claude Opus 4.5</a>, released two months earlier. Every chapter had the same job to do: turn the raw file into narrative non-fiction, quote the forum verbatim where the original words beat a paraphrase, and credit every quote to the username that wrote it. The raw files sit beside the final chapters in the repository (<code>01_raw.md</code> next to <code>01_final.md</code>, and so on), so anyone can check a claim against its source.</p>
<p>I also asked for the book to be concise, and that is where the trouble started. As I put it on the forum afterwards: &ldquo;I did ask for it to make it concise and it clearly didn&rsquo;t make the best choices in terms of what to leave out.&rdquo; My first pass had no mention of the two anonymous 50 BTC coinbase donations to the project, which anyone around at the time would remember. I put them back before publishing. I did not catch everything, as you will see.</p>
<h2 id="building-the-epub">Building the EPUB</h2>
<p>The book had to work on an e-reader, so <code>create_epub.py</code> stitches the ten final chapters into an EPUB with the Python <code>ebooklib</code> library. It converts the Markdown to HTML with a deliberately small set of regular expressions, adds an introduction page and the attribution notice, applies some Kindle-friendly CSS and writes out the file. I wrote it with Claude Code. It is 247 lines of boring, well-specified plumbing: the kind of work an AI assistant is unambiguously good at, and the kind I no longer want to type myself.</p>
<h2 id="licensing-the-forum-decided-for-me">Licensing: the forum decided for me</h2>
<p>Before publishing, I read the forum&rsquo;s terms. The <a href="https://forum.grin.mw/tos">Grin forum&rsquo;s Terms of Service</a> state that &ldquo;User contributions are licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.&rdquo; That licence carries through to anything built on the posts, so the book is <a href="https://creativecommons.org/licenses/by-nc-sa/3.0/">CC BY-NC-SA 3.0</a> too. In plain terms: anyone may share and adapt it; they must give credit; they may not use it commercially; and anything built from it must carry the same licence.</p>
<p>That suits the project. The book cannot be sold, by me or by anyone else, and the attribution notice on its last page sets out how quotes are credited — beside the excerpt, naming the author&rsquo;s username, the source thread and a link to it, and at section, chapter or appendix level where material has been summarised. The original words still belong to the forum&rsquo;s contributors.</p>
<h2 id="what-the-community-caught">What the community caught</h2>
<p>I posted the book to the forum on 27 January 2026 and invited forks and pull requests. The <a href="https://forum.grin.mw/t/grin-a-brief-story/12371">thread</a> turned into the best review process I could have asked for.</p>
<p>John Tromp, who designed the Cuckoo Cycle proof-of-work that Grin is built on, replied within two hours, generous about the writing and precise about the gaps. Grin&rsquo;s ASIC-resistant proof-of-work was modified at <a href="https://docs.grin.mw/about-grin/proof-of-work/">each of the first three six-monthly hard forks</a> to &ldquo;interrupt possible ASIC development for it&rdquo;; the fourth, in January 2021, <a href="https://forum.grin.mw/t/7895">brought no new algorithm</a>. The book, Tromp wrote, &ldquo;leaves out mention of the 3rd member of the cuckaroo family. In between cuckarood and cuckarooz there was room for cuckaroom:-)&rdquo; Cuckaroom was <a href="https://forum.grin.mw/t/next-pow-cuckaroom-unveiled-at-grincon1/6605">unveiled at GrinCon1 in November 2019</a> for the second hard fork, and as he put it at the time, its graph &ldquo;is no longer bipartite, with the &lsquo;M&rsquo; standing for &lsquo;Monopartite&rsquo;&rdquo;.</p>
<p>He also pointed out, fairly, that the book had cast him as the proof-of-work person when he had &ldquo;co-architected and worked on several parts of the consensus code besides cuckoo&rdquo;: the emission, the Merkle Mountain Ranges the chain stores its data in, difficulty adjustment, the transitions between proof-of-work algorithms and the fee system. &ldquo;I consider myself a core developer as well.&rdquo; The draft had reduced a core developer to his best-known invention, and I had not noticed.</p>
<p>Two days later another member said the book was missing the inflation bug, &ldquo;since that also tells something about how the project is run.&rdquo; They were right. On 18 March 2021 an attacker got a malicious output into block 1,136,081 by exploiting a flaw in the rangeproof verification cache: affected versions would &ldquo;skip verification of a rangeproof for an output commitment if that rangeproof had recently been verified, even if the earlier verification was for a different output commitment&rdquo; (<a href="https://github.com/mimblewimble/grin-security/blob/master/CVEs/CVE-2021-XXXX.md">Grin security disclosure</a>).</p>
<p>Grin++, the independent C++ implementation, had the validation the Rust node lacked and rejected the block; hotfixes removed the caching, and the attack &ldquo;was ultimately mitigated with a longer proof-of-work chain with proper validation&rdquo;. A history of Grin cannot leave out an incident that shows both the risk of hidden amounts and the value of two independent implementations. I added a section on it and pushed the change the same day. The current version covers Cuckaroom properly too.</p>
<p>One more thing came out of the thread. A reader could not reach GitHub from where they were, so I now keep an HTML version on this site, the copy linked above, updated as the book changes.</p>
<h2 id="what-ai-is-good-at-here-and-what-it-is-not">What AI is good at here, and what it is not</h2>
<p>Having done this once, I would split the work three ways.</p>
<h3 id="the-mechanical-work">The mechanical work</h3>
<p>The model does this better and faster than I would: fetching thousands of topics, structuring them, writing the scoring and EPUB scripts, converting formats. There is no reason for a person to type any of that.</p>
<h3 id="the-reading">The reading</h3>
<p>It does this at a scale a person cannot match. Given all 150 selected topics, 10,842 posts between them, it produced a draft with a consistent voice that quotes accurately from the source. By hand I would have skimmed, and missed more than it did.</p>
<h3 id="the-judgement">The judgement</h3>
<p>It does not do this, and it does not know that it does not. Told to be concise, it cut things it had no way of weighing. It could not see anything that happened away from the forum: GitHub threads, chat rooms, conference corridors. It tends to reduce a person to the one thing they are best known for, which is how the early draft treated John Tromp. Its prose is confident whether or not the record underneath it is. And the significance score it worked from was my design, with my blind spots built into it.</p>
<p>What fixed those problems was not a better prompt. It was the people who lived the history reading the draft and saying what was wrong, and the forum thread did in two days what no amount of re-running the model would have done. If you try this for your own community, publish early, in the open, under a licence that lets people correct it, and treat the first version as a question rather than an answer.</p>
<h2 id="where-to-find-it">Where to find it</h2>
<p>The book is at <a href="/grin-a-brief-story.html">/grin-a-brief-story.html</a>, there is an <a href="/downloads/grin-a-brief-story.epub">EPUB for e-readers</a>, and the Markdown and the working files are in the <a href="https://github.com/waynegeorge/grin-book">repository</a>. It will keep being wrong in places until someone tells me where; pull requests are welcome. If the tooling interests you more than the history, a public data source, a scoring pass, a drafting pass and a person checking the result is the same shape of work I build for clients at <a href="https://frontierconsulting.ai/">Frontier Consulting</a>.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/">https://www.waynegeorge.uk/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Making Tax Digital for the self-employed: what is changing and why I built my own tool</title>
      <link>https://www.waynegeorge.uk/writing/making-tax-digital-for-the-self-employed/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/making-tax-digital-for-the-self-employed/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>What Making Tax Digital for Income Tax means for UK sole traders and landlords: thresholds, quarterly deadlines, penalties, and what HMRC&#x27;s API shows.</description>
      <content:encoded><![CDATA[<p>If you are a sole trader or a landlord in the UK, the way you report your income to HMRC has started to change. Since 6 April 2026 the first group of people has been keeping digital records and sending HMRC an update every quarter, and two more groups follow in 2027 and 2028. I&rsquo;m Wayne George, a software engineer in London, and one of my personal projects is a Making Tax Digital tool, which is a good excuse to read the rules properly. This article explains what they say, what they mean in practice, and what HMRC&rsquo;s developer documentation tells you about how the system is meant to work.</p>
<p>One caution first: I am an engineer, not an accountant. Everything below comes from HMRC&rsquo;s published guidance, with links so you can check it, but it is not tax advice.</p>
<h2 id="what-making-tax-digital-for-income-tax-is">What Making Tax Digital for Income Tax is</h2>
<p>Making Tax Digital for Income Tax (often shortened to MTD ITSA) does not change how much tax you pay. It changes how you keep records and how often you tell HMRC about them. Instead of one Self Assessment return in January, you keep records digitally, send HMRC a summary four times a year through software, and finish with a tax return, also through software.</p>
<p>HMRC&rsquo;s guide <a href="https://www.gov.uk/guidance/use-making-tax-digital-for-income-tax">Use Making Tax Digital for Income Tax</a> covers the four core stages: create digital records, send quarterly updates, adjust your self-employment and property income, and submit your tax return. I&rsquo;ll take each in turn, but first the question most people ask: does this apply to me, and when?</p>
<h2 id="who-is-affected-and-when">Who is affected, and when</h2>
<p>The rollout is phased by &ldquo;qualifying income&rdquo;: your total income from self-employment and property combined, before expenses, taken from the tax return you submitted for the earlier year. PAYE employment income, dividends (including from your own company), the State Pension and private pensions do not count. The details are on the <a href="https://www.gov.uk/guidance/work-out-your-qualifying-income-for-making-tax-digital-for-income-tax">qualifying income page</a>.</p>
<p>The timetable, as set out on the <a href="https://www.gov.uk/guidance/check-if-youre-eligible-for-making-tax-digital-for-income-tax">eligibility page</a>, is:</p>
<ul>
<li>Qualifying income over £50,000 in the 2024/25 tax year: you should have started from 6 April 2026.</li>
<li>Over £30,000 in 2025/26: you start from 6 April 2027.</li>
<li>Over £20,000 in 2026/27: you start from 6 April 2028.</li>
</ul>
<p>So if your gross income from self-employment and property together was over £50,000 in 2024/25, you are in the first cohort and your first quarterly update was due on 7 August 2026. If you have not done anything yet, HMRC has said that from September 2026 it will <a href="https://www.gov.uk/guidance/sign-up-for-making-tax-digital-for-income-tax">start signing up anyone who needs to use the service for 2026/27 and has not signed themselves up</a>. It only uses the information it already holds, so if your circumstances have changed since your last return you will need to correct them.</p>
<p>Some people can be exempt, for example if they are digitally excluded, and there is a process to <a href="https://www.gov.uk/guidance/apply-for-an-exemption-from-making-tax-digital-for-income-tax">apply for an exemption</a>. If you are exempt you still file a Self Assessment return as normal.</p>
<h2 id="the-four-things-you-have-to-do">The four things you have to do</h2>
<h3 id="keep-digital-records">Keep digital records</h3>
<p>Every transaction needs three things in your software: the amount, the date the income was received or the expense incurred, and a category that mirrors the Self Assessment return. There are some sensible simplifications. If you make retail sales you can record daily gross takings rather than every individual sale, and if turnover from a source is under £90,000 you can use simpler categorisation and record only whether each transaction is income or an expense. Full details are on the <a href="https://www.gov.uk/guidance/use-making-tax-digital-for-income-tax/create-digital-records">digital records page</a>.</p>
<p>Spreadsheets still count, as long as data moves into your submission software through digital links (linked cells, CSV import and export, an emailed spreadsheet, an API) rather than by retyping. Once a record has been sent to HMRC in a quarterly update you must not move it by hand. Records have to be kept for at least five years after the 31 January deadline for that tax year.</p>
<h3 id="send-quarterly-updates">Send quarterly updates</h3>
<p>By default the update periods follow the tax year, and each one runs from 6 April rather than from the end of the previous quarter, with these deadlines:</p>
<ul>
<li>6 April to 5 July, due 7 August</li>
<li>6 April to 5 October, due 7 November</li>
<li>6 April to 5 January, due 7 February</li>
<li>6 April to 5 April, due 7 May the following tax year</li>
</ul>
<p>If your accounting period runs from 1 April to 31 March you can use calendar quarters instead (1 April to 30 June, and so on), with the same deadlines. Notice that updates are cumulative, covering the year to date rather than the last three months. That is a good design decision, because a mistake in an earlier quarter is corrected simply by sending the next update with the right totals. HMRC receives only the totals for each income and expense category, not your individual receipts and invoices. The <a href="https://www.gov.uk/guidance/use-making-tax-digital-for-income-tax/send-quarterly-updates">quarterly updates page</a> has the full list.</p>
<h3 id="adjust-and-submit-your-tax-return">Adjust and submit your tax return</h3>
<p>After the fourth update you make any year-end adjustments to your self-employment and property figures, add every other source of income and gains, review HMRC&rsquo;s tax calculation, and submit the return through your software, declaring that it is correct and complete. The deadline is unchanged: <a href="https://www.gov.uk/guidance/use-making-tax-digital-for-income-tax/submit-your-tax-return">31 January following the end of the tax year</a>. Elsewhere you may see this stage called the &ldquo;final declaration&rdquo;; HMRC&rsquo;s current guidance simply calls it submitting your tax return.</p>
<h3 id="use-compatible-software">Use compatible software</h3>
<p>All of this has to go through software that talks to HMRC. HMRC distinguishes between software that creates and stores your records (by linking to a bank account, scanning receipts or manual entry) and &ldquo;bridging&rdquo; software that connects to records you already keep in a spreadsheet. Free products exist for people with simple affairs, though they may cap the number of transactions. The <a href="https://www.gov.uk/guidance/find-software-thats-compatible-with-making-tax-digital-for-income-tax">compatible software page</a> links to HMRC&rsquo;s finder tool, which is the list you should trust.</p>
<h2 id="penalties">Penalties</h2>
<p>There is a soft landing. HMRC&rsquo;s <a href="https://www.gov.uk/guidance/penalties-for-making-tax-digital-for-income-tax">penalties page</a> says there are no penalties for missing a quarterly update deadline in the 2026/27 tax year. From 2027/28, each missed quarterly update or tax return deadline earns a penalty point, and at four points you get a £200 penalty, then £200 for each further missed deadline.</p>
<p>Late payment is treated separately and applies from the start. For 2026/27, tax paid up to 15 days late attracts no penalty; from day 16 it is 3% of what was owed at day 15 (waived in your first year); after 30 days a further 3% of what was owed at day 30 is added, plus an annual rate of 10%, charged daily from day 31 until you pay or for up to two years. For 2027/28 the two percentages rise to 4%.</p>
<h2 id="why-i-built-my-own-tool">Why I built my own tool</h2>
<p>I run a small consultancy, <a href="https://frontierconsulting.ai/">Frontier Consulting</a>, and I write iOS apps in my own time; some of them are on the <a href="/work/">work page</a>. The best way I know to understand a system is to build against its API, and this one is about to touch a great many small businesses. So one of my side projects is a Making Tax Digital app for UK self-employed submissions: income and expense tracking, quarterly HMRC integration, and tax estimates.</p>
<p>I should be blunt about what that is. It is a personal project, still in progress, not a product. HMRC has said it is <a href="https://developer.service.hmrc.gov.uk/api-documentation/docs/api/service/self-employment-business-api/">no longer accepting production credential access requests for new 2026/27 quarterly update products</a>, because the market window for those products has closed, so no new tool can be recognised for this tax year in any case. If you need something for your own return, use the finder tool above.</p>

<h2 id="what-the-developer-documentation-tells-you">What the developer documentation tells you</h2>
<p>The developer documentation is worth knowing about even if you never write a line of code, because it shows how the pieces are meant to fit together, and HMRC&rsquo;s developer hub is unusually good at explaining itself. The <a href="https://developer.service.hmrc.gov.uk/guides/income-tax-mtd-end-to-end-service-guide/">end-to-end service guide</a> walks through the whole process, from signing a user up to submitting their return, and the <a href="https://developer.service.hmrc.gov.uk/api-documentation/docs/api/service/self-employment-business-api/">Self Employment Business API</a> (version 5.0 at the time of writing) carries the quarterly and annual submissions.</p>
<p>Authorisation is standard <a href="https://developer.service.hmrc.gov.uk/api-documentation/docs/authorisation/user-restricted-endpoints">OAuth 2.0 with the authorisation code grant</a>. HMRC&rsquo;s page is admirably terse about the timings: &ldquo;An access token lasts 4 hours&rdquo;, and &ldquo;After 18 months, refresh tokens stop working. At this point, you must go through the authorisation process again.&rdquo; That is worth knowing as a user and not only as a developer. You sign in to HMRC, not to your bookkeeping software, and the permission you give it is not permanent. There is also a sandbox at <code>test-api.service.hmrc.gov.uk</code>, where a <code>Gov-Test-Scenario</code> header makes the service return a chosen outcome, so the awkward paths can be exercised without going anywhere near a real tax record.</p>
<p>Two features of the design shape anything built on top of it. The first is the cumulative model. Because every update covers the year to date, MTD software is not really a submission tool at all; it is a ledger that has to be right at every point in the year, from which a submission falls out almost as a by-product. A tool in this space has to answer three questions at any moment: what has come in, what has gone out and under which category, and what those two imply for the eventual bill. The third is cheap once the first two are accurate, which is why tax estimates are such a common feature, mine included.</p>
<p>The second is the <a href="https://developer.service.hmrc.gov.uk/guides/fraud-prevention/">fraud prevention headers</a>. HMRC is direct about this: &ldquo;You are required by law to submit header data for the VAT (MTD) and Income Tax Self Assessment (MTD) APIs.&rdquo; The headers carry audit data about the device and connection a submission came from, and which ones you must send depends on how your software connects — a desktop application talking straight to HMRC has fourteen of them to supply, covering everything from local IP addresses and MAC addresses to screen sizes and whether multi-factor authentication was used. HMRC runs a whole separate <a href="https://developer.service.hmrc.gov.uk/api-documentation/docs/api/service/txm-fph-validator-api/">Test Fraud Prevention Headers API</a> for checking them, which &ldquo;checks the value and format and gives you feedback on any issues&rdquo;. When a specification comes with its own validation service, that tells you something about how easy it is to get wrong. This is a proper piece of work, not a tick-box exercise.</p>
<p>There is one more thing I keep coming back to, and it is about behaviour rather than code. Whether or not HMRC planned it this way, a system that makes you total up your year four times is also a system that makes you look at your likely bill four times, and I suspect that will change more about how sole traders run their finances than any of the filing mechanics.</p>
<h2 id="a-practical-checklist-for-202627">A practical checklist for 2026/27</h2>
<p>If you are a sole trader in the first cohort, or think you might be, here is what I would do this month.</p>
<ol>
<li>Work out your qualifying income for 2024/25 from the return you submitted: self-employment turnover plus property income, before expenses. Over £50,000 means you are in.</li>
<li><a href="https://www.gov.uk/guidance/sign-up-for-making-tax-digital-for-income-tax">Sign up for Making Tax Digital for Income Tax</a> if you have not already. If HMRC signs you up automatically, check that the business details it holds are still right.</li>
<li>Pick compatible software from HMRC&rsquo;s finder tool. If you already keep a spreadsheet you are happy with, bridging software may be the least disruptive route.</li>
<li>Get your records from 6 April 2026 onwards into it, with amount, date and category for each transaction. If turnover from the source is under £90,000, income-or-expense is enough.</li>
<li>Send the first update now if you missed 7 August. There is no penalty this year, and because updates are cumulative one update covers the year so far.</li>
<li>Put 7 November 2026, 7 February 2027, 7 May 2027 and 31 January 2028 in your calendar.</li>
<li>Set money aside for the tax as you go. Late payment penalties still apply this year: only the first 3% is waived in your first year, and the day-30 penalty and the 10% annual rate build up from there.</li>
<li>If you use an accountant, ask them now how they want to handle the updates. They can sign you up and submit on your behalf.</li>
</ol>
<h2 id="where-to-go-from-here">Where to go from here</h2>
<p>The rules are less frightening than the acronym. Keep digital records, send four cumulative updates, file the return through software, and pay on time.</p>
<p>What the deadline really exposes is how much bookkeeping is still done by hand in small firms, which is a much older problem than MTD; I have written separately about <a href="/writing/ai-automation-playbook-for-uk-small-businesses/">where automation pays off first in a small firm</a>. If you would like to talk about the record-keeping side of it for your own business, the <a href="/about/">about page</a> has ways to get in touch.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/making-tax-digital-for-the-self-employed/">https://www.waynegeorge.uk/writing/making-tax-digital-for-the-self-employed/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Mission Control: running several AI agents at once without losing the plot</title>
      <link>https://www.waynegeorge.uk/writing/mission-control-running-several-ai-agents-at-once/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/mission-control-running-several-ai-agents-at-once/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>Why a chat window stops working once several AI agents are running, the questions a dashboard has to answer, and what to build first if you need one.</description>
      <content:encoded><![CDATA[<p>One AI agent in a chat window is manageable. You ask, it works, you read the answer. The trouble starts at two. Put a coding agent on one project, a second on the documentation for another and a third grinding through a batch of files, and the chat window stops being an interface and becomes a row of tabs, each showing the last screen of something you half remember starting.</p>
<p>Mission Control is the dashboard I built for that. It is a real-time view of multi-agent work with six things on the page: project heat-maps, agent orchestration, service health, a document viewer, interactive to-dos and usage tracking. The server is <a href="https://expressjs.com/">Express</a>, the front end is plain HTML, CSS and JavaScript, and it is a personal tool rather than a product.</p>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. I build custom software and AI systems for UK businesses through <a href="https://frontierconsulting.ai/">Frontier Consulting</a>, and I use agents heavily in my own work; Mission Control sits with my other projects on the <a href="/work/">Work page</a>. What follows is not a tour of the code. It is the problem the tool exists to solve, the questions any dashboard of this kind has to answer, and what I would tell you if you were about to build your own.</p>
<h2 id="why-a-single-chat-window-stops-working">Why a single chat window stops working</h2>
<p>A chat window is designed for one conversation with one participant who waits for you. Run several agents and it fails in three ways.</p>
<p>First, you lose the thread. Each transcript is a linear scroll, so switching between three of them means re-reading the tail of each to work out where it got to. The reading is not the work, and it grows with every agent you add.</p>
<p>Second, you lose track of side effects. An agent that can write files, run commands and make commits is changing things, and in a transcript those changes arrive as a line of prose: &ldquo;I&rsquo;ve updated the config.&rdquo; Which config, in which project, and did something else touch the same file twenty minutes later? The window cannot tell you, because it only knows about itself.</p>
<p>Third, you lose sight of cost. Every exchange is a bill you cannot see while you are running it up, and a long task against a large codebase is a very different bill from a chat about wording.</p>
<p>The interface is the problem, not the agents. So the fix is a different interface.</p>
<h2 id="the-three-questions">The three questions</h2>
<p>The temptation with a dashboard is to show everything, which produces a wall you stop reading by Wednesday. The discipline is to decide what you would want to know if you glanced at the screen for four seconds while making tea. For me that comes down to three questions per agent: what is it doing, what has it touched, and what is it costing me? The six things on the page are there because each answers part of one of those.</p>
<h3 id="what-is-it-doing-agent-orchestration">What is it doing: agent orchestration</h3>
<p>The orchestration view answers the first question, and the point of it is that it is not a transcript. A transcript tells you what an agent said. A status tells you whether it is working, whether it has finished, and whether it is stuck waiting for a human — and that last state is the one worth building a whole screen for. An agent blocked on a question it needs answering is achieving nothing while the meter runs, and it is exactly the state a row of terminal tabs hides best. If a dashboard like this does nothing else, it should make &ldquo;waiting on you&rdquo; impossible to miss.</p>
<h3 id="where-is-the-effort-going-project-heat-maps">Where is the effort going: project heat-maps</h3>
<p>A heat-map is a crude instrument and that is its virtue. Projects as tiles, warm where there has been activity and cold where there has not, and you can see at a glance that three agents have piled into one repository while the project you promised somebody you would look at has been grey all day. There is no fact on that screen you could not get from a list, but nobody reads the list. Attention is the scarce resource in this kind of work, and a picture of where it went beats an accurate table of where it went.</p>
<h3 id="what-did-it-produce-the-document-viewer">What did it produce: the document viewer</h3>
<p>Agents generate a lot of Markdown — plans, notes, reports, summaries of what they have just done. That output is the main artefact of a research or planning agent, and if reading it means hunting for a file path and squinting at raw text in a terminal, you will skim it. Skimming is how you end up three steps down a road nobody chose. Rendering documents in the same place you watch the agents removes the friction from the one task you should never rush: actually reading the thing before you act on it.</p>
<h3 id="is-the-ground-solid-service-health">Is the ground solid: service health</h3>
<p>Agents lean on other software — a database, a git host, a model endpoint, whatever API the job is really about. When one of those goes down you rarely get a clean failure. You get an agent that retries politely, or one that carries on with stale information and produces confident nonsense. A service health panel is the least clever part of a dashboard like this and probably the biggest time-saver in it, because &ldquo;the thing it depends on is down&rdquo; should be a ten-second diagnosis on a screen rather than a twenty-minute one in a log.</p>
<h3 id="what-is-it-costing-usage-tracking">What is it costing: usage tracking</h3>
<p>Cost has to be visible while it is being incurred, because that is the only point at which seeing it changes anything. A figure you meet at the end of the month is trivia; a figure you can watch climb against a task that is plainly going nowhere is a decision. The roll-ups worth having are by project and by day — by project, so you can see which piece of work is eating the budget, and by day, so a bad afternoon shows up as a bad afternoon. Treat any figure your own tooling produces as an estimate, incidentally, and reconcile it against what the provider actually bills you.</p>

<h3 id="where-the-humans-turn-lives-interactive-to-dos">Where the human&rsquo;s turn lives: interactive to-dos</h3>
<p>The easiest mistake with several agents running is to remove yourself from the loop entirely. Watching a chain of them work unattended is enormously satisfying, right up to the moment you discover that step two was wrong and everything since has been built on it.</p>
<p>So a dashboard like this needs somewhere for the human&rsquo;s turn to live, and a to-do list is the honest form of it: a short queue of the things only you can decide, in the same place as everything else, rather than a decision buried in a transcript you have not opened since lunch. My rule for what belongs there is simple enough to apply while tired. Anything expensive, anything irreversible, and anything visible to somebody else — deleting, pushing to a shared branch, spending real money, sending work to a client — is a person&rsquo;s call. The rest can run.</p>
<p>It is the same question I put to businesses in <a href="/writing/youre-asking-ai-the-wrong-questions/">You&rsquo;re asking AI the wrong questions</a>: which steps genuinely need a human, and which involve one only out of habit? Running several agents forces you to answer it, because you cannot supervise everything, and pretending otherwise just means supervising nothing properly.</p>
<h2 id="keep-the-record-on-hardware-you-control">Keep the record on hardware you control</h2>
<p>A dashboard like this accumulates a detailed account of what your agents have been doing, which by extension is an account of what you have been doing and which projects and clients you have been doing it for. That is not something I want sitting on a service I do not control, and it is the same instinct that has me running a private Tailscale network and my own Git host rather than putting everything on somebody else&rsquo;s box. If you build one, treat it as internal-only from the first commit: retrofitting privacy onto something you have already exposed is a far worse afternoon than starting there.</p>

<h2 id="if-you-are-thinking-of-building-one">If you are thinking of building one</h2>
<p>Do not start with the dashboard. Start with a log: have every agent write what it is doing, what it touched and what it cost to one place, in whatever crude format takes ten minutes, and live with that for a week. You will find you keep going back for two or three things and ignoring the rest, and those two or three things are your dashboard. The version you would have designed on day one is always prettier and always wrong.</p>
<p>Then build it boring. This kind of tool is scaffolding, not product, so choose something you can fix in ten minutes at eleven at night over something that is elegant on a Tuesday. Every hour spent on the dashboard is an hour not spent on the work it is meant to be watching.</p>
<p>And whatever else you do, keep a step in it that a human has to click. The point of running several agents at once is to get more done, not to find out later what got done to you.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/mission-control-running-several-ai-agents-at-once/">https://www.waynegeorge.uk/writing/mission-control-running-several-ai-agents-at-once/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>The AI automation playbook for UK small businesses</title>
      <link>https://www.waynegeorge.uk/writing/ai-automation-playbook-for-uk-small-businesses/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/ai-automation-playbook-for-uk-small-businesses/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>Where AI automation pays off first in a 5–50 person UK business, where it does not, how to run discovery, UK GDPR basics and a sensible first project.</description>
      <content:encoded><![CDATA[<p>Most AI advice for small businesses is written for companies with an IT department. If you run a firm of five to fifty people, you do not have one. You have a bookkeeper, someone who &ldquo;does the website&rdquo;, and a shared inbox. This is a playbook for that kind of business: where automation pays off first, where it does not, how to find out before you spend anything, what UK data protection law asks of you, and what a sensible first project looks like.</p>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. I have spent more than a decade building bespoke control systems for large corporate clients, which is still my day job, and in 2024 I founded <a href="https://frontierconsulting.ai/">Frontier Consulting</a> to build custom software and AI systems for UK businesses.</p>
<h2 id="where-automation-pays-off-first">Where automation pays off first</h2>
<p>The best candidates share three traits: the work happens often, the steps are broadly the same each time, and somebody already knows what a correct result looks like. Five areas pass that test in most owner-managed firms.</p>
<h3 id="document-handling">Document handling</h3>
<p>Supplier invoices, delivery notes and signed forms arrive as PDFs and photographs. Reading them, pulling out the fields that matter and typing them into your accounts package is work a language model does well and a person does badly at four o&rsquo;clock on a Friday. It is also easy to check: a total matches the invoice or it does not.</p>
<h3 id="quoting">Quoting</h3>
<p>Most firms quote from a handful of patterns: read the enquiry, pick the pattern, adjust a few numbers, send a document. A system drafts the quote from the enquiry and your price list; a person approves it. The gain is speed, and the first sensible quote often wins the job.</p>
<h3 id="scheduling">Scheduling</h3>
<p>Bookings, site visits and rotas are mostly plain rules that software you already own may cover. A model earns its place at the messy edge: turning &ldquo;any afternoon next week except Thursday&rdquo; into a booking request a person can confirm with one click.</p>
<h3 id="customer-replies">Customer replies</h3>
<p>Not a website chatbot, but drafting replies to the emails you already receive, using your own past replies as the reference, with a person pressing send. Sorting the inbox is the same job: &ldquo;where is my order&rdquo; and &ldquo;can you quote for a new roof&rdquo; should not land in the same pile.</p>
<h3 id="reporting">Reporting</h3>
<p>Two hours every Monday pulling figures from three systems into a spreadsheet is an obvious payoff, and most of it does not need AI at all. A model adds the two paragraphs on top that explain what changed.</p>
<h2 id="where-it-does-not-pay-off">Where it does not pay off</h2>
<p>Rare work comes first: automating a task that happens twice a year costs more than it saves. Next is work where nobody can say what &ldquo;correct&rdquo; looks like; if two people would give different answers and defend them both, a model will not settle it.</p>
<p>Then there is anything where a wrong answer is expensive and hard to reverse: pricing a large tender, a safety decision, a regulatory filing. AI can help prepare; it should not decide. And the phone call to the client who has been with you for fifteen years is not a process at all. Leave it alone.</p>
<p>Finally, do not automate a broken process. Automating chaos gives you faster chaos.</p>
<h2 id="ai-features-versus-systems-that-do-the-work">AI features versus systems that do the work</h2>
<p>Nearly every product you pay for has grown an &ldquo;AI&rdquo; button. That is a feature: it helps the person doing the task go a little faster, it is cheap, and it is worth switching on. But it does not change who does the work.</p>
<p>A system that does the work is different. It watches the inbox, reads the attachment, extracts the fields, checks them against your rules, posts the result into your accounts package, and raises the ones it is unsure about for a person. The person&rsquo;s job shifts from doing the task to handling exceptions. That is where the return is, and the engineering: connecting to the tools you actually use, coping with odd cases, failing safely.</p>
<p>I wrote about this in <a href="/writing/youre-asking-ai-the-wrong-questions/">You&rsquo;re asking AI the wrong questions</a>. The useful question is not &ldquo;how can AI help me write this email?&rdquo; but &ldquo;why does a person need to be involved at all?&rdquo;</p>
<h2 id="how-to-run-a-discovery-exercise">How to run a discovery exercise</h2>
<p>Discovery should take a week or two of part-time effort, not a quarter.</p>
<p>Follow the work, not the org chart. Ask each person to list, over five working days, every task that is repetitive, dull and involves moving information from one place to another. Do not ask what AI could do; ask what they would be glad never to do again.</p>
<p>For each candidate, note how often it happens, how long it takes, which systems it touches, what &ldquo;done&rdquo; looks like and what happens if it goes wrong. Then check where the data lives: a system with an export or an API is good; people&rsquo;s heads and paper mean the first job is not AI but getting it into a system at all. Rank by frequency, time and how easy the result is to check, and pick one. Not three.</p>
<p>Imagine a twelve-person accountancy practice where clients send receipts by email and as WhatsApp photographs, and a junior spends part of each day re-keying them into the bookkeeping software. Frequent, unambiguous, already digital: it would top almost any list.</p>
<p>For an outside view, Frontier Consulting runs a free <a href="https://discovery.frontierconsulting.ai/">discovery test</a>: a couple of minutes, no sign-up to start, and then, if you want it, an emailed PDF with &ldquo;your score, category, and recommended next steps&rdquo;. Treat it as a prompt for the five-day list, not a substitute.</p>
<h2 id="data-protection-basics">Data protection basics</h2>
<p>UK GDPR applies as soon as the automation touches personal data, which means anything that identifies a person: customer emails, employee records, the contact name on a supplier invoice. I am an engineer, not a lawyer, so I will point you at the Information Commissioner&rsquo;s Office rather than paraphrase it. Several of the pages below now carry an ICO banner saying: &ldquo;Due to changes made by the Data (Use and Access) Act, this guidance is under review and may be subject to change&rdquo;, so read the live version rather than a printout from last year.</p>
<p>You need a lawful basis for the processing: the ICO&rsquo;s <a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/lawful-basis/a-guide-to-lawful-basis/">guide to lawful basis</a> lists seven, and says you &ldquo;must determine your lawful basis before you start using the personal information and you must document it&rdquo;.</p>
<p>You will probably need a data protection impact assessment. The ICO&rsquo;s <a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/artificial-intelligence/guidance-on-ai-and-data-protection/what-are-the-accountability-and-governance-implications-of-ai/">AI guidance</a> says that &ldquo;in the vast majority of cases, the use of AI will involve a type of processing likely to result in a high risk to individuals&rsquo; rights and freedoms, and will therefore trigger the legal requirement for you to undertake a DPIA&rdquo;, and that if you decide otherwise you still have to document how you reached that view. Its <a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/accountability-and-governance/data-protection-impact-assessments-dpias/when-do-we-need-to-do-a-dpia/">DPIA guidance</a> recommends doing one whenever you are in any doubt. For a small first project this is a few pages: what data, why, what could go wrong, and what you are doing about it.</p>
<p>You decide what data is processed and why, so you are the controller; the model provider and anyone building for you are usually processors, and the ICO is clear that &ldquo;every time a controller uses a processor to process personal data, there must be a written contract&rdquo; (<a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/accountability-and-governance/contracts-and-liabilities-between-controllers-and-processors-multi/when-is-a-contract-needed-and-why-is-it-important/">ICO guidance on contracts</a>). Read the provider&rsquo;s data processing terms and check whether your data trains their models.</p>
<p>Keep a person in significant decisions. The rules on solely automated decisions with a &ldquo;legal or similarly significant effect&rdquo; now sit in Article 22A of the UK GDPR, and the ICO&rsquo;s <a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/individual-rights/automated-decision-making/">guidance on automated decision-making</a> was updated on 31 March 2026 to reflect the Data (Use and Access) Act 2025. That update is still marked draft: the consultation on it closed on 29 May 2026, and the ICO says it will withdraw the older version &ldquo;when we&rsquo;ve finalised the updated guidance after the consultation&rdquo;, so check which version is live before you rely on the detail. The principle is not in doubt. A hiring, credit or dismissal decision needs meaningful human involvement and a route to contest it. An invoice queue does not raise this; screening job applicants does.</p>
<p>Finally, organisations that use personal information, including sole traders, must pay the ICO&rsquo;s <a href="https://ico.org.uk/for-organisations/data-protection-fee/">data protection fee</a> unless exempt, and its <a href="https://ico.org.uk/for-organisations/advice-for-small-organisations/">advice for small and medium organisations</a> hub is worth an hour of your time.</p>
<h2 id="build-or-buy">Build or buy</h2>
<p>Buy when the task is generic, a product already fits your systems, and the monthly cost is clearly less than the time it saves: transcription, document scanning, meeting notes, drafting inside your email client.</p>
<p>Build when the value lies in the join between your systems, when the product would make the business change to suit it, or when the configuration effort is so large you are building anyway. A &ldquo;build&rdquo; at this size is rarely a product; it is usually a modest amount of code around a model, connected to your accounts package and inbox, with a queue for a person to check.</p>
<p>Most projects are a mixture: buy the components, build the workflow that joins them. Either way, insist that your data stays yours and exportable, that the system can switch models without a rewrite, and that someone other than the original builder can understand it.</p>
<h2 id="what-a-good-first-project-looks-like">What a good first project looks like</h2>
<p>Small, measurable and reversible.</p>
<p>Small means one process, one team, one kind of input, one kind of output. Measurable means you record a baseline (hours per week, or turnaround time) and measure again six weeks later with the same ruler. Reversible means the old way still works: the new system runs alongside it, a person checks every result until the error rate is known, and you can switch it off on a Tuesday afternoon without anyone noticing.</p>
<p>It should also be a little boring. Picture a building services firm with eight engineers and an office of three: supplier invoices go from the inbox into the accounts package, anything uncertain lands in a check queue, and the office manager records how many hours a week the re-keying used to take. That is a first project. A customer-facing chatbot is not.</p>
<h2 id="how-frontier-consulting-works">How Frontier Consulting works</h2>
<p>Frontier Consulting takes UK businesses from discovery to deployment, and its site puts that in three words: &ldquo;Discover, deploy, thrive.&rdquo;</p>
<p>It is a sequence, and the order is the point. Discovery is the cheap part and the part that decides everything else, which is why it starts with a free discovery test or a 20-minute strategy session, with, as the site says, &ldquo;No obligation. No sales pitch.&rdquo; Deployment means one small, measured, reversible project of the kind described above, rather than a platform. Thrive is the part that usually gets cut: documentation, handover and training, so the system belongs to the business rather than to whoever built it.</p>

<h2 id="where-to-start-this-week">Where to start this week</h2>
<p>Ask your team to keep the five-day list. Take the <a href="https://discovery.frontierconsulting.ai/">discovery test</a> if you want a second opinion in a couple of minutes, or <a href="https://calendly.com/w4ynegeorge/20-minute-strategy-session">book a strategy session</a> if you already know which process is eating your week. And if you would rather see what I build when I am my own client, that is what the <a href="/work/">work page</a> is for.</p>
<p>Then choose one process, and choose the dull one. The firms that get real value from this in the next year will not be the ones with the cleverest model. They will be the ones that picked a frequent, checkable, thoroughly boring job, handed it to a machine, and kept somebody watching the queue.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/ai-automation-playbook-for-uk-small-businesses/">https://www.waynegeorge.uk/writing/ai-automation-playbook-for-uk-small-businesses/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Grin and Mimblewimble in plain English</title>
      <link>https://www.waynegeorge.uk/writing/grin-and-mimblewimble-in-plain-english/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/grin-and-mimblewimble-in-plain-english/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>What Mimblewimble hides and how it hides it, why Grin emits one grin a second for ever, what interactive transactions really cost, and who runs the project.</description>
      <content:encoded><![CDATA[<p>Most digital money is less private than cash. Every Bitcoin payment ever made sits in a public ledger with its amount and addresses, and anyone with a laptop can read it back. Mimblewimble is a design for a ledger that does not work like that: amounts are hidden, there are no addresses, and the chain can forget most of its own history without anyone having to trust anyone else. Grin is the original implementation of it. The code was begun in October 2016, the network has run since January 2019, and there has never been a company, foundation or investor behind it. A second Mimblewimble chain, Beam, launched twelve days earlier with a company behind it; this piece is about Grin. It is my attempt to explain both without assuming you know any cryptography.</p>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. I wrote an open-source Grin wallet for iOS, compiled a short history called <a href="/grin-a-brief-story.html"><em>Grin: A Brief Story</em></a> out of the project&rsquo;s forum archives, and take part in the community that runs it. I am not neutral, but I will try to be fair, and nothing here is advice about what to buy.</p>
<h2 id="a-whitepaper-from-nowhere">A whitepaper from nowhere</h2>
<p>The Grin documentation tells the origin story straight: &ldquo;On <em>Mon Aug 01 2016</em> a user named <code>majorplayer</code> logged into the <code>#bitcoin-wizards</code> IRC channel, dropped a text file hosted on a Tor server and then disappeared.&rdquo; The message was almost apologetic — &ldquo;hi, i have an idea for improving privacy in bitcoin. my friend who knows technology says this channel would have interest&rdquo; — and the file behind the link was dated 19 July 2016, titled MIMBLEWIMBLE and signed &ldquo;Tom Elvis Jedusor&rdquo;, which is Voldemort&rsquo;s name in the French editions of Harry Potter. Mimblewimble is a tongue-tying curse from the same books. The author never came back (<a href="https://docs.grin.mw/about-grin/story/">the story of Grin</a>).</p>
<p>The paper described a blockchain that keeps amounts hidden and can throw away most of the data it accumulates. Andrew Poelstra published a refined treatment on 10 October 2016, and ten days later another pseudonymous developer, Ignotus Peverell, told the same channel: &ldquo;I have a minimal implementation of MimbleWimble available.&rdquo; That became Grin, and its repository still describes itself in exactly those terms: &ldquo;Minimal implementation of the Mimblewimble protocol.&rdquo;</p>
<h2 id="what-mimblewimble-actually-does">What Mimblewimble actually does</h2>
<p>Three ideas carry the design. <a href="https://docs.grin.mw/wiki/introduction/mimblewimble/mimblewimble/">Grin&rsquo;s documentation</a> has the maths; here is the intuition.</p>
<h3 id="the-amounts-are-hidden-but-still-add-up">The amounts are hidden but still add up</h3>
<p>Bitcoin checks a transaction the obvious way: add up the coins going in, add up the coins going out, and refuse anything that creates money from nothing. Mimblewimble does the same check on sealed envelopes. Each amount is wrapped in a Pedersen commitment, a construction that hides the number while still letting you add and subtract commitments as if they were numbers, so the network can confirm that inputs minus outputs come to zero without seeing the values. Because hiding a number invites the trick of hiding a negative one, &ldquo;a rangeproof is therefore attached to every output and proves that its value isn&rsquo;t negative and that its size is restricted so it doesn&rsquo;t overflow&rdquo;.</p>
<h3 id="there-are-no-addresses">There are no addresses</h3>
<p>A Bitcoin address is a reusable label, and reuse is how transactions get tied to people. Grin has none. Every output is a fresh commitment that shares no data with any earlier one, so there is nothing to look up and nothing to link. The price, in the documentation&rsquo;s own words, is that &ldquo;transactions have to be built interactively, with two (or more) wallets exchanging data with one another&rdquo; (<a href="https://docs.grin.mw/wiki/introduction/grin-for-bitcoiners/">Grin for Bitcoiners</a>). More on that shortly.</p>
<h3 id="the-chain-forgets">The chain forgets</h3>
<p>Because the ledger only needs to know that everything balances, &ldquo;matching inputs and outputs can be eliminated, as their contribution to the overall sum cancels out&rdquo;. If I pay you and you pay someone else, the output in the middle cancels and can be deleted. This is called cut-through, and it means a new node can verify the whole history without storing it. What survives from each transaction is a kernel, &ldquo;at around 100 bytes&rdquo;, and the documentation reckons that a Mimblewimble chain therefore &ldquo;grows at roughly one quarter the rate of a bitcoin blockchain, while offering much better privacy&rdquo;.</p>
<h2 id="what-grin-is">What Grin is</h2>
<p><a href="https://grin.mw/">Grin</a> offers itself in one line: &ldquo;Electronic transactions for all. Without censorship or restrictions.&rdquo; Its first block was mined on 15 January 2019, and the launch was deliberately plain: no initial coin offering, no pre-mine, no founder&rsquo;s reward, no company or foundation. Development is paid for by donations, and the project says it &ldquo;will attempt to rely 100% on community donations for its funding needs&rdquo; (<a href="https://grin.mw/funding.html">funding principles</a>). The homepage still carries the warning it has always carried: &ldquo;It&rsquo;s very young and experimental. Use at your own risk!&rdquo;</p>
<h3 id="one-grin-a-second-for-ever">One grin a second, for ever</h3>
<p>Bitcoin&rsquo;s supply is capped at 21 million and its block reward halves roughly every four years. Grin emits one new grin every second, indefinitely, with no cap — sixty a block on a one-minute target. New supply as a share of the total falls as the total grows: &ldquo;After 10 years, it falls below 10%. After 20, below 5%.&rdquo; And for its first four years Grin&rsquo;s inflation curve tracked Bitcoin&rsquo;s exactly, because both paid a full, unchanging reward until year four (<a href="https://docs.grin.mw/about-grin/emission/">emission</a>). The number of coins is nothing like the same; the shape of the curve is.</p>
<p>The stated reason is that Grin is meant to be spent rather than hoarded. It was the most argued-over decision in the project&rsquo;s history, and it has never changed.</p>
<h3 id="cuckoo-cycle">Cuckoo Cycle</h3>
<p>Bitcoin miners race to find a hash. Grin miners search enormous graphs for closed loops of 42 links, a puzzle called Cuckoo Cycle designed by John Tromp. It is &ldquo;primarily a memory bound algorithm, which (at least in theory) means that solving performance is bound by memory bandwidth rather than raw computational speed&rdquo; — chosen partly because &ldquo;eventual ASICs should run much cooler than hashing chips&rdquo; (<a href="https://docs.grin.mw/wiki/miscellaneous/cuckoo-cycle/">Cuckoo Cycle</a>). ASICs are the specialised chips that get built for any proof-of-work worth mining, and the bet was that it is better to shape the chips than to pretend they will not arrive.</p>
<p>So two variants ran side by side for the first two years: an ASIC-friendly one that began at ten per cent of rewards and rose to all of them, and ASIC-resistant Cuckaroo29, which fell from ninety per cent to nothing and was modified at scheduled hard forks — compulsory network upgrades — every six months, &ldquo;in order to interrupt possible ASIC development for it&rdquo;. The ASIC-friendly side started as Cuckatoo31+, which the documentation notes &ldquo;was initially the primary PoW but was phased out completely after 18 months&rdquo;. Cuckatoo32+ is what remains today (<a href="https://docs.grin.mw/about-grin/proof-of-work/">proof-of-work</a>).</p>
<h3 id="interactive-transactions-and-slatepacks">Interactive transactions and slatepacks</h3>
<p>This is what surprises people coming from other coins. Because both parties contribute to the cryptography, sending grin is a short conversation: the sender starts the transaction, the receiver adds their part and signs, and the sender finishes it and broadcasts. The wallets need not be online at the same time, but the data has to make the round trip.</p>
<p>The standard for that round trip is the <a href="https://docs.grin.mw/wiki/transactions/slatepack/">slatepack</a>. A slatepack address is &ldquo;a bech32 encoded ed25519 public key&rdquo;; the sending wallet derives an onion address from it and tries to deliver over Tor, and if that fails the transaction falls back to a block of encrypted text between <code>BEGINSLATEPACK</code> and <code>ENDSLATEPACK</code> markers that you can paste into a chat, an email or anything else that carries words. My own iOS wallet works this way. Its README also lists peer-to-peer transfers over local Wi-Fi and Bluetooth, so two phones can hand a transaction between them with no internet connection at all.</p>
<h2 id="why-privacy-in-money-matters">Why privacy in money matters</h2>
<p>Your bank statement is private by default. The bank can see it, and so can the law with a warrant, but the corner shop cannot and neither can your neighbour. A public blockchain turns that inside out: anyone who has ever paid you can see the balance you hold, what you spent it on next and who with, for as long as the chain exists.</p>
<p>That is not abstract. It matters to the person whose employer can see what they donate to, to the small business whose supplier can read its margins, and to anyone whose coins are refused because someone further up the history did something wrong. That last one is fungibility, the property that one pound is as good as any other, and a transparent ledger quietly loses it. Mimblewimble&rsquo;s answer is not to bolt privacy on afterwards but to leave the identifying data out in the first place.</p>
<h2 id="the-trade-offs">The trade-offs</h2>
<p>None of this is free.</p>
<p>The interactive model is the biggest cost. A transaction that needs a reply is harder for exchanges, payment processors and ordinary people than one that needs only an address, and it has held back adoption. There is no &ldquo;send it here and walk away&rdquo;.</p>
<p>There is no scripting language. Bitcoin&rsquo;s small programmable contracts do not exist here, so multi-signature wallets, which need more than one key to authorise a spend, and atomic swaps, which trade grin for another coin without a middleman, have to be built out of the elliptic-curve maths instead. Some of that has proved harder than hoped: multisig in particular ran into unsolved problems around threshold range proofs.</p>
<p>Hidden amounts raise the stakes on correctness. On 18 March 2021, Grin++, David Burkett&rsquo;s independent C++ implementation, refused to accept block 1,136,081. A caching bug in the main implementation meant a range proof that had already been verified for one output could be accepted for a different one — which is precisely how you would create coins out of nothing on a chain where nobody can see the amounts. A fix shipped within hours and the invalid block was rewound. It remains the best argument I know for a network having more than one implementation of its rules.</p>
<p>Then there is the emission. Perpetual issuance is defensible as monetary policy and hard to love as a story. And the project is small, funded by nobody with a marketing budget, and run by volunteers, which is a strength in some lights and a limitation in others.</p>
<h2 id="from-a-core-team-to-a-governance-council">From a core team to a governance council</h2>
<p>Grin has been governed in public from the start. I read most of that record while <a href="/writing/compiling-a-book-from-eight-years-of-forum-posts-with-claude-code/">compiling the history from the forum archives</a>, and the shape of the thing has changed more than once.</p>
<p>In August 2018, before launch, contributors with commit rights formed a technocratic council to hold a multi-signature wallet for the project&rsquo;s funds. Ignotus Peverell — Igno to everyone — called the arrangement the &ldquo;technomity&rdquo;: &ldquo;a type of meritocracy, where a technocratic council makes decisions, and a leader (Igno) has the right to exercise final say, but hardly ever has the need to do so.&rdquo; They looked hard at incorporating and left it open rather than settling it. The governance summary of the time reads: &ldquo;While no one has completely ruled out the need for a foundation, many of us seem to think it may not be needed or required.&rdquo; Part of the argument was that &ldquo;anonymity can be an asset to help shelter this project somewhat&rdquo;. When Igno left a few months after launch, that unincorporated structure had to carry on without its founder.</p>
<p>In 2020 the project formalised things through RFCs, its written proposals. <a href="https://docs.grin.mw/grin-rfcs/text/0016-simplify-governance/">RFC 0016</a>, begun on 11 September 2020, dissolved the core team because &ldquo;all critical decision making became centralized around the core team&rdquo;, and narrowed what was left to almost nothing: &ldquo;The main purpose of the council is to manage the keys to the Grin General Fund and have final say in spending decisions.&rdquo; Everything else would self-organise.</p>
<p>In March 2021 John Tromp posted that &ldquo;the Council has expressed a willingness to share funding control with people from the wider Grin community&rdquo;, and a call went out for candidates from outside it (<a href="https://forum.grin.mw/t/call-for-grin-community-candidates-for-additional-fund-granting-control/8521">forum thread</a>).</p>
<p>By 2025 that arrangement had worn thin, for the dullest and most human of reasons. A thread opened on 6 May 2025 put it plainly: &ldquo;increasingly it has become difficult to a) get sufficient CC members to join meetings and b) get CC key-holders to sign transactions in a timely fashion.&rdquo; The proposal was a reset — new volunteers, a new multi-signature wallet — and that is what happened. The older council merged into the new one, the funds were consolidated into &ldquo;a single 4/7 MultiSig&rdquo;, and the body took the name Grin Governance Council (<a href="https://forum.grin.mw/t/resetting-the-community-council-cc-update-new-grin-governance-council-was-created-gcc/11749">forum thread</a>).</p>
<p>My name is in that record. The 6 May 2025 post listed me among the proposed members — &ldquo;@waynegeorge (software engineer, who long followed Grin)&rdquo; — and the thread introducing the new council later that month names me as one of its six (<a href="https://forum.grin.mw/t/introducing-the-new-community-council/11793">forum thread</a>).</p>

<p>For a project with no legal entity, that is a strange kind of appointment. There is no letter, no register, no induction. The treasury is a wallet, the boardroom is a forum thread, and all of it is visible.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/grin-and-mimblewimble-in-plain-english/">https://www.waynegeorge.uk/writing/grin-and-mimblewimble-in-plain-english/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Why I built NVR Companion, an app for parents practising Non-Violent Resistance</title>
      <link>https://www.waynegeorge.uk/writing/why-i-built-nvr-companion/</link>
      <guid isPermaLink="true">https://www.waynegeorge.uk/writing/why-i-built-nvr-companion/</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 +0000</pubDate>
      <dc:creator>Wayne George</dc:creator>
      <description>What Non-Violent Resistance parenting is, what my iOS app NVR Companion does to support it, and why every note a parent writes in it stays on the phone.</description>
      <content:encoded><![CDATA[<p>Some parenting problems do not respond to the usual advice. When a child&rsquo;s behaviour tips into violence, or they retreat behind a closed door and stop coming out, the standard tips about consistency and consequences can feel almost insulting. Non-Violent Resistance (NVR) is an approach built for exactly those families, and in June 2026 I released <a href="https://apps.apple.com/gb/app/nvr-companion/id6760240244">NVR Companion</a>, an iOS app to help parents practise it. This article explains what NVR is, what the app does and does not do, and why I made the choices I did.</p>
<h2 id="what-non-violent-resistance-is">What Non-Violent Resistance is</h2>
<p>NVR grew out of the work of Professor Haim Omer and his colleagues at Tel Aviv University. <a href="https://www.partnershipprojectsuk.com/">PartnershipProjects</a>, who say they were the first to use the approach in Britain, describe it as &ldquo;an innovative form of systemic family therapy, which has been developed for aggressive, violent, controlling and self-destructive behaviour in young people&rdquo;. <a href="https://www.oxfordhealth.nhs.uk/camhs/carers/family-ambassadors/do-you-feel-alone-with-your-childs-difficult-and-dangerous-behaviour/non-violent-resistance-nvr-parenting-approach/">Oxford Health&rsquo;s CAMHS service</a> puts it more plainly: it is an approach that &ldquo;helps to raise the presence of adults in a young person&rsquo;s life in order to foster positive relationships&rdquo;. The same page traces the idea back to Gandhi, Martin Luther King and Nelson Mandela, who used the principles &ldquo;to bring about peaceful political difference&rdquo;.</p>
<p>The behaviours it is used for are the ones parents rarely mention at the school gate. Oxford Health lists hitting, kicking, spitting and threatening behaviour, but also violence turned inward, such as self-harm and disrupted eating, and children who isolate themselves.</p>
<p>What sets NVR apart from most parenting programmes is where it points its attention. It does not set out to change the child. It asks the parent to change how they respond: to stop escalating, to stop struggling in secret, and to become a calm, persistent presence the child cannot ignore. <a href="https://www.haimomer-nvr.com/nvr-approach">Omer&rsquo;s own site</a> says the approach goes by two names, NVR and &ldquo;the new authority&rdquo;, and describes the work as showing parents &ldquo;how to regain their place, voice and influence&rdquo;, so that they can &ldquo;become an anchor for their children&rdquo;.</p>
<h3 id="the-tools-parents-learn">The tools parents learn</h3>
<p>A parent going through an NVR programme, whether with an NHS CAMHS team, a local authority or a private practitioner, will meet a fairly consistent set of ideas. What follows is my summary of the East London and Oxford NHS factsheets and PartnershipProjects&rsquo; introduction to NVR, and the links are there if you would rather read the originals.</p>
<p>De-escalation comes first. East London NHS Foundation Trust&rsquo;s <a href="https://www.elft.nhs.uk/nvr-factsheet-2">NVR factsheets</a> call it &ldquo;the first tool in the NVR toolbox&rdquo; and reverse the familiar saying: in NVR you &ldquo;strike when the iron is cold&rdquo;. You do not meet fire with fire, and you come back to the issue at a neutral time, when everyone can think again.</p>
<p>Baskets are how you choose your battles. You cannot resist everything at once, so behaviours are sorted, and only a small number are actively resisted while the rest are set aside for now. A parent quoted on PartnershipProjects&rsquo; <a href="https://www.partnershipprojectsuk.com/non-violent-resistance-nvr/introduction-to-nvr/">introduction to NVR</a> describes still trying to remember &ldquo;the basics, the grounding, the choosing of my battles and only dealing with the small basket issues&rdquo;.</p>
<p>An announcement is a short written statement, read or handed to the child, naming the behaviours the family will no longer accept and committing the parents to resisting them without violence. <a href="https://www.elft.nhs.uk/nvr-factsheet-3">ELFT&rsquo;s third factsheet</a> explains the point of putting it on paper: &ldquo;Each carefully pre-planned written statement is designed to increase the presence of the parent in the child&rsquo;s mind.&rdquo;</p>
<p>A sit-in is an act of resistance carried out calmly in the child&rsquo;s own space rather than as an argument, and ELFT is careful to say that parental presence shows just as robustly in the quieter, connecting version as in the traditional one.</p>
<p>Supporters matter because NVR rejects the idea that a family should cope alone. Relatives, friends and teachers are recruited openly, which makes behaviour that has often been kept secret visible to more people than the parents carrying it. One of the parents quoted on PartnershipProjects&rsquo; site puts it better than a factsheet can: &ldquo;It is also acceptable to ask others for help and not feel ashamed.&rdquo;</p>
<p>Reconciliation gestures run alongside all of this. ELFT names four kinds, quality time, reflective listening, connecting comments and connecting actions, and they are unconditional rather than a reward for good behaviour.</p>
<p>And self-care is built in from the start. ELFT is blunt about why: it &ldquo;is not optional, but vital, to help prevent parental burnout&rdquo;.</p>
<p>Another parent on that same page sums the whole thing up in a line I keep coming back to: &ldquo;NVR is not a marathon nor is it a sprint. It is a lifelong change in parenting approach.&rdquo;</p>
<h2 id="why-an-app">Why an app</h2>
<p>I&rsquo;m Wayne George, a <a href="/about/">software engineer in London</a>. I am not a therapist, and I want to be clear about that from the outset. What I bring is a habit: when I meet a structured method, I want to build the thing that makes it easier to follow.</p>
<p>When I looked at how NVR is taught, the gap was obvious. The programme happens in sessions. The hard moments happen between them. The materials are handouts, worksheets and a couple of good books. The announcement drafted so carefully in week six is in a folder somewhere. The list of supporters is on the back of an envelope. How the last fortnight actually felt, which a practitioner will ask about, is a blur by Thursday. And at half past ten on a Tuesday night, with a door slammed and your heart going, the thing in your hand is not a folder. It is a phone.</p>
<p>So the brief I set myself was narrow: put the core ideas, the planning tools and the trackers in one calm place on the phone, and then get out of the way.</p>
<p>I had built one app before with the same stance on privacy. <a href="https://apps.apple.com/gb/app/mood-share/id6502838346">Mood Share</a> keeps everything on the device, with no accounts and no data collection, and I have <a href="/writing/ios-app-with-no-accounts-and-no-data-collection/">written separately about how that works</a>. Shipping it convinced me that this is the only sensible approach for anything genuinely personal.</p>

<h2 id="what-is-in-it">What is in it</h2>
<p>An app for a programme like this has three jobs, and they pull against each other. It has to explain the ideas well enough to be useful at eleven at night. It has to hold the writing a parent does, the baskets and the supporters and the announcement, somewhere steadier than a notes app. And it has to stay out of the way, because nobody opens an app like this for entertainment.</p>
<p>The listing describes five sections. Learn is free and covers the core concepts: &ldquo;what NVR is, the baskets, de-escalation, the announcement, sit-ins, and reconciliation gestures&rdquo;. If you only ever use this part, it still does the job of a well-organised set of handouts that cannot get lost.</p>
<p>Growth and Connect are named after the shorter ideas a practitioner would sketch on a whiteboard, and none of them are mine. The parent line is ELFT&rsquo;s picture of parenting styles, permissive at one end, authoritarian at the other, with the ground worth standing on in the middle. The shield is the imaginary armour ELFT suggests a parent picture, &ldquo;to help protect them when the child makes hurtful comments&rdquo;. Connection before correction is the observation that a parent has more influence over a connected child than a disconnected one. The seesaw, the Goldilocks zone, the stress position and the magnifying glass sit alongside them. Connect is headed, in the listing&rsquo;s own words, &ldquo;Stand against the behaviour, never against the child&rdquo;, which is close to the whole approach in a sentence.</p>
<p>Planning is where the writing happens: sorting behaviours into baskets, building a supporter network, drafting an announcement. Wellbeing is the part for you rather than your child, with daily mood check-ins, a compassionate letter to yourself and a self-care tracker, because a parent running on empty cannot hold a calm presence for long. There is also a Crisis section with helpline numbers, kept deliberately simple so it is reachable in a hurry.</p>
<p>Learn costs nothing. The other four sections, along with a set of deeper interactive planners and trackers, are opened by a one-time unlock called NVR Companion Pro. It comes in three tiers, Small, Standard and Generous, at £1.99, £4.99 and £9.99, and the listing is explicit that they &ldquo;all unlock exactly the same content&rdquo;, so you pay what fits your circumstances. There is no subscription and nothing recurring.</p>
<p>The app needs iOS 18 or later. Version 1.0 went live on 2 June 2026 and a small maintenance update followed on 12 June.</p>
<h2 id="private-by-design">Private by design</h2>
<p>The App Store description says it in five short sentences: &ldquo;Your data stays on your device. No accounts. No cloud. No analytics. No tracking.&rdquo; The privacy label on the listing reads &ldquo;Data Not Collected&rdquo;, and that label is a literal statement rather than a marketing flourish: under Apple&rsquo;s definition, data processed only on the device is not collected, because collecting means transmitting it off the device where the developer or a third party can reach it. The Mood Share article goes through that definition in more detail. Both of <a href="/work/">the apps I publish</a> carry the same line.</p>
<p>I made that choice because of what a parent writes in an app like this. An announcement is, in effect, a list of the worst moments in your house. A record of your mood is a fortnight of how you really felt. A compassionate letter to yourself is exactly as private as it sounds. None of that should sit on a server I run, and the simplest way to guarantee it does not is to have no server at all. There is nothing to breach, nothing to sell and nothing to hand over.</p>
<p>The trade-offs are real and I would rather name them than hide them. No cloud means no sync between devices and no web version. No account means there is nothing to recover, so the app lives and dies with your phone and whatever backup you keep of it. And no analytics means no dashboard telling me how many people use it or which screens they linger on; the only feedback is what someone chooses to send me. I am comfortable with all of that.</p>
<h2 id="a-companion-not-a-substitute">A companion, not a substitute</h2>
<p>The name is deliberate. The listing says it directly: NVR Companion &ldquo;is an educational and self-help companion. It is not a medical device, and it does not replace professional advice from a clinician, therapist, or NVR practitioner.&rdquo;</p>
<p>NVR is normally learnt with a practitioner or in a group of other parents, and that is where the judgement, the tailoring to your family and the week-by-week support come from. The app assumes you have that, or are looking for it, and tries to make the time between sessions more useful. If you are not yet connected to a programme, a GP or your local CAMHS service is a reasonable place to start, and organisations such as PartnershipProjects offer training and information.</p>
<p>If your child is in immediate danger, or you are, the Crisis section has helpline numbers, and 999 is always the right call.</p>
<h2 id="where-i-want-to-take-it">Where I want to take it</h2>
<p>What I want is for the app to be worth a practitioner&rsquo;s recommendation: something an NVR team in the NHS, or someone in private practice, can point a parent towards between sessions in the knowledge that it will not harvest anything from them. That is an aim rather than an arrangement, and it is what I would like the app to earn.</p>
<p>If you are a practitioner and you have opinions about what is missing, what is wrong or what would make it easier to recommend, I want to hear them. The same goes for parents using it now.</p>
<h2 id="try-it">Try it</h2>
<p>NVR Companion is <a href="https://apps.apple.com/gb/app/nvr-companion/id6760240244">on the App Store</a> for iPhone, and it runs on Apple silicon Macs too. Download it, read through Learn, and if you are already on a programme, try drafting your next announcement in it before your next session. If it helps, or if it does not, email me at hello@waynegeorge.uk and tell me why.</p>
<p><em>Originally published at <a href="https://www.waynegeorge.uk/writing/why-i-built-nvr-companion/">https://www.waynegeorge.uk/writing/why-i-built-nvr-companion/</a> by Wayne George.</em></p>]]></content:encoded>
    </item>
  </channel>
</rss>
