Basic Memory
Reference

CLI Reference

Command-line reference for Basic Memory local and cloud workflows.

Use bm (short) or basic-memory (full). Examples below use bm.


Core commands

bm status

Show the current project-index observation: how many project files were seen, with file details under --verbose. The v0.23 display replaces the old sync-report tree; use --json for automation.

bm status
bm status --verbose
bm status --json
bm status --project research
bm status --wait --timeout 60
FlagDescription
--projectTarget a specific project
--verbose, -vShow detailed file information
--jsonMachine-readable JSON output
--waitPoll until sync completes (no pending changes)
--timeoutDeadline in seconds for --wait (default 30)
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

bm doctor

Run local consistency checks to verify file/database sync. Defaults to local routing since it scans the local filesystem.

bm doctor
FlagDescription
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

bm mcp

Run the MCP server with configurable transport options. The server handles initialization, file sync, and cleanup automatically.

# Default: stdio transport (for Claude Desktop, Claude Code, etc.)
bm mcp

# Lock to a single project
bm mcp --project main

# HTTP transport for web deployments
bm mcp --transport streamable-http --port 8000

# SSE transport for compatibility with existing clients
bm mcp --transport sse
FlagDescription
--transportTransport type: stdio (default), streamable-http, sse
--hostHost for HTTP transports (default 0.0.0.0)
--portPort for HTTP transports (default 8000)
--pathPath prefix for streamable-http transport (default /mcp)
--projectRestrict MCP server to a single project
This command works regardless of cloud mode setting. Users with cloud mode enabled can still run a local MCP server for Claude Code and Claude Desktop.

bm reindex

Rebuild search indexes and/or vector embeddings without dropping the database.

# Rebuild everything (search + embeddings)
bm reindex

# Rebuild only full-text search index
bm reindex --search
bm reindex -s

# Rebuild only vector embeddings
bm reindex --embeddings
bm reindex -e

# Reindex a specific project
bm reindex -p main
FlagDescription
--search, -sRebuild only the full-text search index
--embeddings, -eRebuild only vector embeddings
--fullForce a complete rebuild and re-embed (the default run is incremental and skips unchanged content)
--project, -pTarget a specific project (default: all projects)

When neither --search nor --embeddings is specified, both are rebuilt.

bm reindex --embeddings exits nonzero if any embedding fails and reports the configured vector index. Changing semantic_vector_index requires this command; until it succeeds, vector search returns no results and hybrid search serves full-text results only.

bm reset

Reset database — drops all tables and recreates them. Files are never deleted.

bm reset
bm reset --reindex
FlagDescription
--reindexRebuild the database index from filesystem after reset
--forceSkip the pre-flight check that refuses to reset while a basic-memory mcp process is running. Use only in automation where you've ensured no MCP clients are attached.
This rebuilds the entire database from your files. Safe (files are untouched) but may take time for large knowledge bases. bm reset refuses to run while an MCP server is attached to the database — stop it first, or pass --force in automated workflows.

bm orphans

List entities that have no relations — no incoming or outgoing connections in the knowledge graph. Useful for finding notes that aren't yet linked to anything, or notes that had their relations removed.

bm orphans
bm orphans --json
bm orphans --project research
FlagDescription
--projectTarget a specific project
--jsonMachine-readable JSON output
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

bm update

Check for a newer Basic Memory release and install it when supported. Basic Memory also checks for updates automatically in the background for Homebrew and uv tool installs (uvx environments are skipped — uvx resolves its own cache); MCP server processes check silently and never block.

# Check for updates and install if available
bm update

# Check only — report without installing
bm update --check
FlagDescription
--checkCheck for updates only; do not install
Auto-update behavior is configurable — see Configuration for the auto_update and update_check_interval settings.

bm format

Format files using configured formatters. Uses the formatter_command or formatters settings from your config. By default, formats all .md, .json, and .canvas files in the current project.

bm format                         # Format all files in current project
bm format --project research      # Format files in specific project
bm format notes/meeting.md        # Format a specific file
bm format notes/                  # Format all files in a directory
FlagDescription
--project, -pTarget a specific project

Retrieval inspection commands

Read-only diagnostics for search, new in v0.23. When a note doesn't come back for a query you expected it to, bm inspect chunks answers "is this note indexed, embedded, and current?" and bm inspect query answers "what did retrieval actually do with my query?".

bm inspect chunks

Show how the retrieval index decomposes one note into search rows and vector chunks. Accepts the same identifiers as read_note: a title, permalink, or memory:// URL.

bm inspect chunks "coffee-brewing-methods"
bm inspect chunks "Coffee Brewing Methods" --project research
bm inspect chunks coffee-brewing-methods --json

The output shows the note's entity, observation, and relation search rows with the vector chunks each row produced, plus a readiness summary and a per-chunk status:

StatusMeaning
readyEmbedded under the configured model and vector index — visible to vector search
pendingAwaiting embedding — not yet visible to vector search
staleThe stored chunk no longer matches the note's current search rows
orphanedEmbedded under a different model or vector index than the one configured — retrieval cannot see it; rebuild with bm reindex --embeddings

A freshness state (fresh, not_indexed, index_behind_rows, rows_behind_file, or unknown) distinguishes a chunking problem from an indexing-lag problem, with the checksum or fingerprint evidence for any non-fresh state.

FlagDescription
--jsonOutput raw JSON — the stable machine-readable schema (automatic when piped)
--plainUndecorated plain-text output
--projectTarget a specific project
--project-idProject external ID (UUID); takes precedence over --project
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

bm inspect query

Run a search and trace its execution: every retrieval stage — matching, hydration, filtering, fusion, reranking, and the final page window — that produced the result page. The trace is captured by the same call that returns the results, so it reflects the actual execution rather than a reconstruction, and ordinary searches are unaffected.

bm inspect query "how do we handle auth"
bm inspect query "auth" --mode vector --show-misses
bm inspect query "auth" --mode hybrid --page 1 --page-size 10 --json

The output shows the engine identity (vector index, embedding model, fusion formula, minimum similarity, reranker status), a stage table with in/out/dropped counts and timings, and the ranked results with final scores and rerank movement (Δ).

FlagDescription
--modeRetrieval mode: text (default), vector, or hybrid
--show-missesAlso render bounded rejected candidates and why each was dropped (vector and hybrid modes)
--show-idsInclude stable entity IDs in human output
--pageResult page to inspect (default 1)
--page-sizeResults per page (default 10)
--jsonOutput raw JSON — every captured candidate, stable schema (automatic when piped)
--plainUndecorated plain-text output
--projectTarget a specific project
--project-idProject external ID (UUID); takes precedence over --project
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

Configuration commands

bm config list

List every scalar setting with its effective value and source. Environment overrides are marked with the exact BASIC_MEMORY_* variable.

bm config list
bm config list --json

bm config get

Show one effective value and report any environment override:

bm config get reranker_enabled
bm config get milvus_uri

bm config set

Validate a value through the same config model used at startup, then write it to config.json:

bm config set reranker_enabled true
bm config set cli_output_style plain

Invalid keys or values exit nonzero without changing the config file. If an environment variable overrides the file value, the command writes the value but warns that the environment still wins.

bm config unset

Remove a setting from config.json:

bm config unset reranker_enabled

The effective value then falls back to an environment override when one exists, otherwise to the built-in default.

list, get, set, and unset mask secret values and redact credentials embedded in URLs. Structured fields such as projects are managed by their dedicated command groups and do not appear as writable scalar settings.


Harness hook commands

bm hook is the lifecycle front door used by the Basic Memory Claude Code and Codex plugins. See Harness Capture for event behavior, settings, and retention.

# Inspect shared inbox and harness settings health
bm hook status --harness codex --project-dir /path/to/repository
bm hook status --harness claude --project-dir /path/to/repository

# Archive local lifecycle envelopes
bm hook flush
bm hook flush --older-than-days 30

# Wire or remove user-level hooks without a plugin
bm hook install --harness codex
bm hook remove --harness codex
bm hook install --harness claude
bm hook remove --harness claude
CommandDescription
session-startPrint the configured context brief and capture a session-start envelope when enabled
pre-compactCapture the compaction event and coordinate a durable checkpoint
stopCompatibility no-op for stale pre-upgrade Stop hooks; not registered by new installs
statusShow inbox depth, last flush, settings, capture/checkpoint state, and tool versions
flushArchive pending envelopes locally; never writes graph notes
installAdd ownership-tagged user-level harness hooks idempotently
removeRemove only the entries written by bm hook install

Project management

bm project list

List projects from local config and (when available) cloud.

bm project list
bm project list --json
bm project list --workspace my-workspace
FlagDescription
--jsonMachine-readable JSON output
--workspaceCloud workspace name, slug, type, or tenant ID
--localForce local routing
--cloudForce cloud routing

bm project info

Display detailed information and statistics about a project. Shows an htop-inspired compact dashboard with horizontal bar charts for note types, embedding coverage bars, and colored status dots.

bm project info main
bm project info main --json
FlagDescription
--jsonMachine-readable JSON output
--localForce local routing (ignore cloud mode)
--cloudForce cloud routing

bm project add

Add a new project.

# Local project
bm project add research ~/Documents/research

# Cloud project (no local sync)
bm project add research --cloud

# Cloud project with local sync path
bm project add research --cloud --local-path ~/docs

# Cloud project in a specific team workspace, visible to all members
bm project add team-wiki --cloud --workspace acme --visibility workspace

# Cloud project restricted to specific people you grant access to
bm project add hiring --cloud --workspace acme --visibility shared

# Add and set as default
bm project add research ~/Documents/research --default
FlagDescription
--local-pathLocal sync path for cloud mode
--workspaceCloud workspace name, slug, type, or tenant ID (cloud mode only)
--visibilityCloud project visibility: workspace (default — visible to all members), shared (restricted to granted users), or private (creator only)
--defaultSet as default project
--localForce local routing
--cloudForce cloud routing

bm project remove

Remove a project. Files are retained by default; pass --delete-notes to remove them too. For a cloud project with a configured local sync directory, also pass --cloud to remove both the hosted objects and that local copy.

# Stop tracking a project while retaining its files
bm project remove research

# Delete a local project's files
bm project remove research --delete-notes

# Purge cloud storage and remove any configured local sync directory
bm project remove research --cloud --delete-notes
FlagDescription
--delete-notesAlso delete project files: local files for a local project, or all active objects under the project prefix for a cloud project
--localForce local routing
--cloudForce cloud routing

Cloud deletion is accepted asynchronously. Without --delete-notes, the project is removed from the hosted database but its cloud files remain. With --delete-notes, the background job purges indexed and unindexed objects under the exact project storage prefix before completing the hard delete. Existing cloud snapshots follow their own retention and deletion lifecycle.

For a cloud project configured with a local sync path, explicitly passing both --cloud and --delete-notes also removes that local sync directory. Back up any local files you need before running the command.

bm project default

Set the default project used as fallback when no project is specified.

bm project default main

bm project move

Update a local project's configured filesystem path. This changes configuration only — move the files to the new path yourself (Basic Memory does not move them).

bm project move research /new/path/to/research

bm project ls

List files in a project directory.

bm project ls --name research
bm project ls --name research subfolder
bm project ls --name research --local
bm project ls --name research --cloud
FlagDescription
--nameProject name (required)
--localList files from local instance
--cloudList files from cloud instance

Routing modes (per project)

Route specific projects through cloud while keeping others local:

bm project set-cloud research
bm project set-local research

Cloud commands

Authentication and status

bm cloud login
bm cloud status
bm cloud logout

API keys

bm cloud api-key save bmc_...
bm cloud api-key create "my-laptop"
bm cloud api-key create requires an active OAuth session. Run bm cloud login first.

Setup and upload

bm cloud setup   # provision the rclone remote (Personal workspaces; Team push/pull needs no setup)
bm cloud upload ~/my-notes --project research --create-project

Sync

# Fetch cloud changes additively (Personal + Team workspaces)
bm cloud pull --name research

# Upload local changes additively (Personal + Team workspaces)
bm cloud push --name research

# Choose conflict resolution: fail (default) | keep-local | keep-cloud | keep-both
bm cloud pull --name research --on-conflict keep-cloud

# One-way mirror: local → cloud (Personal workspaces only)
bm cloud sync --name research

# Preview and delete cloud files matching ~/.basic-memory/.bmignore (Personal only)
bm cloud prune --name research --dry-run
bm cloud prune --name research

# Verify file integrity between local and cloud (Personal only)
bm cloud check --name research

# Configure local sync for an existing cloud project
bm cloud sync-setup research ~/Documents/research

push/pull are additive (never delete on the destination) and abort on conflicts by default, git-style. On Team workspaces they run over the cloud's permissioned WebDAV API (v0.23+) — no bm cloud setup required, and access is checked per project. sync is a destructive mirror and is blocked on Team workspaces. In v0.23 it also deletes previously synced files that become ignored by .bmignore; preview with --dry-run. prune performs only that ignore-based remote cleanup and asks for confirmation unless you pass --yes. See the Cloud Sync guide for details.

Public shares

bm cloud share create research notes/my-idea
bm cloud share create research notes/my-idea --expires-at 2099-12-31
bm cloud share list
bm cloud share list --project research
bm cloud share update SHARE_TOKEN --disable
bm cloud share update SHARE_TOKEN --enable
bm cloud share update SHARE_TOKEN --expires-at none
bm cloud share revoke SHARE_TOKEN
bm cloud share revoke SHARE_TOKEN --force

All share commands accept --workspace to route by workspace slug, display name, or tenant ID. revoke confirms before deletion unless --force is set.

Snapshots

bm cloud snapshot create "Before migration"
bm cloud snapshot list
bm cloud snapshot show <snapshot-id>
bm cloud snapshot browse <snapshot-id>
bm cloud snapshot delete <snapshot-id>

Restore

bm cloud restore <path> --snapshot <snapshot-id>

Workspaces

# List cloud workspaces available to the current session
bm cloud workspace list

# Set the default workspace for CLI and MCP routing
bm cloud workspace set-default acme

See Teams for working with shared team workspaces.

Promo controls

bm cloud promo --off
bm cloud promo --on

Schema commands

Tools for defining, validating, and evolving note structure. See Schema System for concepts and workflow.

bm schema validate

Validate notes against their schema definition. Pass a note type to validate all notes of that type, a specific file path to validate one note, or omit to validate all notes that have schemas.

# Validate all notes with schemas
bm schema validate

# Validate all notes of a type
bm schema validate person

# Validate one specific note
bm schema validate people/ada-lovelace.md

# Strict mode — exit 1 if any validation errors are found
bm schema validate person --strict

# Machine-readable output
bm schema validate person --json

# Target a specific project
bm schema validate person --project research
FlagDescription
--strictExit with code 1 if any validation errors are found (warnings never affect the exit code)
--jsonMachine-readable JSON output
--projectTarget a specific project
--localForce local routing
--cloudForce cloud routing

bm schema infer

Analyze existing notes of a type and suggest a schema based on common observation categories, relation types, and frontmatter fields. Fields present in 95%+ of notes become required; fields above the threshold become optional.

# Infer schema for a note type
bm schema infer person

# Lower the threshold to include less common fields
bm schema infer person --threshold 0.1

# Machine-readable output
bm schema infer person --json

# Target a specific project
bm schema infer person --project research
FlagDescription
--thresholdMinimum field frequency for inclusion (default 0.25 — fields in 25%+ of notes)
--saveSave the inferred schema as a schema note in the schemas/ directory
--jsonMachine-readable JSON output
--projectTarget a specific project
--localForce local routing
--cloudForce cloud routing

bm schema diff

Compare a schema definition against actual note usage to detect drift. Shows new fields appearing, old fields disappearing, and cardinality changes.

# Check drift for a note type
bm schema diff person

# Machine-readable output
bm schema diff person --json

# Target a specific project
bm schema diff person --project research
FlagDescription
--jsonMachine-readable JSON output
--projectTarget a specific project
--localForce local routing
--cloudForce cloud routing

Tool commands (CLI wrapper for MCP tools)

Command group: bm tool (singular). This provides CLI access to the same MCP tools that AI assistants use, useful for scripting, debugging, and quick operations from the terminal.

Search, read, context, and activity commands use Rich tables, panels, trees, or Markdown when stdout is a TTY. Output precedence is:

  1. --json for raw machine-readable JSON.
  2. --plain for undecorated human-readable text.
  3. Non-TTY output defaults to JSON, preserving piped and redirected scripts.
  4. TTY output follows cli_output_style (rich by default, or plain).

--json and --plain are mutually exclusive. Set the interactive default with bm config set cli_output_style plain.

bm tool write-note

# Create a note with inline content
bm tool write-note --title "API Notes" --folder specs --content "# API Notes"

# Pipe content from stdin
echo "# My Note" | bm tool write-note --title "My Note" --folder notes

# Set the note type at creation time
bm tool write-note --title "Standup" --folder meetings --type meeting

# Replace an existing note (past the overwrite guard)
bm tool write-note --title "API Notes" --folder specs --content "..." --overwrite
FlagDescription
--titleNote title (required)
--folderDestination folder (required)
--contentNote content (reads from stdin if omitted)
--tagsTags to apply
--typeFrontmatter note type (e.g. meeting, task)
--overwriteReplace an existing note at the same path (past the overwrite guard)
--projectTarget project
--localForce local routing
--cloudForce cloud routing

bm tool read-note

bm tool read-note "specs/api-notes"
bm tool read-note my-note --include-frontmatter
FlagDescription
--include-frontmatterInclude YAML frontmatter in output
--projectTarget project
--localForce local routing
--cloudForce cloud routing

bm tool edit-note

bm tool edit-note my-note --operation append --content "new content"
bm tool edit-note my-note --operation find_replace --find-text "old" --content "new"
bm tool edit-note my-note --operation replace_section --section "## Notes" --content "updated"
bm tool edit-note my-note --operation replace_section --section "## Notes" --content "updated" --no-replace-subsections
FlagDescription
--operationEdit operation: append, prepend, find_replace, replace_section, insert_before_section, insert_after_section (required; the insert operations also require --section)
--contentContent for the edit (required)
--find-textText to find (required for find_replace)
--sectionSection heading (required for replace_section)
--expected-replacementsExpected replacement count for find_replace (default 1)
--replace-subsections, --no-replace-subsectionsFor replace_section, replace nested subsections by default or preserve them with --no-replace-subsections
--projectTarget project
--localForce local routing
--cloudForce cloud routing

bm tool delete-note

bm tool delete-note notes/old-draft
bm tool delete-note docs/archive --is-directory
FlagDescription
--is-directoryDelete a directory instead of a single note
--projectTarget project
--project-idProject external ID (UUID); takes precedence over --project
--localForce local routing
--cloudForce cloud routing

bm tool search-notes

# Text search (query is a positional argument)
bm tool search-notes "authentication"

# Tag and metadata filters (query is optional)
bm tool search-notes --tag python --tag async
bm tool search-notes --meta status=draft
bm tool search-notes --type person --type meeting

# Search observations by category
bm tool search-notes "auth" --entity-type observation --category decision

# Search modes
bm tool search-notes "how to speed up the app" --hybrid
bm tool search-notes "how to speed up the app" --vector
bm tool search-notes --permalink "specs/*"
bm tool search-notes --title "API Design"

# Advanced metadata filter (JSON)
bm tool search-notes --filter '{"priority": {"$in": ["high", "critical"]}}'

# Pagination
bm tool search-notes "api" --page 2 --page-size 20
FlagDescription
--hybridUse hybrid search (keyword + semantic)
--vectorUse vector (semantic-only) search
--permalinkSearch permalink values
--titleSearch title values
--tagFilter by frontmatter tag (repeatable)
--statusFilter by frontmatter status
--typeFilter by frontmatter type (repeatable)
--entity-typeFilter by result type: entity, observation, relation (repeatable)
--categoryFilter observation results to exact categories (repeatable)
--metaFilter by frontmatter key=value (repeatable)
--filterJSON metadata filter (advanced)
--after_dateDate filter (e.g., 2d, 1 week)
--pagePage number (default 1)
--page-sizeResults per page (default 10)
--projectTarget project
--localForce local routing
--cloudForce cloud routing

bm tool build-context

bm tool build-context memory://specs/search
bm tool build-context specs/search --depth 2 --timeframe 30d
FlagDescription
--depthTraversal depth (default 1)
--timeframeTime window filter (default 7d)
--pagePage number (default 1)
--page-sizeResults per page (default 10)
--max-relatedMaximum related items (default 10)
--projectTarget project
--localForce local routing
--cloudForce cloud routing

bm tool recent-activity

bm tool recent-activity
bm tool recent-activity --timeframe 30d --page-size 20
bm tool recent-activity --type entity --type observation
FlagDescription
--typeFilter by item type (repeatable)
--depthContext depth (default 1)
--timeframeTime window (default 7d)
--pagePage number (default 1)
--page-sizeResults per page (default 10)
--projectTarget project
--localForce local routing
--cloudForce cloud routing

Schema tool commands

These are CLI wrappers around the schema MCP tools with JSON output:

bm tool schema-validate person
bm tool schema-infer person
bm tool schema-diff person
bm tool list-projects
bm tool list-workspaces

Import commands

bm import claude conversations
bm import claude projects
bm import chatgpt
bm import memory-json /path/to/export.json

Notes on defaults

  • If --project is omitted, Basic Memory falls back to default_project when configured.
  • Most bm tool subcommands accept --project-id (the project's external UUID from bm project list --json) to disambiguate same-named projects across cloud workspaces.
  • --local and --cloud flags are available on most commands for routing overrides.