Paid wait-time for developers

Get paid to
watch dbt run.

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.

~/analytics — dbt run — 80×24
$ dbt run
Running with dbt=1.9.2
Found 312 models, 841 tests, 2 snapshots, 19 sources
dbt 12/312 marts.rpt_daily_revenue adDuckDB · in-process OLAP for analytics and parquet+$0.0000
live simulation · dbt collapses into one line · you keep half
1 linecollapses into the running command or the agent spinner. nothing sits below your prompt
50%of attributed ad revenue is yours. five watched seconds is one impression
0 bytesof your code, args, env, logs, or output ever leave the machine

install

One line. Any shell. Same muscle memory.

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.

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

The 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

Every wait you sit through, one balance.

dbt and the data stack
dbt · bq · snowsql · spark-submit · sqlmesh
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.
Any wrapped CLI tool
cargo · docker · make · terraform plan · go
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.
Package installs
npm · pnpm · yarn · bun · pip
A plain 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.
Coding agents
claude code · droid · codex
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.
Full-screen and interactive commands
vim · less · ssh · sudo · gh · docker run -it
Editors, pagers, REPLs, SSH sessions, 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.
CI logs
maintainer-directed earnings
Non-TTY runs (GitHub Actions, Airflow, dbt Cloud) exec plainly with zero overhead. The GitHub Action can route build-log earnings to the people maintaining the repo, opt-in.

how it works

The wait becomes the ad slot.

Your command runs, the noise collapses

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.

One line carries the ad, the content, and your $earned

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.

You get paid for the wait

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 payload is small enough to read here.

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.

POST /api/eventsno args · no output · no env
{ "deviceId": "dev_4f21…", "adId": "duckdb_q3", "cmd": "dbt", // the command word only. never args, never output "seconds": 214, "kind": "impression" }

ledger

Your terminal has been working for free.

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.

A week of dbt runs you sit through
~4,500 impressions
your half, at developer CPM
$45
A month, with agent sessions and builds
~22,000 impressions
dbt, Claude Code, cargo, one balance
$220
A year of waiting, monetized
~260,000 impressions
time that was passing anyway
$2,600

for advertisers

Buy developers currently waiting on the exact tool you sell.

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.