Multi-tenant public safety platform

Run a department, not a folder of resources.

Nexsoft is the complete public safety stack for FiveM roleplay communities: the game framework, the member portal, a dispatch console, a mobile data terminal, records management and a working NCIC. One platform, and every community on it gets its own.

One deployment, many communities Isolated by schema, not by policy Self-hosted or managed
Summit RP  ·  DispatchORI SA0000001
Units — 9 on duty
1A-12Reyes, M.10-97
1A-14Okonkwo, D.10-76
2B-03Whitfield, J.10-8
2B-07Lindqvist, A.10-8
3C-21Barrow, T.10-7
K9-4Sandoval, R.10-8
SUP-1Achebe, N.10-97
E-31Station 3RESP
M-12Medic 12AVAIL
CFS #CodeNatureAssigned
25-00418210-31Crime in progress — Vinewood Blvd1A-12, SUP-1
25-00418110-50Traffic collision, injuries — Route 681A-14, M-12
25-00417910-16Domestic disturbance — Grove St2B-03
25-00417610-66Suspicious person — Legion Squnassigned
25-00417410-70Structure fire — Popular StE-31
25-00417110-55Impaired driver — Del Perro Fwy3C-21
25-00416810-90Alarm, commercial — Rockford Plaza2B-07
25-00416510-27Licence check — Sinner StK9-4
25-00416310-52Medical, unresponsive — Mirror ParkM-12
Next number
CFS #
4182
LEO #
2907
Fire #
0416
EMS #
0973
Tow #
0288
Warrant #
0154

The platform

Six systems that already know about each other.

Most communities assemble this out of a dozen unrelated resources and a spreadsheet, then spend every week keeping them in step. Here the unit on the dispatch board, the officer filing the report and the record NCIC returns are the same rows in the same database.

In-game

Framework

The C# game framework the server itself runs on — characters, jobs, vehicles, inventory, permissions. Every front-facing string reads from one branding file, so a rename is one edit rather than four hundred.

Web

Portal

Where members live between shifts. Rosters, duty status, applications, training records, discipline and department administration, all scoped by the role someone actually holds.

Dispatch

CAD

The dispatcher’s console. Live unit status, the call queue, self-dispatch, attach and clear — modelled on the Sundance terminals down to the field layout and the shape of the buttons.

In-vehicle

MDT

The terminal in the car. Current call, call list, queries and report filing from the driver’s seat, without leaving the world to go and find a browser tab.

Records

RMS

Arrests, citations, warnings, incident reports, crash reports, tow reports. Ten forms, versioned and searchable, attached to the people and vehicles they concern rather than to a channel in Discord.

OpenFox

NCIC

A working replica of OpenFox Messenger. Warrants and BOLOs entered with real message keys — QW, EW, QV, XW — and responses arriving in a mailbox, the way they do in a comms centre.

Tenancy

One community cannot see another.

Not by policy — by shape. Most multi-tenant systems put a where clause between customers and trust every query to remember it. Nexsoft puts the tenant in the key. Every foreign key carries the community alongside the row, so a record in one community is incapable of referencing a record in another. The database refuses it before a single policy is consulted.

  • Composite foreign keys on every tenant-owned relation, making a cross-tenant reference a constraint violation rather than a bug waiting to be found.
  • Row-level security across all 79 tables, evaluated from a claim inside the signed session token.
  • Vendor and customer roles kept apart. There is no permission a community administrator can be granted that reaches outside their own community.
  • An audit trail recording who changed what, retained per tenant and readable by them.
schema · arrests
-- an arrest may only reference a character
-- belonging to the same community
alter table arrests
  add constraint arrests_character_fkey
  foreign key (community_id, character_id)
       references characters (community_id, character_id);

-- so this is not a policy decision.
-- it is a type error.
insert into arrests (community_id, character_id)
values (2, 41);

ERROR:  insert or update on table "arrests"
        violates foreign key constraint
        "arrests_character_fkey"
79Tables
231Row-level policies
90API endpoints
10Report forms
nexsoft.json
{
  "publicName": "Summit RP",
  "shortName":  "SummitRP",
  "tag":        "SRP",
  "website":    "https://summitrp.gg",
  "discord":    "https://discord.gg/summit",
  "syncFromPortal": true
}

The game server

Rebrand the entire server by editing one file.

The framework came out of a decade-old codebase with one community’s name compiled into hundreds of files — menu titles, webhooks, namespaces, embed footers. Every front-facing string now reads from a single config, published to every resource as a replicated convar the moment the server starts.

  • One file, every resource. Convars replicate to clients, so the menu header and the Discord embed agree without either knowing about the other.
  • Or drive it from the portal. Turn on syncFromPortal and branding follows the tenant record, no file edit and no restart.
  • C# on Mono, the same framework the game server already runs — not a rewrite anyone has to migrate to.

Bring your community onto Nexsoft.

Nexsoft is in private development with its first tenant running in production. If you operate a serious roleplay community and want in early, say hello.