Native macOS batch transcriber. Runs MLX speech-to-text models locally or Google Gemini in the cloud, and embeds subtitles and lyrics back into your media.
Swift
0
5 commits
updated Oct 4, 2026
Tare is a native macOS batch transcriber for video and audio files. It extracts audio locally, uses MLX Whisper, MLX-Audio STT models, Parakeet v3, or MOSS-Diarize on the Mac, and writes transcript artifacts to a folder on the Mac.
Show Name/Season 01/Show Name - S01E03 - Episode Title.mkv and write a Table of Contents.md in the show folder.ffmpeg audio extraction, MLX Whisper, the custom Canary-Qwen MLX port, MLX-Audio STT models (Cohere Transcribe, realtime Voxtral, and Qwen3-ASR), the dedicated Voxtral Mini MLX backend, Parakeet v3, and MOSS-Diarize 0.9B..captioned.mkv..tare-link.json manifest inside that folder plus a hidden, compact source-side pointer. The pointer records the source fingerprint, every generated artifact, the semantic name, and the naming strategy/model, so re-importing the source can rediscover exactly which transcripts belong to it without overwriting earlier exports..txt text transcript../script/setup_transcription_backend.sh
The app looks for the installed Tare backend in
~/Library/Application Support/Tare/.venv before falling back to a backend
bundled for a direct DMG launch. It uses script/mlx_transcribe.py from the
app bundle. mlx-audio is installed from
its pinned upstream commit for the MLX-native STT models; mlx-lm is used by
the custom Canary-Qwen adapter; MOSS remains compatible with the same
Transformers environment. The dedicated Voxtral Mini 3B 8-bit adapter uses
the pinned mlx-voxtral==0.0.6 package, which is separate from the
mlx_audio.stt.load route because this published dense-encoder checkpoint has
a different weight layout.
Model files are never bundled in Tare.app or Tare.dmg. Tare discovers
supported repositories already in the user's Hugging Face cache and passes
those local-cache-backed model identifiers to the selected backend. The DMG
contains app resources and, when built from a provisioned checkout, the Python
runtime only. Cache entries are checked for the files required by their
selected backend; incomplete or incompatible snapshots stay out of the normal
picker and are labeled for repair.
The default output root is ~/Documents/Tare Transcripts. Tare creates that
folder when the app launches, creates a named subfolder for each batch, shows
the current destination in the Export panel, and provides a direct Show in
Finder action.
With Use smart transcript names enabled, each source is stored under a readable subject folder. A typical result looks like:
Tare Transcripts/
Transcription Batch 2026-09-21 14-30-00 (2 Files)/
Cell Biology - Lecture 04/
Cell-Biology-Lecture-04.plain-transcript.txt
Cell-Biology-Lecture-04.tare-link.json
The visible manifest is pretty-printed for inspection. The hidden pointer next to the original media is compact JSON and contains the source path, size, modification time, transcript SHA-256, all output paths, the semantic display name/folder, and the provider/model/strategy used for naming. Existing Tare pre-smart-naming manifests remain readable.
FreeLLMAPI is an optional local desktop app. Paste its unified API key into
Settings; Tare stores it in the macOS Keychain under
com.tejas.Tare.freellmapi and never writes it to preferences, transcript
metadata, logs, or the DMG. Tare reads the local FreeLLMAPI port from its
configuration and makes one short request per completed transcript. It does
not launch FreeLLMAPI, install a LaunchAgent, or keep a replacement server
alive. Tare does not read the Keychain while launching or rendering Settings;
it reads the secret once, off the main actor, when a batch starts. If macOS
cannot authorize that read silently, Tare skips the provider and uses the
local filename fallback rather than presenting a modal prompt. The
environment variables TARE_FREELLM_URL, TARE_FREELLM_MODEL, and
TARE_FREELLM_API_KEY are available for development/automation overrides; do
not commit the key.
The model preference is quality-first rather than popularity-first: Tare uses
the local FreeLLMAPI catalog's intelligence ordering, then tries fast free
fallbacks when a route is unavailable. Public benchmark suites such as
OpenRouter Benchmarks and
LiveBench are useful quality signals, while OpenRouter
explicitly notes that free-model usage rankings are adoption metrics rather
than accuracy benchmarks. The live /v1/models response remains authoritative
for availability, and TARE_FREELLM_MODEL can pin a known-good route.
The Transcribe via Cloud tab is a separate provider path for the exact
gemini-3.5-transcribe model. It does not enter the local Hugging Face model
catalog, does not require the local MLX bridge, and does not put model files in
the app. The user must explicitly select the cloud model and add at least one
Google Gemini API key.
API keys are stored as secrets in the macOS Keychain. Tare stores only a label, the last four characters, enabled state, order, and usage metadata in its local preferences. Keys are tried in the configured order and the next key is used after authentication, rate-limit, transient service, or network failure. Google applies quotas per Cloud project, not per API key, so multiple keys are failover and resilience—not a way to multiply quota. Tare never puts a key in a URL or transcript output. Cloud mode, annotation choices, vocabulary, output folder, and batch-folder behavior are saved automatically, so a restart keeps the configured workflow.
Keychain secret reads and writes run off the main UI actor, and a batch takes
one credential snapshot instead of rereading the Keychain during every SwiftUI
refresh or transcription job. Release and development packaging automatically
uses the first available Apple Development signing identity (or the explicit
TARE_CODESIGN_IDENTITY value); this keeps the app's Keychain access
requirement stable across rebuilds. If a Mac has no Apple signing identity,
packaging falls back to ad-hoc signing and macOS may ask for Keychain approval
again after a rebuild. A key created by an older ad-hoc Tare build may require
one final approval or re-entry when first opened by the stable-signed build.
Verbatim mode is the Google-documented default and preserves the spoken
content. Smart mode is optional and is intended for more readable lecture
transcripts. Verbatim mode can request word timestamps and/or speaker labels.
Tare rejects the combinations Google rejects: smart mode with annotations, or
custom vocabulary with word timestamps or speaker diarization. Vocabulary is
trimmed, de-duplicated, and limited to 1,000 terms before a request is sent;
Google recommends keeping it near 100 terms for best results. When a language
is selected, Tare sends a supported BCP-47 hint; Auto Detect sends the
documented empty language_codes array.
Long recordings are planned from measured duration before upload. Tare uses
55-minute safe chunks for unannotated requests and 28-minute safe chunks when
word timestamps or speaker labels are enabled, leaving margin below Google’s
documented 60-minute and 30-minute unary limits. Interior boundaries prefer
detected silence and include 1.5 seconds of context so words are not cut at a
hard boundary; the final assembly removes only duplicate boundary words and
restores source-relative timestamps. Cloud intermediates and chunks use
lossless FLAC while preserving the source sample rate and channels. Multi-hour
lectures are processed sequentially, every chunk must succeed, and Tare does
not export partial text after a failed chunk. Each uploaded Files API object is
deleted after its interaction completes. Interactions are sent with
store=false, and the API key is sent only to Google API requests—not to the
signed upload URL or any saved transcript.
The cloud path requires ffmpeg and ffprobe so Tare can measure duration and
prepare lossless chunks safely. It refuses files over Google’s 2 GB per-file
limit and stops if duration cannot be measured. See Google’s
audio transcription guide,
Files API, and
rate-limit guidance for
provider-side limits and data handling.
Canary-Qwen uses the cached speechllms/canary-speechlm-mlx encoder and LLM
overlay with a local Qwen/Qwen3-1.7B base model. Tare never bundles that
base model or the Canary weights. The full-precision combined load is not
usable below its Metal buffer requirement; the Models screen reports that
constraint before transcription starts. MOSS uses the official
OpenMOSS-Team/MOSS-Transcribe-Diarize Transformers
runtime with anonymous speaker labels and a 90-minute single-pass limit.
Parakeet uses the Apple-Silicon parakeet-mlx runtime with the
mlx-community/parakeet-tdt-0.6b-v3 checkpoint and internal long-audio
chunking. Qwen3-ASR 1.7B 6-bit uses the MLX-Audio loader and is approximately
2.03 GB. Voxtral Mini 3B 8-bit uses
MarkusKaemmerer/Voxtral-Mini-3B-2507-8bit-dense-encoder, is approximately
6.02 GB, and is split into memory-safe passes for 16-GB Apple Silicon Macs;
it does not provide word timestamps. The Models tab can download a selected
repository into that same cache, but it does not present the full catalog
until the user asks for it.
./script/install_quick_actions.sh
This installs three macOS Services/Quick Actions in ~/Library/Services:
Clean NameTranscribe with TareClean Names then TranscribeThe installer stages the available clean-name-cli.py from the local Name Clean app.
The transcription actions save outputs next to the selected source media by default.
They embed subtitles directly into MKV files and embed custom lyrics into supported
audio files such as .m4a and .mp3. Audio originals are kept in Original Audio Backups.
For MP4, M4V, and MOV inputs they write an IINA-friendly
.captioned.mkv beside the source instead of creating a mov_text track that
IINA may not expose consistently. Replaced MKV originals are moved to an
Original Video Backups folder beside the source.
Finder Quick Actions read the saved app preferences for model, language, output
text transcript, and batch-folder behavior. Environment
variables such as TARE_MODEL, TARE_LANGUAGE,
TARE_CHUNK_SECONDS, and TARE_FORMATS still
override the saved choices. TARE_CHUNK_WORKERS is accepted for
compatibility, but MLX chunk transcription stays serialized by default to avoid
Metal backend crashes under load.
The dedicated Voxtral adapter also accepts TARE_VOXTRAL_CHUNK_SECONDS
(default 120 seconds, clamped to 60–300) and
TARE_VOXTRAL_MAX_NEW_TOKENS (default 4096).
Set TARE_OUTPUT_DIR to force a central output folder.
The installer also stages a release TranscriberBatch binary and helper script
under ~/Library/Application Support/Tare so Finder can run the
actions without needing to execute project scripts from Documents.
Progress logs are written here:
~/Library/Logs/NameClean/quick-action-clean.log~/Library/Logs/Tare/quick-action-transcribe.log~/Library/Logs/Tare/quick-action-clean-then-transcribe.logswift run TranscriberCoreSmokeTests
swift run TranscriberBatch -- --attach-to-source --output "$HOME/Documents/Tare" path/to/video.mp4
./script/build_and_run.sh --verify
./script/build_and_run.sh --dmg
./script/build_and_run.sh --install
The normal run path stages its temporary development app outside the project
dist/ directory. Release packaging stages the app in a temporary directory,
then writes only dist/Tare-<version>-macOS-<arch>.dmg and its .sha256
checksum. The DMG contains one Tare.app and an Applications shortcut.
Installation replaces only the canonical /Applications/Tare.app; any prior
bundle is moved to the user's Trash for recovery, and no second app bundle is
left in dist/.
MIT. See LICENSE.
Model weights are never redistributed with this project. Tare discovers models already present in your own Hugging Face cache, and the release DMG contains only the app and, for a provisioned checkout, the Python runtime.
Native macOS batch transcriber. Runs MLX speech-to-text models locally or Google Gemini in the cloud, and embeds subtitles and lyrics back into your media.
Swift
0
5 commits
updated Oct 4, 2026
Tare is a native macOS batch transcriber for video and audio files. It extracts audio locally, uses MLX Whisper, MLX-Audio STT models, Parakeet v3, or MOSS-Diarize on the Mac, and writes transcript artifacts to a folder on the Mac.
Show Name/Season 01/Show Name - S01E03 - Episode Title.mkv and write a Table of Contents.md in the show folder.ffmpeg audio extraction, MLX Whisper, the custom Canary-Qwen MLX port, MLX-Audio STT models (Cohere Transcribe, realtime Voxtral, and Qwen3-ASR), the dedicated Voxtral Mini MLX backend, Parakeet v3, and MOSS-Diarize 0.9B..captioned.mkv..tare-link.json manifest inside that folder plus a hidden, compact source-side pointer. The pointer records the source fingerprint, every generated artifact, the semantic name, and the naming strategy/model, so re-importing the source can rediscover exactly which transcripts belong to it without overwriting earlier exports..txt text transcript../script/setup_transcription_backend.sh
The app looks for the installed Tare backend in
~/Library/Application Support/Tare/.venv before falling back to a backend
bundled for a direct DMG launch. It uses script/mlx_transcribe.py from the
app bundle. mlx-audio is installed from
its pinned upstream commit for the MLX-native STT models; mlx-lm is used by
the custom Canary-Qwen adapter; MOSS remains compatible with the same
Transformers environment. The dedicated Voxtral Mini 3B 8-bit adapter uses
the pinned mlx-voxtral==0.0.6 package, which is separate from the
mlx_audio.stt.load route because this published dense-encoder checkpoint has
a different weight layout.
Model files are never bundled in Tare.app or Tare.dmg. Tare discovers
supported repositories already in the user's Hugging Face cache and passes
those local-cache-backed model identifiers to the selected backend. The DMG
contains app resources and, when built from a provisioned checkout, the Python
runtime only. Cache entries are checked for the files required by their
selected backend; incomplete or incompatible snapshots stay out of the normal
picker and are labeled for repair.
The default output root is ~/Documents/Tare Transcripts. Tare creates that
folder when the app launches, creates a named subfolder for each batch, shows
the current destination in the Export panel, and provides a direct Show in
Finder action.
With Use smart transcript names enabled, each source is stored under a readable subject folder. A typical result looks like:
Tare Transcripts/
Transcription Batch 2026-09-21 14-30-00 (2 Files)/
Cell Biology - Lecture 04/
Cell-Biology-Lecture-04.plain-transcript.txt
Cell-Biology-Lecture-04.tare-link.json
The visible manifest is pretty-printed for inspection. The hidden pointer next to the original media is compact JSON and contains the source path, size, modification time, transcript SHA-256, all output paths, the semantic display name/folder, and the provider/model/strategy used for naming. Existing Tare pre-smart-naming manifests remain readable.
FreeLLMAPI is an optional local desktop app. Paste its unified API key into
Settings; Tare stores it in the macOS Keychain under
com.tejas.Tare.freellmapi and never writes it to preferences, transcript
metadata, logs, or the DMG. Tare reads the local FreeLLMAPI port from its
configuration and makes one short request per completed transcript. It does
not launch FreeLLMAPI, install a LaunchAgent, or keep a replacement server
alive. Tare does not read the Keychain while launching or rendering Settings;
it reads the secret once, off the main actor, when a batch starts. If macOS
cannot authorize that read silently, Tare skips the provider and uses the
local filename fallback rather than presenting a modal prompt. The
environment variables TARE_FREELLM_URL, TARE_FREELLM_MODEL, and
TARE_FREELLM_API_KEY are available for development/automation overrides; do
not commit the key.
The model preference is quality-first rather than popularity-first: Tare uses
the local FreeLLMAPI catalog's intelligence ordering, then tries fast free
fallbacks when a route is unavailable. Public benchmark suites such as
OpenRouter Benchmarks and
LiveBench are useful quality signals, while OpenRouter
explicitly notes that free-model usage rankings are adoption metrics rather
than accuracy benchmarks. The live /v1/models response remains authoritative
for availability, and TARE_FREELLM_MODEL can pin a known-good route.
The Transcribe via Cloud tab is a separate provider path for the exact
gemini-3.5-transcribe model. It does not enter the local Hugging Face model
catalog, does not require the local MLX bridge, and does not put model files in
the app. The user must explicitly select the cloud model and add at least one
Google Gemini API key.
API keys are stored as secrets in the macOS Keychain. Tare stores only a label, the last four characters, enabled state, order, and usage metadata in its local preferences. Keys are tried in the configured order and the next key is used after authentication, rate-limit, transient service, or network failure. Google applies quotas per Cloud project, not per API key, so multiple keys are failover and resilience—not a way to multiply quota. Tare never puts a key in a URL or transcript output. Cloud mode, annotation choices, vocabulary, output folder, and batch-folder behavior are saved automatically, so a restart keeps the configured workflow.
Keychain secret reads and writes run off the main UI actor, and a batch takes
one credential snapshot instead of rereading the Keychain during every SwiftUI
refresh or transcription job. Release and development packaging automatically
uses the first available Apple Development signing identity (or the explicit
TARE_CODESIGN_IDENTITY value); this keeps the app's Keychain access
requirement stable across rebuilds. If a Mac has no Apple signing identity,
packaging falls back to ad-hoc signing and macOS may ask for Keychain approval
again after a rebuild. A key created by an older ad-hoc Tare build may require
one final approval or re-entry when first opened by the stable-signed build.
Verbatim mode is the Google-documented default and preserves the spoken
content. Smart mode is optional and is intended for more readable lecture
transcripts. Verbatim mode can request word timestamps and/or speaker labels.
Tare rejects the combinations Google rejects: smart mode with annotations, or
custom vocabulary with word timestamps or speaker diarization. Vocabulary is
trimmed, de-duplicated, and limited to 1,000 terms before a request is sent;
Google recommends keeping it near 100 terms for best results. When a language
is selected, Tare sends a supported BCP-47 hint; Auto Detect sends the
documented empty language_codes array.
Long recordings are planned from measured duration before upload. Tare uses
55-minute safe chunks for unannotated requests and 28-minute safe chunks when
word timestamps or speaker labels are enabled, leaving margin below Google’s
documented 60-minute and 30-minute unary limits. Interior boundaries prefer
detected silence and include 1.5 seconds of context so words are not cut at a
hard boundary; the final assembly removes only duplicate boundary words and
restores source-relative timestamps. Cloud intermediates and chunks use
lossless FLAC while preserving the source sample rate and channels. Multi-hour
lectures are processed sequentially, every chunk must succeed, and Tare does
not export partial text after a failed chunk. Each uploaded Files API object is
deleted after its interaction completes. Interactions are sent with
store=false, and the API key is sent only to Google API requests—not to the
signed upload URL or any saved transcript.
The cloud path requires ffmpeg and ffprobe so Tare can measure duration and
prepare lossless chunks safely. It refuses files over Google’s 2 GB per-file
limit and stops if duration cannot be measured. See Google’s
audio transcription guide,
Files API, and
rate-limit guidance for
provider-side limits and data handling.
Canary-Qwen uses the cached speechllms/canary-speechlm-mlx encoder and LLM
overlay with a local Qwen/Qwen3-1.7B base model. Tare never bundles that
base model or the Canary weights. The full-precision combined load is not
usable below its Metal buffer requirement; the Models screen reports that
constraint before transcription starts. MOSS uses the official
OpenMOSS-Team/MOSS-Transcribe-Diarize Transformers
runtime with anonymous speaker labels and a 90-minute single-pass limit.
Parakeet uses the Apple-Silicon parakeet-mlx runtime with the
mlx-community/parakeet-tdt-0.6b-v3 checkpoint and internal long-audio
chunking. Qwen3-ASR 1.7B 6-bit uses the MLX-Audio loader and is approximately
2.03 GB. Voxtral Mini 3B 8-bit uses
MarkusKaemmerer/Voxtral-Mini-3B-2507-8bit-dense-encoder, is approximately
6.02 GB, and is split into memory-safe passes for 16-GB Apple Silicon Macs;
it does not provide word timestamps. The Models tab can download a selected
repository into that same cache, but it does not present the full catalog
until the user asks for it.
./script/install_quick_actions.sh
This installs three macOS Services/Quick Actions in ~/Library/Services:
Clean NameTranscribe with TareClean Names then TranscribeThe installer stages the available clean-name-cli.py from the local Name Clean app.
The transcription actions save outputs next to the selected source media by default.
They embed subtitles directly into MKV files and embed custom lyrics into supported
audio files such as .m4a and .mp3. Audio originals are kept in Original Audio Backups.
For MP4, M4V, and MOV inputs they write an IINA-friendly
.captioned.mkv beside the source instead of creating a mov_text track that
IINA may not expose consistently. Replaced MKV originals are moved to an
Original Video Backups folder beside the source.
Finder Quick Actions read the saved app preferences for model, language, output
text transcript, and batch-folder behavior. Environment
variables such as TARE_MODEL, TARE_LANGUAGE,
TARE_CHUNK_SECONDS, and TARE_FORMATS still
override the saved choices. TARE_CHUNK_WORKERS is accepted for
compatibility, but MLX chunk transcription stays serialized by default to avoid
Metal backend crashes under load.
The dedicated Voxtral adapter also accepts TARE_VOXTRAL_CHUNK_SECONDS
(default 120 seconds, clamped to 60–300) and
TARE_VOXTRAL_MAX_NEW_TOKENS (default 4096).
Set TARE_OUTPUT_DIR to force a central output folder.
The installer also stages a release TranscriberBatch binary and helper script
under ~/Library/Application Support/Tare so Finder can run the
actions without needing to execute project scripts from Documents.
Progress logs are written here:
~/Library/Logs/NameClean/quick-action-clean.log~/Library/Logs/Tare/quick-action-transcribe.log~/Library/Logs/Tare/quick-action-clean-then-transcribe.logswift run TranscriberCoreSmokeTests
swift run TranscriberBatch -- --attach-to-source --output "$HOME/Documents/Tare" path/to/video.mp4
./script/build_and_run.sh --verify
./script/build_and_run.sh --dmg
./script/build_and_run.sh --install
The normal run path stages its temporary development app outside the project
dist/ directory. Release packaging stages the app in a temporary directory,
then writes only dist/Tare-<version>-macOS-<arch>.dmg and its .sha256
checksum. The DMG contains one Tare.app and an Applications shortcut.
Installation replaces only the canonical /Applications/Tare.app; any prior
bundle is moved to the user's Trash for recovery, and no second app bundle is
left in dist/.
MIT. See LICENSE.
Model weights are never redistributed with this project. Tare discovers models already present in your own Hugging Face cache, and the release DMG contains only the app and, for a provisioned checkout, the Python runtime.