COMMUNITY TOOL · 2025 – PRESENT
KillReport
A real-time killmail tracking and analysis platform for EVE Online players, corporations and alliances. It syncs with zKillboard and EVE’s official API (ESI) and is non-commercial under CCP’s license terms.
My role: I handle design, development and operations entirely on my own.
killreport.com- background workers
- ~45
- data models
- 42
- shared API limit
- 50 req/s
- GraphQL subscriptions
- Live
The Problem
Every fight in the game produces a killmail record, and these records never stop flowing. Enriching each record takes many requests to an external API, and that API has a strict rate limit.
Leaderboards and the live feed must stay current without delay; a worker crashing or restarting must not take the site down.
Architecture
Data Sources
zKillboard · ESI
Job Queue
- RabbitMQ
Task Distribution
Workers
- TypeScript
~45 Processes
Data Layer
- PostgreSQL
- Prisma
- Redis
Persistence and Events
API
- GraphQL Yoga
Live Subscriptions
Frontend
- Next.js
App Router
The API server and the workers are separate processes that talk to each other only through Redis, so each can be restarted independently.
What I Built
Live Feed
New killmails appear on the page instantly through GraphQL subscriptions.
Characters, Corporations, Alliances
History, statistics and automatic syncing for every entity.
Leaderboards
Daily counters are updated in the same transaction as the record; no separate scheduled job is needed.
Sovereignty and Map
Tracking of regions, star systems and sovereignty campaigns.
Worker Dashboard
A monitoring screen that shows the state of queues and workers.
EVE SSO
Players sign in with their own EVE account; tokens are refreshed automatically.
Hard Problems I Solved
- 1
A Rate Limit Shared Across Processes
ESI allows 150 requests per second. Because dozens of workers share the same limit, I wrote a common Redis-based limiter and kept it at 50 requests per second as a safety margin.
- 2
Current Leaderboards Without Scheduled Jobs
Daily counters are incremented atomically in the same database transaction that stores the killmail. Leaderboards are never stale and no separate cron job is needed.
- 3
Protecting Tables Outside the Schema
I added a safeguard that stops hand-written tables, created for performance, from being dropped by ORM migrations.
Technologies
- Next.js
- React
- TypeScript
- GraphQL
- Prisma
- PostgreSQL
- Redis
- RabbitMQ
- GitHub Actions
Related Services
Building a similar system? I can work with you from the architecture through to go-live.
Get in touch