One Cloudflare Worker, one route:
GET /avatar/<name>
<name> is anything that stands for somebody — a username, an email, an id, a
Gravatar hash — and the same name always renders the same blobatar. Parameters
are named as the library names them (size/s, background, hue, tone,
expression, title), and Gravatar's d, f and r are accepted and
ignored so that an existing Gravatar URL works by changing the host alone.
GET /avatar/ returns the full parameter list; so does any other path, with a
404.
The button clones this directory into your Git account, deploys it to yours,
and hands back https://blobatar-api.<your-subdomain>.workers.dev. Every push
to your clone redeploys it. To attach your own hostname, add it in the
dashboard under Workers → your Worker → Domains & Routes, or as a routes
entry in wrangler.jsonc.
By hand, if you would rather:
bun install
bunx wrangler deployNothing, at any traffic a normal application produces. The Workers free plan
allows 100,000 requests a day and 10ms of CPU per request; rendering a blobatar
measures 12µs and the response is 357 bytes gzipped. There is no database, no
bucket and no bound resource of any kind — the avatar is a pure function of the
URL, which is what lets Cache-Control push most of the traffic off this Worker
and into caches nobody pays for.
Run from the repository root, so the library is built first:
bun api # wrangler dev → localhost:8787/avatar/alainThen the tests, which need that same build:
bun --filter blobatar build
bun --filter blobatar-api testUnlike apps/site and apps/demo, this app has no blobatar/* tsconfig
aliases to the library source. It resolves the package the way a fresh clone
does — through exports, at the version in package.json — because that is
what anyone pressing the button will run.
avatar.ts and params.ts here are the endpoint, and apps/site imports them
rather than holding a copy: blobatar.dev serves this Worker with the landing
page attached, and run_worker_first scopes it to /avatar/* there. The two
deployments differ only in what happens off that path — the site, or the help
text above. See ADR-0005.