qv
Quick video / query video — a minimal agent tool for coding tutorials. Three MCP tools (index, search, inspect_frame), one CLI (qv), one Python package.
Agents navigate screencasts by searching speech, then pulling precise frames for vision — without transcript dumps or 40-tool menus.
PyPI: install as query-video (qv is blocked as a PyPI project name). The Python import and CLI remain qv.
Install
uv tool install 'query-video[stt]'
# or
pip install 'query-video[stt]'
Provides the qv command. Optional extras: [mcp], [stt], [all].
System deps: ffmpeg on PATH. yt-dlp is bundled via pip. Indexing requires the [stt] extra (faster-whisper).
Development setup
Prerequisites: Python 3.12+, uv, ffmpeg and ffprobe on PATH.
git clone https://github.com/jkvc/qv.git
cd qv
uv sync --group dev
uv sync --extra stt
git config core.hooksPath .githooks # optional; runs lint/format/unit tests on push
Run from the repo (editable install via uv sync):
uv run qv --help
uv run pytest
uv run pytest -m integration
uv run ruff check . && uv run ruff format --check .
GPU Whisper (optional): default device=auto uses CUDA when a GPU is visible. ctranslate2 4.x needs CUDA 12 user-space libs (e.g. on Ubuntu/Pop: sudo apt install libcublas12 libcudart12). If GPU libs are missing, indexing fails — set QV_DEVICE=cpu or device="cpu" in code. See notes/20260614-v0-config-and-tooling.md.
Lib usage:
from qv.lib.api import index_video, search_video, inspect_frame
CLI
qv index URL --json
qv search VIDEO_ID "useState setup" --json
qv inspect-frame VIDEO_ID --at 754 --json
qv mcp # stdio MCP server (requires [mcp] extra)
CLI commands are stubs; use qv.lib.api directly until wired.
MCP (Cursor, Claude Code, etc.)
{
"mcpServers": {
"qv": {
"command": "uvx",
"args": ["--from", "query-video[mcp]", "qv", "mcp"],
"env": {
"QV_CACHE": "~/.cache/qv",
"QV_DEVICE": "cpu"
}
}
}
}
Layout
| PyPI package | query-video |
| Python import | qv (src/qv/) |
| CLI | qv only |
| Lib API | from qv.lib.api import index_video, search_video, inspect_frame |
| GitHub repo | jkvc/qv |
Cache default: ~/.cache/qv (override with QV_CACHE).
Configuration
Precedence: call-site args → env → ~/.config/qv/config.toml → defaults.
| Setting | Default | Env | Config key |
|---|---|---|---|
| STT model | whisper_base |
QV_MODEL_NAME (legacy: QV_WHISPER_MODEL = bare size) |
model_name |
| Device | auto |
QV_DEVICE |
device |
| Frame quality | p720 |
QV_FRAME_QUALITY |
frame_quality |
| Frame window (s) | 15 |
QV_FRAME_WINDOW |
frame_window_s |
| Cache dir | ~/.cache/qv |
QV_CACHE |
cache_dir |
model_name is backend-qualified: whisper_base, whisper_small, soniox, etc. device (auto / cpu / cuda) applies to whisper only.
Example ~/.config/qv/config.toml:
model_name = "whisper_base"
device = "auto"
Override config file path with QV_CONFIG. Interactive qv configure is planned.
Publishing (PyPI)
Single PyPI project query-video ships the qv Python package and qv CLI entrypoint. The name qv is prohibited on PyPI.
Version bump:
pyproject.toml→[project].versionsrc/qv/__init__.py→__version__
uv lock
uv build
uv publish dist/query_video-*
Smoke test:
uv tool install 'query-video[stt]==X.Y.Z'
qv --version
Status
Core lib implements index_video, search_video, inspect_frame via qv.lib.api. CLI and MCP entrypoints exist but are not fully wired.
Docs: notes/20260614-qv-implementation-spec.md (v0 spec) · notes/20260614-v0-config-and-tooling.md (config session log) · notes/20260614-pypi-query-video.md (PyPI naming)
Metadata
Release files for query-video 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| query_video-0.1.1.tar.gz | 99.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| query_video-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 123.2 kB
Release files / query_video-0.1.1.tar.gz
| Download URL | query_video-0.1.1.tar.gz |
|---|---|
| Size | 99.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
916e808f0d692a2d3d6e3b68093b4d2a87406d59cea54490bfc8313dbf04c6c4
|
|
BLAKE2b-256 checksum How to use checksums |
bccdd6bc741b57510f31fad6957a45976bd48092a611206db49357b6022ef28f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / query_video-0.1.1-py3-none-any.whl
| Download URL | query_video-0.1.1-py3-none-any.whl |
|---|---|
| Size | 24.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
88145ed746b880d1a9e94e94b3f19b5499be6c9f5a2d35d5c407875d4104e4ef
|
|
BLAKE2b-256 checksum How to use checksums |
0085bcbc6767a9ac08cfdeb6ead107d2d9db7e9e93c5486111a6a9a19a789b63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.21 {"installer":{"name":"uv","version":"0.11.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Pop!_OS","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|