Export and import your Spotify library: playlists, liked songs, albums, artists, podcasts, and more.
A pnpm monorepo. Apps run inside Spotify's Chromium shell and use React provided by the Spicetify global (React is not bundled, it's externalized to Spicetify.React).
git clone https://github.com/Prog-Jacob/spicetify-apps.git
cd spicetify-apps
pnpm install
pnpm dev| Command | What it does |
|---|---|
pnpm dev |
Watch-build all apps + live reload |
pnpm build |
Production build (all apps) |
pnpm build:app <name> |
Build a single app |
pnpm typecheck |
Typecheck all packages |
pnpm lint |
ESLint (flat config) |
pnpm test |
Run tests (node:test via tsx) |
pnpm format |
Prettier |
pnpm precommit |
Format + lint + typecheck + test |
pnpm create-app |
Scaffold a new app interactively |
pnpm release <app-name> |
Changeset release: bump, tag, push |
pnpm setup-fork |
Repoint all repo references for a fork |
apps/<name>/
├── src/
│ ├── index.tsx Entry point (default-exports render() returning JSX)
│ ├── app.tsx App shell (error boundary, i18n, layout)
│ └── i18n/ Translations (en.ts default + optional locale JSON)
├── preview/ Screenshots and GIFs for the README
└── dist/ Build output (index.js, style.css, manifest.json)
packages/
├── shared/ API wrappers, i18n engine, hooks, types, utilities
└── ui/ Shared UI components (shadcn/radix, Tailwind v4)
scripts/
├── lib.mts Shared constants and helpers for all scripts
├── build.mts esbuild bundler (auto-discovers apps in apps/)
├── create-app.mts Interactive app scaffolder
├── setup-fork.mts Repoints all repo references for forks
└── release.mts Changeset-based release per app
pnpm create-appThe scaffolder generates the entry point, app shell, i18n setup, README, package.json, and tsconfig.json. It also adds a manifest entry. Apps are auto-discovered by the build script, so no extra wiring is needed.
To set up manually, create apps/<name>/src/index.tsx with a default render() export, a package.json with a version field, and a tsconfig.json extending ../../tsconfig.base.json.
| Alias | Resolves to |
|---|---|
@shared/* |
packages/shared/src/* |
@ui/* |
packages/ui/src/* |
Uses changesets. Tags follow <app-name>-v<version> format.
pnpm release data-porterThe repo is designed so forks can publish their own apps with minimal setup. Most scripts derive the repo identity from package.json#repository at build time, so a single edit propagates everywhere: generated READMEs, update checks, i18n locale fetching, and install commands inside app bundles.
After forking, run the setup script to point everything at your repo:
pnpm setup-forkThis updates package.json#repository, install scripts, and all README badge/link URLs in one step. Everything else (build, release, scaffolder, CI workflows, changesets) works out of the box.
MIT License © 2026 Ahmed Abdelaziz
