<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Western Wilson</title><link>https://westernwilson.com/tags/ai/</link><description>Recent content in Ai on Western Wilson</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 26 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://westernwilson.com/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>AGNTCon + MCPCon Europe 2026</title><link>https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/</guid><description>TL;DR: I spent the full second day at AGNTCon + MCPCon Europe in Amsterdam, and the most interesting talks showed a new normal for humans now that agents write most of the code.&#10;Dexter Horthy was the best speaker of the day, and Dylan Ratcliffe won me over after I initially disagreed with his premise. His line “easier to reject the recipe than the meal” is the same lesson I learnt the hard way at the bunq hackathon: i.e review the plan before anything gets built. Roy Belio’s red teaming lab made me glad I’d already locked down egress on my coding agent, and gave me a list of things I still haven’t done (DNS, canary tokens, read-only config). Another thing is that plenty of the live demos broke, which shows non-determinism in action.&#10;</description><content:encoded><![CDATA[<p><strong>TL;DR:</strong> I spent the full second day at <a href="https://events.linuxfoundation.org/agntcon-mcpcon-europe">AGNTCon + MCPCon Europe</a> in Amsterdam, and the most interesting talks showed a new normal for humans now that agents write most of the code.</p>
<p>Dexter Horthy was the best speaker of the day, and Dylan Ratcliffe won me over after I initially disagreed with his premise. His line &ldquo;easier to reject the recipe than the meal&rdquo; is the same lesson I learnt the hard way at the <a href="https://westernwilson.com/reflections/bunq-hackathon-7">bunq hackathon</a>: i.e review the plan before anything gets built. Roy Belio&rsquo;s red teaming lab made me glad I&rsquo;d already <a href="https://westernwilson.com/reflections/containerising-my-coding-agent">locked down egress on my coding agent</a>, and gave me a list of things I still haven&rsquo;t done (DNS, canary tokens, read-only config). Another thing is that plenty of the live demos broke, which shows non-determinism in action.</p>
<p>Next year&rsquo;s conference is in London, and I&rsquo;m hoping to go! Reach out if you&rsquo;re going too.</p>
<p>The rest of this post is my notes from each talk, lightly tidied up.</p>
<h2 id="catch-them-early" class="group relative scroll-mt-20">
  Catch Them Early
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#catch-them-early"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBEf/keynote-catch-them-early-manik-surtani-cto-agentic-ai-foundation"><strong>9:07am, Manik Surtani (CTO, Agentic AI Foundation)</strong></a></p>
<ul>
<li>The <a href="https://aaif.io/">Agentic AI Foundation (AAIF)</a> compared itself to the CNCF, which had the benefit of an industry that already had lots of experience with cloud.</li>
<li>They&rsquo;ve copied the CNCF bar for accepting projects, and in some places raised it.</li>
<li>They&rsquo;ve had a 3-4x growth pace compared to CNCF&hellip; the AI hype probably helped tbh</li>
</ul>
<h2 id="getting-to-stateless-mcp-in-production" class="group relative scroll-mt-20">
  Getting to stateless MCP in production
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#getting-to-stateless-mcp-in-production"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBHz/keynote-getting-to-stateless-mcp-in-production-shaun-smith-mcp-and-transport-working-group-maintainer-hugging-face"><strong>9:19am, Shaun Smith (Hugging Face, MCP transport working group maintainer)</strong></a></p>
<ul>
<li>Streamable HTTP is a smarter way to connect, closer to one-to-one client-to-server.</li>
<li>The stateless release brought improvements, but they needed migrating to the new SDK.</li>
<li>Uptake has been massive.</li>
</ul>
<h2 id="three-doors-to-one-tool-mcp-vs-webmcp-vs-cli" class="group relative scroll-mt-20">
  Three doors to one tool: MCP vs WebMCP vs CLI
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#three-doors-to-one-tool-mcp-vs-webmcp-vs-cli"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBVv/keynote-three-doors-to-one-tool-mcp-vs-webmcp-vs-cli-frederic-barthelet-cto-co-founder-alpic-dominic-farolino-editor-of-the-webmcp-specification-software-engineer-google"><strong>9:29am, Dominic Farolino (Google Chrome) &amp; Frederic Barthelet (CTO, Alpic)</strong></a></p>
<ul>
<li>WebMCP is a layer on a website that lets agents interact with your website much faster.</li>
<li>Better than <code>llms.txt</code> which isn&rsquo;t often looked at</li>
<li>CLIs integrate well with agents.</li>
<li>A harness is tools, memory, context, and guards.</li>
<li>MCP can be a local server or a public one.</li>
</ul>
<h2 id="state-of-the-software-factory" class="group relative scroll-mt-20">
  State of the software factory
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#state-of-the-software-factory"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBUc/keynote-state-of-the-software-factory-dexter-horthy-ceo-and-co-founder-humanlayer"><strong>9:41am, Dexter Horthy (CEO &amp; co-founder, HumanLayer)</strong></a></p>
<ul>
<li>A fantastic speaker who also has a YouTube channel.</li>
<li>The best talk of the day, with interesting content that&rsquo;s worth checking out properly.</li>
<li>Walked through HumanLayer&rsquo;s multiplayer AI chat tooling, which drives spec and code diff checks.</li>
</ul>
<p>Tools mentioned: <a href="https://hlyr.dev/resources">HumanLayer&rsquo;s resources</a>.</p>
<h2 id="pull-requests-are-dead-long-live-peer-review" class="group relative scroll-mt-20">
  Pull Requests are dead, long live peer review
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#pull-requests-are-dead-long-live-peer-review"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RB8Y/pull-requests-are-dead-long-live-peer-review-dylan-ratcliffe-overmind"><strong>10:20am, Dylan Ratcliffe (Overmind)</strong></a></p>
<p>The most controversial talk of the day, at first. By the end he&rsquo;d convinced me, mostly because he showed how it&rsquo;s working for them right now.</p>
<ul>
<li>Pull requests are dead.</li>
<li>AI is not your peer, and its code is harder to review.</li>
<li>Agents are agreeable. They&rsquo;re bad at disagreeing with you.</li>
<li>He was a passable engineer who was outperforming his own team, and considered firing the engineering team. Instead he shifted the engineers left, into more product-oriented roles.</li>
<li>Move peer review into the planning phase, where the decisions actually get made.</li>
<li>The loop: research, decide on an approach, weigh up tradeoffs, plan, collaborate, then implement until the implementation matches the plan.</li>
<li>It&rsquo;s easier to reject the recipe than the meal. People are more willing to reject a plan, because it&rsquo;s cheaper to fix.</li>
<li>My open question: what about conflicts between the plan and the existing system? Does that get caught in review?</li>
</ul>
<p>Tools mentioned: <a href="https://www.notyourpeer.com/">AI Is Not Your Peer</a>, and <a href="https://until.dev/">Until</a>, which makes sure your agent implements every part of the plans you write.</p>
<h2 id="from-works-on-my-prompt-to-production-slos" class="group relative scroll-mt-20">
  From &ldquo;works on my prompt&rdquo; to production SLOs
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#from-works-on-my-prompt-to-production-slos"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBA3/from-works-on-my-prompt-to-production-slos-building-agent-observability-manik-khandelwal-microsoft"><strong>10:55am, Manik Khandelwal (Microsoft)</strong></a></p>
<ul>
<li>He wants agents that don&rsquo;t need constant checking.</li>
<li>It was confusing what he was trying to do. He has a framework that watches whether an agent needs active supervision or can be left running in the background.</li>
<li>The slides were AI generated. Cool to look at and interactive, but they lacked humanity in a way I can&rsquo;t quite describe. It didn&rsquo;t tell a story, it was more show and tell.</li>
<li>I didn&rsquo;t get much from this one.</li>
</ul>
<p>Tools mentioned: Mitra, an internal tool for monitoring agents. Not sure if it&rsquo;s open sourced yet.</p>
<h2 id="governance-you-can-run-checkable-properties-for-production-agents" class="group relative scroll-mt-20">
  Governance you can run: Checkable properties for production agents
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#governance-you-can-run-checkable-properties-for-production-agents"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBAC/governance-you-can-run-checkable-properties-for-production-agents-seshu-tolety-siemens"><strong>11:30am, Seshu Tolety (Director of Agentic AI, Siemens)</strong></a></p>
<ul>
<li>The cost of ungoverned AI model usage on privacy, operational burden, and more.</li>
<li>Three lifecycles as new mental models: AI adoption, engineering, and operations (can we run AI safely at scale?).</li>
<li>He walked through today&rsquo;s organisation and policy structures, then out to a future state where AI governs AI policy.</li>
<li>Humans sit in that structure reviewing the policy that AI creates. As we know from code, that makes humans the bottleneck. After hearing Dylan&rsquo;s talk, I&rsquo;m not sure I agree. The idea is both scary and interesting at the same time!</li>
<li>&ldquo;Governance should never slow innovation. It should help you scale it.&rdquo;</li>
</ul>
<h2 id="governed-agent-autonomy-building-a-control-plane-for-agentic-systems" class="group relative scroll-mt-20">
  Governed agent autonomy: Building a control plane for agentic systems
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#governed-agent-autonomy-building-a-control-plane-for-agentic-systems"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBAR/governed-agent-autonomy-building-a-control-plane-for-agentic-systems-nnenna-ndukwe-qodo-ai"><strong>1:15pm, Nnenna Ndukwe (Qodo AI)</strong></a></p>
<ul>
<li>Harness config, mostly around what to allow.</li>
<li>Five governance patterns found in the leaked Claude Code source, which she open sourced:
<ol>
<li>Planning</li>
<li>Permissions (can this action proceed?)</li>
<li>Tool trust (capability trust)</li>
<li>Verification</li>
<li>Runtime (what were the outcomes?)</li>
</ol>
</li>
<li>She implemented them in a Rust agent.</li>
<li>The demo was supposed to block a deployment to production. It didn&rsquo;t xD</li>
</ul>
<p>Tools mentioned: Goose (an AAIF project), GAAP (agent observability), and Martin Fowler&rsquo;s writing on harness engineering.</p>
<h2 id="beyond-chatbots-agentic-ui-with-open-standards" class="group relative scroll-mt-20">
  Beyond Chatbots: Agentic UI with Open Standards
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#beyond-chatbots-agentic-ui-with-open-standards"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBAs/beyond-chatbots-agentic-ui-with-open-standards-manfred-steyer-angulararchitects"><strong>1:25pm, Manfred Steyer (ANGULARarchitects)</strong></a></p>
<ul>
<li>An interesting talk, and one of the few live demos that worked. Well, it didn&rsquo;t at first, until they realised it was just the WiFi. Once that was fixed it worked.</li>
<li>&ldquo;To chat or not to chat&hellip; that&rsquo;s the wrong question.&rdquo;</li>
<li>Showed a UI progressively changing as you chat with it and co-create.</li>
</ul>
<p>Tools mentioned: AG-UI (agent communication), A2UI (dynamic UI), and MCP Apps.</p>
<h2 id="mcp-apps-and-the-agentic-web" class="group relative scroll-mt-20">
  MCP Apps and the Agentic Web
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#mcp-apps-and-the-agentic-web"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBAU/mcp-apps-and-the-agentic-web-liad-yosef-mcp-apps"><strong>1:50pm, Liad Yosef (MCP Apps)</strong></a></p>
<ul>
<li>The difference between a website, WebMCP, and MCP Apps.</li>
<li>A really convincing talk on how brands can bring their apps into chat instead of splicing up their current website.</li>
<li>His point is that we might move away from browsers entirely, because we might not need them.</li>
<li>Salesforce is going headless, even though UI was their differentiator.</li>
<li>Cloudflare says bot traffic has overtaken human traffic.</li>
<li>Web search isn&rsquo;t great for agents, and an app store probably isn&rsquo;t either. What about an agentic identity that&rsquo;s tied to you?</li>
<li>The next big thing is the discovery layer for agents. He compared it to web search, with <code>.well-known/ai-catalog.json</code> as a unified standard.</li>
</ul>
<p>Tools mentioned: Goose, DoorDash&rsquo;s new CLI, Sentry, Ora&rsquo;s researcher benchmark, <code>npx ax</code> (an audit tool for how agents use your website), and Ora&rsquo;s <a href="https://ora.directory/">Agentic Resources Discovery: the agentic index of the web</a>.</p>
<h2 id="no-central-brain" class="group relative scroll-mt-20">
  No Central Brain
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#no-central-brain"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBBV/no-central-brain-fausto-albers-wonderwhy"><strong>3:25pm, Fausto Albers (WonderWhy, co-founder of AI Builders Club)</strong></a></p>
<ul>
<li>No central brain. Ominous music. Who decides what&rsquo;s true?</li>
<li>&ldquo;Attention is all you need&rdquo;, reframed as: 1. harness and loop, 2. recursive self improvement, 3. memory and learning.</li>
<li>The harness reinvents itself. It self-learns and stores each change along with its cost, tests itself, makes changes, evaluates the model, then recreates the harness.</li>
<li>I wonder if it&rsquo;ll converge on AI granting itself unlimited access and some wild harness configurations…</li>
</ul>
<h2 id="infrastructure-red-teaming-with-abliterated-models" class="group relative scroll-mt-20">
  Infrastructure red teaming with abliterated models
  <a
    href="https://westernwilson.com/reflections/agntcon-mcpcon-europe-2026/#infrastructure-red-teaming-with-abliterated-models"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p><a href="https://agntconmcpconeu26.sched.com/event/2RBBJ/infrastructure-red-teaming-with-abliterated-models-what-actually-stops-agent-attacks-roy-belio-red-hat"><strong>3:30pm, Roy Belio (Red Hat)</strong></a></p>
<ul>
<li>Red teaming chat models and model refusal. Injection gets past a lot of guardrails.</li>
<li>There are lots of CVEs about prompt injection and ways around guardrails.</li>
<li>Guardrails and classifiers are a good start, but they&rsquo;ll miss anything that isn&rsquo;t in English.</li>
<li>His outcome was to run tooling on an SSH server somewhere else, not on the same service as the LLM.</li>
<li>In the interactive lab, a tool would sometimes error out, but <code>cat</code> was still available so the agent read the file anyway. Sometimes the LLM hid the logs too.</li>
<li>A read-only container running <code>sshd</code> is a good idea.</li>
<li>Watch for direct socket operations and exfiltration over DNS. Block egress, and keep DNS traffic internal too.</li>
<li>The slash command illusion.</li>
<li>Keep the config that shapes the agent&rsquo;s behaviour on the pods, and never let it be writable. The agent will rewrite itself.</li>
<li>Put canary tokens anywhere that could tell you you&rsquo;ve been compromised.</li>
</ul>
<p>Further reading he mentioned: EchoLeak (Microsoft), AWS Strands, MCP Poison (Cursor), the Deadbugz campaign (August 2026), and <em>Crash test dummy</em>, the blog where he first worked through this talk.</p>
]]></content:encoded></item><item><title>Containerising my coding agent</title><link>https://westernwilson.com/reflections/containerising-my-coding-agent/</link><pubDate>Sun, 21 Jun 2026 00:00:00 +0000</pubDate><guid>https://westernwilson.com/reflections/containerising-my-coding-agent/</guid><description>I containerised Claude Code this week because I wanted to let it run with fewer guardrails and not hand it unlimited access the rest of my machine. There’s a Hacker News thread from 6 months ago about someone running Claude in yolo mode who asked it to clean something up and watched it rm -rf their home directory 😅. So let’s aim to at least avoid that.&#10;Thankfully, I found Dev Containers, which turned into its own rabbit hole but lets us lock down Claude without having to maintain our own docker image.&#10;</description><content:encoded><![CDATA[<p>I containerised Claude Code this week because I wanted to let it run with fewer guardrails and not hand it unlimited access the rest of my machine. There&rsquo;s a <a href="https://news.ycombinator.com/item?id=46268222">Hacker News thread</a> from 6 months ago about someone running Claude in yolo mode who asked it to clean something up and watched it <code>rm -rf</code> their home directory 😅. So let&rsquo;s aim to at least avoid that.</p>
<p>Thankfully, I found <a href="https://containers.dev">Dev Containers</a>, which turned into its own rabbit hole but lets us lock down Claude without having to maintain our own docker image.</p>
<p>This reflection post talks through the containerised setup and some issues I faced while setting it up. If you just want the solution, then the implementation is in the <a href="https://github.com/wjkw1/westernwilson.com/tree/main/.devcontainer">.devcontainer/</a> directory of this website&rsquo;s source code.</p>
<h2 id="feature-or-docker-image" class="group relative scroll-mt-20">
  Feature or docker image?
  <a
    href="https://westernwilson.com/reflections/containerising-my-coding-agent/#feature-or-docker-image"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>I assumed that Anthropic would ship an official Claude base image you build on top of. They don&rsquo;t, they only post a recommended starting point. Claude Code installs into any <a href="https://code.claude.com/docs/en/devcontainer">Dev Container</a> through the <code>ghcr.io/anthropics/devcontainer-features/claude-code:1.0</code> feature, which you reference in <code>devcontainer.json</code> like <a href="https://containers.dev/features">any other devcontainers feature</a>. It works wherever the Dev Containers spec is supported e.g. VS Code, Codespaces, JetBrains, and (with some rough edges) Cursor. In VS Code it can be configured to pull in the Claude Code extension, keeping Claude decoupled from the base image entirely.</p>
<p>That leaves three layers to assemble: a base image, the tooling you use, and Claude Code on top. The real decision is whether you bake those middle two layers into a custom docker image you push to a registry, or assemble them per-repo through <code>devcontainer.json</code> features. A custom image is the better call for a team, where you want a validated, secure, and reusable environment everyone builds on. For a solo setup spun up per-repo, features are easier. The cost is a slow first build and less control over exactly what lands in the image, which is what <code>post-create.sh</code> helps automate somewhat.</p>
<p>My <code>devcontainer.json</code> ended up looking like this, trimmed to the main parts:</p>
<div class="highlight"><pre tabindex="0"><code class="language-jsonc" data-lang="jsonc"><span><span>{
</span></span><span><span>  <span>&#34;image&#34;</span>: <span>&#34;mcr.microsoft.com/devcontainers/base:ubuntu&#34;</span>,
</span></span><span><span>  <span>&#34;features&#34;</span>: {
</span></span><span><span>    <span>&#34;ghcr.io/anthropics/devcontainer-features/claude-code:1.0&#34;</span>: {}
</span></span><span><span>  },
</span></span><span><span>  <span>&#34;remoteUser&#34;</span>: <span>&#34;vscode&#34;</span>,
</span></span><span><span>  <span>&#34;mounts&#34;</span>: [
</span></span><span><span>    <span>&#34;source=claude-code-config-${devcontainerId},target=/home/vscode/.claude,type=volume&#34;</span>
</span></span><span><span>  ],
</span></span><span><span>  <span>&#34;runArgs&#34;</span>: [<span>&#34;--cap-add=NET_ADMIN&#34;</span>, <span>&#34;--cap-add=NET_RAW&#34;</span>],
</span></span><span><span>  <span>&#34;postCreateCommand&#34;</span>: <span>&#34;sudo zsh .devcontainer/post-create.sh&#34;</span>,
</span></span><span><span>  <span>&#34;postStartCommand&#34;</span>: <span>&#34;sudo /usr/local/sbin/init-firewall.sh&#34;</span>,
</span></span><span><span>  <span>&#34;waitFor&#34;</span>: <span>&#34;postStartCommand&#34;</span>
</span></span><span><span>}
</span></span></code></pre></div><p>The non-root <code>vscode</code> user is important if you ever run with <code>--dangerously-skip-permissions</code>, Claude Code requires it. The named volume on <code>~/.claude</code> means login persists across rebuilds instead of re-authenticating every time. The <code>NET_ADMIN</code>/<code>NET_RAW</code> capabilities exist so that we can create the containerised firewall. <code>waitFor: postStartCommand</code> blocks the terminal until that firewall script finishes, so there&rsquo;s no window where Claude is already running before egress is locked down.</p>
<p><code>post-create.sh</code> is the everyday stuff a feature-based setup doesn&rsquo;t hand you for free: setting git aliases, adding a couple of zsh aliases for <code>kubectl</code> and <code>terraform</code>, locking down <code>sudo</code>/<code>su</code>.</p>
<p><code>init-firewall.sh</code> sets default-DROP policies on iptables, then builds an <code>ipset</code> allowlist of everything the container is allowed to reach outbound. Part of that allowlist is GitHub&rsquo;s own published IP ranges, fetched live at container start:</p>
<div class="highlight"><pre tabindex="0"><code class="language-zsh" data-lang="zsh"><span><span>gh_ranges<span>=</span><span>$(</span>curl -s https://api.github.com/meta<span>)</span>
</span></span><span><span><span>while</span> read -r cidr; <span>do</span>
</span></span><span><span>    ipset add allowed-domains <span>&#34;</span>$cidr<span>&#34;</span>
</span></span><span><span><span>done</span> &lt; &lt;<span>(</span>echo <span>&#34;</span>$gh_ranges<span>&#34;</span> | jq -r <span>&#39;(.web + .api + .git)[]&#39;</span> | aggregate -q<span>)</span>
</span></span></code></pre></div><p>Everything else —npm, <code>api.anthropic.com</code>, the VS Code marketplace— gets resolved and added individually. The firewall script finishes by checking its own work: it tries <code>curl https://example.com</code> and expects that to fail, then tries <code>curl https://api.github.com/zen</code> and expects that to succeed.</p>
<h2 id="firewall-and-sudo" class="group relative scroll-mt-20">
  Firewall and sudo
  <a
    href="https://westernwilson.com/reflections/containerising-my-coding-agent/#firewall-and-sudo"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>I spent a decent chunk of time configuring who&rsquo;s allowed to touch <code>iptables</code>. The <code>common-utils</code> feature grants the <code>vscode</code> user blanket passwordless <code>sudo</code> by default, and my first cut of <code>post-create.sh</code> narrowed that down to the <code>iptables</code>/<code>iptables-save</code>/<code>ipset</code> binaries themselves, with no argument restriction. Which meant Claude or anything else running as <code>vscode</code>, including under <code>--dangerously-skip-permissions</code>, could just run <code>sudo iptables -F &amp;&amp; sudo iptables -P OUTPUT ACCEPT</code> and the firewall would be gone! Anthropic&rsquo;s own reference devcontainer avoids this by granting <code>sudo</code> on one fixed script path instead of the raw binaries, baked into their image at build time so the script itself can&rsquo;t be edited either. I didn&rsquo;t want a custom Dockerfile yet, but dev containers can do the same thing with just <code>postCreateCommand</code>: copy <code>init-firewall.sh</code> to a root-owned <code>/usr/local/sbin/init-firewall.sh</code> outside the bind-mounted workspace while the feature&rsquo;s broad sudo grant is still active, then narrow <code>sudo</code> down to NOPASSWD on that one frozen executable file only. The tradeoff is that editing the live <code>init-firewall.sh</code> to allow a new domain now needs a full <strong>Rebuild Container</strong>, not just a restart, since the frozen copy is what actually runs.</p>
<p>Claude has it&rsquo;s own way to limit it&rsquo;s own execution too using <code>.claude/settings.json</code>. We&rsquo;ve configured this on top to deny any <code>Bash(sudo *)</code> and <code>Bash(su *)</code> commands, so in normal mode Claude won&rsquo;t even attempt the command. But <code>--dangerously-skip-permissions</code> does exactly what its name says: it bypasses every permission rule, deny rules included. So that file is a speed bump for the default mode, not something to lean on once the safety&rsquo;s off. The frozen-script sudoers restriction is the one that locks it down regardless, because it&rsquo;s enforced by the OS, not by Claude Code.</p>
<h2 id="gap-in-the-firewall" class="group relative scroll-mt-20">
  Gap in the firewall
  <a
    href="https://westernwilson.com/reflections/containerising-my-coding-agent/#gap-in-the-firewall"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>One thing I noticed was that <code>api.github.com/meta</code>&rsquo;s ip ranges aren&rsquo;t scoped to the API. They cover GitHub&rsquo;s whole edge network, which includes GitHub Pages in some cases. For example, this website, <a href="https://westernwilson.com">westernwilson.com</a>, runs on GitHub Pages. So with the firewall up and supposedly restricting the agent to an approved set of domains, I could still reach my own site. And by the same logic, any other <code>*.github.io</code> page, or anything hosted there by someone with worse intentions. A page on <code>*.github.io</code> could potentially hold a payload hosted somewhere else entirely, and the firewall would wave it through without ever knowing the difference.</p>
<p>I see three ways to close that off:</p>
<ul>
<li>Proxy the traffic and filter on hostname instead of IP. Cleanest in theory, but Encrypted Client Hello can still hide the hostname from anything sitting.</li>
<li>Drop <code>*.github.io</code> from the allowlist entirely. Unfortunately this also takes <code>raw.githubusercontent.com</code> out too since they share the same ip ranges, but if that&rsquo;s not something the container needs, it&rsquo;s a fine trade.</li>
<li>Accept the risk and move on.</li>
</ul>
<p>I haven&rsquo;t picked one yet, for now I&rsquo;m sitting with the risk while I think about which tradeoff is actually worth it.</p>
<h2 id="logging-in-to-claude" class="group relative scroll-mt-20">
  Logging in to Claude
  <a
    href="https://westernwilson.com/reflections/containerising-my-coding-agent/#logging-in-to-claude"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>Logging in had its own gotcha. In VS Code there is a big orange &ldquo;use your subscription&rdquo; button that opens a browser and waits for a callback to <code>localhost</code>, which never makes it back into the container and just hangs. The fix is to skip the button, open a terminal inside the container and run <code>claude</code>, which kicks off the same browser flow but resolves the callback correctly.</p>
<p>We then use <code>~/.claude</code>, which is now owned by the <code>vscode</code> thanks to the <code>chown</code> at the top of <code>post-create.sh</code>, so once logged in, we gain stickier login sessions.</p>
<p>In doing the whole login dance from a bare terminal meant that my first real session with Claude Code inside the dev container was just text based interaction with no IDE extension wrapper around it at all. It&rsquo;s an interesting way to work and removes a lot of the UI distraction, but not something I&rsquo;ll rely on fulltime.</p>
<h2 id="port-forwarding" class="group relative scroll-mt-20">
  Port forwarding
  <a
    href="https://westernwilson.com/reflections/containerising-my-coding-agent/#port-forwarding"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>The other thing that briefly worried me is VS Code forwarded around thirty-two ports the moment the container came up. My first thought was that something in the container was reaching out on its own. It&rsquo;s not, after some searching I found that it&rsquo;s VS Code&rsquo;s automatic port-forwarding scanning the container for anything listening on a port, for example a dev server that you&rsquo;ll want to open in a browser. It&rsquo;s a separate, fairly trigger-happy feature, and apparently a known source of noise; <a href="https://github.com/microsoft/vscode-remote-release/issues/10926">This GitHub issue</a> describes the exact same &ldquo;over 20 ports auto-forwarded&rdquo; behaviour after a setting silently flips from <code>process</code> to <code>hybrid</code> detection mode.</p>
<p>If you want to see the actual config rather than the excerpts above, it&rsquo;s all in this repo under <a href="https://github.com/wjkw1/westernwilson.com/tree/main/.devcontainer">.devcontainer/</a>. Treat it as a personal setup to extend, not a hardened image to copy verbatim.</p>
<p>Further reading: Anthropic&rsquo;s <a href="https://code.claude.com/docs/en/devcontainer">Dev Containers docs</a> and the <a href="https://code.visualstudio.com/docs/devcontainers/tutorial">VS Code Dev Containers tutorial</a>.</p>
]]></content:encoded></item><item><title>Deciding what to keep</title><link>https://westernwilson.com/reflections/bunq-hackathon-7/</link><pubDate>Sun, 03 May 2026 00:00:00 +0000</pubDate><guid>https://westernwilson.com/reflections/bunq-hackathon-7/</guid><description>It was around 4am when I scrapped the project. AI had co-built me a FastAPI cathedral, full of libraries I didn’t recognise and an architecture more ambitious than a 24 hour hackathon could achieve. The code worked, sort of. Extending it would be challenging, and integrating it with AWS would take time we didn’t have. So I deleted everything and started again with something simple that we could build and demo quickly.&#10;</description><content:encoded><![CDATA[<p>It was around 4am when I scrapped the project. AI had co-built me a FastAPI cathedral, full of libraries I didn&rsquo;t recognise and an architecture more ambitious than a 24 hour hackathon could achieve.
The code worked, sort of. Extending it would be challenging, and integrating it with AWS would take time we didn&rsquo;t have. So I deleted everything and started again with something simple that we could build and demo quickly.</p>
<p>This moment has been circling in my mind across this last week.</p>
<h2 id="how-i-got-there" class="group relative scroll-mt-20">
  How I got there
  <a
    href="https://westernwilson.com/reflections/bunq-hackathon-7/#how-i-got-there"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>I went to Amsterdam for three nights to see the city and to take part in Bunq&rsquo;s 24-hour hackathon. I arrived alone and Bunq connected me with a team. On the day two people didn&rsquo;t show so we ended up finding two others in similar situations and formed a new team.</p>
<p>The hackathon brief was to build something that solved a problem, used the Bunq API, and had some kind of multi-modal AI. I didn&rsquo;t know what we&rsquo;d build, and honestly that was exciting to me!</p>
<h2 id="who-i-worked-with" class="group relative scroll-mt-20">
  Who I worked with
  <a
    href="https://westernwilson.com/reflections/bunq-hackathon-7/#who-i-worked-with"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>Our team was called &ldquo;4 corners&rdquo; with people from four countries. We had a DevOps Engineer, Business Analyst, Product Owner, and even a CFO. Honestly, it was a privilege to be around such accomplished people whose lives had taken different trajectories leading them to this moment.</p>
<h2 id="the-build" class="group relative scroll-mt-20">
  The build
  <a
    href="https://westernwilson.com/reflections/bunq-hackathon-7/#the-build"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>On the day we had a brilliant talk by someone from AWS about spec driven development. I took that talk to heart and tried building our app using that same ethos. This led me to a vibe-coded backend app in Python, the language I knew, but attempting to use production-grade infrastructure. For a 24-hour prototype, this was overkill. The AI, eager to please, happily built me something far beyond what the hackathon called for.</p>
<p>It reminds me of something an old colleague once told me:</p>
<blockquote>
<p>building something is easy, productionising it is the hard bit</p>
</blockquote>
<p>In this hackathon, unfortunately, I started off by inverting their advice. I was productionising something before I&rsquo;d built anything.</p>
<h2 id="the-pivot" class="group relative scroll-mt-20">
  The pivot
  <a
    href="https://westernwilson.com/reflections/bunq-hackathon-7/#the-pivot"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>You can wrangle an app together in 24 hours. What matters more is whether you&rsquo;ve thought clearly about the problem, can articulate the pain point, and can demonstrate something useful with honest tradeoffs.</p>
<ul>
<li>Mock APIs not crucial to the core solution instead of integrating with them.</li>
<li>Stub the database or run one locally to show the core idea working.</li>
<li>Later, if there&rsquo;s time then connect the real infra.</li>
</ul>
<p>The lesson for me was closing the gap between ambition and execution. A gentle reminder to focus more on the problem being solved, and on building an MVP that demonstrates a useful solution.</p>
<p>That&rsquo;s what scrapping the bloated AI app got me back to. Something small, something easily understood, something we could actually show someone.</p>
<p>The winning teams that night? Mostly localhost applications.</p>
<h2 id="amsterdam" class="group relative scroll-mt-20">
  Amsterdam
  <a
    href="https://westernwilson.com/reflections/bunq-hackathon-7/#amsterdam"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>After the Hackathon winners were announced, I left Bunq HQ into a city I&rsquo;d been told was lovely. My cousin recommended Amsterdam as the place to be, and I could see why. Flat landscape, bike-friendly, sunny skies that week (rare, apparently), with free ferries criss-crossing the harbour, and people moving through it all with quiet competence. It felt like a larger Wellington with better trains.</p>
<p>I came partly to see whether I could live in Amsterdam. I left knowing I could.</p>
]]></content:encoded></item><item><title>I feel silly about how I used to use AI</title><link>https://westernwilson.com/reflections/2024-10-24-i-feel-silly-about-how-i-used-to-treat-ai/</link><pubDate>Thu, 24 Oct 2024 00:00:00 +0000</pubDate><guid>https://westernwilson.com/reflections/2024-10-24-i-feel-silly-about-how-i-used-to-treat-ai/</guid><description>The way I write has evolved, primarily due to a shift in my relationship with AI and the writing process itself:&#10;Before I used AI to generate content Now I use AI more as a refinement tool and writing companion When referring to AI in this post, I specifically mean large language models (LLMs) like ChatGPT and Perplexity.&#10;Before How I worked with AI in the past is silly. Using AI to generate content makes the writing sound generic and peppered with buzzwords that people never use. I mean, check the title and content of my previous blog posts: ‘Unleashing the Writer Within: How ChatGPT Transformed My Writing’, and ‘Supercharge Your SSH with VS Code’ 🫣&#10;</description><content:encoded><![CDATA[<p>The way I write has evolved, primarily due to a shift in my relationship with AI and the writing process itself:</p>
<ul>
<li><strong>Before</strong> I used AI to generate content</li>
<li><strong>Now</strong> I use AI more as a refinement tool and writing companion</li>
</ul>
<p>When referring to AI in this post, I specifically mean large language models (LLMs) like ChatGPT and Perplexity.</p>
<h2 id="before" class="group relative scroll-mt-20">
  Before
  <a
    href="https://westernwilson.com/reflections/2024-10-24-i-feel-silly-about-how-i-used-to-treat-ai/#before"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>How I worked with AI in the past is silly. Using AI to generate content makes the writing sound generic and peppered with buzzwords that people never use. I mean, check the title and content of my previous blog posts: &lsquo;Unleashing the Writer Within: How ChatGPT Transformed My Writing&rsquo;, and &lsquo;Supercharge Your SSH with VS Code&rsquo; 🫣</p>
<p>AI generated content has telltale signs when you see words like: unleashed, supercharge, delve, crucial, <a href="https://arstechnica.com/ai/2024/07/the-telltale-words-that-could-identify-generative-ai-text/">more examples here</a>. The silver lining is that AI taught me more words, the problem is these new words didn&rsquo;t feel authentic to me.</p>
<p>Using AI to generate content was also a coping mechanism to my creative blocks. An unfortunate consequence was that it removed my &ldquo;want to think&rdquo;, I could feel myself leaning more and more on the information provided by AI. This felt similar to defaulting to a calculator instead of doing mental math. It&rsquo;s been over a year since I published those blogs, and I&rsquo;ve been using AI —perplexity— a lot differently since I started&hellip;</p>
<h2 id="now" class="group relative scroll-mt-20">
  Now
  <a
    href="https://westernwilson.com/reflections/2024-10-24-i-feel-silly-about-how-i-used-to-treat-ai/#now"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>Firstly, a bit of background, I work in tech for Xero and I&rsquo;ve met so many awesome people there. Luckily for me, I&rsquo;ve got a mentor who is a fantastic Engineer and an amazing Writer, seriously, it&rsquo;s their superpower; and I&rsquo;ve been heavily influenced by them. Their guidance has helped me to structure my thoughts more clearly and to approach writing with more confidence.</p>
<p>They shared an amazing blog that talks about the different roles in the writing process:</p>
<ul>
<li>Madman - full of ideas, jumbled thoughts and is where writing should start</li>
<li>Architect - arranges the jumble into potential arguments, at the paragraph level</li>
<li>Carpenter - sculpts the sentences into a logical structure to make better sense</li>
<li>Judge - critical energy as the inspector and will check the facts of what is written</li>
</ul>
<p>Applying these roles to my own writing revealed a crucial insight: that my writer&rsquo;s paralysis was me prematurely judging the madman before he could cook. I&rsquo;d critisise the words, sentences, paragraph, headings, scope, purpose, before my madman even had a chance to shine. No wonder I got scared of writing, and wrote at a snail pace.</p>
<p>The madman within needs some air time; sometimes you just need a good ol&rsquo; brain dump. Giving myself that permission totally freed me from the fear of writing. Nowadays, as soon as I feel myself being critical, I catch myself and think: &ldquo;Is it time to judge yet?&rdquo;</p>
<h2 id="final-points" class="group relative scroll-mt-20">
  Final points
  <a
    href="https://westernwilson.com/reflections/2024-10-24-i-feel-silly-about-how-i-used-to-treat-ai/#final-points"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>To wrap up, some final thoughts about using AI as a writing companion:</p>
<ol>
<li>The point of writing is the act itself; letting AI take over robs you of expressing your own voice and innate creativity.</li>
<li>I think AI LLMs are great companions for writing, but remember:
<ul>
<li>Ideally, keep personal information out of it.</li>
<li>If you do put some personal information in, at least use temporary chats and disable model training</li>
<li>Also check with your company before putting sensitive information or private IP like code into it for work</li>
</ul>
</li>
<li>On the flip side, I want to share Derek Sivers <a href="https://sive.rs/ai">article here</a> that talks about his commitment to not use AI to generate text. ‍
<blockquote>
<p>I have never ever used AI to generate text in place of my “voice”. No emails. No sentences in my articles or books or even comments. Nothing pretending to be me.</p>
</blockquote>
</li>
</ol>
]]></content:encoded></item><item><title>Unleashing the Writer Within: How ChatGPT Transformed My Writing</title><link>https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/</link><pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate><guid>https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/</guid><description>I don’t consider myself a writer. Two reasons: I don’t write enough, and my writing doesn’t meet the quality standards of my internal critic. Writing, for me, has at times, been a struggle. Crafting the structure of what I want to write comes naturally to me, but fleshing out the content feels fluffy and sometimes overwhelming.&#10;The Writing Struggle Many of us share the same struggle – the fear that our words fall short, the dread of writer’s block, or the inability to transform ideas into coherent text. But I’ve recently been using a powerful tool to overcome these hurdles: ChatGPT.&#10;</description><content:encoded><![CDATA[<p>I don&rsquo;t consider myself a writer. Two reasons: I don&rsquo;t write enough, and my writing doesn&rsquo;t meet the quality standards of my internal critic. Writing, for me, has at times, been a struggle. Crafting the structure of what I want to write comes naturally to me, but fleshing out the content feels fluffy and sometimes overwhelming.</p>
<h2 id="the-writing-struggle" class="group relative scroll-mt-20">
  The Writing Struggle
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#the-writing-struggle"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>Many of us share the same struggle – the fear that our words fall short, the dread of writer&rsquo;s block, or the inability to transform ideas into coherent text. But I&rsquo;ve recently been using a powerful tool to overcome these hurdles: ChatGPT.</p>
<h2 id="chatgpt-your-writing-partner" class="group relative scroll-mt-20">
  ChatGPT: Your Writing Partner
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#chatgpt-your-writing-partner"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>Here&rsquo;s how AI, be it ChatGPT, Bard, Bing Chat, or another variant, has revolutionized my writing process:</p>
<h3 id="1-fleshing-out-each-section" class="group relative scroll-mt-20">
  1. Fleshing Out Each Section
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#1-fleshing-out-each-section"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h3>
<p>I begin with strong ideas but struggle to elaborate on paper. While structure comes easily, content remains challenging. ChatGPT breathes life into my drafts, making them comprehensive and informative.</p>
<h3 id="2-simplifying-overloaded-sentences" class="group relative scroll-mt-20">
  2. Simplifying Overloaded Sentences
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#2-simplifying-overloaded-sentences"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h3>
<p>My writing can get tangled in long, complex sentences. ChatGPT excels at simplifying these, making my writing concise and reader-friendly. It trims the fluff and gets to the core of the message.</p>
<h3 id="3-ideation-booster" class="group relative scroll-mt-20">
  3. Ideation Booster
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#3-ideation-booster"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h3>
<p>When I&rsquo;m stuck in a creative rut, ChatGPT offers a treasure trove of inspiration. It sparks new ideas, suggests alternative angles, and helps me overcome mental barriers.</p>
<h2 id="some-additional-considerations" class="group relative scroll-mt-20">
  Some additional considerations
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#some-additional-considerations"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<h3 id="privacy-concerns" class="group relative scroll-mt-20">
  Privacy concerns
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#privacy-concerns"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h3>
<p>When using AI tools like ChatGPT, prioritize privacy and <del>avoid sharing</del> don&rsquo;t share sensitive information. Review the terms of service and privacy policies on OpenAI&rsquo;s website for a better understanding of data handling:</p>
<p>Here is two useful links for ChatGPT:</p>
<ul>
<li><a href="https://tosdr.org/en/service/7108">https://tosdr.org/en/service/7108</a></li>
<li><a href="https://openai.com/policies">https://openai.com/policies</a></li>
</ul>
<h3 id="double-check-your-outputs" class="group relative scroll-mt-20">
  Double-check your outputs
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#double-check-your-outputs"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h3>
<p>While AI can be a helpful companion in your writing journey, it&rsquo;s essential to double-check the outputs and make sure they align with your intended message. The human touch remains critical in the final editing process. This blog is a great example of that, originally the conclusion said I was a &ldquo;professional writer&rdquo; before I touched it up.</p>
<h2 id="in-conclusion-embrace-your-inner-writer" class="group relative scroll-mt-20">
  In Conclusion: Embrace Your Inner Writer
  <a
    href="https://westernwilson.com/reflections/2023-11-6-im-not-a-writer/#in-conclusion-embrace-your-inner-writer"
    class="heading-anchor ml-2 text-sm no-underline! opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 [@media(hover:none)]:opacity-100 [color:var(--c-muted)] hover:[color:var(--c-accent)] transition-opacity"
    aria-label="Link to this heading"
  ><i class="fa-solid fa-link" aria-hidden="true"></i></a>
</h2>
<p>My writing journey has been marked by struggles; however, AI tools like ChatGPT have been a game-changer, assisting me in fleshing out sections, simplifying complex sentences, and boosting my creativity when I hit a rut. It&rsquo;s a powerful tool for any writer.</p>
<p>But as with any tool, it&rsquo;s crucial to be mindful of privacy concerns when using AI, and always review and edit the output to ensure it aligns with your intended message. The human touch remains essential in the final editing process. Just like this blog, where the initial conclusion labeled me as a &ldquo;professional writer&rdquo; before my own edits. So, embrace the assistance AI offers, but remember that your unique voice and perspective play a vital role in crafting the perfect piece.</p>
]]></content:encoded></item></channel></rss>