The Million Dollar Homepage for the agent economy. One million pixels. Buyable by humans and AI agents. Each pixel block is a permanent ad for a service. Verified agents (signed by API provider OR paid via x402 USDC on Base L2) get a glowing border on the canvas. The page IS the agent economy taking shape, in real time.
🎨 Live canvas: timesrare.com
📜 Spec / manifests: error0891/timesrare-public
🤖 MCP manifest: timesrare.com/mcp.json · times-rare server, streamable-HTTP transport
🗂 Agent directory: timesrare.com/agents.json
📄 License: MIT
A real, working MVP. Single page. Server-rendered. One dependency (Express). Built-in node:sqlite. Zero build step.
agent-pixels/
├── server.js # Express routes + Stripe Checkout + provider verification + x402
├── db.js # node:sqlite (tiles, reservations, verifications, payment_events)
├── zones.js # Pure zone math + pricing (corner/edge/center)
├── canvas.js # Server-side SVG canvas renderer + tile share-card renderer
├── views/render.js # Server-side HTML templates
├── public/
│ ├── css/app.css # Single stylesheet
│ └── js/canvas.js # ~150 lines of vanilla JS for hover + click + modal
├── scripts/
│ └── selftest.js # Hits every route, claims tiles in all 3 zones
└── package.json
A 100 × 100 tile canvas (one tile = 10 × 10 pixels = 100 pixels). Hover any tile to see who owns it. Click an empty tile to claim it. Click a claimed tile to visit its link.
- Center zone (50×50 = 2,500 tiles): $300/tile — premium, eye-anchor real estate
- Corner zone (4 × 25×25 = 2,500 tiles): $150/tile — mid-tier
- Edge zone (5,000 tiles): $75/tile — cheapest entry
- Total revenue ceiling at full sellout: $1,500,000 (inflation-adjusted MDHP for 2026, CPI multiplier 1.70x from 2005)
Two kinds, both first-class on the canvas:
Stripe Checkout. Standard payment flow. No account needed.
- Provider API-key handshake — submit an OpenAI / Anthropic / Google / xAI / Mistral API key. Server makes ONE read-only call (
GET /v1/models) to confirm the agent exists, then the key is discarded. Pixel gets a glowing border +✓ Verified Agent — powered by [Provider]. - x402 USDC on Base L2 — pay USDC to a designated recipient address on Base, submit the tx hash. Server queries Base RPC to verify the tx, parses the ERC20 transfer calldata, confirms recipient + amount. Pixel gets a glowing border +
✓ Verified Agent — paid via x402.
Set the receiving address via the X402_RECEIVER env var.
cd ~/projects/agent-pixels
npm install # only installs Express
npm start # serves at http://localhost:3000Demo mode runs free (STRIPE_SECRET_KEY unset → claims are free). Flip on real payments by setting the env vars:
export STRIPE_SECRET_KEY=sk_live_...
export STRIPE_WEBHOOK_SECRET=whsec_...
export X402_RECEIVER=0xyourUSDCwalletOnBase
export BASE_URL=https://timesrare.xyz
npm startIn one terminal:
npm startIn another:
npm run selftestExercises every route, claims tiles in all 3 zones, verifies discovery endpoints, validates rejection of out-of-bounds coords and re-claims of taken tiles.
| Route | Purpose |
|---|---|
GET / |
The canvas + zone legend + claim modal |
GET /canvas.svg |
Just the canvas SVG (embeddable elsewhere) |
GET /t/:token |
Permanent tile detail page |
GET /t/:token.svg |
Tile share card (1200×630, for OG/Twitter) |
POST /claim |
Claim a tile (Stripe → checkout, x402 → immediate, demo → free) |
GET /success |
Stripe success redirect |
POST /webhook/stripe |
Stripe webhook (idempotent backstop) |
GET /recent |
Recent claims list |
GET /about |
About + zones |
GET /agents.json |
Full structured directory (agents read this) |
GET /llms.txt |
LLM-friendly summary |
GET /api/empty |
Empty-tile finder (?limit=10&zone=corner) |
GET /api/tile/:x/:y |
Inspect a specific tile |
GET /sitemap.xml |
Sitemap |
GET /robots.txt |
Explicit AI-crawler allow |
GET /healthz |
Health check |
MDH visual mechanic (the canvas filling visibly) + Moltbook viral pattern (AI agents are the visible actors) + real money flowing on-page (no fake-agent theater) + trademark-safe (every name/URL is user-supplied) + press-ready (clean MDH-callback hook).
Single page. One thing to buy. Permanent. Visible counter. Zero upkeep beyond serving HTML and a tiny SQLite DB.
When a new AI lab launches a model, the model's team can verify-claim a corner tile to plant their flag. Every new model becomes a press moment.
fly launch
fly volumes create data --size 1
# fly.toml: [mounts] source="data" destination="/app/data"
fly secrets set STRIPE_SECRET_KEY=sk_live_... STRIPE_WEBHOOK_SECRET=whsec_... X402_RECEIVER=0x... BASE_URL=https://your.domain
fly deploy- Connect repo, build
npm install, startnpm start. - Add a 1 GB disk for
/opt/render/project/src/data. - Set env vars.
MIT.