{
  "version": "2",
  "generatedAt": "2026-11-03T22:49:39.280Z",
  "listing": {
    "slug": "owncast--owncast",
    "name": "Owncast",
    "tagline": "Self-hosted single-streamer live video and chat server with an admin REST API.",
    "shortTagline": "Self-hosted live video and chat",
    "description": "A Go server that accepts RTMP from OBS or any encoder, serves an HLS player with chat, and federates to the Fediverse. Everything the admin panel does is an HTTP endpoint documented in the repo's openapi.yaml, so an agent can retitle the stream, moderate chat, rotate stream keys, and read viewer stats.",
    "capabilities": [
      "operable"
    ],
    "vertical": "video-streaming",
    "alternativeTo": [
      "Twitch",
      "YouTube Live"
    ],
    "shape": "product",
    "formFactor": "web-app",
    "executionModel": "deterministic",
    "provenance": "human-written",
    "codeStack": {
      "languages": [
        "Go",
        "TypeScript"
      ],
      "frameworks": [
        "React"
      ],
      "packageManager": "npm",
      "database": [
        "SQLite"
      ],
      "hostingTarget": [
        "Linux server",
        "Docker"
      ]
    },
    "modelStack": null,
    "repos": [
      {
        "url": "https://github.com/owncast/owncast",
        "owner": "owncast",
        "name": "owncast",
        "license": "MIT",
        "stars": 11491,
        "lastCommit": "2026-09-03"
      }
    ],
    "interface": {
      "kind": "api",
      "url": "https://owncast.online/api/",
      "official": true,
      "hosted": "local"
    },
    "operability": "official",
    "recommendedWrapper": null,
    "reach": [
      {
        "job": "Set stream title, name, summary, tags, and page content",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/config/streamtitle, /admin/config/name, /admin/config/serversummary, /admin/config/tags, /admin/config/pagecontent"
      },
      {
        "job": "Manage stream keys and RTMP/web ports",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/config/streamkeys, /admin/config/rtmpserverport, /admin/config/webserverport"
      },
      {
        "job": "Configure video output variants, codec, and latency",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/config/video/streamoutputvariants, /admin/config/video/codec, /admin/config/video/streamlatencylevel"
      },
      {
        "job": "Moderate chat: hide messages, ban IPs, set moderators",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/chat/messagevisibility, /admin/chat/users/ipbans/create, /admin/chat/users/setmoderator"
      },
      {
        "job": "Read live status, viewer counts, and hardware stats",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/status, /admin/viewers, /admin/viewersOverTime, /admin/hardwarestats"
      },
      {
        "job": "Manage Fediverse followers",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/followers, /admin/followers/approve, /admin/followers/remove, /admin/followers/blocked"
      },
      {
        "job": "Disconnect the inbound broadcast",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/disconnect"
      },
      {
        "job": "Start broadcasting",
        "reachable": false,
        "evidence": "Owncast only ingests RTMP; starting a stream is the encoder's job (OBS, ffmpeg), not an API call"
      },
      {
        "job": "Send chat messages as an integration",
        "reachable": true,
        "evidence": "docs Integrations section: Access Tokens and External Actions; public /chat endpoints in openapi.yaml"
      },
      {
        "job": "Configure S3 storage and external CDN",
        "reachable": true,
        "evidence": "openapi.yaml: /admin/config/s3, /admin/config/videoservingendpoint"
      }
    ],
    "editions": [
      {
        "name": "Free",
        "price": null,
        "open": true,
        "distributions": [
          {
            "kind": "binary",
            "url": "https://owncast.online/docs/quickstart/"
          },
          {
            "kind": "container",
            "url": "https://hub.docker.com/r/owncast/owncast"
          },
          {
            "kind": "source",
            "url": "https://github.com/owncast/owncast"
          }
        ]
      }
    ],
    "skills": {
      "kind": "none",
      "paths": [],
      "install": null,
      "note": "No SKILL.md, Claude Code plugin, or published skill found in the repo."
    },
    "customization": null,
    "useWhen": [
      "I want to stream to my own domain instead of Twitch and have my agent retitle the stream and moderate chat",
      "I run community events and need a private RTMP endpoint with chat I control"
    ],
    "accounts": [],
    "active": true,
    "lastActivity": "2026-09-03",
    "gotchas": [
      "Admin API uses HTTP basic auth with the admin password; issue Access Tokens for integrations instead of sharing it",
      "No Windows server support; use WSL2",
      "Configuration lives in the SQLite database and admin panel, not in a config file, so infrastructure-as-code means scripting the API"
    ],
    "fit": {
      "adaptable": 0,
      "operable": 3
    },
    "evidence": {
      "formFactor": "README: Go backend plus React web frontend served on :8080",
      "executionModel": "no model at runtime; ffmpeg transcoding only",
      "operability": "openapi.yaml at repo root and owncast.online/api published by the Owncast project",
      "effort": "no env var, config file, or prompt file documented; runtime flags only (owncast.online/docs/configuration/runtime-flags)",
      "editions": "MIT LICENSE; free downloads and Docker image",
      "active": "GitHub pushedAt 2026-09-03; release v0.2.5 2026-04-11"
    },
    "confidence": {
      "formFactor": 0.95,
      "executionModel": 0.99,
      "operability": 0.95,
      "effort": 0,
      "reach": 0.85,
      "editions": 0.95
    },
    "openQuestions": [
      "Owncast has no documented env var or config file; only runtime flags (--database, --webserverport, --rtmpport, --adminpassword). If the Curator accepts flags as a surface, add Adaptable at fork-and-modify with fit 1",
      "Confirm webhook endpoints (/admin/webhooks/*) in the current openapi.yaml; the first 80 paths listed did not reach them"
    ],
    "sources": [
      {
        "url": "https://owncast.online",
        "foundBy": "sourcing:video-streaming:community"
      },
      {
        "url": "https://github.com/owncast/owncast",
        "foundBy": "sourcing:video-streaming:community"
      },
      {
        "url": "https://owncast.online/docs/configuration/runtime-flags/",
        "foundBy": "analysis"
      }
    ],
    "research": {
      "stage": "verified",
      "verdict": "unverified",
      "reason": "Official REST admin API with near-complete Reach; no named customization surface, so Operable only.",
      "disputed": []
    },
    "url": "apps/owncast--owncast.html",
    "coverage": "partial",
    "paid": false,
    "source": "research/verified/owncast--owncast.json"
  }
}
