Configuration file
personal-memory is a meta orchestrator (see architecture.md on the site; memory-providers.md in the repo for contributors). Its declarative config is intentionally similar to mise:
| mise | personal-memory |
|---|---|
~/.config/mise/config.toml + .mise.toml |
~/.config/personal-memory/config.toml + personal-memory.toml |
[tools] plugins |
[memory] provider = "…" + providers/*/manifest.json |
[env] |
Host ports / compose project under [stack] |
[tasks] |
npx personal-memory up / down / doctor / install-mcp / switch |
mise install applies config |
npx personal-memory configure --yes applies config |
We do not replace mise (or mem0/Hindsight native config). You can use both: mise installs Node/Docker; this file describes how agent memory runs on this machine.
| Path | Purpose |
|---|---|
config/personal-memory.toml.example |
Shipped template; copy to your user config |
~/.config/personal-memory/config.toml |
Primary user config (gitignored on your machine) |
./personal-memory.toml |
Optional per-checkout overrides (e.g. different ports in a worktree) |
~/.config/hindsight/wizard.conf |
Last configure run (MEMORY_PROVIDER, ports, …); updated when setup applies |
Precedence
Section titled “Precedence”- CLI flags (
npx personal-memory setup --up,--down, …) - Environment (
MEMORY_PROVIDER,PM_BACKEND,HINDSIGHT_PORT, …) ~/.config/personal-memory/config.tomlpersonal-memory.toml/config/personal-memory.tomlin the checkout stack root- Existing
wizard.conf(provider, ports, model backend from the last wizard run)
Interactive ./setup uses this file for defaults (Clack pre-selects); your answers still win.
Sections
Section titled “Sections”-
[memory]—providerid (hindsight, futuremem0, …). -
[stack]— compose project name and host ports. -
[wizard]— default action (configure,up,down). -
[model]— meta LLM routing for the Hindsight stack only; other providers add[memory.<id>]tables (see[memory.mem0]below). -
[memory.mem0]— the mem0 provider (URL-only: you run a mem0 REST server, this stack points the indexer at it). Never holds a key.[memory]provider = "mem0"[memory.mem0]api_url = "http://127.0.0.1:18888" # the server as this host sees it# env_file = "~/.config/personal-memory/mem0.env" # optional; where MEM0_API_KEY livesapi_urlis resolved as:MEM0_API_URL, thenPM_MEM0_API_URL, then this table, then the stack.env, thenwizard.conf, then the defaulthttp://127.0.0.1:18888. The indexer container gets the same URL with127.0.0.1/localhostrewritten tohost.docker.internal(MEM0_INDEXER_URLin the stack.env). The API key is written by./setup(fromMEM0_API_KEYunder--yes, or a prompt) as the single lineMEM0_API_KEY=your-key-herein the env file (MEM0_ENV_FILE, thenenv_file, then~/.config/personal-memory/mem0.env; mode 600 in a mode 700 directory). You can also create that file by hand; a server run withAUTH_DISABLEDneeds none. The key never goes into the stack.env,wizard.conforconfig.toml. A non-defaultenv_fileis exported to compose asMEM0_ENV_FILEfor the run; export it yourself when you rundocker composeby hand. -
[memory.cognee]— the Cognee provider (a pinnedcognee/cogneecontainer on a loopback port, single-user mode, no authentication). Never holds a key.[memory]provider = "cognee"[memory.cognee]port = 8766 # host port; the container listens on 8000env_file = "~/.config/personal-memory/cognee.env" # where LLM_API_KEY livesportis resolved as:COGNEE_PORT, then this table, then the stack.env, then the port saved inwizard.conf, then the default8766. Both env file locations follow the same order: the variable (COGNEE_ENV_FILE,COGNEE_INDEXER_ENV_FILE), thenenv_file/indexer_env_filein this table, then the stack.env, then the defaults~/.config/personal-memory/cognee.envand~/.config/personal-memory/cognee-indexer.env. The second file is optional and is the one the indexer container reads; it holds onlyCOGNEE_API_KEY. A non-default location (~is expanded, a relative path is taken relative to the stack root) is written to the stack.envas a path, so a plaindocker composefinds the same files; the file contents never go there. Keep custom files inside~/.config/personal-memory: that is the directory hidden from the indexer’s read-only$HOMEmount, and setup warns about a file elsewhere under$HOME.Cognee builds its graph with an LLM, so documents are stored but not searchable until cognify can run.
./setupwrites settings into the env file (mode 600 in a mode 700 directory), merging into any existing file and replacing only the keys it was given; it prints the path and the key names, never a value. Where the answers come from:Variable (environment) Written to the env file as PM_COGNEE_LLM_API_KEY; under--yesor--dry-runalso plainLLM_API_KEYLLM_API_KEYPM_COGNEE_LLM_PROVIDER,PM_COGNEE_LLM_MODEL,PM_COGNEE_LLM_ENDPOINTLLM_PROVIDER,LLM_MODEL,LLM_ENDPOINTPM_COGNEE_EMBEDDING_PROVIDER,_MODEL,_ENDPOINT,_DIMENSIONSthe same names without PM_COGNEE_PM_COGNEE_EMBEDDING_API_KEY; under--yesor--dry-runalso plainEMBEDDING_API_KEYEMBEDDING_API_KEYPM_COGNEE_HUGGINGFACE_TOKENIZERHUGGINGFACE_TOKENIZERLocal Ollama (no cloud key): set
PM_COGNEE_LLM_PROVIDER=ollama(and optionallyPM_COGNEE_LLM_MODEL=...). The wizard fills in a complete local block when fields are missing:Terminal window PM_COGNEE_LLM_PROVIDER=ollama PM_COGNEE_LLM_MODEL=llama3.2 ./setup --yesThat writes (defaults only where unset):
LLM_PROVIDER=ollamaLLM_API_KEY=replace-meLLM_ENDPOINT=http://host.docker.internal:11434EMBEDDING_PROVIDER=ollamaEMBEDDING_MODEL=nomic-embed-text:latestEMBEDDING_ENDPOINT=http://host.docker.internal:11434/api/embedEMBEDDING_DIMENSIONS=768Use the bare Ollama host (
…:11434), not…:11434/v1— Cognee’s Ollama path appends/api/generateitself. Host Ollama (listening on the Docker bridge or all interfaces):host.docker.internalis correct. Compose Ollama published as127.0.0.1:11434only (this repo’s default): that address is unreachable viahost.docker.internal— setPM_COGNEE_OLLAMA_COMPOSE=1(or reuseMEMORY_OLLAMA_IN_COMPOSE=1from a Hindsight Ollama setup) so the wizard writeshttp://ollama:11434, and attach the Cognee container to the same Docker network as theollamaservice. Slow local models may needCOGNEE_SKIP_CONNECTION_TEST=trueincognee.env. The interactive setup offers OpenAI key vs Ollama; the OpenAI path uses a hidden prompt. Do not type the key into a non-Clack./setupprompt — putLLM_API_KEYincognee.env(mode 600) by hand (Ollama accepts any non-empty value), or use the UI /--yeswithPM_COGNEE_LLM_API_KEY. Secret variables (including plainLLM_API_KEY/EMBEDDING_API_KEY/COGNEE_API_KEY) are removed from the wizard’s environment before it starts docker. With no cognify-ready config under--yesthe wizard warns and carries on. Secrets never go into the stack.env,wizard.conf,config.tomlor the summary. Authentication is off:ENABLE_BACKEND_ACCESS_CONTROLis pinned false in compose and overrides the env file (seeproviders/cognee/compose.yaml). -
[tasks.*]— descriptions fornpx personal-memory/./pm(seewizard/bin/pm.mjsandcli/personal-memory.mjs). Built-in tasks:configure/up/down/doctor— map to the setup wizard with the matching flagsinstall-mcp— runscli/install-memory-mcp.mjs(NotebookLM MCP on Hindsight; mem0/Cognee with--provider-only; merges into~/.cursor/mcp.json)switch <provider>— runscli/switch-memory-provider.mjs: setsMEMORY_PROVIDERinwizard.conf, updates[memory].providerinconfig.tomlwhen present (updatePmConfigProvider), optionally restarts the stack and re-points provider MCP. Flags:--yes,--dry-run,--no-stack,--no-mcp. Does not migrate data between backends. See README — Switch memory provider.feed-sync— runscli/feed-sync.mjs(RSS + OpenAlex →feeds.out_dirinindex.yml).install-coding-agent— unified MCP + session hooks (all providers); optional--hindsight-plugin; see coding-agent hooks.
cp config/personal-memory.toml.example ~/.config/personal-memory/config.toml# edit provider, ports, model backendnpx personal-memory configure --yes# checkout before publish: npx . configure --yesAfter a successful configure, the wizard writes back ~/.config/personal-memory/config.toml so
the file matches what is running (mise-style source of truth).
Doctor
Section titled “Doctor”npx personal-memory doctorRuns the same checks as setup step “Validate memory setup” without mutating the stack.
This page is generated from docs/personal-memory-config.md in the repository.