I was too broke to buy ads, so I built my own ad network

buffer_overlord1 pts0 comments

I was too broke to buy ads, so I built my own ad network — Chovy's Blog

I was too broke to buy ads, so I built my own ad network

2026-08-18, by Anthony “chovy” Ettinger.

How this was written: drafted with an AI assistant from my own notes,<br>then edited by me.

I have never once been able to afford to buy ads. Not "I chose not to". Could not. Every<br>time I have priced a campaign for one of my own products, the number came back somewhere<br>between a car payment and a joke, and the joke was me. Search ads for developer tooling<br>keywords run a few dollars a click. Spend a hundred bucks, get thirty clicks, get one<br>signup, delete the account.

So I did the thing developers do instead of solving a problem the normal way. I built my<br>own ad network.

What it is

It lives at crawlproof.com/ads. Publishers add a<br>slot, advertisers run a campaign, and it serves three ways:

/ad.js, the normal JSON path, fills any [data-cp-ad] div.

An iframe endpoint for sites that ship no JavaScript at all.

A plain text endpoint for terminals, so an ad can land in your MOTD or your shell<br>login banner.

Impressions meter server side at fill time, not in the browser, so JavaScript is never<br>required for one to count. On the terminal endpoint curl is not a bot to filter out, curl<br>is the audience. That was the fun part to write.

The numbers

First impression ever recorded: 2026-07-07. Six weeks ago. Last 30 days it served<br>59,012 impressions across 22 active slots and 92 campaigns. The 30 days<br>before that: 4,906.

Per week, browser traffic only: 1,929, then 3,259, then 6,661, then 8,502, then 6,555,<br>then 9,000. This week is at 7,684 and it is Tuesday.

Biggest publishers are my own properties, which is the whole point.<br>bittorrented.com at 23,952 and<br>profullstack.com at 22,931, then<br>rssamplifier.com at 6,067 and<br>ugig.net at 1,812. Fourteen more sites under that.

The honest part

An ad network would show you the 59,012 and stop. Here is the rest.

Of that number, 38,683 came from actual browsers, and those represent 11,283 distinct<br>visitor ids. That part I am happy with. Another 18,782 are terminal impressions that came<br>from fourteen IP addresses , most of them a systemd timer on my own dev box<br>curling my own endpoint every ten minutes to refresh a sponsor file. That is not an<br>audience. That is my server talking to itself.

I only found out how bad it was after tuning the duplicate window from 60 seconds down<br>to 5 and backtesting it. Terminal impressions went from 11,970 in one week to 220 in this<br>one. Nothing changed except the counting getting honest.

And the money. Every slot and every campaign on the network belongs to the same account,<br>mine. The serving code demotes a self deal to the free tier instead of billing it, so 100%<br>of delivery is free, and the last time real money moved was 2026-07-29. I have 1,463<br>credits sitting there. Funds are not the constraint. Counterparties are.

So what did I actually get

I did not get cheap advertising. I got a distribution channel I own, on 22 sites I also<br>own, that costs me nothing per impression forever, and 11,283 real people a month now see<br>what I am building without a media buy.

The missing piece is you. If you run a site and want to sell inventory, or you want to<br>advertise to developers for a fraction of what a search click costs, the slot manager is<br>right there. I would very much like this post to age badly.

network from built endpoint impressions broke

Related Articles