Add-on

Your server, streaming live.

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.

Read-only by contract

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.

Never in the game's way

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.

Plain JSON, no SDK

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.

Same event, two audiences

One event. An embed for them, JSON for you.

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.

Default - only what a community actually wants pinged about.
#server-feedDiscord
馃拵 Rare Drop
RAREDROP Dragon Soul +13 [exc] for Nyx (map 30, 128/128)
馃洅 Sell Post
SELLPOST Kaelen listed Blade +9 [exc]
鈿楋笍 Chaos Mix Success
CHAOS Nyx SUCCESS (rate 80%, cost 1000000)
馃摙 Post
POST Aurel: WTS exc Dragon Soul +13, pm me
馃挵 Shop Sale
PSHOP Ilyra bought Dragon Soul +13 from Kaelen (price 250000000 kind 0)
GET /v1/streamtext/event-stream
data: kind=raredrop
{"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}
data: kind=sellpost
{"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}
data: kind=chaosmix
{"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}
data: kind=post
{"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"}
data: kind=pshopsell
{"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.

What Bridge can tell you

Every entry below is a kind on the feed. The noisy ones are opt-in, so the default configuration stays signal, not spam.

Combat & PvP

  • pk

    Player kill, with both characters, levels and location

  • bosskill

    Configurable boss list - you decide which monsters count

  • mobkill

    Every monster kill (opt-in - it is a firehose)

Loot & Economy

  • raredrop

    Excellent / ancient / socketed ground drops, with the finder

  • pshopsell

    Personal shop sale: buyer, seller, item, price and currency

  • sellpost

    Item listed through the in-game sell-post channel

  • trade

    Completed player-to-player trade

  • chaosmix

    Chaos Machine attempt: success or failure, rate and cost

Progression

  • reset

    Regular reset with the new reset count

  • grandreset

    Grand reset

  • masterreset

    Master reset

  • levelup

    Level gained

Events

  • gameevent

    Blood Castle, Devil Square, Chaos Castle, invasions and Castle Siege starting and ending

  • eventwin

    Who won it, and which instance

  • schedule

    The full event timetable with live countdowns, refreshed every minute

Social & Presence

  • post

    Global /post messages - the ones your community actually wants relayed

  • chat

    Public chat (opt-in)

  • login

    Character came online

  • logout

    Character went offline

  • stats

    Online count, total and per map, every 30 seconds

How it fits together

Three moving parts, one of which is yours.

01

Your GameServer

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.

02

Bridge

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.

03

Your stack

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.

The guarantees that matter

  • No write path into the game - the API only reads.
  • Your game database is never exposed or modified; Bridge keeps its own history file.
  • The GameServer connects out to Bridge, so Bridge does not need a route into your game network.
  • Bridge going down, restarting or being unreachable cannot stall or crash your server.
  • Only your GameServer can publish, using a shared key you set in both configs.
  • You choose what is exported - chat, mob kills and the Discord firehose are all switches.
Integration

An afternoon, not a project

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.

Endpoints

/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 monitoring
Live feed on your site
const 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}`);
  }
};
Backfill and rankings
# 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"
What comes back
{
  "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.

What server owners do with it

A website that looks alive

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.

A Discord that runs itself

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.

Know your server

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.

Spot trouble early

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.

Your server already knows all of this.

Bridge is what lets everyone else see it. Add it to your licence and it is a config file away.

Ready to Build Your Server?

Free 7-day trial, no credit card. Full server files, editors, documentation, and Discord support from day one.