RR OS
A full desktop computer for your city: bank, garage, mail, jobs, business, properties and more, as 18 programs in one resource.
RR OS is a laptop. Open it and the city is on the desktop: your bank, your cars, your properties, your job, the classifieds, your mail, all as programs in a classic 90s desktop. It is one resource that runs on a plain Qbox or QBCore server. Nothing else of ours is needed.
Frameworks: Qbox (qbx_core) and QBCore (qb-core). Detected at start; Config.Framework forces one if detection ever picks wrong. Qbox is the main target. The QBCore side is written against the public QBCore API through the same bridge and has not been run on a live QBCore server yet.
What you get
20 programs are on from the first start. The Undernet and the Stock Exchange are switched on (Config.Programs.darkweb and Config.Programs.stocks are true); see "The Undernet and the Stock Exchange" below. The Undernet ships with seven example vendors that sell plain items from your inventory, and a VPN dongle item opens it. The plugin exports for your own scripts (RegisterProgram, RegisterRoute, SendMail, IssueFine) are included.
What is on the desktop
| Program | What it does | Needs |
|---|---|---|
| Bank | accounts, transfers, statement, pay bills | your framework |
| Garage | owned vehicles, where they are, GPS, title transfer | player_vehicles or owned_vehicles |
| Properties | homes and businesses, door codes, rent and mortgage bills | a housing resource or a property added in Admin Panel |
| Business Manager | society balance, staff, hire and fire, payroll, open and closed | framework jobs |
| Jobs Center | every job with grades and pay, clock in and out, apply | framework jobs |
| Marketplace | player listings for items and vehicles, held by the server until sold | an inventory system |
| The Undernet | store of items you define, seven example vendors included, opened with the dongle item | an inventory system |
| Stock Exchange | fictional companies with deterministic prices | nothing |
| Citizen Services | ID card, licenses, fines and taxes, record | your framework |
| Messenger | instant messages, buddy list, offline inbox | nothing |
| Town Square | city bulletin, business ads, moderation | nothing |
| RR Mail | mailbox with its own tables, bills arrive here | nothing |
| My Documents | named notes per character, photos when a source exists | nothing |
| Notepad | a small built-in program: one scratch note, saved on this computer, can be copied into My Documents | nothing |
| Web Browser | sites that allow framing, plus any site you register | nothing |
| Admin Panel | online players, server stats, program toggles, log | the rros.admin ace |
| Control Panel | wallpaper, theme, clock, sounds, saved per character | nothing |
| Calculator, Command Prompt, Mines | accessories (Notepad above is the fourth small built-in) | nothing |
Requirements
- ox_lib
- oxmysql
- Qbox or QBCore
- ox_inventory or qb-inventory for the laptop item
- ox_target (optional, for laptops and PCs standing in the world)
Installation
- Put the
rr-laptopfolder in your resources. - Add the items. ox_inventory: paste
install/items.ox_inventory.lua.txtintoox_inventory/data/items.lua. qb-inventory: pasteinstall/items.qb-inventory.lua.txtintoqb-core/shared/items.lua. Add an inventory icon namedlaptop.pngto your inventory's image folder (the snippet names it). - Copy the lines from
install/server.cfg.txtinto yourserver.cfg:ensure rr-laptopgoes after ox_lib, oxmysql, your framework and your inventory. Keep the twoadd_acelines: they give your admins the Admin Panel (rros.admin) and Town Square moderation (rros.moderate). - Start the server. All 29 tables are created on first start (22 for the programs that are on, 7
for The Undernet and the Stock Exchange).
install/install.sqlholds the 22 andinstall/complete.sqlthe other 7, for anyone who wants to review or import them by hand; you do not have to run them. - Join, get the item with your admin tool, use it (or type
/laptop). The laptop opens on the desktop. Props such as monitors and laptops in the world open it too (ox_target).
Optional: open config.lua and the files in config/ to switch programs, prices, limits and text. Restart the resource after editing.
If a step fails, see Troubleshooting below.
The VPN dongle (optional)
Needed only if you turn on The Undernet and keep Config.DarkWeb.access on 'item' or 'both'. The dongle is the item rros_vpn. The folder includes install/vpn.ox_inventory.lua.txt and install/vpn.qb-inventory.lua.txt: paste the line from yours into the same file as the laptop line from step 2 (a new install does this together with step 2; if you added the laptop earlier, open that file again and add the dongle line below it), then restart the inventory resource. The name must match Config.DarkWeb.item. Give it to players however your server hands out items (shop, crafting, a job reward). Do not use it if your inventory already has a different item you want to use: change Config.DarkWeb.item to that item name instead.
Configuration
Everything is plain Lua in two places. config.lua holds the settings for the whole laptop. The config/ folder has one file per program. Both are open and meant to be edited.
| Setting | Where | What it does |
|---|---|---|
Config.Framework, Config.Inventory | config.lua | 'auto' finds what is running. Force a name only if detection picks wrong. |
Config.Programs | config.lua | One switch per program. false hides it and the server refuses its actions. properties = 'auto' shows it when a housing resource exists, a property has been added, or for admins. |
Config.Adapters | config.lua | Which backend each part uses. 'auto' is right for almost everyone. A name forces one, 'off' switches the part off (not allowed for society and mail). |
Config.Item | config.lua | The item name, the chat command, and whether the command needs the item. |
Config.Props | config.lua | The list of computer props that open the laptop, the label and the distance. enabled = false turns it off. |
Config.Shell | config.lua | Area name, currency symbol, boot time, the "new mail" balloon. |
Config.Log | config.lua | Log keep days and the amount at which a move is posted to the webhook. |
Config.RateLimits | config.lua | How often one player may call a route. |
Config.Home, Config.Search, Config.Blocked | config.lua | Browser bookmarks, the web search address and the sites that cannot be framed. |
config/bank.lua | config/ | Transfer limits, memo rule, statement length, mail on transfer. |
config/garage.lua, config/properties.lua | config/ | Title transfer rules, garage locations, property settings. |
config/business.lua, config/jobs.lua | config/ | Payroll cooldown, hire rules, jobs left out, the job board listings. |
config/market.lua | config/ | Price limits, sale fee, listings per player, items that cannot be sold. |
config/citizen.lua | config/ | Licenses on sale, fine due time and the society that receives fines. |
config/mail.lua, config/messenger.lua, config/square.lua | config/ | Limits, cooldowns and moderation. |
config/documents.lua, config/controlpanel.lua, config/accessories.lua | config/ | Note limits, wallpapers and themes, accessories. |
config/admin.lua | config/ | The admin ace name, announcements and how many log rows the panel shows. |
config/darkweb.lua, config/stocks.lua | config/ | Vendors, drop points and companies for the two programs. The Undernet file holds seven example vendors. |
Every line in the config files has a comment saying what it does. A missing or broken config file does not stop the resource: it prints one line and runs on defaults.
Secrets
Secrets are server convars, never config keys, because every player's game can read the config files. All are optional and shown, commented, in install/server.cfg.txt:
| Convar | What it is for |
|---|---|
rros_webhook | Chat webhook address for large money moves. Unset means no webhook. |
rros_passcode | Passcode screen for hosted dashboards. Unset means no passcode screen. |
rros_darkweb_password | The Undernet password, when its access mode is 'password' or 'both'. |
Works with your other scripts
Every part has a built-in default that needs only your framework. Nothing else is required. An adapter switches on by itself when the script it connects to is running; if it is not, nothing prints and nothing breaks. Force or disable any of them in Config.Adapters.
| Part | Built in | Switches on when this is running |
|---|---|---|
| Bank | framework bank money, one account | nothing to add |
| Garage and Marketplace vehicles | player_vehicles | qbx_vehicles on Qbox |
| Properties | built-in registry (Admin Panel) | qbx_properties |
| Business money | built-in society table | Renewed-Banking, qb-banking, qb-management |
| Mail and photos | own tables (AddPhoto export) | nothing to add; a phone resource can send photos through the export |
| Fines, record, licenses | bills and framework licenses | your police MDT, if it has the exports named in config/citizen.lua |
| Jobs board | framework jobs | nothing to add |
Each of these is detected at start. A missing script gives a built-in fallback or a "not installed" state, never a script error.
The bridge/adapters/ folder holds a few more optional adapters for other scripts. They do nothing unless the script they connect to is running, and the Admin Panel lists only the ones that can run on your server. You can ignore them.
Society support for Renewed-Banking, qb-banking and qb-management follows their public exports and is checked with a harmless test call at start; if the test fails the built-in table is used and one line says so.
Known limits (3.0.1)
- Qbox is the primary target. QBCore is supported through the bridge, written against its public APIs and not yet run on a live QBCore server. Report anything odd with your framework name.
- ESX is not supported in this release and is switched off (
Config.EnableEsx = false). - Locale: English only.
- Map coordinates in
config/garage.lua,config/jobs.luaandconfig/darkweb.luaare spots on the default GTA map. Replace them if your map differs. - The Undernet example vendors use items from a stock ox_inventory or qb-inventory. If you changed
your item list, check the names in
config/darkweb.luaagainst it. The file picks the name set for the inventory you run (Config.Inventoryforces it). Where the two differ: water / water_bottle, burger / sandwich, sprunk / kurkakola, scrapmetal / metalscrap, armour / armor (ox / qb). Painkillers exist only in the qb set, so that line is left out on ox_inventory. - Third party society scripts (Renewed-Banking, qb-banking, qb-management) are probed, not guaranteed: the built-in table is the fallback.
Commands
| Command | Who | What |
|---|---|---|
/laptop | everyone holding the item (Config.Item) | opens RR OS |
Everything else is a program inside the laptop. Admin actions live in the Admin Panel program.
The Undernet and the Stock Exchange
Both programs are on. To turn one off, open config.lua, find Config.Programs, and change darkweb or stocks to false, then restart rr-laptop. The Admin Panel > Programs list shows each one as ON or OFF.
The Undernet
On (Config.Programs.darkweb = true). It sells only items you define in config/darkweb.lua, at fixed prices with fixed stock, for in-game money only. There is no case, wheel, lottery or any other element of chance. Sell only items your own server made, and never let anything in it be bought with real money: both would break the platform rules every server agrees to. It ships with seven example vendors (water, snacks, drinks, bandages, lockpicks, a radio, a phone, scrap and a vest). The file picks the item names for ox_inventory or qb-inventory on its own. If your inventory uses other names, change them in the file; an order for an item your inventory does not know fails at pickup. Replace the two example drop points with spots on your map. Access is the VPN dongle item, a password convar, both, or open to all (Config.DarkWeb.access). With the default, a player sees the program once they hold the dongle: give yourself one with your admin item command (rros_vpn) to look around.
Stock Exchange
On (Config.Programs.stocks = true). The companies are fictional and the prices follow a deterministic formula with no random term, so it is a simulation, not a game of chance. Hours in config/stocks.lua are server clock hours.
Adding your own programs and sites
Server, from any resource:
-- a route the laptop page can call as RROS.call('myprog', 'hello', data)
exports['rr-laptop']:RegisterRoute('myprog', 'hello', function(src, data)
return { ok = true, text = 'hi ' .. tostring(data.name) }
end, { rate = 20 })
-- mail and bills from your own scripts
exports['rr-laptop']:SendMail({ toCid = cid, from = 'City Treasury', subject = 'Hello', body = 'text',
actions = { { label = 'Open Bank', link = 'rros://bank' } } })
exports['rr-laptop']:IssueFine(cid, 450, 'Speeding', 'police')
Client, from any resource:
exports['rr-laptop']:RegisterProgram({ id = 'myprog', label = 'My Program', icon = '<svg ...>', group = 'programs',
desktop = true, size = { w = 900, h = 600 }, script = 'laptop/myprog.js' })
exports['rr-laptop']:RegisterSite({ label = 'My Site', url = 'https://cfx-nui-my-sites/html/index.html', display = 'mysite.city' })
exports['rr-laptop']:OpenProgram('bank', { path = 'bills' })
exports['rr-laptop']:OpenUrl({ url = 'https://cfx-nui-my-sites/html/index.html', label = 'My Site' })
The page side of a program is one JS file that ends in RROS.register({...}). Page helpers: RROS.call(program, action, data) runs a server action and returns a promise, RROS.confirm({ title, text, ok, danger }) asks yes or no, RROS.toast(text, kind) shows a short notice, and RROS.ui.guardInputs(root) keeps typing in your inputs from reaching the laptop (run it on any markup you build by hand).
Troubleshooting
- The item does nothing: the item name in your inventory must match
Config.Item.name, and the ox_inventory snippet must keepexport = 'rr-laptop.laptop'. - "Sign in to a character first": the laptop was opened before a character was loaded.
- A program is missing from the desktop: check
Config.Programs, then Admin Panel > Programs, which prints the reason next to every hidden program. - Properties is missing: add a property in Admin Panel > Properties, run a supported housing
resource, or set
Config.Programs.properties = true. - Nothing happens on a prop: ox_target must be running, or set
Config.Props.target = 'qb-target'. - The Adapters box in the Admin Panel shows which backend each part picked and which are available.
What is open, what is escrowed
Open: config.lua, config/, html/, install/, README, CHANGELOG, LICENSE. Encrypted: shared/util.lua, bridge/, client/, server/.
Support
Through the store you bought from. Include your framework, inventory, the lines from the Adapters box in the Admin Panel, and anything red in F8.
Last updated 2026-11-02