← All topicsOpen Jobs →

A job is one video you are asking ComfyUI to generate from one source clip. /jobs is where every job lives from the moment it is created until it is published or archived. It is the screen you work down each day.

Typing /jobs with no query string lands you on the Pending tab, not on everything. The nav link points at /jobs?status=all for exactly that reason. If the screen looks emptier than you expect, check which tab is lit.

Query internals, page sizing, and the historical performance work are in docs/architecture/jobs-list.md.

Status tabs

The chip bar across the top is ALL / PENDING / RUNNING / COMPLETED / FAILED - COMFYUI / PUBLISHED / FAILED - PUBLISHED, each with a live count. The two failure tabs split the two ways a job can die: generation never produced a video, versus the video is fine but publishing it to CivitAI failed. The tabs are buckets, not raw statuses — a job's own status is finer-grained than the tab it appears under, and one of the mappings will surprise you:

Tab Job statuses it contains
Pending pending, captioning, captioned
Running queued, running
Completed completed
Published published
Failed - ComfyUI failed
Failed - Published publish_failed, publishing

publishing sitting under Failed - Published is the one to remember: a job that is mid-publish right now shows up there, not on Completed. It is where the retry affordance lives, so a publish that stalls is found in the same place as one that already failed. archived appears under no tab at all, including ALL.

Beside the heading is a count that reads "Displaying N of M". The M disappears when the favorites filter is on, because the count aggregate is computed server-side without it and showing a total that ignores your filter would be worse than showing none.

Switching tabs clears any selection you had. That is deliberate — carrying a selection across a filter change means bulk-acting on jobs you can no longer see.

Life of a job

pending -> captioning -> captioned -> queued -> running -> completed
                                                       \-> failed

completed -> publishing -> published
                        \-> publish_failed

Jobs enter at pending and get captioned by the background pipeline; you do not drive that step from this screen. They become queueable only once they reach captioned.

Each card shows its own status as a badge, and that badge is finer-grained than the tab it sits under:

Status What it means
pending Created, waiting for a caption before anything else can happen
captioning Caption generation is in progress right now
captioned Caption is done. This is the only status from which you can queue.
queued Submitted to ComfyUI, waiting for a slot
running ComfyUI is generating the video
completed Video generated successfully, ready to review or publish
failed Generation failed
publishing Publish to CivitAI is in flight — note this sits under the Failed tab
published Live on CivitAI
publish_failed The publish attempt failed; the video itself is fine
archived Hidden from every tab, including ALL

Three things create a job:

  • Add to Jobs on a card in Media, one clip at a time or in bulk.
  • Queue generation on the ComfyUI gaps list under Stats, for filling coverage holes.
  • The Add 30 random captioned media button in the floating action menu on the Pending tab — a sampler that pulls 10 Instagram, 10 Telegram, and 10 Reddit clips, all captioned and ≤20s. It reports the actual per-platform split in a toast, which will be less than 30 if not enough eligible clips exist.

Actions

On a phone the action row is already visible on every card — the overlay auto-reveals on any coarse-pointer device. On a desktop with a mouse, hover the card.

Three of these buttons are gated on which tab you are standing on, not just on the job. Publish to CivitAI, Retry Publish, and Re-queue to ComfyUI only render while the Completed or Failed tab is selected. The consequence catches people out: on ?status=all — which is exactly where the global nav's Jobs link points — a finished job shows no Publish button at all. To publish, switch to the Completed tab first.

Four buttons are always there:

  • Recaption — re-runs captioning without regenerating the video. This is how you fix a caption that came out wrong. Do it before queueing, since the caption is what the generation is built from.
  • Trim — adjust start/end timecodes or cut sections out of the middle. On a job that has already been trimmed, the modal also offers Revert.
  • View Caption — opens the structured caption in a read-only modal.
  • Archive — removes it from every tab. The document survives.

The rest are conditional:

  • Queue to ComfyUI — appears on any tab, but only on a job whose status is exactly captioned and that has caption text to work from. A pending job cannot be queued from here; it has to get captioned first. Pressing it moves the card to Running.
  • Publish to CivitAI — Completed tab only, and only on a completed job that has both a final CDN video and a non-empty positive prompt. The button reads Publishing… and then Published as the publish proceeds, but you only ever see that sequence because the card is updated optimistically in place: the moment the status really is publishing, the job belongs to the Failed - Published bucket, so a refresh moves it off the Completed tab.
  • Retry Publish — Failed - Published tab only, for publish_failed and publishing jobs. Same publish call, re-fired.
  • Re-queue to ComfyUI — Failed - ComfyUI tab only, for a generation failure (status failed) that still has a usable caption. It resets the job back to captioned and immediately re-dispatches it. If the second half fails you are left with a captioned job showing a Queue to ComfyUI button, so nothing is ever stranded.
  • Favorite / Unfavorite — only on completed and published jobs. Feeds the Favorites toggle and the /favorites screen.

Four small fields under each card, two of which are live controls:

  • workflow — the workflow name with .json stripped. A copy icon beside it copies the fully-injected ComfyUI workflow JSON for this job to the clipboard, ready to paste into ComfyUI. An external-link icon opens /detail/workflow/<jobId> — the runtime-params inspector, which shows what will be sent for a job that has not run and what was sent for one that has, including the randomly-picked subject image when the per-workflow random toggle is on. The inspector link is hidden while a job is running, because the payload is in flight and there is nothing stable to show.
  • id — copy icon, plus an external-link icon opening the full job document at /detail/job/<jobId>.
  • created — only on non-pending cards.
  • duration — only on completed jobs; ComfyUI's own runtime for the generation, as mm:ss.

Working in bulk

Every card has a select checkbox. On the Completed and Failed tabs the toolbar also offers Select all (N) — and on Completed only, Select recent 8, the shortcut for the daily publish batch. Both open the floating action menu straight to the valid actions.

With a selection made, the bottom bar offers Archive everywhere, and Publish on the Completed and Failed tabs — alongside Select all (N) / Unselect all next to the count, which is the only way to reach select-all on the tabs whose toolbar omits it. Clicking anything that performs something — a quick action or a tag chip — dismisses the bar back to the no-selection view. Bulk Publish on the Failed tab quietly skips anything that is a generation failure rather than a publish failure — those need Re-queue, not Publish — so a mixed selection does the right thing rather than erroring.

Two more toolbar controls:

  • Most recent / Oldest first — a sort dropdown, present only on the Completed tab.
  • All jobs / Favorites only — a star toggle, present on every tab.

Live updates

While any running, queued, or publishing job is on screen, the list re-polls every three seconds and only while the browser tab is actually in the foreground. When nothing is in flight, nothing polls — a still list is a correct list, not a stale one.

Job detail

Open the external-link icon on a card's id field, or go straight to /detail/job/<jobId>. The page shows the generated video, the source clip with its resolution and size, the subject reference image used, and the whole raw job document as an expandable tree.

A failed job leads with a red Generation failed panel: classification, reason, HTTP status, the stage it died at, the timestamp, and the full error text. It repeats the reference video's resolution and size right there, because input size is the usual cause of an out-of-memory failure and you want it next to the error, not a scroll away.