{"id":46115070,"url":"https://github.com/mattias800/spela","last_synced_at":"2026-06-01T23:00:41.019Z","repository":{"id":338639245,"uuid":"1153068989","full_name":"mattias800/spela","owner":"mattias800","description":"Nu spelar vi! Self-hosted retro game emulation platform with cloud saves, multiplayer netplay, and achievements. 16 consoles, play anywhere.","archived":false,"fork":false,"pushed_at":"2026-05-28T22:04:58.000Z","size":78744,"stargazers_count":0,"open_issues_count":6,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-28T23:22:30.977Z","etag":null,"topics":["cloud-saves","docker","emulation","game-library","kotlin-multiplatform","libretro","netplay","retro-gaming","self-hosted"],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattias800.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"docs/supported-consoles.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-08T21:10:16.000Z","updated_at":"2026-05-28T22:04:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mattias800/spela","commit_stats":null,"previous_names":["mattias800/spela"],"tags_count":247,"template":false,"template_full_name":null,"purl":"pkg:github/mattias800/spela","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattias800%2Fspela","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattias800%2Fspela/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattias800%2Fspela/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattias800%2Fspela/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattias800","download_url":"https://codeload.github.com/mattias800/spela/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattias800%2Fspela/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33797128,"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-06-01T02:00:06.963Z","response_time":115,"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":["cloud-saves","docker","emulation","game-library","kotlin-multiplatform","libretro","netplay","retro-gaming","self-hosted"],"created_at":"2026-03-01T23:10:34.968Z","updated_at":"2026-06-01T23:00:41.003Z","avatar_url":"https://github.com/mattias800.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/spela-logo.png\" alt=\"Spela\" width=\"300\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\u003cem\u003eNu spelar vi!\u003c/em\u003e — Your retro game library, self-hosted. Play anywhere.\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/supported-consoles.md\"\u003e59 Consoles\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e \u0026bull;\n  \u003ca href=\"#downloads\"\u003eDownloads\u003c/a\u003e \u0026bull;\n  \u003ca href=\"docs/DEPLOY.md\"\u003eDeploy Guide\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nSpela is a self-hosted retro game emulation platform. Point it at your ROM collection, and it turns into a beautiful game library with cover art, metadata, cloud saves, multiplayer, and achievements -- accessible from any device.\n\nThink of it as your own personal Steam for retro games.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/dashboard.png\" alt=\"Dashboard with game library\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/explore.png\" alt=\"Explore page with personalized recommendations\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/games.png\" alt=\"SNES games with cover art\" width=\"355\" /\u003e\n  \u003cimg src=\"docs/screenshots/game-detail.png\" alt=\"Game detail page\" width=\"355\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/library.png\" alt=\"Console browser\" width=\"720\" /\u003e\n\u003c/p\u003e\n\n### Player App (Android)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/android-library.png\" alt=\"Android console browser\" width=\"355\" /\u003e\n  \u003cimg src=\"docs/screenshots/android-games.png\" alt=\"Android SNES game grid\" width=\"355\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/android-game-detail.png\" alt=\"Android game detail\" width=\"355\" /\u003e\n\u003c/p\u003e\n\n## Why Spela?\n\n- **One library, every device** -- your games, saves, and progress sync across Android, Windows, macOS, and Linux\n- **Play in seconds** -- browse your collection with cover art, pick a game, and you're playing. No fiddling with cores or configs\n- **Self-hosted** -- your server, your data. Runs on a Raspberry Pi, a NAS, or a VPS. No cloud dependency\n- **Multiplayer** -- play with friends online, live or by taking turns\n- **Beautiful** -- dark-themed UI designed for browsing large game libraries visually\n\n## Features\n\n### Play Your Way\n\n| Feature | Description |\n|---------|-------------|\n| **Native Player App** | Kotlin Multiplatform app for Android, Windows, macOS, and Linux with libretro emulation |\n| **Browser Play** | Play directly in the web browser via EmulatorJS -- no install needed |\n| **Cloud Saves** | Save states sync automatically across all your devices |\n| **Shared Saves** | Share your save states publicly for others to download |\n| **Auto-Save \u0026 Auto-Load** | Never lose progress -- games auto-save on exit and auto-load on start |\n| **Visual Shaders** | CRT scanlines, LCD grid, sharp bilinear, and more -- per-console or global |\n| **Gamepad Support** | Auto-detected controllers with customizable button mapping, per-console overrides |\n| **Fast Forward** | Speed through slow sections with a button press |\n| **Screenshots** | Capture in-game screenshots at any time |\n| **Performance Overlay** | Optional FPS and frame time display |\n\n### Multiplayer\n\n| Feature | Description |\n|---------|-------------|\n| **Real-Time Netplay** | Play live with a friend over the internet. Share an invite code and you're in |\n| **Shared Sessions** | Take turns asynchronously -- pass the game to a friend and pick up where they left off |\n\n### Social\n\n| Feature | Description |\n|---------|-------------|\n| **Activity Feed** | See what your friends are playing, their new favorites, ratings, and achievements |\n| **Ratings \u0026 Reviews** | Rate games and write reviews. See community averages |\n| **Favorites** | Mark your favorite games, synced across devices |\n| **Play Later Queue** | Save games for later with custom ordering |\n| **Collections** | Create named game lists (public or private) |\n| **Play History** | Track time played per game with most-played leaderboards |\n| **Online Status** | See who's currently playing and what they're playing |\n| **User Profiles** | Public profiles with gaming activity and stats |\n\n### Library Management\n\n| Feature | Description |\n|---------|-------------|\n| **Auto-Detection** | Point Spela at your ROM folders -- it detects consoles, titles, and file types automatically |\n| **Metadata Scraping** | Cover art, descriptions, screenshots, ratings, and developer info from IGDB plus libretro thumbnails |\n| **Multi-User** | Multiple accounts with owner, admin, and user roles. The first registered user becomes the server owner; subsequent registrations are pending until an admin approves them |\n| **RetroAchievements** | Link your RetroAchievements account for in-game achievements with progress tracking |\n| **Multi-Server** | The player app can connect to multiple Spela servers |\n\n## Supported Consoles\n\n**59 playable systems** spanning every major Nintendo, Sega, Sony, Atari, NEC, and SNK platform up through the 7th generation, plus arcade (MAME), home computers (Commodore 64/128/Amiga, MSX, Atari 8-bit/ST, DOS), handhelds (WonderSwan, Lynx, Game Boy, Game \u0026 Watch), and curiosities like 3DO, Philips CD-i, Vectrex, ScummVM, and Pokémon Mini.\n\nMost systems also work in the browser via [EmulatorJS](https://emulatorjs.org) — no app install needed. Save states are universal except where the underlying core doesn't support them.\n\nFor the full per-family breakdown — cores used, file extensions accepted, and which systems support browser play vs. native-only — see **[docs/supported-consoles.md](docs/supported-consoles.md)**.\n\n## Quick Start\n\nThe fastest way to get running is Docker Compose.\n\n### 1. Organize your ROMs\n\n```\ngames/\n  nes/\n    Super Mario Bros.nes\n  snes/\n    Chrono Trigger.sfc\n  gba/\n    Pokemon Emerald.gba\n```\n\n### 2. Generate the .env file\n\n```bash\n./setup.sh \u003e .env\n```\n\nThe interactive wizard prompts for hostname, ROM path, optional BIOS path, and optional IGDB credentials. JWT and TURN secrets are generated automatically. (For a non-interactive flow, `./generate-secrets.sh \u003e .env` produces an .env with random secrets and placeholder paths you can edit by hand.)\n\n### 3. Start Spela\n\n```bash\ndocker compose -f docker-compose.qa.yml up -d --build\n```\n\n### 4. Open the web UI\n\nGo to `http://localhost:8080`, register your first account (it becomes the **server owner**), and trigger a library scan from the admin panel. Subsequent registrations are pending admin approval — register a couple of friends and approve them from the admin user list.\n\n### 5. Download the player app\n\nSee **[Downloads](#downloads)** below.\n\n---\n\nFor production deployment with HTTPS, TURN server, and Portainer, see the **[Deploy Guide](docs/DEPLOY.md)**.\n\n## Downloads\n\nSpela's native player app runs on Android, Windows, macOS, and Linux. Each release publishes pre-built artifacts on the [GitHub Releases page](https://github.com/mattias800/spela/releases/latest):\n\n| Platform | Artifact |\n|----------|----------|\n| Android | APK |\n| macOS | DMG (universal: Intel + Apple Silicon) |\n| Windows | MSI installer |\n| Linux | AppImage (x86_64), Flatpak, ARM64 binary |\n\nIf you don't want to install anything, the web UI's **browser play** mode works on every device that supports WebAssembly + SharedArrayBuffer — no native app needed.\n\n## Documentation\n\n| Guide | Description |\n|-------|-------------|\n| [Supported Consoles](docs/supported-consoles.md) | Full per-family tables: cores, extensions, browser-play matrix |\n| [Deploy Guide](docs/DEPLOY.md) | Production deployment, HTTPS, TURN server, backups |\n| [Development Guide](docs/DEVELOPMENT.md) | Building from source, architecture, testing |\n| [Contributing](CONTRIBUTING.md) | Code style, commit conventions, pull requests |\n\n## Acknowledgments\n\nSpela is built with and uses the following open-source projects:\n\n- **[retro-game-console-icons](https://github.com/KyleBing/retro-game-console-icons)** (GPL-3.0) — Console hardware icons\n- **[console-logos](https://github.com/PRO100BYTE/console-logos)** — Console logo SVGs by Dan Patrick\n- **[Console-Iconset](https://github.com/Tatohead/Console-Iconset)** (Free to use) — Pixel art console and controller icons by Tatohead\n- **[Controllers Stencil Platform Images](https://forums.launchbox-app.com/files/file/3480-controllers-stencil-platform-images/)** — White stencil controller icons by EthanAllen\n- **[Icons8](https://icons8.com)** — GameCube and 3DS console icons\n- **[EmulatorJS](https://emulatorjs.org)** (GPL-3.0) — Browser-based emulation frontend\n- **[libretro / RetroArch](https://www.libretro.com)** (GPL-3.0) — Emulation API and cores\n- **[libretro-thumbnails](https://github.com/libretro-thumbnails/libretro-thumbnails)** (CC0/various) — Box art and screenshot collection\n- **[IGDB](https://www.igdb.com/)** — Game metadata (titles, descriptions, ratings, release dates) via the IGDB API\n- **[RetroAchievements](https://retroachievements.org)** — Achievement system for retro games\n- **[ScummVM project](https://www.scummvm.org)** (GPL-2.0) — ScummVM \"Modern Remastered\" logo and mascot icon used for the SCUMMVM platform. Logo by the ScummVM Team; original \"Modern\" mark by Jean Marc Gimenez for the ScummVM project.\n\n## License\n\nThis project is for personal use. Do not distribute copyrighted ROM files.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattias800%2Fspela","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattias800%2Fspela","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattias800%2Fspela/lists"}