I was extremely tired when I made this game. Not “a little sleepy” tired, but the specific kind of tired where your brain starts proposing ideas like “what if everything just ran itself and I didn’t have to be involved.” Which, in retrospect, is exactly the emotional state that produces idle clickers.
Idle clickers have a weird kind of power. You tap a button. A number goes up. You tap again. Another number goes up, slightly faster this time. Five minutes later, you’ve accidentally built a small economic engine that runs without you, and you’re emotionally invested in a number that did not exist earlier that afternoon.
It’s the smallest possible interaction, but it creates momentum. Fake momentum, sure — but your brain doesn’t care. Line go up. Brain happy. Monkey neuron activated. Science.
This post is a loose devlog about why I made an idle clicker, how it came together over a couple of very low-energy afternoons, and a handful of decisions (and non-decisions) along the way. It’s not a postmortem and it’s definitely not a tutorial. It’s more like marginal notes written on a coffee-stained napkin while I was still kind of tired.
why an idle clicker?
I wanted to make something playful, slightly satirical, and relaxing. Idle clickers are perfect for that. They let you tell a story through accumulation: tiny taps turn into systems, systems turn into networks, and suddenly you’re managing something that feels much bigger than it started.
They also give you permission to not care too much. You can engage deeply or barely at all. You can optimize spreadsheets or just click the shiny thing and watch sparks fly. There’s no wrong way to play, which is secretly very powerful design and also very good for people whose brains are fried.
There’s also something very honest about idle mechanics. You don’t have to commit. You can poke the game for a minute, buy an upgrade, and leave. No punishment. No guilt. No popup saying “your crops have withered because you touched grass.” For busy schedules and low-battery humans, that’s genuinely nice.
Also, and this is important: idle clickers are funny. They’re games about doing almost nothing and feeling accomplished anyway. That’s aspirational.
dead internet theory, but not depressing
Dead internet theory is the idea that a huge chunk of online activity isn’t really human anymore — bots talking to bots, synthetic engagement loops, feeds that look alive but feel hollow. Whether you fully buy into it or not, it captures a real vibe.
In the game: that vibe turns into farming signals. You deploy click-harvesters, trigger surges, and flood the network with activity. Things are always moving. Numbers are always climbing. Something is always happening, even if you’re not sure why.
It’s intentionally exaggerated, but it maps pretty cleanly to the anxiety: constant motion, questionable meaning, dopamine delivered in neat little packets.
Putting this into a clicker made it feel silly instead of bleak. Instead of doomscrolling, you get absurd upgrades and glowing effects. Same weirdness, way less despair. If the internet is haunted, at least the ghosts are neon.
two afternoons, zero patience
The entire game was hacked together over two afternoons. That includes mechanics, UI, effects, audio — everything. There was no grand roadmap. There was no Jira board. There was barely a to-do list. It was mostly just “what if I add this” followed by “okay but what if it does more.”
One of the first decisions I made was not to use a game framework.
I googled for about two and a half minutes. The first thing I found looked like it hadn’t been updated since browsers still asked permission to play audio. The docs felt dusty. It immediately wanted me to care about build steps, plugins, and abstractions. I did not want to care. I was tired. I wanted to make numbers go up and then lie down.
I also really hate external dependencies. Not in a philosophical way — just in a “this is a tiny project and I don’t want to debug someone else’s code at midnight while questioning my life choices” way. Plain JavaScript, the browser, and requestAnimationFrame were more than enough.
That choice alone probably saved the project. Or at least saved my mood.
side quests and curiosity
Some parts of the build were pure curiosity. For example, I briefly wired assets through Cloudflare R2 just because I wanted to try it. There was no strong reason to do this. It did not meaningfully improve the game. It was just me going “huh, I wonder what that’s like.”
After setup, it quietly faded into the background and stopped being something I thought about at all. Which, honestly, is the highest compliment you can give infrastructure. If I forget it exists, it’s doing its job. Like electricity. Or knees.
finding the sound
Music ended up mattering more than I expected. I had a rough sketch of the game running in one browser tab and Pixabay open in another, test-playing the game over and over while cycling through tracks.
Click. Upgrade. Restart. New song. Repeat.
I wasn’t analyzing anything. I wasn’t taking notes. I was just vibing and paying attention to when my brain stopped resisting. Eventually, free phonk caught my attention — gritty, hypnotic, slightly ironic. As soon as it lined up with the clicks and idle drift, the game suddenly had a personality.
It went from “prototype” to “oh, this has a mood.” That moment is magic every time.
That half-playing, half-listening loop is one of my favorite parts of small projects. It feels less like engineering and more like tuning an instrument you don’t quite know how to play.
a tiny peek under the hood
The structure is intentionally simple:
- State: one object holding progress, upgrades, and time.
- Tick loop: a steady heartbeat that advances everything.
- Renderer: a thin UI layer that reacts visually.
The tick loop doesn’t know about visuals. The renderer doesn’t know why values change. They just talk through state and trust each other. Like coworkers who don’t ask too many questions.
That separation made it easy to tweak numbers, break things, and fix them again without everything collapsing. Which happened often. Repeatedly. Sometimes on purpose.
some code, for the curious
Here’s a simplified sketch of the core loop, very close to what actually runs:
const state = {
score: 0,
perSecond: 2.4,
lastTick: performance.now(),
};
function tick(now = performance.now()) {
const delta = (now - state.lastTick) / 1000;
state.lastTick = now;
state.score += state.perSecond * delta;
render(state);
requestAnimationFrame(tick);
}
tick();That’s the heartbeat. Everything else — combos, particles, audio cues, little nudges whispering “just one more upgrade” — sits on top of this.
It’s not fancy. It doesn’t need to be. The magic is in how small systems compound over time. Which is also how burnout works, but, you know, fun this time.
If you want to see the idea in action, play Dead Internet Clicker right here on the site.
what i hope players feel
At the end of the day, this game is about pacing. Short bursts of interaction, slow upward drift, and a light layer of story. It’s something you can check in on, smile at, and move on from.
If it makes you laugh, or briefly think about how strange the modern internet is, or just enjoy watching numbers behave politely, then it did what it was supposed to do.
If you play it, I’d love to hear what you found fun or weird. The best clickers remember to be playful first — clever second — and merciful to tired developers at all times.