Launch gate
Know if the launch is still real.
Public scan is free. Paste a GitHub repo — score 0–100, fail on P0 blockers (dead hull, public secrets, fake demo). Watch is $9/mo if you already shipped.
Recent soundings
Public onlyPlans
Public scan is free and stays free. Watch is for a hull you already launched — checked daily, plus Check now. Not a ping farm.
Sounding
$0
Forever
- Unlimited public one-off scans
- GitHub Action launch gate
- Compare two hulls
- Launch badge
- 0 watches
Watch
$9
per month · 1 hull
- Daily launch gate + Check now
- Checkout canary
- GitHub public-secret check
- Webhook on NO-GO, score drop, or canary fail
- Public scan still free
Fleet
$30
per month · 5 hulls
- Five hulls, same daily checks as Watch
- Checkout canary + public-secret check
- Webhook per hull
- Checked daily, plus Check now
- Card via Bachs (USD)
Card via Bachs. USD cards on recurring plans.
Six factors. One keel.
0–100We do not read your prompts. We read public GitHub metadata and knock on the homepage.
- 0130 pts
Live hull
Is there a real site, not a GitHub README?
- 0220 pts
Recent sea
Has anyone pushed in the last few weeks?
- 0315 pts
Depth
Is the commit log more than a first draft?
- 0415 pts
Rigging
Is there a deploy manifest at the root?
- 0510 pts
Crew
Stars, forks, or more than one contributor.
- 0610 pts
Logbook
A release, changelog, or a real description.
Labels
- Docked — 80–100, looks launched
- Underway — 50–79, moving
- Drifting — 25–49, thin
- Vapor — 0–24, a ghost
P0 blockers
Fail the launch.
Dead hull, public secrets, or a fake demo. Score can look fine. Gate still says no-go.
GitHub Action
Optional. Drop this in .github/workflows/keel-gate.yml. It curls the gate and fails the job if launch is no-go. No checkout.
keel-gate.yml
name: Keel gate
on: [push, pull_request]
jobs:
keel:
name: Launch gate
runs-on: ubuntu-latest
steps:
- name: Fail on P0 blockers
env:
KEEL_ORIGIN: https://getkeel.vercel.app
run: |
set -euo pipefail
OWNER="${GITHUB_REPOSITORY%%/*}"
REPO="${GITHUB_REPOSITORY#*/}"
RESP="$(curl -sS "${KEEL_ORIGIN}/api/gate?owner=${OWNER}&repo=${REPO}")"
echo "$RESP"
LAUNCH="$(printf '%s' "$RESP" | python3 -c "import json,sys; print(json.load(sys.stdin).get('launch') or '')")"
if [ "$LAUNCH" != "go" ]; then
echo "Keel launch gate: NO-GO"
printf '%s' "$RESP" | python3 -c "import json,sys
d=json.load(sys.stdin)
for b in d.get('blockers') or []:
print('-', b.get('title') or b.get('id') or 'blocker')
"
exit 1
fi
echo "Keel launch gate: GO"