Building A Graveyard

It started with a groan.

My kids had been saying “six-seven” for months — that skibidi thing, the one where you hold up six fingers then seven, the one that made no sense to me but made perfect sense to them. And then, as suddenly as it arrived, it was over. I said it Thursday morning in the kitchen, making breakfast before school, and my son hit me with the look. “Dad. That’s a dead meme. Nobody uses it anymore.”

Dead memes. Kids might cringe at them, but for those of us who lived through the 90’s, aughts, twenty-teens, and pandemic years, we remember them like old songs we used to love — with a mix of fondness and embarrassment, a wince of recognition when they come on shuffle, and a strange grief when we realize we can’t remember the last time we heard them unironically. The internet is a graveyard of these things: formats that defined an era, inside jokes that united millions of strangers, images that got run into the ground by brands and parents and eventually, mercifully, died. But there’s no place to visit them. No headstones — no way to pay your respects.

I checked. Surely someone had built this already. Know Your Meme documents the history, but it’s an encyclopedia, not a cemetery — and besides, you can barely even see the site anymore. It’s so incredibly ad-laden that the actual content feels like an afterthought, popups and autoplay videos fighting for every pixel of screen real estate. (I get it. Who even browses to websites anymore?) I wanted tombstones. I wanted obituaries. I wanted a place where you could pour one out for Dat Boi or finally admit that Rage Face had it coming.

By Thursday afternoon, I had a domain name — ripthismeme.com — and was deep in conversation with Claude about what this thing should actually be. Not just the what, but the why: Nuxt 4 because a friend swore by it, Strapi as a headless CMS so I could manage content without hand-editing JSON for the rest of my life, PostgreSQL sitting in between doing its thing and never complaining, the whole stack containerized in Docker so I could spin it up anywhere. These weren’t arbitrary choices. I wanted to self-host, to own my data, and to avoid the vendor lock-in that makes you rebuild everything when some startup pivots or gets acqui-hired. An off-hand mention to my brother got: “Why didn’t you just get ripthis dot meme?” I guess custom TLDs are what all the cool kids are using these days — I didn’t realize how dated even dot com had become.

The feature set evolved in real time. I’d started with a simple idea — a “Press F to Pay Respects” counter, itself a beautifully dead meme — but within hours it had grown into something richer. What if people disagreed that a meme was dead? What if they wanted to vote for resurrection? What if, instead of free-form comments that would require moderation until the heat death of the universe, users could pick from a curated list of snarky epitaphs and sign them with their initials and an emoji? The system became three buttons: Press F to Pay Respects, Press S to Throw Shade, and Press R to Resurrect. Each one lets you choose a phrase — “Gone but not forgotten” or “Good riddance” or “I use it all the time!” — and leave your mark. Constrained expression. Community without chaos.

Then came the part where I had to actually build the thing.

I’ve been poking at computers since DOS in 1988, Windows since 3.0, and I’ve spent enough time in PowerShell and bash at work to have opinions about both. I run Arch Linux as my daily driver — a choice I made in 2014 because I figured if I could survive Arch, DEB and RPM distros would seem easy in comparison. But that also meant my development environment was a Flatpak-sandboxed VSCodium that couldn’t see Docker, which meant Claude Code couldn’t see Docker, which meant the first chunk of troubleshooting involved me copying and pasting terminal output like some kind of medieval scribe. Eventually I figured out the incantation — flatpak-spawn --host bash -c to break out of the sandbox, permissions overrides to access the Docker socket — and suddenly Claude Code could read logs directly, run commands, iterate without waiting for me to be the middleman.

That’s when things got fast, and also when things got weird.

Strapi 5 has opinions about folder structure, and Claude Code had confidently created the wrong one. All seven content types — memes, categories, eras, respects, respect options, meme submissions, site settings — were nested inside a single meme folder instead of each living in their own API directory. The admin panel showed nothing. No content types. No error messages. Just emptiness. We added controller files, service files, route files, index exports. We converted TypeScript to JavaScript and back again. We cleared caches, rebuilt containers, checked permissions. Maybe an hour passed, but it felt like many. And then, finally, the revelation: Strapi 5 auto-generates CRUD endpoints from schema files alone. All those extra files we’d been adding were actually breaking things. We deleted everything except the schemas, restarted, and watched the content types appear like magic. The fix was subtraction.

The images were their own saga. I needed tombstone portraits for each meme, and since I couldn’t just grab copyrighted images, I turned to ChatGPT’s image generation. I spent hours refining prompts, deleting conversation history so it wouldn’t “learn” from failed attempts, and eventually landed on something that worked reliably — except for the memes it refused to generate. Surprised Pikachu was blocked, presumably because Nintendo. Disaster Girl was blocked because my prompt mentioned “young girl,” even though “success baby” worked fine. Heath Ledger’s Joker was blocked too, that immortal “and everyone loses their minds” frame. RIP Heath. A real death, in a project about fake ones.

The backgrounds on those AI-generated images were a nightmare of inconsistent off-whites that no amount of ImageMagick color-matching could fix. Then I found rembg, an open-source AI tool that does background removal through actual image segmentation, and suddenly the pipeline was clean: rembg strips the background, ImageMagick converts to WebP, Strapi generates the responsive sizes. An AI tool to process AI-generated images for a site built with AI assistance. We’re through the looking glass.

By Saturday night, I had a working site with three dozen memes, each with researched birth and death dates, cause of death, Know Your Meme links, and obituaries written in a tone somewhere between eulogy and roast. Harambe was the template — sincere enough to honor what the meme meant, absurd enough to acknowledge what we’re all doing here. “He did not die so that we could forget,” his obituary reads. “He died so that we could remember — dicks out, forever.”

Sunday was deploy day: a DigitalOcean droplet, nginx as the reverse proxy, Let’s Encrypt for SSL. I’m used to building sites being far more grueling and manual, so I wasn’t in a rush — I was enjoying the process. The images wouldn’t load on my phone at first. Everything worked on desktop, but mobile just showed broken thumbnails. The culprit was a hardcoded localhost:1337 Claude had decided made perfect sense in development (but no sense in production). We found it, fixed it, and nobody knew the site existed yet anyway. Just me, learning. A few other bugs were dispatched similarly.

Somewhere in there, I wrote terms and conditions. Comprehensive, legally-grounded terms and conditions for a satirical meme graveyard. Copyright and fair use provisions citing the actual statute. DMCA takedown procedures with all the required elements. A privacy policy that could fit on an index card because we genuinely don’t track anything. A disclaimer noting that we are not liable for “emotional distress from learning your favorite meme is dead, arguments with friends about whether a meme is ‘really’ dead, or existential crises about the fleeting nature of internet culture.” Claude called it “a legal fortress protecting a graveyard full of dead memes.” The absurdity is the point.

I shared the link Sunday evening: “You started building this on Thursday?” The answer is yes and no. Yes, the code was written in four days. But I’ve been tinkering with this stuff for a long time, self-taught and mostly fumbling through, and that background meant I could catch Claude Code when it started heading down a dead end.

The resize saga was a perfect example. From the beginning, we’d been using ImageMagick to resize images from 1024px squares down to 400px for the tombstone portraits. It wasn’t until later, when I asked about making smaller thumbnails, that Claude Code casually mentioned Strapi generates four responsive sizes automatically. We’d been doing extra work the whole time. Easy enough to fix — we amended the skill, stopped resizing manually. But then Claude Code kept ‘remembering’ the old 400px resize anyway. I’d remind it, it would stop, and then a few prompts later it would creep back in. Context bloat, maybe, or memory weightings that favored older patterns. Lesson learned: sometimes you just need a fresh session.

I also found unexpected value in talking through the project with Claude on the web interface — a different instance, unburdened by the implementation particulars. It wasn’t stuck in the weeds of Strapi folder structures and curl commands. Some of its earnest suggestions shifted the design in ways that Claude Code, deep in the code, couldn’t have seen. Two sets of eyes, even if both sets were technically Claude’s.

And here’s where the dreadful elation lives. I’ve had projects on my to-do list for years that I’m finally checking off, because the feedback loop between idea and implementation has collapsed from weeks to days. But the next model will be bigger, better, able to do more. Someone will eventually say “I want a meme graveyard where you can visit the graves” and boom — this four-day journey will look positively Tolkien-esque in comparison. The partnership, the iteration, the sessions where I learned as much as I built — to me, that’s not friction to be optimized away. That’s where the meaning lives.

My kids had friends sleepover Saturday night, and one of our guests looked at the my still-bare-bones homepage and said “the knife in the title bar should stab.” Why not? So now, when you hover over it, it does a quick stabbing motion and some CSS blood appears. My own kids were impressed — in the maritime sense, conscripted into service — as testers any time they happened to be on the first floor. “Hey — come check this out!” They groaned, but they checked. They had opinions. My own 67 kids helped build the 67 graveyard.

I know what this sounds like. The world is on fire. People are in the streets protesting. The news is a horror show I read obsessively even when I tell myself to stop, Reddit open in another tab, doomscrolling between deployments. And I spent four days building a meme graveyard? I could have been doing something that mattered. I could have been organizing, or donating, or at least doing something other than refreshing the feed.

But I think that’s why I needed to build something. Anything. A small, absurd thing that I could point to and say: I made this. It exists because I decided it should. In a world where so much feels out of my control, there’s something stubborn and necessary about creating anyway. Even if it’s just a place to bury dead memes.

The graveyard is open now. The memes are dead. And somewhere in the collection, there’s a dog sitting in a burning room, coffee cup in hand, telling himself everything is fine.

This is fine.