Skip to main content

Requirements

A framework is not required. On a standalone server, jobs and gangs resolve empty and access control falls back to ACE permissions and identifier lists.
ox_target and ox_inventory are deliberately not listed as hard dependencies, so a server that uses neither still boots cleanly.

Steps

  1. Drop the resource into your server, e.g. resources/[nex]/nexdev_djsystem/.
  2. Add it to your server.cfg after its dependencies:
  3. Add the ACE permissions:
    See Permissions for what each one grants and how to hand the builder role to someone who isn’t a full admin.
  4. Start your server. The database tables are created automatically on first start — no SQL to run.
  5. Replace the soundboard URLs. config/soundboard.lua ships with placeholder https://cdn.yourserver.com/... addresses that resolve to nothing. See Soundboard.
That’s it — the four shipped booths appear on the map.
Step 5 is not optional if you want the soundboard. Every shipped clip URL is a placeholder and will silently do nothing until you point it at real files you host.

The database

You do not need to import any SQL. The script runs CREATE TABLE IF NOT EXISTS for all three tables on start. install.sql sits in the resource root for reference, for DBAs who prefer to provision schema out of band, and for backup and restore. It is not required. If the database is unreachable the script still runs — config booths load and playback works. Only the persistence features (saved booths, playlists, audit rows) report “the database is unavailable” and refuse. The audit table is never pruned automatically. If you want that, schedule it yourself:

Configure

Work through these in order:
  1. config/config.lua — keybind, command, framework, audio defaults, permissions, security limits, UI defaults.
  2. config/locations.lua — delete the shipped booths you don’t want, add your own.
  3. config/soundboard.luareplace every placeholder URL.
  4. config/effects.lua — lighting presets and defaults. Usually fine as shipped.
See Configuration.

The Discord webhook

The webhook URL is not a config key, because config/config.lua is readable by every connected client. Set it as a server-only convar in server.cfg instead:
Use set, never setr. setr replicates the value to every client, which leaks your webhook URL to anyone connected.
Leave it unset to disable webhook logging entirely.

Checking it worked

On a healthy start the server console prints:
Walk to one of the shipped booths and press F7 (or run /dj). The panel should open with the booth’s name in the header. From F8:
Should print started. If it prints missing or stopped, fix server.cfg and restart.

Updating

Your booths, playlists and logs all live in MySQL and are preserved automatically. Booths you added to config/locations.lua, and every other file under config/, are yours — keep your edited copies when you replace the resource files.
  1. Replace the resource files with the new version, keeping your edited config/ files.
  2. Restart the server.
The script checks for updates on start and prints a notice in the server console when a newer version is available.