ludic/packages
Orkuncakilkaya e8c1d54a96 feat(ludic.telemetry): an event queue batched to a PostHog-shaped endpoint
Events are encoded once into lines held in memory; a batch is the first
lines joined, with the player id put in where a mark stood, POSTed on
Http's own thread every flush_ms or at flush_at events; a failure keeps
its lines and doubles the wait up to backoff_max; the queue is on disk
every save_ms and read back at the next start; off (the enabled port)
drops the request in flight, empties the queue and deletes the file; and
a run that may not send (can_send) keeps nothing. The player id is the
machine's own id (MachineGuid, IOPlatformUUID, /etc/machine-id) hashed
with the game's salt, else random; it lives in the game's id file beside
whatever else the game keeps there.

Ports: TelemetryWorld (can_send, enabled, now_ms, stamp) and
TelemetryTransport (send, poll, drop; unbound: Http). Config is a record
(host, key, path, lib, queue_file, id_file, id_salt, and the timings).
Facts: TELEMETRY_SENT, _FAILED, _ID. Not a System: it runs from a
launcher's first frame, before any world exists.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 05:33:16 +03:00
..
ludic.base feat(ludic.base): Systems is an open registry - def a system from any module 2026-09-25 05:15:56 +03:00
ludic.clock feat(ludic.clock): the hours, the day, the moon and a calendar as a mechanic package 2026-09-25 04:20:47 +03:00
ludic.core feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
ludic.dungeon feat(engine): #90 atlas-aware Sprite component, #91 become from listeners, 0.3.x ergonomics batch 2026-09-04 01:36:08 +03:00
ludic.effects feat(ludic.effects): timed modifiers as a mechanic package; ludic.base's q_new is queue_new 2026-09-25 04:14:09 +03:00
ludic.gameplay refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
ludic.inventory feat(ludic.inventory, ludic.wallet): the pack and the purse as mechanic packages 2026-09-25 04:29:17 +03:00
ludic.npcai refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
ludic.platformer refactor(runtime,packages,examples): named constants, package enums, idiom sweep 2026-09-05 01:12:26 +03:00
ludic.prefs feat(lang): L7 memory is safe unless it says unsafe 2026-09-24 12:53:27 +03:00
ludic.render3d feat(ui): ludic.ui is a UI framework - input, controls, render3d backend, the CSS a game needs 2026-09-24 17:26:09 +03:00
ludic.rpg feat(lang): L7 memory is safe unless it says unsafe 2026-09-24 12:53:27 +03:00
ludic.shooter feat(lang): L4 type checker between parse and emit 2026-09-24 01:34:49 +03:00
ludic.telemetry feat(ludic.telemetry): an event queue batched to a PostHog-shaped endpoint 2026-09-25 05:33:16 +03:00
ludic.tracks feat(ludic.tracks): prints, their age and reading them as a mechanic package 2026-09-25 04:54:43 +03:00
ludic.ui feat(ui): ui_scale and ui_box, on-submit, zoom (and a length over a length in calc), on-hold 2026-09-25 03:31:38 +03:00
ludic.wallet feat(ludic.inventory, ludic.wallet): the pack and the purse as mechanic packages 2026-09-25 04:29:17 +03:00
ludic.weather feat(ludic.weather): spells of weather as a mechanic package 2026-09-25 04:48:38 +03:00