# oscampo/2obrain architecture

> Architecture diagram of the GitHub repository oscampo/2obrain, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/oscampo/2obrain
- Repository: https://github.com/oscampo/2obrain
- Video tour (about a minute): https://gitdiagram.com/oscampo/2obrain/video

## Overview

2oBrain is a records-and-memories “second brain” backed by Supabase: capture dated, sourced facts, organize them into memories, and retrieve or maintain them through CLI, dashboard, and MCP clients. The main workflow is capture or extract → classify and link → persist → hybrid search and review. Separate capabilities include page ingestion, timelines, graph exploration, and Claude Code hooks. The tree and excerpts document these entry points and some calls; unsampled wiring is represented only where the README explicitly describes it.

Main entry points: [`scripts/db/server/dashboard-server.mjs`](https://github.com/oscampo/2obrain/blob/main/scripts/db/server/dashboard-server.mjs) (Local dashboard API), [`scripts/db/remember.mjs`](https://github.com/oscampo/2obrain/blob/main/scripts/db/remember.mjs) (Capture fact), [`scripts/db/search.mjs`](https://github.com/oscampo/2obrain/blob/main/scripts/db/search.mjs) (Hybrid search), [`scripts/db/extract-page-records.mjs`](https://github.com/oscampo/2obrain/blob/main/scripts/db/extract-page-records.mjs) (Extract page records)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Capture and ingest"]
  node_remember["Capture fact<br/>[remember.mjs]"]
  node_extract["Extract session records"]
  node_pageextract["Extract page records"]
  node_loadpages["Load pages<br/>[load-pages.mjs]"]
end

subgraph group_knowledge["Records and memories"]
  node_memoryops["Memory management"]
  node_classifiers["Classification and linking"]
end

subgraph group_access["Search and access"]
  node_search["Hybrid search<br/>[search.mjs]"]
  node_timeline["Memory timeline<br/>[timeline.mjs]"]
  node_status["Memory status<br/>[memory-status.mjs]"]
  node_graph["Memory graph<br/>[graph.mjs]"]
  node_traverse["Graph traversal<br/>[traverse.mjs]"]
  node_embed["Embedding and reranking<br/>[embed.mjs]"]
end

subgraph group_interfaces["User interfaces"]
  node_dashboard["Local dashboard API"]
  node_hosteddeno["Deno MCP server<br/>[main.ts]"]
  node_hostedsupa["Supabase MCP server<br/>[index.ts]"]
end

subgraph group_automation["Session automation"]
  node_stophook["Capture reminder hook"]
  node_greeting["Day-start gate<br/>[greeting-gate.mjs]"]
end

node_user(("User or agent"))
node_db[("Supabase database")]
node_llm{{"LLM providers"}}

node_user -->|"records fact"| node_remember
node_remember -->|"classifies and links"| node_classifiers
node_remember -->|"writes records"| node_db
node_remember -.->|"requests classification"| node_llm
node_user -->|"requests extraction"| node_extract
node_extract -.->|"extracts candidates"| node_llm
node_stophook -->|"runs extraction"| node_extract
node_user -->|"requests extraction"| node_pageextract
node_pageextract -->|"reads and suggests matches"| node_db
node_pageextract -.->|"extracts candidates"| node_llm
node_user -->|"loads pages"| node_loadpages
node_loadpages -->|"loads page data"| node_db
node_user -->|"searches"| node_search
node_search -->|"embeds and reranks"| node_embed
node_search -->|"queries records and pages"| node_db
node_user -->|"reviews history"| node_timeline
node_timeline -->|"reads timeline"| node_db
node_user -->|"checks current state"| node_status
node_status -->|"reads current records"| node_db
node_user -->|"explores connections"| node_graph
node_graph -->|"reads graph data"| node_db
node_user -->|"traverses connections"| node_traverse
node_traverse -->|"reads relationships"| node_db
node_user -->|"maintains memories"| node_memoryops
node_memoryops -->|"updates memory graph"| node_db
node_user -->|"uses dashboard"| node_dashboard
node_dashboard -->|"exposes search"| node_search
node_dashboard -->|"exposes maintenance"| node_memoryops
node_dashboard -->|"exposes status"| node_status
node_dashboard -.->|"synthesizes answers"| node_llm
node_user -->|"connects via MCP"| node_hosteddeno
node_hosteddeno -->|"searches and captures"| node_db
node_user -->|"connects via MCP"| node_hostedsupa
node_hostedsupa -->|"searches and captures"| node_db
node_hostedsupa -.->|"uses model services"| node_llm
node_user -->|"submits prompt"| node_greeting

click node_remember "https://github.com/oscampo/2obrain/blob/main/scripts/db/remember.mjs"
click node_extract "https://github.com/oscampo/2obrain/blob/main/scripts/db/extract-records.mjs"
click node_pageextract "https://github.com/oscampo/2obrain/blob/main/scripts/db/extract-page-records.mjs"
click node_loadpages "https://github.com/oscampo/2obrain/blob/main/scripts/db/load-pages.mjs"
click node_search "https://github.com/oscampo/2obrain/blob/main/scripts/db/search.mjs"
click node_timeline "https://github.com/oscampo/2obrain/blob/main/scripts/db/timeline.mjs"
click node_status "https://github.com/oscampo/2obrain/blob/main/scripts/db/memory-status.mjs"
click node_graph "https://github.com/oscampo/2obrain/blob/main/scripts/db/graph.mjs"
click node_traverse "https://github.com/oscampo/2obrain/blob/main/scripts/db/traverse.mjs"
click node_memoryops "https://github.com/oscampo/2obrain/tree/main/scripts/db"
click node_classifiers "https://github.com/oscampo/2obrain/tree/main/scripts/db/lib"
click node_embed "https://github.com/oscampo/2obrain/blob/main/scripts/db/lib/embed.mjs"
click node_dashboard "https://github.com/oscampo/2obrain/blob/main/scripts/db/server/dashboard-server.mjs"
click node_hosteddeno "https://github.com/oscampo/2obrain/blob/main/deno-deploy/mcp-server/main.ts"
click node_hostedsupa "https://github.com/oscampo/2obrain/blob/main/supabase/functions/mcp-server/index.ts"
click node_stophook "https://github.com/oscampo/2obrain/blob/main/scripts/hooks/stop-capture-check.mjs"
click node_greeting "https://github.com/oscampo/2obrain/blob/main/scripts/hooks/greeting-gate.mjs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_remember,node_extract,node_pageextract,node_loadpages,node_user toneBlue
class node_memoryops,node_classifiers,node_db toneAmber
class node_search,node_timeline,node_status,node_graph,node_traverse,node_embed toneMint
class node_dashboard,node_hosteddeno,node_hostedsupa toneRose
class node_stophook,node_greeting,node_llm toneIndigo
```

## Components

### Capture and ingest

- [Capture fact](https://github.com/oscampo/2obrain/blob/main/scripts/db/remember.mjs): `scripts/db/remember.mjs`
- [Extract session records](https://github.com/oscampo/2obrain/blob/main/scripts/db/extract-records.mjs): `scripts/db/extract-records.mjs`
- [Extract page records](https://github.com/oscampo/2obrain/blob/main/scripts/db/extract-page-records.mjs): `scripts/db/extract-page-records.mjs`
- [Load pages](https://github.com/oscampo/2obrain/blob/main/scripts/db/load-pages.mjs): `scripts/db/load-pages.mjs`

### Records and memories

- [Memory management](https://github.com/oscampo/2obrain/tree/main/scripts/db): `scripts/db`
- [Classification and linking](https://github.com/oscampo/2obrain/tree/main/scripts/db/lib): `scripts/db/lib`

### Search and access

- [Hybrid search](https://github.com/oscampo/2obrain/blob/main/scripts/db/search.mjs): `scripts/db/search.mjs`
- [Memory timeline](https://github.com/oscampo/2obrain/blob/main/scripts/db/timeline.mjs): `scripts/db/timeline.mjs`
- [Memory status](https://github.com/oscampo/2obrain/blob/main/scripts/db/memory-status.mjs): `scripts/db/memory-status.mjs`
- [Memory graph](https://github.com/oscampo/2obrain/blob/main/scripts/db/graph.mjs): `scripts/db/graph.mjs`
- [Graph traversal](https://github.com/oscampo/2obrain/blob/main/scripts/db/traverse.mjs): `scripts/db/traverse.mjs`
- [Embedding and reranking](https://github.com/oscampo/2obrain/blob/main/scripts/db/lib/embed.mjs): `scripts/db/lib/embed.mjs`

### User interfaces

- [Local dashboard API](https://github.com/oscampo/2obrain/blob/main/scripts/db/server/dashboard-server.mjs): `scripts/db/server/dashboard-server.mjs`
- [Deno MCP server](https://github.com/oscampo/2obrain/blob/main/deno-deploy/mcp-server/main.ts): `deno-deploy/mcp-server/main.ts`
- [Supabase MCP server](https://github.com/oscampo/2obrain/blob/main/supabase/functions/mcp-server/index.ts): `supabase/functions/mcp-server/index.ts`

### Session automation

- [Capture reminder hook](https://github.com/oscampo/2obrain/blob/main/scripts/hooks/stop-capture-check.mjs): `scripts/hooks/stop-capture-check.mjs`
- [Day-start gate](https://github.com/oscampo/2obrain/blob/main/scripts/hooks/greeting-gate.mjs): `scripts/hooks/greeting-gate.mjs`

### Other components

- **User or agent**
- **Supabase database**
- **LLM providers**

## Connections

- User or agent → Capture fact: records fact
- Capture fact → Classification and linking: classifies and links
- Capture fact → Supabase database: writes records
- Capture fact → LLM providers: requests classification
- User or agent → Extract session records: requests extraction
- Extract session records → LLM providers: extracts candidates
- Capture reminder hook → Extract session records: runs extraction
- User or agent → Extract page records: requests extraction
- Extract page records → Supabase database: reads and suggests matches
- Extract page records → LLM providers: extracts candidates
- User or agent → Load pages: loads pages
- Load pages → Supabase database: loads page data
- User or agent → Hybrid search: searches
- Hybrid search → Embedding and reranking: embeds and reranks
- Hybrid search → Supabase database: queries records and pages
- User or agent → Memory timeline: reviews history
- Memory timeline → Supabase database: reads timeline
- User or agent → Memory status: checks current state
- Memory status → Supabase database: reads current records
- User or agent → Memory graph: explores connections
- Memory graph → Supabase database: reads graph data
- User or agent → Graph traversal: traverses connections
- Graph traversal → Supabase database: reads relationships
- User or agent → Memory management: maintains memories
- Memory management → Supabase database: updates memory graph
- User or agent → Local dashboard API: uses dashboard
- Local dashboard API → Hybrid search: exposes search
- Local dashboard API → Memory management: exposes maintenance
- Local dashboard API → Memory status: exposes status
- Local dashboard API → LLM providers: synthesizes answers
- User or agent → Deno MCP server: connects via MCP
- Deno MCP server → Supabase database: searches and captures
- User or agent → Supabase MCP server: connects via MCP
- Supabase MCP server → Supabase database: searches and captures
- Supabase MCP server → LLM providers: uses model services
- User or agent → Day-start gate: submits prompt
