AI-powered video review automation for screencast commentary analysis. Transform your voice descriptions into actionable findings for engineering teams.
ScreenScribe extracts actionable insights from screencast recordings by transcribing audio commentary, detecting mentions of bugs, changes, and UI issues, capturing relevant screenshots, and generating comprehensive reports with AI-powered semantic analysis.
Status: v0.1.9 — HTML Pro reports + Interactive Review Server + separated review window + ZIP export.
ScreenScribe uses LibraxisAI API by default, but is fully compatible with any provider supporting the Responses API (OpenAI, Anthropic, etc.).
Use different providers for different tasks — e.g., LibraxisAI for cheaper STT, OpenAI for VLM:
# ~/.config/screenscribe/config.env
# Per-endpoint API keys (hybrid setup)
LIBRAXIS_API_KEY=your-libraxis-key # → STT (cheaper transcription)
OPENAI_API_KEY=sk-proj-xxx # → VLM (unified analysis)
# Explicit endpoints (full URLs - recommended)
SCREENSCRIBE_STT_ENDPOINT=https://api.libraxis.cloud/v1/audio/transcriptions
SCREENSCRIBE_LLM_ENDPOINT=https://api.openai.com/v1/responses
SCREENSCRIBE_VISION_ENDPOINT=https://api.openai.com/v1/responses- Interactive Review Server (
review): local web app with synchronized player, browser-based STT, manual frame capture, and disk persistence. - Separated Review Window: detach the findings/review surface into its own synced browser window while keeping the player open.
- HTML Pro Report: Interactive report with video player, subtitle sync, annotation tools (pen/rect/arrow), and ZIP export.
- Transcript-First Workflow (
preprocess): Build an artifact bundle with stable transcripts before running expensive AI analysis. - Unified VLM Pipeline: Single VLM call analyzes screenshot + full transcript together (~45% faster than separate LLM+VLM).
- Batch Mode: Process multiple videos with shared context — VLM remembers findings across videos.
- Audio Quality Validation: Detects silent recordings and warns about missing microphone input.
- Resumable Pipeline: Checkpoint system allows resuming interrupted processing.
- i18n Support: Prompts adapt to selected language (Polish, English).
| Component | Technology | Purpose |
|---|---|---|
| CLI Framework | Typer | Modern, type-hinted CLI |
| HTTP Client | httpx | Async-ready, long timeout support |
| Terminal UI | Rich | Progress bars, panels, tables |
| Media Processing | FFmpeg / FFprobe | Audio extraction, frame capture |
| AI Backend | LibraxisAI / OpenAI | STT, LLM, Vision models |
| Package Manager | uv | Fast, modern Python packaging |
- Python 3.11+
- uv package manager
- FFmpeg (for audio/video processing)
- LibraxisAI or OpenAI API key
# Clone the repository
git clone https://github.com/VetCoders/ScreenScribe.git
cd Screenscribe
# Install globally using uv (recommended)
make install
# Verify installation
screenscribe version# Full analysis and launch interactive review server
screenscribe review path/to/video.mov
# Fast mode: keyword-based detection only (no LLM pre-filter)
screenscribe review video.mov --keywords-only
# Transcript-first artifact bundle for downstream review
screenscribe preprocess video.mov# Initialize config and set API key
screenscribe config --init
screenscribe config --set-key YOUR_LIBRAXIS_API_KEY
# Or manually edit ~/.config/screenscribe/config.envIn HTML Pro review mode, use Open Review Window to detach the findings panel into a separate synced window.
# See time estimate before processing
screenscribe review video.mov --estimate
# Dry run: transcribe + detect only (no AI, no screenshots)
screenscribe review video.mov --dry-run
# Output to specific directory
screenscribe review video.mov -o ./my-review
# Skip vision analysis (faster)
screenscribe review video.mov --no-vision
# Resume interrupted processing
screenscribe review video.mov --resume
# Use custom keywords
screenscribe review video.mov --keywords-file my_keywords.yaml
# English language (affects transcription + AI prompts)
screenscribe review video.mov --lang en
# Transcription only
screenscribe transcribe video.mov -o transcript.txtflowchart TD
A[Video File] --> B[Audio Extraction]
B --> C[Transcription]
C --> D{Detection Mode}
D -->|Default| D1[Semantic Pre-Filter]
D -->|--keywords-only| D2[Keyword Matching]
D1 --> E[Screenshots]
D2 --> E
E --> F[Semantic Analysis]
F --> G[Vision Analysis]
G --> H[Report Generation]
B -.- B1[FFmpeg extracts audio track]
C -.- C1[LibraxisAI STT with timestamps]
D1 -.- D1a[LLM analyzes full transcript]
D2 -.- D2a[Regex keyword matching - PL/EN]
E -.- E1[FFmpeg frame extraction]
F -.- F1[LLM severity + action items]
G -.- G1[VLM screenshot analysis]
H -.- H1[JSON + Markdown output]
| Mode | Flag | Description |
|---|---|---|
| Semantic (default) | — | LLM analyzes entire transcript before frame extraction. Finds more issues, including those without explicit keywords. |
| Keywords | --keywords-only |
Fast regex-based detection using predefined keyword patterns. Lower API costs, faster processing. |
{video}_review/
├── {video}_transcript.txt # Full transcription
├── {video}_report.json # Machine-readable report
├── {video}_report.md # Human-readable Markdown
├── {video}_report.html # HTML Pro report (only with --pro)
└── screenshots/
├── 01_bug_01-23.jpg
├── 02_change_02-45.jpg
└── ...
Each report includes:
- Executive Summary: AI-generated overview of key issues and priorities
- Statistics: Breakdown by category (bugs, changes, UI) and severity
- Detailed Findings: For each detected issue:
- Timestamp and category
- Original transcript text
- Context (surrounding dialogue)
- AI Analysis:
- Issue detection (
is_issue: true/false) - distinguishes real problems from confirmations - Sentiment (problem/positive/neutral) - tone of user's statement
- Severity rating (critical/high/medium/low/none)
- Summary
- Affected components
- Action items
- Suggested fix
- Issue detection (
- Screenshot
Config file location: ~/.config/screenscribe/config.env
# API Key (pick one)
SCREENSCRIBE_API_KEY=your-api-key
# OPENAI_API_KEY=sk-proj-xxx
# LIBRAXIS_API_KEY=xxx
# Explicit Endpoints (full URLs - recommended)
SCREENSCRIBE_STT_ENDPOINT=https://api.openai.com/v1/audio/transcriptions
SCREENSCRIBE_LLM_ENDPOINT=https://api.openai.com/v1/responses
SCREENSCRIBE_VISION_ENDPOINT=https://api.openai.com/v1/responses
# Alternative: Base URL (auto-derives /v1/... paths)
# SCREENSCRIBE_API_BASE=https://api.libraxis.cloud
# Models
SCREENSCRIBE_STT_MODEL=whisper-1
SCREENSCRIBE_LLM_MODEL=gpt-4o
SCREENSCRIBE_VISION_MODEL=gpt-4o
# Processing Options
SCREENSCRIBE_LANGUAGE=pl
SCREENSCRIBE_SEMANTIC=true
SCREENSCRIBE_VISION=trueFull video analysis pipeline.
screenscribe review VIDEO [OPTIONS]
Options:
-o, --output PATH Output directory (default: VIDEO_review/)
-l, --lang TEXT Language code for transcription and AI prompts (default: pl)
-k, --keywords-file PATH Custom keywords YAML file
--keywords-only Use fast keyword-based detection instead of semantic pre-filter
--local Use local STT server instead of cloud
--semantic/--no-semantic Enable/disable LLM analysis (default: enabled)
--vision/--no-vision Enable/disable vision analysis (default: enabled)
--json/--no-json Save JSON report (default: enabled)
--markdown/--no-markdown Save Markdown report (default: enabled)
--resume Resume from previous checkpoint if available
--estimate Show time estimate without processing
--dry-run Run transcription and detection only, then stopTranscription only, without analysis.
screenscribe transcribe VIDEO [OPTIONS]
Options:
-o, --output PATH Output file for transcript
-l, --lang TEXT Language code (default: pl)
--local Use local STT serverTranscript-first preprocessing bundle without semantic or vision analysis.
screenscribe preprocess VIDEO [OPTIONS]
Options:
-o, --output PATH Output directory for preprocess artifacts
-l, --lang TEXT Language code (default: pl)
--local Use local STT server
--audio/--no-audio Include extracted audio in the bundle (default: enabled)
--force Reuse output directory if preprocess artifacts already existManage configuration.
screenscribe config [OPTIONS]
Options:
--show Show current configuration
--init Create default config file
--init-keywords Create keywords.yaml for customization
--set-key TEXT Set API key in configShow version information.
ScreenScribe detects issues based on keywords in both Polish and English:
Bugs: bug, błąd, nie działa, crash, error, broken, failed, exception...
Changes: zmiana, zmienić, poprawić, update, modify, refactor, rename...
UI Issues: UI, interfejs, wygląd, layout, design, button, margin, padding...
Create a custom keywords file for your project:
# Generate default keywords.yaml
screenscribe config --init-keywords
# Or use with review command
screenscribe review video.mov --keywords-file my_keywords.yamlKeywords file format (YAML):
bug:
- "nie działa"
- "broken"
- "crash"
change:
- "trzeba zmienić"
- "should fix"
ui:
- "button"
- "layout"ScreenScribe automatically searches for keywords.yaml in the current directory.
Typical processing times for a 15-minute video:
| Step | Duration |
|---|---|
| Audio extraction | ~5s |
| Transcription | ~30s |
| Issue detection | <1s |
| Screenshot extraction | ~10s |
| Semantic analysis (44 issues) | ~8-10 min |
| Vision analysis (optional) | ~20+ min |
# Clone and setup
git clone https://github.com/VetCoders/ScreenScribe.git
cd ScreenScribe
make dev
# Run from source
uv run screenscribe review video.mov
# Quality checks
make lint # ruff check
make typecheck # mypy
make check # all quality checks
# Testing
make test # unit tests (fast, no API needed)
make test-integration # integration tests (requires LIBRAXIS_API_KEY)
make test-all # all tests
# Formatting
make format # ruff format + fixmake install # uv tool install . (global CLI)
make dev # Install dev dependencies
make test # Run unit tests
make test-integration # Run integration tests (requires API key)
make lint # Run ruff linter
make format # Format code with ruff
make typecheck # Run mypy type checker
make check # All quality checks
make clean # Remove caches and artifacts
screenscribe/
├── __init__.py # Version info
├── cli.py # Typer CLI interface
├── config.py # Configuration management (per-endpoint keys)
├── audio.py # FFmpeg audio extraction
├── transcribe.py # LibraxisAI STT integration
├── detect.py # Keyword-based issue detection
├── semantic_filter.py # Semantic pre-filtering pipeline
├── keywords.py # Custom keywords loading (YAML)
├── screenshots.py # Frame extraction
├── unified_analysis.py # Unified VLM pipeline (replaces semantic+vision)
├── image_utils.py # Shared image encoding utilities
├── semantic.py # LLM semantic analysis (legacy)
├── vision.py # Vision model analysis (legacy)
├── report.py # Report generation (JSON/Markdown)
├── prompts.py # i18n prompt templates (PL/EN)
├── api_utils.py # Retry logic, API utilities
├── checkpoint.py # Pipeline checkpointing
├── validation.py # Model availability validation (fail-fast)
└── default_keywords.yaml # Default detection keywords
tests/
├── test_detect.py # Detection unit tests
├── test_semantic_filter.py # Semantic filter unit tests (54 tests)
├── test_validation.py # Validation unit tests
└── test_integration.py # API integration tests
ScreenScribe uses LibraxisAI's unified API:
- STT:
POST /v1/audio/transcriptions(OpenAI-compatible) - LLM:
POST /v1/responses(Responses API format) - Vision:
POST /v1/responseswithinput_image(auto-routed to VLM)
| Tool | Purpose | Config |
|---|---|---|
| mypy | Type checking | Strict mode enabled |
| Ruff | Linting + formatting | E, W, F, I, B, C4, UP, S, RUF rules |
| Bandit | Security linting | Pre-commit hook |
| Semgrep | Static analysis | Pre-commit hook |
| detect-secrets | Secret detection | Baseline tracking |
All code is fully type-hinted and passes strict mypy checks.
- Audio extraction (FFmpeg)
- Transcription (LibraxisAI STT API)
- Issue detection (keyword-based, PL/EN)
- Screenshot extraction (single + batch)
- Semantic analysis (LLM)
- Vision analysis (VLM)
- Report generation (JSON + Markdown)
- Configuration management (.env, env vars)
- CLI with 4 commands
- Pre-commit hooks
- Type hints (mypy strict)
- Custom keyword configuration (YAML)
- Progress save/resume (checkpointing)
- Retry logic with exponential backoff
- i18n prompts (PL/EN)
- Test suite (pytest)
- Sentiment detection (is_issue, sentiment fields)
- Audio quality validation (silent recording detection)
- Model availability validation (fail-fast)
- Response API chaining (vision context from semantic)
- AI-optimized report format
- Local model support for LLM/Vision
- Batch processing / queue system
- More languages for prompts
- Web UI
- Vision analysis can be slow (~20+ min for many issues)
MIT License
Made with (งಠ_ಠ)ง by the ⌜ ScreenScribe ⌟ 𝖙𝖊𝖆𝖒 (c) 2025 Maciej & Monika + Klaudiusz (AI) + Mixerka (AI)