Before you start
You need a WordPress site. WordPress is free software that runs on a web host. Most hosts set it up in a few clicks, and any host will do as long as it runs WordPress 7.2 or newer. Once it is up, you sign in at your site's address followed by /wp-admin. That is the dashboard, where everything below happens.
Then install Riff. In the dashboard, go to Plugins, then Add New Plugin, then Upload Plugin, choose the zip, and activate it.
No site yet? The demo is a WordPress site running in your browser with Riff already installed. Its dashboard is at /wp-admin too, so you can follow every step here without a site of your own.
Make your Listen page
The Listen page is where your music lives: every album as a cover, browsing by album, artist and track, and one search box. The music keeps playing while visitors move around it.
After you activate Riff, the Dashboard shows a notice. Press Create Listen page and it's done. To make it yourself:
- Go to Pages, then Add Page, and title it Listen, or whatever you like.
- Click the empty line, type
/riffand choose the Riff block. - Press Publish.

To make it the front page of the site, go to Settings, then Reading, choose A static page, and pick it as the homepage.
Add app/ to the page's address, for example /listen/app/, and the same page opens as a player on its own, in Riff's dark look and without your theme. A browser can install that address as an app.
Upload your music
- Go to Media, then Add New Media File.
- Drag in an album's tracks, all at once. MP3, M4A, FLAC, WAV and OGG all work.
That's it. Open your Listen page and the album is there, with its cover, ready to play. Tap a track and the player bar appears along the bottom. It keeps playing while you scroll, open another page, or lock your phone. Tap the bar for Now Playing.
Titles, artists and covers come from the files
Riff reads the title, artist, album and cover art from the tags inside each file, the same tags your music app uses. It also shows each track's quality, such as MP3 · 320 kbps or FLAC · 24-bit 96 kHz.
If a file has no tags, or the wrong ones, go to Media, then Library, click the file and fix them there. The same screen has two fields Riff adds. Artwork is a cover for that track. Video version is a video in the library, for a song that has one; listeners can switch between the song and the video while it plays. A video file has a Captions field of its own, for a WebVTT file in the library, which listeners can turn on in Now Playing.

If an album has no cover at all, Riff draws one: a record with one groove per track, each groove as long as the track. The demo's albums wear them.
Give an album its own post
To write about an album, or to play it on its own page with the rest of your site around it, put it in a post:
- Go to Posts, then Add Post, and type the album's name as the title.
- Click the empty line below it, type
/playlistand press Enter. - Choose the tracks from the Media Library, or upload them here. Drag them into order.
- Press Set featured image in the sidebar to give it a cover, then Publish.


An Audio block for each track works too: type /audio instead.
Make the post private, a draft, or password protected, and its tracks stay off the Listen page for visitors until you publish it.
Many albums at once
Most albums arrive as a zip. Upload the zip to the Media Library, as you would any file, and Riff unpacks it in the background and gives each album in it a private post, with each track Protected, and attaches the zip to it. A cover image beside the tracks becomes the artwork. A zip still unattached a while later could not be imported; wp riff import on it says why.
A zip is private because it is how a store's download arrives. Music you bought, from Bandcamp say, is for your own listening: you and the site's editors and administrators hear it, and the open web doesn't. For listeners who sign in to hear it too, turn on Private site under Settings › Reading and publish the posts. If the music is yours, your own releases, publish the posts. The zip itself stays at its public address in uploads, so delete it from the Media Library once the album is in. A track already in the Media Library is skipped and stays as it was.
If you have a folder per album and your host gives you WP-CLI, wp riff import with the path to the folder uploads everything and gives each album a published post, or a private one with --private. With the path to a zip it imports it privately, or publicly with --no-private. Run it again and it skips what it already imported; add --dry-run to see what it would do first.
Your own tracks from SoundCloud
If your catalogue is on SoundCloud, bring the files you uploaded there: the masters you made them from, or the copies you downloaded from your own SoundCloud tracks. Put each album's tracks in a folder of its own, and singles each in their own, with the artwork beside them named cover.jpg, then zip the folders and upload the zip to the Media Library, or give the folder to wp riff import. Publish the posts, and your catalogue lives on your own site.
Titles come from the files' tags, and a WAV file usually has none, so name each file the way it should read, such as 01 - First Song.wav. AIFF files aren't imported, as only Safari plays them: export WAV or FLAC instead. Only your own tracks: other people's download only where their artist allows it, and tools that pull them from SoundCloud break its terms. Riff can't sign in to SoundCloud and fetch your uploads for you yet (#824).
From a public archive
Archives publish recordings for anyone to reuse. With WP-CLI, wp riff archive loc imports the Library of Congress's, starting with the Edison companies' sound recordings, or a collection or an item you name by its address. wp riff archive europeana "gramophone" --key=yourkey searches Europeana, with a key it gives anyone who asks.
Rights are per recording, so Riff reads each one's rights statement and imports only what is marked public domain or under CC0, CC BY or CC BY-SA, or, from the Library of Congress, what its statement says it knows of no U.S. copyright in, credited as just that. It lists what it skipped and why. Check the rights where you are, too: the Library speaks only for the U.S. Each track keeps its source, licence and credit in its caption and description, the About panel shows the credit, and each album's post opens with it. Your site credits the archive; it doesn't present itself as the archive. Add --dry-run to see what it would take first.
Stuck? Open an issue and say what you tried. If something here is wrong or unclear, that is a bug in this page too.