notefeed

Marcel Bruckner

Notes on what I build: AI tools, Trilium, self-hosting and my homelab.

Oct 26

  1. Hello, blog: how this blog is made

    For years my notes have lived in Trilium, and my projects in READMEs and docs sites. What was missing was a place to tell the story around them: why I built something, what I tried first, what broke. This post is about how that place came about, on the same day as its first two posts.

    Why a blog, and why like this

    I didn't want to write posts in an editor. I wanted to finish a piece of work and say to Claude: "write a blog post from this". The conversation already holds the reasoning, the dead ends and the numbers; turning that into a post is exactly the kind of work an assistant does well. My part is the review.

    I looked at a few setups:

    • Trilium as the CMS. My notes are already there, but the site's build would need a Trilium token in GitHub's secrets, and nothing in my Trilium is shared publicly on purpose.
    • Ghost. A good blog, but another server to run and update.
    • notefeed, the note feed service I build. A feed is a list of markdown notes with RSS, and anyone can read it through a public API without a key.

    notefeed won. The blog is the feed notefeed.me/r/marcelbruckner, and this site shows it at /blog.

    Talking, not typing

    Most of what I say to Claude I say out loud. Speech input is fast, but it comes out half-formed: "the thing from yesterday", "that server", "like we did for the other repo". That works because Claude doesn't only get my words. It reads my second brain, my Trilium with its notes and an LLM wiki, and looks up what I mean: which server, which decision, what I tried last time. It is also connected to my GitHub, so it sees the repos, issues and pull requests I'm working on. A rough spoken sentence turns into a precise request, and a post like this one starts from everything that already happened instead of a blank page.

    How a post gets here

    flowchart LR
      I[Me: write a post from this] --> C[Claude writes a draft]
      C --> R{I review}
      R -- changes --> C
      R -- post it --> F[(notefeed feed)]
      F -- read API, no secret --> S[Site build]
      S --> B[marcelbruckner.de/blog]
    
    • Drafts first. Claude puts the draft in a separate drafts feed and shows me the whole text. Nothing reaches the blog until I say "post it".
    • The site pulls the feed. An Astro loader reads the posts at build time and renders them with the site's design, code highlighting and diagrams. A build that can't reach notefeed fails, so a deploy never goes out without the posts.
    • Hourly rebuilds. The site checks the feed every hour and deploys only when something changed, so a new post shows up without a push. RSS works twice: on notefeed and at /blog/rss.xml.

    The skills behind it

    The workflow lives in two Claude Code skills. post-to-notefeed does the writing, the review and the posting for any notefeed feed, and anyone can use it: it ships with notefeed (Agent skills). A second, private skill adds what only this site needs: its tag rules (lang:de for German posts), the rebuild and the post's address here.

    What didn't go smoothly

    The first deploy failed. notefeed had just renamed a field in its API, and the site's loader still asked for the old one. A one-line fix, but a good reminder that I am my own API's first customer. Two things on notefeed's side are still rough for long posts like this one: tags can't be changed after posting yet, and notefeed's own page doesn't render diagrams. Both are open issues; on this site neither matters.

    What comes next

    Posts about what I build: AI tools around Trilium, self-hosting, my homelab, notefeed. The first two are about trilium-recall and an LLM wiki in Trilium. If you'd like to follow along, the RSS feed is the easiest way; feedback is welcome through the contact form.