Work, not adjectives
$ tail -n 4 incidents.log · creator platform, per-minute video billing — LiveKit in production
2025-12
symptom: per-minute billing ticking before anyone was in the room
cause: billing auto-started on call creation, not on participant join
fix: state machine keyed to room presence — billing starts only when both sides are in
2026-01
symptom: client kept paying after the other side dropped mid-call
cause: no pause semantics on disconnect
fix: pause/resume tied to room presence; paused time excluded from the charge
2026-05
symptom: scheduled calls dying with room_unavailable the moment someone opened the call screen early
cause: issuing a join token flipped call state; the room monitor saw an empty room and finalized the call
fix: state transitions driven only by LiveKit participant_joined webhooks — not by token issuance
2026-05
symptom: a cancelled call could still be joined — /join-token happily issued a valid LiveKit access token
cause: no finalized-state check before token issuance
fix: 410 for cancelled/completed/no_show; tokens only for live states
I’m a backend and infrastructure engineer: Node and Go — 3.5 years in production, the last two running LiveKit/WebRTC for a creator platform with per-minute billing — SFU scaling, SIP bridging, voice agents, egress pipelines. GitHub: github.com/lfazliev.
Public work: livekit-prometheus-alerts — the missing Prometheus rule set for self-hosted LiveKit (954 rules in awesome-prometheus-alerts, zero for LiveKit) · livekit-idle-room-reaper — kills zombie rooms and orphaned egress.