Before You Begin#
Before installing Text UI, make sure your server meets the requirements. Nothing is mandatory besides the resource itself: there is no database, no SQL file and no library to install.
Requirement | Status | Notes |
|---|---|---|
Server key | Required | Text UI is an escrowed asset. The server key must be generated by the same CFX account that bought it. |
Framework | Optional | ESX, QBCore or Qbox — auto-detected. Only needed to show a prompt to a single job. Everything else works standalone. |
The framework is picked by looking at what is already running:
Resource started | Framework used |
|---|---|
| ESX |
| QBCore (Qbox goes through its QBCore compatibility) |
None of them | Standalone |
You do not have to remove
esx_textuior QBCore's DrawText. Text UI runs beside them, and Integrations shows how to point them at Text UI so every script on the server shares the same prompts.
Downloading Text UI#
After purchasing Text UI, the resource is automatically linked to your CFX Portal account.
Sign in to the CFX Portal using the same account used during checkout, open Granted Assets, and download Text UI.
After extracting the download, you should have the following folder:
qs-textui/
├── shared/config.lua -- every setting (editable)
├── client/custom/framework/ -- framework bridges (editable)
├── client/ -- the prompt logic
├── server/ -- the version check
└── web/dist/ -- the interface, ready to useThe folder must be named
qs-textui. Every other script calls it asexports['qs-textui'], so a renamed copy is not found by them.
Installing the Resource#
Move the qs-textui folder into your server's resources directory. It can live anywhere inside it, including a category folder:
resources/
└── [qs]/
└── qs-textui/Then open your server.cfg and start it after your framework and before every script that uses it:
# Framework (optional)
ensure es_extended
# ensure qb-core
# ensure qbx_core
ensure qs-textui
# Scripts that show prompts come after
ensure my-shops
ensure my-garagesThe loading order matters. The framework is detected when Text UI starts, so a framework started after it is not found and job filters stop working. A script that creates its prompts while starting must also come after Text UI, or the export does not exist yet.
Configuring the Resource#
Every setting lives in one file. The framework bridges are open too, for servers that read the player's job differently.
File | Contents |
|---|---|
| The default key and screen position, the colours, the Cyberpunk style, the prompts placed in the world, framework detection and debug. |
| How the player's job is read on ESX. |
| How the player's job is read on QBCore and Qbox. |
The values worth reviewing first:
Config = {
DefaultKey = {
Enable = true,
Key = 'E' -- key shown when a script does not pass one
},
Areas = { ... } -- prompts placed in the world, see Usage
}
Config.DefaultAlign = 'center-right' -- where the on-screen prompt sits
Config.CyberpunkTextUI = {
enabled = false, -- true for the Cyberpunk 2077 dialogue style
speaker = 'INTERACT',
showKey = true,
align = 'center-left'
}
Config.Debug = false -- extra lines in the F8 consoleThe shipped
Config.Areasholds a few example prompts on Grove Street that only print to the console. Delete them, or replace them with your own, before going live. Every field is explained in Usage.
Verifying the Installation#
After completing the installation, restart your server and look for the version line in the server console:
You are using the latest version of qs-textui!New version available lists what changed and the version to download from the CFX Portal. API is not available only means the update check could not be reached — Text UI works normally.
Then try both kinds of prompt from any client script of yours:
Show an on-screen prompt
Type
/textuitestin chat. The prompt slides in on the right of the screen and leaves three seconds later.lua RegisterCommand('textuitest', function() exports['qs-textui']:displayTextUI('Open the garage', 'E') Wait(3000) exports['qs-textui']:hideTextUI() end)Pin a 3D prompt
Type
/textui3dand walk away. From eight metres you see a marker where you stood; within two metres it becomes the label, and pressing E prints to the F8 console.lua RegisterCommand('textui3d', function() exports['qs-textui']:create3DTextUI('textui_test', { coords = GetEntityCoords(PlayerPedId()), displayDist = 8.0, interactDist = 2.0, enableKeyClick = true, keyNum = 38, key = 'E', text = 'Test ~g~prompt', triggerData = { triggerName = 'textui:test', args = {} } }) end) AddEventHandler('textui:test', function() print('Text UI works') end)
Prompts created by your scripts change live —
changeTextandupdate3DTextUIswap the text in place. Edits toshared/config.luaneed a restart ofqs-textui.



