# services background workers managed by `services.zig`. ## registry simple array of function pointers: ```zig pub const Service = struct { name: []const u8, start: *const fn () anyerror!void, stop: *const fn () void, }; const all = [_]Service{ .{ .name = "event_persister", .start = event_persister.start, .stop = event_persister.stop }, .{ .name = "event_broadcaster", .start = event_broadcaster.start, .stop = event_broadcaster.stop }, }; ``` `startAll()` iterates forward, `stopAll()` iterates reverse. ## event_persister subscribes to broker topic "events" with consumer group "event-persister". - batch size: 100 events - flush interval: 1 second - deduplication: `INSERT OR IGNORE` by event id - retention: 7 days, trimmed hourly lifecycle: spawns worker thread on `start()`, signals and joins on `stop()`. ## event_broadcaster subscribes to broker topic "events" with ephemeral consumer group (unique per server). fans out events to connected WS subscribers on `/api/events/out`. - subscriber capacity: 256 connections - filter support: event prefix, resource_id (parsed with std.json) - drop policy: non-blocking writes, slow clients get disconnected see `src/services/CLAUDE.md` for event flow details.