{
  "id": "osc-stack-live-rtmp-to-hls",
  "job": "Broadcast a live video feed from OBS over RTMP and serve it to viewers as HLS in a browser.",
  "aliases": [
    "rtmp ingest to hls playback",
    "self-hosted live streaming server",
    "managed rtmp endpoint with hls output",
    "stream from OBS to a web player"
  ],
  "inputs": [
    {
      "protocol": "RTMP",
      "source": "OBS Studio or any RTMP encoder"
    }
  ],
  "outputs": [
    {
      "protocol": "HLS",
      "framerate": "follows-input",
      "segmentType": "mpegts",
      "segmentDurationSeconds": 10,
      "rateControl": "cbr",
      "programDateTime": false,
      "renditions": [
        {
          "resolution": "1280x720",
          "video": "avc1.42c01f",
          "audio": "mp4a.40.2"
        },
        {
          "resolution": "640x360",
          "video": "avc1.42c01e",
          "audio": "mp4a.40.2"
        }
      ],
      "renditionsAreDefaultLadder": true,
      "outputDefaultsSource": "Eyevinn/live-encoding@165dae1, read 2026-08-28. Not version-pinned to the running image; each value is documented in-source as preserving pre-existing behaviour, so it holds across the plausible image range.",
      "renditionsCorroboratedAgainstObservedManifest": true
    }
  ],
  "recommendedPath": {
    "serviceId": "eyevinn-live-encoding",
    "requiredConfig": ["name"],
    "requiresCredential": false,
    "tokensPerDay": 50,
    "viewerPage": "bring your own HLS player for an audience; the service also ships its own /control UI embedding @eyevinn/web-player, which is an operator surface rather than an audience page",
    "measuredWallClockSeconds": [386],
    "wallClockNote": "Run 2, Codex, unattended, no recipe supplied. Includes an abandoned Path A dead end and an F3 certificate wait, so it is a pessimistic figure for this path.",
    "agentFoundServiceUnaided": true
  },
  "configSurface": {
    "totalFields": 18,
    "required": ["name"],
    "optionalCount": 17,
    "sensitiveFields": ["StreamKey"],
    "updateSupported": false,
    "restartSupported": false,
    "note": "All 17 optional fields are create-time commitments: changing one requires delete and recreate, which yields a new RTMP endpoint."
  },
  "setup": {
    "codeRequired": false,
    "knownDeployGotcha": "Instance reports ready before its TLS certificate is issued, so the first request can fail. Retry the same request unchanged after about a minute."
  },
  "cost": {
    "unit": "tokens/day",
    "ceiling": 50,
    "ceilingSource": "get-usage per-instance rate read, measured live in three workspaces 2026-08-26",
    "tokensPerWeekProjected": 350,
    "tokensPerWeekIsProjection": true,
    "meteredTotalConsumptionVerified": false,
    "freePlanTokens": 100,
    "freePlanTokensAreOneTime": true,
    "daysToExhaustFreePlan": 2,
    "cheapestPlanCoveringContinuousUse": {
      "name": "Professional",
      "eurPerMonth": 69
    },
    "pricingSource": "osaas.io 2026-08-26"
  },
  "verifiedOn": "2026-08-26",
  "descriptorCorrectedOn": "2026-08-28",
  "publishedAt": "https://www.osaas.io/use-cases/live-streaming",
  "descriptorUrl": "https://www.osaas.io/stacks/live-rtmp-to-hls.json"
}
