Five Years in Orbit16 Oct 2026Elena Daehnhardt |
|
📚 This post is part of the "Technical Blogging & SEO Systems" series
Series: Technical Blogging & SEO Systems (Part 37 of 36)
- Part 16: SEO and Indexing my Blog
- Part 17: Moving to GA4
- Part 18: How I Built This Blog — and How You Can Too
- Part 19: Avoid SEO Penalties on Medium
- Part 20: Creating Websites with AI on Mixo.io
- Part 21: Blog Writing with AI in MindStudio
- Part 22: AI reads my blog
- Part 23: Regaining Website Traffic After Google Updates
- Part 24: Iberia’s Day-long Blackout
- Part 25: Say Goodbye to Grammar Gaffes with Grammarly!
- Part 26: The Most Useful AI-Content and Plagiarism Detection Tools
- Part 27: Two years of Elena's AI Blog
- Part 28: Guest posts about AI and Python
- Part 29: Three years of Elena's AI Blog 🎈
- Part 30: How to Host Your Blog for Free with GitHub Pages
- Part 31: A Journey Through AI and Code
- Part 32: What Is GEO? How I Optimised My Blog for AI Search
- Part 33: One Month of GEO: Traffic Up 51%, But Here's What Actually Moved
- Part 34: Why Some Tutorials are Gated and How You Can Still Read Them
- Part 36: No More Login Required to Read My Gated Tutorials for my Subscribers
- Part 37: Five Years in Orbit
Previous: Part 36 — No More Login Required to Read My Gated Tutorials for my Subscribers
Hello, my Dear Reader,
On 16 October 2021, I hit publish on my very first post. Five years later, that habit hasn’t broken — if anything, this last year is the one where the blog stopped being just a stream of posts and started becoming a small piece of software in its own right. I’m publishing this one on the actual birthday, because there’s a lot to cover — and because there’s a small robot crew orbiting into a “5” on the homepage this month. Go take a look; that’s no coincidence.
What Is Elena’s AI Blog? A Five-Year Overview
At heart, this is still a personal technology blog where I test AI coding assistants, write about machine learning fundamentals, and try to explain things in plain English without losing the technical substance. That mission hasn’t moved an inch since 2021.
What has changed is the shape of the operation behind it: this year I stopped treating the blog as “just Jekyll and Markdown” and started treating it as a system — one with a reader portal, a taxonomy, a recommendation model, and a small team of AI agents doing the unglamorous maintenance work I used to do by hand at 11 pm.
Year five at a glance:
| Area | Figure |
|---|---|
| New posts published this year | 119 (280+ live in total) |
| Subscriber-only deep dives | 111 (45 added this year) |
| Subscriber gifts | 2 PDFs grown to 6 |
| Tag taxonomy | 13 buckets |
| AI Publishing Team | 13 agents |
| Recommendation model | 801 trainable parameters, 246 posts scored |
What Did the Blog Publish in Year Five? 119 New Posts by Topic
Since my last proper look-back, A Journey Through AI and Code, I’ve published 119 new posts — bringing the blog past 280 live posts in total. Here’s the shape of the year, not the full list.
AI Weekly Signals
The weekly news round-up finally settled into a proper series with a proper name. AI Weekly Signals ran 12 times this year, from the open-source gap closing in April through to AI’s trust problem in September — covering everything from tokenizer tax economics to an AI model hacking another AI company to win a competition. AI Weekly Signals is the section of the blog I write closest to “live,” and it’s become the backbone that most other posts branch off from.
Coding Assistants, Agents, and MCP
I kept testing whatever coding tool I was actually using that week, not just the ones getting attention. That meant a four-part Codex CLI series, Antigravity vs Cursor revisited nine months later, and a proper look at my own multi-agent workflow. MCP got its own thread too, starting with local agents on Cline, Ollama and MCP, building up through the new AI Orchestration series — connecting Codex CLI, Cursor and Antigravity via MCP to LangGraph and production-hardening those pipelines — and closing with a gentle introduction to MCP for anyone who joined partway through.
AI Agent Safety: Prompt Injection, Access and Privacy
The more I let agents touch my machine, the more I wanted to know exactly what they could reach. That curiosity produced agents, access, and the confused deputy problem, a privacy playbook for persistent agents, and — my favourite of the year — giving my AI agent the keys to my inbox, then trying to break into it myself. The newest addition, from this month, looks at the attacker’s side: how an intruder with an apparent AI copilot went from stolen credentials to AWS administrator in about eight minutes, and what better IAM design does about it.
Practical Python, Git, and DevOps
The bread and butter kept coming too: the Git Survival Guide series grew with stash, hooks, aliases, and cherry-pick; Python Basics covered error handling through to generators and iterators; and a small MLOps & Deployment thread dealt with the less glamorous reality of Docker permissions and caching Docker Compose builds with BuildKit. The latest instalment, what to do with a private AI lab once it actually works, turns that local-first setup into practical Python use cases.
Forty-five of this year’s posts also grew a deeper, subscriber-only second half — part of a wider system I’ll get to in a moment.
Reader Portal: A Flask App for Accounts, Gifts and Bookmarks
The biggest structural change this year didn’t happen in _posts/ at all. In June, I started building a companion Flask app from scratch, and by 21 August it was live in production at app.daehnhardt.com. It’s not a second blog — it’s the bit a static Jekyll site can’t be: accounts, reader gifts and bookmarks, and a small apps directory, all behind proper login.
The part that touches this blog most directly is gated content. Some tutorials now come in two layers — an open teaser here on daehnhardt.com, and a full subscriber-only deep dive served from the portal. I wrote about the reasoning in why some tutorials are gated, and about closing the awkward extra-login-step in no more login required to read my gated tutorials. There are 111 of these deep dives now, 45 of them added this year alone.
The portal also grew its own directory: a public, searchable list of AI tools at app.daehnhardt.com/apps, with reader submissions, an admin review queue, and full-text search.
Subscriber Gifts, Bookmarks and the Ask Elena Q&A Form
A few smaller things landed this year that I think matter more day-to-day than the big infrastructure pieces.
The subscriber gifts page went from two PDFs to six, now organised into properly categorised sections with cover thumbnails, and — my favourite detail — each download gets personalised for the subscriber collecting it, rather than being a generic anonymous file.
I also added a bookmarking feature so you can build your own reading list as you go: a pin on any post saves it to your account, one bookmark per post, with a site-wide list you can come back to whenever you want to pick up where you left off.
And if you’ve ever wanted to ask me something directly rather than dig through 280 posts yourself, there’s now an Ask Elena form right on the homepage. Ask Elena researches your question against my own back-catalogue and sends a proper, personal reply — from me, with an AI assistant doing the first pass of research, not a canned chatbot answer.
Blog Taxonomy Rebuild: 13 Tag Buckets and BreadcrumbList Markup
If you’ve browsed tags on the blog recently, you’ve felt this one even if you didn’t notice it. The tag system grew organically over five years, which is a polite way of saying it became a small mess — dozens of near-duplicate tags with no relationship to each other.
This year I normalised the whole thing into a 13-bucket taxonomy, added collapsible parent tags so a browse page doesn’t dump 80 tags on you at once, wired breadcrumb navigation through it, and extended the site’s BreadcrumbList structured data to match (Google’s breadcrumb markup guide describes the format). A BreadcrumbList is a schema.org structured-data type that tells search engines where a page sits in the site hierarchy. The taxonomy rebuild is a quiet change, but it’s the difference between a tag page and an actual way to browse five years of writing. The cleaner taxonomy also feeds directly into the AI-search work I wrote about in what is GEO — a cleaner taxonomy gives an AI answer engine a much clearer map of what this blog actually covers.
PyTorch Recommendation Engine for Related Posts
Here’s the one I’m most pleased with as a coder, not just as a blogger. The “related posts” links under my articles used to be picked by hand, which meant they were stale within a month. I replaced that with a small recommendation system, now on its third version: a 3-layer PyTorch MLP (a multilayer perceptron is a feed-forward neural network built from stacked fully connected layers, which PyTorch provides as torch.nn.Linear) — 7 input features in, 32 then 16 hidden units, a single sigmoid output — trained on click/no-click engagement signals to score how likely a reader is to follow a suggested link. With 801 trainable parameters in total (7×32+32, 32×16+16 and 16×1+1, weights plus biases), it trains on my laptop in under five minutes and doesn’t need a GPU. It now regenerates its recommendations regularly across 246 posts and counting.
The recommendation model is genuinely small and does a genuinely useful job — the kind of project that reminds me why I still enjoy writing my own code instead of only calling someone else’s API.
AI Publishing Team: 13 Agents and an Approval Dashboard
The change that’s easiest to describe and hardest to summarise fairly: in July, I built myself an AI Publishing Team — a 13-agent system, each agent with one job (drafting, proofreading, fact-checking, GEO-optimising, scheduling, watching git for problems), coordinating through a shared approval dashboard.
Nothing publishes without my review in that dashboard first; the agents draft and queue, and I decide. It’s evolved since — I moved the agents off local launchd cron jobs and onto scheduled cloud tasks, added a Saturday backlog batch pipeline for posts that needed a second pass, and taught the log view to stop attributing every agent’s work to whichever one happened to run first.
The AI Publishing Team is not a replacement for writing. It’s more like finally having an editor, a proofreader, and a very patient SEO person who doesn’t mind that I change my mind about a title four times.
What Is Planned for Year Six of the Blog?
A few things I want to get to before the sixth anniversary: pushing the AI Apps directory past its current early stage, doing a proper follow-up on how GEO traffic has moved since the one-month result, and — if I’m honest — writing a dedicated post about the recommendation engine’s internals, because 900 parameters solving a real problem deserves more than one paragraph.
Thank you for reading, whichever of these 119 posts brought you here. If you haven’t already, take a look at the homepage between now and 26 October — there’s a small animated thank-you waiting for you. Write to me anytime.
Here’s to five years, and to whatever the next one turns out to be built from.
References
- A Journey Through AI and Code — Four Years of Elena’s AI Blog
- Why Some Tutorials Are Gated and How You Can Still Read Them
- No More Login Required to Read My Gated Tutorials for My Subscribers
- What Is GEO? How I Optimised My Blog for AI Search
- One Month of GEO: Traffic Up 51%
- A Gentle Introduction to MCP
- The reader portal — app.daehnhardt.com
- The AI Apps directory — app.daehnhardt.com/apps
- Subscriber gifts — app.daehnhardt.com/gifts
- Ask Elena about AI
- Breadcrumb (BreadcrumbList) structured data — Google Search Central
- torch.nn.Linear — PyTorch documentation