This guide covers the common user-facing workflows. For architecture details, see architecture.md.
uv tool install git+https://github.com/OctopusGarage/alcove.git
alcove --versionFor local development:
uv sync
uv run alcove --version
uv tool install --force -e .Alcove separates global personal state from managed knowledge bases.
alcove home init
alcove kb add research_notes /path/to/research_notes
alcove hub init ~/AlcoveHub --default-kb research_notes
alcove workspace init family --default-kb research_notes
alcove global install --default-kb research_notes
alcove kb install research_notesDevelopment install mode keeps Alcove-owned skills and commands symlinked to the repository templates:
alcove hub install ~/AlcoveHub --default-kb research_notes --link
alcove workspace install family --link
alcove kb install research_notes --linkThis is useful while tuning prompts locally. AGENTS.md and CLAUDE.md remain
normal files with an Alcove-managed section so user/project context is not
replaced by a symlink.
Agent targets:
| Target | Files |
|---|---|
--target claude |
CLAUDE.md, .claude/skills/*/SKILL.md, .claude/commands/*.md |
--target codex |
AGENTS.md, .agents/skills/*/SKILL.md |
default / --target all |
both Claude Code and Codex files |
Install modes:
| Mode | Command | Use |
|---|---|---|
| copy | alcove hub install ... / alcove kb install ... |
normal users, release installs, portable workspaces |
| link | alcove hub install ... --link / alcove kb install ... --link |
local Alcove development, prompt tuning, immediate source-template feedback |
Current distribution paths:
- Source install:
uv tool install git+https://github.com/OctopusGarage/alcove.git - Local editable install:
uv tool install --force -e . - Workspace development:
uv sync+uv run alcove ... - Wheel packaging:
uv build --wheel
Check installed entry profiles:
alcove hub init ~/AlcoveHub --default-kb research_notes --status --json
alcove global install --status --json
alcove kb install research_notes --status --jsonalcove hub init: project-local hub workspace for daily Alcove conversations.alcove workspace init: lightweight business-scoped agent workspace under the Hub concept. Omit--pathto use~/.alcove/workspaces/data/<id>/; pass--pathfor a custom directory.alcove global install: lightweight MCP access from unrelated projects. It writes aliteMCP toolset by default; add--default-kb <kb>when global chats should be able to save pasted notes into a managed KB inbox. It also initializes the default Apple Notes publisher and installs the scheduler LaunchAgent so due publisher runs happen in the background throughalcove service tick.alcove kb install: managed-KB workflow files, Claude slash commands, and Claude/Codex skills for inbox review, notes search, social post processing, and Clipsmith capture handoff.
Business workspaces are useful when a long-running conversation should inherit a family, work, travel, or similar scene instead of the full Hub control surface:
alcove workspace init family \
--default-kb research_notes \
--tag family \
--context "Family errands, household knowledge, and recurring reminders."
cd ~/.alcove/workspaces/data/family
codexFor one-shot work, run the agent inside a registered workspace:
alcove workspace run family --agent codex "整理家庭相关任务"
alcove workspace run family --agent claude "总结家庭知识记录"For scene-local documents and notes, initialize the workspace OKF store instead of manually wiring a managed KB:
alcove workspace okf init family --json
alcove workspace okf add-note family home/insurance "家庭保险资料整理" \
--summary "家庭保险资料需要按保单、受益人、续费日期归档。" \
--json
alcove workspace okf import-file family ./documents/insurance.md --topic home/insurance --json
alcove workspace okf search family "保单" --jsonAlcove entry profiles use a read-broadly/write-narrowly model. See read-write-model.md for the full operating model and okf-profile.md for the OKF-compatible file/index profile.
For read-only questions, start with alcove search or MCP alcove_search to
discover candidates. Treat those results as leads, not final truth. For broad,
ambiguous, cross-topic, or low-confidence questions, continue with AI-led
investigation over the local OKF structure: read domain/topic/tag/index pages,
inspect candidate notes, follow source or connector references, and use shell
search or file reads when useful.
For writes, use Alcove CLI/MCP commands. Do not directly edit Alcove-owned data unless the CLI lacks the needed operation. After any direct edit, run the nearest validation or rebuild command.
Typical pattern:
Question -> search candidates -> inspect OKF/index/source files -> synthesize
Save/update/delete -> CLI/MCP mutation -> validate or rebuild
Build the derived global OKF catalog when an agent or external reader needs a single Markdown entry point across managed KBs, global memory, mounts, and connectors:
alcove okf --home ~/.alcove catalog build --json
alcove okf --home ~/.alcove catalog build --include-all-status --jsonCheck all module data, OKF files, and derived indexes together:
alcove health --home ~/.alcove --json
alcove health --home ~/.alcove --kb research_notes --strict --json
alcove health --home ~/.alcove --kb research_notes --fix --json
alcove health --home ~/.alcove --fix --deep --json
alcove health --home ~/.alcove --fix --deep --refresh-stale-connectors --json--fix fills missing schema metadata for recognized OKF notes and rebuilds safe
derived indexes plus the global OKF catalog. It does not refresh external
systems, rescan mounts, or rewrite managed KB note bodies.
Use --deep for a local full-maintenance pass. It also rescans mounts, rebuilds
usage rollups, rebuilds the dashboard snapshot, and rebuilds the global OKF
catalog again after those derived views are current. Connector refresh remains
explicit: add --refresh-stale-connectors for registered stale sources, or
--refresh-all-connectors only when a full external refresh is intentional.
alcove inbox --kb research_notes peek
alcove inbox --kb research_notes read web/example
alcove inbox --kb research_notes manual-add "Manual Thought" \
--content "Copied note text" \
--source "chat://manual"
alcove knowledge --kb research_notes note-source \
--platform xhs \
--title "Example" \
--topic agent-engineering/agent-harness \
--summary "Summary"
alcove knowledge --kb research_notes revise \
concepts/agent-engineering/agent-harness/example.md \
--append "AI discussion follow-up" \
--tag mcp \
--json
alcove search "Example" --kb research_notesUse manual-add when copied text or an AI discussion should first land in the
inbox. Use knowledge revise when a discussion should update an existing OKF
note.
Pins, prompts, projects, ideas, tasks, routines, mounts, and connectors are
global by default and live under ~/.alcove.
alcove pin add "Japanese Edge Launcher" \
--description "Launch Edge with TZ=Asia/Tokyo" \
--tag app-launcher
alcove prompt propose "Code Review Lens" \
--content "Review for correctness, missing tests, and regression risk." \
--tag review \
--use-case "PR review"
alcove prompt save --proposal-id <proposal-id>
alcove prompt recommend "review a dashboard regression before shipping"
alcove prompt compose "review a dashboard regression before shipping"
alcove prompt audit --json
alcove project add alcove /path/to/alcove --note "Personal information core"
alcove task add "Wire MCP search" --priority high --tag mcp
alcove task edit wire-mcp-search --due 2026-07-20 --priority high
alcove idea add "Review mount design" --notes "Local folders first" --tag mounts
alcove idea promote review-mount-design --due 2026-07-18
alcove task routine-add "Weekly inbox review" \
--frequency weekly \
--weekday sun \
--next-due 2026-07-12
alcove task routine-pause weekly-inbox-review
alcove task routine-resume weekly-inbox-review
alcove task materialize-due --today 2026-07-08 --json
alcove task digest --period weekly --notify --jsonPlanner digests are opt-in. To let the local service send a weekly digest,
create ~/.alcove/tasks/notifications.yml:
digests:
weekly:
enabled: true
day: sunday
time: "21:00"
notify: true
sinks:
- type: telegram
- type: feishu
webhook_env: ALCOVE_FEISHU_WEBHOOK_URL
secret_env: ALCOVE_FEISHU_SECRETalcove task digest --period weekly --notify --json also uses the configured
weekly sinks. Without sinks, planner notifications default to Telegram. The
local service honors time and records sent periods to avoid duplicate weekly
messages.
Publishers render Alcove-owned module data into external readable mirrors. The first publisher target is Apple Notes, useful when the dashboard is unavailable outside the local network.
Initialize the default Apple Notes publisher:
alcove publish init apple-notes --home ~/.alcove --root-folder "iCloud/Alcove" --jsonalcove global install performs this initialization by default and installs
the scheduler LaunchAgent for background due-publisher runs. Use the explicit
publish init command to repair or customize the publisher definition.
This creates five generated notes:
iCloud/Alcove/
├── pins/
│ ├── Regular Pins
│ └── TODO Pins
├── planner/
│ └── Planner Digest
├── prompts/
│ └── Prompt Library
└── projects/
└── Project Registry
Run it manually:
alcove publish run apple-notes --home ~/.alcove --json
alcove publish run apple-notes --home ~/.alcove --target pins_regular --force --json
alcove publish list --home ~/.alcove --jsonThe generated Apple Notes are readable mirrors. Alcove-owned data remains the
source of truth under ~/.alcove, such as ~/.alcove/pins, ~/.alcove/tasks,
~/.alcove/prompts, and ~/.alcove/projects. Manual edits inside generated
Apple Notes can be overwritten by the next publish run.
Publisher output is presentation-optimized for phone reading. It uses one module icon, quiet section dividers, compact item spacing, and short metadata labels. Long pin content is preserved in full; the publisher adds an outline, extra spacing around sections, and cleaner table rows so Apple Notes remains readable without hiding details.
Pin source data should still be written as structured records: concise
summary, focused content, explicit tags, and URL-like references in
resources when they are important. Pin writes normalize excessive blank lines
and common divider variants before indexing and publishing.
Apple Notes publishing is intentionally selective. It mirrors small, human readable module views for offline access. Large knowledge bases, mounts, connectors, radar archives, automations, logs, and usage records should stay in Alcove and be accessed through dashboard, search, CLI, or MCP.
The local scheduler also runs due publishers during alcove service tick.
Default publisher definitions have a 24-hour TTL, but Alcove writes to mirrored
sources such as pins, tasks, prompts, and projects mark the Apple Notes
publisher dirty. The next scheduler tick can re-export that changed source
before the TTL expires, then clears the dirty marker after a successful run.
Use alcove service tick --skip-publishers --json to skip this part of a manual
maintenance run.
Mounts index local folders without copying them:
alcove mount add /path/to/github-repos --name github --type local-folder --profile docs --tag repos
alcove mount scan github --dry-run --json
alcove mount scan github --jsonMount profiles keep indexes focused:
alcove mount add ~/notes --name notes --profile notes
alcove mount add ~/blog --name blog --profile site --exclude ".agents/**"
alcove mount update github --profile docs --exclude "archived-*/**" --exclude "**/_build/**"Use --dry-run before a large rebuild to inspect scanned, skipped, and
skip_reasons without writing ~/.alcove/mounts/indexes/ or derived OKF files.
Connectors index external systems or exports:
alcove connector apple-notes import-local --tag apple-notes --json
alcove connector github-stars import-url "https://github.com/octocat?tab=stars" \
--tag github-stars \
--json
alcove connector chrome-bookmarks import-local --tag bookmarks --json
alcove connector status --json
alcove connector refresh --stale --json
alcove connector fetch "connectors/apple-notes#notes/example-note/note.json" --jsonPromote an indexed external item into a managed KB:
alcove link --kb research_notes source \
"connectors/github-stars#octopusgarage/alcove" \
ai-knowledge/knowledge-base \
--summary "Useful reference" \
--jsonManaged KB cleanup is result-driven, not a blanket retention sweep. Search first, inspect the candidate metadata, then delete only the confirmed outdated record:
alcove search --kb social_media_posts "query" --type Source --json
alcove knowledge --kb social_media_posts delete "sources/web/topic/item.md" --json
alcove knowledge --kb social_media_posts delete "sources/web/topic/item.md" \
--reason "confirmed obsolete from search result" \
--confirm \
--json
alcove search --kb social_media_posts "query" --status deleted --jsonSearch rows include published_at, collected_at, updated_at, deleted_at,
status, and path. knowledge delete is a soft delete: it marks the Source as
deleted, hides it from default search, updates related source_refs, and
rebuilds managed-KB indexes. Use --status deleted for audit.
alcove dashboard --home ~/.alcove build
alcove serve --dashboard --home ~/.alcove --port 8765For a LAN-facing dashboard, keep Alcove bound to localhost and expose it through a local reverse proxy. This keeps the Alcove process private while letting nginx own the LAN port and hostname:
server {
listen 80;
server_name my-mac.local alcove.local alcove.lan 192.168.1.10;
location = / {
return 302 /alcove/dashboard/;
}
location = /alcove/dashboard {
return 301 /alcove/dashboard/;
}
location /alcove/dashboard/ {
proxy_pass http://127.0.0.1:8765/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_buffering off;
}
}Reload and verify:
nginx -t && nginx -s reload
curl -I http://my-mac.local/alcove/dashboard/
curl -I http://192.168.1.10/alcove/dashboard/my-mac.local is the macOS Bonjour hostname and usually works from phones on
the same Wi-Fi. Custom names such as alcove.local or alcove.lan also need a
router/local-DNS record pointing at the Mac. If the phone cannot connect, check
that nginx is listening on *:80 and that the macOS firewall allows incoming
connections.
The dashboard includes a Usage page for local aggregate statistics:
- search count, zero-result count, and zero-result rate,
- CLI / MCP / Dashboard surface split,
- dashboard route views when events are recorded through the Alcove dashboard server,
- data-health counts for managed KBs, mounts, connectors, indexed items, and stats rollups,
- recent privacy-safe usage events.
Usage events are stored in ~/.alcove/logs/usage.jsonl. Search query text is not
stored by default; Alcove records query length and a local salted query hash for
deduplication-oriented analysis.
Usage summaries and retention:
alcove usage summary --home ~/.alcove --json
alcove usage prune --home ~/.alcove --days 90 --jsonalcove usage summary refreshes ~/.alcove/stats/summary.json and
~/.alcove/stats/daily/*.json. usage prune removes old usage.jsonl and
activity.jsonl entries, then regenerates the rollups.
Optional pin import:
alcove dashboard --home ~/.alcove import-pins \
--regular-file ~/Downloads/regular.txt \
--todo-file ~/Downloads/todo.txtInstall macOS launchd services:
alcove service install --dashboard --scheduler --load
alcove service status --jsonWithout --dashboard or --scheduler, service install targets both services.
Use explicit flags to operate on only one service. The dashboard service runs
alcove serve --dashboard; the scheduler runs alcove service tick at the
configured interval.
Manual maintenance tick:
alcove service tick --home ~/.alcove --json
alcove service tick --home ~/.alcove --skip-radars --json
alcove service tick --home ~/.alcove --skip-automations --json
alcove service tick --home ~/.alcove --mount-refresh-days 2 --jsonEach tick materializes due routines, sends configured planner digests, refreshes
stale connector sources, checks watchers and monitored blogs, runs enabled
scheduled radars, runs due user automation jobs, refreshes mounted knowledge
indexes when their two-day maintenance window is due, rebuilds the global OKF
catalog, runs health repair, refreshes usage rollups, prunes old usage events,
and rebuilds the dashboard snapshot. Mount refresh uses the existing incremental
scan and can be disabled for a manual tick with --skip-mounts. This is
deterministic maintenance; blog summary, radar AI analysis, automation
notifications, and agent automation jobs are opt-in.
Watch a site or feed:
alcove watch add "Example Blog" https://example.com/feed.xml \
--kind rss \
--kb research_notes \
--tag blog \
--json
alcove watch check --stale --jsonWatcher sources are stored in ~/.alcove/watchers/sources/*.yml, and change
events are appended to ~/.alcove/watchers/events.jsonl. If a watcher is bound
to --kb <name>, detected changes are added to that managed KB inbox as manual
items for later review.
Monitor blogs for new articles:
alcove blog add "Anthropic Engineering" https://www.anthropic.com/engineering \
--id anthropic \
--discover playwright \
--link-pattern /engineering/ \
--kb social_media_posts \
--inbox-path inbox/anthropic \
--capture \
--json
alcove blog add "OpenAI Engineering" https://openai.com/news/engineering/ \
--id openai \
--discover playwright \
--link-pattern /index/ \
--kb social_media_posts \
--inbox-path inbox/openai \
--capture \
--json
alcove blog seed openai --json
alcove blog check --stale --jsonBlog sources are stored in ~/.alcove/blog-monitor/sources/*.yml. Seen URLs
live in ~/.alcove/blog-monitor/seen/. When capture is enabled, new article
bundles are written into the configured managed KB inbox path, such as
social_media_posts/inbox/openai. When notification is enabled and Telegram
credentials are present, Alcove sends one message per new article with the
article title, URL, and the captured inbox summary.md content when available.
Use --discover playwright for monitored blog index pages. This keeps discovery
consistent with Clipsmith's browser-based capture model, runs unattended through
the scheduled service, and does not invoke Codex, Claude, or claude -p.
Playwright discovery falls back to static HTML and category sitemap discovery
when a rendered page is blocked or returns no usable article links. If discovery
or capture still fails, the source is marked needs_attention, the failed run
is recorded, and Telegram receives an actionable alert when notifications are
enabled.
For a user-triggered check from the Hub workspace, use alcove blog check --json
or alcove blog check <source-id> --json to force an immediate run. alcove service tick is reserved for scheduled stale maintenance and may skip sources
whose TTL has not expired.
Telegram credentials can be provided by process environment variables or
~/.alcove/.env:
ALCOVE_TELEGRAM_BOT_TOKEN=...
ALCOVE_TELEGRAM_CHAT_ID=...Credential priority is ALCOVE_* process environment, then ~/.alcove/.env,
then generic TELEGRAM_* process environment.
Automations are repeatable user jobs stored under ~/.alcove/automations/.
They are useful for local maintenance such as syncing exported notes or backing
up repositories.
alcove automation list --home ~/.alcove --json
alcove automation add-shell "backup cache" \
--cmd "rsync -a ~/source/ ~/backup/" \
--ttl-hours 24 \
--json
alcove automation add-git-sync notes ~/notes \
--commit-message "chore: sync notes" \
--notify \
--json
alcove automation run notes --home ~/.alcove --json
alcove automation run-due --home ~/.alcove --jsonshell, git-sync, and alcove jobs can run from the local service when due.
agent jobs are guarded: scheduled service execution requires
allow_service: true, and manual execution requires --allow-agent unless the
job is already service-approved. This keeps background launchd maintenance from
silently starting Codex or Claude.
Radars are generic user-defined briefings. Built-in presets are starter
definitions; user-specific categories live under ~/.alcove/radars/definitions/.
alcove radar preset list --json
alcove radar init tech-news --from-preset tech-news --json
alcove radar init world-news --from-preset world-news --json
alcove radar list --json
alcove radar run tech-news --json
alcove radar run tech-news --force --ai --notify --json
alcove radar run tech-news --skip-fetch --force --ai --notify --json
alcove radar status tech-news --jsonScheduled radars can use a local daily window:
schedule:
enabled: true
daily_time: "10:00"
timezone: Asia/Singapore
ttl_hours: 24See radars.md for the storage contract and adapter model. Optional
ai_summary post-processing writes <date>.ai.md and can send notifications
through configured sinks. Telegram sends the Markdown and HTML report files when
available. Feishu custom bot webhooks send a text message with the summary and
top links; local report paths are not included in notification text. For
Feishu/Lark attachments, use the tcb sink, which delegates report upload to a
running tmux-claude-bot
service through tcb notify --attach. The AI step
analyzes the report without changing fetched items or deterministic scores.
alcove export global ~/alcove-backup --json
alcove export kb research_notes ~/alcove-backup/research_notes --json
alcove export all ~/alcove-backup-all --jsonalcove serve --mcp
alcove serve --mcp --toolset lite
alcove serve --mcp --toolset kb --kb research_notes
alcove serve --mcp --kb research_notes
alcove global install --status --json
alcove hub init ~/AlcoveHub --default-kb research_notes --status --json
alcove kb install research_notes --status --jsonGlobal-aware MCP tools accept home. Managed-KB MCP tools require workspace
or a configured default KB. Complex workflows that intentionally stay on the
CLI/Hub surface, such as blog monitoring, radar reports, dashboard serving, and
publisher syncs, can be discovered through MCP alcove_command_hints instead
of widening the global MCP mutation surface.