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.
docs/authoring-guide.md— building a moduledocs/module-standard.md— the module contractdocs/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.