Setlist
A small Beat Saber (PC, BSIPA) plugin that syncs in-game playlist edits back to BeatLeader so your playlists stay current outside the game — on the website, on your phone, or shared with friends.
What it does
When you add a map to a playlist in-game (via the standard PlaylistManager "Add to playlist" flow), Setlist:
- Watches
PlaylistManager.Utilities.Events.playlistSongAdded. - Checks whether the playlist is a BeatLeader-synced playlist owned by you
— i.e. its
customData.syncURLis anapi.beatleader.com/playlist/guid/…URL and itscustomData.ownermatches your platform user id. - Serializes the updated playlist and POSTs it back to BeatLeader
(
POST /user/playlist?id=…&shared=…).
The POST reuses the BeatLeader mod's authenticated session — no extra login, no API token in your config, nothing to copy/paste. If BeatLeader is signed in, Setlist is signed in.
The result: edit playlists in VR; see them updated on the website and any device that consumes them, without alt-tabbing or running a sync script.
Requirements
- Beat Saber
1.40.8(PC), via BSIPA. - BeatLeader
^0.9.0— must be installed and signed in for the sync to authenticate. - PlaylistManager
^1.7.0. - BeatSaberPlaylistsLib
^1.7.0(transitive via PlaylistManager).
See Setlist/manifest.json for the authoritative list.
Install
Drop Setlist.dll into Beat Saber/Plugins/ alongside BeatLeader and
PlaylistManager (BSManager works fine). Confirm in Logs/_latest.log:
[INFO @ ...] [Setlist|...] platformUserId=...
[INFO @ ...] [Setlist|...] Playlist "...": hasSyncUrl=True, owner=..., ownerMatchesPlatform=true (...)
When you add a map to one of those playlists in-game you should then see:
[INFO @ ...] [Setlist|...] Setlist BeatLeader sync: OK HTTP 200 playlist="..." body=...
Build (Linux / NixOS, no Visual Studio / Rider)
This whole plugin is built from the dotnet CLI on Linux — including NixOS —
no BSMT IDE extension required. The Linux + Cursor toolchain (.NET SDK 9, BSMT
MSBuild tasks, the missing-net472-reference-assemblies workaround, and the
"copy DLL into Plugins/ on a Unix host" target) is documented in:
docs/pc-modding.md— full guide, adapted from the BSMG wiki for Linux + Cursor + LLM-assisted dev.docs/bootstrap.md— exactly how this project was scaffolded (template, NuGet pins,BeatSaberDir, etc.).
Quick start once Setlist.csproj.user points at your install:
cd Setlist
dotnet restore
dotnet build -c Debug
Output: Setlist/bin/Debug/Setlist.dll, also copied into
$BeatSaberDir/Plugins/Setlist.dll by the Unix-host post-build target.
How it integrates with the two host plugins
Both integrations are deliberately thin and live in a single project so they can be read end-to-end:
-
PlaylistManager — Setlist subscribes to its public
Events.playlistSongAddedhook (same one used by the in-game UI flow). Notes on that flow live indocs/playlistmanager-add-map.md. -
BeatLeader — Setlist references the shipped
BeatLeader.dll, waits on BeatLeader's ownAuthentication._signedInflag, and POSTs through Unity'sUnityWebRequestso the cookies BeatLeader'sHttpClientalready has on the sharedCookieContainerare reused. Background and the alternative "go throughWebRequestFactorydirectly" approach are indocs/beatleader-playlist-api.mdanddocs/beatleader-api-samples.md.
Status
Early / personal-use. Currently scoped to:
- Adds (one new song → one POST). Removes, reorders, renames, and bulk edits are not yet wired.
- BeatLeader as the sync target. The same model would extend to other backends that accept a full-playlist upload.
See AGENTS.md for repo conventions (version-bump-on-build,
smoketest, etc.) if you're contributing or letting an agent work in this repo.