Custom apps
Boomer Phone can display your resource's web UI inside an iframe. Registered apps appear on the home screen and keep the phone's Exit footer button.
Start with the Boomer app template. It provides a separate FiveM resource that you can copy and adapt. Use a Boomer Phone version that includes the custom-app exports and config/config.customApps.lua.
Register an app from your resource
Call the exports from a client script. Keep your HTML, scripts and images in your own resource and list them in its manifest's files section. An embedded app does not need its own ui_page.
Register when your resource starts, and register again if Boomer Phone restarts:
Start yboomer-phone before the app resource in server.cfg. The manifest dependency also enforces that order. When your resource stops, Boomer removes the apps it registered. Registering the same key again replaces the entry, keeps its position, and makes a hidden app visible again.
Register an app in the phone config
You can also add an entry to Config.CustomApps in yboomer-phone/config/config.customApps.lua. Both methods accept the same app fields. Choose one registration method for each app key.
In this file, GetCurrentResourceName() refers to yboomer-phone, so use the app resource's actual name in its URLs. Ensure that resource is running and its files are included in its manifest. Config entries reload when Boomer restarts; they are not automatically removed when an external UI resource stops. Use export registration when you need that automatic cleanup.
App fields
Unknown fields are discarded. Invalid fields reject the whole registration: AddCustomApp returns false, err and prints a warning in the client console. Optional boolean fields must be booleans; job lists must be arrays of non-empty job names.
adminOnly uses IsPlayerAdmin in yboomer-phone/server/custom/framework/ (the admin ACE by default). Job updates are handled automatically for QBox, QBCore and ESX. After changing an ACE or updating job data through a custom integration, call:
Job and admin rules control launcher visibility and the open/message exports. Validate permissions again in your own server events and callbacks before returning restricted data or changing server state.
Open, hide, close and remove
OpenCustomApp selects the app; it does not show a hidden phone. It returns false for unknown apps or players who fail the job/admin rules. HideCustomApp removes the launcher icon but still permits eligible players to use OpenCustomApp. Call AddCustomApp again to unhide it. RemoveCustomApp unregisters it completely. Hiding and removing return false if the key does not exist.
CloseApp returns to the home screen. The client event yboomer:custom-app:closing identifies an app when its mounted UI closes, while the app is still registered:
This event applies to apps regardless of closeOnPhoneHide. Do not depend on it for resource-stop cleanup: the registry entry may already have been removed. Handle your own resource lifecycle separately.
Send messages to the UI
Use SendAppMessage from client Lua. The app receives the payload as event.data through the browser's message event:
Messages wait until the iframe announces nui:ready. For apps that omit the handshake, the bridge starts delivering messages 100 ms after iframe load. Send readiness only after your app can process messages. Up to 100 messages are queued per app; additional messages discard the oldest. A true return means the phone accepted the payload, not that the iframe has received or processed it.
Call your resource's Lua callbacks
Your app's web page calls its own resource, not yboomer-phone. Register the callback in the client script of the resource that serves your app:
For an app loaded from https://cfx-nui-<resource>/html/index.html, derive the callback resource from the iframe URL:
Always call cb in your Lua handler so the request completes. If you host the UI remotely, supply your FiveM resource name explicitly instead of deriving it from the remote hostname.
Handle the Boomer keypad
Build for the small phone screen and keypad navigation. The parent forwards keys to the iframe in this format:
Supported key names are up, down, left, right, enter, opt, green, 0–9, * and #. Physical right Shift maps to opt. Backspace and the phone's Exit button return to the home screen; Backspace is not forwarded as an app key. Key forwarding pauses during calls.
Keep keyboard focus in the parent phone when using boomer:key. Focusing an input or clicking inside the iframe moves physical keyboard events into that iframe, so the parent cannot forward those events or handle physical Backspace. Avoid autofocus for keypad-driven apps. The phone's visible Exit control remains outside your app.
Port a YSeries app
The registration and messaging export names match YSeries. Change the resource name in calls from yseries to yboomer-phone, update the closing event to yboomer:custom-app:closing, and adapt the UI to Boomer's keypad and smaller screen.
Boomer selects an icon table's boomer URL before yos or humanoid. It validates registration fields and reserves built-in keys. It removes export-registered apps when their registering resource stops. There is no installation flow or app store: registered, eligible apps appear immediately unless hidden or internal.
See the client export reference for all custom-app signatures.