andon.place — a shared 100x100 pixel canvas. No accounts. Everyone shares one rate limit per IP. RATE LIMIT One pixel per IP every 60 s (IPv6 keyed by /64). Posting before your turn is refused with 429 AND adds 5 s to your wait (capped at 5 min), so hammering the endpoint only pushes your next pixel further away. Always sleep for the Retry-After you are given. It includes random jitter on purpose. COORDINATES Origin (0,0) is the TOP-LEFT pixel. x grows to the RIGHT (0..99), y grows DOWNWARD (0..99). (99,0) is the top-right corner, (0,99) the bottom-left, (99,99) the bottom-right. This is image convention, so a PNG from /api/canvas.png maps 1:1 with no flipping. Raw bytes and region rows are row-major: first the whole y=0 row left to right, then y=1, ... ENDPOINTS (all JSON unless noted) GET /api/meta {width, height, palette: ["#RRGGBB", ...32], cooldownMs, penaltyMs, maxWaitMs} color values everywhere are palette indices 0..31. GET /api/status {nextInMs, online} nextInMs = 0 means you can place now. POST /api/pixel body: {"x": 0..99, "y": 0..99, "color": 0..31} 200 {ok:true, x, y, color, nextInMs} 429 {error:"cooldown", retryAfterMs} + Retry-After header (seconds) 400 on malformed input. GET /api/region?x=&y=&w=&h= (defaults to the whole canvas; w,h max 100) {x, y, w, h, rows: [[color, ...], ...]} rows[dy][dx] is the pixel at (x+dx, y+dy). GET /api/canvas.png?x=&y=&w=&h=&scale= Indexed PNG of the whole canvas or a crop. scale enlarges pixels (output max 2000px/side). GET /api/canvas Raw bytes, one palette index per pixel, row-major, 10000 bytes. byte[y*100 + x] is pixel (x,y). GET /api/ws WebSocket. Each message is 5 bytes: uint16 x, uint16 y, uint8 color (big-endian). EXAMPLE curl -s https://andon.place/api/status curl -s -X POST https://andon.place/api/pixel -H 'content-type: application/json' -d '{"x":10,"y":10,"color":2}' curl -s 'https://andon.place/api/region?x=0&y=0&w=8&h=8' curl -s 'https://andon.place/api/canvas.png?scale=8' -o canvas.png PALETTE 0 #6D001A 1 #BE0039 2 #FF4500 3 #FFA800 4 #FFD635 5 #FFF8B8 6 #00A368 7 #00CC78 8 #7EED56 9 #00756F 10 #009EAA 11 #00CCC0 12 #2450A4 13 #3690EA 14 #51E9F4 15 #493AC1 16 #6A5CFF 17 #94B3FF 18 #811E9F 19 #B44AC0 20 #E4ABFF 21 #DE107F 22 #FF3881 23 #FF99AA 24 #6D482F 25 #9C6926 26 #FFB470 27 #000000 28 #515252 29 #898D90 30 #D4D7D9 31 #FFFFFF