# paddington
A fast, minimal status line renderer for [Claude Code](https://docs.anthropic.com/en/docs/claude-code), written in Rust.
Reads Claude Code's JSON status input from stdin and outputs a compact, color-coded multi-line status bar showing:
- **Line 1** — Project path, git repo/branch, worktree, PR status, session name
- **Line 2** — Model name, context window usage
- **Line 3** — Session cost (with running monthly total), duration, lines changed
Session cost data is automatically persisted to a local SQLite database, enabling monthly analytics.
## Install
```sh
cargo install paddington
```
## Usage
Configure as your Claude Code status line command in `~/.claude/settings.json`:
```json
{
"statusLine": {
"type": "command",
"command": "~/.cargo/bin/paddington",
"padding": 3
}
}
```
### Custom Templates
Paddington's output is fully customizable via a [MiniJinja](https://github.com/mitsuhiko/minijinja) template in `$XDG_CONFIG_HOME/paddington/config.toml` (defaults to `~/.config/paddington/config.toml`):
```toml
[format]
template = """
{{ blue }}{{ path_raw }}{{ reset }} {{ yellow }}{{ branch_raw }}{{ reset }} {{ git_dirty }}
{{ model }} {{ gray }}[${{ cost_raw }}]{{ reset }}"""
```
Every variable has two forms:
- **Auto-colored** (`{{ model }}`) — wraps the value in its default ANSI color
- **Raw** (`{{ model_raw }}`) — plain text, use with explicit color tags for custom coloring
#### Available Variables
| `path` | cwd relative to project root | blue |
| `repo_owner`, `repo_name` | GitHub owner/repo | yellow |
| `branch` | git branch or short SHA | yellow |
| `worktree` | worktree name | blue |
| `pr_number`, `pr_state` | PR number and review symbol (✓/✗/~) | magenta |
| `session_name` | session name | magenta |
| `model` | model display name | green |
| `model_id` | raw model identifier | gray |
| `context_used`, `context_total`, `context_pct` | context window (in k / %) | gray |
| `cost`, `monthly_cost` | session / monthly cost (USD, 2 decimal) | yellow |
| `duration` | session duration | gray |
| `lines_added`, `lines_removed` | lines changed | green / red |
| `project_name` | project directory basename | blue |
| `session_id` | session identifier | gray |
| `hostname`, `username` | machine / OS user | gray |
| `datetime` | current time (HH:MM) | gray |
| `paddington_version` | version string | gray |
| `git_dirty` | "dirty" if uncommitted changes | yellow |
Color tags: `{{ blue }}`, `{{ yellow }}`, `{{ green }}`, `{{ red }}`, `{{ magenta }}`, `{{ gray }}`, `{{ reset }}`
If no config file exists, paddington uses a built-in default template that matches the standard output. If the config has errors, a warning is shown in the status line and the default template is used as a fallback.
### Validate & Preview
```sh
paddington check
```
Validates your config file and renders a preview with mock data — no live Claude Code session needed.
### Monthly Analytics
View cost breakdowns by day, model, and project:
```sh
paddington stats # current month
paddington stats --month 2026-07 # specific month
```
Data is stored at `$XDG_DATA_HOME/paddington/sessions.db` (defaults to `~/.local/share/paddington/sessions.db`).
## Build
```sh
cargo build --release
```
The release profile is configured with LTO and symbol stripping for a small binary.
## Credits
Heavily inspired by [Starship](https://starship.rs/)