Installation
Prerequisites, load order, admin ACE, your first lit vehicle, and the shipped file layout.
Prerequisites
| Requirement | Detail |
|---|---|
| FiveM | OneSync enabled (Infinity or Legacy). State syncs through entity state bags |
| tLib | 1.0 or newer, free — download |
| Lua | 5.4, already declared in the manifest |
| Node | 22, already declared in the manifest |
| pma-voice | Optional. Only the PA mic needs it |
Install
Extract the resource
Drop the folder into resources/, named exactly tLS — no spaces, no -main suffix.
Start tLib before tLS
server.cfg
ensure tLib
ensure tLSGrant the admin ACE
add_ace group.admin tlib.admin allowGrants /tlsedit, Set as Server Defaults in /tls, and the editor button.
Start the server
tLS creates data.json at the resource root on first run.
Confirmed when /tls opens in game and the console shows no tLib version warning.
Your first lit vehicle
Five minutes, on a stock vehicle. You need the tlib.admin ACE and a vehicle with
siren1…sirenN bones — police4 has them.
Spawn police4 and get in
Any seat.
Run /tlsedit
The editor opens on the Lights tab with an empty LED list.
Click Create from siren bones
tLS drops a starter LED on each siren bone, grouped and sided. They appear in the sidebar
and on the lightbar.
Add a pattern
Patterns tab → Add Pattern. Set 10 FPS, add Red and Blue to the palette, paint alternating columns.
Press Enter to save
The config writes to data.json and the editor closes.
Drive it
| Key | Does |
|---|---|
| Q | Lights on and off |
| R | Siren burst while held |
| 9 / 0 | Step through patterns |
It works if Q lights the vehicle for you and for a player standing next to it. Lit for you only means state is not replicating — check OneSync in Troubleshooting. Q doing nothing means the vehicle has no LEDs saved; every keybind needs at least one.
From here, the Editor covers placing LEDs by hand, building rules and configuring sirens.
Version compatibility
| tLS | Requires tLib | Notes |
|---|---|---|
| 1.0.x | 1.0 or newer | Enforced at load by tlib_min_version in the manifest |
On a version warning, update tLib — not tLS.
File layout
tLS
shared
config
server
client
| Path | Purpose |
|---|---|
shared/ | UUIDs, model fingerprints, audio banks, siren profiles, LED geometry, and the two scripts that validate config/ |
config/render_config.lua | LED cap and bloom bounds. Outside escrow — editable |
config/pa_config.lua | PA presets. Inside escrow |
server/dist/ | Bundled server logic |
server/sv_configs.lua | Discovery, ref-edit relays, server defaults |
server/sv_relay.lua | State bag ownership and remote state sync |
client/cl_lights.lua | Pattern playback and stage state |
client/cl_triggers.lua | Trigger condition evaluation |
client/cl_siren.lua | Siren tone playback |
client/cl_model_leds.lua | Model-defined LED marker discovery |
client/cl_arges.lua | Arges spotlight props |
client/cl_pa.lua | PA mic (pma-voice) |
client/cl_env.lua | Startup environment line and tls_diag |
client/cl_hud.lua | HUD overlay and the /tls dialog |
client/cl_marketplace.lua | Marketplace tab |
client/cl_input.lua | Keybinds, commands, park-kill thread |
client/cl_deck.lua | Stream Deck key feed and button dispatch |
client/cl_editor.lua | NUI editor bridge |
client/ui/ | Built NUI assets |
layouts/ | HUD layouts, auto-discovered |
audio/ | Custom siren sounds (awc + dat54) |
stream/ | Arges props, Legacy (gen8). Carries the .ytyp the manifest names |
stream_enhanced/ | The same props, Enhanced (gen9). The engine picks per asset, per client |
data.json is written on first boot, not shipped. A copy missing anything else is an
incomplete download.
Optional: help us fix tLS
tLS does not report its own faults to us. When it throws on your server the error sits in your console, and unless someone opens a ticket we never learn it happened — which means the bugs nobody reports are the ones that stay.
One line opts in, in server.cfg above ensure tLib:
set tlib_telemetry 1That sends errors, warnings, renderer crashes and slow-operation outliers from
our own code. No IP, no licence key, no server name, no player names or
identifiers, and <resource>_diag output is never included. tlib_telemetry_status
in the console shows what is on and what decided it.
It is off unless you set it, nothing is gated behind it, and Diagnostics is the full account of what is and is not sent.
tLS
Still stuck? Support can answer it directly.
Was this page helpful?
TIMMYG Studios