AI eyes that roll through video footage — watch, understand, turn into code actions.
Project description
eyeroll
AI eyes that roll through video footage — watch, understand, act.
eyeroll is a collection of AI coding agent skills that analyze screen recordings, Loom videos, YouTube links, and screenshots, then turn them into code actions.
Skills
| Skill | What it does |
|---|---|
| watch-video | Watch a video and produce structured notes |
| video-to-pr | Watch a bug video → diagnose → fix → raise PR |
| video-to-skill | Watch a tutorial/demo → generate a Claude Code skill |
Install
# Install all skills
npx skills add mnvsk97/eyeroll
# Install a specific skill
npx skills add mnvsk97/eyeroll@video-to-pr
npx skills add mnvsk97/eyeroll@video-to-skill
npx skills add mnvsk97/eyeroll@watch-video
Setup
pip install eyeroll
brew install yt-dlp # for URL downloads (Loom, YouTube)
Option A: Gemini (default, API-based)
eyeroll init # or: export GEMINI_API_KEY=your-key
Get a free key at aistudio.google.com/apikey. Supports direct video upload, audio transcription. ~$0.15 per analysis.
Option B: Ollama + Qwen3-VL (local, private, free)
brew install ollama # install Ollama
ollama serve # start the server
No API key needed. The model is pulled automatically on first use (~6GB for qwen3-vl:8b). Runs entirely on your machine.
Usage
In Claude Code (via skills)
User: fix this bug: https://loom.com/share/abc123
→ video-to-pr skill activates, watches video, finds code, fixes, raises PR
User: watch this tutorial and create a skill from it: ./demo.mp4
→ video-to-skill skill activates, watches video, generates SKILL.md
User: look at this recording, what's going on?
→ watch-video skill activates, produces structured notes
Standalone CLI
# Gemini (default)
eyeroll watch https://loom.com/share/abc123
eyeroll watch ./bug.mp4 --context "checkout broken after PR #432"
# Ollama (local)
eyeroll watch ./bug.mp4 --backend ollama
eyeroll watch screenshot.png -b ollama -m qwen3-vl:2b
# Or set as default
export EYEROLL_BACKEND=ollama
eyeroll watch ./recording.mp4
Backends
| Backend | Video | Audio | API Key | Cost | Best for |
|---|---|---|---|---|---|
| gemini | Direct upload | Yes | Required | ~$0.15/video | Best quality, short videos |
| ollama | Frame-by-frame | No | None | Free | Privacy, offline, no API limits |
Ollama models
| Model | Size | Notes |
|---|---|---|
qwen3-vl (default) |
6.1GB | Best quality, needs 8GB+ RAM |
qwen3-vl:2b |
1.9GB | Lighter, works on 8GB machines |
qwen3-vl:32b |
21GB | Higher quality, needs 32GB+ RAM |
How it works
Video (Loom / YouTube / local file / screenshot)
↓
eyeroll extracts: frames, audio, on-screen text
↓
Backend analyzes: Gemini Flash (API) or Qwen3-VL (local via Ollama)
↓
Structured notes → skill decides what to do next
↓
video-to-pr: search codebase → fix → PR
video-to-skill: extract workflow → generate SKILL.md
watch-video: return notes to the agent
Supported inputs
| Input | Notes |
|---|---|
| Loom URLs | Requires yt-dlp |
| YouTube URLs | Requires yt-dlp |
| Local video files (.mp4, .webm, .mov) | Direct analysis |
| Screenshots (.png, .jpg, .gif) | Single-frame analysis |
| Any yt-dlp supported URL | 1000+ sites |
Requirements
- Python 3.11+
- ffmpeg (
brew install ffmpeg) - yt-dlp (
brew install yt-dlp) — for URL downloads - Gemini backend: Gemini API key (free)
- Ollama backend: Ollama installed and running
License
MIT
Project details
Release history Release notifications | RSS feed
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 eyeroll-0.2.0.tar.gz.
File metadata
- Download URL: eyeroll-0.2.0.tar.gz
- Upload date:
- Size: 20.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
20daba9c0f6cc042d4243e85f18ff6a044af52f06305aa58089c201a0774d529
|
|
| MD5 |
66e273a4378f5b06bd1751dc28c2d1f3
|
|
| BLAKE2b-256 |
018dc7b0934a9b15c0d948dc3b8e60a6ba0065fb623acad05c29faee5d8f97ee
|
Provenance
The following attestation bundles were made for eyeroll-0.2.0.tar.gz:
Publisher:
ci.yml on mnvsk97/eyeroll
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eyeroll-0.2.0.tar.gz -
Subject digest:
20daba9c0f6cc042d4243e85f18ff6a044af52f06305aa58089c201a0774d529 - Sigstore transparency entry: 1204355476
- Sigstore integration time:
-
Permalink:
mnvsk97/eyeroll@7be9c4a5f830b8b6d147ab30b1d1e33cc64b8f06 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mnvsk97
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@7be9c4a5f830b8b6d147ab30b1d1e33cc64b8f06 -
Trigger Event:
push
-
Statement type:
File details
Details for the file eyeroll-0.2.0-py3-none-any.whl.
File metadata
- Download URL: eyeroll-0.2.0-py3-none-any.whl
- Upload date:
- Size: 16.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25eb8bfed77059d097a34e555a955ed69d0f3e021ca3850ddcf17edb554bf223
|
|
| MD5 |
8796cdcd8e1a55ea0cec09ea4633a345
|
|
| BLAKE2b-256 |
ffe695106ba5b880f95041159c9064501072fb84939f6b4168382764ccd9165a
|
Provenance
The following attestation bundles were made for eyeroll-0.2.0-py3-none-any.whl:
Publisher:
ci.yml on mnvsk97/eyeroll
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eyeroll-0.2.0-py3-none-any.whl -
Subject digest:
25eb8bfed77059d097a34e555a955ed69d0f3e021ca3850ddcf17edb554bf223 - Sigstore transparency entry: 1204355499
- Sigstore integration time:
-
Permalink:
mnvsk97/eyeroll@7be9c4a5f830b8b6d147ab30b1d1e33cc64b8f06 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mnvsk97
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@7be9c4a5f830b8b6d147ab30b1d1e33cc64b8f06 -
Trigger Event:
push
-
Statement type: