fivemservertest 146c6592aa docs: 0.2 — the release notes and the new screenshots
Thirty commits since 0.1. The README now leads with what this version
adds rather than what the first one was, and carries shots of the panels
that did not exist then: inventory, chat with notifications, the
dealership, a garage, the berry buyer.

The limits section is the honest half. Most of 0.2 has been verified by
rendering the interfaces and reading the logs rather than by playing it
with several people, and placement in the world is the part most likely
to be wrong — which is why /coords shipped alongside it.
2026-09-01 17:05:08 +00:00
2026-08-13 19:05:58 +00:00

FiveRP — 0.2

A roleplay base for FiveM, written from scratch rather than forked from a framework. Eight resources: an account login, a character creator, permanent player IDs, authoritative money with a ledger, needs, a server-owned clock and a HUD. Everything a player can see is drawn by this repository; everything a player could cheat with is decided on the server.

Running against FXServer 25770 (recommended channel), GTA V game build 3751 (mp2025_02), OneSync on.


What it looks like

Loading screen — real streaming progress, not a fake bar.

Loading screen

Login — the account is the login and outlives every character on it.

Login

Registration — two steps, so nobody is asked for eight fields at once.

Registration

Identity — the name a character is known by for the rest of their life.

Identity

Character select — three slots per account, each one deleted only on a second, deliberate press.

Character select

Appearance editor — heritage, face, hair, skin and clothes, with the ped rendered live by the game beside the panel.

Appearance editor

HUD — a flat overlay that never repeats what the game already draws. There is no health ring: health is on the minimap already. The condition rings and the voice indicator stand in a column beside the radar, measured to its right edge so the two line up at 1080p.

HUD

Inventory (I) — sixteen bag slots and five worn ones. Drag to move, drop onto the strip to put something on the ground, right-click to use or to wear.

Inventory

Chat and notifications — the chat is for things people said; everything the server tells you is a toast on the right.

Chat

Dealership — the car stands in front of you, in the colour you picked, before any money moves.

Dealership

Garage — any attendant fetches one of yours or puts away the one you are in.

Garage

Berry buyer — sells the shears, buys what you bring back.

Berry buyer

HUD settings (/hud) — every module can be turned off, and the choice is saved on that computer, not on the character.

HUD settings


What is inside

Resource What it owns
fiverp-loadscreen The loading screen, with real streaming progress
fiverp-auth Accounts: register, log in, bcrypt password hashes
fiverp-characters Character slots, the appearance creator, spawning
fiverp-ids Static ID (permanent, never reused) and dynamic ID (this session)
fiverp-economy Cash and bank, every movement written to a ledger
fiverp-status Hunger, thirst and mood, persisted per character
fiverp-time One clock for the whole server, running at real speed
fiverp-vehicles Dealership, ownership and garages
fiverp-robbery Holding up a passer-by at gunpoint
fiverp-notify Toasts, so the chat stays a place people talk
fiverp-admin Staff commands, gated on the fiverp.admin ace
fiverp-berries Berry picking: shears, four patches, and a buyer in Paleto
fiverp-inventory 16 bag slots, five worn slots, and what ends up on the pavement
fiverp-interact The hold-to-act marker every other resource uses
fiverp-chat Chat, and the command list behind the slash key
fiverp-bank Branches, tellers, 121 ATMs and every move between accounts
fiverp-hud The in-game overlay and its settings panel

Server logic is JavaScript (Node 22, shipped inside FXServer), client logic is Lua, interfaces are plain HTML/CSS/JS with no build step — what is in the repo is what runs.

Two rules hold across all of it:

  • The client never decides anything it could profit from. The HUD is a renderer; money, IDs and needs are server state, sent down, never sent up.
  • No backdrop-filter and no box-shadow anywhere in NUI. CEF composites both as an opaque black rectangle the size of the element, which shows up in-game as black squares around every panel. Contrast comes from the panel's own background and a hairline border instead.

Requirements

  • Linux (built and run on Ubuntu 24.04; 2 GB RAM is enough for a small server)
  • FXServer artifacts, recommended channel — Linux builds
  • MariaDB 10.6+ or MySQL 8+
  • oxmysql — the only third-party resource used
  • A server key from keymaster.fivem.net

Install

1. Server files

mkdir -p /opt/fivem && cd /opt/fivem
curl -sSL -o fx.tar.xz https://runtime.fivem.net/artifacts/fivem/build_proot_linux/master/25770-<hash>/fx.tar.xz
mkdir server && tar -xJf fx.tar.xz -C server
git clone https://github.com/citizenfx/cfx-server-data.git server-data

Take the exact URL of the build marked recommended from the artifacts page — the hash changes with every build.

2. Database

apt-get install -y mariadb-server
mysql -e "CREATE DATABASE fiverp CHARACTER SET utf8mb4;"
mysql -e "CREATE USER 'fiverp'@'localhost' IDENTIFIED BY 'a-long-password';"
mysql -e "GRANT ALL ON fiverp.* TO 'fiverp'@'localhost';"
mysql fiverp < sql/schema.sql

The schema is not created by the resources at runtime, on purpose: a server that can silently reshape its own tables is one nobody can tell has been tampered with.

3. This repository

cd /opt/fivem/server-data
git clone https://git-1.redl.app/fivemservertest/fiverp-server.git /tmp/fiverp
cp -r /tmp/fiverp/resources/fiverp-* 'resources/[local]/'

And oxmysql into resources/[system]/oxmysql.

4. Config

cp /tmp/fiverp/server.cfg.example /opt/fivem/server-data/server.cfg

Then fill in, in that file:

  • sv_licenseKey — your key from keymaster
  • set mysql_connection_string — the user and password from step 2
  • sv_hostname / sets sv_projectName — the server's name, which is also what the HUD's top-right card shows

A semicolon inside a # comment still separates commands in a FiveM cfg, so the rest of that line gets executed. This is where mystery No such command … lines in the log come from. There are none in this file — keep it that way.

5. Run

cd /opt/fivem/server-data
/opt/fivem/server/run.sh +exec server.cfg

Port 30120 must be open on TCP and UDP. As a service:

# /etc/systemd/system/fivem.service
[Unit]
Description=FiveM server
After=network.target mariadb.service

[Service]
WorkingDirectory=/opt/fivem/server-data
ExecStart=/opt/fivem/server/run.sh +exec server.cfg
Restart=always

[Install]
WantedBy=multi-user.target

Connect with connect <your-ip> in the FiveM client's F8 console.


Configuration

Setting Default What it does
set fiverp_timezone Europe/Moscow The timezone the in-game clock runs in. Any IANA name.
sv_enforceGameBuild 3751 The GTA build every player is held to. Newer builds contain all older content.
set onesync on Required. Server-side state bags — which is how IDs, money and the clock reach the HUD — do not work without it.
sv_maxclients 32 Also the ceiling on dynamic IDs.

Staff commands are gated by an ACE, not by a hardcoded list:

add_principal identifier.fivem:1234567 group.admin
add_ace group.admin fiverp.economy allow

Commands

Command Who What
/hud anyone Open the HUD settings panel
/id anyone Your static and dynamic ID
/players anyone How many are connected, and how many are in the world
/balance anyone Cash and bank
/pay <id> <amount> anyone Hand cash to someone within 8 m — cash only, so it cannot be used as a remote wire transfer
/time anyone What the server clock says, and in which timezone
/givemoney <id> <cash|bank> <amount> admin Create money — written to the ledger with your license against it
/takemoney <id> <cash|bank> <amount> admin Remove money
/setmoney <id> <cash|bank> <amount> admin Set a balance outright
/setneed <id> <hunger|thirst|mood> <0-100> admin Set a need

Vehicles: the forecourt outside Premium Deluxe — outdoors, because FiveM does not stream that building's interior. Hold E at the salesman, pick a car and a colour, and it appears on the turntable in front of you before you pay. It is bought from the bank, gets a plate of its own, and belongs to the character who bought it. Any garage attendant will fetch one of yours or put the one you are sitting in away. Anything left in the world goes back to a garage when you disconnect or the server restarts.

Robbery: draw a gun and walk up to someone. A marker appears on them, hold E, their hands go up and you go through their pockets — $500 to $1,400. A minute and a half before you can do it again, and half an hour before that particular person has anything left.

Berry picking: the buyer in Paleto Bay sells shears for $150 — without them no bush will let you work, because cutting is what leaves it alive to fruit again. Four patches are marked on the map; hold E at a bush to cut, and it goes quiet for three minutes afterwards for everyone. Four kinds grow, from common blackberries at $12 to cloudberries at $130. Eat them for hunger, a little thirst and a lift, or sell the lot back at the counter.

Inventory: I opens it. Sixteen bag slots and five worn ones — headwear, outerwear, undershirt, trousers, shoes. Drag to move, drop onto the strip at the bottom to put something on the ground, double-click or right-click to use it. A dropped item becomes a real object you can walk back to and pick up.

The clothes the creator put on your character are adopted into the worn slots a moment after you spawn, so you can take them off and stand there in your underwear. They go into the bag like anything else and can be put back on.

shared/items.lua is the item registry and is empty apart from five garment carriers, one per worn slot — those are the mechanism, not content; the comment at the top is the shape an entry takes — label, description, weight, action and the world model it becomes when dropped. action is a name, not code: the inventory announces it and whichever resource owns that effect handles it.

Interacting: anything you can act on shows a dial where it is. Walk up, hold E, and a ring fills around the key — the action only fires when it is full. Letting go early cancels it. A tap does nothing, deliberately: nothing that moves money should be one twitch away.

Banking: hold E at a teller or an ATM, or type /bank while standing at one. A teller deposits, withdraws and transfers to another player by ID, all free. An ATM does the first two only and keeps 3% of a withdrawal, minimum $5 — walking into a branch is what saves you the fee.

Chat: T opens it, / lists every command registered on the server and keeps narrowing as you type. Tab or Enter completes the highlighted one. A row of buttons fills in the roleplay channels for you.

Channel Reaches Reads as
plain text 20 m Vinni Admin (14): text — the name, and the id everyone can see
/me 20 m Marcus Reyes counts the notes
/do 20 m the machine is already dead ((Marcus Reyes))
/try 20 m the attempt, then succeeds or fails — the server flips it
/s 45 m shouted
/w 4 m whispered
/b 20 m (( out of character ))

Range is measured server-side from both players' positions, so it cannot be argued with from a client.

Anything the server tells you — money arriving, a bush picked bare, a command refused — is a toast on the right rather than a line of chat:

exports['fiverp-notify']:show('Berries', '**3** × Blackberries', 'good')
exports['fiverp-notify'].notify(src, 'Bank', '**$2,500** arrived', 'good')

kind is good, bad or info; only good spends the accent. Wrap a number in **stars** to set it apart. New resources should use this — a toast is read once and forgotten, and the chat is for things people said.

Staff commands need add_ace group.admin fiverp.admin allow. /revive [id] brings someone back up, /noclip flies (shift faster, alt finer, space and ctrl for height), /tpm teleports to your map marker, /coords prints where you are standing in the form the config files want, to the screen and to the server console. To anyone without the ace they answer "Unknown command" — a refusal that names what it refused is a list of staff commands for anyone who guesses.

Keys: B seatbelt, L lock or unlock the car you are in or looking at, Z cycle voice range (whisper 3 m / normal 8 m / shout 20 m — applied to Mumble, so the HUD shows how far you actually carry).


0.2 — what this version adds

Everything in 0.1 still holds. On top of it:

  • A new look. Every interface was rewritten to one style — Clean UI / Dark Minimalism, eight colour tokens, flat surfaces, a single orange accent, and no gradients, shadows or blur. The design system in CLAUDE.md was rewritten with it, so the next screen matches without anyone having to remember.
  • Chat, replacing the stock one. Typing / lists every command that exists on the server and narrows as you type. Roleplay channels — /me, /do, /try, /s, /w, /b — each with a range the server measures.
  • Notifications, so the chat can stay a place people talk.
  • Hold-to-act markers. Anything you can interact with shows a dial where it is; hold E and a ring fills. Nothing important is one tap away.
  • Banking. Eight branches with tellers, 121 ATMs. Deposits, withdrawals, and transfers by player ID at a teller; an ATM does the first two and keeps 3%.
  • Inventory. Sixteen bag slots and five worn ones, drag and drop, and dropped items become real objects you can walk back to. The clothes your character is already wearing are adopted into the worn slots, so you can take them off.
  • Weapons as inventory items — the bag is the truth, and the ped is made to match it.
  • Berry picking, a full job: buy shears, work four patches, eat what you pick or sell it back.
  • Vehicles. A dealership where the car stands in front of you in the colour you chose before any money moves, ownership tied to the character, and garages that fetch and store.
  • Robbery. Draw a gun, hold up a passer-by, go through their pockets.
  • Staff commands: /revive, /noclip, /tpm, /coords.

Known limits, honestly:

  • Most of this has been verified by rendering the interfaces and by reading the logs, not by playing it with several people. Placement in the world — where a ped stands, where a car appears — is the part most likely to be off, which is why /coords exists.
  • The item registry ships with berries, clothing carriers and three weapons. There is no economy of goods yet, and nothing to buy with what a job pays except a car.
  • Worn clothing is one icon per slot, not per garment. A jacket and a shirt are both worn_top and draw the same picture.
  • Vehicles have no fuel, no damage persistence and no keys beyond ownership. Locking is the HUD's L, which is the game's own lock and nothing more.
  • Robbery has no consequence attached: no police response, no witnesses, no wanted level.
  • Still no migration runner. sql/schema.sql is idempotent — every table is CREATE TABLE IF NOT EXISTS — so re-running it is how you upgrade.

0.1 — what the first version was

First tagged version. What works:

  • Account registration and login, characters, spawning, and returning to where you logged out
  • Static and dynamic IDs, and a player count that counts everyone connected — including the people still on the login screen
  • Money with a full transaction ledger, staff actions attributed to a license
  • Hunger, thirst and mood, decaying and persisted
  • One server clock at real speed, so every player's sun agrees with every other player's, and the date is the real date
  • The HUD, with per-computer settings

CLAUDE.md in the root is the design system and the working rules for this codebase — read it before adding an interface. Every screen follows one style, Clean UI / Dark Minimalism: eight colour tokens, flat surfaces, a single orange accent, and no gradients, shadows or blur anywhere.

S
Description
No description provided
Readme
5.2 MiB
Languages
JavaScript 47.4%
Lua 25.4%
CSS 22.4%
HTML 4.8%