📚 Complete guides for Stream Daemon - multi-platform stream announcement automation
Welcome to the Stream Daemon documentation! This directory contains comprehensive guides for setting up, configuring, and using Stream Daemon.
New to Stream Daemon? Start here:
- Quickstart Guide - Get up and running in 10 minutes
- Installation Guide - Detailed installation for all platforms (Python, Docker, systemd, cloud)
Configure Stream Daemon to monitor your live streams:
- Twitch - OAuth 2.0 setup, client ID/secret, rate limits, troubleshooting
- YouTube Live - API key, channel ID resolution, quota management
- Kick - OAuth authentication, 2FA requirements, public API fallback
Configure where Stream Daemon posts your announcements:
- Mastodon - Instance setup, access tokens, app creation, custom instances
- Bluesky - App passwords, handle configuration, AT Protocol
- Discord - Webhooks, rich embeds, role mentions, live updates, stream ended messages
- Matrix - Bot creation, room setup, authentication methods (token/password)
- Secrets Wizard 🪄 NEW! - Interactive setup tool
- Step-by-step credential configuration
- Supports Doppler, AWS, Vault, and .env files
- Loads existing values as defaults
- Platform-specific guidance with credential links
- Secrets Management ⭐ RECOMMENDED - Secure your credentials
- Doppler setup (free, 10-minute setup, recommended)
- AWS Secrets Manager (for AWS-heavy infrastructure)
- HashiCorp Vault (for enterprise/self-hosted)
- Priority system and best practices
- Docker integration
Enhance your stream announcements with powerful features:
-
AI-Powered Messages 🤖 - Local or cloud AI generation
- Ollama (local, private, free) or Google Gemini (cloud, easy setup)
- Generate unique announcements for every stream
- Platform-aware character limits
- Automatic fallback to static messages
- See Ollama Migration Guide to switch providers
-
LLM Model Recommendations 🎯 NEW! - Choose the right model for your GPU
- VRAM-based recommendations (4GB to 24GB+)
- Qwen 2.5, Gemma 3, LLaMA 3.1, Mistral comparisons
- Optimized settings per model size
- Multi-GPU setup guidance
-
Qwen3 Thinking Mode 🧠 EXPERIMENTAL - Support for Qwen3's reasoning models
- Extract responses from Qwen3's "thinking" field
- Automatic token limit adjustment
- Pattern-based content extraction
-
Custom Messages - Personalize announcements
- Platform-specific templates (Twitch, YouTube, Kick)
- Variables:
{url},{title},{game},{viewers} - INI-style configuration
- Migration from old format
-
Multi-Platform Streaming - Stream to multiple platforms simultaneously
- Threading modes: separate, thread, combined
- "Stream ended" strategies
- Handle platform failures gracefully
- Examples and scenarios
-
Multiple Streams Per Platform 🆕 NEW! - Monitor multiple streamers per platform
- Track 3-5 streamers per platform
- Comma-separated username lists
- Independent state tracking for each stream
- 100% backward compatible
Upgrading from an older version?
- v1 to v2 Migration - Breaking changes, new features, configuration updates
Streaming Platforms:
- Twitch - Most popular streaming platform
- YouTube Live - Google's streaming service
- Kick - New competitor to Twitch
Social Media:
- Mastodon - Federated microblogging
- Bluesky - Decentralized social network
- Discord - Chat and community platform
- Matrix - Decentralized messaging
- Install Stream Daemon - Choose Python, Docker, or cloud deployment
- Get API Credentials - Follow platform-specific guides
- Configure Secrets - Use Doppler for secure credential storage (recommended)
- Test Setup - Verify everything works
- Customize Messages - Make announcements your own
- Set up AI Messages - Use Gemini for dynamic announcements
- Multi-Platform Streaming - Configure for simultaneous streaming
- Discord Live Updates - Real-time viewer counts
- Production Deployment - Systemd service, Docker, cloud
| File | Purpose | Required |
|---|---|---|
.env |
Main configuration and credentials | ✅ Yes |
messages.txt |
Live stream announcement templates | |
end_messages.txt |
Stream ended announcement templates | |
docker-compose.yml |
Docker deployment configuration | Only for Docker |
Essential:
# Enable platforms
TWITCH_ENABLE=True
MASTODON_ENABLE=True
# Platform credentials (or use secrets manager)
TWITCH_CLIENT_ID=xxx
MASTODON_ACCESS_TOKEN=yyy
# Check intervals
SETTINGS_CHECK_INTERVAL=5 # Minutes when offline
SETTINGS_POST_INTERVAL=5 # Minutes when liveSecrets Management (Recommended):
SECRETS_MANAGER=doppler
DOPPLER_TOKEN=dp.st.dev.xxx
SECRETS_DOPPLER_TWITCH_SECRET_NAME=TWITCHSee Secrets Management Guide for complete setup.
# Run Stream Daemon
python3 stream-daemon.py
# Run with Doppler
doppler run -- python3 stream-daemon.py
# Run in Docker
docker-compose up -d
# Test configuration
pytest tests/test_platform_validation.py -v
# Test specific platform
pytest tests/test_platform_validation.py::TestTwitchValidation -v
# View logs (systemd)
sudo journalctl -u stream-daemon -f
# View logs (Docker)
docker-compose logs -f stream-daemonStream not detected:
- Verify username is correct (case-sensitive)
- Check API credentials are valid
- Ensure platform is enabled (
TWITCH_ENABLE=True) - Lower check interval for faster detection
Announcements not posting:
- Test social platform authentication
- Verify webhooks/tokens are correct
- Check platform is enabled
- Review logs for errors
Doppler secrets not working:
- Verify token is correct (
dp.st.dev.xxx) - Check secret names match configured prefix
- Ensure environment matches token (dev token = dev secrets)
- Comment out credentials in
.env(they override Doppler)
See: Quickstart Troubleshooting for detailed solutions.
Stream Daemon uses a modular architecture:
stream_daemon/
├── platforms/
│ ├── streaming/ # Monitor live streams
│ │ ├── twitch.py
│ │ ├── youtube.py
│ │ └── kick.py
│ └── social/ # Post announcements
│ ├── mastodon.py
│ ├── bluesky.py
│ ├── discord.py
│ └── matrix.py
├── secrets/ # Secrets management
│ ├── doppler.py
│ ├── aws.py
│ └── vault.py
└── utils/
├── ai_messages.py # Gemini LLM integration
└── message_parser.py # Template variables
Flow:
- Daemon checks streaming platforms every
CHECK_INTERVAL - Detects state changes (offline→live or live→offline)
- Generates message (AI or template)
- Posts to all enabled social platforms
- Continues monitoring for stream end
- Twitch Developer Docs - Twitch API reference
- YouTube Data API - YouTube API documentation
- Mastodon API - Mastodon API reference
- Bluesky API - AT Protocol documentation
- Discord Webhooks - Discord webhook guide
- Matrix Client-Server API - Matrix API spec
- Doppler Documentation - Doppler setup and CLI
- AWS Secrets Manager - AWS secrets guide
- HashiCorp Vault - Vault documentation
- Google AI Studio - Get Gemini API key
- Gemini API Docs - Gemini API reference
Want to improve Stream Daemon or its documentation?
-
Documentation improvements:
- Fix typos or unclear sections
- Add examples or troubleshooting tips
- Translate guides to other languages
-
Code contributions:
- Add new platform integrations
- Improve existing features
- Fix bugs
-
Community support:
- Answer questions in Discussions
- Share your Stream Daemon setup
- Report bugs and suggest features
See Development Setup to get started.
- 📖 Search this documentation - Most answers are here!
- 🔍 Search existing issues - Your question may be answered
- 💬 GitHub Discussions - Ask questions, share setups
- 🐛 GitHub Issues - Report bugs, request features
Include this information for faster help:
- Stream Daemon version - Check
stream-daemon.pyheader - Python version - Run
python3 --version - OS and platform - e.g., "Ubuntu 22.04", "macOS 13", "Docker"
- Configuration - Enabled platforms (no credentials!)
- Error messages - Full error output (secrets are auto-masked)
- What you tried - Steps to reproduce the issue
Example:
**Version:** Stream Daemon v2.0.0
**Python:** 3.11.4
**OS:** Ubuntu 22.04 LTS
**Platforms:** Twitch + YouTube → Mastodon + Discord
**Secrets:** Doppler (dev environment)
**Error:**
ERROR: Failed to post to Mastodon: 401 Unauthorized
**Steps:**
1. Configured Mastodon with access token from instance settings
2. Token visible in Doppler dashboard
3. Test script succeeds, but daemon fails
If Stream Daemon helps you grow your streaming presence:
- ⭐ Star the repository - Help others discover it!
- 📢 Share with streamers - Spread the word on social media
- 💝 Donate - Support ongoing development
- 🔧 Contribute - Submit pull requests and improvements
Made with ❤️ by ChiefGyk3D
Stream Daemon - Automate your multi-platform streaming presence