Players Engine

Devlog

Building In The Open.

Notes from a solo founder building Players Engine: engineering decisions, closed-beta lessons, and the problems in gaming communities we're trying to fix. Honest, occasionally messy, written as it happens. July 2026 brings a twelve-entry batch of engineering notes — the infrastructure lessons of the past months, from cold starts to keyless deploys, written down while they still sting.

Testing responsive layouts, 360 to 1920

Responsive is a claim until you count it: the viewport-sweep method that audited every route from 360px to 1920px, and why fixes belong to the component layer, not the page.

Read entry →

Keyless deploys with Workload Identity

Retiring the immortal JSON key: short-lived federated CI credentials, per-repo trust — and the cleanup policy that deleted an image production was still running.

Read entry →

Structured logging on a budget

Logs are a product with a bill. JSON events with request context, levels used as cost dials, redaction by default, and what actually gets queried during an incident.

Read entry →

One schema, three jobs

TypeScript evaporates at runtime. How one schema definition produces static types, request validation and API documentation — so the three can never drift apart.

Read entry →

Pub/Sub side-effects and the discipline of idempotency

At-least-once delivery means at-least-twice: idempotency keys, re-fetching truth on retry, and the outage caused by a topic nobody was subscribed to.

Read entry →

Documents and graphs: why we run two databases

A document store for "give me this thing fast", a graph for "how are these connected" — plus the float-versus-integer driver bug that broke pagination at night.

Read entry →

JWT at the edge

Verify authentication once at the gateway, forward verified identity, and let services do authorization only. Two traps included, one of them autobiographical.

Read entry →

One repo, many deployables

A workspace of repositories: superproject plus submodules plus pnpm workspaces, one pragmatic npm exception, and docs that update in the same diff as the code.

Read entry →

Environment variables and secrets without foot-guns

Configuration is dogma territory: validate everything at startup, one config module per service, and secrets that are never allowed a default value.

Read entry →

Connection pooling when every service is tiny

Pooling advice assumes big servers. What changes when instances are tiny and mortal: driver singletons, cached tokens, and surviving the wake-up stampede.

Read entry →

Scale-to-zero is a budget strategy

Scale-to-zero isn't an aesthetic, it's the finance department: what idle really costs, what zero costs instead, and the written criteria for paying for warmth.

Read entry →

Cold starts, warm wallets: tuning Cloud Run startup

The first request after quiet pays the wake-up tax. Boot-order discipline, lazy clients and honest p95s keep it small — without paying for idle.

Read entry →

What the closed beta is teaching me

A small group that trusts you to listen beats a big number that stays silent — and other lessons from the first weeks of real users.

Read entry →

Fake accounts are ruining gaming communities

Bots, engagement farming, smurfing: why trust is the scarcest resource in online gaming spaces, and why it keeps losing.

Read entry →

Running a closed beta with Discord, Sentry and GitHub

The feedback pipeline: forum channels, crash alerts, issue triage, and the weekly rhythm that keeps one person on top of all of it.

Read entry →

Building solo with an AI pair programmer

What AI coding assistants are genuinely good at, where they fail, and how a one-person team reviews code it didn't type.

Read entry →

The stack: one founder, ten microservices

Why a bootstrapped solo project runs on Cloud Run, a document database and a graph database — and what scale-to-zero really buys you.

Read entry →

Why I'm building PlayersEngine

Starting this devlog with the story so far: a gamer's identity is scattered across a dozen launchers, and nobody built it a home.

Read entry →