RO. Nation LIVE
Another thing we builtdeck

A DJ rig
that lives in Discord.

Two decks, a real mixer, effects and sample pads - on a control surface in your browser, streamed straight into a voice channel. Any number of DJs signed in, one pair of hands on the decks.

What you get

It is a desk, not a playlist.

Most music bots take a link and play it. This one gives you the equipment: two sources, a mixer between them, and everything you would reach for mid-set within a keystroke.

Two decks

Waveform overview with click-to-seek, cue point, loop in and out with halve and double, and a turntable-style pitch fader from half speed to double. Pitch follows speed, the way a record does.

A mixer that actually cuts

Per channel: trim, three-band isolator EQ, a single-knob low-pass/high-pass filter, pan, mute and a fader with peak metering. A full cut on the isolator is a real kill, not a dip - which is the whole point of one.

Crossfader and master

A blend-to-cut crossfade curve, master fader, clip indication, and a brickwall limiter with gain-reduction metering behind it. Balance and a mono fold-down are there when a room needs them.

One send effect, done properly

Tape echo, Schroeder reverb or flanger, on a bus both decks feed post-fader. Time can be set in beats off whichever deck is playing, and it follows that deck's pitch fader.

Eight sample pads

Stings and drops, each one-shot, loop or hold, with their own bus level and an auto-duck that pulls the decks down under a pad hit so the drop lands on top rather than underneath.

Your own hardware

Map a MIDI controller onto anything on the console over Web MIDI, with pickup, jump and endless-encoder modes. Mappings live in your browser, and go out as ordinary commands - so the control lock still applies to them.

A shared queue

Anyone signed in can add to what plays next without holding the decks. Loading, reordering and clearing need control. Auto mode loads and plays the next track whenever a deck runs out.

A media pool

Drag-and-drop upload with rename, tags and BPM. Anything ffmpeg can read is accepted and decoded once, at upload. Drag a track straight onto a deck or a pad.

Commands from Discord

/dj panel, /dj now, /dj summon and /dj leave, for the times somebody just needs the bot in a channel and does not want to open a console to do it.

The console is a grid you arrange yourself - tools dragged in from a tray, moved and sized, snapped and never overlapping. The layout lives in your browser, not on the server: two operators on two screens want different consoles, and tidying yours mid-set should not move anybody else's furniture.

How it goes

Sign in to hand over.

01

Sign in

Discord OAuth2. Membership and roles are verified server-side with a bot token, so the gate cannot be faked by the browser asking nicely.

02

Take control

One person drives at a time. Everyone else watches the live state - faders, waveforms, meters - and queues up for their turn.

03

Load and cue

Pull a track out of the pool onto a deck. Pre-listen in your own headphones without it going to air, set a cue, find the loop.

04

Go live

Pick a voice channel and the bot joins it. From there the room hears the master bus - and it is the mix, not a file being played back.

05

Hand over

Release the decks and the next DJ in the queue takes them. Control also hands over on disconnect or on idling out while somebody is waiting, so a set never stalls on someone who closed their laptop.

The part that makes it a crew tool

One pair of hands

Everyone signed in sees the same live console - the faders moving, the waveforms running, the meters. Exactly one person is holding it. The rest queue up, and control hands over when the holder releases it, passes it to somebody directly, disconnects, or goes idle while someone is waiting.

It is not a convention the interface politely follows. Every command - from the web console and from the slash commands alike - goes through one server-side path where it is schema-validated and permission-checked, so the lock cannot be stepped around by talking to the socket directly.

Also true

  • A refresh does not cost you the decks - there is a disconnect grace period
  • Admins can force-take when somebody has walked away mid-set
  • Pre-listen is local to your browser; it never goes to air
  • The account the room hears can be swapped without a restart
  • Bot tokens are encrypted at rest and never sent back to a browser
  • Your MIDI mappings and your console layout are yours, not the server's
Under it

The mix is rendered, not replayed.

Uploads are decoded once, at upload time, into exactly the format the Opus encoder wants. Nothing on the realtime path touches a codec, and seeking is a byte offset rather than a re-decode.

The mix graph renders in twenty-millisecond blocks - one Opus frame. Each deck resamples for pitch, runs its isolator and filter, applies its fader and pan; the mixer sums both through the crossfader, adds the pad bus and the effects return, then master gain, the limiter and a soft clipper behind it.

Rendering is pulled by the voice player, so Discord's own packet cadence clocks the mix and no buffer can drift. When the bot is not in a channel a local timer takes over, so deck positions stay truthful while you cue up.

Effect sends are taken post-fader, so pulling a channel down takes its tail with it - and the wet return is deliberately not crossfaded, because an echo thrown at the end of a track has to survive the fade out of it.

Before you ask

What it will not do

No beatmatching for you

BPM is a field you type. Matching tempo is done by ear, on the pitch fader, like it was before software started doing it.

No true headphone cue

Discord gets one bus, so pre-listen happens in your own browser. It is not sample-accurate against the live mix.

One rig per server

A single guild, a single voice connection, one set of decks. Two rooms at once is not a setting - it is a different build.

Getting on it

Access goes out
in batches.

It is one rig, and a rig with fifty people queueing for the decks is not a rig anybody gets to use. So it is not self-served: you put your name down, and it is opened up a handful at a time.

Crew are usually already in. If you are not sure, ask in the Discord before you fill anything in.

deck.ronation.live

Signs in with Discord, not Roblox

deck is a separate service on its own host. Your RO. Nation LIVE account and your tickets have nothing to do with it, and it cannot see them.

Curious what else the crew has been building? The blog has the rest, and /services is what we do for other groups.