skip to content
lav.ren / projects / helldivers-bot

helldivers.bot

A live campaign dashboard that caches the history the official Helldivers (2015) API throws away every rotation. Most weeks it sits at ~180 concurrent users, $42.10 lifetime hosting, $0 revenue — by design.

live·2025
Year
2025
Role
Solo developer — design, frontend, backend, DB, infra
Stack
Next.js 16React 19Tailwind CSS v4PostgreSQLPrisma 7BetterAuthSerwist (PWA)Sentry / GlitchTipDockerGitHub Actions

The original Helldivers (2015) still has a community that plays its daily war campaigns against three enemy factions. The game publishes an official API, but it rate-limits hard, answers every request from one origin, and deletes the record of a campaign the moment that campaign resolves.

The helldivers.bot logo — a Helldiver helmet with a sergeant's chevrons

helldivers.bot sits in front of it and keeps what the game throws away. Solo project: design, frontend, backend, database and infrastructure. Idea at 11pm, first commit four days later, in front of players three weeks after that.

The history the game forgets

The official API answers exactly one question — what is happening right now. Once a campaign resolves, the record of it is gone. helldivers.bot polls upstream on a fixed cadence, stores each snapshot, and serves the result back through its own endpoints. So a player can open a campaign from six weeks ago and see how it actually went: which faction pushed where, and when the tide turned. That archive is the reason the site exists. Everything else on it is a way of reading the archive.

A map you can rewind

The centrepiece is a map of every campaign sector in the game, drawn as vector art so it stays sharp from a phone to an ultrawide, coloured by which faction holds what. Click any past event in the log and the map reconstructs the galaxy as it stood at that moment. That reconstruction happens in the browser from data already loaded, so scrubbing back through a week of the war costs nothing — no spinner, no extra requests, no round trip per step. Reading history feels like moving a slider, which is the point.

Reading the war by scrolling

The map and the event log are the same story told twice, so they move together: scroll the log and the map follows whichever card you are looking at. On a phone that falls apart, because the map scrolls off the top and you lose your reference. So on small screens a button pins the map to the top of the viewport while the log keeps scrolling underneath, and the transitions in and out of pinned are handled as explicit states rather than a guess. The history view starts pinned, since anyone reading the past wants the map in frame.

Live without hammering anyone

The dashboard refreshes every ten seconds, which is unremarkable until someone leaves four tabs open. Two things fix that. Open tabs elect one leader between them and only the leader touches the network — the rest read its results, and closing the leader hands the job over without a gap. And a tab that has been in the background refetches the instant you look at it again, so you never read stale numbers. A service worker holds the last good payload, so a dropped connection shows the war as it was rather than an error page.

What it costs to run

It runs on one small VPS shared with three other side projects of mine — analytics, a coding-time tracker, an uptime monitor — which works out at about six dollars a month. Pushing a tag builds a container, ships it, and swaps it on the server; dependency and security scans run on every pull request. There are no ads and no revenue, and that is deliberate. Next up: API keys so other people can build on the archive, alerts you can aim at a single sector, and history exports for the community’s statisticians.

TILL SLIP

  • Ideation2025.07.08 · 11pm
  • First commit2025.07.12
  • Alpha shared with ~12 players2025.07.28
  • Public launch2025.08.01 · Friday
  • Peak concurrent users~180
  • Hosting spend (life)$42.10
  • Ad revenue$0.00

Net profit$0 — by design.

made of

  • 01Next.js 16
  • 02React 19
  • 03Tailwind CSS v4
  • 04PostgreSQL
  • 05Prisma 7
  • 06BetterAuth
  • 07Serwist (PWA)
  • 08Sentry / GlitchTip
  • 09Docker
  • 10GitHub Actions

not returnable · it shipped