A linear batch pipeline. There is no service, no database, and no state beyond files on disk — which is the point: every intermediate result is inspectable, and any stage can be re-run on its own.
RSS feed / publisher site
│
▼
1_download.py
▼
2_tagger.py → tagged.log
▼
3_transcriber.py → transcribed.log
▼
4_summarizer.py → summarized.log
▼
5_cleanup.py → cleaned.log
│
▼
<show>/<year>/*.mp3, *_transcript.md, *_summary.md
Each stage reads what the previous one wrote and adds files alongside it. Nothing is deleted or overwritten in place, so a failed run leaves partial output rather than corrupt output.
Shell-Game-Transcripts/
├── 2024/
│ └── <year>/
│ ├── <episode>.mp3
│ ├── <episode>_transcript.md
│ └── <episode>_summary.md
├── ... 1 more show directories
├── main.py
├── <n>_*.py pipeline stages
├── *.log resume logs, one per expensive stage
└── requirements.txt
Ordering is encoded in the filenames rather than in a config file or a DAG. main.py reads the list, runs each in turn, and passes through the arguments it was given. Adding a stage means adding a numbered script and listing it — there is no framework to learn, and the execution order is visible from ls.
The only persistent state is the log files. Each expensive stage appends an identifier as it completes an item and skips anything already listed:
| Log | Written by |
|---|---|
tagged.log |
2_tagger.py |
transcribed.log |
3_transcriber.py |
summarized.log |
4_summarizer.py |
cleaned.log |
5_cleanup.py |
This is what makes a multi-hour run interruptible. It also means stages will not redo work after you change a setting — the log does not record which model produced a result, only that one exists. Delete the log to force a rebuild.
| Concern | Where |
|---|---|
| Acquisition | 1_download.py, downloader.py |
| Metadata | tagging stage |
| Machine learning | transcription and summarisation stages |
| Text correction | cleanup stage |
| Orchestration | main.py — argument passing and sequencing only |
main.py holds no logic beyond the order of the stages, so it rarely needs to change.