GData Server — Infrastructure & Runtime

Read this before investigating how the notes server works. It saves rediscovering things that cost time in prior sessions.

Where the server actually runs

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.

Checking if the tunnel is up

notes list          # connection refused = stunnel down
curl -s http://127.0.0.1:8021/README | head -c 80

Human-readable web viewer URL

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 tool names

mcp__claude_ai_notes__ and mcp__gdata__ both reach port 8023 — they are two registered names for the same backend.

gravlax IP is dynamic — never hardcode it

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.

REST API quick reference

# 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

See also

gdata-server/troubleshooting — double-encoding bug, patch failuresmemory/envoy/infrastructure — gravlax services overview

version 1  ·  created 2026-06-25  ·  updated 2026-06-25