Skip to content

Morning discovery

The morning discovery pane surfaces up to three surprising connections — pairs of notes that share concepts but aren't linked yet — each one click from being related. The value of a slip-box shows up in unexpected links, not the backlinks you already knew about.

Opening it

Run "Show discoveries" from the command palette, or click Open next to Discoveries in Settings → ZettelFlow → Zettelkasten toolkit. Each card shows a pair and asks "these two notes share concepts — link them?" with three actions:

  • Link them — writes the connection (see below).
  • Dismiss — hides the pair for this session.
  • Open — opens the first note.

How pairs are found

The engine is graph-structural, offline, and read-only — the same heuristic as find related (#154), applied to pairs:

score(a, b) = 2·|notes linking to both| + 1·|notes both link to| — co-citation weighted above bibliographic coupling. Only pairs that share context score above zero, already-linked pairs are excluded (either direction), and the top-scoring unlinked pairs are shown (canonical order, ties broken by path). Candidate pairs are generated once per node (every pair among a note's neighbours), so it stays efficient. No text similarity, no embeddings, no AI.

Accepting (the one write)

Link them writes an expands relation from the first note to the second — appended to its expands frontmatter key via Obsidian's processFrontMatter (deduplicated, add-only, never removes anything). After the model re-indexes, the pair is linked, so it drops out of future discoveries. There is no generic "related" type in the semantic vocabulary (#147); expands is the neutral "this note connects to that idea" choice.

Dismissals are session-only — a dismissed pair may return next time you open the pane; an accepted pair does not (it's now linked). A persisted dismissed-pair set is a possible follow-up.

Architecture

findDiscoveries(model, { limit })   (pure, Obsidian-free, unit-tested)
  → top unlinked pairs by shared-context score

DiscoveriesView (ItemView) + DiscoveriesComponent (show-discoveries command, no hotkey)
  reads the KnowledgeIndex model → findDiscoveries
  accept → semanticRelationField("expands", …) shape written via fileManager.processFrontMatter
  dismiss → session Set · open → workspace.openLinkText