notnessie

Configuration

NotNessie is configured through a small set of files (written by notnessie init) and a handful of environment variables. This page is the reference for all of them.

Environment variables

These are read from a .env file in the repository (Node 20+ loads it automatically) or from your shell. The NOTNESSIE_DB_* variables are consumed by docker-compose.yml; the rest are read by the CLI, MCP server, and dashboard.

Variable Purpose Default
DATABASE_URL Postgres connection used by every package. postgres://notnessie:notnessie@localhost:5432/notnessie
NOTNESSIE_EMBEDDINGS Set to 0 to disable local embeddings and fall back to keyword-only search. 1 (enabled)
NOTNESSIE_EMBEDDING_MODEL The Transformers.js model used for embeddings. Xenova/all-MiniLM-L6-v2
NOTNESSIE_DASHBOARD_PORT Port for the notnessie dev dashboard. 4319
NOTNESSIE_DB_USER Postgres user (Docker Compose). notnessie
NOTNESSIE_DB_PASSWORD Postgres password (Docker Compose). notnessie
NOTNESSIE_DB_NAME Postgres database name (Docker Compose). notnessie
NOTNESSIE_DB_PORT Host port mapped to Postgres (Docker Compose). 5432

!!! warning “Never commit real secrets” Copy .env.example to .env and adjust. .env should stay out of version control. NotNessie also refuses to store secrets it sees in memory — see Privacy.

A common non-default setup is to point at an existing pgvector Postgres:

DATABASE_URL=postgres://user:password@db.internal:5432/notnessie

.notnessie/config.json

Per-project memory settings, created by init and validated on every read. The defaults are deliberately conservative.

{
  "projectName": "my-project",
  "projectId": "proj_…",
  "memoryMode": "conservative",
  "autoSaveTaskSummaries": true,
  "autoSaveCommands": true,
  "autoSaveFileChanges": false,
  "redactSecrets": true
}
Field Type Default Meaning
projectName string the directory name Human-friendly project name.
projectId string derived Stable id for this repo (a hash of the repository root path).
memoryMode conservative | balanced | aggressive conservative How eagerly hooks capture memory automatically.
autoSaveTaskSummaries boolean true Let Stop/PreCompact save task summaries.
autoSaveCommands boolean true Let PostToolUse capture verified commands.
autoSaveFileChanges boolean false Capture file-change context automatically.
redactSecrets boolean true Redact/refuse secrets before storage.

The lifecycle hooks read these flags and honor them — turning a flag off stops the matching automatic capture.

.mcp.json

Registers the NotNessie MCP server so Claude Code launches it. init writes a version that uses the globally installed notnessie binary:

{
  "mcpServers": {
    "notnessie": {
      "type": "stdio",
      "command": "notnessie",
      "args": ["mcp"],
      "env": { "NOTNESSIE_PROJECT_ID": "current" }
    }
  }
}

The server runs over stdio — the transport Claude Code uses. (You can also run it over Streamable HTTP for other clients with notnessie mcp --http; see the CLI reference.)

.claude/settings.json and the skill

init also writes the hook wiring to .claude/settings.json and a skill to .claude/skills/notnessie/SKILL.md:

Finally, init merges a NotNessie instruction block into CLAUDE.md (between <!-- notnessie:begin --> and <!-- notnessie:end --> markers), so re-running init updates the block in place without disturbing the rest of your CLAUDE.md.

Privacy and redaction

When redactSecrets is on (the default), every write is filtered before storage:

Hooks additionally never store full transcripts or raw terminal output. See Concepts → Privacy and Architecture for how this is implemented.