SBF Phone MAX Installation Guide
Overview
SBF Phone MAX is the flagship liquid-glass FiveM phone script with 23+ integrated apps, full tablet sync, dynamic island, push notifications, and a stunning new design. This guide walks you through a clean install on ESX, QB-Core and Qbox.
Highlight Features
- 23+ integrated apps (Bank, Camera, Marketplace, Services, …)
- Liquid Glass UI with dark / light theme
- Dynamic Island, Notifications & Live Activities
- Full sync with SBF Tablet (chats, photos, contacts)
- Service Dispatch for police / EMS / mechanic / …
- Multi-language locale loader (EN / DE)
Requirements
System Requirements
- FiveM Server (latest artifacts recommended)
- MySQL / MariaDB database (oxmysql)
- Voice System: pma-voice or SaltyChat
- Optional: ox_inventory, ox_lib, okokNotify
Compatible Frameworks
Installation
1 Download & Extract
Extract the sbf_phone_max folder from your Tebex download into your server's resources directory:
server-data/resources/[phone]/sbf_phone_max
2 Database Setup
Import the provided SQL file into your database. The script auto-creates all tables on first start, but importing the SQL ensures items & default data are present.
sbf_phone_max/INSTALLATION/db.sql (ESX & QB-Core)
3 Framework Configuration
Open sbf_phone_max/shared/config.lua and set your framework, inventory and notify system:
Config.Framework = 'esx' -- 'esx' | 'qb' | 'qbox'
Config.Inventory = 'esx' -- 'esx' | 'ox_inventory' | 'qb'
Config.NotifySystem = 'esx' -- 'esx' | 'ox_lib' | 'okokNotify' | 'qb'
Config.VoiceSystem = 'pma-voice' -- 'pma-voice' | 'saltychat'
4 Ensure Dependencies
Make sure the following resources are started before sbf_phone_max in your server.cfg:
ensure oxmysql
ensure es_extended -- or qb-core / qbx_core
ensure sbf_phone_max
5 server.cfg
Add the resource to your server.cfg below your framework & inventory:
ensure sbf_phone_max
6 Item Registration
The phone is an inventory item. The SQL import creates sbfphone. If you use ox_inventory, add the item to ox_inventory/data/items.lua:
['sbfphone'] = {
label = 'Phone',
weight = 250,
stack = false,
close = true,
description = 'SBF Phone MAX'
},
Configuration
All configuration is centralised in sbf_phone_max/shared/config.lua & sbf_phone_max/shared/config_apps.lua.
General Settings
Config.Framework = 'esx'
Config.Inventory = 'esx'
Config.NotifySystem = 'esx'
Config.VoiceSystem = 'pma-voice'
Config.PhoneItem = 'sbfphone'
Config.Timezone = 'Europe/Berlin'
Config.SBFTabletSync = true
Radio
Configure voice channels, reserved job frequencies and default volume:
Config.Radio = {
VoiceSystem = 'pma-voice',
MinFrequency = 1,
MaxFrequency = 999,
DisconnectOnDeath = true,
ReservedFrequencies = {
{ min = 1, max = 50, jobs = { 'police' } },
{ min = 51, max = 100, jobs = { 'ambulance' } },
{ min = 101, max = 150, jobs = { 'mechanic' } },
},
DefaultVolume = 50,
}
Services Dispatch
Define which jobs are reachable through the dispatch chat in the Services app:
Config.ServicesDispatch = {
Enabled = true,
Jobs = {
{ job = 'police', label = 'Polizei', image = 'img/police.png' },
{ job = 'ambulance', label = 'Sanitäter', image = 'img/ambulance.png' },
{ job = 'mechanic', label = 'Mechaniker', image = 'img/mechanic.png' },
-- Add as many as you need
},
}
Any jobName that is not in Jobs is silently rejected by sendDispatchChat.
Notification System
Config.NotifySystem = 'esx' -- 'esx' | 'ox_lib' | 'okokNotify' | 'qb'
Config.NotifyPosition = 'top-right' -- 'top' | 'top-right' | 'bottom'
Theme & UI
Config.UI = {
DefaultTheme = 'dark', -- 'dark' | 'light'
DynamicIsland = true,
HapticsEnabled = true,
Language = 'en', -- 'en' | 'de' (auto-detected from client)
}
Apps
SBF Phone MAX ships with 23+ apps, all located in sbf_phone_max/ui/apps/. Each app folder contains its own app.js, app.css and optional assets — easy to disable or extend.
Available Apps
- Activity — Activity tracker & step counter
- Appstore — In-game app store
- Banking — Bank balance, transfers & history
- Calculator — Full calculator with history
- Camera — Photo & video capture
- Clock — In-game world clock & alarms
- Compass — Compass & heading
- Faction — Faction overview
- FiveView — Mini-map overlay
- Lifeinvader — Social feed
- Map — GPS map with waypoints
- Marketplace — Player-to-player trading
- Messenger — Direct & group messenger
- Music (Vibe) — In-game music player
- Notes — Sticky notes & lists
- Performance — Vehicle performance stats
- Phone — Calls & dialer
- Photos — Gallery & cloud sync
- Piano — Mini piano app
- Radio — Job radio channels
- Services — Dispatch chat to jobs
- Settings — Wallpaper, theme, language
- SMS — SMS messaging
Disabling an App
To hide an app from the home-screen, open sbf_phone_max/shared/config_apps.lua and remove it from Config.Apps:
Config.Apps = {
{ id = 'phone', icon = 'phone.jpg', label = 'Phone' },
{ id = 'sms', icon = 'sms.jpg', label = 'SMS' },
-- { id = 'piano', icon = 'piano.jpg', label = 'Piano' }, -- disabled
}
Exports
SBF Phone MAX exposes a small but powerful set of server exports. Use them from any other server- or client-side script (via a server bridge) to integrate the phone with your framework.
sendDispatchChat
Sends a text message — and optionally a location pin — into the Services chat of every online player that belongs to the given dispatch job.
exports['sbf-phone-max']:sendDispatchChat(
src, -- number Server-ID des Spielers
jobName, -- string Dispatch-Job (muss in Config.ServicesDispatch.Jobs sein)
message, -- string Text (max. 512 Zeichen)
lat, -- number? optional, Latitude / X-Koordinate
lng -- number? optional, Longitude / Y-Koordinate
)
Returns: true on success, false if validation failed (unknown job, offline source, no text & no coordinates).
Examples
Police dispatch from a 911 script:
local function reportToPolice(src, msg, coords)
local ok = exports['sbf-phone-max']:sendDispatchChat(
src,
'police',
msg,
coords and coords.x or nil,
coords and coords.y or nil
)
if not ok then
-- Fallback oder log
end
end
Multiple jobs at once (EMS + Police):
exports['sbf-phone-max']:sendDispatchChat(src, 'police', 'Verfolgungsjagd', p.x, p.y)
exports['sbf-phone-max']:sendDispatchChat(src, 'ambulance', 'Verletzter in der Nähe', p.x, p.y)
Text only, no pin:
exports['sbf-phone-max']:sendDispatchChat(src, 'mechanic', 'Bestellung Motor')
What happens internally
-
Validate
jobNameagainstConfig.ServicesDispatch.Jobs. -
Resolve the sender identifier via
GetSelfIdentifier. -
Create or find the service chat
(identifier, job_name). -
INSERT a text message (
kind = 'text') intosbf_phone_max_service_chat_messages. -
INSERT a location message (
kind = 'location',media_lat / lng) — only when numeric lat & lng were passed. -
Trigger
sbf-phone-max:services:newMessageon all online players with the same job → toast + list refresh.
Notes & Caveats
- There is no owner check when deleting dispatch chats — any job member can delete them.
- The function is synchronous (blocking) on the server thread.
- The target player must be online to receive the toast notification.
-
The
senderNamein the toast is auto-resolved fromsbf_phone_max_users.first_name / last_name.
Troubleshooting
Phone does not open
-
Check that
Config.PhoneItemmatches the item you actually have in your inventory. -
Verify the framework / inventory / notify values in
config.luaare spelled exactly like your resource names. -
Open
F8→ check the console for CEF / script errors.
Dispatch export returns false
-
Make sure the
jobNameis registered inConfig.ServicesDispatch.Jobs. -
Make sure at least a
messageor coordinates have been passed. -
Check that the source player (
src) is still online.
Radio does not connect
-
Confirm that
Config.VoiceSystemmatches the voice resource you actually run. -
Check that
voiceis started beforesbf_phone_maxin yourserver.cfg.
Support
Need Help?
If you run into any issue during installation or have questions about the script, please don't hesitate to contact the support team.