Your terminal waits.
Now it pays.

backfill puts one sponsored line at the bottom of your terminal while you wait — Claude Code, Codex, and Gemini CLI sessions, cargo builds, docker images, dbt runs, anything slow. Advertisers bid for the slot. You keep half the revenue.

~/app — claude — 80×24
$ claude
> refactor the payment retry logic and add tests
✻ Thinking…
adHouse pick: DuckDB — in-process OLAP that eats parquet for breakfast+$0.0000
live simulation · earnings shown at a $2 CPM · your output is never touched
1 rowof your terminal. the rest stays exactly as it was
50%of ad revenue, credited per run, 5 visible seconds = 1 impression
0 bytesof your code, output, or env ever read or transmitted

install

One line. Any machine with a shell.

any dbt environment$ pip install backfill-cli
macos / linux$ brew install shyamsivakumar/tap/backfill
everything else$ curl -fsSL https://backfill.sh/install.sh | sh

Then bf init aliases the slow commands (dbt, cargo, docker, gradle, bq, snowsql, spark-submit…) so your muscle memory just works. Wrap anything ad hoc: bf make -j8, bf claude, bf codex. Works in cloud IDE terminals too — Paradime, Codespaces, anywhere with pip.

where it runs

Every wait-state. One balance.

Claude Codebf agents install puts the ad in Claude Code's own status line via the official statusLine setting — no patching, earns through every thinking pause
Codex, Aider, Gemini CLIbf codex, bf aider, bf gemini — agent sessions are just long-running commands, and they run long
Any CLI toolbf dbt run, bf cargo build, bf docker build, bf make -j8 — the wrapper doesn't care what it runs
CI logsGitHub Action — point a repo's build-log earnings at its maintainers

how it works

A pseudo-terminal one row short.

Your command runs untouched

bf dbt run starts dbt in a PTY sized one row shorter than your screen. Output, colors, interactivity, Ctrl-C, and exit codes pass through byte-for-byte. Your run summary prints exactly as always.

The reserved row shows one ad

A single dim, clearly-labeled line on the bottom row, clickable via your terminal's native hyperlinks. While you watch the build, the slot accrues impressions: 5 visible seconds each, clicks worth 50x.

You get paid for the wait

Half of attributable ad revenue lands on your balance, per run. Claim your device with an email; payouts via Stripe once balances cross $25.

trust

Read the source. All 600 lines of it.

The CLI is open source (MIT) and small enough to audit over coffee. It is structurally incapable of reading your code: the only payload it ever sends is

{ "deviceId": "dev_4f21…", "adId": "duckdb_q3", "cmd": "dbt", // the word. never the args, never the output "seconds": 214 }

Kill switch: bf off. Full removal: bf uninit. No daemon, no polling — two tiny HTTP calls per run, and your build never waits on the network.

the math

What a wait is worth.

your dayimpressionsat $2 CPM, your half
an afternoon of Claude Code sessions~480$0.48
20-minute dbt production run240$0.24
six cargo builds while iterating~360$0.36
a normal month of waiting~12,000$12 — beer money for time you already lost

Honest status: backfill is brand new. Today's inventory is house ads — clearly marked, earning $0 — while the first advertiser slots are sold. Your impressions are tracked from day one and your dashboard shows what they'd be worth at a $2 CPM. Nobody gets rich here; your wait time buys coffee, not yachts.

for advertisers

Buy "developers mid Claude Code session." Or "currently running dbt."

No ad network can sell those segments — we can, from the command name alone, with zero content read. Verified continuous attention during 15-minute compiles and agent sessions, no tab to switch away to. Interactive terminals only: we never bill impressions no human is watching.