Home
read-only · nothing about your clusters leaves this machineEvery finding, with the object it rests on.
Reliability, security, cost and topology from get and list. Nothing is installed in the cluster and no object is written.
Find what stops it before you start it.
Which node cannot be drained, what has nowhere to go if a zone fails, what blocks the next upgrade. Free on every plan.
A full reading of a sample cluster.
A fictional cluster run through the real engine: 141 findings, every panel unlocked, labelled as a sample on every screen.
Recent readings
Your plan
Clusters
—
starting…- 1reading the cluster
- 2pricing what it read
- 3judging what it read
- 4signing the reading
no finding priced so far · list price
What it read
What it found
What it cost to ask
counted, not promisedRead-only by construction — the audit path issues only get and list. Per-request measurement is not yet recorded for this run, which is not a zero.
Structure
Readings
Two readings
Reading
The queue
Ask before you change
read-only · free on every planHand the readings to an agent
a corpus, not a keyholeEvery reading this machine has kept can be served over the Model Context Protocol, so an agent works from findings that have already been validated instead of re-deriving them through a cluster connection. The server holds no kubeconfig — there is no client-go in that binary and a test walks its imports to keep it that way — so an agent holding it can read the corpus and cannot touch anything.
Needs a Team licence, and shoalcheck-mcp from the command-line download — the macOS app does not carry it.
claude mcp add shoalcheck -- shoalcheck-mcp shoalcheck-mcp --cluster prod # serve one cluster's newest reading shoalcheck-mcp --print-identity # say which reading it would serve, then exit
request_reading
hands back the command for you to run instead.File it in your tracker
text, never a pushNeeds a Team licence. It works in this window, from any kept reading.
A finding becomes a ticket from the Queue tab of any reading: title, body, a dedup key, the labels, the engine's own safety verdict, and any compliance term the finding's own text cites — named out loud, because it travels verbatim while the report's control mapping does not.
Nothing is filed. Creating an issue in your workspace needs a credential this window does not hold, and an object in somebody else's tracker is not a read-only tool's to make. You get the text a push would have sent — read it, then paste it.
assay:v1:<cluster>:<finding id>, so
filing the same finding twice is something your tracker can refuse rather than something you
have to remember. assay is the name this program had when the key was chosen; it stays, so a
ticket filed before the name changed is still recognised.Put it on a pull request
SARIF 2.1.0GitHub and GitLab code scanning both read SARIF, so a reading can annotate a diff without anything of ours running in your pipeline. The findings arrive as results with their rule, severity and evidence; a cost finding travels without its monthly figure, because SARIF has no field for one.
Needs the command-line download in your pipeline — the macOS app does not carry it — with a Pro licence for the SARIF file and a Team licence for the gate.
shoalcheck audit --context prod --export-sarif shoalcheck.sarif --no-tui # read, then write the log
# then, in your workflow:
# uses: github/codeql-action/upload-sarif@v3
# with: { sarif_file: shoalcheck.sarif }
shoalcheck gate --context prod --baseline baseline.json # fail the job when something new and high appears
Or write the same file from any kept reading under Handoff in that reading's workspace, here in the window.
Take it out as a file
one-way, offlineNeeds a Pro licence. It works in this window.
Written beside the reading, on this machine. Choose a reading under Readings and open Handoff to write one.
Readings on a schedule
Needs a Team licence, and the command-line download on this machine: a schedule runs the shoalcheck command, found beside the app or on your PATH, and the macOS app does not carry it.
Updates
What this program may do
Diagnostics
a file about this install, not your clusterThere is no telemetry and no crash report: nothing about a run leaves this machine. When a figure looks wrong, this file holds what is needed to reproduce it — and nothing about the cluster it read.
If this window will not start, the command line writes the same file: shoalcheck support, with --input reading.json to describe a reading.
This copy
Licence keys are not on sale yet. Every plan reads the same clusters the same way; plans differ in what a reading is kept as and how many clusters one licence covers.
Getting started
- Pick a cluster. Every context in your kubeconfig is listed under Clusters. A production context is read the same way as any other: get and list, nothing written.
- Ask before a change. Preflight answers one question — drain, zone, upgrade — in seconds, from the kinds that question needs.
- Read the whole cluster. A reading names every finding with the object it rests on, what it would cost, and what it could not establish.
Keyboard
When something does not work
the cause, and what fixes it- A cluster is missing from Clusters
- The list is every context in your kubeconfig. A context added while the window is open appears the next time it is opened.
- It cannot sign in to a cluster
- Settings → What this program may do lists the sign-in plugins your kubeconfig names (kubelogin, aws, gcloud…) and whether each was found. Install the missing one where your shell finds it and open the window again: it reads the PATH of your login shell.
- A kind reads “refused”
- The cluster said no to get or list on that kind for your identity. The reading says so where it matters and the rules that need the kind do not run. A role granting get and list on it is the fix — deploy/rbac.yaml in the command-line download is the role this program needs, and shoalcheck audit --show-permissions lists what an identity can read.
- The licence key is rejected
- The line under the key says why: not the whole key (paste it again exactly as it arrived), not signed by Shoalcheck, or ended — with its date. shoalcheck licence show says the same from a terminal.
- A reading shows only its size, with a key installed
- The key is bound to other clusters, or this machine has read as many clusters in 30 days as the plan covers; the result says which. Plan & licence → This copy reads a cluster's fingerprint and says whether the key covers it.
- An update does not install
- Settings → Updates says why. A folder you cannot write names the download; a copy Homebrew or krew installed updates with their own command.
- You need the command line
- The macOS app does not carry it. Download shoalcheck_<version>_<os>_<arch> from https://github.com/Shoalcheck/shoalcheck/releases — the same engine. The same page has shoalcheck-mcp and the kubectl plugin.
- Where your files are
- Readings, history, the licence and these settings: your home folder's .shoalcheck. While the window is open it also serves a copy of each reading from a temporary folder. Nothing about a cluster leaves this machine.
Ask it from the terminal
the same engine, scopedA question about one change does not need a whole audit. These read only the kinds the question needs and answer with an exit code a script can act on.