Bridge is a separate, read-only server that sits beside your GameServer and turns everything happening in your world into data you can use.
Rare drops, player kills, boss slains, resets, event starts and winners, shop sales, chaos mixes, global posts, live population - announced in your Discord out of the box, and available to your own site and bots as plain JSON over REST and SSE.
Bridge observes. It has no path back into the game - nothing it exposes can spawn an item, move a player, or write to your game database. Hand the URL to a community dev without losing sleep.
The GameServer hands events off and moves on. Nothing waits on a socket, a webhook, or a slow consumer. If Bridge is down, restarting, or your Discord is rate-limited, the game keeps running exactly as before.
Every event is one flat JSON object with a stable kind. Read it with fetch, curl, a Discord bot, a Python script, or a spreadsheet. No client library to install, no schema compiler, no vendor lock-in.
The Discord relay ships ready to use - point it at a webhook and your community gets the announcements below. The exact same events are on the stream for anything you want to build yourself.
{"t":1754049312,"type":23,"kind":"raredrop","actor":{"name":"Nyx","level":400,"class":16,"map":30,"x":128,"y":128},"item":13,"itemName":"Dragon Soul","itemLevel":13,"exc":1,"anc":0,"map":30,"x":128,"y":128}{"t":1754049429,"type":24,"kind":"sellpost","actor":{"name":"Kaelen","level":382,"class":0,"map":0,"x":141,"y":125},"item":5,"itemName":"Blade","itemLevel":9,"exc":1,"anc":0,"map":0,"x":141,"y":125}{"t":1754049415,"type":22,"kind":"chaosmix","actor":{"name":"Nyx","level":400,"class":16,"map":0,"x":143,"y":125},"mixType":-1,"success":1,"rate":80,"money":1000000}{"t":1754049401,"type":3,"kind":"post","actor":{"name":"Aurel","level":365,"class":16,"map":0,"x":126,"y":128},"channel":1,"message":"WTS exc Dragon Soul +13, pm me"}{"t":1754049388,"type":21,"kind":"pshopsell","actor":{"name":"Ilyra","level":400,"class":64,"map":0,"x":140,"y":125},"target":{"name":"Kaelen","level":382,"class":0,"map":0,"x":141,"y":125},"item":13,"itemName":"Dragon Soul","itemLevel":13,"price":250000000,"priceKind":0}Hover to pause. Same event, both columns - the relay is just one consumer of the stream your own code can read.
Every entry below is a kind on the feed. The noisy ones are opt-in, so the default configuration stays signal, not spam.
pkPlayer kill, with both characters, levels and location
bosskillConfigurable boss list - you decide which monsters count
mobkillEvery monster kill (opt-in - it is a firehose)
raredropExcellent / ancient / socketed ground drops, with the finder
pshopsellPersonal shop sale: buyer, seller, item, price and currency
sellpostItem listed through the in-game sell-post channel
tradeCompleted player-to-player trade
chaosmixChaos Machine attempt: success or failure, rate and cost
resetRegular reset with the new reset count
grandresetGrand reset
masterresetMaster reset
levelupLevel gained
gameeventBlood Castle, Devil Square, Chaos Castle, invasions and Castle Siege starting and ending
eventwinWho won it, and which instance
scheduleThe full event timetable with live countdowns, refreshed every minute
postGlobal /post messages - the ones your community actually wants relayed
chatPublic chat (opt-in)
loginCharacter came online
logoutCharacter went offline
statsOnline count, total and per map, every 30 seconds
Three moving parts, one of which is yours.
Reports what just happened and immediately gets back to the game. Sending is never allowed to block a game tick - under pressure it drops its own backlog rather than slow your server down.
A small separate server you run alongside the others. It authenticates your GameServer with a key you choose, keeps a rolling history in its own database, and serves everything over REST and SSE.
Website, Discord bot, dashboard, whatever you like. Subscribe to the stream, or poll the endpoints. Bridge does not care how many of you there are.
Set a key and a webhook in two config files, start Bridge, and you already have Discord announcements. Everything below is optional - it is there when you want to build on top.
/v1/streamLive SSE feed - every event the moment it happens/v1/feed/historyRecent events from the local history store, filterable by type and time/v1/statusAccounts, characters, guilds and the live online gauge in one object/v1/events/scheduleCurrent event timetable with countdowns/v1/rankings/{kind}resets 路 grandresets 路 killers 路 level 路 guilds 路 online/v1/character/{name}Public character profile/v1/guild/{name}Guild profile with members/v1/castle-siegeCurrent castle owner and siege state/v1/healthUptime check for your monitoringconst feed = new EventSource(
"http://your-host:55981/v1/stream"
);
feed.onmessage = (msg) => {
const e = JSON.parse(msg.data);
if (e.kind === "raredrop") {
announce(`${e.actor.name} found ${e.itemName} +${e.itemLevel}`);
}
};# last 100 events of any kind curl "http://your-host:55981/v1/feed/history?limit=100" # just the boss kills since a timestamp curl "http://your-host:55981/v1/feed/history?type=11&since=1754049312" # top 50 by resets curl "http://your-host:55981/v1/rankings/resets"
{
"t": 1754049312,
"type": 23,
"kind": "raredrop",
"actor": { "name": "Nyx", "level": 400, "class": 16, "map": 30, "x": 128, "y": 128 },
"item": 13,
"itemName": "Dragon Soul",
"itemLevel": 13,
"exc": 1,
"anc": 0,
"map": 30, "x": 128, "y": 128
}Every event carries a unix timestamp, a numeric type, a readable kind, and the actor it belongs to. Extra fields depend on the kind - your consumer switches on kind and ignores the rest.
Drop the live feed on your homepage. Visitors see rare drops and boss kills landing in real time instead of a screenshot from launch week. Rankings and player profiles come from the same API - no second database connection, no cron job scraping your game DB.
Announcements are built in: drops, PKs, bosses, resets, event starts and winners, shop sales and global posts, each as its own embed. Want them split across channels, or a custom bot with reactions and roles? Read the stream and route it however you like.
Population by map every 30 seconds, event participation, economy flow through shops and trades, chaos success rates. Point Grafana, a spreadsheet, or your own dashboard at the history endpoint and answer questions you currently guess at.
Impossible drop streaks, chaos results that do not match your rates, an account trading with itself at 4am. It is all in the feed with names, timestamps and coordinates, waiting for whatever rule you want to write.
Bridge is what lets everyone else see it. Add it to your licence and it is a config file away.
Free 7-day trial, no credit card. Full server files, editors, documentation, and Discord support from day one.