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

ESX QB-Core Qbox

Installation

1 Download & Extract

Extract the sbf_phone_max folder from your Tebex download into your server's resources directory:

Place in: 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.

SQL file: 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

  1. Validate jobName against Config.ServicesDispatch.Jobs.
  2. Resolve the sender identifier via GetSelfIdentifier.
  3. Create or find the service chat (identifier, job_name).
  4. INSERT a text message (kind = 'text') into sbf_phone_max_service_chat_messages.
  5. INSERT a location message (kind = 'location', media_lat / lng) — only when numeric lat & lng were passed.
  6. Trigger sbf-phone-max:services:newMessage on 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 senderName in the toast is auto-resolved from sbf_phone_max_users.first_name / last_name.

Troubleshooting

Phone does not open

  • Check that Config.PhoneItem matches the item you actually have in your inventory.
  • Verify the framework / inventory / notify values in config.lua are spelled exactly like your resource names.
  • Open F8 → check the console for CEF / script errors.

Dispatch export returns false

  • Make sure the jobName is registered in Config.ServicesDispatch.Jobs.
  • Make sure at least a message or coordinates have been passed.
  • Check that the source player (src) is still online.

Radio does not connect

  • Confirm that Config.VoiceSystem matches the voice resource you actually run.
  • Check that voice is started before sbf_phone_max in your server.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.