SuperShopaholic: a game about pointless consumption, where the license is the point
I built a tiny browser game called SuperShopaholic — "the award-winning experience of wanting more." You steer an infinite shopping cart through an infinite mall, swooping falling goods into a cart that never fills. There is no finish line. There never was. The speed only ever increases.
I had this idea for a while, my notes say early 2023, but never got around to actually implementing the idea. Mainly because I have a million other ideas, and this one would be a lot of work for a pretty silly idea. However, during this period agentic coding happened, and the sillyness of an idea is no longer a deciding factor :)
The idea is a sociopolitical statement disguised as a game, and the joke lives in the rules, not the dialogue. The whole thing — from deciding to actually do it, to a playable URL — happened in one short session with an AI coding agent. The most interesting decisions turned out to be the license and the messy middle of actually publishing it.
Play it here. The source is one HTML file.

Figure 1: The start screen. There is no finish line. There never was.
The mechanical emptiness is the message
Plenty of "message" games put the politics in the text — a sad cutscene, an earnest paragraph. I wanted the mechanics themselves to be the statement. So:
- Endless auto-scroll, accelerating forever. Consumption never stops and never satisfies.
- Grab goods for money. Emoji products (👜 ⌚ 💍 📱 …) fall down the mall; catch them in the cart for a ka-ching.
- Power-ups are the fantasy, not the relief. Grab a 💳 GOLD card or a rarer 🖤 BLACK card and you shop faster, with a 2× or 4× money multiplier. The reward for consuming is the ability to consume harder.
- Status symbols. Periodic "BUY NOW" events offer a 🏎️ Ferrari, 🛥️ Yacht, 🏰 Mansion, or 🛩️ Private Jet. Buy one and it joins your trophy shelf — and then absolutely nothing changes. You keep shopping.
- The STATUS meter fills up and is labelled, right there on screen,
(it doesn't do anything). The treadmill of prestige, stated plainly. - No fail state. You literally cannot lose. That's the purest expression of the thesis — there's no losing the game because there was never anything to win.

Figure 2: Falling goods, a money counter that only goes up, and the STATUS meter helpfully labelled "(it doesn't do anything)".

Figure 3: A GOLD card boost active — the reward for consuming is consuming faster.

Figure 4: A "BUY NOW" event. Afford the Ferrari and it joins your trophy shelf; then nothing changes.
I considered a "FOMO / MISSED!" variant where dropped goods punish you, but rejected it. Punishment implies stakes, and stakes imply a goal. Pure endlessness is the point.
One distinction I want to be precise about, because it later drove the license choice: this is anti-consumerism, not anti-capitalism. The critique is about the emptiness of endless wanting, not about markets as such.
Boring tech was the right call
The entire game is a single self-contained .html file — about 520 lines
— that you open in any browser. No npm, no bundler, no framework, no
build step, no assets.
<canvas>2D rendering at a fixed virtual resolution (480×800), scaled to fit any screen.- Vanilla JS in one IIFE: a small state machine (MENU / PLAY / PAUSE) and a delta-clamped game loop.
- All sound is synthesized at runtime via the Web Audio API — oscillators plus a noise buffer give the ka-ching, the whoosh, the power-up arpeggio, the purchase fanfare, the "declined" tone. Zero audio files.
- Input is keyboard (←/→, A/D, P to pause) plus pointer/touch drag for mobile.
- Emoji are the art. No sprite sheets, instantly readable, and they fit the disposable-consumer-goods vibe perfectly.
The constraint — "whatever's simplest" — produced something genuinely portable. And a single un-bundled file is itself a small statement: this is software you can read, copy, and host anywhere, with no friction and nothing hidden.
Building it with an agent
The session had a clean arc. I pitched the concept — a sociopolitical statement that's also a real, fun game — and we aligned on the thesis before any code. The one design question worth settling up front was fail-state versus pure endlessness; we went with endless. I added the "shopaholic dream" pickups (the gold and black cards) and the status-symbol events, and those folded neatly into the satire: every reward just lets you consume faster.
Then the whole self-contained file got written in one shot, JS syntax
checked with node --check, and opened locally. It worked first try and
was — to quote my own reaction at the time — pretty funny.

Figure 5: $21,544, a BLACK card x4 boost, and a trophy shelf full of yachts, mansions and jets along the bottom. You bought it all, and nothing changed.
The messy middle (publishing is never magic)
Getting it live is where the honest texture is. The plan was GitLab
Pages from a .gitlab-ci.yml, repo created via the glab CLI. The
speed bumps, in order:
glab repo create --sourcewasn't supported in my installed version, so I fell back to creating the project, adding the remote manually, and pushing.- The first Pages pipeline failed with
ci_quota_exceeded— I'd burned through the free CI minutes. Bought some compute, re-ran, success. - The site still redirected to a sign-in page. The cause:
pages_access_levelwasprivateeven on a public project, and it couldn't be flipped via the API ("not allowed for the project visibility level") because it's tied to account-level identity verification on GitLab.com. Resolved on my side, after which the URL finally served a plain HTTP 200 and the game.
None of this is hard, exactly, but it's the part a sanitized demo skips. "Idea to live URL in an afternoon" is true; it just wasn't frictionless.
The license is the point
When it was working I looked at the license I'd scaffolded — MIT — and it felt itchy. I prefer copyleft, and for a piece that's explicitly about enclosure, the license is a place to actually say something. So I asked: what's the strongest genuinely-free statement here?
I weighed the options:
- AGPLv3 — the strongest properly-free copyleft. Its section 13 network clause closes the "SaaS loophole": anyone who hosts a modified version must share their source with players.
- GPLv3 — strong, but for a web-hosted game the network angle is weaker, since use isn't distribution.
- GPLv2 — historic, no network provision.
- CC BY-SA — activist vibe, but a poor fit for software (no patent/source mechanics).
- Anti-Capitalist / Hippocratic / CNPL — the loudest statement, but these aren't OSI/FSF-free; they discriminate against fields of endeavour. Using one would have been an ironic self-contradiction for a copyleft piece.
The deciding line was my own refinement of thought: I'm not actually anti-capitalist, I'm just anti-consumerism. That rules out the "anti-capitalist license" theatre and points straight at AGPLv3 — mainstream, genuinely free, and resistant to enclosure without making any claim against markets. A perfect match for a hosted web game.
So I relicensed to AGPL-3.0-or-later: full official license text, an AGPL header in the HTML, a README section explaining the reasoning, and — honouring section 13's "prominently offer source" requirement to network users — a start-screen link reading "Free software (AGPLv3) — source: …".
The punchline writes itself:
This game critiques the enclosure of things; its license resists the enclosure of itself.
You can remix it, but you can never lock it away — not even behind a server. The source is always one click away.
Links
- Play: supershopaholic-8fb5ab.gitlab.io
- Source: gitlab.com/jave/supershopaholic
- License: AGPL-3.0-or-later