360 Secure SkillHub
360 安全技能中心

second-brain-visualizer

读取本地 markdown 想法账本,解析为带时间戳、类型与信号强度的原子,再调用 LLM 按语义意图聚类,产出聚类名称、洞察、状态、张力、新兴信号与缺失领域,并用 D3 力导向图展示,可点击节点展开细读。依赖 OpenClaw 网关与 Node 环境。

highnoonoffice
highnoonoffice
热度 57.76
最近更新 2026-08-25 11:34:52
分类:知识依赖:代码执行 / 读写文件 / 内部调用大模型 / 第三方 API应用场景:笔记整理 / 摘要总结 / 研究 / 数据处理

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add second-brain-visualizer
Metadata
name
second-brain-visualizer
version
1.6.0
description
Unload your cognitive baggage. Drop ideas anywhere, find the signal later.
homepage
https://github.com/highnoonoffice/hno-skills
source
https://github.com/highnoonoffice/hno-skills/tree/main/second-brain-visualizer
license
MIT-0
credentials
[{"name":"openclaw-gateway.json","description":"Required. Create at ~/.openclaw/credentials/openclaw-gateway.json with fields: host (default: 127.0.0.1), port (default: 18789), key (your OpenClaw gateway auth key). Keep host set to 127.0.0.1 to ensure atom corpus stays on-machine.","required":true},{"name":"slack-sb.json","description":"Optional. Slack bot API key for automated ingestion from a private Slack channel. Format: { apiKey: string }","required":false},{"name":"telegram-sb.json","description":"Optional. Telegram bot API key for automated ingestion from a private Telegram channel. Format: { apiKey: string, chat_id: string }","required":false}]
metadata
{"config":[{"OPENCLAW_VAULT":"Path to your vault directory containing memory/second-brain.md"},{"SBV_MODEL":"LLM model for clustering and insight generation (default: openclaw:main)"},{"SBV_ATOMS_FILE":"Output path for parsed atoms JSON"},{"SBV_CLUSTERS_FILE":"Output path for cluster JSON"}],"dataFlow":["Reads local markdown ledger from OPENCLAW_VAULT/memory/second-brain.md","POSTs atom corpus to LLM via OpenClaw gateway at the host configured in ~/.openclaw/credentials/openclaw-gateway.json (default: 127.0.0.1) — keep host set to localhost to ensure data stays on-machine","No data leaves your local OpenClaw gateway — LLM routing is controlled by your OpenClaw config","Optional ingestion credentials (Slack, Telegram) stored locally in ~/.openclaw/credentials/ — never sent externally"]}

Second Brain Visualizer

Your brain wasn't designed to hold data. It was designed to produce it.

Pick a channel — Slack, Telegram, WhatsApp, Gmail, a private Discord. Every time something interesting moves through your mind, drop it. A line. A fragment. A joke that might be a product idea. Voice to text at a red light. You don't have to carry it anymore.

Second Brain Visualizer reads what accumulates. Not to categorize it. To find the signal underneath the noise — the questions you keep returning to in different disguises, the tensions you're working out across dozens of unrelated notes, the creative territory you're actively mapping without realizing it.

One note is just a note. Fifty notes across three weeks is a pattern. A year of notes is a portrait of how you think.

The clustering engine reads for intent, not keywords. A note about LLM inference costs and a quote from Simone Weil may belong in the same cluster if they're reaching toward the same underlying question. Clusters surface with a name, a one-sentence insight, and a status: ESTABLISHED, FORMING, or FADING. Tensions show you where you're arguing with yourself. Notable absences show you what your idea stream isn't touching yet.

This is not a note-taking app. Most note-taking tools are mirrors — they show you what you put in. This reads what it means.


What It Does

Your raw idea stream gets parsed into atoms — the smallest units of intent. Atoms are clustered by affinity of meaning, not keyword overlap. A note about LLM inference costs and a quote from Simone Weil may belong in the same cluster if they're both probing the same underlying question about attention and value.

Each cluster gets:

  • A sharp name capturing the underlying drive (not a generic domain label)
  • A one-sentence insight: what does this pattern reveal about how you think?
  • A status: ESTABLISHED, FORMING, or FADING
  • A confidence score and time spread across your corpus

The visualizer also surfaces:

  • Emerging signals — atoms with distinct intent that haven't massed into clusters yet
  • Tensions — places where your idea stream is arguing with itself across multiple notes
  • Notable absences — creative and intellectual domains conspicuously missing from the stream

The Clustering Formula

Step 1 — Raw input becomes atoms

Every drop gets parsed into a structured atom: timestamp, verbatim text, type (thought / task / strategy / creative / idea-jar / etc.), signal heat (hot / warm / cool), and whether it's actionable. The roughness is preserved — voice-to-text errors, fragments, incomplete sentences. That's intentional.

Step 2 — Atoms are read for intent, not words

This is where it diverges from every other note-taking system. The clustering prompt doesn't ask "what words appear frequently?" It asks: what is this person actually working out?

The governing rule: two atoms belong together if they're reaching toward the same underlying question — even if they use completely different language. A note about why Bitcoin rewards people who can wait and a line about what it feels like the half-second before a room full of strangers decides to laugh can belong in the same cluster — if both are reaching toward the same question about what it means to give something your full attention on purpose.

Step 3 — Categories emerge from mass and direction

Constraints the prompt enforces:

  • Minimum 3 atoms to form a cluster
  • 3–10 clusters total, determined by data (no predetermined slots)
  • No domain labels — not "Technology," not "Business." Names must capture the underlying drive
  • A quiet cluster isn't deleted — it becomes FADING

Step 4 — Four outputs surface

Output What it is
Clusters Named patterns with insight, status (ESTABLISHED / FORMING / FADING), confidence, and time spread in weeks
Emerging signals Atoms with distinct intent but not enough mass yet to cluster
Tensions Places where your idea stream is arguing with itself across notes
Absences Intellectual territory conspicuously missing from your corpus given your overall profile

The core IP is the prompt instruction: "Do not impose categories onto the data. Let the categories emerge from the mass and direction of the atoms." Everything else is scaffolding around that one rule.


1. Drop ideas anywhere You already have a channel you use. Voice to text, half a sentence, a project name with no context. Raw is fine. The roughness is the point — it's what unguarded thinking looks like.

2. Parser extracts atoms references/parser.js reads your second brain markdown ledger and extracts structured atoms with timestamp, raw text, type, signal, and optional next action.

3. Clustering engine reads for intent references/cluster.js passes your full atom corpus to an LLM with a custom intent-based prompt. The prompt reads for what you're actually working out, not what words you used. Outputs clusters, tensions, emerging signals, and absences as structured JSON.

4. Visualizer shows you the map references/component.tsx renders a D3 force-directed graph where nodes are sized by atom count × time spread. Click any node to expand: the base insight, an LLM-generated deeper read in gold, and the full list of atoms that make up the cluster. Tensions, signals, and absences scroll below.

Full prompt in references/cluster.js.


Atom Schema

Each atom in your markdown ledger:

### ts: <unix_timestamp>
- **date:** YYYY-MM-DDTHH:MM:SS UTC
- **raw:** verbatim text (voice to text, misspelled, incomplete — all valid)
- **type:** thought | task | strategy | creative | meta | idea-jar | visual | link
- **tags:** freeform, comma-separated
- **signal:** hot | warm | cool
- **actionable:** yes | no
- **nextAction:** optional single-sentence move

Cluster Output Schema

{
  "clusters": [
    {
      "id": "stable-kebab-id",
      "name": "Sharp name capturing underlying drive",
      "insight": "One sentence: what does this pattern reveal?",
      "atom_ids": ["sb-1234", "sb-5678"],
      "confidence": 0.87,
      "status": "ESTABLISHED",
      "time_spread": 4,
      "category": "CRAFT"
    }
  ],
  "emerging_signals": ["sb-9999"],
  "tensions": [
    {
      "name": "Tension name",
      "atom_ids": ["sb-1", "sb-2"],
      "description": "What the person is working out"
    }
  ],
  "absences": ["Creative territory missing from the stream"]
}

Example Output (85 atoms, 8 clusters)

Cluster Status Atoms Spread
Systems Over Shortcuts ESTABLISHED 7 2w
Language as Load-Bearing Structure ESTABLISHED 8 3w
The Speed Paradox ESTABLISHED 8 3w
Agent Failure as Intelligence ESTABLISHED 7 4w
Friction as Design Oracle FORMING 5 4w
Craft as Moral Position ESTABLISHED 7 3w
The Protagonist Problem ESTABLISHED 7 4w
Deliberate Presence as Counterculture FORMING 6 2w

Prerequisites

  • OpenClaw agent with a vault markdown ledger (atoms in the schema above)
  • Node.js 18+
  • A Next.js dashboard or equivalent React host for the visualizer
  • d3 and @types/d3 installed
  • An LLM API configured in OpenClaw (for clustering and insight generation)

Roadmap

  • Setup guide for new users building their first atom ledger
  • Configurable ingestion from Slack, Telegram, WhatsApp, Gmail
  • Cluster diff across runs (what emerged, merged, faded)
  • Full-graph view with atoms as sub-nodes
  • Cluster history timeline

Credit

The original idea to build a second brain capture system came from a conversation with Nate B. Jones. The architecture, clustering engine, and visualizer are original work — but the seed was his.


License

MIT-0. Copyright (c) 2026 @highnoonoffice. No attribution required.


Built by Joseph Voelbel / High Noon Office. Questions or want to build on this? josephvoelbel.com/contact