{
  "schema_version": 1,
  "type": "skill",
  "slug": "movie-maker",
  "title": "Movie Maker",
  "brief": "Record narrated walkthroughs of your Gallia project with screen + mic capture, silence detection, smart playback that skips dead air, timeline markers, and a full video library with thumbnails.",
  "version": "1.0.0",
  "tags": [],
  "license": "MIT",
  "source_path": "SKILL.md",
  "readme": "## What It Does\n\nMovie Maker turns your Gallia Viewer into a full video production studio. Record narrated walkthroughs of your hardware projects — PCB reviews, 3D model tours, schematic explanations — with a single click. The recording captures your browser tab video and microphone audio, then saves it to a searchable Library with automatic silence detection.\n\n### Key Features\n\n- **One-Click Recording** — Record button in the GV toolbar works from any view (3D, schematics, file explorer, etc.). No need to be on the Movie Maker page.\n- **Silence Detection** — An `AnalyserNode` monitors your microphone in real-time. Stretches of silence (< 5/255 amplitude for 2+ seconds) are automatically tagged.\n- **Smart Playback** — Toggle a checkbox to fast-forward through silence at 16x speed while keeping talking segments at normal speed. Perfect for reviewing long recordings.\n- **Timeline Markers** — Yellow markers on the playback timeline show exactly where each silence region is. Click any marker to jump there. Prev/Next buttons for quick navigation.\n- **Video Library** — YouTube-style gallery with thumbnails, duration, file size, and a talking/dead-air breakdown for each recording.\n- **Toolbar Integration** — Red recording dot and live timer in the toolbar. Alt+R keyboard shortcut. TabShot conflict detection prevents clashes with screen capture.\n- **Scripted Walkthroughs** — Claude can drive the viewer programmatically: load 3D models, set camera angles, show captions, and run cinematic tours — all while recording.\n- **Auto-Save** — Videos save automatically when you stop recording. Metadata (thumbnail, duration, silence regions) is generated and stored alongside the video.\n\n## How It Works\n\n### Architecture\n\nRecording runs in the **parent frame** (index.html toolbar) to avoid iframe `getDisplayMedia` restrictions. If that fails, it falls back to a **popup tab** (`record-popup.html`). Communication uses `BroadcastChannel` for popup mode or `postMessage` for parent mode.\n\n```\nToolbar Record Button (index.html)\n  ├── getDisplayMedia() from parent frame\n  ├── Fallback: window.open(record-popup.html)\n  ├── MediaRecorder → .webm blob\n  ├── Auto-save to server → /save-video\n  └── Metadata (thumbnail, silence regions) → /videos/metadata\n```\n\n### Recording Flow\n\n1. Click the **Record button** in the GV toolbar (or inside Movie Maker)\n2. Browser shows \"Share tab\" dialog — pick the tab to record\n3. Recording starts with timer in toolbar; navigate freely between views\n4. Click Record again to stop (or Stop in Movie Maker)\n5. Video auto-saves with metadata (thumbnail, duration, silence regions)\n6. GV opens Movie Maker Library showing the new recording\n\n### Silence Detection\n\nDuring recording, a Web Audio `AnalyserNode` samples microphone frequency data at ~100ms intervals. When the average amplitude drops below threshold (5/255) for 2+ consecutive seconds, that stretch is marked as a silence region with start/end timestamps.\n\n### Smart Playback Engine\n\nWhen Smart Playback is enabled, the player monitors `timeupdate` events and checks the current position against silence regions. During silence, playback rate jumps to 16x (Chrome's max). When talking resumes, it drops back to 1x. The result: a 10-minute recording with 4 minutes of silence plays in ~6:15.\n\n## MCP Tools\n\n### gv_recording_status\nCheck if Movie Maker is currently recording.\n\n### gv_execute_script\nExecute a scripted walkthrough with timed steps. Supports actions like `show_3d`, `set_view`, `set_camera`, `start_tour`, `stop_tour`, `display`, `caption`, and `wait`. Each step has a duration and optional caption overlay.\n\n## HTTP API\n\n| Route | Method | Description |\n|-------|--------|-------------|\n| `/videos/list` | GET | List all recordings with metadata |\n| `/videos/{filename}` | GET | Stream video (Range request support) |\n| `/save-video` | POST | Save a recording blob |\n| `/videos/metadata` | POST | Save metadata JSON |\n| `/videos/{filename}` | DELETE | Delete a recording |\n| `/scripts/list` | GET | List all scripts |\n| `/scripts/save` | POST | Save a script |\n| `/execute-script` | POST | Execute a script server-side |\n\n## File Locations\n\n| Path | Contents |\n|------|----------|\n| `project-content/videos/` | Recorded `.webm` files |\n| `project-content/videos/*.meta.json` | Per-video metadata |\n| `viewer/viewer/movie-maker.html` | Movie Maker UI (Record, Library, Scripts tabs) |\n| `viewer/viewer/record-popup.html` | Popup recording fallback |\n| `viewer/server.js` | Server routes for video/script CRUD |",
  "author": {
    "id": "695820315b5f1e4db2fcf602",
    "name": "Kyle Bergstedt",
    "email": "kyle@adom.inc"
  },
  "visibility": {
    "public": true
  },
  "hero": null,
  "sample_prompts": [],
  "discovery_triggers": [],
  "discovery_pitch": null,
  "metadata": {},
  "created_at": "2026-05-28T05:30:19.146Z",
  "updated_at": "2026-05-28T05:30:19.146Z",
  "sub_skills": [],
  "parent_app": null
}