bmlsub is a local workstation tool for subtitle, transcription, video
production, and release workflows. Each step is recorded as verifiable state
and receipts, while external network actions remain behind explicit
confirmation boundaries.
bmlsub ws start
bmlsub ws end [yes]
bmlsub build [option]
bmlsub rebuild [option]
ws startinitializes a series, registers source media, extracts reference subtitles and audio, and optionally runs transcription before the human subtitle handoff.ws endstarts from the completed subtitles and fonts, produces local releases, and delivers them through R2, VPS, qBittorrent, and Anibt in order.ws end yesresumes delivery unattended with saved, validated configuration and automatically confirms Nyaa syndication.buildruns one standalone operation in the current directory.rebuildreplaces the result of one standalone operation;rebuild anibtis refused because publication cannot be safely overwritten.
The public global options are -h/--help and --version. Paths, inputs,
recipes, output locations, and credential references are selected through the
interactive questions rather than business flags.
Python 3.10 or newer is required. MLX transcription on Apple Silicon is an optional feature.
conda create -n bmlsub python=3.12
conda activate bmlsub
brew install homebrew-ffmpeg/ffmpeg/ffmpeg
brew install mkvtoolnix
python -m pip install -e '.[transcription]'
bmlsub --versionThe expected version output is bmlsub 1.2.1.
Prepare a series root with this layout:
Project/
bgminfo/series.json
01/
01.mkv
Run bmlsub ws start from the series root. On the first run, the questions
can create series.json. After an episode directory exists, the command
registers the source video, extracts reference subtitles and audio, and runs
direct or chunked Whisper according to the selected policy.
After translation, proofreading, and font collection, place the formal ASS
subtitle and fonts in the episode directory, then run bmlsub ws end. The
delivery plan is shown before any R2, VPS, qBittorrent, or Anibt action and
requires confirmation.
| Option | Meaning |
|---|---|
bgminfo |
Create or validate series metadata |
ensub |
Extract English reference subtitles |
trans |
Extract audio and transcribe it |
pubinfo |
Configure publication metadata |
encode |
Encode and mux video products |
torrent |
Create a Torrent for existing content |
upr2 |
Upload content to R2 |
dlvps |
Pull content to the VPS |
seed |
Verify content and seed it with qBittorrent |
anibt |
Publish a Torrent release to Anibt |
Each build command runs exactly one option. In a TTY, omitting the option
opens a menu; in a non-TTY it returns needs_review without initializing
state. rebuild moves the previous local target to .bmlsub/backups/,
validates the replacement, and only then writes the new receipt.
See standalone operations and state for the complete input, output, and recovery rules.
Standalone operation state is stored in .bmlsub/build/; Workstation state is
stored in workstation/state/ inside the episode. Plans are immutable, and
receipts record file identities, parameters, and upstream relationships.
Passwords, tokens, access keys, and private keys are never written to
series.json, plans, receipts, or ordinary output. R2, qBittorrent, and Anibt
secrets use the system secure store; SSH configuration stores only an
OpenSSH host alias.