{"id":42893867,"url":"https://github.com/splitux-gg/splitux","last_synced_at":"2026-07-02T09:01:13.814Z","repository":{"id":334322670,"uuid":"1104751829","full_name":"splitux-gg/splitux","owner":"splitux-gg","description":"Local co-op split-screen launcher for Linux","archived":false,"fork":false,"pushed_at":"2026-06-28T11:25:23.000Z","size":66096,"stargazers_count":1,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-28T13:22:52.356Z","etag":null,"topics":["linux-gaming","split-screen","splitux"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/splitux-gg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"COPYING.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"patreon":"splitux","ko_fi":"splitux"}},"created_at":"2025-11-26T16:30:38.000Z","updated_at":"2026-06-22T12:29:22.000Z","dependencies_parsed_at":null,"dependency_job_id":"f28d0492-b1e1-4e59-8213-93aa65ed4d71","html_url":"https://github.com/splitux-gg/splitux","commit_stats":null,"previous_names":["splitux-gg/splitux"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/splitux-gg/splitux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitux-gg%2Fsplitux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitux-gg%2Fsplitux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitux-gg%2Fsplitux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitux-gg%2Fsplitux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/splitux-gg","download_url":"https://codeload.github.com/splitux-gg/splitux/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/splitux-gg%2Fsplitux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35040024,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["linux-gaming","split-screen","splitux"],"created_at":"2026-01-30T15:02:34.360Z","updated_at":"2026-07-02T09:01:13.774Z","avatar_url":"https://github.com/splitux-gg.png","language":"Rust","funding_links":["https://patreon.com/splitux","https://ko-fi.com/splitux"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"assets/logo.png\" width=\"300\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003cem\u003eThey killed splitscreen. We brought it back.\u003c/em\u003e\u003c/p\u003e\n\n---\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\".github/assets/launcher.png\" width=\"80%\" /\u003e\n    \u003cbr\u003e\n    \u003cem\u003eSplitux Launcher - Game selection and configuration\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\".github/assets/riftbreaker-splitscreen.png\" width=\"80%\" /\u003e\n    \u003cbr\u003e\n    \u003cem\u003eThe Riftbreaker - Co-op base defense on an alien planet\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\".github/assets/gameplay1.png\" width=\"80%\" /\u003e\n    \u003cbr\u003e\n    \u003cem\u003eAstroneer - Co-op base building on an alien planet\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\".github/assets/ato-splitscreen.png\" width=\"80%\" /\u003e\n    \u003cbr\u003e\n    \u003cem\u003eAcross The Obelisk - Two players in the same multiplayer lobby\u003c/em\u003e\n\u003c/p\u003e\n\n## Features\n\n- **Split-screen multiplayer** - Run multiple game instances with automatic window tiling\n- **Remote play (splitux-together)** - Stream instances to friends' browsers over WebRTC; they play a seat from anywhere\n- **Controller isolation** - Each instance only sees its assigned controllers\n- **Keyboard \u0026 mouse support** - Per-instance input isolation via custom Gamescope fork\n- **Steam artwork integration** - Automatically fetches game icons and banners from your local Steam library\n- **Steam \u0026 Epic LAN emulation** - Play online-only games locally via the Goldberg (Steam) and EOS LAN (Epic Online Services) emulators\n- **Proton support** - Run Windows games through Proton/UMU Launcher\n- **Per-player profiles** - Separate saves, settings, and Steam identities per player\n- **Headless CLI** - Discover and launch sessions from a script or over SSH, no GUI\n- **niri, Hyprland \u0026 KDE Plasma** - Native window manager integration\n\n## How It Works\n\nSplitux launches each game instance inside its own containerized environment:\n\n```\n┌────────────────────────────────────────────────────────────┐\n│ Splitux                                                    │\n│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐   │\n│ │ Gamescope      │ │ Gamescope      │ │ Gamescope      │   │\n│ │ ┌────────────┐ │ │ ┌────────────┐ │ │ ┌────────────┐ │   │\n│ │ │ Bubblewrap │ │ │ │ Bubblewrap │ │ │ │ Bubblewrap │ │   │\n│ │ │ ┌────────┐ │ │ │ │ ┌────────┐ │ │ │ │ ┌────────┐ │ │   │\n│ │ │ │  Game  │ │ │ │ │ │  Game  │ │ │ │ │ │  Game  │ │ │   │\n│ │ │ └────────┘ │ │ │ │ └────────┘ │ │ │ │ └────────┘ │ │   │\n│ │ └────────────┘ │ │ └────────────┘ │ │ └────────────┘ │   │\n│ │ Player 1       │ │ Player 2       │ │ Player 3       │   │\n│ └────────────────┘ └────────────────┘ └────────────────┘   │\n└────────────────────────────────────────────────────────────┘\n```\n\nEach instance runs in:\n- **Gamescope** - Nested Wayland compositor that contains the game window and handles input\n- **Bubblewrap** - Lightweight sandbox that masks input devices and mounts profile-specific directories\n- **Overlay filesystem** - Injects multiplayer DLLs and per-player configurations\n\n## Supported Backends\n\n| Backend | Use Case |\n|---------|----------|\n| **Goldberg** | Steam P2P games - emulates Steam networking (gbe_fork) for LAN play |\n| **EOS** | Epic Online Services co-op - LAN-emulates Epic sessions/presence/P2P (UE games, Satisfactory, Palworld, V Rising) |\n| **Photon** | Unity Photon games - injects LocalMultiplayer mod via BepInEx |\n| **Facepunch** | Unity games using Facepunch.Steamworks - spoofs Steam identity via BepInEx |\n| **Standalone** | Games whose own community mods handle multiplayer - installs BepInEx + Thunderstore plugins |\n| **None** | Games with native LAN support or single-player |\n\nBackends are auto-detected by the presence of their config block. Multiple backends can coexist (e.g., **EOS + Goldberg**, where EOS carries co-op and Goldberg is the Steam-ownership boot shim).\n\nSee **[docs/HANDLER_OPTIONS.md](docs/HANDLER_OPTIONS.md)** for every backend's tuning knobs (including the full `EOSLAN_*` emulator environment).\n\n## Installation\n\n### Requirements\n\n- **Window Manager**: niri, Hyprland, or KDE Plasma\n- **Dependencies**: Gamescope, Bubblewrap, fuse-overlayfs, SDL2\n- **For remote play (splitux-together)**: PipeWire (instance capture) and a working hardware/software H.264 encoder\n\n### GitHub Releases\n\nAll builds are available on the [Releases](https://github.com/splitux-gg/splitux/releases) page:\n\n| Release | Description | When to Use |\n|---------|-------------|-------------|\n| **Latest** | Stable tagged releases (`v1.0.0`, etc.) | Production use |\n| **Nightly** | Built daily at 4 AM UTC from `main` | Latest features, may be unstable |\n\nAvailable formats:\n- `.AppImage` - Portable, no installation required\n- `.flatpak` - Sandboxed with automatic dependencies\n- `.tar.gz` / `.zip` - Native installation\n\n### AppImage (Recommended)\n\nThe easiest way to run Splitux. No installation required.\n\n```bash\n# Download latest stable\ncurl -LO https://github.com/splitux-gg/splitux/releases/latest/download/Splitux-x86_64.AppImage\n\n# Or download nightly (latest features, may be unstable)\ncurl -LO https://github.com/splitux-gg/splitux/releases/download/nightly/Splitux-nightly-x86_64.AppImage\n\n# Make executable and run\nchmod +x Splitux-*.AppImage\n./Splitux-*.AppImage\n```\n\n**Add to app launcher:**\n```bash\n# Move to a permanent location\nmkdir -p ~/.local/bin\nmv Splitux-*.AppImage ~/.local/bin/Splitux.AppImage\n\n# Create desktop entry\ncat \u003e ~/.local/share/applications/splitux.desktop \u003c\u003c 'EOF'\n[Desktop Entry]\nName=Splitux\nComment=Local co-op split-screen gaming for Linux\nExec=$HOME/.local/bin/Splitux.AppImage\nIcon=splitux\nTerminal=false\nType=Application\nCategories=Game;\nEOF\n```\n\n### Flatpak\n\nSandboxed installation with automatic dependency management.\n\n```bash\n# Download latest stable\ncurl -LO https://github.com/splitux-gg/splitux/releases/latest/download/Splitux.flatpak\n\n# Or download nightly\ncurl -LO https://github.com/splitux-gg/splitux/releases/download/nightly/Splitux-nightly.flatpak\n\n# Install\nflatpak install --user Splitux*.flatpak\n\n# Run\nflatpak run gg.splitux.Splitux\n```\n\nFlatpak automatically adds Splitux to your app launcher after installation.\n\n### Tarball (Native)\n\nTraditional installation for maximum performance.\n\n```bash\n# Download and extract\ncurl -LO https://github.com/splitux-gg/splitux/releases/latest/download/splitux-linux-x86_64.tar.gz\ntar -xzf splitux-linux-x86_64.tar.gz\ncd splitux\n\n# Run directly\n./splitux\n\n# Or install to ~/.local (adds to app launcher)\n./install.sh\n```\n\n**Note:** The tarball requires these dependencies to be installed on your system:\n- `gamescope` or use the bundled `gamescope-splitux` in `bin/`\n- `bubblewrap`\n- `fuse-overlayfs`\n- `SDL2`\n\n### Building from Source\n\nRequires Rust 1.85+ (for edition 2024), meson, and ninja.\n\n```bash\ngit clone --recurse-submodules https://github.com/splitux-gg/splitux.git\ncd splitux\ncargo build --release\n```\n\nThe binary will be at `target/release/splitux`. Bundled dependencies live in `assets/`; at runtime splitux looks for them under a system install (`/usr/share/splitux`), a user install (`~/.local/share/splitux`), and finally `assets/` next to the binary.\n\n## Configuration\n\nSettings are stored in `~/.local/share/splitux/`:\n\n```\nsplitux/\n├── handlers/           # Game configurations (handler.yaml + assets)\n├── profiles/           # Per-player save data and settings\n├── prefixes/           # Wine prefixes for Windows games\n└── settings.json       # Global configuration\n```\n\n### Handler Format\n\nGames are configured via YAML handlers using nested backend blocks. A handler\nneeds three fields plus a way to find the game, then one backend block:\n\n```yaml\nname: Game Name\nexec: game.exe\nspec_ver: 3\nsteam_appid: 12345\n\n# Goldberg backend (auto-detected by the block being present)\ngoldberg:\n  settings:\n    force_lobby_type.txt: \"2\"\n    invite_all.txt: \"\"\n\n# Optional launch settings\nargs: \"-windowed\"\nenv: \"DXVK_ASYNC=1\"\nproton_path: \"Proton - Experimental\"\npause_between_starts: 5.0\n```\n\n**Backend examples:**\n\n```yaml\n# EOS (Epic Online Services co-op via the EOS LAN emu)\neos:\n  appid: \"MyGame\"\n  enable_lan: true\n  disable_online_networking: true\nenv: \"EOSLAN_LOCALHOST_MODE=1\"   # EOS emu tuning goes through env (EOSLAN_*)\n\n# Photon (Unity games with BepInEx mod)\nphoton:\n  config_path: \"AppData/LocalLow/Company/Game/config.cfg\"\n  shared_files:\n    - \"AppData/LocalLow/Company/Game/SharedSave\"\n\n# Facepunch (Unity games using Facepunch.Steamworks)\nfacepunch:\n  spoof_identity: true\n  force_valid: true\n  photon_bypass: true\n```\n\nStart from [`assets/handler_template.yaml`](assets/handler_template.yaml) and see\n**[docs/HANDLER_OPTIONS.md](docs/HANDLER_OPTIONS.md)** for the complete field and\nemulator-tuning reference. Or browse and download community handlers from the\nin-app handler registry.\n\n\u003e Older handlers written in dot-notation (`goldberg.settings.x.txt: \"2\"`) and the\n\u003e legacy `backend:` form still load — they're expanded/migrated automatically —\n\u003e but new handlers should use nested blocks.\n\n## Window Layouts\n\nEach player count has selectable layout presets, chosen per-count in the launcher:\n\n- **2P**: Top / Bottom, Side by Side\n- **3P**: Side by Side, Stacked\n- **4P**: Grid, Rows, Columns\n- **Fullscreen (\"Independent\")**: every instance gets its own full-resolution\n  output instead of a tile — useful for multi-monitor setups and for remote\n  (splitux-together) seats.\n\nWindow placement is handled natively per WM (niri, Hyprland, KWin). Launched game\nprocesses are contained in a systemd cgroup scope tied to splitux, so a crash or\nexit cleans up every child (gamescope, Proton, wine) with it.\n\n## Remote Play (splitux-together)\n\nsplitux-together streams launched instances to friends over the internet — no\nsplitscreen required. When enabled, each instance gets a seat-streamer sidecar\nthat owns a virtual gamepad/keyboard/mouse and captures that instance's gamescope\noutput over PipeWire, H.264-encoding it to a remote browser over WebRTC.\n\nsplitux shows one invite URL per seat (`{base}/j/{token}`); hand each link to a\nfriend, who opens it in a browser and auto-joins that seat. Their input drives the\ninstance exactly like a local controller. Combine with the **Fullscreen** layout\nso each remote player gets a full-resolution stream.\n\n## Headless CLI\n\nDiscover and launch sessions without the GUI — handy over SSH or from a script. A\nplain `splitux` (no subcommand) still opens the GUI.\n\n```bash\n# List what's available\nsplitux list games\nsplitux list profiles\nsplitux list inputs\n\n# Launch a session: one --player per seat\nsplitux launch --game \"Satisfactory\" \\\n  --player profile=Gabe,input=together:gamepad \\\n  --player profile=Ruth,input=together:kbm\n```\n\n`--player` takes comma-separated `key=val`: `profile=\u003cname\u003e` (default `Guest`) and\n`input=together:gamepad|together:kbm` (remote-seat inputs). The CLI reuses the\nexact scan + launch pipeline the GUI drives.\n\n## Controls\n\nThe launcher is fully navigable with a gamepad:\n\n| Input | Action |\n|-------|--------|\n| D-Pad / Left Stick | Navigate |\n| A | Select / Confirm |\n| B | Back |\n| Y | Change Profile |\n| X | Edit Handler |\n| Start | Launch Game |\n| LB / RB | Switch Tabs |\n| Right Stick | Scroll |\n\n## License\n\nMIT License - see [LICENSE](LICENSE)\n\n## Acknowledgments\n\n- [PartyDeck](https://github.com/Seezeed7/PartyDeck) - Original inspiration for split-screen gaming on Linux\n- [Gamescope](https://github.com/ValveSoftware/gamescope) - Wayland compositor by Valve\n- [Goldberg Steam Emulator](https://github.com/Detanup01/gbe_fork) - Steam API emulation\n- [UMU Launcher](https://github.com/Open-Wine-Components/umu-launcher) - Proton launcher\n- [Nucleus Co-op](https://github.com/SplitScreen-Me/splitscreenme-nucleus) - Split-screen gaming on Windows\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplitux-gg%2Fsplitux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsplitux-gg%2Fsplitux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsplitux-gg%2Fsplitux/lists"}