V3 modules for the spicetify modular runtime.
Modules are built with stitch (scripts/stitch.ts), a thin builder on
top of rolldown. Node 24 only; no Deno required, and
TypeScript runs natively.
pnpm install
pnpm stitch modules/stdlib # one module, auto-detects the classmap
pnpm stitch # all modules
pnpm stitch --classmap 1020092 # explicit classmap key
pnpm stitch -c path/to/classmap.json
pnpm stitch --helpClassmap resolution order (no env vars needed):
--classmap <key|path>: a key resolves to the newestclassmap-*.jsonin that folder of a classmaps checkout; a path is used directly.stitch.config.json(repo-level defaults, gitignored).- Auto-detection: the newest key folder in
../classmaps(sibling clone) or./classmaps(in-repo, used by CI). ./classmap.jsonas a fallback.
What stitch does:
- bundles TS/TSX with rolldown (lazy dynamic-import chunks preserved,
/hooks/*andhttps://imports kept external), - compiles
index.scsstoindex.css(sass-embedded), - writes
dist/<name>@<version>/withmetadata.jsonand thespicetify-module.jsonsidecar (classmap_base,installed_version,allow_stale), - generates
classmap.d.tsper module from the resolved classmap (typedMAPfor authors).
Modules ship MAP-intact: class references stay as MAP.* in the built
output and are remapped by the spicetify CLI at apply time against the exact
installed classmap. One build serves every supported Spotify version; there
are no per-version prebuilds.
From the repository root, run a module's automated checks with Node 24 and the shared dependencies installed:
pnpm verify auto-skip-explicit
pnpm verify modules/lyrics-plus
pnpm verify themes/textThe command builds the selected module, checks its TypeScript and imported
dependencies, lints, checks formatting and stdlib boundaries, validates
repository dependency ranges, and runs its colocated *.test.mts files.
It reports explicitly when a module has no automated tests. It doesn't install
the build into Spotify.
To verify your changes and modules that depend on them, run:
pnpm verify --changed
pnpm verify --changed --base origin/mainChanged mode compares against the merge base with origin/main by default,
including committed, staged, unstaged, and untracked files. It checks affected
modules and their reverse dependencies. Shared tooling changes run all module
builds and the full repository checks. CI continues to run the full suite.
Fetch your target branch first when you need its latest state. Live Spotify
verification remains a separate step.
Strict checking is the default for modules, stdlib, scripts, and generated TypeScript projects, including Lyrics Plus. File-level type-checking exemptions are rejected by lint. The module standard explains the checks and the separate client and test environments.
docs/updating-modules.md— updating and repairing modules from the Spotify UIdocs/authoring-guide.md— building a moduledocs/module-standard.md— the module contractdocs/publishing.md— submitting a module to the storedocs/npm-publishing.md— releasing the developer kit and scaffold launcher to npmdocs/theming-the-client.md— theming the client's own colorsdocs/pr-flow.md— release and tag recovery
The 2024 prototype was Deno-first (TS-native execution, JSR, web-standard APIs). Everything the current pipeline needs, Node 24 does natively: type stripping, rolldown (Rust bundler with TS support), and the package ecosystem the rest of spicetify already uses (the CLI wrapper builds with esbuild on Node). The Deno/tailor tooling was removed; stitch is the only build path.
GPLv3. See COPYING.