The Problem

Generating subtitles normally means uploading footage to a cloud service, waiting, and hoping the transcription is accurate. AutoSubs removes that dependency: it runs AI transcription models locally and can push results straight into a DaVinci Resolve timeline, so editors keep full control of their media and their privacy.

What This Does

AutoSubs is a Tauri desktop app (React + TypeScript frontend, Rust backend) that transcribes audio/video files locally using Whisper, Parakeet, or Moonshine models. It handles speaker diarization, translation to English, and exports to SRT or plain text. The DaVinci Resolve integration lives in AutoSubs-App/src-tauri/resources/AutoSubs.lua, which communicates with the app over IPC.

The transcription pipeline is in AutoSubs-App/src-tauri/crates/transcription-engine/src/, with separate modules for audio preprocessing (audio.rs), model selection (engines/), formatting (formatting.rs), and translation (translate.rs).

How It Is Wired

Execution starts in AutoSubs-App/src-tauri/src/main.rs, which calls into lib.rs where the Tauri command handlers live. The transcription_api.rs module is the bridge between the React frontend and the Rust engine. A transcription request flows: React calls a Tauri IPC command → transcription_api.rs → transcription-engine crate → model inference → results stream back to the UI via Tauri events.

The Rust backend talks to three external systems: FFmpeg (audio preprocessing), HuggingFace Hub (model downloads), and optionally DaVinci Resolve via the Lua script. The model_manager.rs file handles model caching and downloads, and is one of the most heavily branched files (142 branch points over 498 lines). The formatting.rs file (1,514 lines) is the largest single source file and handles line breaking, timing, and language-specific rules.

The React frontend is organized around contexts — GlobalProvider and TranscriptContext are the two most-connected modules, with GlobalProvider importing 6 modules and TranscriptContext sitting in the middle of the data flow. The UI components are split between dialogs, settings, subtitles, and processing panels.

How To Use It

git clone https://github.com/moses-y/auto-subs
cd auto-subs/AutoSubs-App
npm install
npm run tauri dev

Configuration is minimal: the app downloads models on first use from HuggingFace Hub. The tauri.conf.json in AutoSubs-App/src-tauri/ handles app-level config. For DaVinci Resolve integration, load AutoSubs.lua from the resources folder into Resolve's script editor.

Real-World Use

A video editor receives raw interview footage and needs captions before the end of the day. They drop the file into AutoSubs, pick Whisper for accuracy, enable diarization to separate speakers, and generate subtitles in minutes — all locally. They then push the subtitles directly into Resolve, where per-speaker styling (color, outline, border) is applied automatically via the Lua bridge.

Code Health & Issues

Static analysis found 46 issues (20 high, 26 medium) across 4 categories. The dominant problem is deep nesting (33 instances), with completion-step-item.tsx reaching indentation depth 9. Eight files exceed 1,000 lines, including formatting.rs (1,514 lines) and autosubs_core.lua. There are 110 duplicated 6-line blocks across 37 files, suggesting shared logic should be extracted.

The audit also flagged: unpinned GitHub Actions (using @v2 tags instead of commit SHAs), no test suite despite 142 source files, no Dependabot configuration, and npm install in CI instead of npm ci. The workflow also lacks persist-credentials: false and job timeouts.

The Bottom Line

A functional, genuinely useful desktop app for local subtitle generation with a solid architecture — Tauri + Rust + React is a sensible stack for this workload. The main risks are maintainability (large files, duplicated logic) and the absence of tests. For a solo editor or small post-production team, this is a practical tool; for a team planning to extend it, the codebase needs refactoring first.