Universal multi-session media controller for the browser - Spotify, YouTube Music, YouTube and generic HTML5 players.
SongSphere is an independent open-source project and is not affiliated with Spotify, YouTube, Google or any music platform.
Built with WXT · React · TypeScript · Tailwind · Zustand.
- Multi-session control - see and switch between every playing tab from one popup
- Play / pause / seek / volume / like (per-platform capabilities)
- Global keyboard shortcuts (Alt+Shift+P / arrows / L)
- Chrome and Firefox builds
- Local-only - no backend, no analytics
git clone https://github.com/AaronKurian/SongSphere.git
cd SongSphere
npm installnpm install runs wxt prepare automatically and generates TypeScript types in .wxt/.
Optional typecheck:
npm run compileUse this while changing UI or extension code. Keep the dev terminal open the whole time - the dev server must stay running.
npm run dev:firefox- Wait for
Started dev server @ http://localhost:3000. - Firefox opens (or go to
**about:debugging**→ This Firefox → Load Temporary Add-on). - Select
**.output/firefox-mv2/manifest.json** inside the project folder.
Reload after changes
| What you changed | What to do |
|---|---|
Popup UI (src/popup/, styles) |
Close and reopen the SongSphere popup |
| Background / content scripts | Reload the extension in about:debugging |
manifest / wxt.config.ts |
Stop dev (Ctrl+C), run npm run dev:firefox again, reload add-on |
Landing page
- http://localhost:3000/landing.html
- Dev server must be running (
npm run devornpm run dev:firefox).
Popup dev note: The popup loads from the Vite dev server. If you see connection errors, confirm the terminal is still running and the port is 3000.
npm run dev- Open
**chrome://extensions**(oredge://extensions). - Enable Developer mode.
- Load unpacked → choose
**.output/chrome-mv3** (created after dev starts).
Reload rules are the same as Firefox (popup vs background vs full restart).
This build does not need npm run dev running. Load it once and use it like a normal unpacked extension until you rebuild.
npm run build:firefox**about:debugging**→ This Firefox → Load Temporary Add-on.- Select
**.output/firefox-mv2/manifest.json**.
The add-on stays loaded until you remove it or restart Firefox (temporary add-ons are cleared on Firefox restart unless you use a persistent dev setup).
For a long-lived local install, reload the same folder after each npm run build:firefox; pin SongSphere to the toolbar.
npm run build**chrome://extensions**→ Developer mode → Load unpacked.- Folder:
**.output/chrome-mv3**.
Click Reload on the extension card after rebuilding.
npm run zip:firefox # → .output/songsphere-x.x.x-firefox.zip
npm run zip # → Chrome MV3 zip- Open a supported player in a tab:
- Spotify Web Player
- YouTube Music
- YouTube (watch page with video playing)
- Other sites with HTML5 / Media Session (limited controls)
- Start playback on that tab.
- Click the SongSphere toolbar icon.
- Switch sessions with the bottom dots or chevrons; control playback from the popup.
Shortcuts (when the browser has focus):
| Shortcut | Action |
|---|---|
| Alt+Shift+P | Play / pause |
| Alt+Shift+→ | Next track |
| Alt+Shift+← | Previous track |
| Alt+Shift+L | Like (where supported) |
src/
entrypoints/ # background, content scripts, popup, landing page
popup/ # React popup UI
landing/ # Marketing landing page
background/ # Session bridge, messaging
isolated/ # Per-platform adapters
shared/ # Types, constants
styles/ # globals.css
public/icon/ # Extension icons (regenerate: python3 scripts/gen-icons.py)
assets/ # Branding (songsphere.png, etc.)
Docs: docs/ARCHITECTURE.md · PRIVACY.md · docs/STORE.md
**NS_ERROR_CONNECTION_REFUSED / popup blank in dev**
Dev server is not running or the wrong port. Run npm run dev:firefox (or npm run dev) and leave it open. Use port 3000.
Extension does nothing after install
Open a supported site, play audio, then open the popup. Reload the extension after build if you changed background code.
Icons look tiny in Firefox
Rebuild and reload the extension; toolbar icons are set on background startup.
Dev telemetry overlay
In the popup console: localStorage.setItem("songsphere:dev", "1") then reopen the popup.
This project is licensed under the MIT License - see the LICENSE file for details.
Made with ❤️ by Aaron Kurian Abraham


