Latest Posts

  • Two Brains for My AI: How Obsidian and Trilium Split the Work

    I've spent the last few months tinkering with a local AI stack on my desktop — Ollama for local inference, Hermes orchestrating the whole thing, and a Claude subscription for the heavy lifting. It works. But there was always one nagging gap I kept dancing around: where does the AI's memory actually live?

    For a while I went back and forth on whether to use Obsidian or Trilium as the knowledge store. I tried picking one. I tried picking the other. And then it finally clicked that I was asking the wrong question. They're not competitors. They do genuinely different jobs, and once I let them do those different jobs, the architecture got simpler, not more complicated.

    So here's where I landed.


    The Realisation: Two Kinds of Memory

    The thing nobody tells you about "AI memory" is that it's actually two separate problems wearing one coat:

    1. Reference knowledge — the curated, stable stuff. Things I've written down deliberately and want to keep. This is read-mostly. The AI pulls from it, but it shouldn't be scribbling all over it.
    2. Working memory — the daily log. Decisions, scratch notes, "remember I changed X today." This is high-frequency, messy, and constantly being written to by both me and the AI.

    The moment I framed it that way, the tool choice answered itself. I already use both apps for exactly these two purposes, so I'd been overthinking it.

    • Obsidian holds my .md files — my curated reference library. Plain markdown on disk, portable, mine forever.
    • Trilium is where I dump my daily notes. It's a proper database with an API, which turns out to matter a lot for the working-memory job.

    One is the library. The other is the journal. Don't make the library be the journal.


    Why The Split Plays To Each App's Strengths

    This isn't arbitrary. Each app is built for the role I'm giving it.

    Obsidian being plain markdown means anything can read it — Claude Code just cds into the folder, and an in-vault RAG plugin like Smart Connections does local semantic search through Ollama without phoning anywhere. Brilliant for retrieval. But writing back to markdown with an automated agent is fragile — no schema, no permissions, and with files syncing around my network, I'm one race condition away from a merge headache. So I don't let the AI write here. If it produces something worth keeping, I promote it by hand.

    Trilium is the opposite shape. It's a database behind an API (ETAPI), with native MCP support and proper permission control — read-only or read/write, my choice. That makes the agent-writes-back loop actually reliable. Dated entries, structured attributes, an interface Hermes and Claude can both hit cleanly. Exactly what you want for a journal the AI helps maintain.

    So: Obsidian gets read-only treatment because it's my canon. Trilium gets read/write because it's the working log and it's structurally built to handle it.


    The Architecture

    Here's the whole thing on one diagram:

       Obsidian Vault (.md)              Trilium (daily notes / DB)
       reference knowledge               working memory + journal
            │                                   │
            │ READ-mostly                       │ READ + WRITE
            ▼                                   ▼
       ┌─────────────┐                   ┌──────────────┐
       │ Smart Conn. │                   │ Built-in AI  │
       │ + Ollama    │                   │ + ETAPI/MCP  │
       │ Claude Code │                   │              │
       └──────┬──────┘                   └──────┬───────┘
              │                                 │
              └──────────► Hermes ◄─────────────┘
                      (orchestrator: routes
                       reads vs writes)
                              │
                      ┌───────┴───────┐
                      ▼               ▼
                   Ollama          Claude
                (local worker)   (escalation)

    The key shift here is that Hermes stops being just an orchestrator and becomes a router. It knows where each operation belongs. The rule set is almost embarrassingly simple:

    • Reads hit both stores — reference from Obsidian, recent context from Trilium.
    • Writes go to Trilium only, scoped to the daily-notes subtree.
    • Obsidian writes are human-gated. Always.

    Underneath both, the same two-tier model I've been running all along: Ollama does the routine local work (free, private, fast), and Claude gets the escalation — the complex reasoning and long-context synthesis that the local models can't touch.


    The Flow That Makes It Worth The Effort

    Running two apps only pays off because of how they feed each other:

    1. Capture. Daily stuff — decisions, meeting notes, half-formed ideas — gets written to Trilium. By me, or by the agent.
    2. Retrieve. When I ask a question, Hermes pulls reference context from Obsidian and recent working memory from Trilium, then stitches them into the prompt. Recent Trilium entries first (what's top of mind), then Obsidian reference matches (the background), then my actual question. Keeps the prompt focused and stops it bloating past the context window.
    3. Promote. Every so often, the good stuff from the Trilium daily log graduates into a proper Obsidian .md note. The journal is ephemeral; the library is forever. This step is manual on purpose — it's the quality gate that keeps my curated vault clean.

    That promotion step is genuinely the whole point. Trilium absorbs all the messy, high-frequency writes — which protects my Obsidian vault from being cluttered up by an over-eager agent — and only vetted, distilled knowledge ever crosses the line into the library.


    A Couple Of Guardrails

    Because I don't trust anything with write access until it's earned it:

    • Trilium's AI features are still experimental, so I started the MCP connection and Hermes both at read-only, and only promoted to read/write once I'd watched them behave for a while.
    • The agent writes into a dedicated subtree — an AI Memory parent note — rather than scattering machine-written content through my real notes. Keeps it quarantined, easy to audit, trivial to roll back if it goes sideways.

    Where This Leaves Me

    No separate vector database, no extra infrastructure to babysit. Obsidian's RAG handles reference retrieval, Trilium's ETAPI handles dated working memory, and each app does the one thing it's actually good at. Hermes routes between them, Ollama does the grunt work, Claude handles the hard problems.

    The lesson, as usual, was that I'd been overcomplicating it. The answer wasn't a clever tool or a new piece of kit — it was just letting two tools I already used keep doing their jobs, and being disciplined about which one the AI is allowed to write to.

    If you've made it this far: yes, I really did spend an unreasonable amount of time deciding where a chatbot is allowed to save its notes. Worth it though.

  • Home Network Topology 2026: The Full Map

    Between the 2024 network upgrade post and the Homelab 1.0 post, I’ve talked a lot about individual components — the 10G switches, the Proxmox cluster, the NAS stack. But I’ve never actually drawn the full picture of how everything connects. Partly because it was always evolving, and partly because I suspect I was slightly embarrassed about how complicated it had gotten.

    Well, here it is.

    Fair warning: it’s a lot.


    The Spine

    Everything in the house hangs off two devices: an Asus RT-BE88U running Merlin firmware as the main router, and a TP-Link TL-SX1008 8-port 10G switch that acts as the core distribution layer. The router connects to the switch via one of its 10G ports, and from the switch, a single 10G run goes to each room. This is the backbone that all four zones of the house branch off from.

    A quick correction from my 2024 post, where I said the house was running Cat 5E — that was wrong. It’s actually Cat 6 throughout. Apologies for the confusion. Cat 6 is rated for 10G up to 55 metres, so the 10G speeds across the house make complete sense, and I can stop sounding like I’m living dangerously.


    Media Console

    The media console area is the most “legacy” part of the network. It uses a 1G switch to service the TV, Xbox 360, Xbox One X, Nintendo Switch, Raspberry Pi 5 (running OpenElec), Denon AVR, and the HTPC. None of these devices need more than gigabit, so there’s no point in running 10G cabling to each of them. The 1G switch itself connects back to the main 10G switch, so aggregate throughput is fine.

    The one exception in this zone is the Proxmox test node, which gets a direct 10G connection from the main switch. I use this node to experiment with new configs before rolling anything out to the main cluster in the study room — having it on full-speed connectivity matters when I’m moving VM images around.


    Bedrooms

    Bedroom 1 is simple: a direct 10G connection straight to the gaming PC. No middlemen.

    Bedroom 2 has a second RT-BE88U running in AP mode, which provides Wi-Fi coverage to that end of the house. It also has the TV and Denon AVR wired into it directly. I previously ran a GT-AX11000 Pro in this role, but after the primary router upgrade, having two RT-BE88U units running Merlin in AiMesh mode has made the whole setup much more coherent.

    One thing I’m looking forward to exploring with the RT-BE88U is Guest Network Pro, which allows each wireless SSID to be assigned to its own VLAN. This means I could eventually segment the IoT and media devices in this zone — the TV, the Denon — onto their own isolated network, completely separate from the rest of the house. It’s the kind of proper network segmentation I’ve been putting off, and having hardware that natively supports it on both the primary router and the AP removes the main excuse I had for not doing it.


    Study Room: Where It Gets Complicated

    My homelab in a rack

    This is where most of my infrastructure lives, and the network reflects that.

    A TP-Link 5-port 10G switch sits at the top of the study room hierarchy, connected back to the main 10G switch. From there, things fan out:

    • DS920+ NAS and ZimaOS NAS each get a direct 10G connection from the 5-port switch. These are the primary working NAS devices, and they need fast access to the rest of the network.
    • An 8-port 10G switch provides 10G connections to the workstations: DS1621+ NAS, Unraid NAS, Windows 11 desktop, Mac Mini M4, and CachyOS desktop. Everything in this group transfers data at full 10G speeds, which makes a real difference when shuffling large files to and from the NAS.

    The interesting bit is the Proxmox cluster networking, which has two separate paths:

    The 8-port 2.5G switch handles the data network. Each of the three Proxmox nodes connects with two bonded 2.5G ports — so each node has an effective 5G data link for VM traffic and storage replication.

    The 8-port 1G switch handles the management network. Each Proxmox node has a dedicated 1G management interface, completely separate from the data path. The DS920+ gets two bonded 1G ports through this switch (for its management/backup traffic), and the ZimaOS NAS also has a 1G management link here. Keeping management traffic off the data network is something I should have done from the start — it makes the cluster much more stable and gives me a reliable out-of-band path when something inevitably breaks.


    What’s Next

    The topology is largely stable at this point, but there are a few things I’m considering:

    The 8-port 1G switch has a few spare ports that I’d eventually like to use for dedicated IPMI/iDRAC-style out-of-band management on the NAS devices — the Synology units support this to a degree, but I haven’t gotten around to configuring it properly.

    And with Cat 6 confirmed throughout the house, at least I can stop worrying about the cabling holding back my 10G links — that particular anxiety has been retired.

    If you’ve made it this far, congratulations — you now know more about my home network than most people probably want to. The diagram is linked above if you want to zoom in on any particular section.

  • Homelab 1.0: Compute, Storage, and Power’

    I’m back for my annual update on the state of my home network (state-of-the-network?)

    This year, I’ve gone in at the deep-end with a full 3-node Proxmox cluster for compute, and expanded from 2 to 3 storage servers.

    Compute

    Starting with Proxmox, I experimented with re-purposing an old i7 4770K build, but it would have been cost prohibitive to run it full time as it idle\’d at 60 watts. That would cost me $15 per month, while giving me less performance than a modern solution.

    I picked up 2 mini pc\’s with AMD H 255 processors (8 cores, 16 threads), 32GB RAM, 2.5Gbe networking and 1TB NVME storage. These were the Beelink Ser9 and the GMKTEC K12. I also picked up some used PC parts (i5 7500, 16GB RAM, NR200 Case) for $70 and cobbled together a third node for the Proxmox cluster.

    The 3 Proxmox nodes run the following containerised services:

    • pi-hole
    • pialert
    • openspeedtest
    • NUT (for monitoring UPS status)
    • heimdall dashboard
    • karakeep
    • beszel
    • netvisor
    • sterling-pdf
    • termix

    In addition, they also host 4 virtual machines (VMs):

    • Windows 11
    • Linux Mint
    • Home Assistant
    • Docker (for Portainer)

    I have configured high-availability (HA) across the 2 primary nodes, with the third node acting as the quorum breaker. These services help me monitor my home, network and systems, store and edit notes and test different operating systems.

    Storage

    For storage, I added a third Network Attached Storage (NAS) device – a Synology DS1621+, to complement my existing stack – a Synology DS920+ and an Unraid server. In total, across the 3 devices, I have 150TB of storage space. Data is replicated on all three. My critical data (~1TB) is also backed up automatically to the cloud. The media stack (photos and video) runs natively on my storage devices, as it avoids having to move data from my compute nodes to storage (even though I have a multi-Gig network).

    I plan to eventually move the media stack to the compute nodes, but the challenge will be the end-user user interface. I looked at Immich for the photo backup solution, but will continue to use Synology Photos as it provides a smoother user experience. I\’m also stuck at mounting the storage devices to my compute nodes. This is entirely due to my lack of knowledge, for now.

    To save electricity costs, I aggressively spin down the drives on the Synology units, as well as turn-off the Unraid server entirely. It serves as my cold backup that I spin up once a month to back up data. By doing this, I effectively have a 3-2-1 backup strategy in play.

    Power

    All my network, storage and compute devices are connected to Uninterruptible Power Supplies (UPS), so that in a power outage, my systems have time to automatically power down. The NUT server will get a warning from one of the UPS, and trigger all devices to shut down if power is not restored in 5 minutes.

    Overall, across my 3 server nodes and 3 storage servers, I average at approximately 120W. If I include the network stack (2 x routers, 2 x 10G switched and 3 x 1G switches), the total average power consumption comes up to 200W, which equates to $39 per month, and accounts for 20% of my total electricity bill. I will need to find a way to reduce this running cost over the long term.