Jixryo MDT

The police MDT on the Jixryo Tablet. Cases, reports, warrants, dispatch calls, a live map, the department's cameras and a weapons registry, with every change reaching every open MDT at once.

Version 2.2.1 Updated See it on its script page

On this page

Jixryo MDT is the police department's mobile data terminal, an app on the Jixryo Tablet. Everything Jixryo Evidence records shows here, the department's security cameras (Jixryo Cameras) sit inside it, and every change any officer makes reaches every open MDT at once. It replaces lb-tablet's MDT for police work. It is tablet only and never shows on the phone.

What players get

Officers on duty in a police job get the MDT tile on the tablet. /mdt brings the tablet out on it from an emergency vehicle, or anywhere with the tablet item in their pockets.

  • Top bar. Search over everything at once (people, plates, cases, reports, gun serials and evidence codes), the clock, the panic button, the bell, and your unit (callsign and status, set with a tap).
  • Panic button. Hold it for a second; a tap does nothing. Every other officer's tablet and bell is told, a 10-99 call opens where you stand, and a dispatch blip goes into every officer's game. It can be pressed again after 15 seconds.
  • The bell. Warrants, BOLOs, stolen cars and guns, reports to review, bulletins, points that call for a suspension, camera damage and urgent calls. Tapping a line opens its record.
  • Live map. The suite's own map of San Andreas, dark and in the suite's look. Every unit on duty is an arrow turned the way they face, in their status colour, with their callsign. The open calls are pins coloured by priority, and the department's cameras and the area names are on it too. Drag to pan, wheel to zoom, Find me and Everyone, layers on and off, and a card for anything you pick: GPS to a unit, respond to a call, watch a camera.
  • Calls. The dispatch calls: open ones (urgent first, then newest) and the latest closed. A call shows its code and title, where it is and how far from you, who raised it, its message, and the units on it with their notes. Respond puts you on it (and off any other call), sets you en route and sets your GPS. You can leave it, add notes, link or open a case, and close it with how it ended. A new call of your own starts from a preset (traffic stop, suspect in custody, suspicious vehicle, backup, pursuit, shots fired) or your own words, at where you stand. A call nobody is on closes on its own after 30 minutes.
  • Dispatch cards. Every new call also shows on each on-duty officer's screen, MDT open or not, as a card in the notification stack under the radar: code, title, street and area, what was said, how far and which way from where you look, and how many units are on it. The newest card carries the respond key (Y by default). Urgent cards stay 30 seconds, medium ones 20, low ones 15. Whoever raised a call gets no card of it.
  • Dashboard. Counts that open their pages (open calls, units on duty, open cases, active warrants, BOLOs, reports to review, bookings today, impounded vehicles, cameras online), quick actions, the open calls, pinned and new bulletins, your own open cases and drafts, reports waiting for you if you review them, the units on duty, the cameras, and the newest bookings and lab results.
  • People. Search by name, citizen id or phone. A profile has the flags officers set (armed and dangerous, violent, flight risk, gang affiliated, on parole, mental health, missing person), shared notes, licences to suspend or give back, points on the licence, mugshots with prints and DNA, every booking and warrant, the cases and reports they are in, their vehicles and registered weapons, their associates and a gallery of evidence photos. Points go on 1 to 6 at a time, the last 30 days count, and at 12 every officer's bell says the driver licence should go. With Jixryo Prison running, "In Bolingbroke" shows with the inmate number, cell and months left.
  • Vehicles. Search by plate, or open the impound lot. A vehicle shows its owner, flags (stolen, wanted in a case, seized, no insurance), notes, cases, BOLOs on the plate and prints left on its handles. Impounding takes a reason, a hold of up to 168 hours and a fee of up to $50,000 and adds the Seized flag; releasing takes it off. It is an MDT record only: the tow itself belongs to your garage script.
  • Weapons. Every gun bought in a shop goes on the registry as it is sold, with its serial, buyer, model and shop. Officers register guns found with no record. Search by serial, owner or model; flag one stolen, lost, seized or destroyed. Reporting one stolen tells every officer once.
  • Reports (R-26-0001). Seven types, each opening with its own headings: incident, arrest, use of force, traffic stop, field interview, investigation and supplemental. A report holds its people (suspects, victims, witnesses, officers), plates and evidence codes, and can sit on a case. Only the author writes it, two saves at once never wipe each other, and it can be submitted once something is written beyond the headings. A supervisor approves it, which locks it, or sends it back with a note. Nobody reviews their own.
  • Cases (26-0004). Opened with you as lead where you stand. A case has a narrative, people, evidence by code (each gets a custody line and shows its lab result), photos from the cameras' SD cards, charges per suspect with counts, reports, vehicles, and a log of every change and who made it. Any officer works an open case; a closed one is read only until it is opened again.
  • Evidence. Every record Jixryo Evidence keeps, searchable by code, label, collector, case or bag, with its chain of custody, lab results and the sealed bag it was logged in. A Sealed bags tab lists every bag with what is in it and whether it is sealed, opened or torn.
  • Warrants and BOLOs. A warrant names a person, why, the charges and how long it stands (1 to 30 days), with a case if you like. Every officer is told, and booking the person serves it on its own. A BOLO is a vehicle with a plate or a person to look out for. The page lists the active ones; All brings back the served, recalled and expired warrants and the closed BOLOs.
  • Bulletins. Notices (notice, important, urgent, good news), with the ones that matter pinned on top and on the dashboard. Every officer is told. The newest 60 unpinned ones are kept.
  • Roster. Everyone on duty in a police job: callsign, status (available, en route, on scene, busy, on break) and how long they have been on. Time on duty is kept per session, and you see your own hours this week.
  • Cameras. The department's city cameras, with Jixryo Cameras: online or why not, where each one is, Watch (the feed takes the screen and Esc brings the MDT back), rename, and the activity as it happens.
  • Penal code. The charges booking uses, searchable.
  • Booking joins it up. At the Jixryo Evidence booking desk the person's open cases are offered. Picking one ticks its charges, counts included; the booking joins that case and their active warrants are served.

What staff get

  • Grades decide the powers. Issuing a warrant, recalling someone else's and changing licences open at grade 2. Approving or returning reports, posting bulletins and closing a call you are not on open at grade 3. Deleting a case, seeing everyone's hours and deleting others' reports and bulletins open at grade 4. The grades are yours to set.
  • Staff use it without a police job. Players with group.god, group.admin or jixryo.mdt.admin open the MDT off duty and have every power. They also put department cameras up from the Cameras page; Jixryo Cameras checks its own staff list for that (group.god, group.admin, jixryo.security.admin).
  • An audit trail. Cases opened, closed and deleted, warrants issued, served and recalled, flags, licences and points, impounds and releases, reports approved, returned and deleted, bulletins, registered guns, closed calls and the panic button all go to the suite's audit log through Jixryo Core, and to its Discord webhook when one is set.
  • Nothing runs idle. The client relays the page's calls and the server's pushes. One thread keeps a dispatch card's distance and arrow current while it shows. The server runs two loops once a minute: one matches duty sessions to who is on duty, the other closes calls nobody is on.

Install

  1. What it replaces. lb-tablet's MDT. lb-tablet itself can stay installed, but this one is now the police's, so tell your officers.

  2. Order. Start it after Jixryo Core (its dispatch hands every alert to the MDT's calls), the tablet, Jixryo Evidence and Jixryo Cameras 1.1.0 or later (the MDT's camera exports). It works without Jixryo Evidence (no evidence, lab, booking or penal code) and without Jixryo Cameras (no Cameras page).

    server.cfg
    ensure jixryo_core
    ensure jixryo_tablet
    ensure jixryo_evidence
    ensure jixryo_security
    ensure jixryo_mdt
  3. Jobs and grades. Config.app.jobs decides who sees the tile and Config.access.groups who may use it. Both are police, sheriff, bcso and sasp, on duty; set them to your job names. Config.grades sets the lowest grade for each power (the Configuration table below).

  4. Items. None of its own. /mdt outside an emergency vehicle needs the tablet item (jixryo_tablet by default) in your pockets.

  5. Weapons from shops. Config.weaponsFromShops = true writes every gun sold into the registry. ox_inventory gives shop weapons a serial by default. Set it to false to register guns by hand only.

  6. Calls from your other scripts. These reach the Calls page on their own: every Jx.dispatch alert from Jixryo Core, scripts that fire cd_dispatch:AddNotification from the player's game, and qbx_police's officer-down alert. /911p needs the one line the Jixryo qbx_police patch adds in its server/commands.lua; the patch notes in that fork name it. Alerts cd_dispatch raises inside itself, and scripts that send straight to officers' games, never pass through the server and cannot reach the MDT; such a script calls the AddCall export instead.

  7. Dispatch cards need the Jixryo ox_lib fork (its notification stack and page) and look best with Jixryo HUD 2.0, whose radar the stack sits under. Without the fork the cards simply do not show.

  8. Database. The tables create themselves on a full restart: jixryo_mdt_cases, _case_people, _case_vehicles, _case_photos, _case_charges, _log, _profiles, _vehicles, _warrants, _bolos, _reports, _report_people, _bulletins, _weapons, _impounds, _points, _duty and _calls. The page and the map's tiles (web/build/map, about 4 MB) are already built.

  9. Restart the whole server, not just the resource.

How other scripts' calls behave

  • It answers as itself only. Its exports live under jixryo_mdt. It answers no other MDT's export or event names.
  • It listens for the server event jixryo_core:dispatched (fired for every Jx.dispatch.alert), the net events cd_dispatch:AddNotification and police:server:policeAlert from players' games, the server event jixryo_security:server:deptTamper (taken only when Jixryo Cameras fired it), and QBCore:Server:SetDuty and playerDropped for the duty sessions.
  • Other jobs' calls stay out. A call listed for other jobs only, an ambulance call for one, never shows.
  • cd_dispatch keeps its blips. The suite's alerts still reach cd_dispatch; the MDT adds the call beside them, and the panic button sends a blip through it.
  • It uses the tablet's AddApp, Notify, SendAppMessage, Open and SoundsOn; Jixryo Prison's GetInmate on profiles; Jixryo Evidence's GetPenalCode, SetCase and AddCustody; Jixryo Cameras' MdtCameras, MdtCameraSummary and MdtRenameCamera on the server and WatchCamera and InstallDepartmentCamera on the client; and ox_inventory's buyItem hook for the registry.

Its own API

Server exports:

ExportWhat it does
OpenCasesFor(cid)Open cases this person is a suspect in, with the charges proposed for them: { { number, title, charges = { { code, count } } } }. Booking offers these.
Booked(bookingId, cid, name, caseNumber, officer, months)What Jixryo Evidence calls after a booking. The booking joins the case when the person is a suspect in that open case, and their active warrants are served. Returns { linked, served }.
HasWarrant(cid)true when the person has an active warrant.
IssueWarrant(cid, name, reason, by, days)A warrant from another script (the prison, on an escape). Every officer is told. Returns its id.
AddCall({ title, message, code, priority, coords, source, jobs, from })A dispatch call; returns its id, or nothing when it has no place. priority is low, medium or high (high rings every tablet). source is citizen for a 911 call. jobs lists police jobs or is left out. from is the player who raised it, so their limit applies. Call it from a thread: it writes to the database.

Events:

EventDirectionWhat it carries
jixryo_mdt:client:changedto everyone who may use the MDT{ kind, id } for a record that changed; an open page reloads what it shows
jixryo_mdt:client:callto on-duty officersa call for the dispatch card: new, changed or closed
jixryo_core:dispatchedlistened, servera suite alert becomes a call
cd_dispatch:AddNotification, police:server:policeAlertlistened, from players' gamesa call, within the per-player limit and reach
jixryo_security:server:deptTamperlistened, server onlya damaged department camera goes on every bell

The page's own calls are jixryo_mdt:server:<name> callbacks. They are not an API, and the server checks every one.

Commands and keybinds

Command or keyWhoWhat it does
/mdtpolice on duty, in an emergency vehicle (class 18) or with the tablet item in their pocketsBrings the tablet out on the MDT. Config.command = false turns it off.
Y (mdt_respond, "Respond to the newest dispatch call")an on-duty officer with a dispatch card on screenPuts you on that call, en route, with the GPS set. Players rebind it in GTA's key settings under FiveM.

Configuration

Every value the server decides with lives in config.lua. The penal code is Jixryo Evidence's, so booking and the MDT never disagree about a charge.

KeyDefaultWhat it does
appname MDT; jobs police, sheriff, bcso, saspThe tile on the tablet and the jobs that see it
accessthe same jobs from grade 0, on duty; ACEs group.god, group.admin, jixryo.mdt.adminWho may use it
gradeswarrant 2, recall 2, licences 2, approve 3, bulletin 3, calls 3, deleteCase 4, command 4The lowest grade for each power
command'mdt'The command; false turns it off
tabletItem'jixryo_tablet'The item that allows /mdt outside an emergency vehicle
flags7 person, 4 vehicle and 4 weapon flagsThe flags, each with a label and a tone
licencesdriver, weapon, id, business, hunting, fishingWhich qbx_core licences a profile shows
pointsmax 6, days 30, suspendAt 12Points at a time, the days that count, the total that calls for a suspension
caseKinds13 kinds, Robbery to OtherThe kinds of case
reportTypes7 types with their headingsThe report types and the headings each starts with
statusesavailable, enroute, onscene, busy, breakUnit statuses on the roster
impound7 reasons, maxHours 168, maxFee 50000Impound reasons, the longest hold, the highest fee
bulletinsbody 1200, keep 60Longest bulletin, how many unpinned ones are kept
alertskeep 40How many lines the bell keeps
warrantDaysdefault 7, max 30How long a warrant stands
photoDays14How far back evidence photos are offered to a case
limitssearch 25, list 60, narrative 8000, notes 2000Search results, list length, narrative and notes length
weaponsFromShopstrueShop sales go on the weapons registry
calls.keepMinutes30A call nobody is on closes on its own after this
calls.recent25Closed calls the page lists
calls.notes30Notes on one call
calls.reach300A call a player's game puts further than this from them is put at them
calls.perPlayercount 3, seconds 20Calls one player's game may raise
calls.presets6 presets, 10-11 traffic stop to 10-71 shots firedAn officer's own calls
calls.paniccode 10-99, cooldown 15The panic button's call and its cooldown
calls.cardstrueDispatch cards on or off
calls.cardkey Y; duration high 30000, medium 20000, low 15000The respond key's default and how long each card stays, in milliseconds
map.refresh3Seconds between position updates while the map is open
camerastrueThe Cameras page; needs Jixryo Cameras

Security

  • Every call is checked on the server: on duty in a police job or staff, a rate limit per call, and the grade for each power. The tile's job list only decides who sees it.
  • Inputs are cleaned. Lengths are capped. Flags come only from the config list and charges only from the penal code. Plates are normalised, and points and impound values stay in range. Search terms are taken literally (% and _ are not wildcards). Every query is parameterised.
  • Reports. Only the author writes a draft. A submitted report waits for a supervisor of the grade, an approved one never changes again, and nobody reviews their own (staff aside). A save over text that changed meanwhile is refused and the saved text comes back.
  • Bulletins need the grade to post and pin; only the author or command takes one down.
  • Hours this week go only to the officer and to command.
  • Calls. A call from a player's game is trusted only as far as cd_dispatch or qbx_police trusts it: 3 per player in 20 seconds, moved to the player when it puts itself more than 300 m from them, and other jobs' calls left out. Responding, notes and closing are checked on the server: on duty, one call at a time, closing only on the call or with the grade. The panic button has a 15-second cooldown. Cards go only to players who may use the MDT right now, and the respond key sends the same call the page's Respond does.
  • The live map sends the server's own positions, and only to officers on duty and staff.
  • Cameras. Jixryo Cameras checks the officer again on every camera call (their own department on duty, or staff), and a staff install is checked there too (staff, a real police department, the placement rules). Camera damage reaches the bell only from Jixryo Cameras' server, checked by the resource that fired the event, never from a client.
  • Charges go only on suspects in the case, and booking links a case only when the person is a suspect in it and it is open.
  • A bag is in one case only. Moving it takes it off the first case, and both steps are written into its chain of custody.
  • Licences change only on a person in the city; the page cannot set another player's metadata.
  • Audited through Jx.audit: mdt.case_open, mdt.case_status, mdt.case_delete, mdt.warrant, mdt.warrant_served, mdt.warrant_recalled, mdt.profile, mdt.vehicle, mdt.weapon, mdt.weapon_register, mdt.licence, mdt.points, mdt.impound, mdt.impound_release, mdt.report_approve, mdt.report_return, mdt.report_delete, mdt.bulletin, mdt.call_close and mdt.panic.

Tests

dev-tools/luarun/tests/jixryo_mdt.lua runs the real server on a real database (SQLite running the resource's own SQL and migrations), with Jixryo Core's real validate, perm, db, dispatch and rate modules. Run on 2026-10-31: 21 passed, 0 failed.

They cover who may use it and the grades; reports and their review; deleting reports; bulletins and their trimming; the shop hook and the weapons registry; impounds; points; warrants and BOLOs with All; the search, wildcards included; the dashboard; time on duty and who sees it; the cameras through stand-ins with Jixryo Cameras' real answer shapes; calls coming in from the suite's real dispatch module, cd_dispatch and qbx_police, with ambulance calls left out, the per-player limit, the reach check and AddCall; responding, notes, cases and closing; officers' calls and the panic button; the live map; calls closing on their own; dispatch cards and who gets one; and the card in an officer's game against the real server, Y included.

bash
cd dev-tools/luarun
node run.mjs ../../jixryo_scripts/jixryo_mdt tests/jixryo_mdt.lua

The README also records that each guard was checked by breaking it (27 mutations, all caught) and that the built page was run with every answer taken from the server in those tests.

Check it in game

Two officers A and B, a sergeant S of grade 3, and a civilian C.

  1. A and B go on duty. The MDT tile is on the tablet, and /mdt in a police car opens it. Off duty it says "Go on duty to use the MDT."
  2. A sets a callsign and En route from the unit menu; B's roster shows it at once. Type part of C's name in the search: C and their car show, and Enter opens the hit.
  3. Open C. Set Armed and dangerous and write a note; B sees both. Add 6 points, then 6 more: everyone's bell says to suspend the licence.
  4. Buy a pistol as C. Its serial is on the registry, owned by C. Flag it stolen: B's tablet and bell say so.
  5. Impound C's car (Evidence, 24 h, $500). It is in the impound lot and flagged Seized. Release it and the flag goes.
  6. A starts an arrest report: it opens with its headings. Add C as suspect and the plate, write what happened, submit. S's bell says Report to review. S sends it back with a note, A is told and edits it, A submits again, S approves it, and it cannot change any more.
  7. S posts a pinned bulletin: everyone is told and it sits on top of the dashboard. A, at grade 1, has no Post a bulletin.
  8. A opens a case, adds C as suspect, B as officer and charges with counts, and puts the report on it. A warrant for C (grade 2 or more) notifies B. Book C at the desk: Charges offers the case, picking it ticks the charges, and booking serves the warrant.
  9. Cameras: put a department camera up, watch it (Esc brings the MDT back), walk past it (the activity shows the person), shoot it (offline, damaged, and on the bell).
  10. Roster: A sees their own hours this week, not B's. A grade 4 officer sees everyone's.
  11. Live map: A and B both show where they are, turned the way they face. B drives off and A's map follows B along the roads. Line the map up against the game's pause map in one place to confirm the two agree.
  12. Rob a store, or raise any Jx.dispatch or cd_dispatch alert. The call shows on Calls and the map, and an urgent one rings every tablet. B responds (GPS set, en route, on A's map), notes it and closes it. With the qbx_police patch, /911p from C shows a 911 call.
  13. A holds the panic button: B's tablet and bell ring, a 10-99 shows on Calls and the map, and cd_dispatch puts its blip in B's game. A short tap sends nothing.
  14. With the Jixryo ox_lib fork and Jixryo HUD 2.0, A raises a call from the Calls page. B gets a card under the radar (A does not), with the street, the distance and an arrow that turns as B looks around. B presses Y: the card turns green, B is en route and the GPS is set. S closes the call and B's card says Closed.
  15. resmon 1: 0.00 ms idle on the client, with the MDT closed or open on any page but the map.
Next step

Ready to look around?

Browse the suite, or paste your server.cfg and see what each script does to your server.