Simple local web UI for captioning image/video datasets with optional local VLM auto-captioning
Project description
nori-captioner
Local Vision Caption Studio for Images and Video.
A web UI for captioning image/video datasets in-place using local VLMs.
Captions are saved as sidecar .txt files next to each media file.
Quick start
uvx nori-captioner
Scans the current directory (or a given path) recursively for images and videos and opens a local web UI.
uvx nori-captioner /path/to/dataset
Features
- Recursive directory scan — hidden directories are excluded
- Per-file metadata display: resolution, duration, frame count, fps
- Manual caption editing with autosave and save-state feedback
- Upload images/videos via file picker or drag-and-drop
- Delete files (removes media and sidecar caption together)
- Caption lock support with persistent locked state per media item
- Auto-captioning queue with single-file and batch modes
- Configurable user prompt — editable in the UI and persisted to disk
- Pagination and filters for all / captioned / uncaptioned / unlocked / locked / queued
Auto-captioning with local VLMs
Run with VLM extras:
uvx --from 'nori-captioner[vlm]' nori-captioner
Note: Qwen3-VL requires
torchvision, which is included in thevlmextra. On Linux x86_64, CUDA 12.8 wheels fortorchandtorchvisionare used automatically.
Optional 4-bit / 8-bit quantization:
uvx --from 'nori-captioner[vlm,quantize]' nori-captioner
Run with a built-in model alias:
uvx --from 'nori-captioner[vlm]' nori-captioner --model qwen3-vl:8b
Or pass any Hugging Face model ID directly:
uvx --from 'nori-captioner[vlm]' nori-captioner --model your-org/your-vlm
Model aliases
| Alias | Model |
|---|---|
qwen3-vl:2b |
Qwen/Qwen3-VL-2B-Instruct |
qwen3-vl:4b |
Qwen/Qwen3-VL-4B-Instruct |
qwen3-vl:8b |
Qwen/Qwen3-VL-8B-Instruct |
qwen3-vl:32b |
Qwen/Qwen3-VL-32B-Instruct |
qwen3-vl:30b |
Qwen/Qwen3-VL-30B-A3B-Instruct |
qwen2.5-vl:3b |
Qwen/Qwen2.5-VL-3B-Instruct |
qwen2.5-vl:7b |
Qwen/Qwen2.5-VL-7B-Instruct |
qwen2.5-vl:72b |
Qwen/Qwen2.5-VL-72B-Instruct |
qwen2-vl:2b |
Qwen/Qwen2-VL-2B-Instruct |
qwen2-vl:7b |
Qwen/Qwen2-VL-7B-Instruct |
qwen2-vl:72b |
Qwen/Qwen2-VL-72B-Instruct |
gemma3:4b |
google/gemma-3-4b-it |
gemma3:12b |
google/gemma-3-12b-it |
gemma3:27b |
google/gemma-3-27b-it |
CLI options
| Option | Default | Description |
|---|---|---|
directory |
. |
Directory to scan |
--model |
none | Model alias or HF model ID |
--quantize |
none | 4 or 8 bit quantization |
--device |
auto |
auto, cuda, mps, or cpu |
--frames |
8 |
Video frames sampled per auto-caption |
--system-prompt |
built-in | System prompt for model behavior |
--prompt |
built-in | Captioning prompt (also editable in UI) |
--host |
127.0.0.1 |
Server bind address |
--port |
8765 |
Server port |
--no-browser |
false | Suppress automatic browser open |
Prompt persistence
The user prompt edited in the web UI is saved to .nori-captioner.settings.json in the scanned
directory and automatically restored on next launch.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nori_captioner-0.1.3.tar.gz.
File metadata
- Download URL: nori_captioner-0.1.3.tar.gz
- Upload date:
- Size: 173.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
05003e1b238d5f09a08ab214a8bf9a59eb8fdb07015a5daa12b198ba3b420bc5
|
|
| MD5 |
599281f3a2573075d76c729a1b675a58
|
|
| BLAKE2b-256 |
190a5d134e4611bfba417844159cf49f58865e3e03b43d9347200f2990e33f0b
|
File details
Details for the file nori_captioner-0.1.3-py3-none-any.whl.
File metadata
- Download URL: nori_captioner-0.1.3-py3-none-any.whl
- Upload date:
- Size: 25.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
934f8eb8bff936862df1313a1445bc96c12e53c83d8062ba103f8c236c067e1e
|
|
| MD5 |
fda6083c210e7cae050d67762220ff08
|
|
| BLAKE2b-256 |
0ed0e09593ea1cf6dfbdef160b31fe3669c66c24343027914d35f4a76ce6e307
|