Convars
Every convar tLib reads — what it does, its unit, its default, and whether it needs set or setr.
tLib has no config file. Everything an owner can change is a convar in server.cfg,
placed above ensure tLib. If a convar is not on this page, tLib does not read it.
Every duration carries its unit in the name (_ms); there are no unit-less aliases.
set vs setr
set defines a convar the server can read. setr also replicates it to every connected
game client. A convar read by client Lua or by the NUI needs setr; one read only by
the server bundle uses set.
Getting it wrong fails quietly:
- A
setrconvar written withsetmakes the client read the built-in default. Pointtlib_api_base_urlat your own host withsetand the server talks to your host while the in-game panel keeps talking to ours. - A
setconvar written withsetrworks, but ships the value to everyone who joins. Never do it for a secret.
Demo mode
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_demo | set | boolean — 1, true, yes, on | (off) | Turns the server into a self-resetting showroom. Every player becomes a superadmin and every access gate opens, no resource writes its data file, and marketplace installs are swept at the next start. |
setr also works and does no harm.
| In demo mode | |
|---|---|
Server settings, layouts, codeplugs, vehicle configs — anything in a data.json | Held in memory for the session, never written. Back to the shipped file on restart. |
| Marketplace items a visitor installs | Really installed, so they work; swept at that resource's next start. |
| Preinstalled marketplace content shipped in the zip | Untouched. |
| Per-player client storage (HUD placement, menu preferences) | Untouched. It lives on the player's machine. |
Nothing is deleted — writes are dropped, not rolled back — so removing the convar and restarting brings the server back exactly as it was.
tlib_demo [on|off|convar] (console, or tlib.admin) changes it live and reports the new
state; convar stops overriding and follows server.cfg again. Access and permission
changes take effect immediately; the data reset and the marketplace sweep happen when a
resource starts.
Diagnostics
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_telemetry | set | boolean — 1, true, yes, on, enabled / 0, false, no, off, disabled | (unset — off) | Opt in to diagnostics events: errors, warnings, renderer crashes and slow-operation outliers from our own code, with machine context. This convar is the only control. |
tlib_telemetry_key | set | string | (empty) | Dev only: points the transport at a local ingest credential. There is nothing for an operator to supply. |
tlib_telemetry is the only way to turn diagnostics on or off. An unreadable value
(maybe) still counts as a decision, leaving diagnostics off. Unset is off. A
consumer resource can store an answer of its own with SetTelemetryConsent (see
Exports), and this convar, once set, overrides it.
What this convar does not cover: the per-install id
Marketplace browse, installs and previews, community configs and the startup update check
all run regardless of this setting. Every one of them, and the diagnostics ingest,
carries a random per-install id (x-install-id) so one server can be rate-limited or
blocked on its own.
The id is random, generated on your own server from no input, and is never an IP, a licence
key, a server name or a player identifier. It lives in tLib's data.json; deleting it only
mints a new one, which is not an opt-out.
Where to see the current state
tlib_telemetry_status in the server console: what is enabled, what decided it, how much
is queued, and whether the transport has given up for this session. tLib's hub at
http://<server>:7777/ neither shows nor changes it.
What is collected
Faults in our code and performance on real machines — five event kinds, nothing else:
| Event | Carries |
|---|---|
tlib.error_reported | the resource and version, which VM the fault was in, an error kind, the error name, a file-and-line location, a hash of the normalised stack, and the scrubbed stack itself, stored once per hash per day |
tlib.warning_reported | the same context, a warning kind and a warning code. No message: a warning's text has nowhere to go |
tlib.crash_reported | a crash kind and how long the session survived. Sent on the NEXT start, because the renderer that died could not send anything |
tlib.slow_operation | which operation, how long it took, the budget it crossed. Outliers only — never one row per call |
tlib.environment_reported | once per boot: OS, a RAM bucket, GPU vendor and model, CPU threads |
What is deliberately not
No IP, no sv_licenseKey, no server name, no server endpoint, no player name, licence,
Steam or Discord id, and no player count. The only identifier is the random per-install id
above.
Before anything is sent: home-directory paths lose the account name, credential-shaped
values are blanked, and anything shaped like a FiveM player identifier (steam:,
license:, discord:, a bare Steam id or snowflake, an IP address) is removed.
The RAM bucket caps at 8 GB, so it says "under 8 GB" or "cannot tell" and nothing between.
<resource>_diag output is not routed into this. Those stay in your console.
Marketplace
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_api_base_url | setr | URL, no trailing slash, no /api suffix | https://timmygstudios.com | Where the TIMMYG Studios API lives: browse, preview, install downloads, community configs and the startup version check all follow it. Read by the server bundle and by client Lua, so set alone leaves the in-game panel on the default host. |
HTTP router
All server-read; none needs replicating. The listener starts on 7777 with no
configuration. Opening that port on the host and in NAT is the step most often missed — see
Installation.
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_http_port | set | integer, 1–65535 | 7777 | The one external listen port. |
tlib_http_host | set | bind address | 0.0.0.0 | Interface the listener binds. |
tlib_http_public_url | set | host, host:port or full URL | (empty — auto-detect) | The address clients are told to use. A bare IP or localhost implies HTTP and the listener port; a bare domain implies https://. Advertised, not bound. |
tlib_realtime_public_url | set | ws:// / wss:// URL | (empty — derived) | Overrides the realtime WebSocket URL handed to clients. Realtime is a mount on the router at /rt; the removed tlib_realtime_port and tlib_realtime_host do nothing. |
Menu
All read by client Lua, so all need setr. Changing tlib_menu_key or tlib_menu_pad_key
needs a restart, not a reload. Out-of-range or non-numeric values fall back to the default
rather than erroring.
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_menu_command | setr | string | tlibmenu | Chat/console command that opens the menu. |
tlib_menu_key | setr | key name | F1 | Default keyboard binding. |
tlib_menu_pad_key | setr | pad control name | start_index | Default controller binding. |
tlib_menu_search_key | setr | key name | F3 | Opens search. |
tlib_menu_label | setr | string | Open Menu | Label shown in FiveM's key-binding settings. |
tlib_menu_key_slots | setr | integer, 0–16 | 8 | Per-item quick-bind slots offered. 0 disables them. |
tlib_menu_locale | setr | locale code | en | UI language. |
tlib_menu_request_timeout_ms | setr | ms, 1000–60000 | 10000 | How long a snapshot/action request waits before failing. |
tlib_menu_permission_refresh_ms | setr | ms, 1000–60000 | 5000 | How often permission-filtered menus are re-pushed. |
tlib_menu_highlight_settle_ms | setr | ms, 0–2000 | 120 | Delay before a highlight change counts as settled. 0 fires immediately. |
HUD and storage
| Convar | Command | Type / unit | Default | What it does |
|---|---|---|---|---|
tlib_hud_profile | setr | string | (empty — the server endpoint) | Namespaces each player's saved HUD placement. Set it when one community runs several endpoints that should share one layout. |
tlib_community_id | setr | string, [A-Za-z0-9_-] only | (empty — falls back to sv_projectName) | Prefix for tLib's KVP keys, so two servers on one machine do not share player storage. Disallowed characters are stripped; a value that strips to nothing falls through to sv_projectName. Read by client Lua and the server bundle. |
Not convars
These look similar and are not convars. Do not put them in server.cfg:
| Name | What it actually is |
|---|---|
tlib_min_version, tlib_module, tlib_modules | fxmanifest.lua metadata keys on the consuming resource. |
tlib_menu_selftest, tlib_menu_refresh, tlib_menu_permissions | Console commands. |
tlib_demo (as a command) | Also a console command, tlib_demo [on|off|convar], toggling the convar above at runtime. The convar is the real setting. |
tmarketplace_resource_secret | Nothing reads it. An earlier version of this page listed it as required; delete the line if you have it. |
tlib_menu_request_timeout, tlib_menu_permission_refresh, tlib_menu_highlight_settle | Unit-less near-misses for the three _ms convars. Nothing reads them. |
tLib
Still stuck? Support can answer it directly.
Was this page helpful?
TIMMYG Studios