[{"data":1,"prerenderedAt":207},["ShallowReactive",2],{"post-game-of-slop":3},{"id":4,"title":5,"body":6,"date":191,"description":192,"excerpt":193,"extension":194,"meta":195,"navigation":196,"path":197,"seo":198,"stem":199,"tags":200,"til":205,"__hash__":206},"posts\u002Fposts\u002Fgame-of-slop.md","i made conway's game of life but every cell is AI slop",{"type":7,"value":8,"toc":183},"minimark",[9,21,24,27,30,33,38,41,44,68,76,79,85,91,94,96,100,109,112,115,118,120,124,136,139,146,157,160,162,165,168,171],[10,11,12,13,20],"p",{},"so i built ",[14,15,19],"a",{"href":16,"rel":17},"https:\u002F\u002Fslop.avrdu.de",[18],"nofollow","game of slop",".",[10,22,23],{},"it's conway's game of life, except instead of cells being alive or dead, they're different types of AI-generated content fighting for control of the internet.",[10,25,26],{},"each one has its own survival rules, and they eat each other in a food chain. SEO spam consumes AI art. clickbait outcompetes SEO spam. AI influencers co-opt clickbait. and so on, in two interlocking cycles that keep the ecosystem from collapsing into a monoculture.",[10,28,29],{},"it looks like windows 98 because the internet peaked in 1998 and it's been downhill ever since.",[31,32],"hr",{},[34,35,37],"h2",{"id":36},"the-rules","the rules",[10,39,40],{},"classic game of life is binary. alive or dead. three neighbors to be born, two or three to survive. elegant, boring after five minutes.",[10,42,43],{},"game of slop has eight species competing in a shared grid. each type has:",[45,46,47,56,62],"ul",{},[48,49,50,51,55],"li",{},"a ",[52,53,54],"strong",{},"survival range"," - how many friendly neighbors it needs to stay alive",[48,57,50,58,61],{},[52,59,60],{},"birth condition"," - what the neighborhood needs to look like for a new cell to appear",[48,63,50,64,67],{},[52,65,66],{},"predator"," - another type that converts it when enough of them surround it",[10,69,70,71,75],{},"the predation mechanic is what makes it interesting. cells don't just die - they get ",[72,73,74],"em",{},"converted"," to their predator type. so you get these waves of content washing over the grid, one trend replacing another, like watching twitter in real time but at 200ms per tick.",[10,77,78],{},"there are two food chains running simultaneously:",[10,80,81,84],{},[52,82,83],{},"the content pipeline:"," SEO spam → AI art → AI influencers → clickbait → SEO spam",[10,86,87,90],{},[52,88,89],{},"the tech pipeline:"," ChatGPT essays → AI code → AI music → deepfakes → ChatGPT essays",[10,92,93],{},"the result is a grid that never stabilizes into something boring. types expand, hit their predator, collapse, seed new growth. it's the dead internet theory as a screensaver.",[31,95],{},[34,97,99],{"id":98},"the-ui","the ui",[10,101,102,103,108],{},"the whole thing is styled like windows 98. title bars, beveled borders, taskbar with a start menu and clock, the works. ",[14,104,107],{"href":105,"rel":106},"https:\u002F\u002Fjdan.github.io\u002F98.css\u002F",[18],"98.css"," does most of the heavy lifting - it's a simple CSS to make your UI look like windows 98 duh.",[10,110,111],{},"there's a boot sequence when you first load the page. a whole fake BIOS. then a splash screen with a progress bar. because commitment to the bit matters.",[10,113,114],{},"the taskbar has a scrolling news ticker that i used AI to generate the random ass news for.",[10,116,117],{},"CRT scanlines are on by default because it's a vibe.",[31,119],{},[34,121,123],{"id":122},"the-tech","the tech",[10,125,126,127,131,132,135],{},"react, typescript, zustand for state management, vite + bun for the build. the simulation engine and canvas renderer are pure typescript - no react in the hot path. the engine writes to zustand stores directly via ",[128,129,130],"code",{},"getState()",", and the canvas runs on ",[128,133,134],{},"requestAnimationFrame"," polling a render version counter. react never re-renders for grid updates.",[10,137,138],{},"im actually applying for react positions and i need to keep my skill up. even with the ai stuff. otherwise pure JS would've been enough here.",[10,140,141,142,145],{},"the grid is a double-buffered ",[128,143,144],{},"Uint8Array"," - two flat arrays, one for current state, one for next state, swap pointers after each tick. cache-friendly and zero-allocation per tick.",[10,147,148,149,152,153,156],{},"rendering uses ",[128,150,151],{},"ImageData"," for small cell sizes (write directly to the pixel buffer) and ",[128,154,155],{},"fillRect"," + cached emoji bitmaps for larger sizes. at 16px cells you get actual emoji rendered on each cell which looks surprisingly good.",[10,158,159],{},"the whole thing is ~235KB gzipped.",[31,161],{},[34,163,164],{"id":164},"why",[10,166,167],{},"because the internet is filling up with AI-generated garbage and the only appropriate response is to make more AI-generated garbage, because it's hella fun (and i've got free claude subscription).",[10,169,170],{},"this game is kind of like the actual internet, except this one runs in a browser tab and doesn't try to sell you anything.",[10,172,173,177,178],{},[14,174,176],{"href":16,"rel":175},[18],"slop.avrdu.de"," · ",[14,179,182],{"href":180,"rel":181},"https:\u002F\u002Fgithub.com\u002Favr6ude\u002Fgameofslop",[18],"source on github",{"title":184,"searchDepth":185,"depth":185,"links":186},"",2,[187,188,189,190],{"id":36,"depth":185,"text":37},{"id":98,"depth":185,"text":99},{"id":122,"depth":185,"text":123},{"id":164,"depth":185,"text":164},"2026-03-17","so i built game of slop.",null,"md",{},true,"\u002Fposts\u002Fgame-of-slop",{"title":5,"description":192},"posts\u002Fgame-of-slop",[201,202,203,204],"project","react","ai","gamedev",false,"CUo1ICopxNzCQQy7mkpmI7zNlP7c9-iTyCGgrUtApgw",1790348197255]