---
title: rippy
description: A fast shell command safety hook for AI coding tools — written in Rust.
hero:
tagline: A fast shell command safety hook for Claude Code, Cursor, Gemini CLI, and Codex — written in Rust.
actions:
- text: Get started
link: /getting-started/installation/
icon: right-arrow
variant: primary
- text: View on GitHub
link: https://github.com/mpecan/rippy
icon: external
variant: minimal
---
import { Card, CardGrid, Tabs, TabItem, Code } from '@astrojs/starlight/components';
## Why rippy?
<CardGrid>
<Card title="Static binary, sub-millisecond startup" icon="rocket">
No Python, no virtualenv, no `pip install`. A single Rust binary launches
in under a millisecond — fast enough to run on every single `Bash` hook
without your AI tool noticing.
</Card>
<Card title="Real bash AST parsing" icon="setting">
Commands are parsed into a proper AST by
[rable](https://crates.io/crates/rable), a pure-Rust bash parser with 100%
Parable compatibility. No regex hacks, no string-split guesses.
</Card>
<Card title="100+ commands understood in depth" icon="approve-check">
Built-in handlers for `git`, `docker`, `cargo`, `kubectl`, `psql`, `gh`,
`ansible`, and 80+ more — each one knows which subcommands are safe and
which need a human in the loop.
</Card>
<Card title="Transparent, predictable rules" icon="document">
Structured `.rippy.toml` config files with a simple rule grammar
(`allow`, `ask`, `deny`, redirects, MCP gating, structured matching).
Unknown commands default to **ask** — nothing dangerous slips through
silently.
</Card>
</CardGrid>
## Install
<Tabs syncKey="installer">
<TabItem label="Homebrew">
<Code code="brew install mpecan/tools/rippy" lang="sh" />
</TabItem>
<TabItem label="Cargo">
<Code code="cargo install rippy-cli" lang="sh" />
</TabItem>
<TabItem label="cargo-binstall">
<Code code="cargo binstall rippy-cli" lang="sh" />
</TabItem>
<TabItem label="GitHub Releases">
<Code
code={`# macOS (Apple Silicon / Intel), Linux (x86_64 / aarch64)
# Download from https://github.com/mpecan/rippy/releases`}
lang="sh"
/>
</TabItem>
</Tabs>
Then run `rippy init` to pick a [safety package](/getting-started/packages/)
and wire rippy into your AI tool — `rippy setup claude-code`,
`rippy setup cursor`, or `rippy setup gemini` does the hook-config editing
for you. Full walkthrough in the [Claude Code guide](/getting-started/claude-code/).
## Pick a safety package
rippy ships three preconfigured packages so you don't have to start from
a blank config:
```
review [===] Full supervision. Every command asks.
develop [==.] Auto-approves builds, tests, VCS. Asks for destructive ops.
autopilot [=..] Maximum AI autonomy. Only catastrophic ops are blocked.
```
Pick one with `rippy init`, then layer your own `allow` / `ask` / `deny`
rules on top. See the [Packages guide](/getting-started/packages/) for
details.
## What gets auto-approved?
rippy ships with **130+ commands** in its safe allowlist (read-only tools
like `cat`, `ls`, `grep`, `jq`, `rg`) plus **40+ CLI-specific handlers** that
understand subcommand safety:
| Command | Safe | Needs approval |
|---------|------|----------------|
| `git` | `status`, `log`, `diff`, `branch` | `push`, `reset`, `rebase` |
| `docker` | `ps`, `images`, `logs` | `run`, `exec`, `rm` |
| `cargo` | `test`, `build`, `check`, `clippy` | `run`, `publish`, `install` |
| `python` | `-c 'print(1)'`, safe scripts | `-c 'import os'`, unknown scripts |
| `kubectl` | `get`, `describe`, `logs` | `apply`, `delete`, `exec` |
| `psql` | read-only `SELECT` queries | write SQL, interactive |
| `gh` | `pr view`, `issue list` | `pr create`, `pr merge` |
| `ansible` | `--check`, `--syntax-check`, `ansible-doc` | playbook runs, vault encrypt |
Everything else defaults to **ask** — fail-safe by design.
## A Rust rewrite of Dippy
rippy is fully inspired by and config-compatible with
[Dippy](https://github.com/ldayton/Dippy) by
[@ldayton](https://github.com/ldayton). The rewrite trades Python for Rust,
a 200ms cold start for sub-millisecond, and adds file analysis and Claude
Code permission integration. Your existing `.dippy` files keep working.
See the [comparison page](/about/comparison/) for the full breakdown.