Local-first audio transcription, speaker diarization, and meeting notes. Built on Scriberr.
Go
0
918 commits
updated Oct 13, 2026
Self-hosted audio transcription, with your recordings and workflow under your control.
Releases · Migration guide · Release and deployment guide · Attribution
Jotist turns audio and video into searchable transcripts, speaker labels, notes, and summaries. Run local speech models on your own server, compare preserved transcription attempts, and choose the model and execution settings that suit your hardware.
This is Jay Esquivel's independently maintained continuation of Scriberr, created by Rishikanth Chandrasekaran and the upstream contributors. Jotist preserves that history and the original MIT license.
Jotist’s recording library. All recordings shown are synthetic demo content.
Local transcription processes audio on your server. Optional cloud transcription sends audio to the selected provider; optional summaries and chat send content to the configured LLM provider. Model files and runtime dependencies may require downloads. Model support and hardware requirements vary: see the in-app catalog and model comparison notes.
We ran a single 59m 48.82s English recording through 17 recognition configurations and six external diarizers, plus native MOSS. This is an anecdotal measurement on one recording, using Jotist v1.8.0 on September 29–30, 2026.
Hardware: NVIDIA RTX 3060 with 12 GiB VRAM · AMD Ryzen 7 5700G, 8 cores / 16 threads · 64 GiB installed RAM.
Time is minutes:seconds per audio hour. Peak and Avg are whole-card VRAM in GiB; Avg is weighted by sampled CUDA-stage time. Scroll horizontally to compare diarizers. † marks completed runs whose timed end coverage was unconfirmed.
| Recognition configuration | DiariZen | Pyannote 3.1 | Pyannote Community‑1 | Sortformer v2.1 | SUPlime | SUPlime-L | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | |
| Parakeet TDT 0.6B v3 | 6:27 | 6.29 | 1.23 | 4:11 | 11.43 | 2.33 | 3:53 | 11.43 | 2.43 | 2:49 | 6.29 | 1.86 | 9:53 | 7.12 | 6.46 | 11:33 | 10.44 | 9.47 |
| Whisper large‑v3 · default | 8:05 | 8.71 | 2.09 | 4:52 | 11.43 | 3.70 | 4:33 | 11.43 | 3.82 | 3:17 | 8.62 | 3.98 | 11:03 | 8.83 | 6.59 | 12:42 | 10.44 | 9.29 |
| Whisper large‑v3 · custom prompt | 8:56† | 4.83 | 2.08 | 5:42† | 11.43 | 3.38 | 6:29† | 11.43 | 3.23 | 4:22† | 4.80 | 3.48 | 12:14† | 7.12 | 6.12 | 13:54† | 10.44 | 8.63 |
| Canary 1B v2 · FP16/40s | 8:16 | 2.93 | 1.09 | 5:22 | 11.43 | 1.83 | 9:03 | 11.43 | 1.47 | 9:00 | 4.01 | 0.66 | 11:36 | 7.12 | 5.51 | 13:30 | 10.44 | 8.06 |
| Canary 1B v2 · BF16/full | 7:09† | 8.38 | 1.19 | 5:04† | 11.43 | 1.90 | 3:43† | 11.43 | 2.63 | 1:42† | 8.38 | 2.67 | 9:40† | 8.38 | 6.57 | 11:24† | 10.44 | 9.52 |
| Canary Qwen 2.5B | 11:20 | 5.10 | 2.54 | 9:02 | 11.43 | 3.29 | 9:13 | 11.43 | 3.47 | 6:54 | 5.10 | 3.77 | 14:20 | 7.12 | 5.83 | 15:49 | 10.44 | 8.11 |
| Cohere Transcribe | 7:26 | 4.46 | 1.44 | 4:52 | 11.43 | 2.53 | 4:21 | 11.43 | 2.68 | 2:42 | 4.46 | 2.68 | 10:24 | 7.12 | 6.35 | 12:03 | 10.44 | 9.18 |
| Granite 5.0 470M | 5:57 | 2.32 | 0.83 | 4:02 | 11.43 | 1.59 | 3:48 | 11.43 | 1.93 | 1:29 | 4.01 | 0.73 | 9:18 | 7.12 | 6.56 | 11:00 | 10.44 | 9.63 |
| Granite 5.0 470M NC | 5:51 | 2.32 | 0.83 | 3:23 | 11.43 | 1.94 | 3:48 | 11.43 | 1.68 | 1:30 | 3.85 | 0.76 | 9:31 | 7.12 | 6.47 | 11:10 | 10.44 | 9.54 |
| Granite 4.1 2B | 10:31 | 4.65 | 2.30 | 8:18 | 11.43 | 3.01 | 7:03 | 11.43 | 3.44 | 5:28 | 4.65 | 3.72 | 13:16 | 7.12 | 5.99 | 14:54 | 10.44 | 8.32 |
| Granite 4.1 2B Plus | 31:50 | 4.41 | 3.68 | 28:04 | 11.43 | 4.08 | 29:40 | 11.43 | 4.09 | 27:17 | 4.30 | 4.15 | 34:36 | 7.12 | 4.91 | 36:33 | 10.44 | 5.92 |
| Qwen3 ASR 0.6B | 9:37 | 2.32 | 1.30 | 7:50 | 11.43 | 1.98 | 6:35 | 11.43 | 2.01 | 6:24 | 4.02 | 1.54 | 13:38 | 7.12 | 5.08 | 14:40 | 10.44 | 7.68 |
| Qwen3 ASR 1.7B | 9:59 | 4.42 | 2.28 | 7:20 | 11.43 | 3.25 | 6:58 | 11.43 | 3.31 | 5:35 | 4.40 | 3.46 | 13:14 | 7.12 | 5.88 | 14:52 | 10.44 | 8.25 |
| Ark 3B | 10:34 | 7.58 | 3.44 | 7:26 | 11.43 | 4.96 | 7:22 | 11.43 | 4.94 | 5:26 | 7.58 | 5.83 | 13:13 | 7.58 | 6.86 | 14:56 | 10.44 | 9.04 |
| Voxtral Mini 3B | 10:42 | 9.18 | 4.29 | 8:06 | 11.43 | 5.87 | 7:58 | 11.43 | 5.94 | 6:25 | 9.18 | 6.61 | 13:39 | 9.18 | 7.40 | 15:19 | 10.44 | 9.51 |
| MOSS Preview 2B | 10:06 | 5.26 | 2.64 | 8:18 | 11.43 | 3.66 | 6:56 | 11.43 | 3.77 | 6:17 | 5.26 | 4.01 | 14:13 | 7.12 | 5.96 | 15:49 | 10.44 | 8.17 |
| MOSS 0.9B | Failed | Failed | Failed | Failed | Failed | Failed | ||||||||||||
Parakeet + Sortformer completed in 2:49 per audio hour, with 6.29 GiB peak / 1.86 GiB average VRAM. Across the study, 96 of 103 cases completed on CUDA without recorded retries or CPU fallback; 84 met the timed coverage check. Pyannote variants reached 11.43 GiB and SUPlime-L 10.44 GiB, leaving tight memory margins on this card.
Full numerical results (CSV) include exact elapsed time/RTF, configuration and checkpoint details, actual stage devices, recovery/fallback, failures, GPU and host memory, timed coverage, output counts, and contention evidence.
elapsed_seconds × 3600 / 3588.82, rounded to the nearest second. Only time is normalized; memory is observed. Model/dependency caches were retained.RecognitionError / application_ae1b7676702d (outer error: adapter_failed). External diarizers were not reached. Failure timings and resource measurements are retained in the CSV.Jotist 2.2.0 provides CPU and CUDA 12.6 container variants. See the release notes for the published release and the release guide for image qualification.
| Hardware | Versioned image |
|---|---|
| CPU | ghcr.io/jaysqvl/jotist:2.2.0 |
| CUDA 12.6-compatible NVIDIA GPU | ghcr.io/jaysqvl/jotist:2.2.0-cuda |
| Blackwell / RTX 50-series | Local CUDA 13 source build only; actual inference remains unqualified |
Selected CPU and CUDA 12.6 model pipelines passed prior runtime qualification, including retained-environment migration checks. Qualify the selected released image with your own data and runtimes before cutover. Blackwell source builds have dependency-resolution and native-library checks, but no actual Blackwell inference qualification; they are excluded from the default stable image publication.
Published container builds currently target Linux amd64. Release archives provide Linux, macOS, and Windows server binaries for amd64 and arm64; availability of optional model runtimes depends on the platform.
For a new CPU installation:
git clone https://github.com/jaysqvl/Jotist.git
cd Jotist
docker compose up -d
Open localhost:8080, then create the first account. For CUDA 12.6, run docker compose --project-directory . -f deploy/compose/cuda.yaml up -d with a compatible host driver and NVIDIA Container Toolkit. See container deployment for local builds and the existing-install path mapping.
Existing Scriberr installation: follow the migration guide before starting a stack from a new directory. Preserve the existing database, uploads, JWT secret, model storage, and Compose volume mapping. A different Compose project name can create empty named volumes instead of opening your existing data.
Use a digest-pinned image for deployments you need to reproduce. Release workflow summaries report the exact image digest and source commit; see the release guide.
Maintainers who want to follow unreleased main changes can use
ghcr.io/jaysqvl/jotist:dev-cuda. Successful development builds update this CUDA
12.6 channel after validation; updating the running container remains a separate
step. See the development channel instructions
for adopting an already qualified image and retaining a rollback digest.
The server reads environment variables and an optional .env file in its working directory. Docker images supply production defaults.
| Variable | Purpose | Default outside Docker |
|---|---|---|
HOST, PORT | Listening interface and port | 0.0.0.0, 8080 |
APP_ENV | Application environment | development |
DATABASE_PATH | SQLite database | data/jotist.db |
UPLOAD_DIR, TRANSCRIPTS_DIR | Recordings and transcript storage | data/uploads, data/transcripts |
WHISPERX_ENV | Managed Python/model runtime storage | data/whisperx-env |
JWT_SECRET, JWT_SECRET_FILE | Existing signing secret or persistent secret file | Generated at data/jwt_secret when unset |
HF_TOKEN | Optional Hugging Face access token | Empty |
OPENAI_API_KEY | Optional cloud provider key | Empty |
QUEUE_WORKERS | Explicit recording concurrency override; locks the Settings control | Saved Settings limit, otherwise 1 |
ALLOWED_ORIGINS | Comma-separated browser origins | Local development origins |
TRUSTED_PROXIES | Trusted proxy IPs/CIDRs for forwarded headers | None |
SECURE_COOKIES | Cookie transport mode | auto |
PUID, PGID | Container runtime UID/GID | 1000, 1000 |
The existing upload, authentication, media concurrency, timeout, and runtime environment settings remain supported. Keep your current values when migrating. Gated models may require both a token and acceptance of their model terms.
Recording runs share one worker by default. Set Simultaneous recordings in Settings → Transcription → Processing queue to change the limit across recordings. One is recommended for a single GPU. Changes are saved across restarts; lowering the limit lets active runs finish before starting more work. Each recording keeps its own run order. The run queue shows active work and the two latest queued runs across recordings. Every row names its recording, model and what it is waiting on. Show all queued runs expands the same list. Newest-first display does not change each recording’s processing order. New runs record the active stage number against their enabled execution boundaries; older runs without that metadata show the stage name.
Open Settings → Models to see downloaded recognition, word timing and speaker models, their disk usage, cached revisions, saved profile references and most recent run. Search or sort by size, name or last use.
The inventory updates from run and model preparation events, without idle polling or a filesystem watcher. Jotist checks affected model files after preparation and stage completion, including partial downloads from failed runs. A full metadata check runs on the first inventory request, then on the next request after 72 hours, or when you select Refresh. Runtime and package totals come from that full check. External cache changes are picked up by a full check; weight contents are never read for this audit.
Remove deletes the selected model's cached files across its recognized cache locations. Saved profiles, recordings and run history stay intact. Active runs and downloads block removal; Jotist checks again when you confirm. Queued runs do not block removal and download missing files before processing. The confirmation warns if a queued run uses cached files only, because that request can fail after removal. Runtime environments and package caches are shown separately for auditing and retained.
The next run downloads missing model files again, using the same saved profile. It needs network access and any required model access token. Profiles configured to use cached files only need downloading enabled first; the confirmation dialog warns when such profiles reference the model. Unknown cache repositories remain visible for auditing and cannot be removed through Jotist. Disk usage estimates account for shared files, but filesystem compression and shared storage can affect the space actually freed. A model cached on disk is not necessarily loaded in GPU memory.
Download a platform archive from Jotist Releases, extract it, and run the server as ./jotist-server from its directory. Keep the included bin/cli directory beside the server so Settings can serve CLI downloads. Model execution also needs the appropriate Python, uv, FFmpeg, and optional accelerator/runtime dependencies; Docker includes the common system dependencies.
The CLI uses jotist. Install or update it from the Jotist application's Settings → CLI page. It uses ~/.jotist.yaml, JOTIST_* environment variables, and the jotist-watcher service. See CLI controls for commands and configuration. Existing installations should follow the migration guide before switching to the Jotist defaults.
Use the Go version in go.mod, Node.js 24, and the Python/uv runtimes required by the selected models.
cd web/frontend
npm ci
cd ../..
make build
./bin/jotist-server
The Go module is github.com/jaysqvl/Jotist. make dev runs Vite and the backend, using Air when it is already installed. make docs regenerates API documentation; make build-cli produces the Jotist CLI downloads. See Contributing for the development checks and source ownership for where changes belong.
See local speech validation, recoverable transcription, and the release guide for implementation and validation details. A listed model or passing unit test is not a promise of successful inference on every machine.
Jotist is distributed under the MIT license. It retains Scriberr's copyright and permission notice. MIT permits modification, redistribution, and commercial use subject to its terms; model weights and third-party components have their own licenses. See ATTRIBUTION.md.
Local-first audio transcription, speaker diarization, and meeting notes. Built on Scriberr.
Go
0
918 commits
updated Oct 13, 2026
Self-hosted audio transcription, with your recordings and workflow under your control.
Releases · Migration guide · Release and deployment guide · Attribution
Jotist turns audio and video into searchable transcripts, speaker labels, notes, and summaries. Run local speech models on your own server, compare preserved transcription attempts, and choose the model and execution settings that suit your hardware.
This is Jay Esquivel's independently maintained continuation of Scriberr, created by Rishikanth Chandrasekaran and the upstream contributors. Jotist preserves that history and the original MIT license.
Jotist’s recording library. All recordings shown are synthetic demo content.
Local transcription processes audio on your server. Optional cloud transcription sends audio to the selected provider; optional summaries and chat send content to the configured LLM provider. Model files and runtime dependencies may require downloads. Model support and hardware requirements vary: see the in-app catalog and model comparison notes.
We ran a single 59m 48.82s English recording through 17 recognition configurations and six external diarizers, plus native MOSS. This is an anecdotal measurement on one recording, using Jotist v1.8.0 on September 29–30, 2026.
Hardware: NVIDIA RTX 3060 with 12 GiB VRAM · AMD Ryzen 7 5700G, 8 cores / 16 threads · 64 GiB installed RAM.
Time is minutes:seconds per audio hour. Peak and Avg are whole-card VRAM in GiB; Avg is weighted by sampled CUDA-stage time. Scroll horizontally to compare diarizers. † marks completed runs whose timed end coverage was unconfirmed.
| Recognition configuration | DiariZen | Pyannote 3.1 | Pyannote Community‑1 | Sortformer v2.1 | SUPlime | SUPlime-L | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | Time | Peak | Avg | |
| Parakeet TDT 0.6B v3 | 6:27 | 6.29 | 1.23 | 4:11 | 11.43 | 2.33 | 3:53 | 11.43 | 2.43 | 2:49 | 6.29 | 1.86 | 9:53 | 7.12 | 6.46 | 11:33 | 10.44 | 9.47 |
| Whisper large‑v3 · default | 8:05 | 8.71 | 2.09 | 4:52 | 11.43 | 3.70 | 4:33 | 11.43 | 3.82 | 3:17 | 8.62 | 3.98 | 11:03 | 8.83 | 6.59 | 12:42 | 10.44 | 9.29 |
| Whisper large‑v3 · custom prompt | 8:56† | 4.83 | 2.08 | 5:42† | 11.43 | 3.38 | 6:29† | 11.43 | 3.23 | 4:22† | 4.80 | 3.48 | 12:14† | 7.12 | 6.12 | 13:54† | 10.44 | 8.63 |
| Canary 1B v2 · FP16/40s | 8:16 | 2.93 | 1.09 | 5:22 | 11.43 | 1.83 | 9:03 | 11.43 | 1.47 | 9:00 | 4.01 | 0.66 | 11:36 | 7.12 | 5.51 | 13:30 | 10.44 | 8.06 |
| Canary 1B v2 · BF16/full | 7:09† | 8.38 | 1.19 | 5:04† | 11.43 | 1.90 | 3:43† | 11.43 | 2.63 | 1:42† | 8.38 | 2.67 | 9:40† | 8.38 | 6.57 | 11:24† | 10.44 | 9.52 |
| Canary Qwen 2.5B | 11:20 | 5.10 | 2.54 | 9:02 | 11.43 | 3.29 | 9:13 | 11.43 | 3.47 | 6:54 | 5.10 | 3.77 | 14:20 | 7.12 | 5.83 | 15:49 | 10.44 | 8.11 |
| Cohere Transcribe | 7:26 | 4.46 | 1.44 | 4:52 | 11.43 | 2.53 | 4:21 | 11.43 | 2.68 | 2:42 | 4.46 | 2.68 | 10:24 | 7.12 | 6.35 | 12:03 | 10.44 | 9.18 |
| Granite 5.0 470M | 5:57 | 2.32 | 0.83 | 4:02 | 11.43 | 1.59 | 3:48 | 11.43 | 1.93 | 1:29 | 4.01 | 0.73 | 9:18 | 7.12 | 6.56 | 11:00 | 10.44 | 9.63 |
| Granite 5.0 470M NC | 5:51 | 2.32 | 0.83 | 3:23 | 11.43 | 1.94 | 3:48 | 11.43 | 1.68 | 1:30 | 3.85 | 0.76 | 9:31 | 7.12 | 6.47 | 11:10 | 10.44 | 9.54 |
| Granite 4.1 2B | 10:31 | 4.65 | 2.30 | 8:18 | 11.43 | 3.01 | 7:03 | 11.43 | 3.44 | 5:28 | 4.65 | 3.72 | 13:16 | 7.12 | 5.99 | 14:54 | 10.44 | 8.32 |
| Granite 4.1 2B Plus | 31:50 | 4.41 | 3.68 | 28:04 | 11.43 | 4.08 | 29:40 | 11.43 | 4.09 | 27:17 | 4.30 | 4.15 | 34:36 | 7.12 | 4.91 | 36:33 | 10.44 | 5.92 |
| Qwen3 ASR 0.6B | 9:37 | 2.32 | 1.30 | 7:50 | 11.43 | 1.98 | 6:35 | 11.43 | 2.01 | 6:24 | 4.02 | 1.54 | 13:38 | 7.12 | 5.08 | 14:40 | 10.44 | 7.68 |
| Qwen3 ASR 1.7B | 9:59 | 4.42 | 2.28 | 7:20 | 11.43 | 3.25 | 6:58 | 11.43 | 3.31 | 5:35 | 4.40 | 3.46 | 13:14 | 7.12 | 5.88 | 14:52 | 10.44 | 8.25 |
| Ark 3B | 10:34 | 7.58 | 3.44 | 7:26 | 11.43 | 4.96 | 7:22 | 11.43 | 4.94 | 5:26 | 7.58 | 5.83 | 13:13 | 7.58 | 6.86 | 14:56 | 10.44 | 9.04 |
| Voxtral Mini 3B | 10:42 | 9.18 | 4.29 | 8:06 | 11.43 | 5.87 | 7:58 | 11.43 | 5.94 | 6:25 | 9.18 | 6.61 | 13:39 | 9.18 | 7.40 | 15:19 | 10.44 | 9.51 |
| MOSS Preview 2B | 10:06 | 5.26 | 2.64 | 8:18 | 11.43 | 3.66 | 6:56 | 11.43 | 3.77 | 6:17 | 5.26 | 4.01 | 14:13 | 7.12 | 5.96 | 15:49 | 10.44 | 8.17 |
| MOSS 0.9B | Failed | Failed | Failed | Failed | Failed | Failed | ||||||||||||
Parakeet + Sortformer completed in 2:49 per audio hour, with 6.29 GiB peak / 1.86 GiB average VRAM. Across the study, 96 of 103 cases completed on CUDA without recorded retries or CPU fallback; 84 met the timed coverage check. Pyannote variants reached 11.43 GiB and SUPlime-L 10.44 GiB, leaving tight memory margins on this card.
Full numerical results (CSV) include exact elapsed time/RTF, configuration and checkpoint details, actual stage devices, recovery/fallback, failures, GPU and host memory, timed coverage, output counts, and contention evidence.
elapsed_seconds × 3600 / 3588.82, rounded to the nearest second. Only time is normalized; memory is observed. Model/dependency caches were retained.RecognitionError / application_ae1b7676702d (outer error: adapter_failed). External diarizers were not reached. Failure timings and resource measurements are retained in the CSV.Jotist 2.2.0 provides CPU and CUDA 12.6 container variants. See the release notes for the published release and the release guide for image qualification.
| Hardware | Versioned image |
|---|---|
| CPU | ghcr.io/jaysqvl/jotist:2.2.0 |
| CUDA 12.6-compatible NVIDIA GPU | ghcr.io/jaysqvl/jotist:2.2.0-cuda |
| Blackwell / RTX 50-series | Local CUDA 13 source build only; actual inference remains unqualified |
Selected CPU and CUDA 12.6 model pipelines passed prior runtime qualification, including retained-environment migration checks. Qualify the selected released image with your own data and runtimes before cutover. Blackwell source builds have dependency-resolution and native-library checks, but no actual Blackwell inference qualification; they are excluded from the default stable image publication.
Published container builds currently target Linux amd64. Release archives provide Linux, macOS, and Windows server binaries for amd64 and arm64; availability of optional model runtimes depends on the platform.
For a new CPU installation:
git clone https://github.com/jaysqvl/Jotist.git
cd Jotist
docker compose up -d
Open localhost:8080, then create the first account. For CUDA 12.6, run docker compose --project-directory . -f deploy/compose/cuda.yaml up -d with a compatible host driver and NVIDIA Container Toolkit. See container deployment for local builds and the existing-install path mapping.
Existing Scriberr installation: follow the migration guide before starting a stack from a new directory. Preserve the existing database, uploads, JWT secret, model storage, and Compose volume mapping. A different Compose project name can create empty named volumes instead of opening your existing data.
Use a digest-pinned image for deployments you need to reproduce. Release workflow summaries report the exact image digest and source commit; see the release guide.
Maintainers who want to follow unreleased main changes can use
ghcr.io/jaysqvl/jotist:dev-cuda. Successful development builds update this CUDA
12.6 channel after validation; updating the running container remains a separate
step. See the development channel instructions
for adopting an already qualified image and retaining a rollback digest.
The server reads environment variables and an optional .env file in its working directory. Docker images supply production defaults.
| Variable | Purpose | Default outside Docker |
|---|---|---|
HOST, PORT | Listening interface and port | 0.0.0.0, 8080 |
APP_ENV | Application environment | development |
DATABASE_PATH | SQLite database | data/jotist.db |
UPLOAD_DIR, TRANSCRIPTS_DIR | Recordings and transcript storage | data/uploads, data/transcripts |
WHISPERX_ENV | Managed Python/model runtime storage | data/whisperx-env |
JWT_SECRET, JWT_SECRET_FILE | Existing signing secret or persistent secret file | Generated at data/jwt_secret when unset |
HF_TOKEN | Optional Hugging Face access token | Empty |
OPENAI_API_KEY | Optional cloud provider key | Empty |
QUEUE_WORKERS | Explicit recording concurrency override; locks the Settings control | Saved Settings limit, otherwise 1 |
ALLOWED_ORIGINS | Comma-separated browser origins | Local development origins |
TRUSTED_PROXIES | Trusted proxy IPs/CIDRs for forwarded headers | None |
SECURE_COOKIES | Cookie transport mode | auto |
PUID, PGID | Container runtime UID/GID | 1000, 1000 |
The existing upload, authentication, media concurrency, timeout, and runtime environment settings remain supported. Keep your current values when migrating. Gated models may require both a token and acceptance of their model terms.
Recording runs share one worker by default. Set Simultaneous recordings in Settings → Transcription → Processing queue to change the limit across recordings. One is recommended for a single GPU. Changes are saved across restarts; lowering the limit lets active runs finish before starting more work. Each recording keeps its own run order. The run queue shows active work and the two latest queued runs across recordings. Every row names its recording, model and what it is waiting on. Show all queued runs expands the same list. Newest-first display does not change each recording’s processing order. New runs record the active stage number against their enabled execution boundaries; older runs without that metadata show the stage name.
Open Settings → Models to see downloaded recognition, word timing and speaker models, their disk usage, cached revisions, saved profile references and most recent run. Search or sort by size, name or last use.
The inventory updates from run and model preparation events, without idle polling or a filesystem watcher. Jotist checks affected model files after preparation and stage completion, including partial downloads from failed runs. A full metadata check runs on the first inventory request, then on the next request after 72 hours, or when you select Refresh. Runtime and package totals come from that full check. External cache changes are picked up by a full check; weight contents are never read for this audit.
Remove deletes the selected model's cached files across its recognized cache locations. Saved profiles, recordings and run history stay intact. Active runs and downloads block removal; Jotist checks again when you confirm. Queued runs do not block removal and download missing files before processing. The confirmation warns if a queued run uses cached files only, because that request can fail after removal. Runtime environments and package caches are shown separately for auditing and retained.
The next run downloads missing model files again, using the same saved profile. It needs network access and any required model access token. Profiles configured to use cached files only need downloading enabled first; the confirmation dialog warns when such profiles reference the model. Unknown cache repositories remain visible for auditing and cannot be removed through Jotist. Disk usage estimates account for shared files, but filesystem compression and shared storage can affect the space actually freed. A model cached on disk is not necessarily loaded in GPU memory.
Download a platform archive from Jotist Releases, extract it, and run the server as ./jotist-server from its directory. Keep the included bin/cli directory beside the server so Settings can serve CLI downloads. Model execution also needs the appropriate Python, uv, FFmpeg, and optional accelerator/runtime dependencies; Docker includes the common system dependencies.
The CLI uses jotist. Install or update it from the Jotist application's Settings → CLI page. It uses ~/.jotist.yaml, JOTIST_* environment variables, and the jotist-watcher service. See CLI controls for commands and configuration. Existing installations should follow the migration guide before switching to the Jotist defaults.
Use the Go version in go.mod, Node.js 24, and the Python/uv runtimes required by the selected models.
cd web/frontend
npm ci
cd ../..
make build
./bin/jotist-server
The Go module is github.com/jaysqvl/Jotist. make dev runs Vite and the backend, using Air when it is already installed. make docs regenerates API documentation; make build-cli produces the Jotist CLI downloads. See Contributing for the development checks and source ownership for where changes belong.
See local speech validation, recoverable transcription, and the release guide for implementation and validation details. A listed model or passing unit test is not a promise of successful inference on every machine.
Jotist is distributed under the MIT license. It retains Scriberr's copyright and permission notice. MIT permits modification, redistribution, and commercial use subject to its terms; model weights and third-party components have their own licenses. See ATTRIBUTION.md.