{"id":50900967,"url":"https://github.com/r2hu1/skate","last_synced_at":"2026-06-16T02:31:16.454Z","repository":{"id":364121853,"uuid":"1266457957","full_name":"r2hu1/skate","owner":"r2hu1","description":"Turn long-form videos into viral-ready vertical shorts, entirely on your local machine. Free, no API keys, no cloud.","archived":false,"fork":false,"pushed_at":"2026-06-11T18:07:41.000Z","size":88,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T19:17:29.757Z","etag":null,"topics":["ffmpeg","ollama","opencv","shorts-generator","video-clipper","whisper-ai","youtube-clip-downloader","youtube-video-clip-extraction","youtube-videos-downloader","yt-clip"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/r2hu1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-11T16:27:12.000Z","updated_at":"2026-06-11T18:08:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/r2hu1/skate","commit_stats":null,"previous_names":["r2hu1/skate"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/r2hu1/skate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r2hu1%2Fskate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r2hu1%2Fskate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r2hu1%2Fskate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r2hu1%2Fskate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/r2hu1","download_url":"https://codeload.github.com/r2hu1/skate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r2hu1%2Fskate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34388669,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-16T02:00:06.860Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ffmpeg","ollama","opencv","shorts-generator","video-clipper","whisper-ai","youtube-clip-downloader","youtube-video-clip-extraction","youtube-videos-downloader","yt-clip"],"created_at":"2026-06-16T02:31:14.148Z","updated_at":"2026-06-16T02:31:16.448Z","avatar_url":"https://github.com/r2hu1.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Skate — AI-Powered YouTube → Viral Shorts (clipper) CLI\n\n\u003e Turn long-form videos into viral-ready vertical shorts, entirely on your local machine. Free, no API keys, no cloud.\n\nSaw a bunch of paid tools doing this — why pay when you can run it locally? Skate uses **faster-whisper** for transcription, **Ollama** for AI ranking, **OpenCV** for face tracking, and **FFmpeg** for rendering. Everything runs on your machine.\n\n---\n\n## How It Works\n\n```\nInput (URL or file)\n  → Download (yt-dlp)\n  → Transcribe (faster-whisper)\n  → Chunk transcript into segments\n  → Score heuristically (no AI needed)\n  → Rank with local LLM (Ollama)\n  → Select best clips\n  → Track faces for smart vertical crop\n  → Render clips with subtitles burned in\n  → Output organized shorts\n```\n\n---\n\n## Requirements\n\n| Tool               | Purpose                    | Check                        |\n| ------------------ | -------------------------- | ---------------------------- |\n| **Bun**            | Runtime \u0026 package manager  | `bun --version`              |\n| **FFmpeg**         | Video cutting \u0026 processing | `ffmpeg -version`            |\n| **yt-dlp**         | YouTube downloading        | `yt-dlp --version`           |\n| **Ollama**         | Local LLM for AI ranking   | `ollama --version`           |\n| **Python 3**       | Whisper \u0026 OpenCV scripts   | `python3 --version`          |\n| **faster-whisper** | Local transcription        | installed via `setup-python` |\n| **OpenCV**         | Face detection             | installed via `setup-python` |\n\n### Recommended Ollama Model\n\n```bash\nollama pull llama3.2:3b\n```\n\n---\n\n## Installation\n\n### 1. Clone and install dependencies\n\n```bash\ngit clone https://github.com/yourusername/skate.git\ncd skate\nbun install\n```\n\n### 2. Set up Python environment (Whisper + OpenCV)\n\n```bash\nbun run setup-python\n```\n\nThis creates a virtual environment at `~/.skate/venv` and installs:\n\n- `faster-whisper` — speech-to-text with word-level timestamps\n- `opencv-contrib-python` — face detection via Haar cascades\n- `numpy` — numerical processing\n\n### 3. Link the CLI (optional)\n\n```bash\nbun link\n```\n\nThen you can run `skate` from anywhere.\n\n---\n\n## CLI Usage\n\n### Process a local video\n\n```bash\nbun start -- clip video.mp4\n```\n\n### Process a YouTube video\n\n```bash\nbun start -- youtube https://youtube.com/watch?v=abc123\n```\n\n### Auto-detect URL or file\n\n```bash\nbun start -- https://youtube.com/watch?v=abc123\nbun start -- video.mp4\n```\n\n### Analyze only (skip rendering)\n\n```bash\nbun start -- analyze video.mp4\n```\n\n### Render from cached analysis\n\n```bash\nbun start -- render video.mp4\n```\n\n### Watch a directory for new files\n\n```bash\nbun start -- watch ./videos\n```\n\n### Disable face tracking\n\n```bash\nbun start -- clip video.mp4 --no-crop\nbun start -- youtube https://youtube.com/watch?v=abc123 --no-crop\n```\n\nBy default, Skate tracks faces for smart vertical framing. Pass `--no-crop` to use a static center crop instead.\n\n### Check dependencies\n\n```bash\nbun start -- doctor\n```\n\n---\n\n## Configuration\n\nConfig is stored at `~/.skate/config.json` and auto-created on first run.\n\n```json\n{\n  \"model\": \"llama3.2:3b\",\n  \"clips\": 10,\n  \"minLength\": 20,\n  \"maxLength\": 90,\n  \"subtitleStyle\": \"minimal\",\n  \"outputDir\": \"./output\",\n  \"cacheDir\": \"~/.skate/cache\",\n  \"ollamaUrl\": \"http://localhost:11434\"\n}\n```\n\n### Options\n\n| Field           | Default                  | Description                                     |\n| --------------- | ------------------------ | ----------------------------------------------- |\n| `model`         | `llama3.2:3b`            | Ollama model for ranking                        |\n| `clips`         | `10`                     | Number of clips to produce                      |\n| `minLength`     | `20`                     | Minimum clip length (seconds)                   |\n| `maxLength`     | `90`                     | Maximum clip length (seconds)                   |\n| `subtitleStyle` | `minimal`                | Subtitle style (`minimal`, `tiktok`, `mrbeast`) |\n| `outputDir`     | `./output`               | Output directory                                |\n| `cacheDir`      | `~/.skate/cache`         | Cache directory                                 |\n| `ollamaUrl`     | `http://localhost:11434` | Ollama API URL                                  |\n\n---\n\n## Output Structure\n\n```\noutput/\n└── \u003cvideo-name\u003e/\n    ├── clips/\n    │   ├── clip-01.mp4\n    │   ├── clip-02.mp4\n    │   └── clip-03.mp4\n    ├── captions/\n    │   ├── clip-01.srt\n    │   └── clip-02.srt\n    └── metadata.json\n```\n\n---\n\n## Project Structure\n\n```\nskate/\n├── scripts/\n│   ├── face_detect.py         # OpenCV face detection\n│   ├── whisper_transcribe.py  # faster-whisper transcription\n│   └── requirements.txt       # Python dependencies\n├── src/\n│   ├── commands/\n│   │   ├── clip.ts            # Process local video\n│   │   ├── analyze.ts         # Analysis only pipeline\n│   │   ├── render.ts          # Render from cached analysis\n│   │   ├── watch.ts           # Watch directory mode\n│   │   └── doctor.ts          # Dependency checker\n│   ├── core/\n│   │   ├── pipeline.ts        # Main pipeline orchestrator\n│   │   ├── downloader.ts      # yt-dlp integration\n│   │   ├── transcriber.ts     # Whisper bridge\n│   │   ├── chunker.ts         # Transcript chunking\n│   │   ├── scorer.ts          # Heuristic scoring\n│   │   ├── ranker.ts          # AI ranking bridge\n│   │   ├── tracker.ts         # Face tracking\n│   │   ├── renderer.ts        # FFmpeg rendering\n│   │   └── subtitles.ts       # SRT/ASS generation\n│   ├── ai/\n│   │   ├── prompts.ts         # LLM prompt templates\n│   │   ├── ollama.ts          # Ollama API client\n│   │   └── ranking.ts         # AI ranking logic\n│   ├── vision/\n│   │   ├── face.ts            # Face detection\n│   │   ├── scene.ts           # Scene detection\n│   │   └── crop.ts            # Smart crop path\n│   ├── ui/\n│   │   └── tui.ts             # Terminal spinner UI\n│   ├── config.ts              # Configuration loader\n│   ├── types.ts               # TypeScript types\n│   └── index.tsx              # CLI entry point\n├── output/                    # Rendered clips\n├── cache/                     # Cached downloads\n├── models/                    # Local models\n├── temp/                      # Working files\n├── package.json\n├── tsconfig.json\n└── README.md\n```\n\n---\n\n## Pipeline Steps\n\n| Step            | Description                                                        |\n| --------------- | ------------------------------------------------------------------ |\n| **Download**    | Pulls video from YouTube via yt-dlp (or uses local file)           |\n| **Transcribe**  | Runs faster-whisper for speech-to-text with word-level timestamps  |\n| **Chunk**       | Splits transcript into 30–90 second natural segments               |\n| **Score**       | Heuristic scoring — speaking rate, emotion, story structure, hooks |\n| **Rank**        | Sends top candidates to Ollama for virality scoring                |\n| **Select**      | Picks best clips based on combined heuristic + AI scores           |\n| **Track Faces** | Detects faces per frame via OpenCV for smart vertical crop         |\n| **Render**      | Cuts clips, applies crop, burns in subtitles                       |\n\n---\n\n## npm Scripts\n\n| Script                 | Command                                       |\n| ---------------------- | --------------------------------------------- |\n| `bun start`            | Run Skate                                     |\n| `bun run dev`          | Run with watch mode (auto-restart on changes) |\n| `bun run typecheck`    | TypeScript type checking                      |\n| `bun run setup-python` | Create venv and install Python deps           |\n\n---\n\n## Caching\n\nSkate caches aggressively at `~/.skate/cache`:\n\n- Downloaded video/audio files\n- Transcripts\n- Face tracking data\n- Analysis results\n\nRe-running is fast — only changed steps are re-executed.\n\n---\n\n## Why Build This?\n\nEvery \"AI shorts\" tool out there charges $20–$50/month or requires API keys that bill per minute. Skate is:\n\n- **100% local** — nothing leaves your machine\n- **Free** — no subscriptions, no API costs\n- **Private** — your videos never hit a third-party server\n- **Customizable** — swap models, tweak prompts, adjust scoring\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr2hu1%2Fskate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr2hu1%2Fskate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr2hu1%2Fskate/lists"}