bito
bito = building in the open.
bito is part of the building-in-the-open approach to AI-assisted development — a set of practices, templates, and tools for teams that work with coding agents. It can be used entirely on its own; the broader framework just gives it more context to work with.
AI coding agents generate documentation as they work — ADRs, design docs, changelogs, handoff notes. The quality varies between sessions. Sometimes you get crisp, well-structured prose. Sometimes you get bloated walls of text that no one wants to review.
bito catches the problems before you commit. It runs 18 deterministic writing checks — readability scoring, token budgets, section completeness, grammar, dialect enforcement, and style analysis. No LLM, no API calls, no network. Same input, same result, every time.
The goal: agent-generated documents that are clean enough to ship.
$ bito analyze docs/architecture.md
docs/architecture.md
Readability: Grade 12.4, 24 sentences, 390 words
Grammar: 8 issues, 3 passive (12.5%)
Sticky: Glue index 21.5%, 2 sticky sentences
Pacing: Fast 62% / Medium 29% / Slow 8%
Length: Avg 15.8 words, variety 10.0/10
Transitions: 0% of sentences, 0 unique
Overused: "template" (1.3%), "skill" (1.1%), "design" (1.1%)
Diction: 2 vague words
Style: Score 92/100, 2 adverbs, 0 hidden verbs
What it checks
analyze runs 18 checks in one pass:
| Category | What it catches |
|---|---|
| Readability | Flesch-Kincaid grade level — flag documents that demand too much of the reader |
| Grammar | Passive voice, double negatives, subject-verb disagreement, missing punctuation |
| Sticky sentences | High "glue word" density — sentences stuffed with is, the, of, in |
| Pacing | Monotonous sentence rhythm — all short punches or all long slogs |
| Sentence variety | Length distribution — a score of 1/10 means every sentence is the same length |
| Transitions | Percentage of sentences using connective phrases — low means choppy reading |
| Overused words | Repeated non-trivial words that make the text feel circular |
| Repeated phrases | Bigrams and trigrams that recur too often |
| Echoes | Same word appearing in adjacent sentences (unintentional repetition) |
| Complex paragraphs | Paragraphs with too many ideas competing for attention |
| Conjunction starts | Sentences opening with But, And, So — fine in moderation, a tic in excess |
| Cliches | "At the end of the day," "move the needle," "low-hanging fruit" |
| Diction | Vague words (things, stuff, very) that add length without meaning |
| Sensory language | Percentage of concrete, sensory words — useful for judging descriptive writing |
| Consistency | Mixed US/UK spelling (color and colour in the same document) |
| Dialect enforcement | Flag spellings that violate your project's chosen dialect (en-us, en-gb, en-ca, en-au) |
| Acronyms | Tracks acronym usage for consistency |
| Style score | Combined metric: adverb density, hidden verbs (nominalizations), overall polish |
Every check is deterministic. No API calls, no LLM, no network. The same input produces the same output every time.
Focused checks run individually when you need a specific gate:
# Does this handoff fit in 2,000 tokens?
)
# Is this user guide accessible to a general audience?
)
# Does this ADR have all the sections it needs?
)
# How's the grammar?
)
Installation
Homebrew (macOS and Linux)
From source
Pre-built binaries
Download from the releases page. Binaries are available for macOS (Apple Silicon and Intel), Linux (x86_64 and ARM64), and Windows.
Usage
Config-driven linting
Define rules in your config file to map file paths to checks, then run them with one command:
If no rules match the file, it exits cleanly. See docs/README.md for rules configuration, accumulation, specificity, and inline suppressions.
Full analysis
Add --json for machine-readable output. Add --dialect en-gb to enforce British spelling. Add --checks readability,consistency to run only specific checks. Add --exclude style,jargon to skip specific checks.
Quality gates
Quality gates are pass/fail checks designed for CI, pre-commit hooks, and automation:
# Token counting with budget enforcement
# Readability with grade ceiling
# Section completeness against a template
# Grammar and passive voice analysis
Built-in completeness templates: adr, handoff, design-doc. Define your own in a bito config file.
Every command exits non-zero on failure, writes structured JSON with --json, and works in pipes.
Dialect enforcement
Set a project dialect and bito flags wrong-dialect spellings alongside mixed-spelling inconsistencies:
# Via flag
# Via environment variable
# Via config file (.bito.toml)
Supported dialects: en-us, en-gb, en-ca (Canadian hybrid: US -ize/-ise, UK for the rest), en-au.
MCP server
bito includes a built-in MCP server, so AI coding assistants can call quality gates directly during writing sessions:
This exposes seven tools: analyze_writing, count_tokens, check_readability, check_completeness, check_grammar, lint_file, and get_info. The lint_file tool resolves path-based rules from your config, so the agent can check quality before writing. Total schema cost: ~2,003 tokens. See docs/mcp-development.md for context budget details.
Configuration
Drop a config file in your project and it takes effect automatically:
.bito.toml(or.yaml,.json) in the current directory or any parentbito.toml(without dot prefix) in the current directory or any parent~/.config/bito/config.toml(user-wide defaults)
For backward compatibility, .bito-lint.* config file names are also discovered.
Closer files win. All formats (TOML, YAML, JSON) work interchangeably.
Environment variables override config files:
BITO_LOG_PATH— log file path (daily rotation appends.YYYY-MM-DD)BITO_LOG_DIR— directory (file name defaults tobito.jsonl)BITO_ENV— environment tag (default:dev)- Config file key:
log_dir
# .bito.toml
= "en-us"
= 2000
= 12.0
= "warn"
Shell completions
Included in Homebrew installs and release archives. For manual setup:
# Bash
# Zsh
# Fish
Development
crates/
├── bito/ # CLI binary
└── bito-core/ # Core library
Prerequisites
- Rust 1.89.0+ (2024 edition)
- just (task runner)
- cargo-nextest (test runner)
Quick Start
Build Tasks
| Command | Description |
|---|---|
just check |
Format, lint, deny, and test |
just fmt |
Format code with rustfmt |
just clippy |
Run clippy lints |
just test |
Run tests with nextest |
just doc-test |
Run documentation tests |
just cov |
Generate coverage report |
xtask Commands
The project includes an xtask crate for build automation:
# Generate man pages
# Generate shell completions
# Generate for specific shell
Architecture
Crate Organization
- bito — The CLI binary. Handles argument parsing, command dispatch, MCP server, and user interaction.
- bito-core — The core library. Configuration loading, writing analysis, lint engine, and all 18 deterministic checks.
Error Handling
- Libraries use
thiserrorfor structured error types - Binaries use
anyhowfor flexible error propagation - All errors include context for debugging
Configuration System
The ConfigLoader provides flexible configuration discovery:
use ConfigLoader;
let config = new
.with_project_search
.with_user_config
.load?;
Features:
- Walks up directory tree looking for config files
- Stops at repository boundaries (
.gitby default) - Merges multiple config sources with clear precedence
- Supports explicit file paths for testing
CI/CD
This project uses GitHub Actions for continuous integration:
- Build & Test — Runs on every push and PR
- MSRV Check — Verifies minimum supported Rust version
- Clippy — Enforces lint rules
- Coverage — Tracks test coverage
Dependabot
This project uses Dependabot for security monitoring, but not for automatic pull requests. Instead:
- Dependabot scans for vulnerabilities in dependencies
- A weekly GitHub Actions workflow converts alerts into issues
- Maintainers review and address updates manually
This approach provides:
- Full control over when and how dependencies are updated
- Opportunity to batch related updates together
- Time to test updates before merging
- Cleaner git history without automated PR noise
Security alerts appear as issues labeled dependabot-alert.
Contributing
Contributions welcome! Please see AGENTS.md for development conventions.
Commit Messages
This project uses Conventional Commits:
feat:— New featuresfix:— Bug fixesdocs:— Documentation changesperf:— Performance improvementschore:— Maintenance tasks
Code Style
- Rust 2024 edition
#![deny(unsafe_code)]— Safe Rust only- Follow
rustfmtdefaults - Keep clippy clean
License
MIT (LICENSE-MIT)