Everything you need to know, installing, earning, getting paid, what we do (and pointedly don't do) with data, and how advertisers book the line. Take your time. The sloth does.
Spinwage is an EU ad network for the one screen every developer stares at dozens of times a day: the AI coding agent wait screen. It works with Claude Code, Codex, Hermes Agent, and Open WebUI, and all of them earn to the same balance on the same device. While your agent is thinking, your status line shows a single tasteful, clickable sponsored message. Advertisers pay for that attention, and 50% of every euro settles to your balance. No banners, no popups, no tracking. One line, while you wait.
That's the whole footprint: the sponsored line, your running balance, your model. Nothing else changes.
One command. It wires the official Claude Code statusLine
setting, no patches, no forks, fully reversible.
npx spinwage install| Flag | What it does |
|---|---|
| --with-spinner | Also sets spinnerVerbs, so the sponsored line can appear in the
spinner area as well as the status line. Both are official Claude Code settings. |
| --codex | Installs for the Codex CLI instead of Claude Code. Same single-line format, same earnings. |
| --ref CODE | Attaches a referral code at install time, crediting the developer who referred you. |
npx spinwage install --with-spinner --ref CODEExactly three things: the current sponsored message (clickable), your running Spinwage balance, and your active model. The line refreshes at most once per minute from a local cache, your terminal stays fast.
The installer assigns your machine an anonymous device id and the sponsored line renders from the first install, but an unclaimed device earns €0.00. Impressions only become billable and creditable once the device is claimed by a signed-in account and that account is GitHub-verified. To start earning:
npx spinwage status and copy the device id it prints.A device can only belong to one account. You can claim as many devices as you own, work laptop, home machine, the lot, and they all roll up to one balance. Earning starts from the first impression after the device is claimed and your GitHub is verified, not before.
npx spinwage uninstallRestores your previous statusLine (and
spinnerVerbs, if you used --with-spinner)
byte-for-byte from the backup taken at install. Your settings end up exactly
as they were, and the device stops serving immediately. The device id is stable, so
if you reinstall later on the same machine you can still claim it and start earning.
Beyond Claude Code and Codex, Spinwage ships a plugin for
Hermes Agent (Nous Research).
One install adds two surfaces: a sponsored line plus your live balance in the Hermes
dashboard (a Spinwage tab and a line above your sessions), and a
/spinwage command in the terminal. Same as everywhere, it
reads no code, prompts, or conversations, it only fetches one sponsored line.
Unofficial community plugin. Not affiliated with Nous Research.
One command. It sets up your Spinwage device and drops the plugin into
~/.hermes/plugins/.
npx spinwage hermes-installGET /api/dashboard/plugins/rescan), a Spinwage tab appears, with a sponsored line above your sessions./spinwage to print your current line and balance.npx spinwage hermes-uninstallRemoves the plugin from ~/.hermes/plugins/spinwage. Your balance
stays on your device id, so you can reinstall anytime.
Running an Open WebUI server? Spinwage ships a Filter function. While the model is thinking, it shows one tasteful sponsored line and your live balance in the status area, then clears it when the response is done. It reads no prompts and no messages, it only sends your server's device id and fetches one line.
Unofficial community function. Not affiliated with Open WebUI.
Open WebUI is usually one server shared by many users, so the server operator earns: one device id on the instance, every wait state serves your line.
It's an admin paste, not a file copy. This command sets up your device and prints exactly what to paste:
npx spinwage openwebuinpx spinwage openwebui --print | pbcopy copies it to your clipboard, then Save and enable it.country_code (e.g. DE) for geo-targeted campaigns.Note: Open WebUI filters render on the UI chat flow,
not on raw /api/chat/completions traffic.
Half of every euro an advertiser spends on your screen settles to your balance. No tiers, no thresholds, no fine print.
One paid impression per ad at most every 45 seconds per device. Idling on the wait screen doesn't multiply earnings, real attention does.
A click on the sponsored line pays 50× the impression rate. One genuine click is worth a lot more than a glance.
Max 20 paid clicks per device per day. Clicks beyond that still work, they just don't earn. Keeps the network honest and CPMs high.
The caps aren't there to shortchange you, they're what makes advertisers trust the inventory, which is what keeps bids (and your 50%) up. Earnings are tracked in real time; your balance updates on the dashboard and right there in your status line.
Your 50% only stays real if the other 50% is real. Advertisers keep bidding when the attention they buy is genuine human developer attention — so the same checks that protect their budget are what protect your payouts. Here's the honest version of how that works.
Every billed impression comes from a GitHub-verified developer. Serving and billing are two different things: any device can have the sponsored line rendered, but an impression is only billed to an advertiser and credited to an earner when it's tied to a verified identity. Anonymous traffic and bot floods still see the line, they just bill €0.00 and earn nothing. There's no pile of fake money to fight over, so gaming the network has negative ROI by construction.
Concretely: the spoofed-view scripts that were publicly demonstrated against the US predecessor, the ones that minted real paid fake views — bill €0.00 when replayed against Spinwage, because none of those views carry a GitHub-verified identity. Same attack, no payout. We credit the original for inventing the category; we just engineered the billing so fake attention can't reach your balance or an advertiser's invoice.
Same ad line, two devices. Only the verified developer moves money, in either direction.
For an impression to bill and earn, all of these have to hold. Miss any one and the line still renders, it just settles at zero.
Your device id is derived from the machine itself, a fingerprint of hostname, MAC and OS. Claude Code, Codex and any other agent on the same machine share one device id, and wiping your config doesn't mint a fresh earning cap. It's deliberately hard to turn one laptop into a farm of fake earners.
Every impression and click is scored for anomalies, but we never store your raw IP. What we keep is a salted hash of your IP plus the country , enough to spot a single address impersonating a crowd, not enough to track you. It's GDPR-clean by architecture and EU-hosted in Frankfurt (eu-central-1). The point isn't to watch you; it's to make sure the traffic sitting next to yours is real, so the budget that pays you stays real.
Borderline accounts, the ones that sit right on the edge of the trust signals, land in a human review queue instead of earning automatically. Account age, repos, followers, recent events and contributions all feed a trust radar; promotion to earning is a manual decision. If your account is under review it's not a ban, it's a real person looking before money moves.
The last gate is the strongest. To take money out you need earnings across at least three distinct days and a one-time identity check via Stripe, government ID plus a bank account. So even a fraud attempt that somehow cleared every gate above would have to end with a real, KYC-verified person attaching their legal identity to a Stripe connected account. We never see your card, ID data, or new payout bank details; Stripe handles that.
None of this makes the network magically unbreakable, and we won't claim it does. What it does mean is concrete: every euro that reaches your balance is tied to a verified developer identity, and faking attention here costs the faker more than it pays.
Sign in to the dashboard to check your balance and request a payout.
Spinwage is built so that the privacy answer is boring:
Spinwage runs a simple open auction on CPM. The highest active bid serves across the network; ties rotate evenly between the tied campaigns. There's an anonymized bid ladder on the advertise page so you always know where your bid stands, no black-box auction, no "bid more" upsell calls. Clicks are billed at 50× the impression rate, every campaign has a hard budget cap, and you can cancel anytime.
No. The status line renders from a local cache and fetches a new ad line at most once per minute, asynchronously. Your agent's response time and your typing latency are untouched, if the network is down, the cached line keeps rendering and your terminal doesn't notice.
Nothing, it's the opposite direction. Installing is free, there are no fees, and you receive 50% of the ad revenue your screen generates. Payouts run through Stripe Connect.
Email magic-link signs you in to browse and claim devices, but it can't unlock earning on its own, anyone can mint inboxes for free, and an ad network paid out on free inboxes is a fraud network. GitHub is the cheapest honest proof that you're a real, established developer: an account that's at least 90 days old with genuine public activity can't be spun up on demand. Think of it as your GitHub vouching for you. We read only your public profile to check account age and activity, no private repos, no code, no write access. And it's what lets us tell advertisers their euros buy real developer attention, which is exactly what keeps the bids, and your 50%, flowing.
A review isn't a ban. Accounts that sit right on the edge of the trust signals, for example an older GitHub account with very little public activity, the shape gray-market shell accounts tend to have — go to a human review queue instead of earning automatically. A person looks at the signals (account age, repos, followers, recent events, contributions) and makes the call. The line still renders on your machine while you wait; it just settles at €0 until you're promoted to earning. If you're a real developer, a bit more public activity and a little patience is usually all it takes.
No, not the raw one. For every impression and click we keep a salted hash of your IP plus the country, never the address itself. That's enough to score for anomalies, to notice one machine pretending to be a crowd, without ever holding data that identifies or tracks you. It's processed in Frankfurt (eu-central-1), stays in the EU, and is GDPR-clean by architecture. The reason it exists is the same reason every other gate exists: keeping the traffic real is what keeps your payouts real.
Spinwage uses only the official, documented Claude Code
configuration: the statusLine setting and (optionally)
spinnerVerbs. No binary patching, no API interception,
no terms-of-service gray zones. It's the same mechanism any custom status line
script uses, we just put something valuable in it. And uninstall restores your
previous configuration byte-for-byte at any time.
Yes, and by design rather than by consent banner. Before you claim a device we hold only an anonymous device id and impression counts, no personal data at all. After claiming, we hold your email and payout request status; payout bank details stay with Stripe Connect. We never see your code, prompts, or completions, so there is nothing sensitive to leak in the first place. DPA available for advertisers on request.
Kickbacks.ai invented this category, full credit to Andrew McCalip; Spinwage exists because we figured Europe shouldn't watch from the sidelines. Two differences matter. Technically: Spinwage only uses official Claude Code settings (statusLine, spinnerVerbs), we never patch another extension's files, and uninstall restores your setup byte-for-byte. Commercially: built for the European market, hosted in Frankfurt, GDPR-clean by architecture, EUR pricing and EU-grade paperwork for advertisers.
Conversion tracking is server-to-server only, no pixel, no tracking script, no cookie. Here is the full chain:
1. Click passthrough. When a developer clicks a sponsored line
they are redirected to the advertiser's URL with one extra query parameter:
sw_cid=<click_id>. The click_id
is a random UUID that exists only within Spinwage; it carries no personal
data and is not derived from a device fingerprint or browser identity.
2. Advertiser postback. When a conversion happens on the
advertiser's site (purchase, signup, etc.), their backend sends a
POST /cv with a bearer token
(conversion_secret, issued per advertiser at
account creation) and the sw_cid they received at
click time, plus their own order_id.
3. What we store per conversion: the click_id
reference, campaign_id, advertiser_id,
the advertiser-supplied order_id, an optional order
value in microcents, billing amounts, and a timestamp. We do NOT store raw
order data, customer details, emails, or anything the developer typed.
Deduplication is enforced per (campaign_id, order_id) —
duplicate postbacks are silently ignored.
4. Attribution window: a postback is accepted only when the referenced click is ≤ 30 days old.
5. No cross-site developer profiling. A click_id
identifies one click event; Spinwage does not build behavioral profiles of
developers across campaigns or advertisers. What a developer clicked is
not shared with other advertisers.
All conversion data is stored in Frankfurt (eu-central-1). Spinwage acts as a data processor for the advertiser (controller), see our DPA Addendum for details, available on request.
Spinwage supports three pricing models per campaign:
CPM (cost per mille), the default. You pay per 1 000 verified impressions. Your bid sets the price per 1 000 shows; campaigns rank by CPM bid. Good for brand awareness and reach.
CPC (cost per click), you pay only when a developer clicks your sponsored line. Impressions are free; the click is billed at your CPC bid. Good if your landing page does the conversion work.
CPA (cost per action), you pay only when a confirmed conversion is reported to Spinwage via server-to-server postback. Impressions and clicks are free; money moves only on a recorded conversion. You set a fixed CPA price per conversion; Spinwage bills that amount (capped at your remaining budget) and credits 50% to the developer whose click drove it, but only if that developer is GitHub-verified and earning-eligible. The hard budget cap applies in every model: serving stops automatically when your budget is exhausted.
Note: in v1 the auction ranking is always by the CPM bid field
(bid_cpm_microcents) regardless of pricing model —
eCPM normalization across mixed models is a planned future feature and is
not live yet. If you run a CPA campaign alongside CPM campaigns today,
set a representative CPM ranking bid accordingly.
After Stripe confirms checkout payment. New campaigns are pending until payment is confirmed, then the webhook switches them to active and they start competing in the auction.
Yes. Install with npx spinwage install --codex
and you get the same single sponsored line in the Codex CLI, with the same 50%
revenue share and the same uninstall guarantee. Running both Claude Code and
Codex on one machine? Both count toward the same device balance.
If your IDE runs Claude Code's terminal integration, the status
line, and Spinwage, comes along for free, since it's just the official
statusLine setting. Dedicated support for IDE-native agent
panels is on the roadmap; the terminal is where the wait-screen attention is
today, so that's where we started.
Run npx spinwage uninstall. It restores
your previous status line configuration byte-for-byte from the backup made at
install, and all network activity stops immediately. If you'd already claimed the
device, your balance stays on your account and remains payable; the device id is
stable, so you can reinstall and resume earning later on the same machine.