Paid wait-time for developers
Run bf init once. Your normal dbt run collapses into one live line that carries a dim sponsored message, trending dev content, and your running $X.XX earned tally. The same line rides Claude Code's spinner verb, Factory's droid, Codex, and the long compiles like cargo and docker. Advertisers pay for time you're already spending. You keep half.
install
Then bf init, once, wraps the common slow commands (dbt, sqlmesh, cargo, docker, terraform, npm, and more) via PATH shims in ~/.backfill/shims, so your plain dbt run, cargo build, and docker build earn, typed exactly how you already type them. bf init --all wraps every non-interactive command on PATH; bf wrap and bf unwrap adjust the list. It works inside Makefiles and scripts. Reverse it anytime with bf uninit. Headless and CI runs exec plainly with zero overhead, by design.
$ pip install backfill-cli$ brew install shyamsivakumar/tap/backfill$ curl -fsSL https://backfill.sh/install.sh | shThe binary is SHA-256 verified and re-signed ad-hoc on macOS so the Code Signing Monitor doesn't kill it. Locked-down container (Paradime, Codespaces) where pip warns that bf isn't on PATH? Bootstrap with python -m backfill_cli init, it self-heals PATH for the next shell. Or skip setup entirely and run bf dbt run explicitly.
where it runs
bf init wraps dbt and the data stack. On run, build, test, seed, or snapshot the per-model START/OK spam collapses into one live progress line that carries the ad, the model counts, and your $earned tally. Your header and PASS/WARN/ERROR summary stay above. The same single-line progress works for sqlmesh plan and sqlmesh run. Exit codes pass through.bf init wraps these out of the box. Plain cargo build, docker build, make -j8, go build ./... earn as usual, or run them with an explicit bf prefix. The run collapses into one line that still surfaces the build's key checkpoints and summary, the docker steps, the test results, the cargo Finished, while the per-file noise collapses behind it. If it fails, the full output flushes so the error is never hidden. It also catches scaffold completions (npm create, cargo new, rails new, any create-*) and prints one sponsored line under the success screen.npm install keeps its own progress bar, untouched, since installs run attached to your terminal, then prints one sponsored line on the completion screen. Nothing is hidden and nothing looks frozen. bf wrap and bf unwrap tune which managers are included.bf agents install claude sets Claude Code's thinking-spinner verb to a rotating batch: the ad, trending dev content, and your running $earned tally cycle while it thinks. It never installs a status line and never touches your existing one. The same applies to bf agents install droid for Factory's droid and bf agents install codex for Codex. Gemini CLI and Cursor are full-screen TUIs with no injectable surface, so only the command-wait line applies there.sudo, gh, docker run -it, and terraform apply all run completely untouched. bf only collapses non-interactive commands that produce a clear end state, so prompts and full-screen UIs are never disturbed.live right now
The sponsored line rotates through trending GitHub repos, top Hacker News stories, and curated dev tooling tips. This is the real, current pool, not a mockup. It refreshes hourly.
how it works
bf runs your command, streams its output, and collapses the routine scroll into one live line. Interactive and full-screen commands (editors, REPLs, ssh, sudo, terraform apply) are detected and run in your real terminal untouched. Exit codes pass through, and if a collapsed run fails its captured output flushes so nothing is hidden.
For wrapped CLI tools the run collapses into a single live line that rotates the sponsored message, a trending repo or HN story, and a running $X.XX earned tally, with a spinner and an elapsed timer. It still surfaces the build's key checkpoints and summary above that line, and never blocks or hides a failure. Package installs keep their native progress instead. For coding agents the same rotation rides the agent's thinking-spinner verb, so nothing sits below the prompt.
Half of attributable ad revenue lands on your balance per run. Claim your device with bf claim and an email. Stripe payouts once your balance crosses $25 are planned for a future release. Run bf status to check your balance anytime.
packet inspector
The CLI is open source (MIT), roughly 600 lines of Go. It never reads code, args, output, or env. The packet below is the entire impression payload. No telemetry, no fingerprinting, no upgrade pings.
ledger
Every model build, compile, and agent session is attention advertisers pay developer rates for. At a $20 developer CPM, here's what the waiting adds up to.
for advertisers
No ad network can sell “developers currently running dbt” or “mid Claude Code session.” backfill can, from the command name alone, with zero content read. Selection runs a unified eCPM across direct CPM deals, affiliate expected-value, and a house floor, with Bayesian shrinkage so new campaigns can't game the ranking. Frequency caps and flight windows are enforced server-side. Prepay a Stripe deposit, create your campaign, and an admin approves it before it serves.