PipelineEvent objects. These events carry real-time progress information that the Rich live dashboard reads to update its display. The same event stream is consumed in --no-ui mode to emit plain-text progress lines to stdout.
Every event is an instance of PipelineEvent (defined in domain/events.py) with the following fields:
One of the
EventType enum values listed in the table below. Identifies what stage of processing the event represents.The YouTube video ID this event is associated with.
Human-readable video title, populated once metadata has been fetched.
1-based index of the chapter currently being processed. Only present on chapter-specific events.
Total number of chapters in the video. Only present when chapter-aware processing is active.
1-based index of the transcript chunk currently being sent to the LLM. Only present on chunk-specific events.
Total number of transcript chunks for this generation pass.
Plain-English error message. Only present on
VIDEO_FAILED events.Filesystem path of the file written. Only present on
VIDEO_SUCCESS events.Event types
Pipeline lifecycle
| Event type | Value | Description |
|---|---|---|
PIPELINE_START | pipeline_start | The pipeline has started. Emitted once before any video processing begins. |
PIPELINE_COMPLETE | pipeline_complete | All videos in the batch have finished (succeeded, failed, or skipped). Emitted once at the end. |
Per-video lifecycle
| Event type | Value | Description |
|---|---|---|
METADATA_START | metadata_start | Starting to fetch video metadata (title, duration, chapter list) from YouTube. |
METADATA_FETCHED | metadata_fetched | Video metadata has been retrieved successfully. title field is now populated. |
TRANSCRIPT_FETCHING | transcript_fetching | Requesting the transcript from YouTube’s caption service. |
TRANSCRIPT_FETCHED | transcript_fetched | Transcript has been fetched (or loaded from the local cache). |
VIDEO_SUCCESS | video_success | Processing completed successfully. output_path contains the path to the primary output file. |
VIDEO_SKIPPED | video_skipped | The video was skipped because it was already processed and --force was not passed. |
VIDEO_FAILED | video_failed | Processing failed. error contains the user-visible failure message. |
Study notes generation
| Event type | Value | Description |
|---|---|---|
GENERATION_START | generation_start | Starting LLM generation for this video (standard, non-chapter-aware path). |
CHUNK_GENERATING | chunk_generating | Sending transcript chunk chunk_number of total_chunks to the LLM. |
GENERATION_COMBINING | generation_combining | All chunks have been generated; now combining chunk outputs into the final document. |
GENERATION_COMPLETE | generation_complete | Study notes generation finished successfully. |
Chapter-aware generation
Emitted instead of the standard generation events when the video is long enough and has YouTube chapters:| Event type | Value | Description |
|---|---|---|
CHAPTER_GENERATING | chapter_generating | Starting generation for chapter chapter_number of total_chapters. |
CHAPTER_CHUNK_GENERATING | chapter_chunk_generating | Sending chunk chunk_number of total_chunks for the current chapter to the LLM. |
CHAPTER_COMBINING | chapter_combining | Combining chunks for the current chapter into its output file. |
CHAPTER_COMPLETE | chapter_complete | One chapter’s notes have been written to disk. |
Quiz generation
| Event type | Value | Description |
|---|---|---|
QUIZ_GENERATING | quiz_generating | Starting quiz generation (only emitted when --quiz is passed). |
QUIZ_CHUNK_GENERATING | quiz_chunk_generating | Sending transcript chunk chunk_number of total_chunks to the LLM for quiz generation. |
QUIZ_COMBINING | quiz_combining | Combining per-chunk quiz questions into the final quiz.md. |
QUIZ_COMPLETE | quiz_complete | Quiz generation finished; quiz.md has been written. |
Event flow
A typical processing run for a standard (non-chapter) video with--quiz proceeds in this order:
Dashboard and —no-ui mode
The Rich live dashboard subscribes to the event stream and updates its table rows in real time — one row per video. Each event type triggers a specific status update (spinner, progress bar, check mark, or error label). In--no-ui mode (useful for CI pipelines or cron jobs), the dashboard is disabled but events are still emitted. Instead of a live table, NoteWise prints a plain-text line to stdout for each significant state change.
Adding a new pipeline stage requires: (1) a new
EventType value in domain/events.py, (2) an emit() call in pipeline/_execution.py or pipeline/generation.py, and (3) a handler in ui/dashboard.py if a UI update is needed. See AGENTS.md for the full workflow.