A developmental editor that argues with itself until the prose is yours.
Book Evolve is a command-line tool that turns raw dictated transcripts into finished book chapters. Three models draft in parallel. A judge scores them on six axes. The winner goes back for another round, and another, until the work clears the bar — in your voice, not the model's.
ONE COMMAND · NO CLONE · NO BUILD
Four stages. One chapter at a time.
Every chapter walks the same path. The council never sees the judge; the judge never sees the council's identities. Only the prose crosses the line.
One model's first draft is never the answer.
The council drafts in parallel. The judge reads every draft cold — no model names, no ranking bias — and scores it on six axes. The strongest goes back for another evolution round.
From npx to a promoted chapter.
No clone, no build, no account. Bring an OpenAI-compatible endpoint and a dictation; Book Evolve does the rest.
npx @kaos-intelligence/book-evolve
book-evolve scaffold --title "Your Book" --author "Your Name"
LITELLM_BASE_URL=https://openrouter.ai/api/v1 LITELLM_API_KEY=sk-or-v1-... COUNCIL_MODEL_1=anthropic/claude-3.5-sonnet COUNCIL_MODEL_2=google/gemini-flash-1.5 COUNCIL_MODEL_3=openai/gpt-4o-mini JUDGE_MODEL=anthropic/claude-3.5-sonnet FAST_MODEL=openai/gpt-4o-mini
book-evolve evolve --chapter 1
STUCK? RUN book-evolve doctor — IT TELLS YOU EXACTLY WHAT'S MISSING.
Your keys. Your endpoints. Your cost.
Book Evolve never calls a model it wasn't pointed at. Drop one of these into .env.ai and you're running. The defaults in the scaffold are placeholders — override them.
LITELLM_BASE_URL=https://openrouter.ai/api/v1 LITELLM_API_KEY=sk-or-v1-... COUNCIL_MODEL_1=anthropic/claude-3.5-sonnet COUNCIL_MODEL_2=google/gemini-flash-1.5 COUNCIL_MODEL_3=openai/gpt-4o-mini JUDGE_MODEL=anthropic/claude-3.5-sonnet FAST_MODEL=openai/gpt-4o-mini
LITELLM_BASE_URL=http://127.0.0.1:11434/v1 LITELLM_API_KEY=ollama COUNCIL_MODEL_1=qwen3:32b COUNCIL_MODEL_2=llama3.3:70b COUNCIL_MODEL_3=gemma3:27b JUDGE_MODEL=qwen3:32b FAST_MODEL=qwen3:8b OLLAMA_EMBED_MODEL=bge-m3:latest
LITELLM_BASE_URL=http://127.0.0.1:4000/v1 # LITELLM_API_KEY read from ~/.litellm-master-key COUNCIL_MODEL_1=your-route-alias-1 COUNCIL_MODEL_2=your-route-alias-2 COUNCIL_MODEL_3=your-route-alias-3 JUDGE_MODEL=your-route-alias-1 FAST_MODEL=your-fast-route
No embeddings server running? Set ASI_EVOLVE_HASH_EMBEDDINGS=1024 to evolve with degraded hash retrieval — slower retrieval, same prose. The full environment reference is in the README.
Every evolution leaves a paper trail.
Each run appends structured events to activity_stream.jsonl — provision attempts, per-axis judge scores, promotion decisions. Best-effort by design: a logging failure can never take down a run.
{"ts":"2026-07-19T18:42:11Z","event":"judge.score","chapter":1,"step":3,"model":"claude-3.5-sonnet","axes":{"content_fidelity":0.91,"style_match":0.88,"literary_quality":0.86,"structural_coherence":0.9,"readability":0.92,"novelty":0.74},"promoted":false}
{"ts":"2026-07-19T18:43:54Z","event":"chapter.promoted","chapter":1,"step":5,"final_score":0.94}