Read this before investigating how the notes server works. It saves rediscovering things that cost time in prior sessions.
The notes database lives on gravlax (AWS eu-north-1 / Stockholm). All access from pomelo goes through stunnel. There is no locally running notes server — the 127.0.0.1 ports are stunnel endpoints.• 127.0.0.1:8021 → stunnel → gravlax:18021 → gdata REST API• 127.0.0.1:8023 → stunnel → gravlax:18023 → gdata MCP server (SSE + Streamable HTTP)The GDBM file is on gravlax. Any .gdbm file you find locally on pomelo is a separate, smaller test dataset — not the live notes.
Private store (db.com / sensitive work) is a SECOND gdata instance, also reached via stunnel:• 127.0.0.1:8121 → stunnel → gravlax private gdata REST (rest-port 8120, db .agent_notes_private.gdbm)• 127.0.0.1:8123 → stunnel → gravlax private gdata MCP (mcp-port 8123) — the mcp__claude_ai_Private_Notes_MCP__* toolsOn gravlax the two instances run as separate systemd units — gdata-mcp-server.service (public) and gdata-mcp-server-private.service (private) — but both execute the SAME /home/john/py/gdata-server/gdata_mcp_server.py. Consequence: after deploying a new gdata_mcp_server.py, restart BOTH services. The auto_reload middleware calls os.execv on file-mtime change; if only one service is restarted, the other trips its own reload and (in versions before the 2026-07-21 fix) re-execs without closing the GDBM handle, inheriting its own write lock and then returning 500 with [Errno 11] Resource temporarily unavailable on every request. Recovery: systemctl restart the stuck service. Applies to kelp as well as pomelo — both reach gravlax the same way.
notes list # connection refused = stunnel down
curl -s http://127.0.0.1:8021/README | head -c 80
A note's key is not a path off the site root. The public web viewer serves notes at https://www.critchley.biz/notes/<key> (e.g. https://www.critchley.biz/notes/TFG/exercise-demo-protocol). Don't confuse this with https://www.critchley.biz/TFG/-style paths, which are separate WebDAV-served static files (e.g. the transcribed programme-card .docx), not notes-store content.
If refused: stunnel on pomelo is down. The gdata server process on gravlax is usually running independently.
mcp__claude_ai_notes__ and mcp__gdata__ both reach port 8023 — they are two registered names for the same backend.
gravlax starts and stops on demand. Its public IP changes each time. DNS (gravlax.critchley.biz, cv.critchley.biz) and the local /etc/hosts are auto-updated on each start/stop. stunnel resolves per-connection so hostname references are always correct. Never store or use a bare IP for gravlax.
# Read
curl -s http://127.0.0.1:8021/KEY
# Replace whole document
curl -s -X PUT http://127.0.0.1:8021/KEY \
-H 'Content-Type: application/json' -d @file.json
# List keys
notes list
gdata-server/troubleshooting — double-encoding bug, patch failuresmemory/envoy/infrastructure — gravlax services overview