New releaseRR OS: an in-game computer with 18 programsRR OS is out

RR OS

A full desktop computer for your city: bank, garage, mail, jobs, business, properties and more, as 18 programs in one resource.

v3.0.1Qbox / QBCore$29.99Store page

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

ProgramWhat it doesNeeds
Bankaccounts, transfers, statement, pay billsyour framework
Garageowned vehicles, where they are, GPS, title transferplayer_vehicles or owned_vehicles
Propertieshomes and businesses, door codes, rent and mortgage billsa housing resource or a property added in Admin Panel
Business Managersociety balance, staff, hire and fire, payroll, open and closedframework jobs
Jobs Centerevery job with grades and pay, clock in and out, applyframework jobs
Marketplaceplayer listings for items and vehicles, held by the server until soldan inventory system
The Undernetstore of items you define, seven example vendors included, opened with the dongle iteman inventory system
Stock Exchangefictional companies with deterministic pricesnothing
Citizen ServicesID card, licenses, fines and taxes, recordyour framework
Messengerinstant messages, buddy list, offline inboxnothing
Town Squarecity bulletin, business ads, moderationnothing
RR Mailmailbox with its own tables, bills arrive herenothing
My Documentsnamed notes per character, photos when a source existsnothing
Notepada small built-in program: one scratch note, saved on this computer, can be copied into My Documentsnothing
Web Browsersites that allow framing, plus any site you registernothing
Admin Panelonline players, server stats, program toggles, logthe rros.admin ace
Control Panelwallpaper, theme, clock, sounds, saved per characternothing
Calculator, Command Prompt, Minesaccessories (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

  1. Put the rr-laptop folder in your resources.
  2. Add the items. ox_inventory: paste install/items.ox_inventory.lua.txt into ox_inventory/data/items.lua. qb-inventory: paste install/items.qb-inventory.lua.txt into qb-core/shared/items.lua. Add an inventory icon named laptop.png to your inventory's image folder (the snippet names it).
  3. Copy the lines from install/server.cfg.txt into your server.cfg: ensure rr-laptop goes after ox_lib, oxmysql, your framework and your inventory. Keep the two add_ace lines: they give your admins the Admin Panel (rros.admin) and Town Square moderation (rros.moderate).
  4. 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.sql holds the 22 and install/complete.sql the other 7, for anyone who wants to review or import them by hand; you do not have to run them.
  5. 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.

SettingWhereWhat it does
Config.Framework, Config.Inventoryconfig.lua'auto' finds what is running. Force a name only if detection picks wrong.
Config.Programsconfig.luaOne 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.Adaptersconfig.luaWhich 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.Itemconfig.luaThe item name, the chat command, and whether the command needs the item.
Config.Propsconfig.luaThe list of computer props that open the laptop, the label and the distance. enabled = false turns it off.
Config.Shellconfig.luaArea name, currency symbol, boot time, the "new mail" balloon.
Config.Logconfig.luaLog keep days and the amount at which a move is posted to the webhook.
Config.RateLimitsconfig.luaHow often one player may call a route.
Config.Home, Config.Search, Config.Blockedconfig.luaBrowser bookmarks, the web search address and the sites that cannot be framed.
config/bank.luaconfig/Transfer limits, memo rule, statement length, mail on transfer.
config/garage.lua, config/properties.luaconfig/Title transfer rules, garage locations, property settings.
config/business.lua, config/jobs.luaconfig/Payroll cooldown, hire rules, jobs left out, the job board listings.
config/market.luaconfig/Price limits, sale fee, listings per player, items that cannot be sold.
config/citizen.luaconfig/Licenses on sale, fine due time and the society that receives fines.
config/mail.lua, config/messenger.lua, config/square.luaconfig/Limits, cooldowns and moderation.
config/documents.lua, config/controlpanel.lua, config/accessories.luaconfig/Note limits, wallpapers and themes, accessories.
config/admin.luaconfig/The admin ace name, announcements and how many log rows the panel shows.
config/darkweb.lua, config/stocks.luaconfig/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:

ConvarWhat it is for
rros_webhookChat webhook address for large money moves. Unset means no webhook.
rros_passcodePasscode screen for hosted dashboards. Unset means no passcode screen.
rros_darkweb_passwordThe 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.

PartBuilt inSwitches on when this is running
Bankframework bank money, one accountnothing to add
Garage and Marketplace vehiclesplayer_vehiclesqbx_vehicles on Qbox
Propertiesbuilt-in registry (Admin Panel)qbx_properties
Business moneybuilt-in society tableRenewed-Banking, qb-banking, qb-management
Mail and photosown tables (AddPhoto export)nothing to add; a phone resource can send photos through the export
Fines, record, licensesbills and framework licensesyour police MDT, if it has the exports named in config/citizen.lua
Jobs boardframework jobsnothing 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.lua and config/darkweb.lua are 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.lua against it. The file picks the name set for the inventory you run (Config.Inventory forces 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

CommandWhoWhat
/laptopeveryone 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 keep export = '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