ClassicOldSong/Apollo
Sunshine fork - The easiest way to stream with the native resolution of your client device
Mixed signals — read the receipts
worst of 4 axescopyleft license (GPL-3.0) — review compatibility; no CI workflows detected
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 5w ago
- ✓20 active contributors
- ✓Distributed ownership (top contributor 26% of recent commits)
Show 4 more →Show less
- ✓GPL-3.0 licensed
- ✓Tests present
- ⚠GPL-3.0 is copyleft — check downstream compatibility
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/classicoldsong/apollo)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/classicoldsong/apollo on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: ClassicOldSong/Apollo
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/ClassicOldSong/Apollo shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Mixed signals — read the receipts
- Last commit 5w ago
- 20 active contributors
- Distributed ownership (top contributor 26% of recent commits)
- GPL-3.0 licensed
- Tests present
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
- ⚠ No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live ClassicOldSong/Apollo
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/ClassicOldSong/Apollo.
What it runs against: a local clone of ClassicOldSong/Apollo — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in ClassicOldSong/Apollo | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 64 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of ClassicOldSong/Apollo. If you don't
# have one yet, run these first:
#
# git clone https://github.com/ClassicOldSong/Apollo.git
# cd Apollo
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of ClassicOldSong/Apollo and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "ClassicOldSong/Apollo(\\.git)?\\b" \\
&& ok "origin remote is ClassicOldSong/Apollo" \\
|| miss "origin remote is not ClassicOldSong/Apollo (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "CMakeLists.txt" \\
&& ok "CMakeLists.txt" \\
|| miss "missing critical file: CMakeLists.txt"
test -f "package.json" \\
&& ok "package.json" \\
|| miss "missing critical file: package.json"
test -f "cmake/prep/options.cmake" \\
&& ok "cmake/prep/options.cmake" \\
|| miss "missing critical file: cmake/prep/options.cmake"
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f ".github/copilot-instructions.md" \\
&& ok ".github/copilot-instructions.md" \\
|| miss "missing critical file: .github/copilot-instructions.md"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 64 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~34d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/ClassicOldSong/Apollo"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Apollo is a self-hosted desktop streaming server (fork of Sunshine) that streams the native resolution of client devices, with automatic virtual display creation matching client resolution/framerate. It supports hardware encoding via AMD/Intel/Nvidia GPUs plus software fallback, and provides a Vue.js web UI for client pairing, permission management, and clipboard sync across LAN or cloud. Monorepo structure: C++ streaming engine in src/ with GPU encoding modules, cmake/ contains platform-specific CMake modules and dependency management, web/ contains Vue 3 SPA (package.json driven by Vite), .github/ has CI matchers for GCC/Docker/COPR. Docker support via Dockerfile enables containerized deployment.
👥Who it's for
Gamers and power users who want low-latency remote desktop/game streaming to Artemis (Moonlight Noir) Android clients; system administrators setting up cloud gaming infrastructure; developers contributing to self-hosted streaming solutions.
🌱Maturity & risk
Actively maintained fork of LizardByte's Sunshine with significant C++ codebase (1.8M LOC). CI/CD present (.github/matchers for automated testing), Docker support, CMake-based build system. Virtual Display (SudoVDA) is Windows-only with Linux planned. Production-ready for Windows deployments; Linux support still in development.
Single-maintainer fork (ClassicOldSong) of larger Sunshine project introduces divergence risk. Heavy C++ dependency on GPU drivers (AMD/Intel/Nvidia) and platform-specific code (separate cmake/compile_definitions for Linux/macOS/Windows/Unix). Virtual Display feature tightly coupled to Windows; Linux implementation incomplete. CMake dependency chain (FindLibva, FindWayland, FindUdev) adds platform detection complexity.
Active areas of work
Recent focus on virtual display improvements with SudoVDA integration, permission system refinement (documented in Wiki), and web UI enhancements via Vue 3/Vite stack. CMake build infrastructure actively maintained across 5 platforms (Windows, macOS, Linux, Unix variants). .readthedocs.yaml present indicates documentation pipeline active.
🚀Get running
git clone https://github.com/ClassicOldSong/Apollo.git
cd Apollo
mkdir build && cd build
cmake ..
cmake --build . --config Release
For web UI development: cd web && npm install && npm run dev
Daily commands:
Build: cmake --build build --config Release. Server: ./build/sunshine (or Docker: docker build -f Dockerfile .). Web UI dev: cd web && npm run dev (Vite dev server on :5173). Production web: npm run build outputs dist/.
🗺️Map of the codebase
CMakeLists.txt— Root build configuration that orchestrates the entire C++ compilation pipeline for Apollo streaming server—essential for understanding dependencies and platform-specific builds.package.json— Web UI build configuration defining Vue 3, Vite, and i18n dependencies—all contributors need to understand the frontend stack and how to run dev/build workflows.cmake/prep/options.cmake— Central feature flag and configuration options that control platform support (Windows Virtual Display, GPU encoding variants)—critical for understanding conditional compilation.README.md— Project overview clarifying Apollo as a Sunshine fork with native resolution streaming and Virtual Display HDR support—required context for all contributors..github/copilot-instructions.md— Development guidelines and coding standards specific to this fork—ensures consistency in contributions across the C++ backend and Vue frontend.cmake/dependencies/common.cmake— Shared dependency resolution (Boost, nlohmann_json, libevdev) across all platforms—understanding this prevents build breakage on dependency updates.docs/building.md— Comprehensive build instructions for multiple OS/GPU combinations—developers must follow these exact patterns for reproducible contributions.
🛠️How to make changes
Add Support for a New GPU Encoder
- Add encoder detection and initialization code in the platform-specific target (
cmake/targets/windows.cmake (or linux.cmake for Linux)) - Define new CMake options for the encoder in the options file (
cmake/prep/options.cmake) - Add encoder-specific dependencies to the appropriate dependency file (
cmake/dependencies/windows.cmake (or linux.cmake)) - Update configuration documentation with encoder selection guidance (
docs/configuration.md) - Add build instructions for the new encoder variant (
docs/building.md)
Add a New Web UI Configuration Section
- Define API endpoint in the REST API specification (
docs/api.md) - Create Vue component in the web UI source tree (inferred: src/components/) (
package.json (add any new dependencies if needed)) - Add i18n translation keys to locale files (inferred: src/locales/) (
docs/configuration.md (update configuration documentation)) - Update the API documentation example if applicable (
docs/app_examples.md)
Add Platform-Specific Build Support
- Create platform-specific CMake files in cmake/targets/ and cmake/dependencies/ (
cmake/targets/[platform].cmake) - Add platform detection and compile definitions (
cmake/compile_definitions/[platform].cmake) - Define packaging strategy for the new platform (
cmake/packaging/[platform].cmake) - Add build instructions with platform-specific steps and GPU variants (
docs/building.md) - Create Docker container template for CI/build validation (
docker/[os-version].dockerfile)
Configure New Deployment Environment
- Define packaging format and installer type (
cmake/packaging/common.cmake) - Create Docker image or installer template if needed (
docker/ or cmake/packaging/[format].cmake) - Update documentation with deployment steps (
docs/getting_started.md) - Add CI matcher for build output parsing if using new toolchain (
.github/matchers/[toolchain].json)
🔧Why these technologies
- CMake — Multi-platform C++ build system enabling conditional compilation for Windows (Virtual Display), Linux, and macOS with platform-specific GPU encoder support (NVIDIA NVENC, AMD VCE, Intel QSV).
- Vue 3 + Vite — Modern reactive web UI for configuration, client pairing, and permission management—fast hot-reload development and optimized production builds with tree-shaking.
- vue-i18n — Enables multi-language support for the web interface, allowing pairing and configuration from any locale.
- LizardByte Shared Web Components — Reusable UI components and design patterns shared across LizardByte projects (Sunshine, Artemis) for consistent branding and functionality.
⚖️Trade-offs already made
-
Virtual Display support Windows-only (Linux planned)
- Why: Windows APIs (WDDM, virtual display driver) are mature; Linux/Wayland virtual display implementation is complex and still in development.
- Consequence: Apollo offers native client resolution only on Windows; Linux users currently limited to fixed display modes until Virtual Display is ported.
-
Multiple GPU encoder backends at compile-time
- Why: Each GPU vendor (NVIDIA, AMD, Intel) has proprietary APIs (NVENC, VCE, Quick Sync); runtime selection adds complexity.
- Consequence: Build artifacts are encoder-specific; users must choose the correct binary for their GPU or rebuild from source.
-
Self-hosted vs. cloud-only model
- Why: Apollo is designed for local network streaming and on-premises servers to minimize latency and avoid cloud costs.
- Consequence: No built-in cloud relay or peer-to-peer fallback; remote access requires manual VPN/port-forwarding setup.
-
Permission system at pairing level
- Why: Lightweight approach: clients are granted or denied input/clipboard access at connection time rather than fine-grained per-app rules.
- Consequence: Simple to implement and audit, but coarse-grained; cannot restrict specific apps on the client without external scripting.
🚫Non-goals (don't propose these)
- Does not support cloud-based relay or matchmaking—purely on-premises streaming.
- Does not include hardware video capture cards—assumes direct GPU access on the server.
- Does not implement client-side applications (only server)—Artemis/Moonlight clients are separate projects.
- Does not provide real-time latency measurement UI—optimization is left to manual perf-tuning per docs.
- Does not support virtual audio input passthrough—clipboard and keyboard/mouse only.
- Does not offer fine-grained per-application permission control—binary allow/deny at connection time.
🪤Traps & gotchas
GPU detection complexity: CMAKE finds GPU libs (CUDA, Libva, NVENC) at build time—missing drivers = disabled encoding without loud errors. Virtual Display Windows-only: SudoVDA integration hardcoded for Windows; Linux shim planned but not finished (check src/platform/linux/virtual_display.cpp). Permission inheritance: First paired client gets FULL perms; subsequent clients default to minimal—easy to miss in .github/CONTRIBUTING.md docs. CMake version: Requires CMake 3.16+ for modern syntax; older systems fail silently. I18n vue-i18n: Web UI expects locales/ structure from LizardByte/shared-web; missing translations fallback to hardcoded strings.
🏗️Architecture
💡Concepts to learn
- Hardware Video Encoding (NVENC/QSV/VCE) — Apollo's core feature—GPU-accelerated encoding for low-latency streaming requires understanding GPU codec capabilities, bitrate control, and fallback to software encoding
- Virtual Display Driver (SudoVDA) — Windows virtual display auto-creation matching client resolution is Apollo's key differentiator; understanding PnP monitor identity assignment and driver stability is critical for this feature
- Permission Model (Role-Based Access Control) — Apollo's permission system assigns per-client granular capabilities (View Streams, Launch Apps, Mouse Input, Keyboard Input); understanding the inheritance chain (first client=FULL, others=minimal) is essential for admin workflows
- Platform-Specific CMake Modules — Apollo's cross-platform build depends on custom FindLibva.cmake, FindWayland.cmake, FindSystemd.cmake for Linux GPU detection; understanding CMake module authoring is critical for porting to new platforms
- Clipboard Synchronization (Network Protocol) — Apollo syncs clipboard between host and clients over network; understanding serialization, race conditions (copy on client vs host), and protocol framing is required for clipboard feature work
- Resolution Negotiation Protocol — Apollo auto-creates virtual displays matching client resolution/framerate; understanding client capability advertisement and adaptive bitrate encoding for mismatched resolutions is key to this feature
- Vue 3 Composition API + Vite — Web UI uses modern Vue 3 (not Options API) and Vite for bundling; understanding reactivity, lifecycle hooks, and Vite's dev/prod modes is required for web UI contributions
🔗Related repos
LizardByte/Sunshine— Upstream project that Apollo forks; reference implementation for streaming encoder abstraction and permission system baselineClassicOldSong/moonlight-android— Artemis (Moonlight Noir) Android client that Apollo streams to; defines codec/input protocol expectationsmoonlight-stream/moonlight-qt— Cross-platform Moonlight client reference; shares streaming protocol with Artemis, useful for protocol understandingLizardByte/docs— Read the Docs documentation hosted via .readthedocs.yaml; contains setup guides and GPU encoding references Apollo relies onkeylase/ALVR— Alternative VR streaming solution; similar H.264/HEVC encoding pipeline and virtual display challenges (comparison point for architecture decisions)
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add GitHub Actions workflow for web UI (Node.js) CI/CD
The repo has a complete Node.js web UI setup (package.json with Vite, Vue 3, and dev dependencies) but no GitHub Actions workflow visible in .github directory. There are matcher files for Docker, GCC, and COPR CI, but no workflow for linting, testing, or building the web frontend. This is a critical gap for catching regressions in the Vue/Vite build pipeline.
- [ ] Create .github/workflows/web-ui-ci.yml workflow file
- [ ] Add npm run build and npm run dev validation steps
- [ ] Integrate existing .flake8 and .prettierrc.json linting (Prettier for JS/TS, Flake8 for Python if applicable)
- [ ] Add Codecov plugin integration (already in devDependencies: @codecov/vite-plugin) to the workflow
- [ ] Test workflow triggers on PR and push to main/develop branches
Complete the truncated README.md and add feature documentation for Virtual Display HDR
The README.md is incomplete (ends mid-sentence with 'Currently Virtual Di...'). The repo advertises 'Built-in Virtual Display with HDR support' as a major feature but provides no documentation on how to configure or use it. This is a blocker for new users and contributors understanding the project's core differentiator.
- [ ] Complete the truncated section in README.md
- [ ] Add 'Virtual Display Configuration' section documenting HDR setup, resolution/framerate matching logic, and client requirements
- [ ] Reference or cross-link to the Auto pause/resume games wiki (already mentioned) and any Virtual Display-specific docs
- [ ] Update the 'Currently under development' sections if applicable
- [ ] Verify links to Read the Docs documentation are accurate and up-to-date
Add CMake test target and unit test scaffolding for core C++ modules
The CMakeLists.txt and cmake/targets files suggest a complex multi-platform C++ codebase, but there's no visible test directory or CMake test configuration (no ctest targets visible in cmake/targets/). Given the project handles hardware encoding (GPU, AMD/Intel/Nvidia), input management, and clipboard sync, unit tests are critical for stability.
- [ ] Create tests/ directory structure with platform-specific subdirs (e.g., tests/common, tests/linux, tests/windows)
- [ ] Add enable_testing() and basic GoogleTest/Catch2 integration to CMakeLists.txt
- [ ] Create cmake/targets/tests.cmake to define test targets for each platform
- [ ] Add initial test scaffolding for at least one core module (e.g., input handling, encoding control, or clipboard sync)
- [ ] Update codecov.yml to include C++ coverage from the new test suite
🌿Good first issues
- Add unit tests for src/streaming/session_permission.* permission system logic—permission matrix edge cases (elevation, cross-client conflicts) lack test coverage: medium: Permission system is critical per README but has no visible test suite in file list
- Document Linux virtual display roadmap in .github/CONTRIBUTING.md—current docs only mention Windows SudoVDA and 'Linux planned': low: Virtual display is major differentiator but Linux implementation status unclear; users blocked without guidance
- Add cmake/compile_definitions/linux.cmake test for missing Libva/Wayland/DRM libraries—provide helpful error messages instead of silent feature disables: medium: GPU encoding on Linux depends on optional libs (Libva, DRM) that silently disable if missing; users get no feedback on why NVENC/QSV don't work
- Expand web/ e2e tests for permission UI changes—web/src/ has no visible test directory for Vue components that display/modify client permissions: medium: Web UI is primary admin surface but lacks test coverage for permission grant/revoke flows
⭐Top contributors
Click to expand
Top contributors
- @dependabot[bot] — 26 commits
- @ReenigneArcher — 23 commits
- @ClassicOldSong — 22 commits
- @LizardByte-bot — 7 commits
- @Kishi85 — 4 commits
📝Recent commits
Click to expand
Recent commits
dd99a82— Merge pull request #1289 from LTe/boost-hash-mismatch (ClassicOldSong)c473479— Merge pull request #1404 from zg404/master (ClassicOldSong)3844a8c— Merge pull request #1438 from k4idyn/feature/psp-compatibility (ClassicOldSong)c71ea0a— fix(video): enabled profile and coder options for AMD AMF encoder (ertkaidyn-ai)41bacbd— Merge pull request #1435 from ryancatlin/fix/vaapi-amd-rate-control (ClassicOldSong)2aa5a39— fix(vaapi): enable rate control buffer and explicit rc_mode for VAAPI encoders (ryancatlin)003393e— Merge pull request #1430 from ryancatlin/fix/wayland-frame-timestamps (ClassicOldSong)52000d0— fix(wayland): set frame timestamps for wlgrab captures (ryancatlin)792fceb— Update device resolution recommendation for Pixel in README (zg404)37d3042— Update Boost 1.89.0 hash (LTe)
🔒Security observations
Failed to generate security analysis.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.