[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83328":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":17,"stars90d":15,"forks30d":15,"starsTrendScore":18,"compositeScore":19,"rankGlobal":9,"rankLanguage":9,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":35,"readmeContent":36,"aiSummary":9,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":37,"discoverSource":38},83328,"shortcast","mutonby\u002Fshortcast","mutonby","Native macOS app: drop a long video → auto-cut viral shorts, captioned for TikTok\u002FReels\u002FYouTube, reframed to vertical, and scheduled. 100% on-device (Gemma 4 12B + WhisperKit + MLX).",null,"Swift",283,47,1,2,0,7,175,35,5.04,"Apache License 2.0",false,"main",true,[25,26,27,28,29,30,31,32,33,34],"apple-silicon","gemma","instagram-reels","macos","mlx","on-device-ai","swift","swiftui","tiktok","youtube-shorts","2026-06-12 02:04:33","\u003Cdiv align=\"center\">\n\n# Shortcast\n\n**Long videos → ready-to-post shorts for TikTok, Instagram Reels and YouTube Shorts.**\n**Found, cut, captioned, reframed and scheduled — fully on your Mac. Open-source.**\n\n[![License: Apache 2.0](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache_2.0-blue.svg)](LICENSE)\n![Platform](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FmacOS-15%2B-black?logo=apple)\n![Apple Silicon](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FApple%20Silicon-required-1d1d1f)\n![Swift 6](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwift-6.0-F05138?logo=swift&logoColor=white)\n![Model](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FGemma_4_12B-on--device-4285F4)\n![Whisper](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FWhisperKit-large--v3-00B8D9)\n\n\u003Cbr \u002F>\n\n\u003Cimg src=\"assets\u002Fdemo.gif\" alt=\"Shortcast demo — drop a long video, get cut, captioned, vertical shorts\" width=\"720\" \u002F>\n\n\u003Cbr \u002F>\n\n\u003Csub>Drop a long video → it transcribes, finds the best moments, cuts them, writes the copy, reframes to vertical → review the grid → publish or schedule the whole week.\u003C\u002Fsub>\n\n\u003C\u002Fdiv>\n\n---\n\n## What it does\n\nShortcast has two modes:\n\n### 🎬 Make shorts from a long video (the main one)\n\nDrop a podcast, talk, stream or any long recording. Shortcast transcribes it on-device,\nfinds the **best 3–6 viral moments**, cuts each one, and writes the **full post copy for\nall three platforms** — all in one pass. Horizontal (16:9) footage is **reframed to\nvertical 9:16**, tracking the speaker's face. You get a grid of finished shorts you can\nplay with sound, edit, download, publish, or **schedule one-per-day across the week**.\n\n### ✏️ Caption a short\n\nAlready have a short vertical clip? Drop it and Shortcast **watches the frames and hears\nthe audio** (Gemma 4 E4B, multimodal) and writes the three platform captions directly,\nrendered as editable phone-style previews.\n\nWhat's different about Shortcast:\n\n- 🛰️ **Nothing leaves your Mac during processing.** No cloud model, no upload.\n  Your video is only sent to a network when you choose to publish it.\n- 🧠 **One model does the thinking.** A single on-device LLM reads the whole transcript,\n  picks the moments *and* writes every caption in the same pass.\n- 🎯 **Tuned per platform.** TikTok gets punchy. Instagram gets storytelling and 20–30\n  hashtags. YouTube gets short, search-friendly titles — in the language spoken in the video.\n- 📐 **Auto vertical reframe.** On-device face tracking (Vision) turns 16:9 into 9:16,\n  panning to keep the speaker centred, with a blurred-background fallback when there's no\n  clear face.\n- 🗓️ **Schedule the week in one click.** Distribute approved shorts one per day, pick the\n  time, and Upload-Post publishes them automatically.\n- 🪶 **No Python. No Electron. No embedded runtime.** Just Swift, MLX, AVFoundation, Vision.\n\n## How a long video becomes shorts\n\n```\n  ┌──────────────────────────────────────────────────────────────────────┐\n  │  YOUR MAC — nothing leaves until you press Publish                    │\n  │                                                                       │\n  │  drop a long video                                                    │\n  │        │                                                              │\n  │        ▼                                                              │\n  │  ┌──────────────┐   ┌────────────────────┐   ┌───────────────────┐    │\n  │  │ WhisperKit   │──►│  Director LLM       │──►│ AVFoundation      │    │\n  │  │ large-v3     │   │  Gemma 4 12B (MLX)  │   │ cut each clip     │    │\n  │  │ transcribe   │   │  finds moments +    │   │ + reframe 9:16    │    │\n  │  │ (GPU)        │   │  writes 3 captions  │   │  (Vision tracking)│    │\n  │  └──────────────┘   │  in ONE pass        │   │ + hook overlay    │    │\n  │                     └────────────────────┘   └───────────────────┘    │\n  │                                                       │                │\n  │                                                       ▼                │\n  │                                              ┌───────────────────┐     │\n  │                                              │ grid of shorts:   │     │\n  │                                              │ play w\u002F sound,    │     │\n  │                                              │ edit, download,   │     │\n  │                                              │ approve           │     │\n  │                                              └───────────────────┘     │\n  └──────────────────────────────────────────────────────────────────────┘\n                                  │  Publish now  \u002F  Schedule the week\n                                  ▼\n                          ┌─────────────────┐\n                          │   Upload-Post   │  TikTok · Instagram · YouTube\n                          │       API       │  (now, or scheduled per day)\n                          └─────────────────┘\n```\n\nConcretely:\n\n1. **Transcribe.** If the video has a `.srt`\u002F`.vtt` sidecar, it's used instantly.\n   Otherwise **WhisperKit** (`large-v3`) transcribes on the GPU. The transcript's\n   language is detected from the *text* (NaturalLanguage), so captions stay in the\n   spoken language.\n2. **Find the moments + write the copy.** The **Director** — an on-device LLM — reads the\n   whole transcript and returns a single JSON: the best clips (start\u002Fend, why, hook, a\n   short on-screen overlay) **and** the full TikTok \u002F Instagram \u002F YouTube caption package\n   for each, in one pass. A tolerant parser strips fences\u002Fthinking and validates clip\n   durations.\n3. **Cut.** AVFoundation cuts each moment to its own file.\n4. **Reframe (optional, automatic for horizontal clips).** Vision samples faces across\n   the clip; if the speaker is found, an `AVMutableVideoComposition` pans a 9:16 crop to\n   follow them (GPU-interpolated transform ramps). No clear face → a blurred-background\n   letterbox. A short text **hook** can be burned over the top.\n5. **Review.** A grid of phone-style tiles — loop each short, play it with sound, edit the\n   captions, download the rendered `.mp4`, or approve it.\n6. **Publish or schedule.** Publish now, or **schedule the week**: approved shorts go out\n   one per day at a time you choose, via Upload-Post's `scheduled_date`. TikTok lands as a\n   draft by default so you can finish in-app.\n\n### Choosing the model\n\nSettings → *Caption writer* picks the on-device model that finds the moments and writes\nthe captions:\n\n| Model | Role | Notes |\n|-------|------|-------|\n| **Gemma 4 12B** (default) | Director + inline captions | Strongest writing, one model, one pass. Loaded via MLX. |\n| **Qwen 3.5 9B** | Director + inline captions | Lighter and a bit faster, one pass. Huge context window. |\n| **Gemma 4 E4B** | Clip-watching copywriter | Multimodal — *watches* each clip (frames + audio) and captions it in a separate pass. Also the model used by *Caption a short*. |\n\nThe model downloads once on first use. Everything runs offline afterwards.\n\n## Install\n\n> Releases are unsigned (not yet notarized), so macOS Gatekeeper blocks them the\n> first time. This is expected — one Terminal command fixes it.\n\n1. Download `Shortcast.dmg` from the [latest release](..\u002F..\u002Freleases\u002Flatest).\n2. Open the DMG and drag **Shortcast** to your Applications folder.\n3. Strip the download-quarantine flag, then open the app normally:\n\n   ```bash\n   xattr -dr com.apple.quarantine \u002FApplications\u002FShortcast.app\n   ```\n\n   Now double-click Shortcast and it launches.\n\n> [!NOTE]\n> **Seeing “Shortcast.app is damaged and can’t be opened”?** That's the same\n> Gatekeeper quarantine — on Apple Silicon, recent macOS shows *“damaged”*\n> instead of *“unidentified developer”* and hides the **Open Anyway** button. The\n> app is **not** actually damaged; the `xattr` command above is the fix.\n\n\u003Cdetails>\n\u003Csummary>Prefer the GUI? (older macOS)\u003C\u002Fsummary>\n\nDouble-click Shortcast, then open **System Settings → Privacy & Security**, scroll\nto the message about Shortcast and click **Open Anyway**. On recent macOS this\nbutton often doesn't appear for unsigned apps — use the Terminal command instead.\n\u003C\u002Fdetails>\n\n### First run\n\n- Shortcast downloads the models it needs on first use, with a visible progress bar:\n  the **Director** (Gemma 4 12B ≈ 7 GB, or Qwen 3.5 9B ≈ 5 GB) and **WhisperKit\n  large-v3** for transcription. Happens once, then it works offline.\n- Open **Settings** (⌘,) and add your [Upload-Post](https:\u002F\u002Fupload-post.com) **API key**\n  and **profile name** (the one from *Manage Users*, not your social handle).\n- Optionally set a caption language and paste a few of your own captions as style\n  examples — the model will match your voice.\n\nYou can generate shorts without Upload-Post; only publishing\u002Fscheduling needs it.\n\n## Build from source\n\nYou need **Xcode 16+** and [XcodeGen](https:\u002F\u002Fgithub.com\u002Fyonaskolb\u002FXcodeGen).\nOn Apple Silicon. macOS 15+.\n\n```bash\nbrew install xcodegen\ngit clone https:\u002F\u002Fgithub.com\u002Fmutonby\u002Fshortcast\ncd shortcast\nxcodegen generate\nopen Shortcast.xcodeproj\n```\n\nBuild and run the **Shortcast** scheme. The `.xcodeproj` is generated from\n`project.yml` and intentionally not committed — `xcodegen` regenerates it.\n\n> CLI builds need `-skipMacroValidation`:\n> ```bash\n> xcodebuild -project Shortcast.xcodeproj -scheme Shortcast \\\n>   -configuration Debug -skipMacroValidation -destination 'platform=macOS' build\n> ```\n\n### Release DMG\n\n`.github\u002Fworkflows\u002Frelease.yml` builds an unsigned `.dmg` and attaches it to the\nGitHub Release whenever a `v*` tag is pushed:\n\n```bash\ngit tag v0.1.0\ngit push origin v0.1.0\n```\n\n## The stack\n\n| Layer            | Used                                                                  |\n|------------------|-----------------------------------------------------------------------|\n| UI               | SwiftUI · AVKit                                                       |\n| Transcription    | [WhisperKit](https:\u002F\u002Fgithub.com\u002Fargmaxinc\u002FWhisperKit) `large-v3` (Metal\u002FGPU) |\n| Director model   | Gemma 4 12B or Qwen 3.5 9B (4-bit), runs as a text LLM via MLX        |\n| Clip-watcher     | Gemma 4 E4B (4-bit), text + vision + audio                           |\n| Inference        | [MLX](https:\u002F\u002Fgithub.com\u002Fml-explore\u002Fmlx-swift) (Metal, Neural Engine) |\n| Gemma 4 runtime  | [gemma-4-swift-mlx](https:\u002F\u002Fgithub.com\u002FVincentGourbin\u002Fgemma-4-swift-mlx), vendored in `Vendor\u002F` |\n| Vertical reframe | Vision (face detection) + AVFoundation (transform ramps \u002F Core Image)|\n| Media            | AVFoundation (cut, sample, export) · AVKit playback                  |\n| Publishing       | [Upload-Post](https:\u002F\u002Fupload-post.com) API (publish + schedule)      |\n| Build            | XcodeGen · GitHub Actions                                            |\n\n## Privacy\n\nTranscription, moment-finding, captioning, cutting and reframing all run inside the app,\non your Mac. The only outbound traffic before you publish is:\n\n- **First use only**: one-time downloads of the model weights from Hugging Face.\n- **On Publish \u002F Schedule**: an upload to Upload-Post with the rendered short and the copy\n  you approved (immediately, or at the scheduled time).\n\nYour Upload-Post API key is stored locally on your Mac (app preferences) and is only ever\nsent to Upload-Post over HTTPS when you publish. It is never written into the repository.\n\n## Known limitations\n\n- The **Director** runs a large model on-device. On an M1 Pro, a ~2-minute video takes a\n  few minutes end-to-end (transcription + generation). Faster Macs (M3\u002FM4) are quicker.\n- *Caption a short* uses Gemma 4 E4B, whose audio encoder hears the **first 30 seconds**.\n- The app is **unsigned** (see *Install*). Code signing + notarization will come once the\n  project stabilises.\n- One video at a time — no history, no batch processing. By design, for now.\n- Upload-Post free tier limits monthly uploads. One publish to three networks counts as\n  three.\n\n## Acknowledgements\n\n- **Google** for the Gemma 4 family — open weights with full multimodal capability.\n- **Apple's MLX team** for [MLX](https:\u002F\u002Fgithub.com\u002Fml-explore\u002Fmlx-swift) and\n  [mlx-swift-lm](https:\u002F\u002Fgithub.com\u002Fml-explore\u002Fmlx-swift-lm).\n- **Vincent Gourbin** for [gemma-4-swift-mlx](https:\u002F\u002Fgithub.com\u002FVincentGourbin\u002Fgemma-4-swift-mlx),\n  the native Gemma 4 runtime we vendor.\n- **Argmax** for [WhisperKit](https:\u002F\u002Fgithub.com\u002Fargmaxinc\u002FWhisperKit).\n- **Alibaba** for the Qwen 3.5 open weights.\n- **Upload-Post** for the cross-platform publishing API.\n\n## License\n\nApache License 2.0 — see [LICENSE](LICENSE).\n\nThird-party components are listed in [NOTICE](NOTICE). The vendored\n`gemma-4-swift-mlx` runtime is MIT-licensed; the Gemma 4 weights are governed by\n[Google's Gemma Terms of Use](https:\u002F\u002Fai.google.dev\u002Fgemma\u002Fterms).\n\n\u003Cdiv align=\"center\">\n\u003Csub>Built in the open.\u003C\u002Fsub>\n\u003C\u002Fdiv>\n","2026-06-11 04:10:57","CREATED_QUERY"]