Take control over your live stream video by running it yourself. Streaming + chat out of the box.


Logo

Take control over your content and stream it yourself.
Explore the docs »

View Demo · Use Our Server for Testing · FAQ · Report Bug

Table of Contents

About The Project

In 2020 the world changed when everyone become stuck in their homes, looking for creative outlets to share their art, skills and themselves from inside their bedroom.

This created an explosion of live streaming on Facebook Live, YouTube Live, Instagram, and Twitch. These services provided everything they needed, an easy way to live stream to the world, and a chat for users to be a part of their community.

That's when I wanted a better option for people. Something you could run yourself and get all the functionality of these services, where you could live stream to an audience and and allow them to take part in the chat, just like they've been used to on all the other services. There should be a independent, standalone Twitch in a Box.

Keep in mind that while streaming to the big social companies is always free, you pay for it with your identity and your data, as well as the identity and data of every person that tunes in. When you self-host anything you'll have to pay with your money instead. But running a self-hosted live stream server can be done for as cheap as $5/mo, and that's a much better deal than selling your soul to Facebook, Google or Amazon.


Getting Started

The goal is to have a single service that you can run and it works out of the box. Visit the Quickstart to get up and running.

Configuration

Many aspects can be adjusted and customized to your preferences. Read more about Configuration to update the web UI, video settings, and more.

Web interface + chat

Owncast includes a web interface to your video with built-in chat that is available once you start the server.

The web interface was specifically built to be editable by anybody comfortable tweaking a web page. It's not bundled or transpiled into anything, it's just HTML + Javascript + CSS that you can start editing.

Read more about the features provided and how to configure them in the web documentation.

Use with your existing broadcasting software

In general Owncast is compatible with any software that uses RTMP to broadcast to a remote server. RTMP is what all the major live streaming services use, so if you’re currently using one of those it’s likely that you can point your existing software at your Owncast instance instead.

OBS, Streamlabs, Restream and many others have been used with Owncast. Read more about compatibility with existing software.

Video storage options

Two ways of storing and distributing the video are supported.

  1. Locally via the Owncast server.
  2. S3-compatible storage.

Local file distribution

This is the simplest and works out of the box. In this scenario video will be served to the public from the computer that is running the server. If you have a fast internet connection, enough bandwidth alotted to you, and a small audience this may be fine for many people.

S3-Compatible Storage

Instead of serving video directly from your personal server you can use a S3 compatible storage provider to offload the bandwidth and storage requirements elsewhere.

Read more detailed documentation about configuration of S3-compatible services.

Building from Source

  1. Ensure you have the gcc compiler configured.
  2. Install the Go toolchain.
  3. Clone the repo. git clone https://github.com/owncast/owncast
  4. go run main.go pkged.go will run from source.
  5. Point your broadcasting software at your new server and start streaming.

There is also a supplied Dockerfile so you can spin it up from source with little effort. Read more about running from source.

Bundling in latest admin from source

The admin ui is built at: https://github.com/owncast/owncast-admin it is bundled into the final binary using pkger.

To bundle in the latest admin UI:

  1. Install pkger. go install github.com/markbates/pkger/cmd/...
  2. From the owncast directory run the packager script: ./build/admin/bundleAdmin.sh
  3. Compile or run like above. go run main.go pkged.go

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Project chat: Join us on Rocket.Chat if you want to contribute, follow along, or if you have questions.

Gabe Kangas - @[email protected] - email [email protected]

Project Link: https://github.com/owncast/owncast

Owner
Owncast
A self-hosted live stream server with chat features.
Owncast
Comments
  • Can't Use With Restream due to Random Echo Not Matched

    Can't Use With Restream due to Random Echo Not Matched

    ERRO[0014] Server closed by error: Err = Random echo is not matched
    github.com/yutopp/go-rtmp/handshake.HandshakeWithClient
            /home/bradley/go/pkg/mod/github.com/yutopp/[email protected]/handshake/handshake.go:102
    github.com/yutopp/go-rtmp.(*serverConn).Serve
            /home/bradley/go/pkg/mod/github.com/yutopp/[email protected]/server_conn.go:28
    github.com/yutopp/go-rtmp.(*Server).handleConn
            /home/bradley/go/pkg/mod/github.com/yutopp/[email protected]/server.go:115
    runtime.goexit
            /usr/local/go/src/runtime/asm_amd64.s:1373
    Failed to handshake
    github.com/yutopp/go-rtmp.(*serverConn).Serve
            /home/bradley/go/pkg/mod/github.com/yutopp/[email protected]/server_conn.go:31
    github.com/yutopp/go-rtmp.(*Server).handleConn
            /home/bradley/go/pkg/mod/github.com/yutopp/[email protected]/server.go:115
    runtime.goexit
            /usr/local/go/src/runtime/asm_amd64.s:1373
    

    Set this up with restream, in addition to two other streams going out of restream to facebook and youtube.

  • User accounts

    User accounts

    I've read in one of the issues that you do not intend to have user account functionality, but I want to present two arguments for why it is unavoidable:

    • First, as the streamer, you want to participate in chat (and viewers need indication that you are indeed the real streamer, since people can choose their own nickname it could be easily impersonated!), you want to have access to (future) mod tools like timeouts and kicks using chat commands. HTTP auth using the stream key is not sufficient for this, you'd want a login session
    • Second, any large streamer needs multiple mods to help moderate chat, since the streamer is busy performing the actual stream. You could maybe mod anonymous users every time you start a stream, but it would be really bothersome to repeat every time and you'd never know the anonymous person is who you think they are, mods could be easily impersonated

    I understand the desire to not have a whole account management system. My personal wish would be a system where you can authenticate using your fediverse account, using OAuth or maybe OpenID (though OpenID would have to first be added to Mastodon). Like, I don't think it makes sense federating an ephermal chat, but it'd be cool if you could use your existing identity to use the chat on the site.

    Otherwise I do agree that the UX flow where you pick your nickname and can start chatting immediately should be kept, as sign-up-before-chatting on every single owncast would be too disruptive; I just think this could essentially become a user account you then get a choice of setting a password for (or maybe e-mail and then use magic links to sign-in).

  • Connected Chat Participants

    Connected Chat Participants

    The only major issue I'm continuing to have is that the Connected Chat Participants never shows chat participants in any browser. Here's what it looks like when there's no stream:

    image

    Here's what it shows when there's an active stream: image

    In this example, I have chat participants from two different browsers.

    The messages do show up under Chat Messages: image

    But never under "Connected Chat Participants"

  • Provide RTMP URL in the admin page next to the stream key

    Provide RTMP URL in the admin page next to the stream key

    Normally streaming services will have the RTMP URL available for quickly copypaste into streaming software. Right now I have to click through to the external owncast documentation page in order to find out the path to stream to (/live). Ideally this would be shown in the server settings page along with the stream key.

  • Quickstart fails, `valid config/config.yaml is required` (and other mattdsteele questions)

    Quickstart fails, `valid config/config.yaml is required` (and other mattdsteele questions)

    Ran through the Dockerized setup in the quickstart, and I was able to successfully build the container, but starting it I'm encountering this error:

    root@ubuntu-s-1vcpu-1gb-sfo2-01:~/owncast# docker run -p 8080:8080 -p 1935:1935 -it owncast
    INFO[2020-07-12T19:20:21Z] Owncast v0.0.0-localdev (unknown)
    FATA[2020-07-12T19:20:21Z] ERROR: valid config/config.yaml is required.  Copy config-example.yaml to config.yaml and edit
    

    I copied the sample config into config/config.yaml before building the container:

    root@ubuntu-s-1vcpu-1gb-sfo2-01:~/owncast# ls -l config
    total 16
    -rw-r--r-- 1 root root 4941 Jul 12 19:10 config.go
    -rw-r--r-- 1 root root 1441 Jul 12 19:18 config.yaml
    -rw-r--r-- 1 root root  842 Jul 12 19:10 configUtils.go
    

    The only line I changed was updating streamingKey to a different value. I also tried copying config-example.yaml directly, and that also failed.

    I'll try the non-Docker approach next, but would definitely like to have this running in a container as an option!

    For context, this is a stock DigitalOcean VPS running Ubuntu 20.04

  • Migrate to hashed password/key store (#2489)

    Migrate to hashed password/key store (#2489)

    In order to improve Owncast security, the admin password and stream keys are no longer being stored in plaintext, instead using a standard cryptographic hashing process to store them securely.

    This commit not only moves the admin password to storage as a hash, but also splits the StreamKey model into StreamKeyPlainText and StreamKeyHashed to make it clear when, where, and how a stream key is being used in its plaintext and hashed forms. Attempting to store a plaintext key to the database will automatically hash it.

    Since it is no longer possible to send the plaintext admin password and streaming keys to the web UI, they have been removed from the relevant HTTP response objects.

  • Make all links open in a new tab by default

    Make all links open in a new tab by default

    Share your bug report, feature request, or comment.

    We're doing that in the old UI, but we need to add this to webv2 as well. I believe it's just an additional tag in the html head.

  • IP banning of users

    IP banning of users

    As it stands, users may clear their storage to bypass bans.
    This feature will make bans also apply to IP addresses. When a ban is made, the username and IP will be banned.

    Small note

    About the development moderation GUI, it seems like you can ban people which disconnected. Due to this, a list may need to be maintained in memory to also ban the IP.

  • Plesk does not support our Dockerfile syntax

    Plesk does not support our Dockerfile syntax

    Hello.

    Background:

    I'm trying to get Owncast running via Docker within Plesk. It isn't as simple as docker-compose or just simply running docker normally .


    In my testing to see if indeed it was something that I screwed up on I tested portainer as it uses three ports ( see https://github.com/portainer/portainer/blob/develop/build/linux/Dockerfile#L8..L10 ) and that does work.

    I followed the same sort of setup to get Owncast going, but it seems your EXPOSE combines two ports in the same line.

    I've also done some other digging and experimenting to see if this is just a one off on Plesk being a pain in the you know where but it isn't.

    It seems your EXPOSE of combining two ports on the same line causes issues - see https://github.com/owncast/owncast/blob/develop/Dockerfile#L3

    Sidenote: I actually have Plesk running on a Vultr VPS as I saw on #1446

  • Support text input of :emoji: in chat

    Support text input of :emoji: in chat

    Replaces the typed :emoji: in the chat on client-side with the emoji <img>. Only the valid emoji names get replaced [+bonus point!]. Emoji name lookup is case-insensitive. Supports pasting text with :emoji: in it (you can paste This is a :portalparrot:! and it will be rendered). Copy-pasting of the rendered emoji is also supported! [+extra bonus point! 😉]

    closes #480

  • Next round of testing!

    Next round of testing!

    Now that the web updates are in I wanted to get some more testing done by people broadcasting through Owncast. Mostly as a way to see how different variables of software and hardware configurations + network conditions, and bitrate configurations work together. It seems like each time we fire it up and actually use it something new is learned both from the broadcasting and viewing side.

    Also since @mattdsteele's wedding is next month (August 8th?) I'd be nice to feel solid about things before then.

    Here's some streaming I hope to schedule:

    • @controlfreakstudio Are you still up for trying out Owncast for a live stream? I'm happy to have you use my server if you'd like, or you can run your own.
    • I'll get @gingervitis to do some Animal Crossing commentary streaming 🐱.
    • My friend Rebecca wants to do a live stream of a book reading.
    • I'll be doing another DJ set stream in the next week or so.

    If anybody knows of anybody who's looking to stream online and wants a place to do it, I'm always happy to host them on my test server goth.land.

  • fix(deps): update dependency xstate to v4.35.2 (webv2)

    fix(deps): update dependency xstate to v4.35.2 (webv2)

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | xstate (source) | 4.35.1 -> 4.35.2 | age | adoption | passing | confidence |


    Release Notes

    statelyai/xstate

    v4.35.2

    Compare Source

    Patch Changes

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • fix(deps): update dependency chart.js to v4.1.2 (webv2)

    fix(deps): update dependency chart.js to v4.1.2 (webv2)

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | chart.js (source) | 4.1.1 -> 4.1.2 | age | adoption | passing | confidence |


    Release Notes

    chartjs/Chart.js

    v4.1.2

    Compare Source

    Essential Links

    Types

    Documentation

    • #​11006 Fixes missing markdown links in docs

    Development

    Thanks to @​LeeLenaleee, @​dangreen and @​matveycodes


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • Add Google Cast support

    Add Google Cast support

    Share your bug report, feature request, or comment.

    Would be nice to be able to view streams using chrome cast devices without the need to use the desktop tab cast feature.

    Assuming the stream is already using a compatible codec (the default Owncast settings are) the HLS protocol and the mu3p playlists are already compatible with chrome cast devices.

    I've spun up a proof of concept that uses the castjs library. The s post variable can be updated to public Owncast stream and the page will pass it along to a chrome cast device once the button is pressed. This should work on mobile as well as desktop devices on the same network as a Google Cast enabled device.

    The POC page source is below is below

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>Cast Test</title>
    </head>
    <body>
        <button id="cast"> Cast </button>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/castjs/5.2.0/cast.min.js"></script>
        <script>
        var url = new URL(window.location.href);
        var domain = url.searchParams.get("s");
        const cjs = new Castjs();
        document.getElementById('cast').addEventListener('click', function() {
            if (cjs.available) {
                cjs.cast(domain + '/hls/stream.m3u8', {
                    poster     : domain + '/logo',
                    title      : domain,
                    description: 'Owncast live stream'
                })
            }
        });
        </script>
    </body>
    </html>
    

    As of now the POC works for my use case as a link from the Custom Page Content but would be nice to have more properly integrated.

  • chore(deps): update dependency babel-loader to v9.1.2 (webv2)

    chore(deps): update dependency babel-loader to v9.1.2 (webv2)

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | babel-loader | 9.1.0 -> 9.1.2 | age | adoption | passing | confidence |


    Release Notes

    babel/babel-loader

    v9.1.2

    Compare Source

    9.1.1 was a broken release, it didn't include all the commits.

    Dependencies updates

    Misc

    New Contributors

    Full Changelog: https://github.com/babel/babel-loader/compare/v9.1.0...v9.1.2

    v9.1.1

    Compare Source


    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

  • chore(deps): update dependency @babel/core to v7.20.12 (webv2)

    chore(deps): update dependency @babel/core to v7.20.12 (webv2)

    Mend Renovate

    This PR contains the following updates:

    | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | @babel/core (source) | 7.20.7 -> 7.20.12 | age | adoption | passing | confidence |


    Release Notes

    babel/babel

    v7.20.12

    Compare Source

    :bug: Bug Fix
    • babel-traverse
    • babel-helper-create-class-features-plugin, babel-plugin-proposal-class-properties
    :nail_care: Polish

    Configuration

    📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

    🚦 Automerge: Enabled.

    Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

    🔕 Ignore: Close this PR and you won't be reminded about this update again.


    • [ ] If you want to rebase/retry this PR, check this box

    This PR has been generated by Mend Renovate. View repository job log here.

Parse and generate m3u8 playlists for Apple HTTP Live Streaming (HLS) in Golang (ported from gem https://github.com/sethdeckard/m3u8)

go-m3u8 Golang package for m3u8 (ported m3u8 gem https://github.com/sethdeckard/m3u8) go-m3u8 provides easy generation and parsing of m3u8 playlists d

Nov 19, 2022
🔥 Golang live stream lib/client/server. support RTMP/RTSP/HLS/HTTP[S]-FLV/HTTP-TS, H264/H265/AAC, relay, cluster, record, HTTP API/Notify, GOP cache. 官方文档见 https://pengrl.com/lal
🔥 Golang live stream lib/client/server. support RTMP/RTSP/HLS/HTTP[S]-FLV/HTTP-TS, H264/H265/AAC, relay, cluster, record, HTTP API/Notify, GOP cache. 官方文档见 https://pengrl.com/lal

lal是一个开源GoLang直播流媒体网络传输项目,包含三个主要组成部分: lalserver:流媒体转发服务器。类似于nginx-rtmp-module等应用,但支持更多的协议,提供更丰富的功能。lalserver简介 demo:一些小应用,比如推、拉流客户端,压测工具,流分析工具,调度示例程序等

Jan 1, 2023
live streaming server in golang
live streaming server in golang

中文 Simple and efficient live broadcast server: Very simple to install and use; Pure Golang, high performance, and cross-platform; Supports commonly us

Nov 10, 2022
A live streaming tool more suitable for non-graphical servers

KPlayer KPlayer可以帮助你快速的在服务器上进行视频资源的循环直播推流。

Jan 2, 2023
Go-video-preview-ffmpeg-wrapper - A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews.

Go-video-preview-ffmpeg-wrapper A simple helper wrapper to generate small webm video previews using ffmpeg, useful for web previews. Getting Started u

Jan 5, 2022
Personal video streaming server.

tube This is a Golang project to build a self hosted "tube"-style video player for watching your own video collection over HTTP or hosting your own ch

Jan 5, 2023
Stream video from ffmpeg to webrtc

ffmpeg-to-webrtc demonstrates how to send video from ffmpeg to your browser using pion.

Dec 28, 2022
LiveKit - Open source, distributed video/audio rooms over WebRTC

LiveKit is an open source project that provides scalable, multi-user conferencing over WebRTC. It's designed to give you everything you need to build real time video/audio capabilities in your applications.

Jan 9, 2023
Live on-demand transcoding in go using ffmpeg. Also with NVIDIA GPU hardware acceleration.

Go live HTTP on-demand transcoding Transcoding is expensive and resource consuming operation on CPU and GPU. For big companies with thousands of custo

Dec 16, 2022
Short video direct link acquisition 短视频直连获取工具
Short video direct link acquisition 短视频直连获取工具

Glink 短视频去水印一键解析应用 Short video direct link acquisition 短视频直连获取工具 Glink是一款基于go语言开发的短视频解析应用,前端使用vue+argon主题,后端使用go-fiber框架,支持web在线模式、客户端模式。

Dec 7, 2022
Quik.do is a video conferencing tool.
Quik.do is a video conferencing tool.

Quik.do is a video conferencing tool.

Jan 3, 2023
Go4vl is Go library for working with the Video for Linux API (V4L2) natively, without any C bindings.

go4vl A Go library for working with the Video for Linux user API (V4L2). Gov4l hides all the complexities of working with V4L2 and exposes idiomatic G

Dec 23, 2022
A simple library to extract video and audio frames from media containers (based on libav).
A simple library to extract video and audio frames from media containers (based on libav).

Reisen A simple library to extract video and audio frames from media containers (based on libav, i.e. ffmpeg). Dependencies The library requires libav

Jan 2, 2023
Project to get Youtube video descriptions and search those videos as required

FamPayProject Project to get Youtube video descriptions and search those videos as required Prerequisities Postgres DB for persisting data Youtube Dat

Nov 5, 2021
Synthetic media is a realistic transformation of audio and video using artificial intelligence.

Synthetic media is a realistic transformation of audio and video using artificial intelligence.

Nov 20, 2021
Video converter with golang

Requirements Debian-like system (ubuntu, mint, etc...) with apt package manager Golang >1.15 Command tool make (use sudo apt install make -y to instal

Sep 10, 2022
golang function that download a video from youtube, and convert it to a mp3 file using ffmpeg

echedwnmp3 echedwnmp3 is a function that download a video from youtube, and convert it to a mp3 file using ffmpeg example package main import(echedwn

Dec 7, 2021
lmmp3 is a little golang library that download a video from youtube, and convert it to a mp3 file using ffmpeg

lmmp3 lmmp3 is a function that download a video from youtube, and convert it to a mp3 file using ffmpeg You need to have installed ffmpeg in your syst

Aug 12, 2022
ffcommander - An easy frontend to FFmpeg and Imagemagick to automatically process video and manipulate subtitles.

% FFCOMMANDER(1) ffcommander 2.39 % Mikael Hartzell (C) 2018 % 2021 Name ffcommander - An easy frontend to FFmpeg and Imagemagick to automatically pro

May 9, 2022