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.
Metadata
Release files for nori-captioner 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nori_captioner-0.1.4.tar.gz | 174.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nori_captioner-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 199.9 kB
Release files / nori_captioner-0.1.4.tar.gz
| Download URL | nori_captioner-0.1.4.tar.gz |
|---|---|
| Size | 174.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c21a557dfd49e13cc475d6a36c6126cd27634eee832150fcacdd568ecf2aa93a
|
|
BLAKE2b-256 checksum How to use checksums |
08011e9b3fbcdc90be09dab9d8be0457d771c27a09e3bbaa90ebd9e05ca08316
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|
Release files / nori_captioner-0.1.4-py3-none-any.whl
| Download URL | nori_captioner-0.1.4-py3-none-any.whl |
|---|---|
| Size | 25.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
534750ced1c3dd8e57616e2093bbec426222dfa23f496a9d9567e7799fc41f9e
|
|
BLAKE2b-256 checksum How to use checksums |
acbe293922d10c15ad426480353d1a7eb0d571ce54a894f650ca6a73fe2e3861
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.3
|