H. Walczak

Projects, experiments & other distractions.

csgogsi

COUNTER-STRIKE / GAME STATE LAB

The game changes. Your overlay follows.

Play a scripted GSI sample and watch incoming updates drive a broadcast overlay. Follow the round, inspect the payloads, and see the events emitted by csgogsi - all in your browser.

Scripted sample · ready to explore · real csgogsi output0:00 / 0:32

Inside the broadcast

de_mirage · round 20
NORTH10
Buy time0:03
EMBER9
WAITING FOR THE PLANT◇
Fable100 HP
m4a1$1,800
North100 HP
m4a1$2,000
Echo100 HP
m4a1$2,200
Moss100 HP
m4a1$2,400
Vale100 HP
m4a1$2,600
Ember100 HP
ak47$2,800
Flint100 HP
ak47$3,000
Rook100 HP
ak47$3,200
Ash100 HP
ak47$3,400
Kite100 HP
ak47$3,600
OBSERVINGEmber30 / 90 ammo87 armor · no kit

Events, as they happen

select to inspect

Callbacks emitted by csgogsi. Select one to revisit its triggering update.

  1. Press play. The first phase change starts the story.
Events and state share the same sample timeline.

Stream activity

scripted payload cadence
1 updates replayed0 updates/s playback6.3 KiB payload0 ms since update · sample time

Inside the update

Update #1 · 0.00s · highlighted fields changed since the previous update.

Incoming GSI JSON

{
  "state": "carried",
  "position": "100, -900, 0",
  "player": "sample-5"
}

After CSGOGSI.digest()

{
  "state": "carried",
  "position": [
    100,
    -900,
    0
  ],
  "player": {
    "steamid": "sample-5",
    "name": "Ember",
    "defaultName": "Ember",
    "observer_slot": 6,
    "stats": {
      "kills": 13,
      "assists": 2,
      "deaths": 7,
      "mvps": 1,
      "score": 20
    },
    "weapons": [
      {
        "name": "weapon_ak47",
        "paintkit": "default",
        "type": "Rifle",
        "ammo_clip": 30,
        "ammo_clip_max": 30,
        "ammo_reserve": 90,
        "state": "active",
        "id": "weapon_0"
      }
    ],
    "state": {
      "health": 100,
      "armor": 87,
      "helmet": true,
      "defusekit": false,
      "flashed": 0,
      "smoked": 0,
      "burning": 0,
      "money": 2800,
      "round_kills": 0,
      "round_killhs": 0,
      "round_totaldmg": 0,
      "equip_value": 4200,
      "adr": 0
    },
    "position": [
      -50,
      -900,
      0
    ],
    "forward": [
      1,
      0,
      0
    ],
    "team": {
      "score": 9,
      "logo": null,
      "consecutive_round_losses": 1,
      "timeouts_remaining": 3,
      "matches_won_this_series": 0,
      "side": "T",
      "name": "EMBER",
      "country": null,
      "id": null,
      "orientation": "right",
      "extra": {
      }
    },
    "avatar": null,
    "country": null,
    "realName": null,
    "extra": {
    }
  },
  "site": null
}

INSIDE THE UPDATE

From game state to your next overlay.

GSI payload → CSGOGSI.digest() → state + events

These scripted spectator samples run through the real csgogsi library. Select an event to pause at its triggering update. The inspector shows complete payloads and normalized output, with changed fields highlighted.

A live integration needs a configured game client and an HTTP receiver that forwards updates to your browser. This showcase runs locally with sample data; no game connection is required.