{
  "id": "osc-stack-obs-to-twitch",
  "job": "Go live on Twitch from OBS through an Open Live production: OBS publishes into Open Live over WHIP, and an RTMP output with the Twitch preset sends the programme picture and main audio mix to your Twitch channel with your stream key.",
  "aliases": [
    "obs to twitch",
    "stream obs to twitch through a production",
    "restream to twitch",
    "whip to rtmp twitch",
    "open live twitch"
  ],
  "distinctFrom": [
    {
      "id": "osc-stack-live-rtmp-to-hls",
      "descriptorUrl": "https://www.osaas.io/stacks/live-rtmp-to-hls.json",
      "why": "That recipe takes OBS over RTMP to an HLS stream you play on your own site. This one sends a produced programme to a Twitch channel."
    },
    {
      "id": "osc-stack-live-audio-mixing",
      "descriptorUrl": "https://www.osaas.io/stacks/live-audio-mixing.json",
      "why": "That recipe covers the audio mix inside an Open Live production. This one covers the OBS input and the Twitch output."
    }
  ],
  "inputs": [
    {
      "protocol": "whip",
      "source": "OBS Studio, Settings > Stream > Service WHIP, Server = the WHIP address of a WHIP source in the production"
    },
    {
      "protocol": "https",
      "source": "the URL of a Strom engine (StromUrl). Strom is not a catalog service; use your own, or the managed Open Live at https://openlive.apps.osaas.io"
    }
  ],
  "outputs": [
    {
      "protocol": "rtmp",
      "consumer": "Twitch ingest rtmp://live.twitch.tv/app (preset, static server-side table) plus the operator's stream key, composed only at activation"
    }
  ],
  "capabilities": {
    "releasedIn": {
      "open-live": "v0.8.0 (2026-11-10)",
      "open-live-studio": "v0.8.0 (2026-11-10)"
    },
    "rtmpPlatforms": ["youtube", "twitch", "facebook", "custom"],
    "streamKey": "encrypted at rest (encv1, dedicated RTMP key, stored backend-generated key when RTMP_CREDENTIALS_KEY is unset, so it works on OSC without an env var); masked on read; appended to the ingest URL only at flow generation",
    "encoderProfile": "not set per platform in v0.8.0; the RTMP output uses Strom defaults (gated on strom#783)",
    "sourceTypes": ["srt", "efp", "whip", "html", "test1", "test2", "clip"],
    "sources": [
      "Eyevinn/open-live@v0.8.0 src/lib/rtmp.ts",
      "Eyevinn/open-live@v0.8.0 src/lib/rtmp-credentials-crypto.ts",
      "Eyevinn/open-live@v0.8.0 src/db/types.ts (OutputType includes rtmp)",
      "Eyevinn/open-live@v0.8.0 docs/specs/rtmp-multi-destination.md",
      "Eyevinn/open-live@v0.8.0 README.md (sources, WHIP)",
      "Eyevinn/open-live-studio@v0.8.0 src/components/ui/RtmpDestinationFields.tsx",
      "https://obsproject.com/kb/whip-streaming-guide"
    ]
  },
  "recommendedPath": {
    "chain": [
      {
        "step": 1,
        "serviceId": "apache-couchdb",
        "role": "stores productions, sources and outputs",
        "requiredConfig": ["name", "AdminPassword"],
        "requiresCredential": true
      },
      {
        "step": 2,
        "serviceId": "eyevinn-open-live",
        "role": "the production API; builds the flow in Strom on activation, including the RTMP output",
        "requiredConfig": ["name", "DatabaseUrl", "StromUrl"],
        "requiresCredential": true,
        "note": "StromUrl is supplied by the user; an agent must not invent it."
      },
      {
        "step": 3,
        "serviceId": "eyevinn-open-live-studio",
        "role": "the browser controller where the WHIP source and the Twitch output are added",
        "requiredConfig": ["name", "OpenLiveUrl"],
        "requiresCredential": false
      },
      {
        "step": 4,
        "action": "connect",
        "role": "done by the human: add a WHIP source, set OBS Service WHIP with its address, add an RTMP output with the Twitch preset and the stream key, activate"
      }
    ],
    "measuredWallClockSeconds": null,
    "wallClockMeasured": false,
    "gapNote": "No end-to-end run of this recipe was timed or run on OSC for this page. Schemas and released source were read on 2026-11-12."
  },
  "configSurface": {
    "servicesInChain": 3,
    "totalRequiredFieldsAcrossChain": 7,
    "sensitiveFields": ["AdminPassword", "DatabaseUrl"],
    "note": "get-service-schema 2026-11-12: eyevinn-open-live stable upstreamCommitSha 157cde64 = Eyevinn/open-live v0.8.0; eyevinn-open-live-studio stable upstreamCommitSha cad8bb1d = open-live-studio v0.8.0."
  },
  "setup": {
    "codeRequired": false,
    "knownDeployGotcha": "Create CouchDB first and wait until it runs before creating Open Live. Open Live needs a reachable Strom URL; without one, productions cannot be activated. Do a test run before a public show: no per-platform encoder profile is set in v0.8.0."
  },
  "cost": {
    "unit": "tokens/day",
    "ceiling": 30,
    "ceilingBreakdown": {
      "apache-couchdb": 10,
      "eyevinn-open-live": 10,
      "eyevinn-open-live-studio": 10
    },
    "excludes": "Strom, which is not a catalog service",
    "ceilingSource": "compare-services on the three serviceIds, 2026-10-27 (ceiling rates; not re-read on 2026-11-12)",
    "cheapestPlanCoveringContinuousUse": {
      "name": "Personal",
      "eurPerMonth": 15,
      "tokensPerDay": 40
    },
    "pricingSource": "https://www.osaas.io/pricing"
  },
  "exitPath": {
    "software": "Open Live (https://github.com/Eyevinn/open-live), Open Live Studio (https://github.com/Eyevinn/open-live-studio) and Strom (https://github.com/Eyevinn/strom) are open source repositories that run wherever their containers run",
    "data": "productions live in your own CouchDB instance"
  },
  "notVerified": [
    "a run of this recipe from OBS to a live Twitch channel on OSC for this page",
    "the exact Studio screen that shows a WHIP source's address, and whether a bearer token is needed for it",
    "the Twitch preset URL against a real Twitch ingest (the source marks preset URLs as to be verified live)",
    "stream stability on Twitch: no public, citable measurement exists"
  ],
  "servicesVerifiedLive": {
    "date": "2026-11-12",
    "method": "osc_call_tool get-service-schema on eyevinn-open-live and eyevinn-open-live-studio; source read at the v0.8.0 tags through the GitHub contents API."
  },
  "gateCheck": {
    "gatedServiceId": "eyevinn-just-go-live",
    "usesGatedService": false,
    "note": "This stack does not name or link eyevinn-just-go-live."
  },
  "verifiedOn": "2026-11-12",
  "publishedAt": "https://www.osaas.io/use-cases/obs-to-twitch",
  "descriptorUrl": "https://www.osaas.io/stacks/obs-to-twitch.json"
}
