From the CLI¶
prodpeek drives a local or remote instance over /api/v1. Everything the
console does, except opening a drop link — which is a browser step on purpose.
Install¶
The CLI ships in the same image:
Or, from a checkout: uv run prodpeek.
Log in¶
Saved to ~/.config/prodpeek/cli.json, mode 0600. In CI, skip the file entirely:
The environment wins over the file, so a build agent never writes a key to disk.
The whole onboarding, without a browser¶
# 1. A project per customer
prodpeek project create "EJD"
# 2. Connect a service — deliberately WITHOUT a credential
prodpeek service add coolify/read-only https://coolify.ejd.dk/mcp \
--name ejd-coolify --project ejd
created service ejd-coolify (coolify/read-only)
It has no credential yet. Open this ONCE, in a browser, and paste it:
https://prodpeek.example.dk/drop/3MF5uUq0O_TQbSgXI-1f5VOIemeJEyaMYkoBu70eGHM
The link dies on use and expires at 2026-09-24T15:09:34+00:00.
Nothing you or an agent runs here ever sees the secret.
# 3. A human opens that link and pastes the token. Then:
prodpeek service test ejd-coolify
# 4. A key for a developer, with a short life
prodpeek token create anders --services ejd-coolify --ttl 8h
Day to day¶
prodpeek service list # what is connected, and what is missing a credential
prodpeek token list # who holds a key, and when it expires
prodpeek token revoke <id>
prodpeek profile list # every policy, with provenance and counts
prodpeek profile show coolify/read-only
prodpeek incidents # what went down, with its evidence timeline
prodpeek monitor add "EJD site" https://ejd.dk/health
The two that answer "is this thing honest"¶
0 of 47 denied tools reachable, credential scope confirmed read-only,
toolset matches verified digest, audit chain verifies
ok ejd-coolify 0/32 denied tools reachable, read_only
ok ejd-prom 0/6 denied tools reachable, not_introspectable
Exit code 0 when the wall held, 1 when it did not — so it works in CI.
Prints every host this configuration can reach, derived from the live config rather than from a paragraph somebody wrote once. See What leaves your network.
In CI¶
- name: Prodpeek still refuses what it should
env:
PRODPEEK_URL: ${{ secrets.PRODPEEK_URL }}
PRODPEEK_ADMIN_KEY: ${{ secrets.PRODPEEK_ADMIN_KEY }}
run: prodpeek prove
A failing prove means a denied tool became reachable, a credential gained write
access, or the audit chain broke. All three are worth a red build.