Skip to main content

Stats Crawler Control

Steer the public stats crawler - which live channels it discovers, and the curated list of channels to crawl. This is a platform-operator surface: it controls the crawler globally, not a single account's data.

Access​

Reaching the Admin app requires admin:access. The crawler controls are then gated on granular, admin-scope (platform-operator) permissions, seeded to the system_admin admin role (ZAF-725). They are enforced against the caller's admin role (require_admin_permission / AdminPermissionGuard), so an account-scope role grant never satisfies them:

ControlPermission
View the scope modecrawler:scope-read
Change the scope modecrawler:scope-edit
View the watchlistcrawler:watchlist-read
Add a watchlist channelcrawler:watchlist-create
Remove a watchlist channelcrawler:watchlist-delete

Every change is written to the operator audit log (crawler:scope_changed, crawler:watchlist_added, crawler:watchlist_removed).

Scope modes​

The scope bounds which live channels the crawler publishes crawl jobs for. It is DB-backed and live - a change takes effect on the crawler's next discovery sweep, with no redeploy.

ModeChannels crawled
LumioFirst-party roster only (connected Lumio channels).
ListThe crawl watchlist only.
Lumio + ListThe union of the two. Default.
GlobalEvery live channel (unfiltered). Kill-switch / ramp target.

The default is Lumio + List - a bounded, curated set that lets /stats launch on today's capacity. Global is an explicit, opt-in widening: switch to it only once the crawler's capacity backbone (broker + cluster) is armed. The system never widens to Global on its own - an unreachable database falls back to the configured bounded default, never Global.

Watchlist​

The watchlist is the List component of the scope: a curated set of channel identities (platform + platform channel id) to crawl regardless of whether they are connected Lumio accounts. Adding a channel is idempotent - re-adding the same identity updates its labels rather than creating a duplicate. Removing a channel takes effect on the next discovery sweep.

The watchlist governs which channels are candidates for crawling; it is distinct from the per-channel opt-out registry (public_channel_settings), which removes a channel from crawling even if it is in scope. See Opt-out enforcement.

Using the admin control​

The controls live in the Admin app under Stats → Stats Crawler (/stats-crawler). The nav entry appears only if you hold at least one of the five crawler:* permissions; each control on the page is additionally gated on its own permission, so a read-only operator sees the current values without the edit affordances.

Setting the scope mode​

The Crawl scope card shows the four modes as selectable cards with the current mode badged. Pick a mode and press Apply scope to persist it (crawler:scope-edit). Selecting Global surfaces an inline warning and turns the apply button destructive - it is the explicit, opt-in widening to an unbounded sweep, so it never happens by a single stray click. Without crawler:scope-edit the cards are read-only and the apply button is hidden.

Managing the watchlist​

The Crawl watchlist card lists the curated entries and, for operators with crawler:watchlist-create, an add form:

  1. Choose the Platform and enter the Platform channel ID - the channel identity. The optional Login, Display name, and Note are denormalized labels shown in the list.
  2. Press Add channel. The add is idempotent: re-adding the same platform + platform_channel_id updates the labels of the existing entry rather than creating a duplicate, and the row moves to the top of the list.
  3. Remove an entry with the trash button (crawler:watchlist-delete).

Both scope changes and watchlist edits take effect on the crawler's next discovery sweep and are written to the operator audit log.