Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
f96fd04
ops(autopilot): bootstrap hourly revenue loop — state file, adversari…
claude Jul 22, 2026
5866204
feat(site): teams.html + partners.html — fix live 404s behind the 0.4…
claude Jul 22, 2026
b3f5986
ops(autopilot): T3 done (Julian clarification draft); document Gmail …
claude Jul 22, 2026
f864a88
ops(autopilot): record send-channel status — session cannot send; opt…
claude Jul 22, 2026
92f3d3f
ops(autopilot): rule 9 — public repo, no third-party addresses or cor…
claude Jul 22, 2026
278a6bd
ops(launch): fact-checked Show HN + lobste.rs packs (T4)
claude Jul 22, 2026
428b7fb
ops(autopilot): Julian reply sent manually by owner; Resend channel s…
claude Jul 22, 2026
ec7a31d
feat(listing): PyPI page as landing — real Homepage, pricing block un…
claude Jul 22, 2026
38f2012
feat(nudge): once-a-day Solo hint on status/stats + report footer + k…
claude Jul 22, 2026
f3a1488
sync(site): adopt production teams.html + partners.html deployed out-…
claude Jul 22, 2026
cc58444
feat(pack-hint): one-time stack-aware EUR 29 pack hint + cut 0.4.18 r…
claude Jul 22, 2026
4f75f47
fix(llms): bump llms.txt package version to 0.4.18 — restores marketi…
claude Jul 22, 2026
e6bbb56
ops(autopilot): log llms.txt hotfix
claude Jul 22, 2026
d533854
ops(launch): full distribution kit — 3x Reddit + X thread + awesome-l…
claude Jul 22, 2026
6bad8ae
feat(nudge): point the CLI hint at the free local report (closes T8 a…
claude Jul 22, 2026
dd517b1
ops(autopilot): T14 — influencer affiliate outreach pack researched a…
claude Jul 22, 2026
8299372
ops(autopilot): rule 2 amended to owner-ordered campaign mode
claude Jul 22, 2026
15d013a
feat(fulfill): 'Complete your coverage' cross-sell on the pack thank-…
claude Jul 22, 2026
346d952
fix(truth): stripe as default channel, LS-pending line removed, promi…
claude Jul 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,31 @@
All notable changes to `gate.cat` will be documented in this file.


## [0.4.18] -- the listing sells, the CLI hints honestly (2026-07-22)

### Added
- Once-a-DAY Solo hint on `gate.cat status`/`stats` (`gatecat/_nudge.py:
maybe_nudge_cli`): fires only when interventions > 0 and no
`GATECAT_CLOUD_API_KEY`, stderr-only, silenced by `GATECAT_NO_NUDGE`/
`GATECAT_QUIET`. A process-wide guard guarantees at most ONE hint of any
kind per run.
- One-time-per-machine policy-pack hint (`gatecat/_pack_hint.py`): if a stack
CLI is on PATH (`stripe` -> Fintech; `vercel`/`netlify`/`fly`/`heroku`/
`railway`/`render`/`supabase` -> PaaS), prints the matching EUR 29 pack with
its PRICING.md scope. Same opt-outs, same shared no-stacking guard
(`~/.gatecat/.pack_nudged`).
- `gate.cat report` footer links the off-machine variant of the same report
(ASCII-safe; the paste-safety test stays green). `gate.cat cloud` without a
key now says where a key comes from.

### Changed
- PyPI listing acts as a landing page: `[project.urls]` Homepage now points at
https://gate.cat (plus a Pricing link), and the README carries a free-forever
/pricing block right under the install section.
- README proxy section: stale "21 deny policies" corrected to the measured 71
default policy walls (FACTS.md F10). No policy, recall, or bypass changes.


## [0.4.17] -- one-time post-veto Team hint (2026-07-16)

### Added
Expand Down
4 changes: 2 additions & 2 deletions PRICING.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ Full boundary, both directions: [docs/THREAT_MODEL.md](docs/THREAT_MODEL.md).
| Local CLI dashboard + local reports | ✅ | ✅ | ✅ | ✅ | ✅ |
| **Off-machine veto history** (the copy the agent has no credentials for) + email alerts | — | ✅ | ✅ | ✅ | ✅ |
| Monthly report from the off-machine log | — | ✅ yours | ✅ fleet-wide | ✅ signed, + control mapping | ✅ custom scope |
| Shared signed policy file for a fleet (pull-only, local review) | — | — | ✅ *(ships this month)* | ✅ | ✅ |
| Shared signed policy file for a fleet (pull-only, local review) | — | — | ✅ *(rolling out)* | ✅ | ✅ |
| Evidence log self-hosted in **your** infra | — | — | — | ✅ | ✅ |
| Support | community | email | priority | dedicated | dedicated + custom policies |
| Price | €0 forever | €19/mo | €149/mo flat | €399/mo | custom |
| | | [**Start Solo →**](https://buy.stripe.com/7sY6oAaRD5qU79m2Vo67S09) | [**Start Team →**](https://buy.stripe.com/9B66oA5xj2eIaly2Vo67S0a) | [**Start Business →**](https://buy.stripe.com/7sYdR2e3PcTm2T6cvY67S0b) | [email us](mailto:bogumil@bgml.ai?subject=gate.cat%20white-glove) |

Stripe checkout is live while Lemon Squeezy account review is pending. Billing
Stripe checkout is live and is the payment channel. Billing
includes automatic tax handling, cancellation at any time and a
**30-day full refund, no questions asked.**

Expand Down
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ pip install "gate-cat[all]" # everything
```
> Quote the extras (`"gate-cat[openai]"`) — zsh treats bare `[...]` as a glob.

**Free forever** — the full local gate, nothing rate-limited. The paid layer is
optional and off by default: **Cloud Solo €19/mo · Team €149/mo flat (up to 10
machines) · Business €399/mo · one-time €29 policy packs** — details and honest
boundaries in [PRICING.md](PRICING.md). Blocking never depends on payment.

## The hook — the strongest mode

Enforcement in the harness, **outside the model's control flow**: the tool call
Expand Down Expand Up @@ -414,7 +419,7 @@ Validated with 100-question benchmark across 5 domains: **0.892 mean quality rat
Ollama, NIM, OpenRouter, vLLM and LM Studio all speak the OpenAI API, so **one
proxy in front of them protects them all** — your agent changes one `base_url`,
writes no code. When the model asks to run a tool, the proxy checks the proposed
call against the 21 deny policies and **blocks the dangerous ones before the
call against the 71 default policy walls (plus any policy packs you load) and **blocks the dangerous ones before the
agent executes them** (`rm -rf`, `terraform destroy`, `DROP TABLE`, disk wipes,
repo deletion, ...).

Expand Down
217 changes: 217 additions & 0 deletions docs/AUTOPILOT-LOOP.md

Large diffs are not rendered by default.

169 changes: 169 additions & 0 deletions docs/answers/ai-agent-almost-ran-rm-rf.html

Large diffs are not rendered by default.

163 changes: 163 additions & 0 deletions docs/answers/audit-evidence-for-ai-agent-actions.html

Large diffs are not rendered by default.

161 changes: 161 additions & 0 deletions docs/answers/claude-code-deleted-my-file.html

Large diffs are not rendered by default.

125 changes: 125 additions & 0 deletions docs/answers/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>gate.cat answers — stopping AI agents before they run irreversible commands</title>
<meta name="description" content="Plain answers to what people ask after an AI agent does something it can't take back: how to stop rm -rf, secure an MCP server, recover files Claude Code deleted, and get an audit trail of agent actions. gate.cat is a free, fail-closed veto." />
<link rel="canonical" href="https://gate.cat/answers/" />
<meta property="og:title" content="gate.cat answers — AI agent safety, in plain terms" />
<meta property="og:description" content="How to stop an AI agent before it runs the command you can't take back." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://gate.cat/answers/" />
<meta property="og:image" content="https://gate.cat/img/mark-256.png" />
<meta name="twitter:card" content="summary" />
<link rel="icon" href="../img/favicon.ico" sizes="any" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Archivo+Black&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="answers.css" />
<script>(function(){try{var t=localStorage.getItem("gatecat-theme")||(matchMedia("(prefers-color-scheme:dark)").matches?"dark":"light");document.documentElement.setAttribute("data-theme",t);}catch(e){document.documentElement.setAttribute("data-theme","light");}})();</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"CollectionPage","name":"gate.cat answers","url":"https://gate.cat/answers/","about":"AI agent safety, fail-closed action veto, preventing irreversible commands","isPartOf":{"@type":"WebSite","name":"gate.cat","url":"https://gate.cat/"}}</script>
</head>
<body>
<header class="nav"><div class="nav-in">
<a class="brand" href="https://gate.cat/"><span class="mk"></span>gate.cat</a>
<span class="nav-sp"></span>
<a class="nl" href="./">Answers</a>
<a class="nl" href="https://gate.cat/#how">How&nbsp;it&nbsp;works</a>
<a class="nav-cta" href="https://gate.cat/#install">pip install gate-cat</a>
<button class="tog" id="tog" aria-label="Toggle theme">◐</button>
</div></header>
<main class="wrap">
<nav class="crumb"><a href="https://gate.cat/">gate.cat</a> / answers</nav>
<p class="kick">answers · agent safety</p>
<h1>answers</h1>
<p class="lede">Plain answers to what people ask right after an AI agent does something it can't take back. Every answer ends the same way: a deterministic, fail-closed veto that stops the irreversible command <em>before</em> it runs — free, Apache&nbsp;2.0, one line to install.</p>

<div class="related" style="margin-top:40px">
<a class="rcard" href="ai-agent-almost-ran-rm-rf.html"><div class="q">My AI agent almost ran rm -rf — how do I stop it?</div><div class="a">Why prompts don't enforce, and what a fail-closed veto does instead.</div></a>
<a class="rcard" href="secure-mcp-server.html"><div class="q">How do I secure an MCP server against destructive tool calls?</div><div class="a">Put the veto in front of the tools, not inside the model.</div></a>
<a class="rcard" href="claude-code-deleted-my-file.html"><div class="q">Claude Code deleted my files — recovery &amp; prevention</div><div class="a">What to try first for recovery, then how to stop the next one.</div></a>
<a class="rcard" href="audit-evidence-for-ai-agent-actions.html"><div class="q">How do I get an audit trail of what my AI agent did?</div><div class="a">A free local log of every irreversible action, and what it is (and isn't).</div></a>
<a class="rcard" href="ai-agent-guardrails-across-a-team.html"><div class="q">How do I enforce guardrails on AI agents across my team?</div><div class="a">Free per machine; a fleet record, alerts and one policy set for the team.</div></a>
</div>

<section class="cta">
<h2>the one-line version</h2>
<p class="lede">gate.cat inspects every command an AI agent tries and blocks the irreversible ones — recursive delete, database drop, cloud teardown — before they execute. 38 default policies, fail-closed, zero telemetry.</p>
<div class="install"><span class="p">$</span>&nbsp;pip install gate-cat</div>
<div class="cap" id="cap-answers-hub">
<form class="cap-form" id="cf-hub">
<input id="ce-hub" type="email" placeholder="you@company.com" required autocomplete="email" aria-label="Your email" />
<button type="submit">Get &ldquo;Veto Catches&rdquo;</button>
</form>
<p class="cap-note">One email when there's a catch worth showing: a real irreversible command an agent tried, and how the wall stopped it. Opt-in, no spam, no telemetry.</p>
<p class="cap-done">&#10003; you're on the list — first catch lands soon.</p>
</div>
</section>
</main>
<footer><div class="foot-in">
<span>gate.cat — fail-closed action-veto for AI agents · Apache 2.0</span>
<span><a href="https://gate.cat/">Home</a> · <a href="https://pypi.org/project/gate.cat/">PyPI</a> · <a href="https://github.com/BGMLAI/gate.cat">GitHub</a> · <a href="https://gate.cat/teams.html" id="lnk-teams-foot">For teams</a> · <a href="https://gate.cat/#packs">Policy Packs</a> · built by <a href="https://bgml.ai">BGML.ai</a></span>
</div></footer>
<script>
(function(){var r=document.getElementById('tog');if(r)r.addEventListener('click',function(){var d=document.documentElement,n=d.getAttribute('data-theme')==='dark'?'light':'dark';d.setAttribute('data-theme',n);try{localStorage.setItem('gatecat-theme',n);}catch(e){}});})();
(function(){
var forms=[].slice.call(document.querySelectorAll('.cap-form'));
forms.forEach(function(f){
var cap=f.closest('.cap'),email=f.querySelector('input'),btn=f.querySelector('button');
var ref=new URLSearchParams(location.search).get('ref')||cap.id.replace('cap-','')||'';
f.addEventListener('submit',function(e){
e.preventDefault();
if(!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email.value.trim()))return;
btn.disabled=true;btn.textContent='…';
fetch('/api/subscribe',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({email:email.value.trim(),ref:(cap.id+' '+ref).slice(0,120)})})
.then(function(x){return x.json();}).then(function(){cap.classList.add('done');})
.catch(function(){btn.disabled=false;btn.textContent='Retry';});
});
});
})();
</script>
<script id="gc-affiliate-ref">
/* gate.cat affiliate/referral capture (self-hosted, zero-cost).
Mirrors the capture on the main landing so a creator link like
gate.cat/answers/<page>.html?ref=CODE attributes commission at checkout:
1) read ?ref=CODE; store cookie gc_ref (90d, SameSite=Lax) at path=/,
so the main site sees the ref when the visitor buys.
2) also carry ?ref onto same-site onward links (belt-and-suspenders).
Never breaks the page. */
(function () {
try {
var COOKIE = "gc_ref";
function readCookie(name) {
var m = document.cookie.match(new RegExp("(?:^|; )" + name + "=([^;]*)"));
return m ? decodeURIComponent(m[1]) : "";
}
function writeCookie(name, val, days) {
var d = new Date();
d.setTime(d.getTime() + days * 864e5);
document.cookie = name + "=" + encodeURIComponent(val) +
"; expires=" + d.toUTCString() + "; path=/; SameSite=Lax";
}
function clean(code) {
return (code || "").replace(/[^A-Za-z0-9_.-]/g, "").slice(0, 120);
}
var params = new URLSearchParams(window.location.search);
var urlRef = clean(params.get("ref"));
if (urlRef) { writeCookie(COOKIE, urlRef, 90); }
var ref = urlRef || clean(readCookie(COOKIE));
if (!ref) { return; }
var ids = ["lnk-teams", "lnk-teams-foot"];
for (var i = 0; i < ids.length; i++) {
var a = document.getElementById(ids[i]);
if (!a) { continue; }
var href = a.getAttribute("href");
if (!href || href.indexOf("ref=") !== -1) { continue; }
var sep = href.indexOf("?") === -1 ? "?" : "&";
a.setAttribute("href", href + sep + "ref=" + encodeURIComponent(ref));
}
} catch (e) { /* never break the page over affiliate tracking */ }
})();
</script>
</body>
</html>
Loading