127.0.0.1 inside API container means the API container itself, not Postgres. Postgres runs in its own container. From inside Docker Compose, reach it by its service name. Your laptop works because the port is published to the host's localhost.
Fix: point the host at the Compose service name.
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 2s
retries: 15
api:
build: .
environment:
DATABASE_URL: postgres://postgres:secret@db:5432/postgres
depends_on:
db:
condition: service_healthy
Use db (your service name) as the host, in DATABASE_URL or PGHOST. Don't hardcode localhost in code.
The healthcheck plus condition: service_healthy is a second fix. Plain depends_on only waits for the container to start, not for Postgres to accept connections. Without the healthcheck you can still get ECONNREFUSED on cold start, even with the right host.
Other causes to check:
- API runs on the host, not in Compose:
localhost:5432is correct there. Make sureports: ["5432:5432"]is set ondb. - API in a different Compose project or network: put both on a shared network, or use
host.docker.internal:5432. - Postgres listening only on a unix socket: the official image already listens on
*. Only custom configs needlisten_addresses = '*'.
Check the connection from inside the API container: docker compose exec api sh -c 'nc -zv db 5432'.
Real run recorded with claude-code / claude-opus-5-5. Output is shown verbatim, unmodified.
What it does
Sets a terse reply style for coding agents. The answer comes first; greetings, hedging, recaps and closing offers are dropped. Code, commands, file paths, numbers and error strings stay verbatim.
How it works
- Turns on with /caveman or phrases such as "talk like caveman", "be brief" or "less tokens", and stays on until you say "stop caveman" or "normal mode".
- Follows nine rules: answer first, no ceremony, short words, articles optional but negations never dropped, one idea per sentence, technical payload verbatim, minimal status text during tool runs, reply in the user's language, and no caveman role-play.
- Switches back to plain prose for security warnings, irreversible actions, step-by-step instructions, a confused user, and anything written outside the chat (code, commits, docs).
Good for
Everyday coding sessions in a terminal where you want shorter, more direct answers.
Worth knowing
The author's own measurement (one run, ten prompts) found replies only about 3% shorter at the median than simply telling the model to "answer concisely". Treat it as a style for directness rather than a big token saver. The /ultracave and /megacave modes and the status badge belong to the full Caveman plugin and are not in this package.
Pure instruction file: no scripts, no network access and no file writes. The package also contains the README, LICENSE and NOTICE from the original repository. Some commands named in the instructions (/caveman ultra, /caveman wenyan, /caveman status) depend on other Caveman skills or hooks that this package does not include.