{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "mutonby--openshorts",
    "name": "OpenShorts",
    "tagline": "Self-hosted AI clip generator with an eight-tool MCP server for clipping, captioning, and publishing shorts.",
    "shortTagline": "Self-hosted AI clip generator",
    "description": "Turns long videos into 9:16 clips with Gemini moment detection, face-tracked reframing, faster-whisper subtitles, ElevenLabs dubbing, and Upload-Post publishing. Runs from docker compose on your own machine or as a hosted plan; both expose the same /mcp endpoint.",
    "capabilities": [
      "adaptable",
      "operable"
    ],
    "vertical": "video-streaming",
    "alternativeTo": [
      "Opus Clip",
      "Vizard"
    ],
    "shape": "business-app",
    "formFactor": "web-app",
    "executionModel": "hybrid",
    "provenance": "unknown",
    "codeStack": {
      "languages": [
        "Python",
        "TypeScript"
      ],
      "frameworks": [
        "FastAPI",
        "Vite",
        "ffmpeg",
        "MediaPipe",
        "YOLOv8",
        "faster-whisper"
      ],
      "packageManager": "pip",
      "database": [],
      "hostingTarget": [
        "Docker",
        "openshorts.app"
      ]
    },
    "modelStack": {
      "providers": [
        "Google Gemini",
        "any OpenAI-compatible LLM through LLM_BASE_URL",
        "ElevenLabs",
        "fal.ai"
      ],
      "models": [
        "Gemini 3.1 Flash-Lite",
        "faster-whisper",
        "Flux 2 Pro",
        "Hailuo 2.3 Fast"
      ],
      "requiredKeys": [
        "GEMINI_API_KEY (entered in dashboard Settings)",
        "LLM_API_KEY",
        "AWS_ACCESS_KEY_ID",
        "AWS_SECRET_ACCESS_KEY"
      ],
      "promptLocations": [],
      "tools": [
        "process_video",
        "create_upload",
        "get_job_status",
        "list_clips",
        "get_quota",
        "add_subtitles",
        "recut_clip",
        "publish_clip"
      ]
    },
    "repos": [
      {
        "url": "https://github.com/mutonby/openshorts",
        "owner": "mutonby",
        "name": "openshorts",
        "license": "MIT (cloud/ directory under a commercial license)",
        "stars": 3833,
        "lastCommit": "2026-09-02"
      }
    ],
    "interface": {
      "kind": "mcp",
      "url": "https://www.openshorts.app/mcp",
      "official": true,
      "hosted": "both"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Generate clips from a long video",
        "reachable": true,
        "evidence": "MCP tools process_video, create_upload, get_job_status, list_clips"
      },
      {
        "job": "Restyle subtitles",
        "reachable": true,
        "evidence": "MCP tool add_subtitles (classic or karaoke)"
      },
      {
        "job": "Recut a clip",
        "reachable": true,
        "evidence": "MCP tool recut_clip"
      },
      {
        "job": "Publish or schedule to TikTok, Instagram, YouTube",
        "reachable": true,
        "evidence": "MCP tool publish_clip through Upload-Post"
      },
      {
        "job": "Check plan quota",
        "reachable": true,
        "evidence": "MCP tool get_quota"
      },
      {
        "job": "Generate AI Shorts with UGC actors",
        "reachable": false,
        "evidence": "No MCP tool covers the AI Shorts pipeline; dashboard only"
      },
      {
        "job": "YouTube Studio: titles, thumbnails, descriptions",
        "reachable": false,
        "evidence": "No MCP tool; dashboard only"
      },
      {
        "job": "Dub clips into other languages",
        "reachable": false,
        "evidence": "Dubbing is a dashboard feature; not among the eight MCP tools"
      },
      {
        "job": "Force a reframing layout per video",
        "reachable": false,
        "evidence": "README: layout forced from the dashboard; no MCP parameter documented"
      }
    ],
    "editions": [
      {
        "name": "Self-hosted",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "source",
            "url": "https://github.com/mutonby/openshorts"
          },
          {
            "kind": "container",
            "url": "https://github.com/mutonby/openshorts#getting-started",
            "command": "docker compose up --build"
          }
        ]
      },
      {
        "name": "Cloud Free",
        "price": null,
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://www.openshorts.app/"
          }
        ]
      },
      {
        "name": "Cloud paid",
        "price": {
          "amount": 12,
          "currency": "USD",
          "period": "month"
        },
        "open": false,
        "distributions": [
          {
            "kind": "hosted",
            "url": "https://www.openshorts.app/"
          }
        ]
      }
    ],
    "skills": {
      "kind": "bundled",
      "paths": [
        "skills/openshorts/SKILL.md"
      ],
      "install": "/plugin marketplace add mutonby/openshorts",
      "note": "A Claude Code plugin that teaches an agent to generate and publish short videos through OpenShorts."
    },
    "customization": {
      "summary": "Copy .env.example to .env. Point LLM_BASE_URL and LLM_MODEL at Ollama or any OpenAI-compatible server to drop the Gemini dependency; tune WHISPER_MODEL, TRANSCRIBE_BACKEND, FFMPEG_ENCODER, and QUALITY_GATE_MIN_HEIGHT; add AWS_S3_BUCKET for backup. Provider keys for Gemini, fal.ai, ElevenLabs, and Upload-Post are entered in the dashboard Settings page.",
      "envVars": [
        "LLM_BASE_URL",
        "LLM_MODEL",
        "LLM_API_KEY",
        "LLM_SCORE_BATCH",
        "LLM_TIMEOUT",
        "WHISPER_MODEL",
        "WHISPER_DEVICE",
        "WHISPER_COMPUTE",
        "TRANSCRIBE_BACKEND",
        "ASR_GPU_CONCURRENCY",
        "FFMPEG_ENCODER",
        "QUALITY_GATE_MIN_HEIGHT",
        "GEMINI_MODEL_THUMBNAIL",
        "GEMINI_IMAGE_MODEL",
        "AWS_ACCESS_KEY_ID",
        "AWS_SECRET_ACCESS_KEY",
        "AWS_REGION",
        "AWS_S3_BUCKET",
        "AWS_S3_PUBLIC_BUCKET",
        "YOUTUBE_COOKIES",
        "DEBUG_LOGS",
        "PAID_PROXY_DAILY_MB"
      ],
      "configFiles": [
        ".env",
        "docker-compose.yml",
        "docker-compose.override.yml"
      ],
      "promptFiles": [],
      "effort": "config-only",
      "editCount": 25
    },
    "useWhen": [
      "I publish a weekly podcast and want clips cut, captioned, and posted without a $20/mo clipper subscription",
      "I want an agent to turn every new livestream VOD into shorts overnight on my own GPU box"
    ],
    "accounts": [
      "Google AI Studio (Gemini)",
      "fal.ai (AI Shorts only)",
      "ElevenLabs (dubbing only)",
      "Upload-Post (publishing only)",
      "AWS (optional S3)"
    ],
    "active": true,
    "lastActivity": "2026-09-02",
    "gotchas": [
      "The cloud/ directory is under a commercial license, not MIT; GitHub shows the license as 'other' for that reason",
      "CPU-only by default: 5 to 8 minutes per 8-minute video; NVIDIA Container Toolkit needed for NVENC",
      "Self-hosted /mcp only answers while your machine is on; the hosted endpoint at mcp.openshorts.app needs an osk_ API key",
      "Provider keys go into the dashboard Settings, not .env"
    ],
    "fit": {
      "adaptable": 3,
      "operable": 2
    },
    "evidence": {
      "formFactor": "README: dashboard at localhost:5175 served by FastAPI backend",
      "executionModel": "README: fixed pipeline; Gemini or a local LLM picks moments and layouts",
      "operability": "openshorts.app/mcp: eight tools, Streamable HTTP, published by OpenShorts; self-host serves the same endpoint",
      "effort": ".env.example documents every variable with comments; docker compose is the only install",
      "editions": "README table: self-hosted free forever MIT; hosted free 20 min/mo with watermark; paid from $12/mo to $59/mo",
      "active": "GitHub pushedAt 2026-09-02"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.9,
      "operability": 0.9,
      "effort": 0.9,
      "reach": 0.85,
      "editions": 0.9
    },
    "openQuestions": [
      "Does the self-hosted MCP accept a bearer token or run open on localhost only?",
      "Is the AI Shorts pipeline reachable through the REST API even though it is not an MCP tool?"
    ],
    "sources": [
      {
        "url": "https://www.openshorts.app/",
        "foundBy": "sourcing:video-streaming:community"
      },
      {
        "url": "https://github.com/mutonby/openshorts",
        "foundBy": "sourcing:video-streaming:community"
      },
      {
        "url": "https://www.openshorts.app/mcp",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official MCP with partial Reach (clipping and publishing yes, UGC and YouTube Studio no); rich .env.example makes it config-only Adaptable.",
      "disputed": []
    },
    "url": "apps/mutonby--openshorts.html",
    "coverage": "partial",
    "paid": true,
    "source": "research/verified/mutonby--openshorts.json"
  }
}
