<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:media="http://search.yahoo.com/mrss/"
	>
<channel>
	<title>Simwood</title>
	<atom:link href="https://simwood.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://simwood.com/</link>
	<description>Straight-talking, forward-thinking, telecoms</description>
	<lastBuildDate>Fri, 17 Jul 2026 20:20:00 GMT</lastBuildDate>
	<language>en-GB</language>
	<item>
		<title>Portal login, upgraded</title>
		<link>https://simwood.com/2026/07/portal-login-upgraded/</link>
		<dc:creator><![CDATA[Charles Chance]]></dc:creator>
		<pubDate>Fri, 17 Jul 2026 20:20:00 GMT</pubDate>
		<category><![CDATA[new-features]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/portal-login-upgraded/</guid>
		<description><![CDATA[Portal login is moving to a new identity platform, and if it goes to plan you won't notice a thing. Same email and password, same 2FA, just a new address at auth.simwood.com built on Keycloak. Underneath, it's a proper upgrade — OAuth 2.0 with PKCE, revocable sessions, and the groundwork for passkeys and social sign-in.]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-portal-login-upgraded-3a5133c5df.png" width="1200" height="630" />
		<content:encoded><![CDATA[<p>Earlier this month, as part of our series on the <a href="https://simwood.com/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">new platform architecture</a>, we set out how <a href="https://simwood.com/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">authentication now works</a> across the Simwood API: hashed API keys with granular scopes for machines, OIDC-issued tokens for humans, and Basic Auth heading for a dignified retirement. API keys went live first. Today we can confirm the second piece: portal login is moving to our new identity platform, and the switchover is imminent.</p>
<p>Here's the headline: <strong>you shouldn't notice anything</strong>.</p>
<h2>What's actually changing</h2>
<p>Under the hood, this is one of the more significant changes we've made to the portal in years. Login moves from our own custom flow to an industry-standard OpenID Connect service running at <em>auth.simwood.com</em>, built on Keycloak - the same battle-tested open-source identity platform trusted by banks, governments, and Fortune 500s alike.</p>
<p>When the switch happens, the login page will look a little different (same Simwood branding, new address), and that's the extent of it:</p>
<ul>
<li><strong>Your email and password work exactly as before.</strong> No reset, no re-registration, no &quot;welcome to the new system&quot; email demanding action.</li>
<li><strong>Your two-factor authentication carries over.</strong> If you use an authenticator app today, the same app and the same codes keep working.</li>
<li><strong>Everything in the portal behaves as it did.</strong> Same features, same account, same permissions.</li>
</ul>
<p>In our <a href="https://simwood.com/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">earlier post</a> we said the migration would involve an invitation to set a new password. We've since done better than that: credentials migrate transparently, and your existing password is seamlessly upgraded to the new platform the first time you log in. The best migrations are the ones you never notice, and we've engineered this one to be exactly that.</p>
<h2>Why bother, then?</h2>
<p>Because what you <em>don't</em> see matters, and because of what it unlocks.</p>
<p>The new flow is built on the OAuth 2.0 Authorization Code flow with PKCE - today's standard for browser-based login - with short-lived access tokens, refresh tokens in httpOnly cookies the browser's JavaScript can never read, and central session management so a revoked login is revoked everywhere, immediately. Your portal session now carries the same <a href="https://docs.simwood.com/authentication">granular scopes</a> as our API keys, so one consistent permission model governs every request that touches the platform, whether it came from a script or a person.</p>
<p>Managing your login remains self-service, now through a dedicated account console - change your password, manage two-factor authentication, and, new this time, review and revoke your active sessions, all without a support ticket.</p>
<p>But the bigger reason is where this takes us next.</p>
<h2>What it unlocks</h2>
<p>Our old login flow was ours alone, which meant every improvement to it was ours to build alone. Standing on an open standard changes the economics entirely. On the roadmap, in rough order:</p>
<ul>
<li><strong>Passkeys.</strong> Passwordless login using the biometrics already on your device - Face ID, Touch ID, Windows Hello, or a hardware key. Phishing-resistant by design, and faster than typing a password ever was. This is the one we're most excited about, and the new platform supports it natively.</li>
<li><strong>Sign in with the identity you already have.</strong> Google, Microsoft, and GitLab to begin with - handy for teams who manage access centrally and would rather not maintain another password at all.</li>
<li><strong>Finer-grained roles for your team.</strong> Today it's owners and users; the same scope model that powers our API keys lets us offer more precise roles over time, so you can grant a colleague exactly the access they need and nothing more.</li>
</ul>
<p>None of these were realistic on the old system. All of them are natural extensions of the new one.</p>
<h2>What you need to do</h2>
<p>Nothing. That's the point.</p>
<p>The switchover is imminent. When it lands, log in as normal; if you're curious, the only tell will be the address bar reading <em>auth.simwood.com</em> for a moment while you sign in. As ever, if anything doesn't behave as promised, our support team wants to hear about it - but we've tested this one to the point where we'd be surprised.</p>
<p>We said earlier in July that authentication was being done right. This is what that looks like when it reaches the portal: a foundation you can't see, carrying features you'll soon be very glad of. Watch this space!</p>
]]></content:encoded>
	</item>
	<item>
		<title>A million scam calls a month never happen</title>
		<link>https://simwood.com/2026/07/a-million-scam-calls-a-month-never-happen/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Fri, 17 Jul 2026 16:13:00 GMT</pubDate>
		<category><![CDATA[nuisance-calls-us]]></category>
		<category><![CDATA[ip-network]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/a-million-scam-calls-a-month-never-happen/</guid>
		<description><![CDATA[Regular readers will know we take spam and scam calls, aka nuisance calls, very seriously. Every one is potentially a granny robbed of her life savings. Every one is somebody's evening being interrupted and the integrity and trust in the system on which our livelihoods depend being undermined. Every one using a sub-allocation of our numbering is potentially reputational damage for us, which in the past has led to death threats for me. So we're pretty intolerant of this rubbish gumming up the network, whether it originates from our own customers or off net from those who see the money before the morals. ]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-a-million-scam-calls-a-month-never-happen-4a83f2d9df.png" width="1200" height="630" />
		<content:encoded><![CDATA[<p>Regular readers will know we take spam and scam calls, aka nuisance calls, very seriously. Every one is potentially a granny robbed of her life savings. Every one is somebody's evening being interrupted and the integrity and trust in the system on which our livelihoods depend being undermined. Every one using a sub-allocation of our numbering is potentially reputational damage for us, which in the past has led to death threats for me. So we're pretty intolerant of this rubbish gumming up the network, whether it originates from our own customers or off net from those who see the money before the morals.</p>
<p>Every day, tens of thousands of calls try to cross our network and don't make it. Not because of congestion, not because of a fault - because they were scams, sprays, and spoofs, and we stopped them. Over a million a month. Fifteen million in the last year, and growing.</p>
<p>We tightened the net hard through last summer, and at the peak we were rejecting nearly six in every hundred call attempts based on their identified signature. If you've heard us cite &quot;around 5% of traffic&quot;, that's the era it comes from, and it was true. It is about half now owing to two factors.</p>
<p>Traffic across our network has two sources - our own customers where we see 100% of their attempts usually, and other networks where we see a proportion of their attempts broadly equivalent to our market share. In the worst cases, we’ll see both - traffic across multiple customer accounts and attempts coming in across multiple peers. We’re agnostic about origin, it all gets treated the same, but we can and do terminate accounts. Sometimes this is within days of passing KYC and having service established. Other times, it's long-standing customers who have regrettably been seduced by apparently easy money. We don't discriminate: bad is bad.</p>
<p>What we’ve seen is a substantial reduction in the proportion originating on-net (of the 100% we see) and a substantial increase in that which originates off net (of the market-share percentage we see). This is of course in part traffic from those accounts we've terminated which has been welcomed with open arms by others. But the vast majority is simply the ongoing inflation in this type of traffic. Over the past year, the share of hostile calls in the traffic our peers hand us has roughly <strong>doubled - across every peer.</strong></p>
<p>Part of the driver for this is simply economics. Wholesale phone calls are so cheap and actually free for the originator unless they connect. So turning up the volume, harassing more end users remains a lucrative and viable business, even if only a tiny proportion of them ever engage positively.</p>
<p>We tried to <a href="https://simwood.com/2026/04/aww-bless-protecting-consumers-is-too-hard/">encourage Ofcom to change these motivations</a> in a recent consultation, sadly to no avail.</p>
<p>One network in particular who we have called out repeatedly for their pious virtue-signalling, and specifically in the context as the “<a href="https://simwood.com/2025/06/beware-the-fox-is-in-the-hen-house/">Fox in the Hen House</a>”, has KYC requirements as pitiful as their technical standards. By our measurements, they are <strong>ten times more likely to be the origin of a spam call</strong> than the cleanest of our peers - which, credit where due, is BT. We won’t allow our customers' end-users to be ripped off or harassed, even if they will. I presume this is lax KYC rather than wilful targeting of that market segment, but the result is no different for the poor person on the receiving end.</p>
<p><img src="/assets/blog/screenshot-2026-07-17-at-16.46.55.png" alt=""></p>
<p>That is based on the route traffic takes but it is equally interesting if one looks at the Range Holders problem numbers are assigned to. There are some really bad ones but if we look at the top 10, and then consider which networks host these, let’s just say it looks like the route probability would suggest. The smallest of aforementioned hosting operators is clear number one, with 5.6x BT’s number of blocked calls. Market-share weight this and things get exponential. Simwood, despite hosting more ranges than the number one spot, and seeing 100% of the traffic by virtue of the sampling taking place on our network, doesn’t appear on that list at all. So this appears to be Range Holders with lax KYC, favouring hosts with lax KYC, who also have lax KYC over the traffic they pass. How many times can you say correlation isn’t causation before giving up?</p>
<p><img src="/assets/blog/screenshot-2026-07-17-at-16.47.12.png" alt=""></p>
<p>I’d dearly love to publish these league tables, maybe as a real-time dashboard like we have internally. I think they’d be really insightful to policymakers and hopefully drive responsible CPs to make different choices. Unfortunately various rules in our industry introduce hurdles to that. Maybe Ofcom will s135 us for this data? The blurred images above are the best we can do for now.</p>
<p>The result of all this on our side is a dramatically cleaner network: the failed-call share has fallen, and the population of abusive numbers originating here at any moment has fallen by roughly two thirds.</p>
<p>Meanwhile, excluding the effect of customers terminated, our catch rate is rising. Same customers, sharper filter. That's the pair of numbers that matters: cleaner network, keener blade.</p>
<p>Despite us catching more bad stuff in a cleaner population, the really important thing for us is false positives. Anyone can block 1m calls and in fact we’ve already told Ofcom we could block 30m just by enforcing one of their long-standing rules. The trouble is, doing so unilaterally we’d be out of business because those blocks would result from decades of poor discipline by other operators, either not knowing or not caring about the existence of said rule.</p>
<p>We treat blocking a legitimate caller as a serious incident. The entire system is engineered backwards from that:</p>
<ul>
<li><strong>No block is forever.</strong> Every block is time-limited and expires automatically. A number is re-judged on what it does next, not on what it did once. However, persistent offenders now escalate, i.e. the blocks get longer each time.</li>
<li><strong>Every block candidate gets a second opinion.</strong> An independent AI adjudicator now reviews the evidence behind every candidate - and it argues in both directions. It can overturn a block as readily as confirm one, and every verdict it gives is logged and scored against what actually happened next.</li>
<li><strong>Evidence protects the innocent.</strong> Numbers with genuinely healthy calling relationships are structurally protected - a borderline signal cannot block them. And where evidence is missing or stale, the benefit of the doubt always goes to the caller. Absence of proof is never treated as guilt.</li>
<li><strong>We audit our misses, not just our mistakes.</strong> We now randomly re-examine traffic we cleared, so we can measure false negatives as rigorously as false positives - and tune the balance on data rather than anecdote.</li>
</ul>
<p>Everything above is measured against real outcomes, continuously. This month we validated a new early-warning technique against a full year of enforcement history - strictly past-predicting-future - and found it concentrates almost half of the next month's brand-new offenders into a third of a percent of the number space. That means checking bad numbers before they've hurt anyone, not after.</p>
<p>That is a difficult one because compliance won’t always allow us to act upon the profiling of a number based on which Range Holder on which network and which interconnect the calls come from, even though statistically that gives great signal. The danger comes where some innocent user has seen the light and ported out which fails our false positive rule.</p>
<p>We also had an independent machine-learned model audit our hand-built rules: it agreed with every one of them, which is either reassuring or suspicious, and we choose reassuring - it also found two new signals we're now evaluating.</p>
<p>None of it ships as blind automation. New signals face direct scrutiny first and blocking only with corroboration. The system is learning all the time, both from its own evolving baselines and the signal of proven hypotheses. There are now well over 40 proven factors go into any block/don’t block decision, which individually have high statistical probabilities before tying them together.</p>
<p>Lastly we have recently licensed TPS and CTPS data. Calling those numbers isn't signal on its own because we don’t know the intent of those calls, but there are some interesting patterns in there which will no doubt help over time. One of the aforementioned operators purports to offer TPS screening as a service, despite not being a <a href="https://corporate.tpsonline.org.uk/subscribers">licensee</a> of the data. Curious in itself considering the other data points.</p>
<p>Nuisance calling is an ecosystem problem. Every network that tolerates it - through indifference, through fear of the support tickets that come with imperfect blocking, or because the margin on a spam machine is too nice - keeps the problem alive for everyone. Our experience says the fear is misplaced: block precisely, expire automatically, review everything, measure both error types, and bin abusers. The only question is whose network they land on next, and our stats already answer it.</p>
<p>We would be very interested to hear from other network operators who would be interested in a feed of what is blocked, especially what is blocked coming from their network.</p>
]]></content:encoded>
	</item>
	<item>
		<title>AI is an extinction-level event.</title>
		<link>https://simwood.com/2026/07/ai-is-an-extinction-level-event/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Fri, 17 Jul 2026 11:27:00 GMT</pubDate>
		<category><![CDATA[intelligent-solutions-us]]></category>
		<category><![CDATA[conversational-ai]]></category>
		<category><![CDATA[conversational-intelligence]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/ai-is-an-extinction-level-event/</guid>
		<description><![CDATA[AI is an extinction-level event. Just not for the people you think.]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-ai-is-an-extinction-level-event-f7558a3e30.png" width="1200" height="630" />
		<content:encoded><![CDATA[<p>Everybody in business seems to be having the same conversation about AI, and I think it's the wrong one. The question being asked in boardrooms everywhere is &quot;how many people can this replace?&quot;. That thinking is unbecoming and results in train wrecks.</p>
<p>Klarna is the poster-child for this. In early 2024 they announced, proudly, that their AI assistant was doing the work of 700 customer service agents. Fifteen months later the CEO was on record admitting that optimising for cost had produced lower quality, promising customers would always be able to reach a human, and hiring people again. But before anyone in telecoms enjoys that too much or takes any kind of affirmation from it: at least Klarna bothered to try. At least they moved, learned something expensive, and corrected.</p>
<p>By contrast, our industry cannot even be bothered to make the mistake. I've heard it said that &quot;AI is for our customers to build&quot;. They just don't get it - and here's the uncomfortable bit - even if they did get it, they couldn't act on it, because acting on it requires infrastructure and operations somewhere near this millennium. You cannot point intelligence at a business run on spreadsheets, fax-era processes and a billing system nobody dares touch. Well you can, but it is a much bigger ask, and a bigger roll of the dice by those who have proven effort- and risk-aversion.</p>
<p>My own conclusions came from having no choice. My recent health and long-standing family situation mean I don't have the luxury other CEOs take for granted any more, especially in respect of time and geo-mobility. The only way for me to compete is to be massively more productive in the hours I do have, and I'd argue I am, despite one hand tied behind my back. Automation and recently AI amplification is how: the mornings my inbox used to eat now belong to the work only I can do. I realised amplification works because I had to operate this way, and that lived experience is the whole philosophy in miniature - don't replace the human, amplify them, make them superhuman. If it does that for someone running with a handicap, imagine what it does for a whole team at full strength. Everything we've built recently reflects this.</p>
<p>What's been interesting, having arrived there out of necessity, is looking up and realising I'm not alone. Jensen Huang has been telling audiences &quot;you're not going to lose your job to an AI, but you're going to lose your job to someone who uses AI&quot; - true, though I'd go further, and will below. Erik Brynjolfsson gave the phenomenon a name years ago: the &quot;Turing Trap&quot; - build machines to imitate humans and the best you can ever achieve is a cheaper human; build machines to augment humans and you create things that were impossible before. Klarna walked straight into the trap. Much of the queue behind them is still shuffling forward.</p>
<p>And then there's the opposite camp, which is louder. Dario Amodei - whose company builds the very models we use, so hardly a luddite - warned that AI could eliminate half of all entry-level white-collar jobs within five years. On the narrow point he's probably right: if AI can do the meaty-medium tasks you used to hire junior people for, you'll need fewer junior people. But the bloodbath framing misses what happens at the other end, which is where the real story is.</p>
<p>We've been here before, incidentally. In weaving, the power loom was going to decimate employment in the mill towns - places with no other industry - and people smashed machines over the fear of it. What actually happened is one of the most instructive statistics in economic history: over the 19th century, automation removed 98% of the labour needed to weave a yard of cloth. Now you could read that as it took 98% of jobs but in fact by 1902 a single weaver minding 18 power looms produced 50 times what their predecessor had a century earlier. Employment should have collapsed by any replacement logic. Instead, not only did a single weaver achieve 50x more, but the number of weavers quadrupled between 1830 and 1900, because cloth got so cheap that demand exploded. That is a 200x improvement in output with an <em>expansion</em> of employment.</p>
<p>Of note, the people who were ruined weren't weavers as a class - they were the handloom weavers who kept doing it the old way while the world industrialised around them. Read that again with today's headlines and particularly telecoms in mind. The job didn't go extinct - it grew exponentially - but the people and businesses that refused the technology did.</p>
<p>A senior manager used to leverage themselves through a team of ten humans, and spent most of their week diluted across managing them - the coordination, the checking, the chasing. Give that same manager ten AI agents instead and the dilution disappears. They're not managing anymore, they're amplified: the judgement that made them senior applied at ten times the surface area. I made exactly this point to <a href="https://simwood.com/2026/04/welcome-raj-giving-the-revenue-engine-some-cylinders/">Raj, our CRO</a>, in our 1:1 last week. The conventional playbook says hire x more people to do back-office functions in support of account managers. The better answer is ten-plus agents doing the work agents can do, with the budget that would have gone on those hires spent instead on humans doing the things only humans can do - the relationships, the trust, the judgement. And here's the twist: as AI becomes ubiquitous, the human bits don't get less valuable, they get more valuable. Everyone will have the agents. Not everyone will have people freed up to be human. Replacement shrinks a business to save cost. Amplification multiplies what the same business can do, and redeploys the humans to where humans compound. These are not the same strategy, and they emphatically do not produce the same outcome.</p>
<p>This is running in both directions at Simwood - outwards in what we ship, and inwards in how we work.</p>
<p>Outwards, <a href="https://simwood.com/2026/07/introducing-conversation-intelligence/">Conversation Intelligence</a> is amplification made product. When a fraud signal fires mid-call and a whisper delivers guidance into the handler's ear, the AI hasn't taken the call off the human - it's made that human better at their job than they could ever be alone. The handler with an Operator watching their call is not a cheaper handler. They're a superhuman one.</p>
<p>Inwards is where it gets more interesting, because this is the part no customer will ever see. I wrote recently about <a href="https://simwood.com/2026/07/kaizen-that-remembers/">kaizen that remembers</a> - me and an agent doing a task together once, it documenting every decision as it's made, and it just happening from then on. These are the tasks where previous automation efforts couldn't quite reach. What started as email triage is now something closer to an operating system we're expanding across the business: standing rules, codified skills, memory that executes rather than a wiki that rots. I said to Charles only last week that there is little point newly humanising processes with internal portals and the like when we can liberate the human altogether to a level we couldn't imagine in our last round of automation - which itself led to the requirement for the button for the human to click. Our biggest wins are increasingly coming from the unglamorous internal plumbing - reconciliations, month-end, reporting, the thousand paper cuts of running a carrier - places nobody outside the business will ever see. Competitors won't see any of it, they'll just wonder, as they probably do now, how a company our size is this insanely productive, the same way they've spent a decade wondering how we run a network like ours with a team the size of ours.</p>
<p>But here's where it gets exponential, and where I think the extinction actually happens.</p>
<p>By my reckoning Simwood is 10 to 15 years ahead of our peers on infrastructure, and objectively 20 years ahead of those who prefer to invest in Ferraris to show (themselves) how successful they are. We've consistently been a generation or two ahead at every turn. Despite being significantly smaller than many of them, our margins are ahead of businesses <a href="https://simwood.com/2026/03/diseconomies-of-scale/">100 times our size</a> because our operation is more efficient - our <a href="https://simwood.com/2025/06/2024-financial-statements-and-strategic-report/">financial statements</a> are public if you want the receipts. That lead was built the slow way, over decades, a few percent at a time. And now we're ahead on AI adoption too - the <a href="https://simwood.com/2026/07/the-biggest-thing-weve-ever-shipped-and-almost-nobody-had-to-touch-it/">entire Conversation Intelligence platform</a> was designed, documented, built and shipped by a small team amplified in exactly the way described above. We could not have built it at all, under any previous model, with the team size we have.</p>
<p>Think about two cars that accelerate at the same rate, where one simply starts sooner. The second car never catches up - the gap is permanent even with identical performance. The follower can spend a lot more on a faster car - I mean literally invest in the business not themselves - and might gain a few percent faster acceleration. They can spend telephone numbers buying our customers too but the common thread is spending a lot more, in the often vain hope of catching up. In the old paradigm that could work in theory, although I've yet to see it in practice in telecoms.</p>
<p>However, now amplify the first car's acceleration ten, a hundred, a thousand-fold, because that's what AI adoption does to a team that already knows how to move - and remember the compounding: every rule written down, every skill codified, makes the next amplification cheaper. By the time the second car pulls away from the line, the first isn't merely ahead - it's over the horizon. The word &quot;race&quot; doesn't even apply and no realistic amount of money makes catch-up feasible.</p>
<p>I've been generous here in assuming the laggards recognise the need to even leave the start line, which, given some of them still don't have a usable API in 2026, and survive servicing <a href="https://simwood.com/2025/09/the-rise-and-fall-of-the-knuckle-dragger/">knuckle-draggers</a>, is quite the assumption.</p>
<p>So yes, I think AI is an extinction-level event. But the thing going extinct isn't the human's job, it is the businesses that can't move. Those businesses are the ones that are already inefficient, already a decade behind, already hanging on by their fingernails - the ones who could just about survive against competitors marginally better than them, but cannot survive against competitors 10, 100 or 1,000 times more efficient. Remember what happened to cloth prices - the laggards simply could not compete. Huang had it nearly right: you won't lose your job to AI, and your business won't lose to AI either. It will lose to a business that uses AI. The asteroid isn't aimed at your staff. It's aimed at your slower competitors, or - if you wait, or if you think AI is something your customers should build - at you.</p>
<p>Which brings me to the part that really excites me. This revolution is one where size doesn't matter; Simwood is proof of that. What matters is agility and adoption, and every one of our customers has both available to them. Since we launched Conversation Intelligence I've watched new businesses being formed on top of it, and existing customers genuinely getting it - taking what we've given them and developing their own propositions at a pace that would have been impossible in conventional times. The best part: they're augmenting their own people with AI in order to build on the AI capabilities we've handed them. Amplification stacked on amplification. That's the exponent doing its work, and it's available to a two-person startup just as readily as to us.</p>
<p>I genuinely think we're only years away from a trillion-dollar company, run by a single person. The asteroid has already hit. The only question left is whether you made it outside the crater. Your move.</p>
]]></content:encoded>
	</item>
	<item>
		<title>The Slough incident that nearly was</title>
		<link>https://simwood.com/2026/07/the-slough-incident-that-nearly-was/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Fri, 17 Jul 2026 10:36:00 GMT</pubDate>
		<category><![CDATA[commercial]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/the-slough-incident-that-nearly-was/</guid>
		<description><![CDATA[At 14:27 on July 13th 2026 a host in Slough died the way hardware does: no warning, no way back. For once, the architecture built to shrug this off didn't entirely — and the reason wasn't the hardware. Here's exactly what happened, what our customers saw, and what we're changing so it can't happen again.]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-the-slough-incident-that-nearly-was-c6f9be5fd6.png" width="1200" height="630" />
		<content:encoded><![CDATA[<p>Three weeks ago I wrote about<a href="https://simwood.com/2026/06/the-slough-incident-that-wasnt/"> an entry on our status page</a> that nobody needed to worry about: a fibre cut in Slough that rerouted in under a second and cost nobody a single call. Prior to that I wrote about a similar incident in Volta where <a href="https://simwood.com/2024/05/the-outage-that-wasnt/">two legs of our network were cut</a> - same non-event.</p>
<p>The point of writing about these, as I said at the time, is that they're the only way to show the work and investment behind an architecture that's designed to survive this stuff. I do so not to gloat (although some will disagree) but because it is a genuine point of differentiation and I live in no small hope that those who have other priorities for investment (Ferrari-cough, cuddly-dogs-cough) might be motivated to up their game. This industry improving benefits us all, not least end-users and our customers who cannot solely depend on us in an industry that is by its very nature interdependent.</p>
<p>I write now because you’ll see another entry on our status page for Monday (<a href="https://status.simwood.com/incidents/fxb540rh5p98">13 July 2026</a> if you’re reading this in the future) relating to our Slough Availability Zone (AZ). It might have cost some of you a portal login, an API call, or a chunk of an afternoon trying to update your locked balance; or you might not have noticed. It is more likely you did notice because this actually affected some services ancillary to our main services - actual call volumes were normal and not a single 999 call failed (we specifically alert on that, however caused). There’s learning here for us though, and everything I said above would be hypocrisy if we didn’t similarly share. I’d also sooner you heard the truth from source rather than a distortion from a Mustard Moron in some dark corner at the CCUK Christmas party. </p>
<p>So… there are four factors at play here that set some context: </p>
<ul>
<li>Firstly we’ve been refreshing hardware around the network. You won’t have noticed because that’s how we’re designed. The London AZ, the Manchester AZ, Newport which isn’t an AZ but regrettably still exists - all done. Slough, next on the list and thus still running old gen hardware and build. </li>
<li>Secondly, you’ll have seen us talk about new auth and you’ll have probably seen that relating to the API already in the portal and you may even be using it. The portal itself hasn’t been moved across yet - for you at least, we’re using it in staging. That means it is dependent on an API you’ve never heard of (v4) which should never have existed and was written way back in the day by a French man - our resident chaos monkey, a title he’ll still be proud of - because he was fed up of waiting on another former colleague to make the changes he needed to API v3 - the one you do know and love. It has sat as middleware for selected portal functions (like login) for way too long. v4 is completely replaced by the <a href="https://simwood.com/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">new API architecture</a>, which I’ll call v5 for simplicity even though it introduces independently versioned services starting at v1. So v4 never existed and v1 comes after v3; with me so far? Good.</li>
<li>Thirdly, we rely heavily on DNS for global service discoverability where local load-balancing or internal anycast can’t cut it. For that we use DNSMadeEasy and in particular their <a href="https://constellix.digicert.com/">Constellix</a> product which allows automatic failover of records and we’re hooked into its API for dynamic updates. They used to happen within the TTL (15 seconds) which was great. Constellix was bought by Digicert in 2022 and it's apparent their standards have deteriorated.</li>
<li>Lastly, we recently parted ways with a long-serving and very capable engineer. That left gaps in ownership and institutional knowledge we hadn't fully backfilled - which matters below.</li>
</ul>
<p>That's the context. I hasten to add <em>not</em> excuses, the ownership comes later!</p>
<p>So, at 14:27, an old host in our Slough AZ died. Not gracefully - disk I/O error, no IPMI, no way to even power-cycle it remotely. It was one of the older boxes on the estate, with less monitoring wired into it than anything we've bought in the last few years, and it had passed a health check a month earlier. It just went, the way hardware does, with no warning anyone could have acted on. </p>
<p>But that is what we plan for and nobody outside of our DevOps team should have noticed. Other hosts have failed the same way more than once this year and it's been a non-event every time, because they're on current hardware with proper out-of-band management and deployed to our current standards. This one wasn't, and that's the actual story here.</p>
<p>We have hundreds of container images, deployed dozens of times in some cases, making for a large estate. Within AWS we use Kubernetes to orchestrate this, but in our three on-net UK AZs, they use Docker with our own network stack. This is something I’ve blogged and presented on many times in the past as, uniquely, a container is a first class citizen on the network, speaks BGP to its host, pushes its own firewall rules to the edge etc. etc. All good but a lot to orchestrate and therefore we have strict policies around deployment to ensure availability between AZs and across hosts within an AZ. Anycast makes light work of this for many things - just run them everywhere - other things such as our database of record Galera is a cluster with a node per AZ, ElasticSearch is sharded and distributes shards according to its own strict policy and so on. We also make enormous use of Redis - like 500,000 requests a second levels of use - around the network. Read nodes are anycasted so everything consumes it closest, often local, usually on the same box, for minimum latency. If you know Redis though you’ll know it has a single master under which everything else is a slave. To manage the master-candidates around the network we use Sentinel, which seamlessly promotes a new master and ensures everything uses it. Much code is hooked in to use Sentinel to benefit from this but certain code which can’t instead uses DNS which is updated automatically on a state change.</p>
<p>The box that died had all of the above on it, as well as loads of other services. They all, even Galera, did what they should and just got handled. Manchester and London AZs, as well as the many on AWS, and our Global Edge, all continued completely uninterrupted exactly as they should. That is worth celebrating I think because I don’t think any of our competitors would have gone without a major outage losing primary database nodes, let alone primary nodes across dozens of services. But this isn’t about them, and we hold ourselves to a higher standard.</p>
<p>What didn’t work was Redis. Sure, the slaves carried on working, as designed, which is why other sites didn’t skip a beat and why call volumes remained normal (voice runs on different hosts altogether - Voice Compute Nodes (VCNs) vs Compute Nodes (CNs) in our parlance), but nothing could write to the master because Sentinel hadn’t failed over. Also, a load of services which rely on Sentinel to discover the new master failed to connect because there simply wasn’t one - the old one was in Slough on a host which was now dead. It's fair to say all hell broke loose in Slough and a cascade of weirdness ensued.</p>
<p>Notably portal logins failed on Carrier Services because API v4 couldn’t connect to Redis. Portal logins failed on Hosted for similar but independent reasons. API endpoints like ‘calls in progress’ stopped working because call events weren’t being processed and customers relying on the balance-update endpoint were understandably concerned, since the API writes to Redis as well as Galera and couldn't. It didn’t matter though because millions of CDRs weren’t being billed because requisite services couldn’t reach Redis. Finally, we also lost a SIP proxy in Slough which was wrongly deployed on the Compute Node which had failed, but I’ll return to that.</p>
<p>On investigation we found out that Sentinel didn’t exist anymore. Rather than existing in every site per our spec, it only existed in Slough on the old host which had failed. Let's say that was an ownership problem in origin - Sentinel hadn't been deployed elsewhere as hosts had been upgraded, so Slough was the only node. I believe in decentralised command - or trusting people to do their job - especially where people are technically so capable, but the reality is you can’t delegate accountability and we did. We have to own that and make sure it can’t happen again.</p>
<p>In terms of mitigation, we didn’t just want to stand up a new Sentinel with unknown consequences for the now unmanaged cluster so we promoted a new master manually. That triggered a DNS update but the services which use DNS for discovery of the write node didn’t update. It turns out that despite a 15 second TTL, Constellix took over 30 minutes to push the change out. Digicert’s support team wasn't aware of the product last time we contacted them recently and we were in the middle of forcing changes in other ways when the change took. That left the other services which consumed Sentinel in order to discover the write node; Sentinel which wasn’t there anymore. They needed patching, testing and deploying one-by-one to resolve. That had to be done in priority order and meant some things, themselves 2 minute fixes, took longer to resolve than they otherwise would have done. </p>
<p>Out of hours after the incident we redeployed Sentinel and, with appropriate escape routes in place, let it control the cluster. It did so with the poise and lack of drama we know and love it for, and which it would have done during the day had it been there.</p>
<p>That covers pretty much all the weirdness customers saw with two exceptions. </p>
<p>The first was “calls in progress” and “locked balances”. The latter was a simple case of Redis writeability being restored and that was one of the earlier services to be fixed. However, customers polling the calls in progress endpoint and firing off updates to locked balances were seeing an out of date balance simply because calls in progress wasn’t updating - a low priority thing to address. It wasn't low priority to them as they believed they’d run out of credit any second or that their change hadn’t worked; even when writability was back and CDRs were catching up, they were updating their locked balance to an impossible figure by virtue of decrementing a historic figure.</p>
<p>The second was the outbound carrier proxy in Slough. The customer facing proxy was working as was the rest of the stack but on the way out of the network there is another edge proxy in every AZ. We knew this was down from our monitoring, and some customers in Community Slack even told us, but it was low priority as voice calls were working fine according to our own automated testing and volumes. In days gone by the very first thing we’d have done in an incident like this is modify DNS to fail traffic away from the affected AZ, regardless. On this occasion we didn’t and that was a mistake, even though it would have been far more latent than designed due to Constellix issues. When a new carrier proxy was deployed onto the VCNs, the correct home, Slough was back to 100% even with the other Redis based issues. I stand by our record since 2018 that voice continued working across the network as other sites were unaffected and even Slough telemetry was fine. However, we did have a couple of tickets from sensible customers who experienced odd issues and we owe it to them to work through those thoroughly and mitigate them in future if there is a way of doing so.</p>
<p>There are two books I love. The first, Black Box Thinking, contrasts airlines with healthcare in terms of how one learns from mistakes and the other covers them up. I’m determined we’re more like the airlines and continue to improve wherever we can, and like the airlines, share that knowledge. The other one is Extreme Ownership by Jocko Willink. Jocko recorded the intro for the SimCon just before the pandemic for those who were there. I hope this post demonstrates how we embrace his teachings. One of his expressions is “discipline is freedom” which I think really captures the true root cause here. Yes, it was a Redis failure resulting from a hardware failure, but that was designed out of being a problem 10+ years ago. The reality is that for all the designs, and playbooks and testing, we ultimately relied on someone to do their job. The fact he took shortcuts is our problem and we should have identified and remedied them before they had an opportunity to cause an issue. The spine running through all of that is a lack of discipline.</p>
<p>There are a few lessons and actions here which we’re applying or have already applied:</p>
<ul>
<li>Sentinel is everywhere, per the design</li>
<li>Services which were patched to bypass Sentinel are being corrected and redeployed</li>
<li>We need to look at DNS to find an alternative or at least mitigation for Constellix. We already use another dynamic DNS provider for our Kubernetes services.</li>
<li>We need to investigate and address those presumably carrier proxy derived edge cases.</li>
<li>We need to fail-over DNS away from affected sites in such an incident in future, as we used to, rather than being overconfident in the local redundancy in place.</li>
<li>The staging portal will be rolled out to customers ASAP, enabling v4 API to be retired.</li>
<li>The chaos monkey role is very helpful and we’ve missed the sharpness having one causes. The longer stuff works, the more scary it breaking becomes and the rustier you are at responding. We intend to program in regular datacentre visits (even if no work is planned) and part of their function will be to trigger failures, to test redundancy and keep everyone sharp. Impending legislation requires annual reboots anyway so this is a necessary direction of travel everyone will have to take.</li>
<li>Containerisation, as I’ve opined many times before, ensures every version of every container is identical, which was a massive win for us a decade or more ago. We can’t have an instance like some of our peers where two magic boxes have different manual configurations. But, only policy directs the placement of those containers and requires them not to be changed without going through a change control and deployment process. It is very clear we need to use some of the amazing tools at our disposal now to enforce that policy. We will have a single pane of glass, separate to monitoring, which visually enforces our policy and would have told us that Sentinel wasn’t compliant with it in terms of running instances and their placement, with the bonus of verifying the signature of the code running to affirm it hasn’t been “hot fixed” since deployment. That wasn’t an issue here but could have been and can be easily mitigated at the same time. Exposing policy violations enables them to be addressed when it isn’t an emergency and necessary changes made to ensure they don’t happen again. As we say in Bitcoin: trust, but verify. </li>
<li>Slough upgrades are being prioritised to complete the rollout.</li>
</ul>
<p>I hope that provides some assurance and explanation to all those who wondered what was going on. This isn’t an RFO as the O didn’t happen, but it was far closer to happening than we’ve been in a long long time and shouldn’t have been. We pride ourselves on our architecture and technical performance so flog ourselves more than anyone outside ever could. We appreciate you trusting in us to do so.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Carrier Services rate update (2026-07-24)</title>
		<link>https://simwood.com/rates/</link>
		<pubDate>Thu, 16 Jul 2026 17:03:00 GMT</pubDate>
		<guid isPermaLink="false">https://simwood.com/rates/#1784221380000</guid>
		<description><![CDATA[We will be updating our Managed A-Z Termination rates and codes on July 24th 2026. As usual, these changes are colour-coded in our full rate files available through the portal as below. Where your account has custom rates, these are now reflected in…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/pages-rates-0081360f96.png" width="1200" height="630" />
		<content:encoded><![CDATA[<p>We will be updating our Managed A-Z Termination rates and codes on <strong>July 24th 2026.</strong></p>
<p>As usual, these changes are colour-coded in our full rate files available through the portal as below. Where your account has <a href="/2024/04/custom-rates/">custom rates</a>, these are now reflected in the rate files. Remember, if you'd like more granular prefixes (inc. NPA-NXX) or a more compact rate file, <a href="/2023/08/more-call-tariff-options-including-npa-xx/">we've got you covered</a>.</p>
<p>Unlike other operators, we are not passing on UK origin surcharges, relying instead on our advanced technology to protect you and us from this industry's latest sleazy money-grab. We will maintain this position as long as possible so our customers do not need to worry.</p>
<p><strong>Rate files</strong>
Full rate sheets with codes are now only available through the <a href="https://portal.simwood.com/">portal</a> or from our <a href="https://developer.simwood.com/docs/wholesale/api/v3/">API</a> for active customers. Once logged in to the portal you can find them in the &quot;commercial&quot; section.</p>
<p>The SMS A-Z rate sheet is now available on our portal or via API.</p>
<p>Please contact our sales team if you are not a customer and would like to see our rates.</p>
<p><strong>Ancillary charges (inc. SMS &amp; fax)</strong>
Our charges for ancillary services can be found <a href="https://cdn.simwood.com/docs/simwood_ancillary_charges.pdf">here</a>.</p>
<p><strong>100% SLA</strong>
Our Service Level Agreement (SLA) for our UK carrier services customers is a guarantee of 100% Simwood service availability. Read more <a href="https://cdn.simwood.com/docs/simwood_SLA.pdf">here</a>.</p>
<p><strong>MSA</strong>
Our MSA is <a href="https://cdn.simwood.com/docs/simwood_msa.pdf">here</a>.</p>
<p><strong>Acceptable use policy</strong>
Our AUP is <a href="https://cdn.simwood.com/docs/simwood_aup.pdf">here</a>.</p>
<p><strong>Hardware supply schedule</strong>
Our Hardware supply schedule is <a href="https://cdn.simwood.com/docs/hardware_%20supply_schedule.pdf">here</a>.</p>
<p><strong>Hosted pricing</strong>
Looking for Hosted pricing? Click <strong><a href="/hosted-price-plans/">here</a></strong>.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Internal documentation that actually gets used: ADRs, MCP servers, and AI-accessible knowledge</title>
		<link>https://simwood.com/2026/07/internal-documentation-that-actually-gets-used-adrs-mcp-servers-and-ai-accessible-knowledge/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 15:00:07 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/internal-documentation-that-actually-gets-used-adrs-mcp-servers-and-ai-accessible-knowledge/</guid>
		<description><![CDATA[Part 12 of 12 – Conversation Intelligence Platform series Back to Part 1 There’s a category of engineering problem that doesn’t show up in postmortems or sprint reviews: the slow accumulation of undocumented decisions. Nobody documents the decision in the…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-internal-documentation-that-actually-gets-used-adrs-mcp-servers-and-ai-accessible-knowledge-a3d507af3f.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 12 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">There&#8217;s a category of engineering problem that doesn&#8217;t show up in postmortems or sprint reviews: the slow accumulation of undocumented decisions. Nobody documents the decision in the moment because the context is obvious &#8211; everyone involved knows why. Some time later, that context is gone, and someone makes the same mistake again, or undoes something that was done deliberately, or spends days rediscovering reasoning that exists somewhere in a Slack thread from years ago.</p>



<p class="wp-block-paragraph">I actively monitor our developer Slack channels. It&#8217;s not unusual to see someone &#8220;fixing&#8221; something that is apparently obviously wrong and very much was done that way for a reason &#8211; a reason that would have been right in front of them if it had been recorded anywhere. In our case, &#8220;some time later&#8221; can mean twenty years later. The decisions made in the early days of the platform are still embedded in the codebase, often with no trail left to explain why. This is a cost that compounds, quietly, for as long as the product lives.</p>



<p class="wp-block-paragraph">Architecture Decision Records (ADRs) are the tool the Simwood engineering team now uses to stop that accumulation.</p>



<p class="wp-block-paragraph">An ADR is a short structured document that records a decision: what was decided, what the alternatives were, what the reasoning was, and what the follow-on questions are. Written at the time the decision is made. Stored in the codebase alongside the code it relates to. Never deleted &#8211; only superseded, with a link to the successor.</p>



<p class="wp-block-paragraph">This might sound like bureaucracy. It is not. A well-written ADR takes perhaps twenty minutes to produce. In return, it gives any future engineer the ability to understand why the codebase looks the way it does. The auth model uses <a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">ForwardAuth</a> claims injection for a specific reason &#8211; documented in an ADR. The <a href="/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">Keycloak migration</a> is being done via bulk import rather than on-demand provisioning for a specific reason &#8211; documented in an ADR. These decisions exist. Without ADRs, they exist only in memory. With ADRs, they&#8217;re searchable.</p>



<p class="wp-block-paragraph">ADRs are internal. They contain implementation details, open questions, and reasoning that isn&#8217;t relevant to API consumers. They&#8217;re not published at <a href="https://docs.simwood.com">docs.simwood.com</a>; they live in the internal platform docs repository, alongside architecture briefs and service guides that are equally internal.</p>



<p class="wp-block-paragraph">The simwood-docs MCP (Model Context Protocol) server makes this internal documentation queryable by AI agents working on the Simwood codebase. When an AI is helping an engineer work on a service, it can consult the ADRs directly rather than working from first principles or from assumptions about what might have been intended. &#8220;Is there a recorded decision about how API key revocation is handled?&#8221; should have an answer, not require trawling Slack history or asking whoever was there at the time.</p>



<p class="wp-block-paragraph">This is a specific, practical consequence of documentation-first development. The investment in writing good ADRs pays off here in a concrete, immediate way: the AI can reason about decisions that have been recorded, and it can flag when it encounters something that appears inconsistent with a recorded decision. It&#8217;s also why <a href="/2026/07/the-ai-accelerated-build/">Part 2</a> describes AI as integrated into the development process rather than just assistive &#8211; the documentation is the context that makes that integration work.</p>



<p class="wp-block-paragraph">There&#8217;s an onboarding benefit too. When a new engineer joins and asks &#8220;why does the auth model work this way?&#8221; &#8211; the answer should not be &#8220;ask Charles.&#8221; The answer should be: &#8220;Read this ADR.&#8221; That&#8217;s it. Question answered, without involving anyone else&#8217;s time.</p>



<p class="wp-block-paragraph">The discipline of recording decisions as they&#8217;re made is not natural. Most engineers find it easier to get on with building. What Charles and his team have demonstrated is that the upfront investment &#8211; writing the brief before the code, recording the decision before moving on &#8211; pays back quickly and compounds over time. The codebase is more navigable. The AI assistance is more accurate. New team members get productive faster. The institutional knowledge that would otherwise walk out the door when someone leaves is preserved in a form that stays.</p>



<p class="wp-block-paragraph">The template for adding a new service &#8211; the checklist, the ADR format, the guide structure &#8211; also lives in the internal docs. Which means the process of adding a new service is itself documented, followable without asking anyone, and improvable over time.</p>



<p class="wp-block-paragraph">This is the last post in the series. If you&#8217;ve read all twelve, you now understand something that I think matters: the platform isn&#8217;t just the Conversation Intelligence features, and the features aren&#8217;t just code. They&#8217;re the product of a process &#8211; documented before it was built, AI-integrated throughout, decisions recorded so they can be found &#8211; that we think is genuinely better than how most engineering is done. We&#8217;ll find out whether that&#8217;s right over the next decade.</p>



<p class="wp-block-paragraph">For now: the platform is live, the docs are real, and the APIs work. If you&#8217;re building on it, we want to hear how it goes.</p>



<p class="wp-block-paragraph"><em><a href="/2026/07/documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar/">Previous: Part 11 &#8211; Documentation as a product</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1 &#8211; series index</em></a></p>

]]></content:encoded>
	</item>
	<item>
		<title>Documentation as a first-class product: narrative guides, live OpenAPI, and Scalar</title>
		<link>https://simwood.com/2026/07/documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 14:56:42 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar/</guid>
		<description><![CDATA[Part 11 of 12 – Conversation Intelligence Platform series Back to Part 1 Most API documentation in telecoms is a reference dump. A list of endpoints. Parameters, types, response codes. If you’re lucky, an example. If you’re very lucky, an…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar-e2d32cddb6.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 11 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">Most API documentation in telecoms is a reference dump. A list of endpoints. Parameters, types, response codes. If you&#8217;re lucky, an example. If you&#8217;re very lucky, an example that actually works.</p>



<p class="wp-block-paragraph">This is not adequate. A reference is useful when you know what you&#8217;re looking for. It is nearly useless when you&#8217;re trying to understand how something works, why it works that way, or how to combine capabilities to achieve something real. Developers who hit a reference dump when trying to figure out a new platform spend the first hour reading the same three sentences over and over and then go to find someone to ask. That&#8217;s a failure of documentation design, not developer competence.</p>



<p class="wp-block-paragraph">The restructured docs site at <a href="https://docs.simwood.com">docs.simwood.com</a> is built on a different principle: reference is for lookup, guides are for learning. They are different things and should be written, maintained, and presented as different things.</p>



<p class="wp-block-paragraph">The structure separates the two cleanly.</p>



<p class="wp-block-paragraph">Platform-level guides cover things true across all services: how authentication works, how the gateway model works, how versioning and deprecation work, what error conventions to expect. These don&#8217;t belong to any single service &#8211; they&#8217;re the foundation. You read them once, early.</p>



<p class="wp-block-paragraph">Per-service structure gives each service its own section: a service overview (what it does, when to use it), narrative guides covering the core workflows and patterns, an API reference generated directly from the live OpenAPI spec, and code examples. The narrative guides are hand-authored; the reference is auto-generated. Both are updated when the service changes &#8211; the reference automatically, the guides by the team responsible for the service.</p>



<p class="wp-block-paragraph">The principle that drives this split: if a piece of documentation is explaining why something works the way it does, it&#8217;s a guide. If it&#8217;s specifying a parameter name and its type, it&#8217;s reference. Mixing the two produces something that&#8217;s bad at both.</p>



<p class="wp-block-paragraph">The interactive explorer is worth spending a moment on, because it changes how you work with documentation.</p>



<p class="wp-block-paragraph">Every service in the docs portal is served via <a href="https://scalar.com">Scalar</a> &#8211; a modern API reference UI with a live &#8220;try it out&#8221; capability. You enter your API key directly into the explorer, choose an endpoint, fill in the parameters, and send the request. The response comes back in the browser. You don&#8217;t need to open a terminal, construct a curl command, or paste values between windows. You can explore a new endpoint in thirty seconds.</p>



<p class="wp-block-paragraph">This sounds like a quality-of-life detail. It isn&#8217;t. The gap between &#8220;I can read what this endpoint does&#8221; and &#8220;I have seen this endpoint work against my actual account&#8221; is enormous in terms of developer confidence. Reducing that gap to thirty seconds changes how quickly new developers get productive and how much time the support team spends answering questions the docs should have answered already.</p>



<p class="wp-block-paragraph">Real keys, real requests, real responses, in the browser, without setup. That&#8217;s the bar.</p>



<p class="wp-block-paragraph">The technical implementation reflects the independent service architecture described in <a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">Part 8</a>. Each service exposes its own OpenAPI spec at /{service}/{version}/openapi.json. The spec is the authoritative contract for that service, owned by the team responsible for it, published automatically on merge. The documentation portal reads the live spec URL rather than a copy &#8211; which means the reference is always in sync with what&#8217;s actually deployed. The usual failure mode for API documentation &#8211; it describes a version of the API that no longer quite matches what&#8217;s running &#8211; is eliminated.</p>



<p class="wp-block-paragraph">Adding a new service to the docs portal is a single entry in the service registry file. No restructuring required.</p>



<p class="wp-block-paragraph">We&#8217;re not writing this post to claim the docs are perfect. We&#8217;ve historically been terrible at documentation and our customers have forgiven us more often than we deserved. What we&#8217;re committing to is the principle: documentation is a product. It gets investment, it gets maintained, it has ownership. The alternative &#8211; reference dumps six months out of date, no narrative guidance at all &#8211; isn&#8217;t where we&#8217;re going.</p>



<p class="wp-block-paragraph">Developers talk about documentation. Not in formal surveys &#8211; in Slack, on community forums, in comments on posts like this one. &#8220;The docs are actually good&#8221; is a competitive differentiator in the developer tools market, and it&#8217;s one that takes sustained commitment rather than a single sprint. We&#8217;re sustaining it.</p>



<p class="wp-block-paragraph"><a href="/2026/07/deprecation-as-a-feature/"><em>Previous: Part 10 &#8211; Deprecation as a feature</em></a></p>



<p class="wp-block-paragraph"><em><a href="/2026/07/internal-documentation-that-actually-gets-used-adrs-mcp-servers-and-ai-accessible-knowledge/">Next: Part 12 &#8211; Internal documentation that actually gets used</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to series index</em></a></p>

]]></content:encoded>
	</item>
	<item>
		<title>Deprecation as a feature: how we migrate a 200-endpoint API without breaking customers</title>
		<link>https://simwood.com/2026/07/deprecation-as-a-feature-how-we-migrate-a-200-endpoint-api-without-breaking-customers/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 14:53:29 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/deprecation-as-a-feature-how-we-migrate-a-200-endpoint-api-without-breaking-customers/</guid>
		<description><![CDATA[Part 10 of 12 – Conversation Intelligence Platform series Back to Part 1 “We’re retiring this endpoint” is a statement that has earned its bad reputation. In practice it usually means: we decided internally to stop supporting something, gave you…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-deprecation-as-a-feature-how-we-migrate-a-200-endpoint-api-without-breaking-customers-e4db14017e.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 10 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">&#8220;We&#8217;re retiring this endpoint&#8221; is a statement that has earned its bad reputation. In practice it usually means: we decided internally to stop supporting something, gave you as little notice as legally necessary, and your integration broke on a date you may or may not have noticed in an email you may or may not have read.</p>



<p class="wp-block-paragraph">We&#8217;ve been on the receiving end of that. It&#8217;s rubbish. So when it came to migrating 200 endpoints out of a monolithic API into independent services, we had to decide what &#8220;done well&#8221; actually looks like &#8211; and then commit to it publicly, which is what this post is.</p>



<p class="wp-block-paragraph">The policy is straightforward. When a v3 capability is re-expressed as an independent service, the corresponding v3 endpoints are deprecated. From the day the successor service is published, there is a minimum 12-month window before those v3 endpoints are retired. During that window, every response from a deprecated endpoint carries two headers:</p>



<pre class="wp-block-code"><code>Sunset: 2027-06-04

Deprecation: true

Link: &lt;https://api.simwood.com/voice/v1&gt;; rel="successor-version"</code></pre>



<p class="wp-block-paragraph">The Sunset header gives the exact date the endpoint stops working. Deprecation: true makes it machine-detectable &#8211; your monitoring can alert on it if you want. The Link header points directly to the successor. Your HTTP client library probably already supports parsing these; many logging and observability tools do too.</p>



<p class="wp-block-paragraph">The 12-month window is a minimum, not a target. If migration turns out to be complex for a significant portion of customers, we extend it. The point is not to get to the end of the window as fast as possible; it&#8217;s to give customers enough runway to migrate without it becoming a crisis.</p>



<p class="wp-block-paragraph">The v3 decomposition covers twelve target services. In priority order: Conversational AI, WhatsApp, and Messaging first (already thin proxies in front of independent backends, so re-fronting them is lowest risk). Voice, Numbers, and Billing next (higher-change, higher-visibility, larger contracts). Then Porting, Lookup, Account, and the Platform Connect carrier services &#8211; BYOC, Operator Connect &#8211; as capacity allows.</p>



<p class="wp-block-paragraph"><a href="/2026/07/introducing-conversation-intelligence/">Conversation Intelligence</a> (/intelligence/v1) is already live as the reference implementation &#8211; the first service that went through this whole process, which is why it&#8217;s the right model for everything that follows.</p>



<p class="wp-block-paragraph">I want to say something about the principle here, not just the mechanics.</p>



<p class="wp-block-paragraph">To be straight about the context: the API deprecation framework described here is relevant to the industry with APIs. Much of the telco industry doesn&#8217;t have APIs at all &#8211; some carriers we deal with have barely moved beyond fax. We&#8217;re not talking about them. We&#8217;re talking about what good looks like when you&#8217;ve committed to building something developers can rely on, and deprecation policy is one of the clearest tests of that commitment.</p>



<p class="wp-block-paragraph">The way we think about deprecation is that it&#8217;s a statement of care, not abandonment. &#8220;We&#8217;ve built something better and we&#8217;re telling you about it with enough lead time to move&#8221; is a fundamentally different message from &#8220;we&#8217;ve decided to stop doing this, good luck.&#8221; The 12-month window, the machine-readable headers, the direct link to the successor &#8211; these are details that add up to a developer experience that treats customers as if their time matters.</p>



<p class="wp-block-paragraph">Practically: the <a href="https://docs.simwood.com">API documentation</a> shows the current status of every service and endpoint. Deprecated endpoints show the Sunset date and the successor link. New integrations should use the independent service APIs rather than v3 for anything where a service equivalent exists.</p>



<p class="wp-block-paragraph">If you&#8217;re currently using v3 endpoints that are in the deprecation queue, you&#8217;ll hear from us directly well ahead of the Sunset date. We&#8217;re monitoring gateway logs for usage of deprecated endpoints and will reach out proactively to any customer who hasn&#8217;t migrated as the window approaches.</p>



<p class="wp-block-paragraph">The goal is that nobody&#8217;s integration breaks unexpectedly. That is a solvable problem if you take it seriously enough to commit to the process. We&#8217;re committing.</p>



<p class="wp-block-paragraph"><em><a href="/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">Previous: Part 9 &#8211; Authentication done right</a></em></p>



<p class="wp-block-paragraph"><em><a href="/2026/07/documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar/">Next: Part 11 &#8211; Documentation as a product</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to series index</em></a></p>

]]></content:encoded>
	</item>
	<item>
		<title>Authentication done right: API keys, OIDC, and the end of Basic Auth</title>
		<link>https://simwood.com/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 14:51:22 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/</guid>
		<description><![CDATA[Part 9 of 12 – Conversation Intelligence Platform series Back to Part 1 Authentication is one of those things where the gap between “works” and “done right” is enormous and mostly invisible until something goes wrong. This post is about…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth-3805dedf16.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 9 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">Authentication is one of those things where the gap between &#8220;works&#8221; and &#8220;done right&#8221; is enormous and mostly invisible until something goes wrong. This post is about what &#8220;done right&#8221; looks like for a platform serving developers, the browser portal, and native apps simultaneously &#8211; and what&#8217;s changing for existing customers. <em>Quick note on availability: the new platform and Conversation Intelligence API are currently in beta, available to customers enrolled in the carrier services beta programme. API keys are live now. Portal login via OIDC is the next stage.</em></p>



<p class="wp-block-paragraph">The platform is designed around three authentication mechanisms. All three are handled by the ForwardAuth shim described in <a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">Part 8</a>. All three produce identical claims headers before the request reaches any service. Downstream services have no idea which mechanism was used.</p>



<p class="wp-block-paragraph"><strong>Bearer API keys</strong> are for machine integrations &#8211; server-to-server calls, automation, CI pipelines. Keys carry scopes at issuance; a key issued with intelligence:read can read Intelligence API resources and nothing else. Keys are stored hashed &#8211; the plaintext key is shown once at issuance and never again. Revocation takes effect within one sync cycle, approximately one minute.</p>



<p class="wp-block-paragraph"><em>This is what&#8217;s live now.</em></p>



<p class="wp-block-paragraph"><strong>Bearer JWTs via Keycloak</strong> are for the portal and native apps. The portal uses OAuth 2.0 Authorization Code flow with PKCE &#8211; that&#8217;s Proof Key for Code Exchange, not passkeys (a different and newer standard). PKCE is an OAuth 2.0 extension that prevents authorization code interception: rather than relying solely on a client secret, it adds a cryptographic challenge-and-verifier pair generated fresh on each login attempt, so intercepting the authorization code alone isn&#8217;t enough to get tokens. The access token lives in memory &#8211; not localStorage &#8211; and the refresh token lives in an httpOnly cookie. This is current best practice for browser-based apps: it prevents XSS token theft while keeping session management clean. Native apps use the same OIDC flow but store tokens in the device secure enclave (Keychain on iOS, Keystore on Android), with credentials entered in the system browser rather than the app itself.</p>



<p class="wp-block-paragraph"><em>This is the next stage &#8211; rolling out shortly after launch.</em></p>



<p class="wp-block-paragraph"><strong>Basic Auth</strong> remains only for the legacy v3 Wholesale API credentials, as a transitional bridge. It is not a platform authentication mechanism and is not available on any new service endpoint. Once the portal Keycloak migration completes and all customers have issued API keys, the v3 Basic Auth bridge will be retired.</p>



<p class="wp-block-paragraph">The ForwardAuth shim distinguishes these mechanisms by prefix and delegates accordingly. Both paths inject the same claims headers before the request proceeds &#8211; account ID, scopes, tier, key identifier. A service should never need to care how a request was authenticated. Its job is to enforce scope and execute business logic, not understand credential formats. The gateway enforces that separation.</p>



<p class="wp-block-paragraph">Scopes follow the pattern<code> resource:action.</code> Examples:</p>



<pre class="wp-block-preformatted">intelligence:read   intelligence:write
reporting:read      account:admin</pre>



<p class="wp-block-paragraph">Scopes are stored on the key record at issuance and included in the claims on every validated request. Services check scopes before executing any operation. A request attempting a write without the appropriate write scope gets a 403 with a clear error indicating the missing scope.</p>



<p class="wp-block-paragraph">The scope taxonomy is defined per-service, with each service introducing its own scope root when it&#8217;s added to the platform. Account-level scopes are the baseline every account receives; all other service scopes are product-gated. This is how the platform ensures that a Conversation Intelligence API key can&#8217;t accidentally &#8211; or deliberately &#8211; access Billing data.</p>



<p class="wp-block-paragraph">The Keycloak portal migration will affect existing users when it rolls out. The portal currently authenticates via a custom login flow with credentials stored in localStorage. That will be going away. The replacement is Keycloak running at auth.simwood.com, handling the login UI, credential validation, and token issuance with Simwood branding. For existing portal users, the migration will involve a bulk import of existing credentials into Keycloak and an invitation to set a new password. Once cutover, the old login flow is gone and Keycloak is the only entry point. We&#8217;ll communicate directly with all portal users ahead of the switchover.</p>



<p class="wp-block-paragraph">The security improvement is real. Credentials in localStorage are vulnerable to XSS. Access tokens in memory are not. httpOnly cookies for refresh tokens are not directly accessible to JavaScript at all. This is not a theoretical improvement.</p>



<p class="wp-block-paragraph">For developers building against the platform: if you&#8217;re currently using Basic Auth against v3, nothing changes immediately. You have a minimum <a href="/2026/07/deprecation-as-a-feature/">12-month window from the deprecation notice</a> to move to an API key. Your existing integrations continue working during that window. New integrations against new services use API keys from day one. Basic Auth is not available on new service endpoints. That&#8217;s a feature, not a limitation.</p>



<p class="wp-block-paragraph"><em><a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">Previous: Part 8 &#8211; A new API architecture</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/deprecation-as-a-feature/"><em>Next: Part 10 &#8211; Deprecation as a feature</em></a></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to series index</em></a></p>



<p class="wp-block-paragraph"></p>

]]></content:encoded>
	</item>
	<item>
		<title>A new API architecture: independent services, one gateway, zero coupling</title>
		<link>https://simwood.com/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 14:39:06 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/</guid>
		<description><![CDATA[Part 8 of 12 – Conversation Intelligence Platform series Back to Part 1 The Conversation Intelligence platform didn’t get built on top of our existing API. It got built alongside a replacement for it – and understanding why we replaced…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-a-new-api-architecture-independent-services-one-gateway-zero-coupling-648076703f.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 8 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">The Conversation Intelligence platform didn&#8217;t get built on top of our existing API. It got built alongside a replacement for it &#8211; and understanding why we replaced the architecture matters if you&#8217;re going to build on what we&#8217;ve shipped.</p>



<p class="wp-block-paragraph">The existing Wholesale API at api.simwood.com/v3 has served us well for a long time. It also has approximately 200 endpoints, no independent versioning, monolithic documentation that nobody enjoys reading, and an authentication model that involves passing credentials through a central proxy. Every service on the platform is coupled to every other service through that proxy. Teams cannot ship independently. The API surface has expanded without bound. The documentation is a perpetual backlog.</p>



<p class="wp-block-paragraph">This is a familiar failure mode for any API that grows organically over years without architectural revision. The solution is also familiar: decompose it. But decomposing a 200-endpoint API that customers are actively using, without breaking them, requires a plan rather than a rewrite.</p>



<p class="wp-block-paragraph">The new architecture is built around three components.</p>



<p class="wp-block-paragraph"><strong>Traefik</strong> is the gateway. It handles routing, TLS termination, and rate-limiting. That&#8217;s all it does &#8211; it doesn&#8217;t know anything about authentication or business logic.</p>



<p class="wp-block-paragraph"><strong>The ForwardAuth shim</strong> sits between Traefik and the upstream services. When a request arrives, Traefik calls the auth shim to validate the credentials. The shim validates and injects a set of standard claims headers &#8211; account identity, scopes, tier, and key identifier &#8211; into the request. Traefik then forwards the enriched request to the upstream service.</p>



<p class="wp-block-paragraph"><strong>Each service</strong> reads those headers and trusts them. No service calls a central auth service at runtime. No service re-validates credentials. The gateway handles authentication once; the service handles authorisation locally using the claims it receives.</p>



<p class="wp-block-paragraph">The result is that services are completely decoupled from each other and from the auth infrastructure. A service doesn&#8217;t need to know whether the client authenticated with an API key, a Keycloak JWT, or (for legacy clients) Basic Auth. It receives claims, it checks scopes, it executes the request, it returns a result.</p>



<p class="wp-block-paragraph">The v3 Wholesale API continues to run unchanged on this infrastructure. It routes through Traefik and ForwardAuth exactly like the new services, gaining all the security improvements without any changes to its own codebase or URL structure. Nothing stops responding overnight. The v3 path stays stable for each capability until that capability&#8217;s deprecation window closes.</p>



<p class="wp-block-paragraph">New capabilities are never added to v3. They&#8217;re built as independent services. And existing v3 capabilities are being progressively re-expressed as services: each domain becomes its own versioned service, and the corresponding v3 paths are then deprecated under the standard policy. The <a href="/2026/07/deprecation-as-a-feature/">v3 decomposition map</a> sets out the full picture &#8211; which domains become which services, in what order.</p>



<p class="wp-block-paragraph">The target is twelve services, each independently versioned, each with its own OpenAPI spec and documentation. Numbers, Voice, Messaging, Billing, Account, Porting, Lookup, BYOC, Operator Connect, WhatsApp, Conversational AI, and Conversation Intelligence. Each one ships when it&#8217;s ready. Each one evolves on its own schedule.</p>



<p class="wp-block-paragraph">Independent versioning is one of the things that sounds obvious in retrospect but is genuinely difficult to retrofit. In a monolithic API, a breaking change to one endpoint requires a version bump for the entire API surface. In the service model, a breaking change to the Voice service requires a new version of the Voice service &#8211; nothing else is affected. The Numbers team can ship a v2 of their API without consulting the Billing team. A customer using only Messaging doesn&#8217;t need to care about a Voice API change.</p>



<p class="wp-block-paragraph">The URL carries the version: /intelligence/v1/, /intelligence/v2/. When a breaking change requires a new version, both versions run in parallel until the deprecation window for the old one closes. <a href="/2026/07/deprecation-as-a-feature/">Part 10</a> goes into the deprecation policy in detail.</p>



<p class="wp-block-paragraph">Every service in this architecture follows the same conventions. It reads claims from headers &#8211; never re-validating credentials itself. It filters every query by the injected account identity &#8211; never trusting account identity from request parameters. It enforces scopes on every operation. It exposes a live OpenAPI spec at /openapi.json. It versions independently on breaking changes only.</p>



<p class="wp-block-paragraph">Those conventions aren&#8217;t suggestions &#8211; they&#8217;re how the architecture works. A service that trusts account_id from a query parameter rather than the injected claim is a security hole. A service that doesn&#8217;t expose an OpenAPI spec can&#8217;t be included in the documentation portal. The conventions are what make the system coherent rather than a collection of loosely related services.</p>



<p class="wp-block-paragraph">The practical benefit for customers is that the API surface becomes manageable. Instead of one enormous reference document covering 200 endpoints, there&#8217;s a service index with clear scope, a per-service reference that covers only what that service does, and a documentation portal (covered in <a href="/2026/07/documentation-as-a-first-class-product-narrative-guides-live-openapi-and-scalar/">Part 11</a>) that lets you explore and try things interactively.</p>



<p class="wp-block-paragraph">The practical benefit for us is that teams can ship. A team working on the Voice service doesn&#8217;t need to coordinate with a team working on Messaging. The gateway handles the plumbing; the services handle the business logic; everyone ships at their own pace.</p>



<p class="wp-block-paragraph"><a href="/2026/07/conversation-memory-and-vcon-the-intelligence-that-compounds-over-time/"><em>Previous: Part 7 &#8211; Conversation Memory and vCon</em></a></p>



<p class="wp-block-paragraph"><em><a href="/2026/07/authentication-done-right-api-keys-oidc-and-the-end-of-basic-auth/">Next: Part 9 &#8211; Authentication done right</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to series index</em></a></p>

]]></content:encoded>
	</item>
	<item>
		<title>Conversation Memory and vCon: the intelligence that compounds over time</title>
		<link>https://simwood.com/2026/07/conversation-memory-and-vcon-the-intelligence-that-compounds-over-time/</link>
		<dc:creator><![CDATA[Simon Woodhead]]></dc:creator>
		<pubDate>Thu, 02 Jul 2026 14:35:25 GMT</pubDate>
		<category><![CDATA[conversational-ai]]></category>
		<guid isPermaLink="true">https://simwood.com/2026/07/conversation-memory-and-vcon-the-intelligence-that-compounds-over-time/</guid>
		<description><![CDATA[Part 7 of 12 – Conversation Intelligence Platform series Back to Part 1 Per-call analysis is useful. Intelligence that compounds across calls is transformative. A single conversation, however well-instrumented, tells you only what happened in that conversation. But calls don’t…]]></description>
		<media:thumbnail url="https://simwood.com/assets/og/blog-posts-2026-07-conversation-memory-and-vcon-the-intelligence-that-compounds-over-time-1dcadc4a0f.png" width="1200" height="630" />
		<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Part 7 of 12 &#8211; Conversation Intelligence Platform series</em> <a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to Part 1</em></a></p>



<p class="wp-block-paragraph">Per-call analysis is useful. Intelligence that compounds across calls is transformative.</p>



<p class="wp-block-paragraph">A single conversation, however well-instrumented, tells you only what happened in that conversation. But calls don&#8217;t exist in isolation. The customer calling about a billing dispute today may have raised the same issue last month and the month before. The number showing elevated fraud signals this morning may have appeared in a suspicious context twice in the past fortnight. The caller who sounds distressed may have a documented history with the service that explains why. None of that context is available without some form of memory &#8211; and building it from scratch, per customer, is exactly the kind of problem that doesn&#8217;t get solved until someone decides to make it a platform primitive.</p>



<p class="wp-block-paragraph">Conversation Memory is that platform primitive.</p>



<p class="wp-block-paragraph">Every completed conversation produces a vCon &#8211; a Virtual Conversation record. vCon is an open standard (RFC draft, shepherded by the IETF) that defines a portable, self-contained representation of a conversation. It includes the parties involved, the transcript, references to the media, and all derived analysis: Operator outputs, tags, collected data items, structured results. The vCon is the definitive, complete record of what happened in a conversation, expressed in a format that any compliant system can read.</p>



<p class="wp-block-paragraph">The choice to use vCon rather than a proprietary format matters. It means the conversation records the platform produces are not locked to Simwood&#8217;s infrastructure. They&#8217;re portable, queryable by any system that understands the standard, and yours.</p>



<p class="wp-block-paragraph">vCons are stored in the customer&#8217;s own S3-compatible object storage &#8211; the same bring-your-own-storage capability the platform already supports for call recordings. The conversation record never leaves the customer&#8217;s infrastructure. The Memory service indexes and queries it on the customer&#8217;s behalf, but ownership and custody are unambiguous. Simwood does not hold your conversation history; you do.</p>



<p class="wp-block-paragraph">This is a deliberate design choice, not a concession. Conversation records contain sensitive information &#8211; the content of customer calls, fraud signals associated with specific numbers, compliance deviations, health and distress indicators. That data belongs with the customer. They should control it, back it up, and be able to query it independently of the platform if they choose.</p>



<p class="wp-block-paragraph">The Memory service indexes vCons by participant identity as they accumulate. When a new conversation begins, Memory queries that history and surfaces what&#8217;s relevant: prior contacts from this caller, signals detected in previous calls, outcomes reached and issues left unresolved, patterns that only become visible across multiple interactions. That context is available to Agents and Operators before the conversation&#8217;s first word is spoken.</p>



<p class="wp-block-paragraph">The effect is that the platform&#8217;s intelligence compounds over time. An Agent handling a returning customer can be aware of their history without the customer needing to repeat themselves. An Operator assessing fraud risk can factor in prior signals from the same number. A webhook payload can note that this is the third unresolved complaint from this caller in six weeks.</p>



<p class="wp-block-paragraph">In emergency services, this context can be genuinely significant. A caller with a documented history of mental health crises should trigger a different initial response than an unknown first-time caller describing the same symptoms. That distinction requires memory.</p>



<p class="wp-block-paragraph">Because vCon is an open standard and the records live in the customer&#8217;s own storage, the memory the platform builds is fully portable. If a customer migrates off the platform, their conversation history goes with them. They can query it with their own tooling, export it to other systems, or feed it into their own analysis pipelines. The historical record of a conversation estate belongs to the customer &#8211; not as a policy position, but as an architectural fact.</p>



<p class="wp-block-paragraph">This is worth thinking about in comparison to how most analytics platforms work. The standard model is: your data lives in our infrastructure, queryable through our APIs, exportable only in the formats we support, and gone if you leave. Conversation Memory works the other way: your data lives in your infrastructure, the platform indexes it on your behalf, and you could walk away with every vCon intact.</p>



<p class="wp-block-paragraph">Today, Conversation Memory is scoped to voice. But the record format, the identity model, and the storage structure are deliberately chosen to match what we&#8217;ve already defined for async text channels: WhatsApp, SMS, email, and support tickets. A voice call and a WhatsApp thread produce the same kind of record. The turn format is medium-agnostic. The conversation identity doesn&#8217;t reference a session; it references the transport-native key, whether that&#8217;s a call ID or a message thread. When the async front-end arrives, those conversations land in the same record shape without requiring anything to be redesigned. That&#8217;s not an accident.</p>



<p class="wp-block-paragraph"><a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">Part 8</a> switches from the product to the platform itself &#8211; specifically the new API architecture that underlies all of this and makes independent service evolution possible.</p>



<p class="wp-block-paragraph"><em><a href="/2026/07/operators-turning-a-call-into-structured-signals-your-systems-can-act-on/">Previous: Part 6 &#8211; Operators</a></em></p>



<p class="wp-block-paragraph"><em><a href="/2026/07/a-new-api-architecture-independent-services-one-gateway-zero-coupling/">Next: Part 8 &#8211; A new API architecture</a></em></p>



<p class="wp-block-paragraph"><a href="/2026/07/the-biggest-thing-weve-ever-shipped/"><em>Back to series index</em></a></p>



<p class="wp-block-paragraph"></p>

]]></content:encoded>
	</item>
</channel>
</rss>
