A premium, high-quality, and open-source music bot for Fluxer.
Invite to Server · Report a Bug · Request a Feature
- About The Project
- Features
- Getting Started (Users)
- Commands
- Self-Hosting
- Project Architecture
- Localization
- Scripts
- Credits
Remix is a free and open-source music bot for Fluxer, built with @fluxerjs/core and powered by moonlink.js for seamless, high-quality audio streaming. It uses revoice.js for LiveKit voice connections and audio playback, and @fluxerjs/voice for native voice channel integration alongside the Moonlink Lavalink proxy.
We believe music features shouldn't be locked behind paywalls — all commands on Remix are 100% free and always will be.
- High-quality audio playback via moonlink.js (Lavalink proxy), revoice.js (LiveKit voice + MediaPlayer), and
@fluxerjs/voice - Multi-source search — YouTube, Spotify, SoundCloud, Deezer, Apple Music, Tidal, and direct URL support
- 24/7 mode — keep the bot in a voice channel permanently, with auto-recovery on restart
- Session recovery — active players and queues survive bot restarts and crash recovery
- Interactive emoji player — reaction-based control panel with play, pause, skip, volume, shuffle, and more
- Lyrics — fetch synced lyrics via NodeLink
- Radio stations — built-in support for custom radio streams with keyword-based search
- Last.fm integration — auto-scrobble songs, play loved/top/recent tracks, and view your Last.fm profile
- Server settings — per-guild configuration for prefix, volume, locale, 24/7 channels, and more
- Web dashboard — optional browser-based control panel with Redis-backed sessions and Fluxer OAuth2 login
- Multi-language support — available in English, Arabic, German, Kurdish (Sorani), and Brazilian Portuguese
- Configurable logging — granular control over which log categories appear in the console
- Graceful shutdown — saves active session state on SIGINT/SIGTERM for seamless reboot recovery
- Module system — pluggable module architecture for extending bot functionality
Want to use Remix in your server right away?
- Invite Remix to your Fluxer server.
- Join a voice channel.
- Use the
%helpcommand to see everything the bot can do, or jump straight in with%play <song name>.
Below is the complete list of Remix's commands. The default prefix is %.
| Command | Description | Usage | Aliases |
|---|---|---|---|
play |
Play a song from a URL, search query, or playlist | %play Never Gonna Give You Up / %play lastfm:loved |
p |
playnext |
Add a song/playlist to the top of the queue | %playnext query: text |
pn |
pause |
Pause the current playback | %pause |
|
resume |
Resume the paused playback | %resume |
|
skip |
Skip the currently playing song | %skip |
s |
np |
Show the currently playing song | %np |
current, nowplaying |
list |
View the upcoming queue | %list |
queue, q |
loop |
Toggle loop mode (song or queue) | %loop queue |
|
shuffle |
Randomize the queue order | %shuffle |
|
remove |
Remove a specific song by its queue index | %remove 3 |
|
clear |
Clear the entire queue | %clear |
c |
volume |
Change the playback volume (1–200) | %volume 50 |
v, vol |
volumedefault |
Set the default volume for the server | %volumedefault 80 |
vd |
search |
Search for a track and pick from results | %search query |
|
lyrics |
Display synced lyrics from NodeLink | %lyrics |
lyric, ly |
thumbnail |
Get the thumbnail of the current track | %thumbnail |
thumb |
radio |
Play a built-in or custom radio station | %radio |
r |
filter |
Manage audio filters (bass, speed, nightcore, etc.) | %filter bass 50 |
filters, fx, effect |
player |
Create an interactive emoji control panel with live progress | %player |
|
join |
Make the bot join a specific voice channel | %join 123456789 |
|
leave |
Make the bot leave the current voice channel | %leave |
l, stop |
forceleave |
Force the bot to leave any channel (requires Manage Channels) | %forceleave |
fl |
| Command | Description | Usage | Aliases |
|---|---|---|---|
settings |
View or change server settings (requires Manage Server) | %settings set |
prefix, pfx, 247 |
stats |
Display bot stats (uptime, ping, player count, stored scrobbles) | %stats |
info |
invite |
Get the bot invite link | %invite |
addbot, remix |
support |
Get an invite to the support server | %support |
server |
lastfm |
Link Last.fm, toggle scrobbling, view profile, play tracks, leaderboard | %lastfm link / %lastfm play loved / %lastfm lb |
lf, lfm |
reload |
Reload commands or modules at runtime (owner) | %reload |
|
servers |
List servers the bot is in (owner) | %servers |
|
eval |
Evaluate JavaScript (owner only) | %eval 1+1 |
|
debug |
Debug voice connections and player state (owner) | %debug voice |
|
test |
Show voice channel user counts (owner) | %test |
If you prefer to host Remix yourself, please note: You must make it clear that your bot is an instance of Remix. Change the bot's name and give credit in the bot's profile (e.g., "Powered by Remix").
- Node.js >= 22.0.0 (required by moonlink.js v5)
- MySQL 8.0+ with JSON column support
- NodeLink instance (Lavalink proxy for audio)
- FFmpeg (installed automatically via
ffmpeg-static) - Redis (optional, required for the web dashboard)
-
Clone the repository:
git clone https://github.com/remix-bot/fluxer.git cd fluxer -
Install dependencies:
npm install
-
Configure the bot:
cp config_example.json config.json
Open
config.jsonand fill in the required values:token— your Fluxer bot tokenmysql— your MySQL connection details (host, port, user, password, database)prefix— the command prefix (default:%)nodelink— your NodeLink instance connection detailsspotify— (optional) Spotify API credentials for Spotify track supportgeniusToken— (deprecated, unused) was previously for lyrics; lyrics are now fetched via NodeLinkowners— array of Fluxer user IDs with owner-only command access
-
Set up the database: (See Database Setup below)
-
Start the bot:
npm start
For development with inspector:
npm run dev
Remix requires a MySQL database to store per-guild settings.
-
Create a dedicated database for Remix:
CREATE DATABASE remix;
-
Enter your MySQL connection details into
config.json:"mysql": { "host": "localhost", "port": 3306, "user": "remix", "password": "your-password", "database": "remix" }
-
Create the required table:
CREATE TABLE `settings` ( `id` varchar(70) NOT NULL, `data` json NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
-
(Optional) If migrating from the legacy settings system, run:
npm run migrate
Remix includes a web dashboard for controlling the bot through a browser interface.
-
Enable the dashboard in
config.json:"dashboard": { "enabled": true, "redis": { "url": "redis://localhost:6379" }, "fluxer": { "id": "your-fluxer-oauth2-app-id", "secret": "your-fluxer-oauth2-client-secret", "redirectUri": "https://your-backend.com/auth/fluxer" } }
-
Create a Fluxer OAuth2 application at Settings > application.
-
For HTTPS support, configure SSL in
config.json:"ssl": { "private": "/etc/letsencrypt/live/your.domain/privkey.pem", "cert": "/etc/letsencrypt/live/your.domain/fullchain.pem", "useSSL": true, "httpPort": 80 }
Key configuration options in config.json:
| Option | Type | Default | Description |
|---|---|---|---|
token |
string | — | Required. Fluxer bot token |
prefix |
string | % |
Default command prefix |
embedColor |
string | 0xe9196c |
Hex color for embed messages |
owners |
string[] | [] |
User IDs with owner privileges |
playerAFKTimeout |
number | 60000 |
Inactivity timeout in ms before bot leaves |
customStatsFooter |
string | — | Custom text shown in the %stats embed footer |
webPort |
number | 80 |
Port for the web dashboard |
helpCatalog |
bool | true |
Enable categorized help command |
helpPagination |
bool | true |
Enable paginated help output |
mysql |
object | — | Required. MySQL connection settings |
nodelink |
object | — | NodeLink connection (host, port, password, requestTimeout) |
spotify |
object | — | Spotify API credentials (clientId, clientSecret) |
geniusToken |
string | — | (Deprecated, unused) Previously for lyrics; lyrics are now fetched via NodeLink |
lastfm |
object | — | Last.fm integration (apiKey, apiSecret, scrobbleThreshold, scrobbleMinMs) |
dashboard |
object | — | Dashboard config: enabled, redis, fluxer (OAuth2) |
dashboardUrl |
string | — | URL the dashboard is accessible from |
sessionSecret |
string | — | Secret for Express.js session middleware |
logging |
object | — | Per-category log toggle (enabled + 12 sub-categories, see config example) |
timers |
object | — | Timing values for inactivity, recovery, rejoin, etc. (14 sub-keys) |
cache |
object | — | Guild and member cache (guilds.enabled, guilds.max, members.enabled, members.max) |
radio |
array | [] |
Custom radio station definitions |
ssl |
object | — | SSL certificate paths (private, cert), useSSL, httpPort |
presenceInterval |
number | — | Interval in ms for rotating bot presence status |
presenceContents |
string[] | [] |
Presence status messages to cycle through |
fluxer.js |
object | — | Fluxer.js REST options (timeout, retries) |
fluxer-api |
object | — | Fluxer API endpoint configuration |
fluxer/
├── index.mjs # Entry point — Remix class, boot sequence, error handling
├── config_example.json # Configuration template
├── package.json
├── commands/ # Command modules (one file per command)
│ ├── play.mjs # Play a track or playlist
│ ├── player.mjs # Interactive emoji control panel with live progress
│ ├── settings.mjs # Per-guild settings management (prefix, 247, volume, etc.)
│ ├── lyrics.mjs # Synced lyrics from NodeLink
│ ├── filter.mjs # Audio filter controls
│ ├── radio.mjs # Radio station management
│ ├── debug.mjs # Voice connection debugger (owner only, paginated)
│ ├── stats.mjs # Bot stats with live player count
│ ├── lastfm.mjs # Last.fm account linking, scrobbling, and profile
│ └── ... # All other commands
├── src/
│ ├── CommandHandler.mjs # Command loader, prefix manager, registry
│ ├── MessageHandler.mjs # Message parsing, embed builder, pagination, help
│ ├── PlayerManager.mjs # Spawns and manages per-channel Player instances
│ ├── Player.mjs # Core player — queue, playback, filters, events
│ ├── MoonlinkManager.mjs # Moonlink.js (Lavalink) node session manager
│ ├── Settings.mjs # RemoteSettingsManager + ServerSettings export
│ ├── GatewayHandler.mjs # Raw WS events, voice-state tracking, presence rotation
│ ├── RecoveryManager.mjs # Session persistence, crash recovery, 24/7 auto-join
│ ├── LastFmManager.mjs # Last.fm API client — auth, scrobbling, user data, stored scrobble stats
│ ├── Utils.mjs # Shared utilities
│ ├── worker.mjs # Background task worker
│ ├── probe.mjs # FFprobe wrapper for audio stream info
│ ├── constants/
│ │ ├── Logger.mjs # Structured logger with per-category control
│ │ ├── Locale.mjs # i18n translation engine
│ │ ├── Helpers247.mjs # 24/7 mode helper utilities
│ │ ├── providers.mjs # Audio source provider definitions
│ │ └── audio/
│ │ ├── StreamMerger.mjs # Audio stream merging utilities
│ │ └── Tuna.mjs # Audio filter/effect processing
│ └── dashboard/
│ ├── Dashboard.mjs # Web dashboard server (Express + WebSocket)
│ ├── DatabaseManager.mjs # Dashboard database query manager
│ └── RedisHandler.mjs # Redis session and pub/sub handler
├── settings/
│ ├── Settings.mjs # Abstract SettingsManager base class
│ ├── migrate.mjs # Legacy-to-remote settings migration script
│ ├── runnables.mjs # Runnable task definitions
│ └── README.md # Settings system documentation
└── storage/
├── defaults.json # Default per-guild settings template
├── modules.json # Plugin module registry
├── stats.json # Runtime statistics
└── locales/bot/ # Translation files
├── en.json
├── ar-SA.json
├── de-DE.json
├── ckb.json
└── pt-BR.json
Remix supports multiple languages out of the box. The locale system loads JSON translation files from storage/locales/bot/ and serves the appropriate language based on each guild's locale setting.
Currently supported languages:
| Code | Language |
|---|---|
en |
English (default) |
ar-SA |
Arabic |
de-DE |
German |
ckb |
Kurdish (Sorani) |
pt-BR |
Brazilian Portuguese |
To add a new language, place a JSON file in storage/locales/bot/ following the same key structure as en.json, then set the locale per guild with %settings set locale <code>.
| Script | Command | Description |
|---|---|---|
npm start |
node index.mjs |
Start the bot |
npm run dev |
node --inspect index.mjs --trace-warnings |
Start with Node.js inspector |
npm run commands |
node index.mjs usage |
Generate command usage documentation |
npm run defaultsSync |
node index.mjs sreload |
Sync default settings to all guilds |
npm run migrate |
node settings/migrate.mjs |
Run the legacy settings migration |
Development:
- ShadowLp174 — Lead developer
- NoLogicAlan — Lead developer
- Fantic — Community Manager
Powered by:
@fluxerjs/core— Fluxer API clientrevoice.js— LiveKit voice connection and MediaPlayer@fluxerjs/voice— Native voice channel integrationmoonlink.js— Lavalink proxyNodeLink— Audio node manager
© 2026 Remix. Code licensed under the MIT License.
The Remix name, logo, and branding are proprietary and may not be reused.