One fast, self-hosted binary for Twitch and Discord. Moderation, custom commands, Channel-Points triggers and native Twitch Predictions, a points economy with mini-games, provably-fair giveaways, multi-provider song requests (Spotify and YouTube), Stream Wrapped recap cards, and OBS overlays. Self-host it free forever, your data on your machine.
Why EngelOS? • Features • Quick Start • Configuration • Architecture • Status
⭐ If this looks useful, star the repo to follow along and help it grow.
EngelOS is a platform, not a single bot. It grew out of EngelGuard, an earlier Python Twitch bot. Building EngelGuard made one thing clear: what I actually wanted was far bigger than any single bot, so I rebuilt everything from scratch in Go as one coherent suite. EngelGuard didn't disappear; it's the moderation bot inside EngelOS. The Twitch and Discord bots are still EngelGuard, and EngelOS is the bigger home they live in, tying moderation, commands, a points economy, games, giveaways, and engagement systems together in a single static binary with an embedded web dashboard.
The goal is for everything to live under one roof: the chat bots, the Discord integration, the web dashboard, and over time a plugin/addon ecosystem and a downloadable companion client. The companion client is the ambitious part of the vision: a small app a streamer installs so the bot can trigger real actions on their machine in response to events (a channel-point redemption firing an on-screen effect, for example). Most of that is still on the roadmap below, but it's why EngelOS is built as a platform from day one rather than a one-off bot.
[!IMPORTANT] Phase 1 alpha. The core is live and tested under Go's race detector, but the public OSS launch is targeted for December 2026, so APIs and the database schema may still change without notice. Not accepting external contributions yet (the codebase moves fast).
Tired of Nightbot Premium, StreamElements' limits, or cloud bots that own your data?
Plus a few things the big bots simply don't offer:
$(...) variable system for custom commands, including a real $(math …) evaluator.| EngelOS | Nightbot | StreamElements | EngelGuard (Python) | |
|---|---|---|---|---|
| Cost | Free self-hosted (optional paid Cloud later) | Free + Premium | Free + Premium | Free |
| Self-hosted | ✅ | ❌ cloud only | ❌ cloud only | ✅ |
| Open source | ✅ AGPL-3.0 | ❌ | ❌ | ✅ MIT |
Custom commands + $(...) vars |
✅ incl. $(math) |
✅ | ✅ | ✅ |
| AutoMod audit log + dry-run | ✅ | ❌ | ❌ | partial |
| Channel-Points triggers + points fallback | ✅ | ❌ | partial | partial |
| Native Twitch Predictions | ✅ | ❌ | ❌ | ❌ |
| Mini-games (gamble/duel/heist) | ✅ | ❌ | ✅ | ✅ |
| Provably-fair giveaways | ✅ | ❌ | ❌ | ❌ |
| Song requests (Spotify + YouTube) | ✅ both | ✅ YT | ✅ both | ❌ |
| Stream Wrapped recap cards | ✅ | ❌ | ❌ | ❌ |
| OBS overlays built in | ✅ | ❌ | ✅ | ❌ |
| Single binary | ✅ Go | n/a | n/a | ❌ Python |
| Multi-platform | Twitch + Discord, YouTube/Kick 🚧 | Twitch/YT | Twitch/YT | Twitch |
Seven configurable filters, each with per-filter role exemptions:
!permit),
emote limits, message length, repetition, and banned words (5 match modes incl. regex).!addcom, !editcom, !delcom with a Nightbot-style variable system:
$(user) $(touser) $(channel) $(args) $(1)…$(9) $(random a b) $(random.pick …)
$(time) and a real $(math 1+2*3) recursive-descent evaluator (not arbitrary code-eval).!quote, !addquote, !delquote. Counters: !counter, +, −, set, reset.
Timers and auto-announcements.!uptime !game !title !accountage !followage !so (shoutout with last category).!8ball !lurk !unlurk !dice !roll !love !ship !hug !slap.Two independent systems you can switch on or off, in any combination:
Channel-Points trigger engine (for affiliates and partners): bind a real Twitch Channel-Point
reward to a bot action. If your channel has Channel Points and you want to use them, turn it on. This
also powers native Twitch Predictions: !prediction <title> | <option> | <option> opens a real
Channel-Points prediction, !lockprediction stops betting, and !endprediction <winner> settles it,
Twitch handles the proportional points payout itself.
Built-in points economy (works on any channel, affiliate or not): a self-managed currency that powers engagement and mini-games. Channels without Channel Points use it as their main system, but an affiliate who still wants gambling can run it alongside Channel Points, or skip it entirely.
!points, !give, !pointslb. The store is atomic and can never overdraw.!gamble (double-or-nothing with a documented house edge), !slots (weighted reels),
!duel (PvP wager, both players must afford the stake before any points move), and !heist
(async multiplayer group game). No player can ever go negative.!reward/!rewards/!redeem, a points-backed reward store, a Channel-Points-style
redemption system for channels that don't have Channel Points.!giveaway, !enter, !draw, !reroll with a provably-fair draw:
winner = SHA256(seed │ drawNumber │ sorted-entrant-ids) mod N, where the seed is announced at open
time, so the draw is publicly verifiable and un-riggable.Per-channel choice of music backend, so you pick how requests are played:
!sr <song or link> adds the track to a dedicated playlist,
!song shows what's playing, !skipsong skips. Connect your account from the dashboard
(/api/v1/auth/spotify/login); needs Spotify Premium on the bot account./overlay/song-player
browser source auto-plays it via the YouTube IFrame player./overlay/now-playing) renders the current track for either provider.Spotify-Wrapped-style recap cards, served as shareable pages and a /overlay/wrapped browser source:
!addevent <when> <name>,
!nextevent, and !schedule with live countdowns, so viewers always know what's coming up.!here window on a big play and it earns a
common/rare/legendary tier by turnout. Small engagement extra, off unless a mod starts one.go:embed) with live pages: Home (real daemon stats),
Channel Points, Commands, Counters, AutoMod (filter config plus audit-log viewer), and Login./overlay/events,
/overlay/alerts, /overlay/leaderboard, /overlay/now-playing, /overlay/song-player,
/overlay/wrapped, and /overlay/moment. Drop the URL into an OBS Browser Source and go.git clone https://github.com/Luca-Pelzer/engelos.git
cd engelos
make web-build # build + embed the dashboard (optional; without it, / serves JSON)
go build -o engelos ./cmd/engelos
# Anonymous, read-only Twitch, no credentials needed
ENGELOS_TWITCH_CHANNELS=yourchannel ./engelos
The daemon listens on http://127.0.0.1:8080 (loopback only by default). Open it in a browser to
reach the dashboard, or a JSON status page if you skipped make web-build.
All configuration is via environment variables:
| Variable | Meaning | Default |
|---|---|---|
ENGELOS_DATA_DIR |
Where the SQLite databases live | $XDG_DATA_HOME/engelos |
ENGELOS_ADDR |
HTTP listen address | 127.0.0.1:8080 |
ENGELOS_TWITCH_CHANNELS |
Comma-separated channels to join | unset (Twitch disabled) |
ENGELOS_TWITCH_USERNAME |
Bot login (authenticated mode) | empty (anonymous) |
ENGELOS_TWITCH_OAUTH |
OAuth token (oauth: prefix optional) |
empty (anonymous) |
ENGELOS_TWITCH_CLIENT_ID |
Helix Client-ID (required with OAuth) | empty |
ENGELOS_SECRETS_KEY |
Enables encrypted OAuth/login storage (openssl rand -base64 32) |
unset |
ENGELOS_SPOTIFY_CLIENT_ID / _SECRET / _REDIRECT_URL |
Enable Spotify song requests (needs ENGELOS_SECRETS_KEY) |
unset |
ENGELOS_YOUTUBE_API_KEY |
Enable YouTube song requests (YouTube Data API v3 key) | unset |
[!NOTE] Anonymous mode is read-only (chat-reading and counters). Moderation actions, the dashboard login, and OAuth-gated features need an authenticated bot account and
ENGELOS_SECRETS_KEY.
┌──────────────────────────────────────────────────────────┐
│ EngelOS Core Daemon (Go, single static binary) │
│ │
│ ┌────────────────────┐ ┌────────────────────────┐ │
│ │ Platform Adapters │ → │ Runtime Dispatcher │ │
│ │ Twitch · Discord │ │ (fan-in goroutine) │ │
│ │ YouTube/Kick 🚧 │ └───────────┬────────────┘ │
│ └────────────────────┘ │ │
│ ↓ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ AutoMod │ │ Commands + │ │ Economy + │ │
│ │ (7 filters, │ │ $(...) vars │ │ Games + │ │
│ │ audit log) │ │ · Quotes │ │ Giveaways │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────────────────────┐ │
│ │ Auth │ │ Pity·Streak·Live-Ops·Channel- │ │
│ │ (Argon2id, │ │ Points·Predictions·SongReqs· │ │
│ │ RBAC, keys) │ │ Wrapped·Moments·Counters │ │
│ └──────────────┘ └──────────────────────────────┘ │
│ └────────┬────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Event-Sourcing Engine (SQLite WAL, append-only) │ │
│ └────────────────────────────────────────────────────┘ │
│ │
│ HTTP / WebSocket / SSE API on 127.0.0.1:8080 │
└──────────────────────────────────────────────────────────┘
▲ ▲ ▲
┌────┴────┐ ┌────────┴───────┐ ┌─────────┴─────────┐
│ TUI 🚧 │ │ Web Dashboard │ │ Companion app 🚧 │
│ (BTea) │ │ (Svelte 5) ✅ │ │ OBS overlays + │
│ │ │ │ │ on-machine actions│
└─────────┘ └────────────────┘ └───────────────────┘
EngelOS follows an open-core model, the same spirit as Netdata: a free community edition you self-host, and a paid cloud edition for people who want it managed.
| Community (self-hosted) | Cloud (planned, Phase 2+) | |
|---|---|---|
| Price | Free forever | Flat monthly price |
| Hosting | Your machine, your data | Managed for you |
| Setup | Build and run the binary | One-click, no server to run |
| Features | The full bot, dashboard, moderation, commands, economy and games | Everything in Community, plus cloud-only conveniences and AI-backed features |
| Best for | Anyone who wants full control | People who are serious about it and would rather not run their own server |
The Community edition is the real product, not a teaser: nothing in this repository is paywalled, and nothing here will ever be moved behind the Cloud tier. The Cloud edition exists to fund the open-source work, not to cripple the free one.
✅ Built and live (Phase 1 alpha):
$(...) variable system, quotes, counters, timers!gamble !slots !duel !heist)!prediction / !lockprediction / !endprediction)!8ball !so !accountage !followage, and more)🚧 Planned (roadmap):
See docs/MASTER-VISION.md for the full multi-year roadmap.
cmd/engelos/ Daemon entry point + wiring
internal/
adapters/ Platform interfaces + twitch/, discord/, mock/
api/ chi router, handlers, middleware, WebSocket hub
auth/ Users, sessions, RBAC, API keys, Argon2id
automod/ Stateless filter engine
automodstate/ Escalation ladder + audit-log store
moderation/ Glue: filters + escalation + audit into one Service
commands/ builtins, custom commands, $(...) vars, games, giveaways, predictions,
song requests, moments
counters/ quotes/ timers/ customcommands/ redemptions/ loyalty/ rewards/ liveops/
songrequests/ provider config + spotify/ + youtube/ + queue/ (bot-managed queue)
wrapped/ moments/ Stream Wrapped stats + Moment Alerts
eventsourcing/ SQLite append-only event log
features/pity/ streak/ Engagement systems
runtime/ Dispatcher: adapter events into features + broadcast
server/ web/ HTTP lifecycle + go:embed of the SvelteKit build
pkg/sdk/ Public SDK (Apache-2.0) for third-party plugins
web/ Svelte 5 frontend (local + cloud variants)
docs/ MASTER-VISION.md and long-form docs
EngelOS is built in the open by one person, and a star is the simplest way to help. It isn't vanity:
If you self-host it, plan to, or just like where it's heading, drop a ⭐ on the repo. Watch the repo to follow releases, and open an issue with ideas or bugs. That's the whole ask, and it genuinely matters at this stage.
Not accepting external contributions yet: the codebase moves too fast and the public APIs aren't
stable. Once Phase 1 ships and the OSS launch happens (December 2026), contribution guidelines will
land in CONTRIBUTING.md. Stars and issues are very welcome in the meantime.
LICENSEpkg/sdk/): Apache-2.0, see pkg/sdk/LICENSEThe dual license follows the Grafana model: the core is protected from cloud reselling (AGPL), while the SDK stays permissive (Apache) so anyone can build integrations against it without AGPL obligations.
EngelOS, built in the open, the successor to EngelGuard.
If you made it this far, a ⭐ would mean a lot. Thanks for reading.