<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://blog.warrimoo.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.warrimoo.net/" rel="alternate" type="text/html" /><updated>2026-06-18T09:32:52+00:00</updated><id>https://blog.warrimoo.net/feed.xml</id><title type="html">Warrimoo Blog</title><subtitle>Thoughts on AI, technology, veterinary software, and building things that matter — from the team at Warrimoo.</subtitle><author><name>Steve Rose</name><email>steve@warrimoo.net</email></author><entry><title type="html">Why We Build Offline-First Apps</title><link href="https://blog.warrimoo.net/engineering/2026/06/building-offline-first-apps/" rel="alternate" type="text/html" title="Why We Build Offline-First Apps" /><published>2026-06-18T00:00:00+00:00</published><updated>2026-06-18T00:00:00+00:00</updated><id>https://blog.warrimoo.net/engineering/2026/06/building-offline-first-apps</id><content type="html" xml:base="https://blog.warrimoo.net/engineering/2026/06/building-offline-first-apps/"><![CDATA[<p>Every app wants to be connected. Every service wants your data in their cloud. Every onboarding flow starts with “create an account.”</p>

<p>At Warrimoo, we build offline-first. Here’s why, and what we’ve learned from the experience.</p>

<h2 id="the-case-for-offline-first">The case for offline-first</h2>

<p>When we started building <a href="https://warrimoo.net/apps/treatmypet.html">TreatMyPet</a>, we made a deliberate choice: the app would work entirely on-device, with no account required, no cloud sync, and no data leaving the user’s phone.</p>

<p>This wasn’t a technical limitation — it was a design philosophy driven by three beliefs:</p>

<h3 id="1-privacy-by-architecture-not-policy">1. Privacy by architecture, not policy</h3>

<p>A privacy policy is a promise. An offline-first architecture is a guarantee.</p>

<p>When your pet’s health data never leaves your device, there’s nothing to breach, nothing to sell, and nothing to subpoena. You don’t need to trust us with your data because we never have it in the first place.</p>

<h3 id="2-reliability-in-the-real-world">2. Reliability in the real world</h3>

<p>Pet emergencies don’t wait for good reception. You might need your pet’s medication history at a rural vet clinic, in a car on the way to the emergency hospital, or at a property with no mobile coverage.</p>

<p>Offline-first means the app works everywhere, every time, instantly. No loading spinners, no “connection lost” banners, no degraded experience.</p>

<h3 id="3-respect-for-the-user">3. Respect for the user</h3>

<p>Not every app needs an account. Not every feature needs analytics. Not every interaction needs to be tracked, measured, and optimised.</p>

<p>Sometimes the most respectful thing you can do for your users is to simply give them a tool that works and then get out of the way.</p>

<h2 id="the-trade-offs">The trade-offs</h2>

<p>Let’s be honest about what you give up:</p>

<p><strong>No cross-device sync</strong> — your data lives on one device. We mitigate this with local backup and export features, but it’s a genuine limitation.</p>

<p><strong>No collaborative features</strong> — without a server, there’s no way for two users to share data in real-time. For a personal pet care app this is fine; for other products it might be a dealbreaker.</p>

<p><strong>No server-side intelligence</strong> — we can’t run analytics, personalise recommendations, or improve the product based on aggregate usage data. We have to get the product right through design and user feedback, not A/B testing.</p>

<p><strong>Recovery is harder</strong> — if you lose your phone without a backup, your data is gone. Cloud-synced apps have an advantage here.</p>

<h2 id="what-weve-learned">What we’ve learned</h2>

<p>Building offline-first forces you to think differently about data architecture. A few lessons:</p>

<p><strong>Design your data model carefully</strong> — you can’t easily migrate schemas when the database lives on millions of individual devices. Get it right early, and design for forwards compatibility.</p>

<p><strong>Give users control over their data</strong> — export, backup, and import aren’t afterthoughts. They’re core features. Your users should always be able to get their data out in a useful format.</p>

<p><strong>Performance is a feature</strong> — when everything is local, the app can be genuinely instant. No network latency, no loading states, no optimistic UI tricks. This sets a user expectation that you need to maintain.</p>

<p><strong>Test on real devices</strong> — simulators don’t tell you what a three-year-old phone with 2GB of RAM and a fragmented filesystem will do with your local database.</p>

<h2 id="is-offline-first-right-for-your-app">Is offline-first right for your app?</h2>

<p>It depends on your product and your values. But I’d encourage more developers to at least consider it. The cloud-first default isn’t always the right choice, and the trade-offs of offline-first are often less severe than people assume.</p>

<p>Your users will appreciate an app that just works — no account, no internet, no excuses.</p>]]></content><author><name>steve</name></author><category term="Engineering" /><category term="offline-first" /><category term="privacy" /><category term="mobile-development" /><category term="treatmypet" /><summary type="html"><![CDATA[Every app wants to be connected. Every service wants your data in their cloud. Every onboarding flow starts with “create an account.”]]></summary></entry><entry><title type="html">Understanding AI Agents: Beyond the Chatbot</title><link href="https://blog.warrimoo.net/ai/2026/06/understanding-ai-agents/" rel="alternate" type="text/html" title="Understanding AI Agents: Beyond the Chatbot" /><published>2026-06-18T00:00:00+00:00</published><updated>2026-06-18T00:00:00+00:00</updated><id>https://blog.warrimoo.net/ai/2026/06/understanding-ai-agents</id><content type="html" xml:base="https://blog.warrimoo.net/ai/2026/06/understanding-ai-agents/"><![CDATA[<p>The term “AI agent” gets thrown around a lot these days, often with more marketing enthusiasm than technical precision. Let’s cut through the noise and look at what agents actually are, why they matter, and where they’re genuinely useful versus where they’re mostly hype.</p>

<h2 id="what-makes-an-agent-different-from-a-chatbot">What makes an agent different from a chatbot?</h2>

<p>A chatbot responds to your input with text. An agent does something about it.</p>

<p>The distinction comes down to three capabilities that a basic language model doesn’t have on its own:</p>

<ol>
  <li><strong>Tool use</strong> — the ability to call external functions, APIs, or services</li>
  <li><strong>Planning</strong> — breaking a complex goal into steps and deciding which to take next</li>
  <li><strong>Memory</strong> — retaining context across interactions and learning from outcomes</li>
</ol>

<p>When you combine a large language model with these three capabilities, you get something qualitatively different from a chat interface. You get a system that can reason about a goal, figure out what actions to take, execute those actions, observe the results, and adjust its approach.</p>

<h2 id="a-practical-example">A practical example</h2>

<p>Consider something simple: “Find me the cheapest flight from Sydney to Melbourne next Friday.”</p>

<p>A <strong>chatbot</strong> might tell you which airlines fly that route and suggest you check their websites.</p>

<p>An <strong>agent</strong> could search multiple booking APIs, compare prices, filter by your preferences (direct flights only, departure after 9am), and present you with actual options — or even book one if you’ve authorised it to do so.</p>

<p>The difference isn’t intelligence — it’s agency. The ability to act on the world rather than just describe it.</p>

<h2 id="the-architecture">The architecture</h2>

<p>Most agent systems follow a loop that looks something like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Observe → Think → Act → Observe → Think → Act → ...
</code></pre></div></div>

<p>In practice:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">while</span> <span class="ow">not</span> <span class="n">goal_achieved</span><span class="p">:</span>
    <span class="n">observation</span> <span class="o">=</span> <span class="n">perceive</span><span class="p">(</span><span class="n">environment</span><span class="p">)</span>
    <span class="n">plan</span> <span class="o">=</span> <span class="n">reason</span><span class="p">(</span><span class="n">observation</span><span class="p">,</span> <span class="n">goal</span><span class="p">,</span> <span class="n">memory</span><span class="p">)</span>
    <span class="n">action</span> <span class="o">=</span> <span class="n">select_action</span><span class="p">(</span><span class="n">plan</span><span class="p">,</span> <span class="n">available_tools</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="n">execute</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
    <span class="n">memory</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre></div></div>

<p>The language model handles the “Think” step — it decides what to do next based on what it knows. The tools handle the “Act” step. And the loop continues until the goal is met or the agent decides it can’t proceed.</p>

<h2 id="where-agents-actually-work-well">Where agents actually work well</h2>

<p>After building with and observing various agent systems, here’s where I see genuine value:</p>

<p><strong>Code generation and refactoring</strong> — agents that can read codebases, write code, run tests, and iterate based on results. This is arguably the most mature agent use case today.</p>

<p><strong>Research and analysis</strong> — agents that can search multiple sources, cross-reference information, and synthesise findings. The key is that they can follow threads that a single query wouldn’t uncover.</p>

<p><strong>Workflow automation</strong> — agents that handle multi-step business processes, making decisions at each step based on context. Think: triaging support tickets, processing invoices, managing approvals.</p>

<h2 id="where-they-struggle">Where they struggle</h2>

<p><strong>Anything requiring genuine understanding of consequences</strong> — agents are confident actors, which makes them dangerous when the stakes are high. A human should always be in the loop for decisions that are expensive to reverse.</p>

<p><strong>Long-horizon planning</strong> — current agents are much better at tactical execution (do this, then this, then this) than strategic planning. They can follow a plan, but generating a genuinely good plan for a complex problem is still hard.</p>

<p><strong>Reliability at scale</strong> — when an agent needs to perform the same task thousands of times with high consistency, the stochastic nature of language models becomes a liability. Sometimes you just need deterministic code.</p>

<h2 id="the-honest-take">The honest take</h2>

<p>AI agents are a real and useful technology. They’re not magic, and they’re not going to replace human judgment any time soon. What they do is extend what a single person can accomplish — they’re leverage, not replacement.</p>

<p>The best agent systems I’ve seen are the ones that stay humble: they do what they’re good at, they ask for help when they’re uncertain, and they keep a human informed about what they’re doing and why.</p>

<p>That’s the kind of agent I want to build with. More on that in future posts.</p>]]></content><author><name>steve</name></author><category term="AI" /><category term="ai-agents" /><category term="llm" /><category term="artificial-intelligence" /><summary type="html"><![CDATA[The term “AI agent” gets thrown around a lot these days, often with more marketing enthusiasm than technical precision. Let’s cut through the noise and look at what agents actually are, why they matter, and where they’re genuinely useful versus where they’re mostly hype.]]></summary></entry><entry><title type="html">Welcome to the Warrimoo Blog</title><link href="https://blog.warrimoo.net/general/2026/06/welcome-to-the-warrimoo-blog/" rel="alternate" type="text/html" title="Welcome to the Warrimoo Blog" /><published>2026-06-18T00:00:00+00:00</published><updated>2026-06-18T00:00:00+00:00</updated><id>https://blog.warrimoo.net/general/2026/06/welcome-to-the-warrimoo-blog</id><content type="html" xml:base="https://blog.warrimoo.net/general/2026/06/welcome-to-the-warrimoo-blog/"><![CDATA[<p>Welcome to the Warrimoo blog — a new home for writing about the things that interest me most: artificial intelligence, software development, veterinary technology, and whatever else seems worth exploring.</p>

<h2 id="why-a-blog">Why a blog?</h2>

<p>In a world of tweets and threads, there’s still something valuable about long-form writing. A blog post gives you room to think through an idea properly, to show your working, and to come back and update your thinking as you learn more.</p>

<p>I’ve been building software for a while now, and more recently building <a href="https://warrimoo.net">Warrimoo</a> and <a href="https://warrimoo.net/apps/treatmypet.html">TreatMyPet</a>. Along the way, I keep running into ideas and observations that deserve more than a passing thought — and this is where they’ll live.</p>

<h2 id="what-to-expect">What to expect</h2>

<p>This blog will cover a few broad areas:</p>

<ul>
  <li><strong>AI and machine learning</strong> — we’re living through a remarkable moment in technology. I want to explore what’s happening, what it means, and how to think about it clearly.</li>
  <li><strong>Building software</strong> — lessons from the trenches of shipping real products with a small team.</li>
  <li><strong>Veterinary technology</strong> — the intersection of pet care and software, and why it matters more than people think.</li>
  <li><strong>Everything else</strong> — sometimes you just need to write about something.</li>
</ul>

<h2 id="built-with-jekyll-on-github-pages">Built with Jekyll on GitHub Pages</h2>

<p>This blog itself is built with <a href="https://jekyllrb.com/">Jekyll</a> and hosted on <a href="https://pages.github.com/">GitHub Pages</a>. Posts are written in Markdown, which means I can focus on writing rather than fiddling with a CMS. The design matches the main Warrimoo site — warm coastal colours, clean typography, and hopefully a pleasant reading experience.</p>

<p>If you want to follow along, there’s an <a href="/feed.xml">RSS feed</a> for those of us who still appreciate that sort of thing.</p>

<p>See you in the next post.</p>]]></content><author><name>steve</name></author><category term="General" /><category term="warrimoo" /><category term="announcement" /><summary type="html"><![CDATA[Welcome to the Warrimoo blog — a new home for writing about the things that interest me most: artificial intelligence, software development, veterinary technology, and whatever else seems worth exploring.]]></summary></entry></feed>