FAQ

Common questions from install and operations.

Modern Control — Customer Installation Guide

This guide walks a new customer from first sign-in to a live, staff-ready server.

You do not need to edit source code, touch the database, or modify backend files. Everything is done through the dashboard UI and your GMod server console.

---

Overview

1. Sign in (credentials issued with your purchase)
2. Create your organization (Settings)
3. Confirm your license (Platform → License)
4. Add your server and copy the pairing JSON
5. Install the agent addon on your GMod server
6. Paste the pairing config and restart
7. Confirm the server appears Online
8. Invite staff (share invite link — not emailed)

---

Step 1 — Sign in

  1. Open your Modern Control dashboard URL (provided after purchase).
  2. Sign in with the owner credentials issued to you.
  3. There is no public Sign up page — accounts are provisioned with your license.
Lost credentials? Contact Modern Control support. Password recovery by email is not available in this release.

---

Step 2 — Create your organization

  1. Go to Settings (sidebar footer / account menu).
  2. Under Organizations, enter a name and short slug (e.g. name Neon Networks, slug neon-networks).
  3. Click Create organization. You become the organization Owner.
One organization per license. Independent communities need separate accounts and licenses.

If you already belong to an organization, skip this step.

---

Step 3 — Confirm your license

  1. Go to Platform → License.
  2. You should see an Active (or Grace) license with available seats.

Licenses are issued when you purchase. If the page is empty, contact support — do not try to “buy” from the panel (self-serve purchasing is not available yet).

---

Step 4 — Add a server in the dashboard

  1. Go to Platform → Servers.
  2. Click Add Server, enter a display name (e.g. Neon US #1), and continue.
  3. The wizard shows a pairing JSON block — copy it in full. It contains a one-time pairing code.
The pairing code expires in 30 minutes and can only be used once. If it expires, use New code / Re-pair on the server card.

---

Step 5 — Install the agent addon

  1. Locate the modern_darkrp_control folder in your customer package.
  2. Copy the entire folder into:

```

garrysmod/addons/modern_darkrp_control/

```

The final path should look like:

```

garrysmod/

└── addons/

└── modern_darkrp_control/

├── addon.txt

└── lua/

└── ...

```

  1. Do not install the server/ development tree or dashboard/ source. Only the modern_darkrp_control addon folder is required.
Workshop alternative: If Modern Control is on the Workshop, subscribe and let the game download it automatically. Skip this step if so.

---

Step 6 — Paste the pairing config

  1. Create the folder garrysmod/data/modern_darkrp_control/ on your server if it does not exist.

> On first startup without a config, the agent creates a disabled template. Do not use that template as-is — always paste the JSON from the dashboard.

  1. Create (or replace) the file:

```

garrysmod/data/modern_darkrp_control/config.json

```

  1. Paste the JSON you copied from Step 4 into that file and save it.

A valid config looks like:

```json

{

"apiUrl": "https://your-dashboard.example.com",

"setupUrl": "https://your-dashboard.example.com/management/servers",

"dashboardUrl": "https://your-dashboard.example.com",

"serverId": "srv_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",

"pairingToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",

"secret": "",

"heartbeatSeconds": 10,

"commandPollSeconds": 5,

"enabled": true

}

```

> secret starts empty — it is filled in automatically after pairing. Never share this file once it contains a secret.

---

Step 7 — Restart the GMod server

Restart the server fully (or run changelevel <current_map>).

Watch the server console. Successful pairing looks like:

[Modern Control] Pairing with dashboard…
[Modern Control] Pairing complete — starting agent
========================================
MODERN CONTROL — AGENT ONLINE
Agent 0.9.x  [CURRENT]
ServerId: srv_xxxxxxx…
API:      https://your-dashboard.example.com
Dashboard:https://your-dashboard.example.com
License:  enforced by dashboard (secrets never printed)
========================================

If you see MODERN CONTROL — NOT PAIRED instead, confirm config.json is the dashboard JSON (not the empty template), enabled is true, and the pairing code has not expired. Open the Setup URL printed in the console (your dashboard Servers page).

---

Step 8 — Confirm Online in the dashboard

  1. Return to Platform → Servers.
  2. Within about 30 seconds the server card should show Online.
  3. Select the server in the header and open Overview / Live Ops for live data.

Pairing is complete. The pairingToken in config.json is cleared automatically and a permanent secret is written in its place.

---

Step 9 — Invite staff

  1. Go to Administration → Staff.
  2. Enter a label for the invite (name or email for your records), choose a role (Admin / Moderator / Viewer), and click Create invite.
  3. Copy the full invite URL shown once. Invites are not emailed — you must send the link yourself (Discord, etc.).
  4. The invitee must already have a Modern Control account, sign in, then open the invite link to join your organization.
Invite links expire (typically within 48 hours). Staff only see servers you grant them.

---

Updating the agent

When a new agent version is released:

  1. Replace the modern_darkrp_control addon files with the new package.
  2. Keep garrysmod/data/modern_darkrp_control/config.json — it contains your permanent secret. Do not delete it unless you are intentionally re-pairing.
  3. Restart the server (or changelevel).

The dashboard version indicator updates on the next heartbeat.

---

Rotating credentials

If you suspect your agent secret has been compromised:

  1. Go to Platform → Servers.
  2. On the server card, click Rotate secret.
  3. Copy the new secret (shown once). The previous secret stays valid for a short overlap window.
  4. Update the secret value in config.json and restart (or wait for the agent to pick up the file if you replace it carefully).

Alternatively use Re-pair / New code to issue a full pairing JSON again.

---

Moving to a new host

  1. In the dashboard: Platform → License → Transfer host (or Platform → Servers → Re-pair for a fresh pairing code).
  2. Old credentials are invalidated when you complete transfer / re-pair as directed.
  3. Install the agent on the new host, paste the new config (Step 6), and restart.

Historical data (punishments, logs, detections) is retained.

---

Disconnecting a server

Disconnect stops the agent and invalidates credentials for that server. Historical data is kept. To reconnect later: Reconnect on the server card, issue a new pairing code, and repeat Steps 6–8.

---

Troubleshooting

Quick diagnostics — run these in your server console

mdrp_status

Shows: agent version, enabled flag, API URL, paired status (hasSecret=true), last heartbeat OK time, last error.

mdrp_start

Manually retries pairing / starts the agent without a full restart.

---

Symptom table

| Symptom | Cause | Fix |

|---------|-------|-----|

| MODERN CONTROL — NOT PAIRED | Config missing, template left empty, or enabled=false | Paste dashboard JSON; set "enabled": true |

| Pairing FAILED: … 410 | Pairing token expired | Issue a new pairing code (New code / Re-pair) |

| Pairing FAILED: … 409 | Token already used (restart loop) | Issue a new pairing code |

| Pairing FAILED: … 403 | License seat limit reached | Contact support to expand your license |

| heartbeat failed: … 401 | Wrong serverId or secret | Rotate secret or Re-pair |

| heartbeat failed: connection refused | Game host cannot reach apiUrl | Check firewall; confirm apiUrl is your public dashboard URL |

| heartbeat failed: … 403 / 423 | License suspended or revoked | Contact Modern Control support |

| Server stuck Connecting | Heartbeat incomplete / config mismatch | Run mdrp_status; check last error |

| Dashboard shows Outdated / INCOMPATIBLE | Agent behind expected version | Update the addon package |

| Optional addon Not detected | You do not run that integration | Normal — no action needed |

| -allowlocalhttp error | Private URL blocked by GMod | Only for local testing: add -allowlocalhttp to startup |

---

Agent version compatibility

| Badge | Meaning |

|-------|---------|

| CURRENT | Up to date |

| UPDATE AVAILABLE | Slightly behind — update recommended |

| INCOMPATIBLE | Too old — update required |

| UNKNOWN | Version could not be determined |

---

Console messages reference

| Message | Meaning |

|---------|---------|

| MODERN CONTROL — FIRST RUN | Empty template written; paste dashboard JSON next |

| MODERN CONTROL — NOT PAIRED | Missing serverId, secret, or pairing token |

| Pairing with dashboard… | One-time pairing in progress |

| Pairing complete — starting agent | Pairing succeeded |

| MODERN CONTROL — AGENT ONLINE | Heartbeat / command poll running |

| heartbeat failed: … | Transient error — agent retries with backoff |

| Agent disabled (config.enabled != true) | Explicitly disabled in config |

---

Advanced / operator notes

  • Protocol and HMAC details: docs/DEPLOYMENT.md
  • License model and seat limits: docs/LICENSING.md
  • RBAC roles: docs/OPERATIONS_RBAC.md
  • Panel database backups (not GMod sv.db): docs/BACKUPS.md