Download extensions and themes directly from within Spicetify.
Made by @theRealPadster and @CharlieS1103.
Based on the reddit Custom App
Made with Spicetify Creator
All extensions are from community. They might contain unwanted code. Be careful what you install, or review the code before use. We hold no responsibility for these extensions or anything installed via this custom app. If you find a malicious extension, please submit an issue and we can add it to the blacklist.
This project is a work-in-progress and is not finished, polished, or guaranteed to work. Use at your own risk.
Open Powershell and paste the following:
Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/install.ps1" | Invoke-Expression
Open a terminal and paste the following:
curl -fsSL https://raw.githubusercontent.com/spicetify/spicetify-marketplace/main/resources/install.sh | sh
Copy the spicetify-marketplace
folder into your Spicetify custom apps directory as "marketplace":
Platform | Path |
---|---|
Linux | ~/.config/spicetify/CustomApps/ or $XDG_CONFIG_HOME/.config/spicetify/CustomApps/ |
MacOS | ~/.config/spicetify/CustomApps/ or $SPICETIFY_CONFIG/CustomApps/ |
Windows | %userprofile%/.spicetify/CustomApps/ |
After putting the marketplace folder into the correct custom apps folder, run the following command to enable it:
spicetify config custom_apps marketplace
spicetify apply
Note: Using the config
command to add the custom app will always append the file name to the existing custom apps list. It does not replace the whole key's value.
Or you can manually edit your config-xpui.ini
file. Add your desired custom apps folder names in the custom_apps
key, separated them by the | character.
Example:
[AdditionalOptions]
...
custom_apps = reddit | marketplace
Then run:
spicetify apply
If you lose access to the marketplace page, and therefore cannot access the setting, follow these steps:
- First ensure you have dev-tools enabled by running
spicetify enable-devtools apply
- Open up console by right clicking anywhere on Spotify (that isn't an element), and clicking inspect element.
- Click the console tab in the devtools window that appears, and run the following command(in console)
Marketplace.reset()
In order to show up in the custom app, you'll need to make a public GitHub repo that meets these requirements:
- Have the matching GitHub topic tag ("spicetify-extensions" or "spicetify-themes")
- Have a valid
manifest.json
in the root folder (format outlined below)
name
: Your extension namedescription
: Description for your extensionpreview
: A path to your preview image. Must be relative to your project root.main
: The filename for your extension's main js file. Must be relative to your project root.readme
: The filename for your extension's README file. Must be relative to your project root.branch
: Optional branch to specify. Will use default branch if none.authors
: Optional array of authors with names and urls. Will use repo owner if none.tags
: Optional array of tags to show along with the card.
e.g.
[
{
"name": "Spicetify-Hide-Podcasts",
"description": "Spicetify extension to hide podcasts.",
"preview": "screenshot.png",
"main": "hidePodcasts.js",
"readme": "README.md",
"authors": [
{ "name": "theRealPadster", "url": "https://github.com/theRealPadster" }
],
"tags": ["podcasts"]
},
{
"name": "extensionName(No .js included)",
"description": "Another Spicetify extension to show how to make a manifest.",
"preview": "https://i.imgur.com/foo.png",
"main": "filepathFromGitRepo/myExt.js",
"readme": "filepathFromGitRepo/README.md",
"branch": "my-branch"
},
]
name
: Your theme namedescription
: Description for your themepreview
: A path to your preview image. Must be relative to your project root.usercss
: A path to your user.css file. Must be relative to your project root.schemes
: A path to your color.ini file. Must be relative to your project root.readme
: The filename for your extension's README file. Must be relative to your project root.branch
: Optional branch to specify. Will use default branch if none.authors
: Optional array of authors with names and urls. Will use repo owner if none.tags
: Optional array of tags to show along with the card.
e.g.
{
"name": "Theme Name",
"description": "Theme description",
"preview": "filepathFromGitRepo/theme.png",
"readme": "README.md",
"usercss": "filepathFromGitRepo/user.css",
"schemes": "filepathFromGitRepo/color.ini",
"branch": "beta-release",
"authors": [
{ "name": "theRealPadster", "url": "https://github.com/theRealPadster" },
{ "name": "CharlieS1103", "url": "https://github.com/CharlieS1103" }
],
"tags": ["dark", "minimal"]
}
- If you have multiple extensions in the same repo (such as using subfolders), you can make your
manifest.json
an array, and include them all. - Most fields also support http/https URLs (
preview
,main
,readme
,usercss
,schemes
) - If all your extensions/themes are in the root folder, you don't need to include an absolute file path.
CSS snippets are rather basic to implement. We fetch them from this repo, so you'll need to submit a pull request. In order to be valid JSON, the CSS needs to be in one line. You can use this website to make the css snippet single line. Once you have your code segment ready, edit snippets.json and add the following, before submitting your PR.
{
"title": "Title",
"description": "description",
"code": "The single line css you have"
}
TODO: Re-write this entire section, since it will change a lot once we switch to the mono-manifest system
componentDidMount
triggersnewRequest
, which triggersloadAmount(30)
loadAmount
callsloadPage
in a loop until it has the requested amount of cards or runs out of resultsloadPage
callsgetRepos(page)
to get the next page of extensions. It queries the GitHub API for any repos with the "spicetify-extensions" topic. We'll likely add our own tag in the future, like "spicetify-marketplace".- The it loops through all the results and runs
fetchRepoExtensions()
orgetThemeRepos()
, which fetches amanifest.json
file from the repo's root folder. If it finds one, we generate a card based on the info.
- Or if the active tab is "Installed",
loadPage
callsgetLocalStorageDataFromKey(LOCALSTORAGE_KEYS.installedSnippets)
to get the extensions from the localstorage and generate the cards from there. - Or if the active tab is "Snippets",
loadPage
callsfetchCssSnippets()
and generates cards from the most recentsnippets.json
on GitHub.
- This project uses yarn, not npm
- Run
yarn
to install the packages etc. - The app entry point is located in
/src/app.tsx
- The SCSS stylesheets are all imported in
app.tsx
- Build the app once with
yarn build
. This needs to be done before thewatch
command works. - For development, you can run
yarn watch
to live update the files as you save them. This works well when paired withspicetify watch -a
, to live reload spotify as the files are saved. - Refer to the Spicetify Creator docs for more information