Keel

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.

Compare two hullsPricing

Try

Recent soundings

Public only

Plans

Public scan is free and stays free. Watch is for a hull you already launched — checked daily, plus Check now. Not a ping farm.

  1. Sounding

    $0

    Forever

    • Unlimited public one-off scans
    • GitHub Action launch gate
    • Compare two hulls
    • Launch badge
    • 0 watches
    Scan a repo
  2. 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
    Start Watch
  3. 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)
    Start Fleet

Card via Bachs. USD cards on recurring plans.

Six factors. One keel.

We do not read your prompts. We read public GitHub metadata and knock on the homepage.

  1. 0130 pts

    Live hull

    Is there a real site, not a GitHub README?

  2. 0220 pts

    Recent sea

    Has anyone pushed in the last few weeks?

  3. 0315 pts

    Depth

    Is the commit log more than a first draft?

  4. 0415 pts

    Rigging

    Is there a deploy manifest at the root?

  5. 0510 pts

    Crew

    Stars, forks, or more than one contributor.

  6. 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"