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.
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.jsonPer-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.jsonRegisters 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 skillinit also writes the hook wiring to .claude/settings.json and a skill
to .claude/skills/notnessie/SKILL.md:
.claude/settings.json registers the five lifecycle hooks.SKILL.md tells Claude when to retrieve context and when to save each kind
of memory.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.
When redactSecrets is on (the default), every write is filtered before storage:
.env dumps — the entire save is rejected.Hooks additionally never store full transcripts or raw terminal output. See Concepts → Privacy and Architecture for how this is implemented.