Nexus is a local, skill-driven personal and work AI assistant for Pi, Claude Code, and OpenCode. It combines:
TASKS.mdas the shared task boardCLAUDE.mdas generated working memory (hot cache)memory/as long-term structured memory- an interactive Pi interface for tasks, memory, calendar, logs, and status
work-startbootstraps and generatesCLAUDE.md+memory/when missing.work-updatekeeps tasks and memory current through interactive sync, using memory query for decoding and memory ingest for durable updates.task-managementdefines howTASKS.mdis structured and updated.memory-managementdefines what belongs in hot memory vs deep memory, plus the coreingest,query, andlintworkflows.
| Skill | Purpose |
|---|---|
work-start |
First-run initializer: checks/creates TASKS.md and bootstraps memory (CLAUDE.md + memory/). |
work-update |
Main ongoing sync flow for tasks + memory gaps, stale task triage, and context enrichment. Uses memory query for lookup/decoding and memory ingest for durable filing. |
daily-sync |
Collects your 3 standup answers and posts them to the current team daily thread in Slack. |
meeting-notes |
Extracts decisions, action items, task candidates, and durable memory updates from pasted meeting notes, with confirmation before edits. |
task-management |
Task conventions for TASKS.md (active, waiting, someday, done) and task update behavior. |
memory-management |
Two-tier memory system: compact CLAUDE.md hot cache + detailed memory/ knowledge base, with explicit ingest, query, and lint workflows. |
memory-backup |
Syncs CLAUDE.md, TASKS.md, and memory/ with a separate private Git repository. |
time-log |
Builds today's mapped ZEP time-log plan from Google Calendar and enters it only after guarded preview and explicit approval. |
decision-matrix |
Multi-criteria decision analysis with weighted scoring — builds comparison tables from ruminate.io templates or manual input. |
journal-sync |
Pulls recent Notion Journal entries into monthly files, grouped by year. |
portfolio-update |
Fetches live prices for equities in memory/projects/investment_portfolio.md. |
| Skill | Purpose |
|---|---|
gmail |
Reads and searches Gmail via gog. |
google-calendar |
Reads Google Calendar via gog. |
google-drive |
Reads and searches Google Drive folders and files via gog. |
slack |
Reads and sends Slack messages via .claude/skills/slack/slack-cli.js with @slack/web-api. |
notion |
Reads, searches, and updates Notion pages, data sources/databases, Markdown, files, and Workers via the official ntn CLI. |
notebooklm |
Manages NotebookLM notebooks, sources, chats, and generated artifacts via notebooklm-py. |
| Skill | Purpose |
|---|---|
ketch |
Searches, scrapes, and crawls the web, public code, and curated documentation for cited research. |
ddgr |
Runs lightweight DuckDuckGo web and bang searches from the command line. |
This repository includes custom UI extensions for pi, the coding agent framework.
The Pi extension provides a continuous status bar widget and several interactive modals to manage your workflow directly within the TUI:
| Command | Purpose |
|---|---|
/tasks |
Interactive TUI modal to view TASKS.md categories, page through tasks, and mark open tasks as done (uses Space or Enter). |
/memory |
Fuzzy file browser for the memory/ directory. Provides a scrollable file preview with markdown rendering (r to toggle raw source), fast keyboard navigation, and an action to load a selected file into the current session context. |
/calendar |
Overlay showing upcoming Google Calendar events via gog. |
/logs |
Interactive modal to page through memory/log.md entries (Older/Newer), keeping you aware of recent context changes. |
/status |
Shows the Nexus workspace, session, model, context usage, task count, latest memory log entry, and backup status. |
Press Ctrl+Shift+T to open the tasks modal. When a task is marked done, the extension updates TASKS.md and runs the configured memory backup. Project extensions under .pi/extensions/ are loaded by Pi for this workspace; restart Pi or start a new session after changing extension code.
This repo also defines project-only subagents for the @tintinweb/pi-subagents extension. They live under .pi/agents/, so they apply only to this workspace and are not installed globally.
| Agent | Purpose | Writes? |
|---|---|---|
activity-scanner |
General read-only scanner for Slack, Gmail, Calendar, Drive, Notion, TASKS.md, and memory context. Used by workflows such as work-update and optionally daily-sync to collect evidence without consuming the parent agent's context. |
No |
task-reconciler |
Compares task candidates against TASKS.md and returns triage recommendations: already tracked, new candidate, stale, completion signal, waiting-on change, duplicate, or unclear. |
No |
memory-curator |
Classifies candidate memory updates against CLAUDE.md and memory/, recommending safe existing-page updates, glossary/hot-cache candidates, new-page confirmations, or ignored transient noise. |
No |
Typical workflow: Run /scan in a dedicated Pi tab to schedule read-only activity scans at 9am, 12pm, 3pm, and 6pm on weekdays. After the final scan completes, the same tab starts the interactive work-update workflow using the day's findings. Scheduled scans only run while that session is active or resumed, missed runs are not replayed, and task or protected-memory changes still require confirmation.
If you add or rename agents, restart Pi or start a new session so the Agent tool schema and /agents menu refresh.
.
├── .claude/
│ └── skills/
│ ├── work-start/
│ ├── work-update/
│ ├── daily-sync/
│ ├── meeting-notes/
│ ├── task-management/
│ ├── memory-management/
│ ├── decision-matrix/
│ ├── memory-backup/
│ ├── time-log/
│ ├── portfolio-update/
│ ├── journal-sync/
│ ├── ketch/
│ ├── ddgr/
│ ├── gmail/
│ ├── google-calendar/
│ ├── google-drive/
│ ├── slack/
│ ├── notion/
│ └── notebooklm/
├── .pi/
│ ├── agents/
│ │ ├── activity-scanner.md
│ │ ├── task-reconciler.md
│ │ └── memory-curator.md
│ ├── extensions/
│ ├── prompts/
│ │ └── scan.md
│ └── settings.json
├── TASKS.md # generated/maintained by workflow
├── CLAUDE.md # generated hot-memory file
├── package.json # Node dependencies for local skill tooling
└── memory/
├── glossary.md
├── journals/
│ ├── index.md
│ └── YYYY/ ← monthly entries + yearly summary per folder
├── people/
├── projects/
├── context/
└── topics/
- Install the core dependencies:
npm install uv sync
- Open the repository in Pi, Claude Code, or OpenCode.
- Run
/work-startto initializeTASKS.md,CLAUDE.md, andmemory/. - Use
/work-updateregularly to keep tasks and memory current. - Configure only the external integrations you need.
When using Pi:
- Use
/tasks,/memory,/calendar,/logs, and/statusfor the interactive workspace interface. - Optionally install
@tintinweb/pi-subagentsto enable the project-local agents in.pi/agents/. - Optionally run
/scanin a dedicated Pi tab for workday monitoring and an automatic interactive end-of-day update.
Other optional workflows:
- Use
/daily-syncto post your standup update to the correct Slack thread. - Configure
MEMORY_BACKUP_DIRto use/memory-backup. - Configure Notion and run
/journal-syncto import recent Journal entries into memory.
- Pi, Claude Code, or OpenCode
- Node.js and npm
- Python 3.12 or later
uv- Core dependencies:
npm installuv sync
gogCLI:brew install gogcli
ntnCLI for Notion:npm install --global ntn- or use the local helper:
npm run --silent ntn -- ...
- Chromium for NotebookLM browser authentication:
uv run playwright install chromium
The external-service CLIs and Chromium installation are needed only for the integrations that use them.
Create a .env file in the repository root for the integrations you use:
| Variable | Used by |
|---|---|
SLACK_TOKEN |
Slack |
NOTION_API_TOKEN |
Notion |
NOTION_WORKSPACE_ID |
Optional Notion workspace targeting |
GOG_ACCOUNT |
Optional default Google account |
MEMORY_BACKUP_DIR |
Memory backup |
Do not commit .env.
- Open Google Cloud Console.
- Create/select a project.
- Enable these APIs:
- Gmail API
- Google Calendar API
- Google Drive API
- Configure OAuth consent screen.
- Create OAuth Client credentials (Desktop App recommended).
- Download OAuth client JSON (example:
~/Downloads/client_secret.json). - Configure
gog:gog auth credentials ~/Downloads/client_secret.json
- Authorize account:
gog auth add you@gmail.com
- Set default account (optional):
gog auth manage- or
export GOG_ACCOUNT=you@gmail.com
- Open Slack API Apps, then create/select your app.
- In OAuth & Permissions, add User Token Scopes:
channels:history,groups:history,im:history,mpim:historychannels:read,groups:read,users:readchat:write
- Install/Reinstall app to workspace.
- Copy User OAuth token (
xoxp-...). - Create
.envfile and save your token in it:SLACK_TOKEN=xoxp-your-token
- Verify:
node .claude/skills/slack/slack-cli.js test
- Create a Notion integration and copy its internal integration token.
- Share each target page/database with the integration (
...→Connect to). - Add the token to
.env:NOTION_API_TOKEN=ntn_your_token_here- optional:
NOTION_WORKSPACE_ID=<workspace_id>
- Verify:
npm run --silent ntn -- api v1/users
Use /notion for general Notion operations. Use /journal-sync to import the configured Journal data source into memory/journals/YYYY/month_YYYY-MM_text.txt. The sync state lives in memory/journals/index.md.
- Install the locked Python dependencies and Chromium:
uv syncuv run playwright install chromium
- Authenticate with Google:
uv run notebooklm login
- Verify the setup:
uv run notebooklm statusuv run notebooklm list --json
- If auth expires or verification fails:
uv run notebooklm auth checkuv run notebooklm login
For parallel workflows, prefer explicit notebook IDs (-n <id> or --notebook <id>) instead of relying on notebooklm use.
- Clone your private backup repository somewhere outside this workspace.
- Ensure the clone already exists, is a Git repo, and has push access configured.
- Add
MEMORY_BACKUP_DIRto your workspace.envfile:MEMORY_BACKUP_DIR=/your/path/to/private-backup-repo
- Run the skill:
/memory-backup- push local memory to the backup repo/memory-backup --pull- pull latest backup into this workspace/memory-backup --sync- pull latest, then push local memory/memory-backup --dry-run- preview push
MEMORY_BACKUP_DIR must point to a clean local clone of a separate private Git repo.
For two-computer use, run /memory-backup --pull or /memory-backup --sync when starting work, and /memory-backup after memory/task changes. Pull/sync refuse to overwrite local changes in CLAUDE.md, TASKS.md, or memory/.
memory/,TASKS.md,CLAUDE.md, and.envcontain local or potentially sensitive information and are intentionally excluded from Git.- Never commit OAuth credentials, API tokens, cookies, or browser authentication state.
- Use a private repository for memory backups.
- External-reader skills can send selected email, calendar, Slack, Notion, or Drive content to the active AI provider as working context. Review your provider and workspace policies before using them with sensitive data.
- Review
.claude/settings.jsonand the project-local Pi configuration before enabling integrations or granting additional permissions.
work-updateis intentionally interactive: it asks before creating/updating tasks and memory entries.CLAUDE.mdshould remain compact; detailed context lives inmemory/.- If key files are missing, run
/work-startto repair/bootstrap the system.