Skip to main content

Note → Connection

The worst part of forgetting something isn't losing it — it's not knowing you did. You write things down so you don't have to hold them, and then holding onto that becomes its own job: re-reading old notes, hoping the one that matters resurfaces before it's too late.

This flow does that re-reading for you. Every new or changed note gets checked against everything else you've written down, and if there's a real connection — not a shared topic, an actual insight — it gets handed back to you before you'd have found it yourself.

Why this is a different question than triage

Note → Action asks "is this worth acting on" — deliberately stingy, because most notes are a grocery list. This flow asks something narrower of every new or changed note, not just the ones that pass that bar: "does anything I already know actually connect to this?"

A shared topic, project, or person is not enough on its own. "Both mention coffee" is not a connection — it's noise, and a system that surfaces noise trains you to stop reading it. The bar is an insight you would not have made just by remembering the earlier note existed.

The two moves

1. Search — not a plain question, a tool

Finding a real connection means actually searching the knowledge base, which is a job for a tool, not a chat model guessing. So this routine doesn't call the gateway directly the way Note → Action's triage step does — it hands the note to a Hermes department profile that carries OpenViking as an MCP tool (research, by default), and lets it search the OpenViking index for itself.

2. The gate — self-scored, and strict

The same call that searches also judges. It comes back with either NONE, or one candidate connection and a 1-10 score for how genuinely interesting and non-obvious it is. Only a score at or above CONNECT_MIN_SCORE (7 by default) gets written down and sent to you — everything else is silence, on purpose. The flow only earns your trust by being right often enough that you stop needing to double-check it yourself.

The same pairing is never surfaced twice. Edit the note again later and a different connection can still come through — just not the one you already saw.

It ships with Core

Unlike every other flow on this page, there is no quest to pick. ./existential.sh questCore copies note-connect.md into automation/cron/ for you, alongside the cron that indexes workspace/ into OpenViking in the first place — the same requires: gate, since one is pointless without the other. Nothing else to enable: note-connect is on by default in services/automation/decree/config.yml, and NOTES_DIR defaults to /workspace, the same tree Hermes already reads and OpenViking already indexes.

Opting out is a file deletion, nothing more:

rm automation/cron/note-connect.md
docker compose restart automation

enabled: true with no cron file behind it never fires — there's no config flag to also flip. Delete the file, and it's gone until you copy it back from automation-examples/cron/.

Running a custom, non-Core install instead? Copy that same file yourself:

cp automation-examples/cron/note-connect.md automation/cron/
docker compose restart automation

Pointing it at a different vault

NOTES_DIR defaulting to /workspace is what makes this need nothing beyond Hermes and OpenViking. If you run Note → Action's note-triage vault mirror and would rather scan that instead, set NOTES_DIR: "/data/notes" in the cron frontmatter — everything else about the flow is unchanged.

Check it before trusting it

docker exec automation decree routine note-connect # the routine's own pre-check
printf -- '---\nroutine: note-connect\nCONNECT_DRY_RUN: true\n---\n' > automation/inbox/dry-run.md

A dry run logs every candidate and score, and writes nothing — including no ledger entry, so tuning CONNECT_MIN_SCORE never poisons the "already surfaced" check.

The first run does nothing, on purpose

Same reason as Note → Action: it records the tree as seen without scanning it — turning this on over an already-full workspace/ should not fire a call per file. To scan the backlog once:

printf -- '---\nroutine: note-connect\nCONNECT_BOOTSTRAP: true\n---\n' > automation/inbox/bootstrap.md

Prerequisites

  • workspace/ actually indexed — this is where "something you already know" comes from. On by default once OpenViking is enabled, which Core enables
  • Hermes running with the research profile provisioned — ai/hermes/entrypoint.sh does this automatically on boot from ai/hermes/profiles/research/; restart hermes-agent if you enabled Hermes before OpenViking

Settings reference

SettingDefaultDoes
CONNECT_MIN_SCORE7The judgment. How interesting a connection has to be, 1-10
CONNECT_PROFILEresearchWhich hermes profile searches — needs mcp: openviking
CONNECT_DRY_RUNfalseLog every candidate and score, write nothing, notify no one
CONNECT_LEDGERtrueThe same source-to-target pairing is never surfaced twice
CONNECT_MAX_NOTES20Ceiling per run
CONNECT_MIN_CHARS120Below this a note is skipped without a model call
CONNECT_MAX_CHARS6000Note text is truncated to this many characters before searching
CONNECT_MODEL(profile default)Pin a specific model
CONNECT_TIMEOUT300Seconds for the department call before it's treated as no answer
CONNECT_API_KEY(falls back to HERMES_API_KEY)Override the gateway credential
CONNECT_NOTIFYtrueSend an ntfy notification when a connection is surfaced
CONNECT_OUTPUT_RCLONE_DEST(unset)Where the writeup is copied, e.g. nextcloud:Notes

All of it is cron frontmatter. No code changes.

Don't point the output back into NOTES_DIR

Output lands in /data/note-connect/output, deliberately outside whichever tree NOTES_DIR scans — writing a .connection.md file back into /workspace would make the next run treat its own output as a new note. If you set CONNECT_OUTPUT_RCLONE_DEST, point it at a vault folder, not at workspace/ or (if you switched NOTES_DIR) /data/notes — the latter is also an rclone sync cache, so anything written there is deleted on the next sync regardless.

What ships and what you write

PartStatus
Vault diff — detecting new and changed notesShips. Hashes the vault and diffs against the last run, same mechanism as Note → Action
Searching the knowledge baseShips. The research hermes profile, with OpenViking as an MCP tool
Scoring and the relevance gateShips. One self-scored call; only scores at or above CONNECT_MIN_SCORE surface
Not repeating the same pairingShips. A plain ledger at /data/note-connect/connections.tsv
Writing the result beside the noteShips. <note>.connection.md, copied over rclone when configured
Notifying youShips. notify → ntfy
How interesting is interesting enoughYours. CONNECT_MIN_SCORE — the whole point of the flow