Skip to content

Reference

CLI reference

Every personkit subcommand shipped today, grouped by what you do with it.


This page mirrors what personkit --help prints. Every command listed here is in the binary now.

Get started

personkit setup

Orchestrates the full first-run flow: sign in → [1/4] connect → [2/4] corpus init → [3/4] seed → [4/4] verify surfaces. The seed step auto-discovers your git repos and ingests the last 30 days.

personkit doctor

Surface-by-surface health check. Reports signed-in state, wired tools, observer / harvester last-run times, breaker state, corpus + daemon health.

personkit status

Shows your AI’s identity and where it’s connected. Cheaper than doctor — just lists wired surfaces.

Day-to-day

personkit connect

Wires the persona projection into every detected AI surface. Idempotent.

Editor and agent targets (--tool ids): claude-code, vscode, copilot, cursor, windsurf, zed, jetbrains, antigravity, augment, continue, cline, aider, codex, factory-droid, opencode, gemini. Every MCP entry they write pins @aiperson/mcp-server@0.8.1, never @latest (whose dist-tag can lag the repo), so re-running connect is what upgrades the server. Each entry also names its tool in PERSONKIT_SOURCE_SURFACE, so your AI’s history records which tool a change came from. Before writing anything, connect checks that npm can resolve the pinned server, and stops if it can’t.

Local-model runtimes get a projection, not a proxy: connect writes the persona as a system prompt in the runtime’s own format and, where the runtime has a CLI or API, registers it. Inference still runs entirely on your machine; personkit never sits in the request path.

--toolWhat connect writesDetected when
ollama~/.dotperson/projections/ollama/Modelfile (FROM <base> + SYSTEM """…"""), then runs ollama create <name>-persona -f Modelfile when ollama is on your PATH — otherwise prints the command. Base model from PERSONKIT_OLLAMA_BASE (default llama3.1).ollama on PATH, or ~/.ollama/ exists
lmstudio~/.dotperson/projections/lmstudio/system-prompt.md, plus dotperson-persona.preset.json in ~/.lmstudio/config-presets/ when that folder exists (it shows under My Presets on next launch).~/.lmstudio/ or ~/.cache/lm-studio/ exists
open-webui~/.dotperson/projections/open-webui/system-prompt.md; with OPEN_WEBUI_URL + OPEN_WEBUI_API_KEY set it also upserts a workspace model dotperson-<name> through /api/v1/models (base from OPEN_WEBUI_BASE_MODEL, default llama3.1:latest).OPEN_WEBUI_URL is set, ~/.open-webui/ exists, or a previous projection is on disk

Every rules-file and system-prompt projection is bounded to 20,000 characters. Identity, voice, signatures, every refusal, every value and every global convention always fit (their prose is shortened rather than dropped); scoped conventions fill the rest newest-first; and a trailing <!-- projected N of M conventions; budget B chars --> says what was left out. Override with PERSONKIT_PROJECTION_BUDGET=<chars> (2,000–60,000).

personkit login

Opens a browser tab on aiperson.one, signs you in via GitHub, persists credentials at ~/.dotperson/credentials.json.

personkit sync

Alias for personkit observe — one sweep of every observer (Continue, Cursor, Copilot Chat, Windsurf, Gemini-CLI, Claude Desktop presence-check), then POST to the relay’s /v1/observations and mirror each observation into the local messages table.

personkit import [--name <slug>]

Pick up settings or transcripts you already have in other AI tools. Supports --name chatgpt for ChatGPT export zips, --name <other> for other surfaces.

personkit uninstall [--yes]

Disconnect everything and wipe local config. Tears down the daemon’s job — the legacy observer plist and the unified daemon plist on macOS, the systemd units on Linux.

The corpus

personkit corpus init

Create ~/.dotperson/corpus.db and run all migrations (currently up to schema v2 — threads + messages).

personkit corpus seed [--repo P]... [--since 30d]

Seed git history into the corpus. Reads commits from each --repo and emits git_event rows.

personkit corpus query <text>

Hybrid retrieval (FTS5 + sqlite-vec + entity + temporal, fused with reciprocal rank fusion, k=60).

personkit corpus recent

Most-recent events, no text search.

personkit corpus entity <id>

Read one entity by id (git:<sha>, repo:<path>, person:<name>, …).

personkit corpus health

Counts per table (events, threads, messages, entities, relations, embeddings), pending-embedding counts, schema version, vec availability, embedder selection. The first thing to check when retrieval is acting strange.

personkit corpus surfaces [--since 7d] [--json]

Per-surface roll-up of recent threads — source_surface, thread count, last-message timestamp. Useful for confirming “is dotperson seeing what I expect across the chat surfaces I use.” Pairs with corpus messages for drill-in.

personkit corpus messages [--surface <id>] [--since 7d] [--limit 20] [--json]

Flatten recent threads to a per-message feed. Filter to one surface (browser-ext:chatgpt, browser-ext:kimi, claude_code, etc.) or scan all. Each row is role + content preview + timestamp. The MCP corpus_messages tool shells out to this; the assistant can answer “show me what I said to Kimi today” without leaving the chat.

personkit corpus embed [--batch 16] [--max 2000]

Backfill embeddings for events lacking them. Uses the configured embedder (Vertex when GCP_PROJECT_ID is set; fastembed when built with that feature). The daemon calls the same helper on every cycle.

personkit corpus record-turn

Universal capture entry point. Reads JSON from stdin (or --input <file>), upserts the thread, inserts the message, prints {thread_id, message_id} on stdout. The MCP record_turn tool shells out to this; the browser extension can fall back to it; any agent on any surface can call it.

personkit corpus snapshot

Signed JSONL export of every corpus table — sister to the markdown export, aimed at machines + crypto rather than humans. Each table becomes a JSONL file under <dir>/, plus a manifest.json carrying per-file SHA-256 hashes + (when --key is supplied) an Ed25519 signature.

Includes V2 tables (threads, messages) automatically.

personkit corpus restore

Round-trip a snapshot back into a corpus. Inverse of snapshot.

Existing rows in the target corpus are preserved (entities + threads are INSERT OR REPLACE; events + messages are INSERT OR IGNORE so content-hash dedupe wins).

personkit corpus wipe

Wipe the local corpus DB. Interactive by default — asks for confirmation and reports counts of what will be removed.

personkit corpus sync push|pull|serve

Cross-device sync against the relay.

Daily memory

personkit today / personkit brief

The daily brief — recent threads + git activity in the last N hours.

personkit export --format=markdown

Export the corpus as portable .md files (Obsidian-friendly). Each thread becomes one file with YAML front-matter and turns as block-quotes.

Background

personkit daemon

The unified background loop, run every five minutes by your system’s scheduler: one launchd job (one.aiperson.personkit-daemon) on macOS, which replaces the legacy observer-only plist, or a systemd user service and timer (~/.config/systemd/user/personkit-daemon.{service,timer}) on Linux.

Each cycle runs: harvest → embed → observe → sync → connector-drain → synthesise (deterministic synthesis only; LLM hook stays gated behind PERSONKIT_SYNTHESIS_LLM_OK=1).

personkit synthesise [--hours 24] [--with-llm]

Nightly housekeeping: embedder backfill (events + messages), entity-alias resolution, templated thread summaries. Wired into the daemon by default; runnable on demand for debugging.

personkit harvest run-once|serve|enable|disable

Discovery

personkit connectors [--json]

List every thread connector and whether its source is available on this host: browser_extension, openai_export, anthropic_api, openai_api.

personkit plugin list|install|remove|info

Community plugin manager. Plugins live in ~/.dotperson/plugins/<id>/plugin.json.

personkit voice capture <audio-file> [--model <name>]

Whisper bridge: invokes a local whisper (or whisper-cpp) binary, takes the transcript, upserts a voice thread, inserts the transcript as a user-role message. Default model is base.en.

personkit prefs list|get|set|unset|path

Local preference manager — mirrors the dashboard’s /dashboard/advanced page in the terminal. Preferences live in ~/.dotperson/preferences.json as a flat JSON object with dotted keys.

Examples:

personkit prefs set theme=dark
personkit prefs set corpus.sync_interval_secs=300
personkit prefs set daemon.synthesise.with_llm=true --sync

personkit verify surfaces

Per-surface presence + content check. Also runs a stdio MCP smoke handshake against dotperson-mcp (initialize → list tools → corpus_health).

Advanced (the original git-substrate surface)

These predate the memory layer and remain for working directly with .person files: