Stats
Where the library stands and what is stuck — coverage numbers, recent runs, failures, and the pages that let you fill the gaps.
/stats answers two questions: how much of the library is captioned and generated, and what failed recently. Most of its numbers are also buttons — a coverage card takes you to the list of the exact media it is counting, with a bulk action to fix them.
Timestamps on this screen are rendered in America/Chicago, not your browser's timezone.
What the numbers mean
Two disclaimers sit on the page itself and are worth internalising:
- "Captioned" means has a viewable caption under the app's current caption-visibility rules — the same rule the media pages use. It is not "a caption row exists somewhere".
- "ComfyUI job coverage" means a generation job record is linked. It says nothing about whether that job ever ran successfully on the GPU.
Library totals is a snapshot: total media ingested, total captioned, total with ComfyUI jobs, average ComfyUI job duration, and Instagram-only ingested and captioned counts. The average duration is the mean GPU execution window recorded on each job that finished rendering, counted whether or not the job was later published or archived — it reads — when no job has a recorded execution window yet. "Total media with ComfyUI jobs" counts jobs in completed, failed, or published status, which is why it agrees with what Jobs shows rather than with a raw job count.
Coverage and backlog is derived from visible media, and every card in it is a link:
| Card | Where it takes you |
|---|---|
| Caption coverage | Caption gaps |
| Caption backlog | Caption gaps |
| Reddit / Instagram / Telegram caption backlog | Caption gaps, pre-filtered to that platform |
| ComfyUI job coverage | ComfyUI gaps |
The three per-platform backlog cards each show the remaining count next to that platform's own coverage percentage, so you can see which source is dragging the average down before you click.
A "Last refreshed" line sits above Library totals. These are aggregates, not live counters.
The rest of the page
- Daily activity — an ingest/caption/generation chart with
1W/1M/3Mrange buttons. Opens on1M. - Recent sync jobs — the last media-sync runs and how much each ingested. Each row opens its own run detail. If it is empty, nothing has synced yet; you trigger a sync from Settings → Media Source.
- Recent caption activity — the last 10 caption jobs with type (Manual / Scheduled Auto / Manual Auto), status, start time, and per-run counts. The run id is a link to the Auto-Caption Runs detail page for the two automatic types; a Manual run's id is plain text because there is no run page for a single manual caption.
- Recently published jobs — status, published time, media id, a View post link straight to CivitAI, and a link to the job document.
- Failed ComfyUI jobs and Failed publishing jobs — two separate tables, each showing the failure message truncated to two lines with the full text on hover, and a link to the job. Each section disappears entirely when it is empty, so an absent table is good news, not a loading state.
Quick links
A row of four pills near the top of the page. None of these are in the global nav — this row is the only way to reach them without typing a URL.
- Training Dashboard (
/stats/training) — the caption-training dataset. Four tabs: Overview (training runs and dataset health), Browse (the caption rows themselves), Review (a deck for correcting captions), Suggestions (learned fixes awaiting acceptance). - Duplicates (
/stats/duplicates) — see below. - Caption gaps (
/stats/gaps/captions) - ComfyUI gaps (
/stats/gaps/comfyui)
Caption gaps and ComfyUI gaps
Both are the same screen with different contents: a paginated list of media missing something, 24 per page, with All / Reddit / Instagram / Telegram platform tabs across the top. Changing the platform resets you to page 1.
Tick the media you want and press Queue captioning (green) or Queue generation (orange) at the bottom. Select all on page does exactly that — the page, not the filter.
Only Caption gaps has a bulk-everything button. Its header carries Caption all · N, where N is the full filtered count, behind a confirmation. ComfyUI gaps has no equivalent — filling generation coverage in bulk is done by selecting pages, or from the Media gallery.
Duplicates
/stats/duplicates lists clusters of media that look visually identical, with the same 24-per-page pagination and platform tabs. Each cluster pre-selects the highest-quality copy as the one to Keep; you can pick a different member, then archive the rest of that cluster.
Archive all extras in the header runs a preview first — it tells you how many clusters and how many items would be archived for the current platform filter before you confirm. Archiving is reversible; nothing is deleted.
Phase 0 caption eval
/stats/gaps/phase0-caption-eval is reachable only by URL — it is not in the quick links. It is a research page comparing candidate VLM caption outputs against JoyCaption ground truth for the custom-captioner go/no-go, not part of any routine workflow.