TFT match tracker for Meeps. Polls the Riot TFT API for linked users' recent matches and posts new results to Meeps.
Conqueror → polls Riot TFT API → posts to Meeps API → Meeps stores & broadcasts
↓
PostgreSQL (deduplication)
Copy .env.example to .env and configure:
| Variable | Required | Description |
|---|---|---|
RIOT_API_KEY |
Yes | From Riot Developer Portal |
CONQUEROR_DATABASE_URL or DATABASE_URL |
Yes | PostgreSQL for match deduplication |
MEEPS_API_URL |
Yes | Meeps backend URL (e.g. https://meeps-backend.railway.app) |
CONQUEROR_WEBHOOK_SECRET |
Yes | Shared secret for Meeps API auth |
POLL_INTERVAL_MS |
No | Poll interval (default: 60000 = 1 min) |
Migrations run automatically in two ways:
- preDeployCommand – In
railway.json,npm run migrateruns before each deploy. That executesscripts/run-migrations.js, which applies any pending migrations. - On server start – When the app starts,
index.tscallsrunMigrations({ silent: true }). So migrations run again on startup if they weren’t run earlier.
Both use the same migration runner, which only applies migrations that haven’t been applied yet (via schema_migrations), so running them twice is safe.
npm install
npm run build
npm startFor development:
npm run devRun tests:
npm test- GitHub Actions – Tests run on push and pull requests to
main/master(.github/workflows/test.yml). - Railway – Tests run as part of
npm run buildbefore deploy; a failing build blocks deployment.
- Create a new Railway project.
- Add a PostgreSQL service.
- Deploy this repo as a service.
- Set env vars in Railway dashboard. Migrations run automatically on each deploy.
Conqueror expects:
-
GET /api/conqueror-linked-users – Auth via
X-Conqueror-Secret. Returns users withleague_username. -
POST /api/conqueror-notify – Auth via
X-Conqueror-Secret. Payload:
{
"gameName": "FM Stew",
"tagLine": "MEEPS",
"matchId": "EUW1_1234567890",
"placement": 1,
"comp": "K/DA Ahri, True Damage",
"gameMode": "ranked",
"compName": "Void Longshot"
}gameMode: "normal" | "ranked" | "double_up"
compName (optional): Human-readable comp name (e.g. "Void Longshot", "Arcanist"). Conqueror infers from traits; Meeps prefers this over its own inference when present.