notefeed

Oct 30

  1. trilium-recall 0.7.0

    ⚠️ trilium-recall is superseded by passageway and no longer developed. Switch to passageway: it does what trilium-recall did, and more.

    passageway searches Trilium, Confluence and Wikipedia, and you can add other sources. To switch, install it in Claude Code:

    /plugin marketplace add Marceltov/passageway
    

    The guide explains how: https://trilium-recall.marceltov.de/migrate/

    This last release only marks the switch. The ghcr.io/marceltov/trilium-recall:0.7.0 image still works, but it gets no more fixes.

    The release on GitHub

Oct 27

  1. My Trilium setup: notes Claude can read, write and remember

    My notes have lived in Trilium for years. Over the last few weeks they became something Claude works in too: it reads them before it answers, files what we figure out, and turns the articles I save into a wiki. This post is the map: which pieces there are, how they fit together, and where each one has its own post.

    flowchart LR
      me["Me: browser, phone"] -- "save + tag" --> kk["Karakeep"]
      kk -- "tagged bookmarks" --> sync["karakeep-trilium-sync"]
      claude["Claude: Code, claude.ai, apps"] -- "MCP, OAuth login" --> proxy["trilium-mcp-proxy"]
      claude -- "recall" --> recall["trilium-recall"]
      subgraph T["Trilium"]
        mcp["built-in MCP server"]
        src["Sources"]
        wiki["Wiki"]
      end
      proxy --> mcp
      recall -. "reads" .-> T
      sync --> src
      mcp -- "ingest" --> wiki
    

    The pieces

    PieceWhat it does
    Trilium 0.106+The notes. Since 0.106 it has its own MCP server, so any MCP client can search, read and write them.
    trilium-mcp-proxyPuts an OAuth login in front of that server: add one URL to claude.ai or Claude Code and log in with your Trilium password, no token to paste.
    trilium-recallA search index next to Trilium (keywords plus embeddings, German and English) that hands Claude what the notes already know, before it starts guessing.
    trilium-llm-wikiA Claude Code plugin that builds and maintains an LLM wiki inside Trilium, following Karpathy's pattern.
    trilium-pluginClaude Code skills for everyday notes: search, create, move, tag, templates, journal, export.
    karakeep-trilium-syncCopies bookmarks I tag trilium in Karakeep into the wiki's Sources every 15 minutes.

    All of them are open source (AGPL-3.0-or-later) and run as small containers next to Trilium, or as plugins in Claude Code.

    How knowledge gets in

    1. Collect. I save an article to Karakeep and tag it trilium. Reddit posts I save get the tag automatically.
    2. Sync. A few minutes later it is a read-only source note in Trilium.
    3. Ingest. I tell Claude "ingest". It reads the source, writes a summary, updates the concept and entity pages it touches and logs the change in the day note. The rules for all of that live in a schema note in Trilium, so I change the wiki's conventions by editing a note.
    4. Adopt. At the end of a work session Claude offers to file what we found: a decision, a fix, how a system actually behaves. Most of my wiki comes from this, not from articles.
    5. Review. Everything Claude writes is a draft marked AI-assisted until I set it to reviewed.

    How it gets back out

    Connecting Claude to Trilium isn't enough: a model rarely stops to ask "do my notes know something about this?". trilium-recall closes that gap. In Claude Code a prompt hook checks every prompt against the index and adds up to three short passages when the notes have something, and nothing when they don't. On claude.ai the same engine is an MCP server whose instructions tell Claude when to look. In practice this is what makes the rest worth it: I speak a rough request ("the server from yesterday", "like we did for the other repo") and Claude starts from what I already wrote down.

    What changed this week

    • Trilium's own MCP server replaced mine. My ETAPI-based trilium-mcp is archived; the plugins now use the built-in tools, and trilium-mcp-proxy only adds the login.
    • trilium-recall became its own project, because it indexes all of Trilium, not only the wiki. Since 0.6.0 adding its URL to a client is the whole setup.
    • Release notes land here. Every release of these projects now posts its notes to this feed automatically.

    Where to read more

    Follow along with the RSS feed.

  2. trilium-mcp-proxy: log in to Trilium's MCP server with your password

    Since 0.106, Trilium has an MCP server built in, at /mcp. That's great news for anyone who uses Claude or another assistant with their notes: no more third-party server translating ETAPI into tools. It also meant the end of my own trilium-mcp, which did exactly that for two months and is archived now.

    One thing was left: the login. Trilium's MCP server takes an ETAPI token in the Authorization header. So for every client you create a token under Options → ETAPI, paste it into that client's configuration, and remember where you put it. trilium-mcp-proxy removes that step.

    What it does

    You add the proxy's URL to any MCP client (claude.ai, Claude Code, the Claude desktop and mobile apps) and log in once in the browser with your Trilium password. That's it.

    • Your password stays on your server. The login page is the proxy's own, next to Trilium. The password goes from your browser to it and on to Trilium's /etapi/auth/login, which creates an ETAPI token for that client. The proxy never stores or logs the password, and the client only ever sees opaque OAuth tokens that work nowhere else.
    • Two-factor works. With TOTP switched on in Trilium, the login page asks for the code (since 0.1.1).
    • It's transparent. Every /mcp request goes to Trilium unchanged, with only Authorization swapped. The tools are exactly Trilium's, so new ones arrive with Trilium updates, without a proxy release.
    • House rules. Optionally, MCP_INSTRUCTIONS adds standing instructions to Trilium's initialize answer, which every client reads when it connects. Mine says: there is an LLM wiki here, read its schema before writing, mark pages as AI-assisted, never write under Sources.
    • Revoking is simple. Each login is its own ETAPI token in Options → ETAPI. Delete it there, and that client is out.

    Running it

    Switch on Trilium's MCP server (Options → AI / LLM → MCP server), then add one service next to Trilium:

      trilium-mcp-proxy:
        image: ghcr.io/marceltov/trilium-mcp-proxy:latest
        restart: unless-stopped
        environment:
          TRILIUM_SERVER_URL: http://trilium:8080
          MCP_BASE_URL: https://trilium-mcp-proxy.example.org   # public URL, behind your TLS proxy
          MCP_OAUTH_SECRET: ${MCP_OAUTH_SECRET}                 # openssl rand -hex 32
        volumes:
          - mcp-proxy-oauth:/data
        ports:
          - "8081:8081"
    

    On claude.ai: Customize → Connectors → Add custom connector with https://trilium-mcp-proxy.example.org/mcp. In Claude Code:

    claude mcp add --transport http trilium https://trilium-mcp-proxy.example.org/mcp -s user
    # then /mcp → Authenticate
    

    It uses about 20 MiB. I run one per Trilium instance (three in our household); I built a mode that serves several instances from one container and threw it away, because it saved little and tied all three to one secret and one failure point.

    Gotchas with the built-in tools

    Moving my plugins from trilium-mcp to Trilium's own tools turned up a few differences worth knowing: they read and write Markdown, not HTML; set_attribute replaces an attribute of the same name; move_note on a cloned note moves only its original placement; and there is no tool for day notes, note maps or ZIP export yet. trilium-plugin and trilium-llm-wiki work around these.

    The goal: retire it

    The proxy is a stopgap. Trilium already has a login with password, TOTP and OpenID; it only needs to speak OAuth for MCP clients. I've proposed that upstream in TriliumNext/Trilium#12309: Trilium's normal login plus a consent page, the access token being an ETAPI token named after the client, off by default, no schema change. If the maintainers agree, I'd like to build it, and then this proxy can go.

    It's licensed AGPL-3.0-or-later. Setup details are in the docs.


    Discussion on GitHub: TriliumNext discussion #12310.

Oct 26

  1. An LLM wiki in Trilium: Claude builds and maintains a linked knowledge base

    Andrej Karpathy described an "LLM wiki": you collect sources, and an LLM turns them into a wiki of linked pages, answers questions from it and keeps it tidy. People are good at choosing what to read and bad at the upkeep a wiki needs: cross-references, updating ten pages when one new source arrives, noticing contradictions. In this pattern, that upkeep becomes the assistant's job.

    Most setups build this on Obsidian and plain Markdown files. Trilium already has the pieces they build by hand, so I built mine on Trilium:

    trilium-llm-wiki is a Claude Code plugin that builds and maintains an LLM wiki in your Trilium, using Trilium's built-in MCP server.

    The wiki's graph in Trilium: hub pages (violet) such as Homelab, Trilium and Hetzner, each surrounded by its concept (green), entity (orange) and summary (blue) pages

    My wiki after a few weeks, as Trilium's note map: hubs in violet, concepts green, entities orange, source summaries blue.

    Why Trilium fits so well

    The pattern needsTrilium has
    metadata on every pagelabels and promoted attributes, set by templates
    a graph of linked pagesinternal links and relations, and the note map to look at it
    pages of a few kindstemplates (hub, concept, entity, source summary)
    "what still needs work?"saved searches: pending sources, stubs, drafts, orphans
    a log of what changedthe journal's day note
    raw sources that stay untoucheda #readOnly Sources subtree

    How it works

    • One request sets it up: a Schema note, read-only Sources, the Wiki, four templates, saved-search views, two note maps and a lock folder.
    • The rules live in your Trilium: the schema note says how pages are written, linked and reviewed. Claude reads it before every write, and you change the wiki's conventions by editing that note.
    • Workflows:
      • ingest a source: Claude writes a summary, updates the concept and entity pages it touches, creates placeholder pages for new topics, and logs the change in the day note;
      • query the wiki;
      • lint it;
      • adopt a finding from a work session.
    • You stay the editor: Claude writes drafts marked AI-assisted, and only you set a page to reviewed.
    • Safe with several sessions: a small write lock (a queue of claim notes) stops two Claude sessions from overwriting each other's changes.

    What goes in

    • Articles and links. I save them to Karakeep. A small sync job I wrote, karakeep-trilium-sync, puts them under Sources, and "ingest" does the rest.
    • My own chats with Claude. At the end of a session I just say "put this in the wiki". Claude summarizes what we figured out or decided and files it into the pages it belongs to, so a fix, a decision or a "this is how it actually behaves" doesn't get lost when the chat ends.

    Finding things again

    A wiki is only useful if the assistant actually looks things up. That's what trilium-recall is for (my post about it): it gives Claude the relevant wiki pages before it answers, and the wiki's structure helps it rank them, with wiki pages first and sources shown as their summaries. It works on any Trilium, so it has its own post.

    Try it

    You need Trilium 0.106+ with the MCP server switched on (Options → AI / LLM → MCP server). Connect it with an ETAPI token or through trilium-mcp-proxy (see discussion #12310).

    /plugin marketplace add Marceltov/trilium-llm-wiki
    /plugin install trilium-llm-wiki
    

    Then ask Claude to "set up the LLM wiki", drop an article under Sources and say "ingest".

    For everyday note work without a wiki (search, create, move, tag, journal, export) there's trilium-plugin; both plugins share one connection.

    Feedback is welcome, especially from anyone who runs something similar: how do you structure yours?


    Discussion on GitHub: TriliumNext discussion #12317.

  2. trilium-recall: Claude remembers what you wrote in Trilium

    If you connect Claude (or any AI assistant) to Trilium, it can search your notes. But it rarely does that on its own. Before starting a task, a model doesn't stop to ask "do my notes already know something about this?", because it doesn't know what it doesn't know. So it works out again things you already wrote down, or gets them wrong.

    trilium-recall fixes that. It's a small container next to Trilium that indexes your notes and hands the assistant the few lines that matter. It runs as a plain MCP server, so any client can use it.

    What it does

    • Indexes all your text and code notes, with keyword search plus a multilingual embedding model. It handles German and English, so a German note answers an English question. It only reads Trilium through ETAPI, and you can delete its index and rebuild it at any time.
    • Is just an MCP server. Add one URL to claude.ai, Claude Code or any other MCP client and you're done: there's no plugin and nothing to install on the client. The server's instructions tell the model when to call recall. Each call returns up to three short passages with note IDs, or nothing.
    • Optional: runs automatically in Claude Code. A plugin adds a prompt hook that checks every prompt before Claude sees it. When your notes hold something relevant, Claude starts with it in the context. When they don't, nothing is added.

    In numbers

    Measured on my own Trilium (280 notes, 49 test questions); yours will differ:

    • > 85 % of questions get the right note among the first three. Trilium's built-in search manages around 40 %, because it needs every word of the question in the note.
    • > 90 % of questions the notes can't answer get nothing back, instead of three weak guesses.
    • < 20 ms per lookup, typically.

    Charts and the full comparison are on the Measurements page. The repo includes a public test Trilium, so anyone can reproduce the test numbers.

    Running it

    It's one compose service next to Trilium, plus an ETAPI token and a password:

      trilium-recall:
        image: ghcr.io/marceltov/trilium-recall:latest
        restart: unless-stopped
        environment:
          RECALL_LOGIN_PASSWORD: ${RECALL_LOGIN_PASSWORD}   # openssl rand -hex 32
          RECALL_BASE_URL: https://recall.example.org       # public URL; turns on the OAuth login
          RECALL_INSTANCES: main
          TRILIUM_MAIN_URL: http://trilium:8080
          TRILIUM_MAIN_TOKEN: ${RECALL_ETAPI_TOKEN}
        volumes:
          - recall-index:/data
        ports:
          - "8082:8082"
    

    Then add https://recall.example.org/mcp to your MCP client and log in once, or send the password as an Authorization: Bearer header. In Claude Code, for all your projects:

    claude mcp add --transport http trilium-recall https://recall.example.org/mcp -s user
    # then /mcp → Authenticate, and log in with RECALL_LOGIN_PASSWORD
    

    On claude.ai, go to Customize → Connectors → Add custom connector and use the same URL. That's the whole setup.

    Optional: if you use Claude Code and want recall on every prompt, without the model deciding when to look:

    /plugin marketplace add Marceltov/trilium-recall
    /plugin install trilium-recall
    

    Details: how it works, run the engine, connect Claude.

    It started inside my LLM wiki and understands its structure when there is one, but it works on any Trilium. An embedding model inside Trilium itself seems unlikely given Trilium's contribution rules (everything must work offline, and the bundle should stay small), so a separate container felt like the right place.

    It's licensed AGPL-3.0-or-later. Feedback is welcome, and I'd love to hear how it does on other people's notes: the docs show how to measure your own.


    Discussion on GitHub: TriliumNext discussion #12316.

  3. trilium-recall 0.6.0

    Merge pull request #4 from Marceltov/drop-migrating

    Docs: drop the migration page


    Engine image

    ghcr.io/marceltov/trilium-recall:0.6.0 — deploy it next to Trilium and connect Claude Code with the trilium-recall-setup skill. Guide: https://trilium-recall.marceltov.de/

    The release on GitHub

  4. trilium-mcp-proxy 0.1.1

    Image: ghcr.io/marceltov/trilium-mcp-proxy:0.1.1. Setup: see the README.

    The release on GitHub

  5. trilium-llm-wiki 0.4.1

    Merge pull request #11 from Marceltov/trilium-llm-wiki-10-recall-first-lookups

    TRILIUM-LLM-WIKI #10: Look things up recall-first, without loading the schema


    Recall engine image

    ghcr.io/marceltov/trilium-llm-wiki-recall:0.4.1 — deploy it next to Trilium and connect the plugin with the trilium-recall-setup skill. Guide: https://trilium-llm-wiki.marceltov.de/recall/

    The release on GitHub

Oct 16

  1. karakeep-trilium-sync 0.1.0

    Add a setup guide

    Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01QH9FSBayyUwfMTcRvoTAJA

    The release on GitHub