Developer Productivity

Caveman

Julius BrusseeApache-2.0Skill language: English
License verifiedNo scripts
DemoReal run · claude-opus-5-5 · October 2026
Talk like caveman from now on. My Node.js API returns `Error: connect ECONNREFUSED 127.0.0.1:5432` on startup inside Docker Compose, but Postgres runs fine and I can connect to it from my laptop with psql. What is wrong and how do I fix it?
Skill: caveman

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:5432 is correct there. Make sure ports: ["5432:5432"] is set on db.
  • 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 need listen_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

  1. 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".
  2. 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.
  3. 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.

Notes & risks

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.

SKILL.md original4 files in this package