<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Harper Tech Lab</title>
    <link>https://harpertechlab.co.uk</link>
    <description>Built, documented, and shipped. AI tools, automation, and web projects by Kieron Harper.</description>
    <language>en-gb</language>
    <atom:link href="https://harpertechlab.co.uk/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title><![CDATA[Day 100: Done]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-100-done/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-100-done/</guid>
      <description><![CDATA[One hundred consecutive days of writing. Here's what the complete picture looks like, what worked, what didn't, and what comes next.]]></description>
      <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 99: The Second-to-Last Post]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-99-penultimate/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-99-penultimate/</guid>
      <description><![CDATA[One day before done. Some thoughts on what finishing actually means and what comes next.]]></description>
      <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 98: Staying Sharp Over the Long Term]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-98-developer-burnout-prevention/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-98-developer-burnout-prevention/</guid>
      <description><![CDATA[Technical fields move fast. Staying relevant and engaged over a long career requires something more deliberate than just showing up.]]></description>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 97: Consistency Over Intensity — The Evidence]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-97-consistency-over-intensity-2/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-97-consistency-over-intensity-2/</guid>
      <description><![CDATA[Day 68 I wrote about consistency in theory. Day 97 I can write about it from near-complete evidence. The data is in.]]></description>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 96: Building Things That Matter]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-96-building-things-that-matter/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-96-building-things-that-matter/</guid>
      <description><![CDATA[After years of building things, the question of what's worth building gets more interesting, not less. Here's how I think about it.]]></description>
      <pubDate>Thu, 20 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 95: What I'd Tell Myself Starting Out]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-95-what-id-tell-myself/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-95-what-id-tell-myself/</guid>
      <description><![CDATA[Looking back across the career decisions, approaches, and beliefs that shaped where I am. The advice I'd give myself starting out as a developer.]]></description>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 94: Looking Back at Day One]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-94-looking-back-at-day-1/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-94-looking-back-at-day-1/</guid>
      <description><![CDATA[Reading the first post from a hundred days later. What's different, what's the same, and whether the challenge delivered what I hoped.]]></description>
      <pubDate>Tue, 18 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 93: The 10,000 Hours Myth and What Actually Builds Expertise]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-93-10000-hours/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-93-10000-hours/</guid>
      <description><![CDATA[The 10,000 hours rule is widely cited and mostly misunderstood. Here's what the research actually says and what it means for becoming a better developer.]]></description>
      <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 92: Developer Burnout — What It Actually Is and How to Avoid It]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-92-developer-burnout/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-92-developer-burnout/</guid>
      <description><![CDATA[Burnout is discussed a lot and understood poorly. Here's what I've seen it look like, what actually causes it, and what helps.]]></description>
      <pubDate>Sun, 16 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 91: What Makes a Good Portfolio Project]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-91-good-portfolio-project/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-91-good-portfolio-project/</guid>
      <description><![CDATA[Most portfolio advice tells you what to build. More useful: what makes a project actually impressive and what makes a reviewer's eyes glaze over.]]></description>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 90: Small, Focused Tools]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-90-small-focused-tools/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-90-small-focused-tools/</guid>
      <description><![CDATA[The best developer tools do one thing exceptionally well. Here's why small, focused tools win in the long run and how to build them.]]></description>
      <pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 89: Reading Source Code as a Learning Strategy]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-89-reading-source-code/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-89-reading-source-code/</guid>
      <description><![CDATA[Most developers underuse source code as a learning resource. Reading the source of tools you use teaches things no tutorial covers.]]></description>
      <pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 88: Ten Days to Go]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-88-ten-days-to-go/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-88-ten-days-to-go/</guid>
      <description><![CDATA[Ten posts left. Some thoughts on what completing a long challenge actually feels like, and what I'll carry forward.]]></description>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 87: Staying Organised as a Developer]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-87-staying-organised/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-87-staying-organised/</guid>
      <description><![CDATA[Tools and systems I actually use to stay on top of multiple projects, tasks, and learning without losing things or losing focus.]]></description>
      <pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 86: AI and the Future of Software Development]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-86-ai-and-software-future/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-86-ai-and-software-future/</guid>
      <description><![CDATA[Predictions are usually wrong, but some things are clear. Here's what I think is actually changing in how software gets built.]]></description>
      <pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 85: Python for Web Developers — What You Need to Know]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-85-python-for-web-devs/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-85-python-for-web-devs/</guid>
      <description><![CDATA[If you come from JavaScript/TypeScript, Python for backend work has a learning curve. Here's the translation guide and the things that'll trip you up.]]></description>
      <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 84: Shipping Side Projects — The Part Nobody Talks About]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-84-shipping-side-projects/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-84-shipping-side-projects/</guid>
      <description><![CDATA[Most side projects die before anyone uses them. Here's what I've learned about actually getting things to done and out into the world.]]></description>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 83: Fine-Tuning vs Prompting — When Each Is Right]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-83-finetuning-vs-prompting/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-83-finetuning-vs-prompting/</guid>
      <description><![CDATA[Fine-tuning gets proposed as a solution when a better prompt would work. Here's how to think about the tradeoff honestly.]]></description>
      <pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 82: Git Branching Strategies That Work]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-82-git-branches/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-82-git-branches/</guid>
      <description><![CDATA[Branching strategies matter more in teams than in solo projects. Here's what I've seen work, what hasn't, and how to pick the right one.]]></description>
      <pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 81: Getting Consistent Results from LLM Prompts]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-81-consistent-prompt-results/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-81-consistent-prompt-results/</guid>
      <description><![CDATA[LLM outputs are inherently variable. Here's how to reduce that variance and get reliable, predictable results in production.]]></description>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 80: Building in Public — What I've Learned]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-80-building-in-public/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-80-building-in-public/</guid>
      <description><![CDATA[Eighty days of writing publicly about what I'm building and learning. Here's the honest picture of what building in public does and doesn't do.]]></description>
      <pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 79: Python Standard Library Gems You Might Be Missing]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-79-python-stdlib/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-79-python-stdlib/</guid>
      <description><![CDATA[The Python standard library has a lot in it. Here are the modules I use regularly that aren't as well-known as they should be.]]></description>
      <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 78: A Portfolio That Shows Work, Not Aspirations]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-78-portfolio-that-shows-work/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-78-portfolio-that-shows-work/</guid>
      <description><![CDATA[Most developer portfolios have the same problem: they show what the developer wants to be known for, not what they've actually done. Here's how to fix that.]]></description>
      <pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 77: Publishing a Python Package]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-77-python-packages/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-77-python-packages/</guid>
      <description><![CDATA[Making a Python project installable via pip is less complicated than it looks. Here's the complete process.]]></description>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 76: Debugging LLM Prompts — A Systematic Approach]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-76-debugging-prompts/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-76-debugging-prompts/</guid>
      <description><![CDATA[When an LLM feature isn't working well, debugging is different from traditional code debugging. Here's the systematic approach that actually helps.]]></description>
      <pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 75: From Junior to Senior — What Actually Changes]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-75-junior-to-senior/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-75-junior-to-senior/</guid>
      <description><![CDATA[The difference between junior and senior developers isn't the amount of code they know. Here's what actually changes.]]></description>
      <pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 74: Building a Streaming Chatbot UI]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-74-streaming-chatbot-ui/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-74-streaming-chatbot-ui/</guid>
      <description><![CDATA[A complete streaming chatbot interface — from the API call to the React component that renders text as it arrives.]]></description>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 73: Three Quarters Done — What I Know Now]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-73-three-quarters/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-73-three-quarters/</guid>
      <description><![CDATA[Seventy-three days. Twenty-seven to go. Here's an honest account of what writing every day for two and a half months has produced.]]></description>
      <pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 72: Writing Documentation People Actually Read]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-72-documentation/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-72-documentation/</guid>
      <description><![CDATA[Most documentation is written for the writer, not the reader. Here's how to write docs that actually help.]]></description>
      <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 71: Keyboard Shortcuts That Made Me Faster]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-71-keyboard-shortcuts/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-71-keyboard-shortcuts/</guid>
      <description><![CDATA[The shortcuts I actually use every day. Not a comprehensive list — the ones that changed how I work.]]></description>
      <pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 70: Context Window Management in LLM Applications]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-70-context-window-management/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-70-context-window-management/</guid>
      <description><![CDATA[Long conversations and large documents push against context window limits. Here's how to manage context effectively without losing coherence.]]></description>
      <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 69: Python Concurrency — Threads, Processes, and Async]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-69-python-concurrency/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-69-python-concurrency/</guid>
      <description><![CDATA[Python has three concurrency models and choosing the wrong one explains half the performance bugs I've seen. Here's which to use when.]]></description>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 68: Consistency Over Intensity]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-68-consistency/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-68-consistency/</guid>
      <description><![CDATA[Sixty-eight days of daily writing has taught me something about how progress actually works. It's not what I expected.]]></description>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 67: The Economics of Building with AI APIs]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-67-ai-economics/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-67-ai-economics/</guid>
      <description><![CDATA[API costs are easy to ignore in development and hard to ignore in production. Here's how to think about the economics before you commit to an approach.]]></description>
      <pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 66: Automation That Saves Real Time]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-66-automation/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-66-automation/</guid>
      <description><![CDATA[Not all automation is worth building. Here's how I think about what to automate, and the things I've automated that actually save meaningful time.]]></description>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 65: What I Got Wrong About AI]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-65-what-i-got-wrong-about-ai/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-65-what-i-got-wrong-about-ai/</guid>
      <description><![CDATA[I've been building with LLMs for a while now. Here are the things I believed at the start that turned out to be wrong.]]></description>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 64: Error Handling in TypeScript — The Patterns That Work]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-64-error-handling-typescript/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-64-error-handling-typescript/</guid>
      <description><![CDATA[Error handling is often an afterthought. Here are the TypeScript patterns that make error handling explicit, typed, and maintainable.]]></description>
      <pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 63: Python Decorators — Beyond the Basics]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-63-decorators/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-63-decorators/</guid>
      <description><![CDATA[Decorators are one of Python's most powerful features. Here's the mental model and the patterns I use regularly.]]></description>
      <pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 62: Building a Personal Knowledge Base with LLMs]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-62-knowledge-base/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-62-knowledge-base/</guid>
      <description><![CDATA[Notes, bookmarks, and documentation scattered everywhere. Here's how to build a searchable personal knowledge base that you can actually talk to.]]></description>
      <pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 61: Data Fetching Patterns in Next.js]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-61-fetch-patterns/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-61-fetch-patterns/</guid>
      <description><![CDATA[Next.js gives you several ways to fetch data. Here's how to choose between them and the patterns that work well in practice.]]></description>
      <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 60: Writing Python That Others Can Read]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-60-readable-python/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-60-readable-python/</guid>
      <description><![CDATA[Code is read more often than it's written. Here are the habits that make Python code easy to understand six months later.]]></description>
      <pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 59: Caching LLM Calls — When and How]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-59-caching-llm/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-59-caching-llm/</guid>
      <description><![CDATA[LLM API calls are slow and expensive. Smart caching can reduce both without changing the user experience. Here's the practical approach.]]></description>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 58: Two Months In — The Shape of the Challenge]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-58-two-months/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-58-two-months/</guid>
      <description><![CDATA[Eight weeks of daily posts. What I know now that I didn't at the start, what's surprised me, and what the last six weeks look like.]]></description>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 57: Python subprocess — Running External Commands Properly]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-57-python-subprocess/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-57-python-subprocess/</guid>
      <description><![CDATA[subprocess is the right way to run shell commands from Python. Here's the API that matters and how to avoid the common mistakes.]]></description>
      <pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 56: Building a Document Q&A System]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-56-document-qa/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-56-document-qa/</guid>
      <description><![CDATA[A complete document Q&A system — upload a PDF, ask questions about it. Here's how to build one that actually works well.]]></description>
      <pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 55: TypeScript Features I Wish I'd Learned Earlier]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-55-typescript-advanced/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-55-typescript-advanced/</guid>
      <description><![CDATA[Beyond basic types, TypeScript has features that eliminate entire categories of bugs. Here are the ones worth knowing and when to reach for them.]]></description>
      <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 54: Getting Consistent Structured Outputs from LLMs]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-54-structured-outputs/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-54-structured-outputs/</guid>
      <description><![CDATA[Getting an LLM to return JSON reliably is harder than it looks. Here are the techniques that actually work in production.]]></description>
      <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 53: How to Read a Codebase You've Never Seen Before]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-53-reading-codebases/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-53-reading-codebases/</guid>
      <description><![CDATA[Reading unfamiliar code is a skill that doesn't get taught. Here's the approach I use to get oriented in a new codebase without getting lost.]]></description>
      <pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 52: CSS Animations That Don't Annoy People]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-52-css-animations/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-52-css-animations/</guid>
      <description><![CDATA[CSS animations are easy to overdo. Here's how to use motion purposefully — transitions that improve UX, and the patterns to avoid.]]></description>
      <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 51: Handling LLM Hallucinations in Production]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-51-hallucination/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-51-hallucination/</guid>
      <description><![CDATA[Hallucination isn't a bug to be fixed — it's a property of how LLMs work. Here's how to design systems that handle it rather than hoping it doesn't happen.]]></description>
      <pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 50: API Design — Principles That Hold Up]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-50-api-design/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-50-api-design/</guid>
      <description><![CDATA[Halfway done. To mark the occasion, here's something I've thought a lot about: what makes an API easy to use, and how to get there without a full specification process.]]></description>
      <pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 49: Python Generators — Lazy Evaluation That Actually Matters]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-49-python-generators/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-49-python-generators/</guid>
      <description><![CDATA[Generators are one of the Python features that feel academic until you hit a problem they solve elegantly. Here's when they matter and how to use them.]]></description>
      <pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 48: Nearly Halfway — What I Actually Think About This Challenge]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-48-halfway/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-48-halfway/</guid>
      <description><![CDATA[Forty-eight days in. Honest thoughts on what writing daily does to your thinking, what I'd change, and whether this is worth the effort.]]></description>
      <pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 47: Using LLMs for Code — What Works and What Doesn't]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-47-llms-for-code/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-47-llms-for-code/</guid>
      <description><![CDATA[LLMs have changed how I write code, but not in the way most people describe. Here's the honest picture of where they help and where they don't.]]></description>
      <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 46: Building Reusable React Components]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-46-reusable-components/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-46-reusable-components/</guid>
      <description><![CDATA[Component reusability is often over-engineered or under-engineered. Here's how I think about when to abstract and how to do it well.]]></description>
      <pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 45: Python Testing — The Approach That Actually Works]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-45-python-testing/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-45-python-testing/</guid>
      <description><![CDATA[Testing has a reputation for being slow, painful, and of questionable value. Here's the approach that produces tests worth having.]]></description>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 44: How to Evaluate LLM Outputs]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-44-evaluating-llm-outputs/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-44-evaluating-llm-outputs/</guid>
      <description><![CDATA[Building an LLM feature is the easy part. Knowing if it's working well is harder. Here's how to think about evaluation and what I use in practice.]]></description>
      <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 43: Web Accessibility — The Parts That Matter Most]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-43-accessibility/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-43-accessibility/</guid>
      <description><![CDATA[Accessibility is often treated as a compliance checkbox. The actual goal is building things that work for more people. Here's what makes the biggest difference.]]></description>
      <pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 42: Python Environments — Stop Fighting Them]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-42-python-environments/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-42-python-environments/</guid>
      <description><![CDATA[Virtual environments, pyenv, conda, venv, uv — the Python environment ecosystem is confusing. Here's the mental model and the setup that actually works.]]></description>
      <pubDate>Sat, 27 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 41: Multi-Agent Systems — When One LLM Isn't Enough]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-41-multi-agent/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-41-multi-agent/</guid>
      <description><![CDATA[Multi-agent architectures sound complex but follow a few patterns. Here's when they make sense and how to implement a simple one.]]></description>
      <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 40: Streaming LLM Responses — Why and How]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-40-streaming-llm/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-40-streaming-llm/</guid>
      <description><![CDATA[Streaming changes how LLM-powered interfaces feel. Here's how streaming works, when to use it, and how to implement it with the Anthropic API.]]></description>
      <pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 39: Python Logging — Doing It Properly]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-39-python-logging/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-39-python-logging/</guid>
      <description><![CDATA[Most Python projects I've seen use print statements for debugging. Here's why proper logging matters and the setup that actually works.]]></description>
      <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 38: Deploying Python Applications — What Actually Matters]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-38-deploying-python/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-38-deploying-python/</guid>
      <description><![CDATA[Getting a Python app running locally is easy. Getting it running reliably in production is a different problem. Here's the practical picture.]]></description>
      <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 37: Pydantic — Runtime Validation Done Right]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-37-pydantic/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-37-pydantic/</guid>
      <description><![CDATA[Pydantic is the most useful Python library I use that isn't in the standard library. Here's what it does, why it matters, and the patterns I use daily.]]></description>
      <pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 36: React Hooks — The Ones That Matter]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-36-react-hooks/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-36-react-hooks/</guid>
      <description><![CDATA[There are many React hooks but a small number cover most real use cases. Here are the ones I use constantly and how I think about them.]]></description>
      <pubDate>Sun, 21 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 35: Writing System Prompts That Actually Work]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-35-system-prompts/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-35-system-prompts/</guid>
      <description><![CDATA[The system prompt is the highest-leverage part of any LLM application. Here's how I think about writing them and the patterns that produce reliable results.]]></description>
      <pubDate>Sat, 20 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 34: Python Type Hints — The Features That Actually Matter]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-34-python-type-hints/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-34-python-type-hints/</guid>
      <description><![CDATA[Type hints have evolved a lot since they were introduced. Here's what's worth using in modern Python and how to think about the boundaries.]]></description>
      <pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 33: Building a Simple RAG System from Scratch]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-33-simple-rag/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-33-simple-rag/</guid>
      <description><![CDATA[RAG (Retrieval-Augmented Generation) sounds complicated but the basic pattern is straightforward. Here's a minimal working implementation.]]></description>
      <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 32: CSS Patterns I Use Every Day]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-32-css-patterns/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-32-css-patterns/</guid>
      <description><![CDATA[Not a CSS tutorial — the specific patterns and techniques I reach for constantly when building real UIs.]]></description>
      <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 31: Vector Databases — What They Are and When You Need One]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-31-vector-databases/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-31-vector-databases/</guid>
      <description><![CDATA[Vector databases are the storage layer behind most production RAG systems. Here's the concept, the use cases, and the options worth knowing.]]></description>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 30: One Month In — What This Challenge Has Actually Taught Me]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-30-one-month/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-30-one-month/</guid>
      <description><![CDATA[Thirty days of daily writing done. Here's what a month of consistency actually looks like and what I'd do differently starting over.]]></description>
      <pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 29: How I Structure Python Projects]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-29-python-project-structure/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-29-python-project-structure/</guid>
      <description><![CDATA[There's no single right way to structure a Python project, but there are definitely wrong ways. Here's the layout I use and why each part earns its place.]]></description>
      <pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 28: Git Workflows That Actually Work]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-28-git-workflows/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-28-git-workflows/</guid>
      <description><![CDATA[Git is everywhere but git discipline varies wildly. Here's the workflow I've settled on for solo projects and small teams, and why each part matters.]]></description>
      <pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 27: Web Scraping in Python — The Practical Guide]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-27-web-scraping/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-27-web-scraping/</guid>
      <description><![CDATA[Web scraping covers everything from quick data extraction to production pipelines. Here's the approach I use, from simple requests to handling JavaScript-rendered content.]]></description>
      <pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 26: Tailwind CSS — Why I Changed My Mind]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-26-tailwind-css/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-26-tailwind-css/</guid>
      <description><![CDATA[I resisted Tailwind for years. I thought utility classes were a step backwards. Here's what changed my mind and the patterns I actually use.]]></description>
      <pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 25: One Quarter Through — Honest Reflection]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-25-quarter-done/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-25-quarter-done/</guid>
      <description><![CDATA[Twenty-five days of daily writing. What I've actually learned, what I got wrong about the challenge, and what the next 75 days look like.]]></description>
      <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 24: Python Dataclasses — Underused and Underrated]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-24-python-dataclasses/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-24-python-dataclasses/</guid>
      <description><![CDATA[Dataclasses have been in Python since 3.7 and I still see code that could use them but doesn't. Here's why they're worth using and when to reach for them.]]></description>
      <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 23: Docker for Developers Who Keep Putting It Off]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-23-docker-for-developers/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-23-docker-for-developers/</guid>
      <description><![CDATA[Docker has a steep initial learning curve that puts a lot of developers off. Here's the mental model and the minimum you need to actually use it.]]></description>
      <pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 22: Understanding Tokens — What They Are and What They Cost]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-22-understanding-tokens/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-22-understanding-tokens/</guid>
      <description><![CDATA[Tokens are the currency of LLM APIs. Understanding what they are, how they're counted, and how to think about cost will change how you build with AI.]]></description>
      <pubDate>Sun, 07 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 21: Three Weeks In — What's Working and What Isn't]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-21-three-weeks-in/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-21-three-weeks-in/</guid>
      <description><![CDATA[Three weeks of daily writing. Here's an honest look at what the habit feels like, what I've learned about my own consistency, and where I'm adjusting.]]></description>
      <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 20: Python asyncio — The Practical Guide]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-20-asyncio/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-20-asyncio/</guid>
      <description><![CDATA[asyncio is one of those things that's confusing until it clicks. Here's the mental model and the patterns you actually need.]]></description>
      <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 19: The Anthropic Claude API — Getting Started Properly]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-19-anthropic-api/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-19-anthropic-api/</guid>
      <description><![CDATA[A practical introduction to using the Claude API in Python — not just hello world, but the patterns that matter when you're building something real.]]></description>
      <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 18: Working with REST APIs in Python]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-18-python-apis/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-18-python-apis/</guid>
      <description><![CDATA[A practical guide to making HTTP requests in Python — authentication, error handling, rate limiting, and the patterns that work in production.]]></description>
      <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 17: React Server Components — What Actually Changed]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-17-react-server-components/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-17-react-server-components/</guid>
      <description><![CDATA[Server components aren't just a performance trick. They represent a different mental model for how React applications are structured. Here's what actually changed.]]></description>
      <pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 16: TypeScript for Python Developers]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-16-typescript-for-python-devs/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-16-typescript-for-python-devs/</guid>
      <description><![CDATA[If you know Python well and you're learning TypeScript, most of it maps cleanly. Here's the mental model that helped me get productive quickly.]]></description>
      <pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 15: Python f-strings — The Tricks Most People Skip]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-15-python-fstrings/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-15-python-fstrings/</guid>
      <description><![CDATA[f-strings are one of Python's best features. Most developers use 10% of what they can do. Here's the other 90%.]]></description>
      <pubDate>Sun, 31 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 14: Two Weeks In — Keeping the Streak Alive]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-14-two-weeks-in/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-14-two-weeks-in/</guid>
      <description><![CDATA[Fourteen consecutive posts. What's changed, what's stayed the same, and the one unexpected thing I've found useful.]]></description>
      <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 13: Building CLI Tools with Python Click]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-13-python-click-cli/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-13-python-click-cli/</guid>
      <description><![CDATA[Click is the cleanest way to build command-line tools in Python. Here's a practical introduction that goes beyond hello world.]]></description>
      <pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 12: When NOT to Use AI in Your Code]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-12-when-not-to-use-ai/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-12-when-not-to-use-ai/</guid>
      <description><![CDATA[AI is a useful tool. It's not the right tool for everything. Here's how I think about where it actually adds value versus where it creates problems.]]></description>
      <pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 11: RAG vs Fine-tuning — What's the Difference and When Does Each Make Sense?]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-11-rag-vs-finetuning/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-11-rag-vs-finetuning/</guid>
      <description><![CDATA[Two of the most common ways to give an LLM domain-specific knowledge. They solve different problems and are often confused with each other.]]></description>
      <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 10: Prompt Engineering — A Practical Framework]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-10-prompt-engineering/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-10-prompt-engineering/</guid>
      <description><![CDATA[Forget the tricks. Prompt engineering is really just clear communication with a very literal interlocutor. Here's how I actually think about it.]]></description>
      <pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 9: How Context Windows Actually Work]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-9-context-windows/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-9-context-windows/</guid>
      <description><![CDATA[The context window is the most important constraint when building with LLMs. Here's what it is, what happens when you hit it, and how to think about it practically.]]></description>
      <pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 8: Running Ollama for the First Time]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-8-ollama/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-8-ollama/</guid>
      <description><![CDATA[Ollama makes running local AI models genuinely easy. Here's a practical walkthrough of getting set up and what to do once you are.]]></description>
      <pubDate>Sun, 24 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 7: Week One Done]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-7-week-one-done/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-7-week-one-done/</guid>
      <description><![CDATA[Seven consecutive days of publishing. What I've noticed, what's been harder than expected, and what's coming next week.]]></description>
      <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 6: What 'Local AI' Actually Means]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-6-what-local-ai-means/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-6-what-local-ai-means/</guid>
      <description><![CDATA[Running AI models on your own machine sounds technical. It's actually straightforward — and worth understanding why you'd want to.]]></description>
      <pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 5: Setting Up Python Properly]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-5-python-setup/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-5-python-setup/</guid>
      <description><![CDATA[The setup decisions that save you headaches later — virtual environments, package management, and a few things I wish I'd done from the start.]]></description>
      <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 4: Why I Use Next.js for Almost Everything]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-4-why-nextjs/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-4-why-nextjs/</guid>
      <description><![CDATA[After building in plain React, Vue, and Node — Next.js has become my default for web projects. Here's the honest case for it.]]></description>
      <pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 3: The AI Tools I Actually Use Every Day]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-3-ai-tools-i-actually-use/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-3-ai-tools-i-actually-use/</guid>
      <description><![CDATA[Not the ones I've tried once and written about. The ones that are open on my machine right now.]]></description>
      <pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 2: My Development Setup in 2026]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-2-my-dev-setup/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-2-my-dev-setup/</guid>
      <description><![CDATA[The hardware, software, and tools I actually use every day — no sponsorships, no affiliate links, just what's on my machine.]]></description>
      <pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[Day 1: I'm Doing the 100 Days of Blogging Challenge]]></title>
      <link>https://harpertechlab.co.uk/blog/100-days-day-1-starting-the-challenge/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/100-days-day-1-starting-the-challenge/</guid>
      <description><![CDATA[Starting today, I'm committing to publishing one blog post every day for 100 consecutive days. Here's why, and what you can expect.]]></description>
      <pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[I built a NASA space explorer with Python and a local AI]]></title>
      <link>https://harpertechlab.co.uk/blog/building-a-nasa-space-explorer/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/building-a-nasa-space-explorer/</guid>
      <description><![CDATA[NASA publicly tracks every time an asteroid has come close to Earth. There are 90,836 of them. Here's how I turned that data into an interactive explorer with 3D orbits, a star lifecycle chart, and a local AI that can answer questions about all of it.]]></description>
      <pubDate>Sun, 17 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[I Built a Local AI Dungeon Master That Runs on Your Laptop]]></title>
      <link>https://harpertechlab.co.uk/blog/building-an-ai-game-master/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/building-an-ai-game-master/</guid>
      <description><![CDATA[Finding a good Dungeon Master is hard. Finding one available at 11pm on a Tuesday is basically impossible. So I built one — a fully local AI Game Master with combat dice, quest tracking, voice narration, and persistent save states. Here's how.]]></description>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    </item>
    <item>
      <title><![CDATA[I Built an AI Interview Coach That Runs on Your Laptop]]></title>
      <link>https://harpertechlab.co.uk/blog/building-an-ai-interview-coach/</link>
      <guid isPermaLink="true">https://harpertechlab.co.uk/blog/building-an-ai-interview-coach/</guid>
      <description><![CDATA[Most interview prep tools are either a list of generic questions or a cloud service quietly holding onto your CV. I wanted neither. Here's how I built a fully local AI mock interviewer — and how you can run it yourself.]]></description>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>