<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Russell Bloxwich: Writing</title>
    <link>https://russ.dev/posts</link>
    <atom:link href="https://russ.dev/rss.xml" rel="self" type="application/rss+xml" />
    <description>Essays and project write-ups by Russell Bloxwich on software architecture, AI-assisted development, local-first apps, and homelab.</description>
    <language>en-NZ</language>
    <lastBuildDate>Sun, 08 Nov 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>My Development Machine Lives in a Data Centre</title>
      <link>https://russ.dev/posts/remote-development-architecture</link>
      <guid isPermaLink="true">https://russ.dev/posts/remote-development-architecture</guid>
      <description>How I run my day-to-day development across dedicated virtual machines on a single OVH bare-metal server, connecting from thin clients with remote mobile simulators and multi-model agent workflows.</description>
      <pubDate>Sun, 08 Nov 2026 00:00:00 GMT</pubDate>
      <category>Infrastructure</category>
      <category>Developer Tools</category>
      <category>AI-Assisted Development</category>
      <category>Virtualization</category>
      <category>Cloudflare</category>
    </item>
    <item>
      <title>Picking a Language Model Small Enough to Live on Your Phone</title>
      <link>https://russ.dev/posts/on-device-models</link>
      <guid isPermaLink="true">https://russ.dev/posts/on-device-models</guid>
      <description>Benchmarking small language models to run on a phone: why accuracy plateaus at 3-4B, why RAG hurt, and how a deterministic calculator beat the LLM.</description>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
      <category>On-Device AI</category>
      <category>LLM Evaluation</category>
      <category>AI Agents</category>
      <category>TypeScript</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <title>Gratin: Building a Local-First Recipe App</title>
      <link>https://russ.dev/posts/gratin</link>
      <guid isPermaLink="true">https://russ.dev/posts/gratin</guid>
      <description>How Gratin’s original local-first recipe app was built: one React core, desktop and mobile shells, and encrypted sync. Updated for its optional AI connector.</description>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
      <category>Local-First</category>
      <category>CRDTs</category>
      <category>Privacy</category>
      <category>React</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <title>Replacing Our SQL Parser</title>
      <link>https://russ.dev/posts/parser-poc</link>
      <guid isPermaLink="true">https://russ.dev/posts/parser-poc</guid>
      <description>Rewriting a slow, paid ANTLR SQL parser in two days, 3-20x faster on real customer SQL, using a Ralph Wiggum loop and a corpus of production queries.</description>
      <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>AI-Assisted Development</category>
      <category>Software Architecture</category>
      <category>Developer Tools</category>
    </item>
    <item>
      <title>Migrating Off Firestore</title>
      <link>https://russ.dev/posts/parallel-cutover</link>
      <guid isPermaLink="true">https://russ.dev/posts/parallel-cutover</guid>
      <description>A year migrating a frontend off Firestore with dual writes, feature-flagged reads, and SSE for real-time, plus where the abstraction boundary should live.</description>
      <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
      <category>Database Migration</category>
      <category>Software Architecture</category>
      <category>React</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>Fixing a Slow React App</title>
      <link>https://russ.dev/posts/react-performance</link>
      <guid isPermaLink="true">https://russ.dev/posts/react-performance</guid>
      <description>Fixing a slow React app: why memoization is a bandaid, how Redux selectors and a whole workspace in memory caused it, and what actually worked.</description>
      <pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Frontend Performance</category>
      <category>State Management</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>Greenkeeper: A Local Daemon That Babysits Your PRs</title>
      <link>https://russ.dev/posts/greenkeeper</link>
      <guid isPermaLink="true">https://russ.dev/posts/greenkeeper</guid>
      <description>Greenkeeper is a local Go daemon that watches your GitHub PRs and runs your AI CLI in a git worktree when CI fails, conflicts appear, or reviews stall.</description>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <category>Go</category>
      <category>Developer Tools</category>
      <category>AI Agents</category>
      <category>AI-Assisted Development</category>
    </item>
    <item>
      <title>Cursor Model ROI</title>
      <link>https://russ.dev/posts/cursor-roi</link>
      <guid isPermaLink="true">https://russ.dev/posts/cursor-roi</guid>
      <description>An archived React dashboard comparing Cursor models on price, cache economics, Arena scores, and speed. Retired in October 2026.</description>
      <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Developer Tools</category>
      <category>AI-Assisted Development</category>
      <category>Data Visualization</category>
    </item>
    <item>
      <title>Clipboard Inspector</title>
      <link>https://russ.dev/posts/clipboard-inspector</link>
      <guid isPermaLink="true">https://russ.dev/posts/clipboard-inspector</guid>
      <description>Inspect clipboard formats your browser exposes, edit supported content, and copy it back with rich previews. Read and write support varies by browser.</description>
      <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Web Platform APIs</category>
      <category>Developer Tools</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>The Registry Pattern</title>
      <link>https://russ.dev/posts/registry-pattern</link>
      <guid isPermaLink="true">https://russ.dev/posts/registry-pattern</guid>
      <description>The registry pattern: a typed lookup table of handlers behind one interface for notifications and AI tool calls, and why it isn&apos;t the service locator.</description>
      <pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>Design Patterns</category>
      <category>Software Architecture</category>
      <category>AI Agents</category>
    </item>
    <item>
      <title>Anon: Peer-to-Peer All-Hands Q&amp;A</title>
      <link>https://russ.dev/posts/anon</link>
      <guid isPermaLink="true">https://russ.dev/posts/anon</guid>
      <description>Peer-to-peer all-hands Q&amp;A with questions kept in browser memory and an optional local AI suggestion that you review and accept before sending.</description>
      <pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Privacy</category>
      <category>On-Device AI</category>
      <category>Web Platform APIs</category>
    </item>
    <item>
      <title>Frontend Three-Layer Architecture</title>
      <link>https://russ.dev/posts/frontend-architecture</link>
      <guid isPermaLink="true">https://russ.dev/posts/frontend-architecture</guid>
      <description>Applying controller-service-repository thinking to React: view models, state management as a data-access layer, and why feature isolation is a lie.</description>
      <pubDate>Sun, 14 Dec 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Software Architecture</category>
      <category>Frontend Performance</category>
      <category>State Management</category>
      <category>Design Patterns</category>
    </item>
    <item>
      <title>Interface Driven Development in the Age of AI</title>
      <link>https://russ.dev/posts/interface-driven-development</link>
      <guid isPermaLink="true">https://russ.dev/posts/interface-driven-development</guid>
      <description>Ship AI-generated code without regret by hiding it behind interfaces: contracts, dependency injection, and why the old Java patterns were right all along.</description>
      <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>AI-Assisted Development</category>
      <category>Design Patterns</category>
      <category>Dependency Injection</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <title>Local First, Offline First, and Cloud</title>
      <link>https://russ.dev/posts/local-first</link>
      <guid isPermaLink="true">https://russ.dev/posts/local-first</guid>
      <description>Local-first vs offline-first vs cloud: who owns your data, why Evolu and CRDTs make local-first practical, and the Paprika problem waiting to strand you.</description>
      <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
      <category>Local-First</category>
      <category>CRDTs</category>
      <category>Privacy</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <title>Error Handling with Neverthrow</title>
      <link>https://russ.dev/posts/neverthrow</link>
      <guid isPermaLink="true">https://russ.dev/posts/neverthrow</guid>
      <description>Typed error handling in TypeScript with neverthrow: three ways to structure errors across layers, a namespace pattern, and exhaustive switch safety.</description>
      <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>Error Handling</category>
      <category>Design Patterns</category>
      <category>Software Architecture</category>
    </item>
    <item>
      <title>Controllers, Services, and Repositories</title>
      <link>https://russ.dev/posts/layered-architecture</link>
      <guid isPermaLink="true">https://russ.dev/posts/layered-architecture</guid>
      <description>Controllers, services, and repositories in TypeScript: hexagonal architecture, why I use classes over functions, and the late-binding trap to avoid.</description>
      <pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>Software Architecture</category>
      <category>Dependency Injection</category>
      <category>Design Patterns</category>
    </item>
    <item>
      <title>My Monorepo Setup</title>
      <link>https://russ.dev/posts/monorepo</link>
      <guid isPermaLink="true">https://russ.dev/posts/monorepo</guid>
      <description>How I run one monorepo for every side project: shared Pulumi infra, a 15-line SPA deploy, why I avoid Vercel, and why I keep coming back to AWS.</description>
      <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
      <category>Monorepo</category>
      <category>AWS</category>
      <category>Infrastructure as Code</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>Cursor Wrapped</title>
      <link>https://russ.dev/posts/cursor-wrapped</link>
      <guid isPermaLink="true">https://russ.dev/posts/cursor-wrapped</guid>
      <description>An archived Spotify Wrapped-style dashboard for Cursor usage, built in a weekend with AI. Retired in October 2026.</description>
      <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>AI-Assisted Development</category>
      <category>Data Visualization</category>
      <category>Developer Tools</category>
    </item>
    <item>
      <title>Secret Santa</title>
      <link>https://russ.dev/posts/santa</link>
      <guid isPermaLink="true">https://russ.dev/posts/santa</guid>
      <description>A Secret Santa organiser with exclusion constraints and shareable links, now using a Cloudflare Worker and KV for new games.</description>
      <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>AWS</category>
      <category>AI-Assisted Development</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>Spoticover: Generative Spotify Playlist Covers</title>
      <link>https://russ.dev/posts/spoticover</link>
      <guid isPermaLink="true">https://russ.dev/posts/spoticover</guid>
      <description>An archived Spotify playlist cover generator with constrained randomness, retired in October 2026.</description>
      <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Web Platform APIs</category>
      <category>AI-Assisted Development</category>
      <category>TypeScript</category>
    </item>
    <item>
      <title>Homelab 2025: Lessons in Redundancy</title>
      <link>https://russ.dev/posts/homelab-2025</link>
      <guid isPermaLink="true">https://russ.dev/posts/homelab-2025</guid>
      <description>Losing 50TB to a RaidZ1 mistake, rebuilding on RaidZ2, and expanding to two nodes: hard-won homelab lessons in ZFS redundancy and failure modes.</description>
      <pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate>
      <category>Homelab</category>
      <category>ZFS / Storage</category>
      <category>Kubernetes</category>
    </item>
    <item>
      <title>TerribleHack 2025</title>
      <link>https://russ.dev/posts/terrible25</link>
      <guid isPermaLink="true">https://russ.dev/posts/terrible25</guid>
      <description>Running TerribleHack 2025 solo for the first time: print disasters, 17 gloriously terrible projects, and a denim trophy the winners tear apart.</description>
      <pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate>
      <category>Hackathon</category>
      <category>Hardware / Maker</category>
      <category>Career &amp; Craft</category>
    </item>
    <item>
      <title>ETHGlobal NYC: HouseHodl</title>
      <link>https://russ.dev/posts/ethglobal-nyc</link>
      <guid isPermaLink="true">https://russ.dev/posts/ethglobal-nyc</guid>
      <description>Flying to ETHGlobal NYC after winning Web3NZ: building HouseHodl, a trustless shared-expenses app, why cross-chain broke, and napping on the venue floor.</description>
      <pubDate>Fri, 01 Aug 2025 00:00:00 GMT</pubDate>
      <category>Web3</category>
      <category>DeFi</category>
      <category>Solidity</category>
      <category>Hackathon</category>
    </item>
    <item>
      <title>LoanMarket - Web3 Hackathon 2025</title>
      <link>https://russ.dev/posts/loanmarket</link>
      <guid isPermaLink="true">https://russ.dev/posts/loanmarket</guid>
      <description>How a team of Web3 first-timers built LoanMarket in 18 hours, sharing one KYC verification across lenders with verifiable credentials, and won best overall.</description>
      <pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate>
      <category>Web3</category>
      <category>Solidity</category>
      <category>React</category>
      <category>Hackathon</category>
    </item>
    <item>
      <title>TerribleHack 2024</title>
      <link>https://russ.dev/posts/terrible24</link>
      <guid isPermaLink="true">https://russ.dev/posts/terrible24</guid>
      <description>Co-organising TerribleHack 2024 as Zac hands over the reins: destroy-your-project challenges, ice-cutlery dinners, and what makes a great maker event.</description>
      <pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate>
      <category>Hackathon</category>
      <category>Hardware / Maker</category>
      <category>Career &amp; Craft</category>
    </item>
    <item>
      <title>Rent Racket</title>
      <link>https://russ.dev/posts/rent-racket</link>
      <guid isPermaLink="true">https://russ.dev/posts/rent-racket</guid>
      <description>Designing Rent Racket, a political landlord-satire card game, at Kiwijam &apos;24: fast paper prototyping, tuning the rules, and laser-cutting the final set.</description>
      <pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate>
      <category>Game Dev</category>
      <category>Hackathon</category>
      <category>Hardware / Maker</category>
    </item>
    <item>
      <title>Fathomiser: Turning Sensor Readings into Useful Water Levels</title>
      <link>https://russ.dev/posts/fathomiser</link>
      <guid isPermaLink="true">https://russ.dev/posts/fathomiser</guid>
      <description>Building the software behind Fathomiser&apos;s water-tank monitoring: decoding device time, estimating volume, displaying history, and handling alerts.</description>
      <pubDate>Mon, 01 Jul 2024 00:00:00 GMT</pubDate>
      <category>IoT</category>
      <category>TypeScript</category>
      <category>React</category>
      <category>AWS</category>
      <category>Product Development</category>
    </item>
    <item>
      <title>TrueNAS Migration</title>
      <link>https://russ.dev/posts/truenas</link>
      <guid isPermaLink="true">https://russ.dev/posts/truenas</guid>
      <description>Migrating a homelab from Unraid and Docker to TrueNAS Scale and Kubernetes: multiple storage classes, ZFS redundancy, GPU passthrough, and K3s in nspawn.</description>
      <pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate>
      <category>Homelab</category>
      <category>Kubernetes</category>
      <category>ZFS / Storage</category>
    </item>
    <item>
      <title>Making Eventing Easier to Build On</title>
      <link>https://russ.dev/posts/mattr-eventing</link>
      <guid isPermaLink="true">https://russ.dev/posts/mattr-eventing</guid>
      <description>My platform work at MATTR: eventing libraries, code generation with ts-morph and string templates, Protobuf contracts, Kafka costs, and the engineering decisions around them.</description>
      <pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate>
      <category>Event-Driven Architecture</category>
      <category>TypeScript</category>
      <category>Developer Tools</category>
      <category>Kafka</category>
      <category>Platform Engineering</category>
    </item>
    <item>
      <title>Mixer Mayhem</title>
      <link>https://russ.dev/posts/mixer-mayhem</link>
      <guid isPermaLink="true">https://russ.dev/posts/mixer-mayhem</guid>
      <description>Building a crowd-controlled robotic bartender at TerribleHack 2023: peristaltic pumps, a WebSocket god-client deploy pattern, and a force-push disaster.</description>
      <pubDate>Wed, 01 Nov 2023 00:00:00 GMT</pubDate>
      <category>Hardware / Maker</category>
      <category>AWS</category>
      <category>Web Platform APIs</category>
      <category>Hackathon</category>
    </item>
    <item>
      <title>InfraNZ</title>
      <link>https://russ.dev/posts/infranz</link>
      <guid isPermaLink="true">https://russ.dev/posts/infranz</guid>
      <description>Building InfraNZ at GovHack 2023: a 3D GIS map of Auckland&apos;s hidden public infrastructure with DeckGL, council open data, and a Rust outage API.</description>
      <pubDate>Sun, 20 Aug 2023 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Open Data / GIS</category>
      <category>Rust</category>
      <category>Hackathon</category>
    </item>
    <item>
      <title>Bustle: A Rewards Program for Public Transport</title>
      <link>https://russ.dev/posts/bustle</link>
      <guid isPermaLink="true">https://russ.dev/posts/bustle</guid>
      <description>Bustle, a GovHack 2022 concept: a loyalty and gamification layer for Auckland public transport, mapping congestion and carbon with open transit data.</description>
      <pubDate>Thu, 01 Sep 2022 00:00:00 GMT</pubDate>
      <category>React</category>
      <category>Open Data / GIS</category>
      <category>Hackathon</category>
    </item>
    <item>
      <title>CNC Tattoo</title>
      <link>https://russ.dev/posts/cnctattoo</link>
      <guid isPermaLink="true">https://russ.dev/posts/cnctattoo</guid>
      <description>Turning a 3D printer into a CNC tattoo machine at the first Terrible Ideas Hackathon: G-code, arm-probing failures, and spring-loading a tattoo gun.</description>
      <pubDate>Fri, 01 Jul 2022 00:00:00 GMT</pubDate>
      <category>Hardware / Maker</category>
      <category>Hackathon</category>
      <category>Python</category>
    </item>
    <item>
      <title>Modernising an App a Piece at a Time</title>
      <link>https://russ.dev/posts/spidertracks-modernisation</link>
      <guid isPermaLink="true">https://russ.dev/posts/spidertracks-modernisation</guid>
      <description>A Spidertracks contract extending React and Redux, moving core JavaScript to TypeScript, and building Node.js endpoints to replace Spring services.</description>
      <pubDate>Fri, 01 Apr 2022 00:00:00 GMT</pubDate>
      <category>TypeScript</category>
      <category>React</category>
      <category>API Design</category>
      <category>Software Architecture</category>
      <category>Legacy Modernisation</category>
    </item>
    <item>
      <title>The Engineering Behind Customer Onboarding</title>
      <link>https://russ.dev/posts/fisher-funds-onboarding</link>
      <guid isPermaLink="true">https://russ.dev/posts/fisher-funds-onboarding</guid>
      <description>Customer onboarding at Fisher Funds: Gatsby and TypeScript forms, MuleSoft and Salesforce integration, junior mentorship, and the case for observability.</description>
      <pubDate>Fri, 01 Oct 2021 00:00:00 GMT</pubDate>
      <category>Fisher Funds</category>
      <category>TypeScript</category>
      <category>Frontend Engineering</category>
      <category>Systems Integration</category>
      <category>Observability</category>
    </item>
    <item>
      <title>Karere: Event-Driven Workflows at Kete Kai</title>
      <link>https://russ.dev/posts/kete-kai-event-driven</link>
      <guid isPermaLink="true">https://russ.dev/posts/kete-kai-event-driven</guid>
      <description>Karere at Kete Kai: AWS SNS as the message broker, serverless saga choreography, local error compensation, and WebSocket updates, compared with today&apos;s Cloudflare Workflows.</description>
      <pubDate>Sat, 01 May 2021 00:00:00 GMT</pubDate>
      <category>AWS</category>
      <category>Event-Driven Architecture</category>
      <category>TypeScript</category>
      <category>React</category>
      <category>Work Experience</category>
    </item>
    <item>
      <title>Owning a Real-Time Frontend at Laminar</title>
      <link>https://russ.dev/posts/laminar-realtime-frontend</link>
      <guid isPermaLink="true">https://russ.dev/posts/laminar-realtime-frontend</guid>
      <description>React, TypeScript, and TradingView UI work at Laminar, connecting a real-time cryptocurrency trading frontend to Node.js, uWebSockets, MongoDB, and Ethereum services.</description>
      <pubDate>Mon, 01 Mar 2021 00:00:00 GMT</pubDate>
      <category>Laminar</category>
      <category>React</category>
      <category>TypeScript</category>
      <category>TradingView</category>
      <category>WebSockets</category>
      <category>Frontend Architecture</category>
      <category>Ethereum</category>
    </item>
    <item>
      <title>Shwoop: Connecting a Mobile Game to the Physical World</title>
      <link>https://russ.dev/posts/shwoop-beacon-game</link>
      <guid isPermaLink="true">https://russ.dev/posts/shwoop-beacon-game</guid>
      <description>Building an iBeacon-based alternate-reality game at Shwoop with React Native, TypeScript, and a serverless AWS REST API.</description>
      <pubDate>Fri, 01 Nov 2019 00:00:00 GMT</pubDate>
      <category>React Native</category>
      <category>TypeScript</category>
      <category>iBeacon</category>
      <category>AWS</category>
      <category>Work Experience</category>
    </item>
  </channel>
</rss>
