Every click goes deeper.
Rabbithole is an open-source Rust webserver that generates entire websites on the fly using LLMs. You give it a single seed prompt. When someone visits a URL, the model generates the HTML from scratch — along with a set of links to new pages, each with their own generation prompts. Those pages are generated on demand when clicked. Those pages generate more pages. It is, charitably, the least efficient way to build a website ever devised, and it works surprisingly well, modulo the moments when it does not. The site you are reading was generated by Rabbithole itself, which is either a proof of concept or a cautionary tale about unsupervised AI. Possibly both.
Source code: github.com/ajbt200128/rabbithole — Live demo: isarabbithole.com
--seed "..."
or point to a file with --seed-file prompt.txt.
cargo run -- --seed "...". The server starts on port 8080 by default.
Set your ANTHROPIC_API_KEY first. Consider --max-cost unless
you enjoy surprise API bills.
http://localhost:8080/. The model generates your homepage and a set of
linked subpages, each with its own prompt. Click a link — that page generates on demand.
Click another. Each page goes one level deeper, up to the configurable depth limit (default: 5).
Pages are cached permanently after first generation.
--db path.db) for persistence across restartsweb_search and web_fetch so the model can look up real content and hotlink real images; disable with --no-web-tools--max-cost <dollars> to halt generation once exceeded. Strongly recommended.# Prerequisites: Rust toolchain installed
git clone https://github.com/ajbt200128/rabbithole
cd rabbithole
# Set your Anthropic API key
export ANTHROPIC_API_KEY=sk-ant-...
# Run with a seed prompt (set a budget cap — seriously)
cargo run -- --seed "A homepage about space exploration" --max-cost 2.00
# Or use a seed file
cargo run -- --seed-file my-prompt.txt --max-cost 2.00
# With SQLite persistence (survives restarts)
cargo run -- --seed "..." --db site.db --max-cost 2.00
# Custom port, model, and depth limit
cargo run -- --seed "..." --port 3000 --model claude-sonnet-4-5 --depth-limit 3
| Model | Input (per M tokens) | Output (per M tokens) |
|---|---|---|
| claude-opus-4-5 | $15.00 | $75.00 |
| claude-sonnet-4-5 | $3.00 | $15.00 |
| claude-haiku-4-5 | $0.80 | $4.00 |
Each page view that hits an uncached URL triggers one (or more, if web tools are used) API call.
On a busy site with web tools enabled, costs accumulate quickly.
Set --max-cost to a sensible limit before exposing the server publicly.
Bug reports, pull requests, and suggestions are welcome at
github.com/ajbt200128/rabbithole.
CI runs on every push: cargo build, cargo test, cargo clippy, and cargo fmt --check.
Tagged releases are cross-compiled and published as GitHub Releases for Linux and macOS on amd64 and arm64.