Before updating, make sure sky_base is up to date.
Current
Version 1.39.0
Update sky_base to 1.36.0 before updating sky_jobs_base.
Highlights
Added persistent job-fleet impounds with reasons, fees, impounding authority details, and a dedicated impounded state shared by supported job resources.
Added optional persistence for placed job props so authorized world objects can survive resource or server restarts until they are removed.
Added stable fleet key holders so reconnects and restarts return active vehicle keys to the current driver instead of an earlier occupant.
Added an optional login policy that places duty-capable players off duty whenever their framework character loads.
Notable Changes
Improved job-garage parking, retrieval, reconnect, and active-vehicle handling so fleet state remains consistent across longer sessions.
Added shared training content so one course can be made available to multiple configured jobs without duplicating its material.
Improved recruitment so candidate lists use only framework-loaded players from the live job cache.
Improved configured duty switching so invalid mappings are rejected and missing off-duty jobs produce a useful Job Configurator warning.
Improved external tablet synchronization so LB Tablet and other supported app registrations are reinstalled after a job configuration changes.
Added server-authorized one-time prop placement for trusted job resources and made placed trunk or world props return their items atomically when removed.
Improved variable barriers and tape lines so their posts follow mapped ground height more accurately.
Improved exclusion-zone cleanup so ambient NPCs are removed by the server-selected owner even when the nearest client does not control those entities.
Other Changes
Improved startup ordering so database migrations finish before jobs, sharing, and server classes consume their tables.
Fixed an issue where empty Job Configurator settings could be stored as a JSON array instead of the expected object.
Improved the tuning-pricing editor with functional categories, complete controls, synchronized defaults, and matching locale coverage.
Improved shared tablet forms and theme behavior while removing browser filter effects that could render inconsistently in FiveM CEF.
Updated bundled translations for training, prop placement, impounds, ankle-monitor persistence, Ambulance fatal-wound settings, Mechanic delivery settings, and Polish wording.
Changed Files
sky_jobs_base/config/config.lua
sky_jobs_base/config/locales/*
sky_jobs_base/fxmanifest.lua
sky_jobs_base/import.sql
sky_jobs_base/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.38.11.39.0
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Before updating, install sky_base1.36.0, stop the server, and back up the resource, intentional config edits, Job Configurator tables, sky_jobs_vehicles, and any existing world-prop integration data.
Install 1.39.0 as one clean package. Its UI, locales, manifest, migrations, and source runtime must match.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. At minimum replace fxmanifest.lua, import.sql, config/config.lua, the complete config/locales and source directories, and the built UI supplied in the package.
Phase 3 of 5
Merge config
The new settings are plaintext/global policy and are not /jobconfig values. Both paths were absent in 1.38.1 and ship with false in 1.39.0:
config/config.lua
Config.ForceOffDutyOnLogin = false
Add persistPlacedProps to the existing block without changing its neighboring policy values or item catalogue. These two executable assignments show the exact release defaults:
In the table definition, insert persistPlacedProps = false between unchanged returnItemOnRemove = true and the existing items = { ... } catalogue. Set Config.ForceOffDutyOnLogin = true only to force every duty-capable player off duty after each framework login. Set Config.PropPlacement.persistPlacedProps = true only to save newly placed configured props in sky_jobs_placed_props and restore them after restarts.
/jobconfig continues to manage normal resource/job settings. Existing saved jobs and feature choices remain valid; no new required setting key is introduced by this release. The expanded tuning-pricing controls, warning text, impound wording, and dependent-resource fields arrive through the replaced UI and locale packages.
Phase 4 of 5
SQL & items
With Config.AutoExecuteQuery = true, the built-in migration performs the following changes automatically. With it disabled, execute the complete bundled import.sql after Base is updated:
migration.sql
ALTER TABLE `sky_jobs_vehicles`
ADD COLUMN IF NOT EXISTS `key_holder_identifier` VARCHAR(64) NULL,
ADD COLUMN IF NOT EXISTS `impound_reason` VARCHAR(255) NULL,
ADD COLUMN IF NOT EXISTS `impound_fee` INT NOT NULL DEFAULT 0,
ADD COLUMN IF NOT EXISTS `impounded_at` DATETIME NULL,
ADD COLUMN IF NOT EXISTS `impounded_by` VARCHAR(120) NULL,
ADD COLUMN IF NOT EXISTS `impounded_by_identifier` VARCHAR(64) NULL,
ADD COLUMN IF NOT EXISTS `impound_authority_job` VARCHAR(64) NULL,
MODIFY COLUMN `state` ENUM('stored', 'parked', 'impounded') NOT NULL DEFAULT 'stored',
ADD INDEX IF NOT EXISTS `idx_job_state` (`job`, `state`);
CREATE TABLE IF NOT EXISTS `sky_jobs_placed_props` (
`persistence_key` VARCHAR(96) NOT NULL,
`owner_resource` VARCHAR(64) NULL,
`payload` LONGTEXT NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`persistence_key`),
INDEX `idx_placed_props_owner_resource` (`owner_resource`)
);
UPDATE `sky_jobs_configurator_settings`
SET `settings` = '{}'
WHERE TRIM(`settings`) = '[]';
The complete table definition for new installations also uses state ENUM('stored', 'parked', 'impounded'), stores the seven new fleet columns, and adds idx_job_state (job, state). These definitions inherit the active database charset and collation. No new inventory item, image, or provider credential is required.
Phase 5 of 5
Restart & test
The console reports Base 1.36.0 before Jobs Base 1.39.0 starts.
sky_jobs_vehicles.state accepts impounded, all seven new columns exist, and idx_job_state is present.
sky_jobs_placed_props exists and empty Job Configurator settings are stored as {}.
Fleet parking, retrieval, reconnects, and keys return control to the current driver.
An authorized dependent job can impound and release a fleet vehicle with its reason and fee intact.
Config.ForceOffDutyOnLogin and Config.PropPlacement.persistPlacedProps each honor both false and true deliberately.
Shared training, recruitment, missing off-duty mapping warnings, and external tablet reinstallation work after a job change.
Placed items, trunk props, barriers, and tape can be removed once, return their item once, and restore only when persistence is enabled.
Exclusion-zone NPC cleanup remains effective when the closest client does not own the entity.
Version 1.38.1
Update sky_base to 1.35.1 before updating sky_jobs_base.
Highlights
Added a payroll policy that can pay salaries without checking or deducting society funds.
Changed the Dispatch app to ship disabled so existing servers retain legacy top-center notifications until the full app is deliberately enabled.
Notable Changes
Improved the built-in English fallback catalogue so missing translated tablet keys remain readable.
Fixed an issue where garage vehicles could show missing state labels while saved data was still loading.
Other Changes
Updated the package manifest for the 1.38.1 compatibility set.
Changed Files
sky_jobs_base/config/config.lua
sky_jobs_base/config/locales/*
sky_jobs_base/fxmanifest.lua
sky_jobs_base/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.38.01.38.1
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update Base to 1.35.1, stop the server, and back up the Jobs Base resource plus intentional config edits.
Install 1.38.1 as one clean package; its config, UI, locales, manifest, and runtime must match.
Phase 2 of 5
Replace files
Delete and reinsert the resource. Replace config/config.lua, fxmanifest.lua, the built UI, config/locales, and source completely.
Phase 3 of 5
Merge config
Both changes are plaintext/global policy and not normal /jobconfig settings:
config/config.lua
Config.Dispatch.enabled = false -- was true in 1.38.0
Config.Salary = {
enabled = true,
deductFromSocietyFunds = true, -- new in 1.38.1
accountType = "bank",
currency = nil,
payIntervalsWhileOnDuty = true,
defaultIntervalMinutes = 30,
minIntervalMinutes = 10,
maxIntervalMinutes = 180
}
Set deductFromSocietyFunds = false only when salaries should be created without society-fund validation or deduction.
Phase 4 of 5
SQL & items
No SQL, inventory item, image, stream asset, or provider credential changed.
Phase 5 of 5
Restart & test
Base 1.35.1 starts before Jobs Base 1.38.1.
Disabled Dispatch uses legacy notifications; enabling it deliberately restores the full app.
Funded payroll stops at insufficient society funds when true and pays without deduction when false.
Garage states and untranslated frontend keys show readable fallback labels.
Version 1.38.0
Update sky_base to 1.35.0 before updating sky_jobs_base.
Highlights
Cross-job sharing - selected cases, reports, warrants, BOLOs, training content, and vehicle records can be shared read-only with explicitly chosen jobs from a new Job Configurator Share tab.
Staffed response plans - dispatch response plans can require a minimum total crew in addition to unit types and counts.
Employee learning catalogue - training administration and employee-visible learning content are separated, with catalogue visibility and richer course material.
More durable job fleets - vehicle parking, reconnects, AdvancedParking integration, keys, colors, and disconnect behavior are more consistent.
Complete external tablet icons - every registered Jobs Base, Police, Ambulance, and Mechanic tablet app now ships with a matching bundled icon for LB Tablet and RoadPad.
Notable Changes
Dispatch uses exact job precedence, restores legacy notifications, and exposes response-plan evaluation to dependent job resources.
Colleague map blips ship restricted to Police and Ambulance, with explicit mutual visibility groups.
Recruitment updates live and permits a ten-meter recruiter-to-candidate distance.
Per-camera CCTV motion controls, variable-length prop lines, configurable job blip colors, tuning item quantities, and duplicate tuning items are supported.
The Job Configurator adds search, clearer subsections, sharing controls, and synchronized visibility for external tablet apps after job changes.
LB Tablet uses native iframe sizing by default to keep embedded Sky apps sharp. A per-app fixBlur override remains available for legacy layouts, and the new layout-repair version reapplies the synchronized descriptors and icons once.
Framework-confirmed duty changes prevent stale duty state across Jobs Base and Jobs Creator.
Other Changes
Camera uploads enforce bounds and reuse WebGL contexts; media deletion treats a provider 404 as already removed.
Job garages avoid duplicate vehicle keys and retain OneSync vehicles by default after the original driver disconnects.
Fire hydrant supply configuration now uses the exact saved key hoseVehiclePumpHydraulicsHydrantSupplyLitersPerSecond; the matching Fire update converts the former hoseVehiclePumpHydraulicsHydrantSupplyGpm override.
Manual and automatic schema definitions now inherit the active database character set and collation.
Newly synchronized tablet icons cover Dispatch, Training, Tracking, speed-camera reviews, appointments, medical evaluations, shared medical evaluations, health insurance, Mechanic subscriptions, and Mechanic parts deliveries; existing registered app icons remain aligned with the same catalogue.
Mechanic Parts Shop visibility follows its tablet-app restrictions, while the purchase permission remains enforced only by the ordering/payment action.
Shared UI, management, CCTV, training, map, storage, dispatch, and Job Configurator wording was completed across bundled locales.
Changed Files
sky_jobs_base/config/config.lua
sky_jobs_base/config/locales/*
sky_jobs_base/fxmanifest.lua
sky_jobs_base/import.sql
sky_jobs_base/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.37.01.38.0
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.35.0, stop the server, and back up the complete sky_jobs_base folder, the Job Configurator tables, training tables, and custom provider/config edits.
Install 1.38.0 as one clean package. Its frontend bundle, runtime, locale tree, SQL schema, and dependent job-resource contracts must match.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. Replace fxmanifest.lua, import.sql, config/config.lua, the complete config/locales directory including nested Job Configurator locales, and the complete source directory.
Phase 3 of 5
Merge config
Add the new global plaintext sharing policy; /jobconfig stores the individual rules separately:
The LB fixBlur default uses the provider's native iframe dimensions so embedded Sky apps remain sharp. Keep it true unless a specific legacy app was built around the old oversized iframe and transform scaling; that exception belongs at Config.Tablet.external.appOverrides.<app>.fixBlur = false. The exact new layoutRepairVersion runs the descriptor/layout repair once and installs the synchronized bundled icons without retaining duplicate entries from the former catalogue.
Config.Sharing is the server-wide limit and kill switch. In /jobconfig, open each job's Share tab and explicitly select permitted target jobs and content types. Dispatch minimumCrew belongs to each job's dispatchKeywords extension row; saved rows without the field resolve to 0. Keep allowedJobs = nil only when every job should use colleague blips, and keep groups = nil only when viewers should see their own job exclusively.
Fire's hydrant-capacity field now uses the exact saved key hoseVehiclePumpHydraulicsHydrantSupplyLitersPerSecond. The removed key was hoseVehiclePumpHydraulicsHydrantSupplyGpm; Fire 1.6.0 migrates an existing saved value to litres per second.
Phase 4 of 5
SQL & items
Automatic migration adds the following columns to sky_jobs_training_courses: learning_content LONGTEXT NULL and catalog_visible TINYINT(1) NOT NULL DEFAULT 0. When automatic migration is disabled, execute:
migration.sql
ALTER TABLE `sky_jobs_training_courses`
ADD COLUMN IF NOT EXISTS `learning_content` LONGTEXT NULL AFTER `description`,
ADD COLUMN IF NOT EXISTS `catalog_visible` TINYINT(1) NOT NULL DEFAULT 0 AFTER `learning_content`;
No new inventory item, provider secret, or streamed gameplay asset is required. The complete package includes the synchronized tablet SVG catalogue for every registered Jobs Base, Police, Ambulance, and Mechanic app; replace the complete source directory instead of copying individual icons into an older build. Existing courses remain hidden from the employee catalogue until catalog_visible is enabled deliberately. The updated manual and automatic schema definitions inherit the active database character set and collation.
Phase 5 of 5
Restart & test
The console reports sky_base1.35.0 and sky_jobs_base1.38.0 in that order.
The training table contains learning_content and catalog_visible.
A shared record is read-only for an allowed target job and unavailable to a non-target job.
A response plan with minimumCrew does not pass until enough personnel staff the selected units.
Employee-visible courses show only when catalogue visibility is enabled.
Only configured Police/Ambulance viewers receive the shipped colleague blips.
Recruitment succeeds within ten meters and rejects a more distant candidate.
A job vehicle remains after its original driver disconnects and can be reconciled or parked.
External tablet visibility refreshes after job and duty changes.
LB Tablet renders Sky apps at the native sharp scale, runs layout repair version 2026-08-17-app-icons-native-scale-1 once, and shows the bundled icon for every registered Jobs Base, Police, Ambulance, and Mechanic app without duplicate entries.
Mechanic Parts Shop visibility follows the configured tablet-app restriction, while an unauthorized purchase is still rejected by the ordering permission check.
Fire Job Configurator shows hydrant supply in litres per second under hoseVehiclePumpHydraulicsHydrantSupplyLitersPerSecond.
Version 1.37.0
Update sky_base to 1.34.0 before updating sky_jobs_base.
Highlights
Complete dispatch center - authorized staff can manage incident queues, assignments, status history, response planning, destinations, reporters, points of interest, announcements, and virtual units with callsigns, types, icons, channels, and status codes.
Dedicated radio workspace - a configurable hardware-style radio remains available outside the tablet with position, size, buttons, tones, alarms, channel join/leave, transmit state, and responsive volume controls.
Advanced training management - courses, sessions, enrollment approvals, results, qualifications, expiry, reminders, and audit history are managed through a permission-aware tablet app.
Organization Units - jobs can create departments or units, assign members, define unit permissions, and restrict configured job vehicles to selected units.
External tablet delivery - apps can run as individual entries or an all-in-one workspace on LB Tablet and RoadPad, including authorization, inherited sessions, retries, and lifecycle handling.
Persistent and controllable job fleets - AdvancedParking, CD Garage, or native persistence can preserve active job vehicles, while explicit remove/sell modes define who may retire shared fleet entries and whether a refund is paid.
Notable Changes
Numeric frequencies remain readable, compact incident chat and logs use the available space better, and current coordinates can be captured as incident locations.
Dispatch starts reliably after resource initialization; the radio represents an unassigned state correctly, supports Alt interaction, removes obsolete keypad overlays and flicker, and stabilizes navigation, scrolling, selection, and unavailable controls.
Dispatch alerts and panic alerts reach the intended job members, support optional silent metadata, and can play separate radius-based xSound cues without blocking the alert when xSound is unavailable.
The dispatch permission uses ID 21; Organization Unit management uses ID 22.
Handcuff keys are no longer required by default, and stuck cuff interaction state is cleared during player and resource lifecycle changes.
Shared carry is enabled by default, permits conscious targets and carriers inside vehicles, and skips acceptance only for incapacitated targets.
Player search can hide the searched player's name while retaining combined item and weapon results.
Recruitment now validates a maximum 5.0 meter distance between recruiter and candidate.
Duty and multi-job state are normalized against the active framework, and stale off-duty salary payouts are prevented.
Tablet access validates the current job, duty state, and configured requirements on the server before opening protected apps.
Item images resolve automatically from the ordered inventory sources used by storage and shop interfaces.
Vehicle-attachment interaction spheres match their configured size, and creator synchronization no longer leaves connecting players waiting indefinitely.
Removed storage props disappear for every nearby client instead of remaining visible for other players.
Job Configurator editors now handle numeric medical values, mechanic class pricing and previews, localized cloakroom skins, speed-camera settings, protective equipment, mission rewards, pump fields, and cleanup access consistently.
Other Changes
The boss menu was rebuilt around shared page headers, fields, selectors, switches, ranges, date ranges, responsive tables, and accessible action controls across light, dark, and blue-dark themes.
Management now has a full-height standalone layout, clearer selected navigation, compact deposit/withdraw controls, and consistent transaction, role, member, finance, log, and billing-spec surfaces.
The duty terminal keeps its clock, live status, and completed shift duration aligned and avoids overflowing long shift messages.
Storage surfaces received clearer controls and now follow the active job theme consistently.
A reusable multi-select displays readable labels while the server still validates vehicle selections against the effective job configuration.
Delivery-timer editor labels were removed after the corresponding workflow moved to a dedicated tablet view.
Italian was added; shared interface, Dispatch, Fire, Mechanic, Police, Ambulance, cloakroom, reward, and configurator wording was completed or corrected across bundled locales.
Tablet app icons are generated before the frontend build, LB layout repair refreshes stale app icons, radio image assets keep stable package names, and the test runner now includes both JavaScript test formats.
Six public integration exports expose the active tablet session, safe external-session matching and closing, generated RoadPad app descriptors, and server-authoritative extension of job-vehicle access.
Public API, setup, external-tablet, Dispatch, and shared-form documentation was expanded together with regression coverage for the new management, duty, garage, radio, training, access, synchronization, and UI behavior.
Changed Files
sky_jobs_base/config/config.lua
sky_jobs_base/config/init.lua
sky_jobs_base/config/locales/*
sky_jobs_base/fxmanifest.lua
sky_jobs_base/import.sql
sky_jobs_base/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.36.01.37.0
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update Base to 1.34.0, then stop the server. Back up the complete sky_jobs_base folder, config/config.lua, all sky_jobs_* database tables, saved Job Configurator settings, and role permissions. Preserve the active external-tablet provider configuration separately.
Do not overlay 1.37.0 on 1.36.0. The new server modules, generated interface, SVG icons, audio files, manifest order, config, locales, and SQL schema are one release unit.
Phase 2 of 5
Replace files
Delete and reinsert the complete resource. At minimum, replace fxmanifest.lua, source, the complete built UI, config/config.lua, config/init.lua, config/locales, and import.sql. Do not restore an old source/html bundle, generated icon, radio asset, config section, or SQL file after copying the new package.
Phase 3 of 5
Merge config
Use the new config/config.lua as the base. The following values are shared plaintext configuration and are not ordinary per-job /jobconfig values. These complete assignments are executable after the packaged config tables.
Config.Tablet.external.enabled = true prepares the integration but does not select it in Base. The shipped Base default remains Config.tablet = "default", so the built-in Jobs Base tablet remains active. Set Base's Config.tablet = "lb" or Config.tablet = "roadpad" only as a deliberate opt-in. mode = "apps" creates individual entries; mode = "all-in-one" uses allInOne. appOverrides controls individual entries, lb.nativeDuplicates defines the optional native mapping, and lb.managedAppKeys accepts separately installed Sky app keys. When opting in, start the chosen provider before sky_base. After an LB mode or descriptor change, restart lb-tablet, sky_base, and sky_jobs_base. For RoadPad, replace every existing sky_jobs* object in roadpad/public/static/config/config.json -> AppStore with every object from the generated roadpad-apps.generated.jsonapps array; never append the generated objects to stale Sky entries.
Keep the packaged Training section. These copyable assignments cover every allowed runtime default and permission introduced in 1.37.0:
The saved /jobconfig keys are dispatchSettings, dispatchChannels, dispatchStatusCodes, dispatchVehicleTypes, dispatchVehicles, dispatchKeywords, and dispatchPois. Allowed dispatchSettings defaults covered by this release are enabled = true, centerEnabled = true, incidentAssessmentEnabled = true, defaultChannel = "", noUnitFallback = true, and averageResponseSpeedKmh = 70; dispatchStatusCodes defaults to the six entries above. Saved Training and Dispatch values override the Lua defaults, so review and save every affected job. With announcements or spatial sounds enabled, start xsound before sky_jobs_base; if it is unavailable, alerts continue without 3D audio.
"auto"; accepts "advancedparking", "cd_garage", or "none"
Config.JobGarage.deleteVehicleOnPlayerDropped
Missing
true; native mode only
Config.JobGarage.vehicleRemovalMode
Missing
"sell"; accepts "disabled", "remove", or "sell"
Config.JobGarage.allowAllEmployeesToRemove
Missing
false; otherwise the existing sell-vehicle permission is required
Config.JobGarage.sellPercentage
50
Still 50; valid refund range is 1 through 100 in sell mode
Config.Panic.allowedJobs
Fixed list
nil; falls back to all registered job resources
Carry acceptance remains enabled for conscious targets and is skipped for incapacitated targets. Garage "auto" selects the one started persistence provider, uses native mode when neither is started, and fails visibly if both are started. Start the selected provider before sky_jobs_base or select it explicitly. Grant Dispatch permission 21 and Manage Units permission 22 only to intended roles after startup; new privileges are not granted automatically.
New client exports are GetTabletState() -> { open, appKey, route, surface, resource, session }, IsExternalTabletOpen() -> Boolean for an LB, RoadPad, or embedded provider-owned surface, MatchesExternalTabletSession(payload) -> Boolean after matching surface, resource, and session plus an optional appKey, and CloseExternalTabletSession(payload) -> accepted, closedState, with stale sessions rejected. New server exports are GetRoadPadTabletApps(), which returns the generated AppStore descriptors only when external integration is enabled and Base selects RoadPad, and RegisterVehicleAccessProvider(provider) -> Boolean. A registered vehicle-access callback receives (source, jobName, model), may only add catalogue, purchase, spawn, or trunk access, and is removed when its owner resource stops.
Phase 4 of 5
SQL & items
Before startup, inspect the storage engine of the existing configurator-settings table. CREATE TABLE IF NOT EXISTS and the automatic migration apply InnoDB only when creating a missing table; they do not convert an existing one.
SELECT TABLE_NAME, ENGINE
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'sky_jobs_configurator_settings';
If the table exists and its engine is not InnoDB, convert it only after the database backup:
ALTER TABLE sky_jobs_configurator_settings ENGINE=InnoDB;
When Config.AutoExecuteQuery = true, the packaged migration creates missing tables and columns during startup. When it is false, run the complete new import.sql before startup. The release adds:
sky_jobs_organization_units and sky_jobs_organization_unit_members, with member rows removed automatically when their unit is deleted.
sky_jobs_dispatch_incidents, sky_jobs_dispatch_incident_log, sky_jobs_dispatch_incident_units, sky_jobs_dispatch_unit_state, and sky_jobs_dispatch_audit.
sky_jobs_training_courses, sky_jobs_training_sessions, sky_jobs_training_enrollments, sky_jobs_training_qualifications, and sky_jobs_training_audit.
The incident schema also gains a nullable long-text details field. The complete import.sql includes this separate upgrade statement for an already existing table:
ALTER TABLE `sky_jobs_dispatch_incidents`
ADD COLUMN IF NOT EXISTS `details` LONGTEXT NULL AFTER `message`;
A newly created sky_jobs_configurator_settings table uses InnoDB. An existing table reaches that required engine only through the explicit check and ALTER TABLE step above.
No new inventory item or image registration is required. Roles do not receive new privileges automatically; grant Dispatch permission 21 and Manage Units permission 22 deliberately, then save the roles.
Phase 5 of 5
Restart & test
Restart in dependency order: the deliberately selected external providers first, then sky_base, sky_jobs_base, and every installed job resource. With the built-in tablet default, begin at sky_base. After an LB mode or descriptor change, restart lb-tablet before Base and Jobs Base.
Base reports 1.34.0 and Jobs Base reports 1.37.0 in that order.
Existing saved Job Configurator values still load, and edited Training/Dispatch settings persist after restart.
Dispatch incidents, assignments, status changes, radio channel/volume controls, announcements, and silent alerts work for authorized staff.
Courses, sessions, approvals, results, qualifications, expiry, and audit entries persist.
Organization Units can assign members, permissions, and only valid vehicles from the effective job configuration.
With Base Config.tablet = "default", the built-in Jobs Base tablet remains active; an external provider is used only after deliberately selecting "lb" or "roadpad".
After an external opt-in, the provider starts before Base; LB entries authorize after a provider/Base/Jobs Base restart, or RoadPad's AppStore contains only the current generated sky_jobs* objects.
External tablet entries authorize, navigate, close, return, and recover from a stale session without duplicate focus.
Client tablet-state/session exports reject stale ownership, RoadPad descriptors appear only in the selected mode, and a registered vehicle-access provider can grant but never revoke normal access.
Cuffs, carry, search privacy, recruitment distance, panic recipients, and protected tablet access follow the new defaults.
Persistent or native job vehicles survive/release exactly according to the selected provider and removal mode.
Update sky_base to 1.33.0 before updating sky_jobs_base.
Highlights
Central civilian interaction policy - servers can opt in to cuffs, zipties, leg restraints, escorting, vehicle placement, head bags, and searches for civilians through one safe-off shared configuration.
Shared player carry engine - one server-authoritative carry flow now serves civilians and installed job resources, including acceptance, distance, conscious-target, sprint, vehicle, animation, and attachment rules.
Multi-provider media uploads - FiveManage and Qbox CDN are built in, custom providers can register centrally, and management/tablet media flows share the selected provider.
More reliable job garages - persistent vehicles retain a stable catalogue identity, duplicate models remain distinguishable, grade-restricted owned vehicles can still be returned, and location-specific vehicle-class rules are supported.
Notable Changes
Metal handcuffs can require the new non-consumable handcuffs_keys item for removal.
Player searches can combine items and weapons into one view.
Ordered item, weapon, prop, ped, and vehicle image sources replace the old single-URL fields while preserving legacy aliases for integrations.
Civilian target actions are automatically registered through the selected Sky target adapter when enabled.
Calendar creators can edit entries; garage state, billing prices, radial target payloads, trunk targets, creator markers, and boss-menu currency/map presentation are synchronized more reliably.
Successful manual dashcam recordings are now stored in the job gallery and report a visible save error if gallery persistence fails.
Illenium Appearance wardrobe points now open job outfits, and configurator selectors hide unavailable resource integrations.
Serbian shared and Job Configurator translations were added, alongside wider locale coverage.
Other Changes
Added custom management permission registration and documented central carry, civilian access, media-provider, image-source, and garage APIs.
Blip values are normalized before reaching FiveM natives.
Changed Files
sky_jobs_base/config/config.lua
sky_jobs_base/config/init.lua
sky_jobs_base/config/inventory/handcuffs_keys.png
sky_jobs_base/config/inventory/README.md
sky_jobs_base/config/locales/*
sky_jobs_base/config/webhooks.lua
sky_jobs_base/fxmanifest.lua
sky_jobs_base/import.sql
sky_jobs_base/source/* — delete and reinsert
Update InstructionsA guided update for server owners1.35.11.36.0
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Back up the complete resource plus config/config.lua and config/webhooks.lua. Do not restore an old source, source/html, manifest, locale, or generated UI file over the new package.
Phase 2 of 5
Replace files
Install the full package. In particular, keep the new civilian-interaction and player-carry runtime, media-provider runtime, handcuffs_keys.png, DOJ Job Configurator files, current frontend bundle, and updated API documentation.
Phase 3 of 5
Merge config
Start from the new config/config.lua. /jobconfig manages each job resource's registered values, but it does not manage the shared settings below.
Config path
1.36.0 shipped value / action
Config.Nui.itemImageBases
New ordered list; default https://cdn.sky-systems.net/items
Config.Nui.weaponImageBases
New ordered list; default https://cdn.sky-systems.net/weapons
Config.Nui.propImageBases
New ordered list; default https://cdn.sky-systems.net/props
Config.Nui.pedImageBases
New ordered list; default https://cdn.sky-systems.net/peds
Config.Nui.vehicleImageBases
New ordered list; default https://cdn.sky-systems.net/vehicles
Config.Cctv.allowedJobs
Changed from { "police", "ambulance", "firefighter" } to { "police", "ambulance", "fire" }
Config.PoliceCuffs.key.enabled
New: true
Config.PoliceCuffs.key.item
New: "handcuffs_keys"
Config.PlayerSearch.combineWeapons
New: true; set false for separate item and weapon tabs
Replace the old singular itemImageBase, weaponImageBase, propImageBase, pedImageBase, and vehicleImageBase fields with the matching ordered arrays. Uncomment and reorder the supplied inventory presets as needed.
The Jobs Base SQL adds nullable sky_jobs_vehicles.catalog_id VARCHAR(100) so saved vehicles remain tied to the correct catalogue entry. Run the current import.sql if Config.AutoExecuteQuery is disabled.
Add the handcuffs_keys item to the active inventory and copy config/inventory/handcuffs_keys.png when the inventory does not consume bundled definitions automatically. The item is not consumed when cuffs are removed.
Phase 5 of 5
Restart & test
Base reports 1.33.0 and Jobs Base reports 1.36.0.
Existing owned garage vehicles still appear and can be returned after the SQL migration.
Duplicate vehicle models retain distinct labels, restrictions, and purchase entries.
Metal cuffs require handcuffs_keys; ziptie removal keeps its configured cutter rules.
Config.CivilianUse.enabled = false exposes no civilian actions; an intentional opt-in exposes only enabled actions.
Civilian and job carry sessions start, accept/decline, stop, and clean up correctly.
The selected media provider can upload and delete a test image.
All configured image-source fallbacks and current job configurators render correctly.
Version 1.35.1
Update sky_base to 1.32.1 before updating sky_jobs_base.
Highlights
Restrained-state protection across job tools - handcuffing now closes active job interfaces and blocks tablet, multi-job, panic, incident, radial, and protected interaction actions until the player is released.
Gang-aware shared tablet access - QBCore and Qbox gangs can receive explicitly registered tablet apps independently from a player's regular job.
Expanded Fire Job Configurator - configurable pump vehicles render as clear cards with compact intake/outlet editors, conditional controls, localized labels, and simple/enhanced panel support.
Context-aware direct action keybinds - cuffs and zipties now use apply/remove toggles based on the nearest player's current restraint, with shared default mappings enabled.
Notable Changes
Handcuff interaction distance increased from 2.0 to 4.0, and players cannot fire or interrupt the handcuffing sequence with conflicting controls.
Remove this old block; crime_ziptie now toggles apply/remove
Config.JobRadial.keybinds.escort.key
"L"
"6"
Config.JobRadial.keybinds.escort_vehicle.key
"O"
"7"
Config.JobRadial.keybinds.escort_take_out.key
"U"
"8"
Config.Nui.weaponImageBase keeps the same shipped value. Only its comment now documents both supported weapon-image naming formats.
/jobconfig automatically receives the new Ambulance maximum-health label and Fire pump-panel editor when the matching job resource is updated. Do not add those labels to sky_jobs_base/config/config.lua.
Phase 4 of 5
SQL & items
No SQL migration, new inventory definition, or image copy is required for 1.35.1.
The console reports sky_base1.32.1 and sky_jobs_base1.35.1.
Cuff and ziptie toggle keybinds select the correct apply/remove action.
Handcuffing closes active job interfaces and blocks protected actions until uncuffed.
Off-duty jobs and jobs without native duty state receive the correct tablet and duty behavior.
A gang-only tablet app appears only for its configured QBCore/Qbox gang.
Lowercase item and weapon image files render correctly.
Fire pump vehicles appear as editable cards in /jobconfig.
Version 1.35.0
Update sky_base to 1.32.0 before updating sky_jobs_base.
Highlights
Shared player-interaction system - handcuffs, zipties, leg restraints, escorting, vehicle placement, head bags, searches, restraint escape, and administrator restraint commands now use one server-authoritative Jobs Base system shared by supported job resources.
Personal job-garage ownership - fleets can remain shared, belong to individual employees, or support transfers between employees, with configurable job or personal payment and clearer ownership information in the garage UI.
More capable shared tablet and creator tools - trusted job apps can open inside the shared tablet, attachment placement is easier to control, and Fire personnel can use the shared camera network.
Persistent mounted equipment - registered prop items can support controlled wall placement, job/duty-based removal, saved custom mounts, and reliable cleanup without changing ordinary ground props.
Notable Changes
Cuff escape is validated by the server and can be tuned for chance, timing, difficulty, cooldown, and supported restraint types.
Shared radial actions support grouped submenus and optional direct keybinds.
Restraint item documentation and ready-to-copy images now live with sky_jobs_base.
Switching jobs resets duty correctly, off-duty players no longer receive salary synchronization, and management changes refresh more reliably.
Job garages preserve canonical plates through storage, modification, ownership, and transfer flows.
Config.MultiJob.showDefaultJob now defaults to true, making the configured fallback job selectable.
Unrelated map blips are preserved when shared job blips refresh.
Other Changes
Improved garage lists, vehicle details, statistics, ownership layout, and transfer verification.
Expanded shared and Job Configurator translations.
Fixed missing item and weapon images in shared shop and storage screens when image files use lowercase names but configured item names use uppercase or mixed case.
Updated the resource version to 1.35.0.
Update InstructionsA guided update for server owners1.34.01.35.0
Guided update
Update sky_jobs_base safely
Complete the five phases in order. Your progress is kept while this page remains open.
0 / 5phases complete
Phase 1 of 5
Prepare
Update sky_base to 1.32.0 first, then stop the server. Create both backups before touching the live files:
Back up
Safe location
Complete sky_jobs_base folder
Outside the live resources folder
Database
A restorable SQL dump
Your edited config and webhook files
Separate custom-config folder
Do not install 1.35.0 over the existing folder. This release changes the shared runtime and rebuilt tablet interface.
Phase 2 of 5
Replace files
Replace the resource cleanly:
Action
Current server path
New package / destination
Delete
resources/[sky]/sky_jobs_base
Remove only after both backups exist
Copy
—
Copy the new sky_jobs_base folder to resources/[sky]/sky_jobs_base
Keep from new release
fxmanifest.lua, source, and source/html
Never restore these from 1.34.0
Keep from new release
config/locales and config/inventory
Contains the current translations, item guide, and restraint images
Merge only your values
Backed-up config/webhook files
Apply intentional values to the matching new files
Confirm that config/inventory includes handcuffs.png, zipties.png, wire_cutter.png, legcuffs.png, and headbag.png.
This image compatibility change adds no config value, SQL migration, locale, API, or inventory definition. Keep the complete new source/html folder so the updated shared interface is installed.
Phase 3 of 5
Merge config
Start with the newconfig/config.lua. Copy your server-specific values into it; do not replace it with the old file.
The complete public 1.34.0 → 1.35.0 migration is grouped below. /jobconfig does not replace any of these shared Jobs Base values.
Config path
Old behavior
New shipped value / action
Config.CommandPermissions.admincuff
Did not exist
Add your permission groups; shipped { "god", "superadmin", "admin" }
Config.CommandPermissions.adminuncuff
Owned by Police
Add it here with your permission groups
Config.MultiJob.showDefaultJob
false
true; keep false only if the fallback job must stay hidden
Config.Cctv.allowedJobs
Not explicitly set
{ "police", "ambulance", "firefighter" }, or your own job/group allowlist
Keep every additional group supplied by the new package and deliberately review its booleans instead of copying the old Police Config.CivilianUse block.
Keep the complete new Config.PoliceCuffs block. These are all fields that must exist:
Do not paste the old Police cuff block over this one: it is missing the server-authoritative escape chance, delay, cooldown, latency, decoy, and ziptie rules.
Duty and job access no longer belongs inside those blocks. Configure it once through Config.JobPlayerInteractions.groups.
The head-bag self-remove command is now sky_jobs_base_headbag_remove_self; do not restore the old Police command name.
Add these three fields directly below Config.JobGarage.parkKey:
config/config.lua
ownershipMode = "shared", -- "shared", "personal", or "personal_transferable"
paymentSource = "job", -- "job" or "personal"
personalPaymentAccount = "bank"
Choice
Result
ownershipMode = "shared"
Existing shared fleet behavior
ownershipMode = "personal"
Each purchased vehicle belongs to one employee
ownershipMode = "personal_transferable"
Personal ownership plus employee transfers
paymentSource = "job"
Purchase uses job/society funds
paymentSource = "personal"
Purchase uses the buyer's configured personal account
Start with the shipped shared + job combination unless you have deliberately planned personal ownership and payment.
Keep the complete Config.JobRadial.keybinds and Config.JobRadial.providers blocks. Direct keybinds remain globally disabled until keybinds.enabled = true.
Action entry
Shipped command
Default key
Handcuff
sky_jobs_handcuff
J
Remove cuffs
sky_jobs_unhandcuff
K
Apply zipties
sky_jobs_ziptie
H
Cut zipties
sky_jobs_unziptie
N
Escort/release
sky_jobs_escort
L
Place in vehicle
sky_jobs_escort_vehicle
O
Remove from vehicle
sky_jobs_escort_take_out
U
Every action entry also has enabled and description. providers stays an empty table unless a custom radial provider cannot register itself.
After every matching job resource is updated, open /jobconfig and review:
Resource
New or expanded settings
Police
Billing feature plus the Police behavior that now delegates to the shared interaction blocks
Mechanic
Lift-bypass vehicle classes/models and Charge public self-service orders
Ambulance
New shop medications, treatment randomization, and transfusion venous access
Fire
Extinguisher placement/maintenance, wall alignment, custom mounts, door overview, and male/female protective gear
Shared command permissions, interaction access, cuffs/escape, leg restraints, head bags, escort/search, garage ownership, CCTV, and radial keybinds still come from sky_jobs_base/config/config.lua.
Phase 4 of 5
SQL & items
Choose exactly one database path:
Your setting
Required action
Config.AutoExecuteQuery = true
Do not import SQL manually. The resource applies the migration during its first start.
Config.AutoExecuteQuery = false
While the server is stopped, run the new sky_jobs_base/import.sql once in your database manager.
The migration adds sky_jobs_vehicles.ownership_mode, owner_identifier, and payment_source plus idx_job_owner (job, owner_identifier), and applies the remaining required shared schema updates. Keep all existing rows.
If your inventory does not load bundled images, copy the five PNG files from sky_jobs_base/config/inventory into its image folder. Register the matching handcuffs, zipties, wire_cutter, legcuffs, and headbag items only when they do not already exist.
The console reports sky_base1.32.0 and sky_jobs_base1.35.0 without SQL errors.
Job switching resets duty correctly and the configured default job visibility is correct.
Cuffs, zipties, escape, leg restraints, head bags, escort, vehicle placement, and search work with two players.
/admincuff and /adminuncuff obey your permission groups.
Shared and personal garage purchase, storage, and transfer behavior matches your chosen ownership mode.
Radial submenus, embedded tablet apps, Fire camera access, and mounted-prop placement/removal work.
Version 1.34.0
Update sky_base to 1.31.0 before updating sky_jobs_base.
Highlights
Expanded tablet personalization - the new Full Dark theme, switchable tablet cases, and job-specific default themes give each service a clearer visual identity.
Refreshed shared tablet experience - Gallery, Calculator, Settings, Boss Menu, selects, image handling, and the main map received a coordinated usability and visual update, including a detailed GTA map and Cayo Perico coverage.
Optional EmergencyDispatch integration - dispatches can route through EmergencyDispatch when explicitly enabled, while the built-in Sky provider remains the safe default.
More reliable Job Configurator workflows - callback timeouts and mutation deadlocks were corrected, numeric values keep the intended precision, runtime table values survive refreshes, and string-list table fields can be edited directly.
Notable Changes
Added Config.MultiJob.showDefaultJob so the fallback job can remain active internally without appearing in the player job menu.
Salary payouts are now limited to jobs registered with Sky Jobs.
Station blips are replaced and cleaned up correctly instead of duplicating after refreshes or resource restarts.
Role-structure editing is only offered on the framework that supports it.
Job images now accept PNG and WebP sources throughout shared menus and vehicle views.
Added localized creator section labels for Fire Stations and Mechanic Workshops.
Expanded Fire Job, Police Job, and Ambulance Job configurator translations, including dedicated Duplicate action labels in every bundled language.
Added cleanup support for resource-owned trunk props and improved general creator stability.
Other Changes
Improved map zooming and dragging and removed obsolete map alignment offsets.
Download sky_jobs_base from the CFX Portal and create a resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so version 1.34.0 is loaded.
Replace /config/locales to install the updated shared and Job Configurator translations.
The following shared /config/config.lua values are not replaced by saved /jobconfig settings and must be merged manually when keeping an existing config:
Add showDefaultJob = false to Config.MultiJob. Set it to true only when the configured fallback job should remain selectable in the player menu.
Copy the complete new Config.EmergencyDispatch block. It includes the top-level enabled and resource fields plus the nested client/server fallback, refresh, vehicle, and dispatch settings. Keep enabled = false unless the emergencydispatch resource is installed and intentionally configured.
No SQL migration is required.
Restart sky_jobs_base, then restart every dependent job resource.
If you use /jobconfig, verify creator labels, numeric fields, table string lists, and the connected Fire/Police/Ambulance settings before saving.
Version 1.33.0
Update sky_base to 1.30.0 before updating sky_jobs_base.
Highlights
Complete Job Configurator support toolkit - configurations can now be exported for support, imported again, checked with a safe repair preview, reviewed through revision history, and reset with an exact preview. History compares normalized values so unchanged JSON data no longer appears as a change, and a global reset also clears its revisions.
Radial action submenus - categorized actions open in nested radial levels, the center now shows a close icon at the root and an undo-2 back action inside submenus, and target context remains attached to the selected action.
Shared vehicle attachment editor - supported job resources can position equipment with a gizmo, local/world transform modes, free camera controls, and reusable attachment settings.
Safer job lifecycle management - job deletion and related creator cleanup are serialized, default jobs can be removed deliberately, and connected resources can block deletion while active service work remains.
Controlled cross-job chat - optional per-job rules define which job members, groups, conversations, and unread counts are visible without exposing unrelated job data.
Notable Changes
Added per-job station blip configuration and support for creator locations shared by multiple jobs.
Added secure fleet vehicle resale with persisted purchase prices and a configurable refund percentage.
Added live oil-spill management and the shared in-world prop-offset measurement tool.
Added movable streamed props, authoritative transform updates, ownership cleanup on resource stop, and safer item returns when placed props cannot be picked up.
Added Job Configurator coverage for the Crime System, Fire Job, Police speed-camera exclusions, and additional Ambulance locales.
Added installed resource versions to the Job Configurator job selector without repeated console output.
Improved single-job creator entry management, offline rank updates, AI medic availability refreshes, and FiveManage setup guidance.
Job duty is now read fresh from the active framework session instead of being restored from stale local persistence.
Improved tablet reopening, radial input, framework job lookup caching, wardrobe metadata, job markers, responsive layouts, and image fallback handling.
Other Changes
Added configuration for the prop-offset tool, job chat visibility, fleet sales, and radial submenu timing.
Expanded shared and Job Configurator locale coverage across all supported languages.
Updated the resource version to 1.33.0.
Update sky_base to version 1.30.0.
Download sky_jobs_base from the CFX Portal and create a database and resource backup.
Replace the /source folder, including the rebuilt interface under /source/html.
Replace /fxmanifest.lua so version 1.33.0 is loaded.
Replace /config/locales.
The shared /config/config.lua settings below are not replaced by saved /jobconfig values. Merge them manually when you keep your existing config:
Add the propoffset entry to Config.CommandPermissions and copy the complete Config.PropOffsetTool block (enabled, maxDistance, and outputKey).
Add Config.Chat.jobViewJobs. Leave it nil for own-job/job-group visibility, use a job list for selected cross-job access, or true for access to every registered job.
Keep or add Config.JobGarage.sellPercentage = 50; set it to 0 when fleet vehicle sales should be disabled.
Add Config.JobRadial.submenuOpenDelayMs = 350 for hold-mode submenu navigation.
Review /config/webhooks.lua and keep your existing private FiveManage Media token.
Run the updated /import.sql before starting the resource if automatic query execution is disabled. It adds configurator revision/history storage, deleted-job tracking, initialization state, and stored fleet purchase prices.
Restart sky_jobs_base, then restart every dependent job resource.
If you use /jobconfig, verify Share, Import, Repair, History, reset preview, job blips, and radial submenus before making production changes. Servers that do not use /jobconfig must also apply the manual config.lua changes listed in each updated job resource below.
Version 1.32.0
Update sky_base first - install version 1.29.0 or newer before updating sky_jobs_base.
Highlights
Locations can be shared between jobs - selected jobs can reuse a physical location while keeping their own storage, garage, wardrobe, and job configuration separate.
Reliable radial toggle and providers - the radial now opens with registered job actions ready, closes consistently with the configured key, and no longer blocks other job interaction keybinds.
New shared select controls - management, tablet, and configurator screens now use a consistent searchable select with keyboard navigation and reliable dropdown positioning.
Broader Job Configurator support - integer settings, hospital bed fields, wheel-damage groups, and connected job locale coverage have been expanded.
More reliable creator and map workflows - creator interactions, trunk actions, hydrant markers, tablet markers, and cleanup behavior now stay aligned more consistently.
Notable Changes
Improved management themes - light-theme management views and select dropdowns now remain readable across their supported screens.
Better configurator guidance - warnings now appear with the settings they describe, and duplicate creator sections are removed.
Hospital and vehicle configuration expanded - hospital creator fields and localized vehicle wheel-damage settings are now available to connected job resources.
Database-dependent job registration stabilized - job registration now waits for database migrations to finish.
Trunk navigation and availability fixed - trunk prop navigation includes a back action and unavailable trunk options no longer remain usable after a restart.
Tablet map behavior improved - map zoom, markers, hydrants, and blip cleanup are more reliable.
Other Changes
Added and synchronized configurator locales for ambulance, mechanic, and fire job settings.
Standardized internal debug output and refined creator interaction handling.
Updated the resource version to 1.32.0.
Update sky_base to version 1.29.0 or newer.
Download sky_jobs_base from the CFX Portal and create a backup.
Replace the /source folder, including the rebuilt in-game interface under /source/html.
Replace the /config/locales folder.
Replace /fxmanifest.lua so version 1.32.0 is loaded.
Restart sky_jobs_base and all dependent job resources.
No SQL migration is required.
Use this only if a Job Configurator is broken and cannot be repaired through /jobconfig. This permanently removes the saved jobs, features, settings, and interactions for the selected resource.
Stop the server and create a database backup.
Replace sky_ambulancejob in both statements with the affected configuration key: sky_ambulancejob, sky_policejob, sky_mechanicjob, or sky_firejob.
Run:
DELETE FROM `sky_jobs_configurator_settings`
WHERE `config_key` = 'sky_ambulancejob';
DELETE FROM `sky_jobs_configurator_jobs`
WHERE `config_key` = 'sky_ambulancejob';
Start the server again. The affected job resource imports its shipped Job Configurator defaults automatically.
Open /jobconfig and verify the restored jobs and settings.
This reset does not delete separate creator data such as hospitals, hospital beds, jails, or other placed creator entries.
Version 1.31.0
Update sky_base first - install the matching release before updating sky_jobs_base.
Highlights
Expanded shared Job Configurator workflows - the shared configurator now supports broader editing flows, clearer save behavior, and a more consistent setup experience across connected job resources.
Improved radial and map interactions - shared radial actions and tablet-map interactions are now more capable and reliable, enabling smoother job-side action flows.
Refined shared preview and media handling - item and vehicle previews now resolve more consistently, improving how shared job interfaces present visual content.
Notable Changes
Config imports into the Job Configurator - existing local job settings can now be adopted more cleanly into the shared configurator workflow.
More flexible save behavior in the configurator - different configuration areas can now be handled more appropriately during editing and saving.
Ped previews in configurator flows - supported setup screens now provide better live preview behavior while editing.
Remote job map actions expanded - shared tablet-map flows now support broader remote interaction use cases for connected job resources.
Improved boss transaction feedback - management and billing-related actions now surface clearer feedback when a transaction cannot be completed.
Arabic locale added - sky_jobs_base now includes Arabic language support.
Creator and interaction reliability improvements - creator-backed settings and interaction states now stay aligned more consistently during editing and reloads.
Other Changes
Locale loading and shared frontend handling were streamlined for better consistency.
Documentation and shared configuration guidance were updated for the newer configurator behavior.
Update sky_base first - install the matching release before starting sky_jobs_base.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace /fxmanifest.lua so version 1.31.0 is loaded.
If you keep your existing config/config.lua, merge the updated Config.JobRadial options from the shipped file so the newer shared targeting behavior is available.
No SQL migration is required.
Version 1.30.0
Update sky_base first, then update sky_jobs_base before starting the connected job resources.
Highlights
Mechanic order parts can now come from job storage - mechanic jobs can choose whether tuning-order parts are taken from the player's inventory or from the shared faction storage.
Billing price management was improved - bosses can manage Job Configurator billing prices more reliably, including default prices, saved labels, and custom billing positions.
Billing editors are easier to use - structured billing controls and billing price lists now appear directly inside the right Job Configurator pages instead of requiring raw JSON or separate confusing tabs.
Notable Changes
Added shared storage helpers so connected job resources can count and remove items from station storage safely.
Added the mechanic-only Order item source dropdown to the Job Configurator General page.
Bossmenu Billing & Prices now loads default billing prices from the Job Configurator, keeps default rows protected, and supports custom price keys generated from labels.
Billing price labels are now saved in the billing specs table and synchronized back into the Job Configurator payload.
Resource-owned billing settings now render as normal controls with readonly fields, toggles, selects, and cleaner item-list behavior.
Instant Tuning received a dedicated Tuning editor so public tuning locations can be limited to selected categories, stages, and options.
Shared debug messages now respect the sky_base debug setting more consistently.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder, including the rebuilt /source/html files.
Replace /fxmanifest.lua so the new version is loaded.
Run the updated import.sql, or let the automatic migration add the new billing label column if enabled. If automatic migrations are disabled, run:
ALTER TABLE `sky_jobs_billing_specs`
ADD COLUMN `label` VARCHAR(160) NULL AFTER `reason`;
Restart sky_jobs_base, then restart connected resources such as sky_mechanicjob.
Open /jobconfig and verify the Mechanic General, Billing, and Instant Tuning sections.
::
Version 1.29.0
Update sky_base first - install the matching release before updating sky_jobs_base.
Highlights
Expanded Job Configurator coverage - the shared configurator now supports more advanced setup flows for connected job resources, including richer placement controls, better jail-related editing support, and broader configurable job requirements.
Improved billing management workflows - billing-related job settings and price management are now handled more cleanly through the shared admin and configurator flows.
Shared prop and storage flows were consolidated - prop placement, trunk access, and shared job storage behavior are now more consistent across supported job systems.
Notable Changes
Boss-side billing price management - job billing prices can now be managed more directly through the shared management flow.
More reliable configurator editing - placement handling, hospital-related creator flows, decimal inputs, and linked configurator sections now behave more consistently during setup.
Config validation improvements - dependent item-use settings now surface clearer warnings when they are configured inconsistently.
Wholesale shop grade enforcement - configured grade restrictions are now respected more consistently in wholesale purchase flows.
Arabic locale added - sky_jobs_base now includes Arabic language support.
Broader localized configurator support for connected jobs - the shared configurator now ships the language support needed for newer ambulance and police configurator flows.
Improved item image resolution - item and weapon images are resolved more reliably across different naming styles.
Safer boss deposits - boss-menu deposits now handle insufficient-player-balance situations more cleanly.
Other Changes
Internal helper cleanup reduced duplicate shared logic across the jobs-base layer.
Small frontend utility cleanup improved consistency across shared interface elements.
Update sky_base first - install the matching release before starting sky_jobs_base.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Replace /fxmanifest.lua so version 1.29.0 is loaded.
Update /config/config.lua, or merge the changes below:
Job-garage trunk interaction distance - the shared trunk radial now uses a larger rear interaction distance:
Config.JobGarage = {
trunk = {
- promptDistance = 3.0,
- interactDistance = 3.0,
- requireBehind = true,
- openKey = 38,
+ interactDistance = 5.0, -- Max distance from the vehicle rear to open the trunk via the "Open trunk" radial (G) action.
distanceTolerance = 1.5,
}
}
New shared prop placement block - add this new top-level section if you want to use the shared job prop-item flow:
Shared billing labels SQL update - the updated import.sql adds a label column to billing specs. If Config.AutoExecuteQuery = false, run:
ALTER TABLE `sky_jobs_billing_specs`
ADD COLUMN `label` VARCHAR(160) NULL AFTER `reason`;
Restart sky_jobs_base, then verify /jobconfig, boss billing management, shared prop handling, and relevant shop restrictions.
Version 1.28.0
Update sky_base first - this release depends on the matching sky_base update for job and duty synchronization, tablet item handling, and prop/item flows.
Highlights
Job Configurator expansion. The in-game configurator now covers more advanced job setup directly in the UI, including mechanic vehicle-class access, society account and storage settings, advanced color editors, instant tuning profiles, damage-handling editors, dynamic settings, and entry duplication.
Better creator-based configurator workflows. The shared Job Configurator now handles creator-backed entry editors more reliably for job-specific location setups such as hospital management.
More reliable Multi-Job and duty handling. Multi-job switching, off-duty job handling, duty synchronization, and duty failure feedback are now more consistent, preventing stale or mismatched player state.
Shared prop item flow. Job props can now be placed and removed more consistently, with keypress removal support and item returns when a consumed prop is removed.
Notable Changes
Shop grade requirements - job shop items can now require a minimum grade, so higher-tier equipment can be restricted without custom scripting.
Tablet item handling - tablet usable-item registration now follows the tablet item config more predictably.
Shared clothing support - added a shared native clothing engine for resources that need outfit snapshot and restore behavior.
Fire job map support - fire hydrants can now appear on the tablet map for fire job workflows.
Configurator UX improvements - dropdowns, popups, select controls, interaction defaults, creator context handling, and long editor sections were refined for cleaner admin editing.
Live dependent setting updates - configurator dropdowns that depend on creator entries now refresh more reliably after entry changes, so linked settings can reflect newly added, renamed, or removed entries without stale results.
Creator entry actions - shared creator-backed configurator sections now support create, save, and delete flows more reliably across resources.
Cross-resource option sources - resources can now provide select options to the configurator more cleanly for linked settings that depend on external creator data.
Job/location editing flow - supported creator-driven location editors can stay inside the expected job editing workflow instead of forcing a separate disconnected setup path.
Radial menu reliability - short taps and quick close/open interactions are now handled more consistently.
Other Changes
Added and updated localized configurator labels for the new admin-facing options.
Debug output now respects the shared sky_base debug setting for cleaner production consoles.
Creator actions now keep their selected entry context more reliably.
Numeric configurator fields now preserve decimal-style values more consistently while editing and resetting settings.
Refined how creator-related configurator updates propagate after entry edits.
Update sky_base first - install the matching release before starting sky_jobs_base.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder (this includes the rebuilt in-game interface under source/html).
Replace the /config/locales folder for the new and updated configurator labels.
Replace /fxmanifest.lua so version 1.28.0 is loaded.
Replace /config/config.lua, or apply the additive options below.
a) Update your existing Config.Tablet block. The tablet item now controls usable-item registration. Set item = "" if you do not want a usable tablet item:
Config.Tablet = {
enabled = true,
requireItem = false,
- item = "tablet",
+ item = "tablet", -- Usable inventory item that opens the tablet (set to "" to disable the usable item).
prop = {
-- your existing prop settings stay as they are
}
}
b) Add the new prop removal options inside your existing Config.JobGarage.trunk block. Do not create a second Config.JobGarage table:
Config.JobGarage = {
trunk = {
propStreamDistance = 150.0,
propStreamDespawnBuffer = 25.0,
+ propRemoveEnabled = true, -- Show a keypress prompt next to placed props to remove them.
+ propRemoveKey = 38, -- Control id for the prop removal key.
+ propRemoveKeyLabel = "E", -- Key label shown in the removal prompt.
+ propRemoveDistance = 2.2, -- Max distance for keypress/radial prop removal.
}
}
c) Optional job configuration additions. Existing configs keep working, but the Job Configurator can now manage more fields such as society account, storage options, mechanic vehicle classes, instant tuning profiles, damage handling, and shop minimum grades. Use the shipped config.lua as the reference when adding these fields manually.
8. Restart sky_jobs_base, then open /jobconfig and /jobs to verify the configurator and multi-job menu.
9. No SQL migration is required.
Version 1.27.0
Update sky_base first — this release aligns the inventory calls with the matching sky_base release. Running it against an older sky_base can break item add/remove in storage, lockers, and vehicle trunks.
Highlights
Multi-Job admin tooling — a new /multijobadmin command lets admins inspect and edit a player's multi-job list (list / add / set / remove), and a new Config.MultiJob.selfRemoveBlacklist prevents players from removing protected jobs (e.g. police, ambulance) from their own menu. Each stored job now keeps its job and grade labels, so the menu shows consistent names even when framework job definitions change later.
Full per-vehicle job-garage attributes — job vehicles can now define livery, vehicle extras, fuel type, primary / secondary / pearlescent / wheel colours, a minimum grade requirement, and a raw vehicle-properties passthrough. These apply to freshly bought vehicles; once a player repaints and parks a vehicle, its stored customization wins. The in-game Job Configurator gained an editable vehicle-attribute table to manage all of this without editing config files.
Configurable interaction marker draw distance — interaction points can now set an optional drawDistance to extend marker visibility beyond the default range, with safeguards so it never shrinks below the standard interaction buffer.
Notable Changes
Multi-Job switching is cleaner — switching jobs no longer carries the previous job's grade into the target job, and a player's duty state is preserved across a switch. Removing a member from a job now also clears the matching multi-job entry.
Per-vehicle trunk control — job vehicles can disable the trunk entirely (trunkEnabled) or just the placeable trunk props (trunkPropsEnabled), and the ambulance stretcher action can be hidden per vehicle (hasStretcher). Trunk interactions now register reliably for vehicles that load late or are spawned dynamically (e.g. externally registered vehicles), with job-gated access.
Garage vehicle list stays fresh — the list of allowed job vehicles now refreshes when a job is registered or unregistered and every time the garage menu opens, preventing stale entries. A per-vehicle minimum grade is enforced across the catalog, owned list, purchase, and spawn paths.
Job Configurator improvements — long setting lists are now grouped into logical subsections for easier navigation, props gained an item-name field, the active section stays open after saving an entry, and the interaction table scrolls correctly for long lists instead of overflowing.
Storage fixes — the transfer popup now opens with an amount of 1 selected (instead of the full stack) while still allowing the maximum, and items that were missing a display name now resolve their label through the active inventory, falling back to the technical name and truncating long labels so cards no longer overflow.
Database reliability — identifier columns were converted to a fixed-length type so their unique keys and indexes build correctly on InnoDB servers without innodb_large_prefix (existing tables are migrated automatically). Framework-owned table indexing is now gated by the active framework, so indexes are only attempted on tables that actually belong to your framework.
Radial menu — improved selection in hold mode and preserved the target context so radial actions stay reliable.
Other Changes
Added Czech (cz) localization and expanded translation coverage for the wardrobe, configurator, and related features across the bundled languages.
Migrated internal item add/remove calls to the new sky_base inventory signature (slot + metadata).
Rebuilt and verified the jobs-base NUI production bundle.
Update sky_base first — install the matching release. This release's inventory calls depend on it; an older sky_base can break storage / locker / trunk item handling.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder (this includes the rebuilt in-game interface under source/html).
Replace the /config/locales folder (new cz.lua; expanded wardrobe / configurator strings across languages).
Run the updated import.sql. It adds the new multi-job label columns and converts identifier columns to a fixed-length type; with Config.AutoExecuteQuery = true (default) the migration runs automatically on start, otherwise import it manually.
Replace /fxmanifest.lua so version 1.27.0 is loaded.
Add the new options to config/config.lua. The easiest way is to take the new config/config.lua from the download and copy your old custom values into it. If you prefer to edit your existing file by hand, follow the steps below.
a) Add the new admin command to the Config.CommandPermissions table you already have. Do not create a second table — add the line next to the existing givejob / removejob entries:
b) Update your existing Config.MultiJob block. The per-command giveJobGroups / removeJobGroups keys are replaced by a single adminCommand, and a new selfRemoveBlacklist is added:
Config.MultiJob = {
command = "jobs",
giveJobCommand = "givejob",
removeJobCommand = "removejob",
- giveJobGroups = { "god", "superadmin", "admin" },
- removeJobGroups = { "god", "superadmin", "admin" },
+ adminCommand = "multijobadmin", -- command name used for /multijobadmin (permissions live in Config.CommandPermissions)
-- ... your other Config.MultiJob settings stay as they are ...
+ -- Jobs listed here cannot be removed by the player from the self-service menu.
+ -- Admin commands and exports can still remove them.
+ selfRemoveBlacklist = {
+ -- "police",
+ -- "ambulance"
+ },
}
c) (Optional) Per-interaction drawDistance. Any entry in Config.Interactions may now set an optional visual marker draw range. Leave it out to keep the previous behaviour:
duty_terminal = {
duty = false,
+ -- drawDistance = 25.0, -- optional: visual marker draw range; lower values keep the default buffer
-- the rest of this interaction's settings stay as they are
}
d) (Optional) Per-vehicle job-garage attributes. Job vehicles are defined in each job's own Config.Jobs[*].vehicles list (e.g. sky_ambulancejob/config/config.lua), not here. Each entry now additionally supports minGrade, livery, extras, fuelType, primaryColor / secondaryColor / pearlescentColor / wheelColor, trunkEnabled, trunkPropsEnabled, hasStretcher (ambulance only), and a raw properties passthrough. All are optional — existing vehicle entries keep working unchanged. The new documentation block above Config.JobGarage in the shipped config.lua lists every field.
9. Restart sky_jobs_base, then verify the multi-job menu (/jobs) and the Job Configurator (/jobconfig).
Version 1.26.0
Highlights
New Multi-Job system — a configurable in-game menu (/jobs) lets players hold several jobs and switch between them, including on- and off-duty switching, per-player persistence, admin commands to grant or remove jobs, and full localization.
Job Configurator additions — a settings search, per-location on-/off-duty access control, and expanded tuning controls (per-stage enable plus paint/color presets).
Lighter, faster in-game interface — the bodycam and tablet camera were rebuilt on native WebGL for a much smaller interface bundle, no-op visual effects were removed, and job-member lists load faster for snappier menus.
Notable Changes
Multi-Job menu — configurable through the new Config.MultiJob block (enabled, the /jobs command, an optional keybind, defaultJob, maxJobs, and off-duty switching). Each player's job list is stored persistently, and admins can manage it with the new /givejob and /removejob commands.
Off-duty job pairs — Config.MultiJob.autoDetectOffDutyJobs with Config.MultiJob.offDutyPrefix automatically links framework pairs such as ballas and off_ballas. The menu itself gained dynamic colors (policeColor / medicalColor), active-job indicators, a scrollable list, and a protected default job.
Per-location duty access — Job Configurator locations can now allow or restrict access for off-duty players.
Tuning controls — tuning values can be enabled or disabled per stage, with color/paint presets, decimal steps for number inputs, and the feature navigation staying visible after a job is saved.
Tablet improvements — page swipes now work across the whole app grid, the tile layout and tap-to-open were restored, and notifications are routed through their registered app actions.
Camera & bodycam — the tablet camera and the bodycam recorder now capture directly through WebGL. The bodycam gained a configurable bitrate cap (recordBitrateKbps) to keep uploads within the storage provider's limits.
Configurable ped images — the ped image source can now be set directly from the in-game interface, and the shop supports per-item image overrides.
Performance & stability — faster job-member lookups backed by new database indexes for job logs and member queries, removal of no-op backdrop-filter / will-change styling for better interface performance, distance-based streaming of placed job props (propStreamDistance / propStreamDespawnBuffer), and colleague minimap blips that respect access control (showOnMinimap).
Reliability — creators clean up correctly when their owning resource stops, creator markers and draw distance are consistent, duty-toggle traffic was reduced, and startup waits for the shared library to be ready to avoid early errors.
Other Changes
Added a confiscated-items label and a creator-cleanup notification across all supported locales.
Rebuilt and verified the jobs-base NUI production bundle.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder (this includes the rebuilt in-game interface under source/html).
Replace the /config/locales folder (multi-job menu strings, creator-cleanup notification, confiscated-items label).
Run the updated import.sql to add the multi-job storage table. Database indexes are added automatically on startup — no further SQL is required.
Add the new options to config/config.lua. The easiest way is to take the new config/config.lua from the download and copy your old custom values into it. If you prefer to edit your existing file by hand, follow the steps below.
a) Add the brand-new Config.MultiJob block. This is the multi-job menu (the /jobs window where a player switches between several jobs). It is a completely new section, so you can paste it anywhere in config.lua — a good spot is right after Config.CommandPermissions. Each line is explained in the comments:
+Config.MultiJob = {
+ enabled = true, -- turn the whole multi-job menu on/off
+ command = "jobs", -- chat command that opens the menu (/jobs)
+ giveJobCommand = "givejob", -- admin command name to give a player a job
+ removeJobCommand = "removejob", -- admin command name to take a job away
+ giveJobGroups = { "god", "superadmin", "admin" }, -- who may use /givejob
+ removeJobGroups = { "god", "superadmin", "admin" }, -- who may use /removejob
+ defaultJob = "unemployed", -- job a player falls back to when they have no jobs left
+ defaultGrade = 0, -- the grade/rank of that fallback job
+ fallbackJob = nil, -- leave nil unless you want a different fallback than defaultJob
+ fallbackGrade = nil, -- same, leave nil to use defaultGrade
+ maxJobs = 8, -- how many jobs one player may hold at once
+ includeCurrentJob = true, -- also list the player's current framework job in the menu
+ switchOffDuty = true, -- allow switching while off duty
+ allowUnregisteredFrameworkJobs = true,-- allow jobs that exist in your framework but not in a Sky config
+ autoDetectOffDutyJobs = true, -- automatically pairs jobs like "ballas" with their off-duty "off_ballas"
+ offDutyPrefix = "off_", -- the name prefix used for those off-duty jobs
+ policeColor = "#173B73", -- accent color used for police-type jobs in the menu
+ medicalColor = "#C73535", -- accent color used for medical/EMS jobs in the menu
+ openKey = nil -- optional keybind, e.g. "F6". Leave nil to open with /jobs only
+}
b) Add the two new admin commands to the table you already have. Do not create a second Config.CommandPermissions — open the existing one near the top of config.lua and add these two lines next to jobconfig/setboss. The group names ("god", "superadmin", "admin") decide who is allowed to run each command:
c) Add the remaining new keys inside the tables that already exist. These belong in sections you already have — pasting them on their own will cause an error. Use Ctrl+F to find each section name, then add the line(s) among that section's settings.
Add inside your existing Config.Cctv table:
Config.Cctv = {
+ recordBitrateKbps = 1500, -- caps the bodycam upload size (lower = smaller file)
-- the rest of your Config.Cctv settings stay as they are
}
Add inside the trunk block of your existing Config.JobGarage table:
Config.JobGarage = {
trunk = {
+ propStreamDistance = 150.0, -- how close (in meters) a placed prop spawns
+ propStreamDespawnBuffer = 25.0, -- extra distance before a spawned prop is removed again
-- the rest of your trunk settings stay as they are
}
}
Add inside your existing Config.ColleagueMapBlips table:
Config.ColleagueMapBlips = {
+ showOnMinimap = false, -- also show on-duty colleagues on the minimap (false = off)
-- the rest of your Config.ColleagueMapBlips settings stay as they are
}
Replace /fxmanifest.lua so version 1.26.0 is loaded.
Restart sky_jobs_base, then open /jobs to verify the multi-job menu.
Version 1.25.0
Highlights
Per-job Nitro access for mechanic jobs — the Mechanic Job Configurator now lets each job inherit the global Nitro setting or explicitly enable or disable Nitro installation and use.
Improved Job Configurator controls — marker setting dropdowns remain inside the configurator design without being clipped, and Parts Delivery global controls no longer open the HUD position picker accidentally.
Notable Changes
Added a Nitro access selector to the General section of every mechanic job with Use global Nitro setting, Enable Nitro for this job, and Disable Nitro for this job choices.
The Nitro selector is only displayed in the sky_mechanicjob configurator and stores its selection directly in the job's nitroAccess value.
Existing tuningCostProfile.nitroAccess values remain supported as a compatibility fallback; jobs without either value inherit the global Nitro setting.
Added English and German labels explaining that the per-job setting affects Nitro only.
The Marker tab's Add marker setting dropdown is now rendered outside its clipped scroll container while retaining the dark Job Configurator design.
The marker setting option list now uses a compact scrollable height so it stays within the configurator panel.
Parts Delivery Shop switches, number inputs, text inputs, and selectors under Global settings no longer trigger the timer HUD position popup.
The Parts Delivery timer position popup now opens exclusively through its dedicated Set position button.
Other Changes
Reused the shared custom SelectInput component for the new Nitro access selector.
Added dedicated styling for portalled Job Configurator dropdowns, including matching colors, borders, shadows, and highlighted options.
Rebuilt and verified the jobs-base NUI production bundle.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder, including the rebuilt in-game interface under source/html.
Replace the /config/locales folder for the new English and German Nitro access labels.
Replace /fxmanifest.lua so version 1.25.0 is loaded.
Restart sky_jobs_base and sky_mechanicjob.
Open /jobconfig and review the Nitro access setting under General for each mechanic job.
No SQL migration or manual config change is required.
Version 1.24.0
Highlights
Fully localized mechanic Job Configurator settings — mechanic configuration titles, feature definitions, setting labels, descriptions, option labels, extension labels, and read-only table values now use locale keys throughout the in-game configurator. All bundled locales share the same active workshopConfig structure, with translated coverage for tuning, parts delivery, vehicle care, wheel damage, mileage HUD, instant tuning, carry items, and related settings.
Notable Changes
Clearer fixed settings tables — tables that do not allow adding rows now still display their configured title and description. This gives settings such as the mechanic repair-kit restored-parts table the context needed to understand what its values control, while keeping the Add button hidden.
Reliable always-on-duty state when the duty system is disabled — when Config.DutySystem is disabled, every player associated with a job now consistently counts as on duty. Player entries created before their job was registered or re-registered are corrected to isOnDuty = true during job registration and immediately synchronized to clients.
Other Changes
Removed remaining hardcoded or English-fallback mechanic configurator text from the shared settings UI.
Read-only values such as wear parts and vehicle classes can now be translated through locale keys.
Rebuilt the jobs-base NUI production bundle so the localization and fixed-table improvements are available in game.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder (this includes the rebuilt in-game interface under source/html).
Replace the /config/locales folder.
Replace the /fxmanifest.lua (version 1.24.0).
No config changes or SQL migration required.
Version 1.23.0
Security update — this release revalidates job & duty synchronization server-side and must be paired with the matching sky_base update. Update sky_base first; running this release against an older sky_base can leave job and duty state out of sync. See Update Instructions.
Highlights
Security — job & duty cache revalidated server-side. The events that synchronize a player's job, grade, and duty no longer trust data sent by the client — the cache is re-read from your framework instead. This closes a hole where a manipulated client could spoof its own job, rank, or duty state, which is exactly what every job script relies on for authorization. Requires the matching sky_base update.
Performance — the boss menu no longer stalls the server. Opening the management menu used to fire dozens of database queries per open and load the entire job-log table to filter it in memory. Member lookups and log filtering, sorting, and paging now run as single indexed queries, removing the server hitches on busy societies.
Expanded in-game Job Configurator. New creator sections, accurate on-screen HUD positioning for extensions (draggable, with a true-to-size preview), and reliable multi-location placement — multiple workshop lifts, delivery bays, dealers, tuning points, and garage points can now be added without overwriting the ones placed before them.
Notable Changes
Lockable management editing — a new Config.ManagementEditing block lets you lock the role name, salary, payout interval, and role create/delete/reorder in the boss menu. Locked fields appear read-only and are enforced server-side (changeable only via the database), with an optional per-job override.
Write-once job-grade salaries — editing a grade's name or label no longer changes its salary; the salary is set only when the grade is first created.
Self-clearing dispatches & auto-closing map — dispatches a player created are now cleaned up (including when they disconnect), and the tablet map can optionally close on its own after a dispatch is accepted (Config.Tablet.map.closeOnDispatchAccept).
Vehicle trunk weapons — weapons now display and transfer correctly in vehicle-trunk storage, consistent with shared storage and personal lockers.
Reliable duty state on reconnect — a player who toggled duty off through the framework and then disconnected is no longer wrongly restored to on-duty when they rejoin.
Faster resource start on busy servers — the player-cache warm-up no longer waits on each offline player one after another, so the cache becomes ready in seconds instead of minutes after a restart.
Bodycam recorder is now opt-in — a new Config.Cctv.bodycamRecorderEnabled toggle (default off) controls the client-side bodycam recorder, which can noticeably increase client CPU usage when enabled.
New server exports for job & player management — additional integration points so other resources can read and manage job and player state.
Other Changes
Lighter, smoother interface — charts load on demand, progress and panic animations now use CSS transitions, and the bodycam preview is frame-rate capped, reducing UI bundle size and client load.
Consistent thin scrollbars across long Job Configurator lists, editors, and settings tables.
Added the missing weapons tablet-app title in every bundled language.
Update sky_base first — install the matching release. This release's job & duty security fix depends on it; an older sky_base will leave job/duty sync incomplete.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder (this also contains the updated in-game interface under source/html).
Replace the /fxmanifest.lua (version 1.23.0).
Replace the /config/locales folder (new weapons tablet-app title in every language, plus Job Configurator string updates).
Replace /config/webhooks.lua.
Replace /config/config.lua, or merge the additive options below (each defaults to the previous behaviour):
Lockable management editing — new block:
+-- Set a flag to false to lock the value in the management menu (read-only; edit via database only).
+-- Override per job via Sky_Jobs.SetJobManagementEditing(jobKey, { salary = false, ... }).
+Config.ManagementEditing = {
+ roleName = true, -- grade/role display name
+ salary = true, -- salary amount per payout
+ salaryInterval = true, -- payout interval minutes
+ roleStructure = true -- create / delete / reorder roles
+}
+bodycamRecorderEnabled = false, -- client-side bodycam recorder; can noticeably increase client CPU usage when enabled
Auto-close the tablet map after accepting a dispatch — inside Config.Tablet.map:
+closeOnDispatchAccept = true, -- close the tablet automatically after accepting a dispatch on the map
No SQL migration.
Version 1.22.0
Highlights
Employee GPS jammer — a new item-based jammer (Config.EmployeeGpsJammer) that temporarily hides employees from colleague map tracking in an area. Fully configurable: required item, whether it is consumed, range, duration, cooldown, the play animation, and which jobs may use it.
Per-job visibility groups & item gating for map blips / panic / ping — colleague map blips, the panic alert, and pings now support optional per-job groups (control exactly which jobs see or receive them, e.g. police / sheriff / fib sharing) and an optional carried-item requirement (requireItem + item). Defaults keep the previous behaviour.
Per-job storage capacities — shared storage and personal locker sizes can now be set per job; the Config.Storage values act as the default for jobs that don't define their own.
Notable Changes
A player's on-duty job rank is now preserved and correctly re-applied when toggling off-duty and back on-duty, keeping the primary grade consistent.
Management UI — the Roles view now fully refreshes after job/grade changes, ESX job-grade salaries stay in sync, and online members' grades update immediately.
Mechanic / workshop storage — physical carry parts can now be withdrawn from workshop storage even when their stored metadata differs from the selected item; normal storage transfers stay strict.
Registered creators can now be disabled while keeping their data registered — command, job-based, and permission-bypass opens are blocked with a configurable notification (e.g. when a newer in-game configurator replaces a legacy creator flow).
Trunk prop placement improved with per-prop vertical (z) offset support, preserved through the vehicle's trunk state.
Added a pedImageBase option to Config.Nui for ped image assets (e.g. fire scenario creator assets).
Fixed a redundant garage vehicle deletion that could act on an already-removed entity.
Other Changes
The in-game Job Configurator editor, interaction, instant-tuning, and asset-picker text is now fully localized across all bundled languages (English & German translated; other locales fall back to English).
Added server-side diagnostics that log when a job configurator has no enabled/active jobs, so misconfigured setups are visible in the server log instead of failing silently.
Improved player-cache cleanup with a dedicated unload path (via sky_base:playerUnloaded) that clears a player's entry without preserving duty state.
Hardened global config-table initialization so core tables are set up consistently before other config files load.
Fixed a German locale typo.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /fxmanifest.lua (now loads the new config/init.lua).
Add the new /config/init.lua file.
Important — the global table initialization moved to config/init.lua. If you keep your own config/config.lua instead of replacing it, remove these two lines from the top of the file (they are now set in init.lua):
New groups / requireItem / item keys on Config.ColleagueMapBlips, Config.Panic, and Config.Ping (same three keys on each; groups = nil keeps the default visibility):
Config.ColleagueMapBlips = {
enabled = true,
showSelf = true,
+ groups = nil, -- optional: viewer job -> jobs whose blips it can see
+ requireItem = false, -- if true, only shown while carrying `item`
+ item = "gps",
...
}
Config.Storage now documents that its values are the default capacity for jobs without a per-job storage override (no value change needed):
Config.Storage = {
- storageCapacity = 1000, -- Shared storage capacity (<= 0 for unlimited)
- lockerCapacity = 10 -- Personal locker capacity (<= 0 for unlimited)
+ storageCapacity = 1000, -- Default shared capacity for jobs without a per-job storage override (<= 0 for unlimited)
+ lockerCapacity = 10 -- Default personal locker capacity for jobs without a per-job storage override (<= 0 for unlimited)
}
New pedImageBase in Config.Nui:
Config.Nui = {
propImageBase = "https://cdn.sky-systems.net/props",
+ pedImageBase = "https://cdn.sky-systems.net/peds", -- base path for ped images (e.g. fire scenario creator assets)
...
}
No SQL migration required.
Version 1.21.0
Highlights
rcore_clothing wardrobe / job-changing-room backend — the configurable wardrobe (introduced in 1.20.0) now supports rcore_clothing. It is picked up automatically by Config.Cloakroom.backend = "auto", or you can pin it with "rcore". A clear notification is shown if rcore_clothing is selected but not running.
Job Configurator enhancements — added an Instant Tuning settings page (Behavior, Marker, Blip, and Locations tabs) with current-position capture and teleport support, clearer Tuning Prices inputs (values rounded to two decimals with a % / $ unit suffix so it is obvious whether a cost is percentage- or money-based), and a transport-mode selector (e.g. Engine Hoist) for Carry Items.
Notable Changes
Player names in duty / identity displays now prefer the framework RP / character name, falling back to the Steam/FiveM name only when no character name is available.
Improved job & duty state synchronization — client job/duty state is re-evaluated more reliably on load and when jobs are registered, ESX on-duty / off-duty job aliases stay consistent across related job entries, and jobs now fully refresh after creator location changes (no more stale job states).
CCTV camera app access is now strictly per-job — jobs sharing a job group (e.g. FIB / LAPD) no longer automatically inherit another job's camera network.
Added configurable per-job bodycam visibility via the new optional bodycamViewJobs setting.
Added a client-side event that fires when the helicopter camera is entered or exited, so other scripts can react (e.g. toggle HUD elements).
Fixed job identification for jobs created through the creator.
Other Changes
Fixed bodycam saves occasionally getting stuck on "Saving", and item-gated bodycams appearing active without a recording buffer.
Fixed creator interaction labels falling back to raw point IDs; station-blip-only points no longer spawn interactions.
Fixed the "salary paid" entry showing a raw key instead of translated text in job logs.
The UI now waits for localization to finish loading before rendering, avoiding missing-text flashes on first load.
Added server-side duty diagnostics to help trace duty / multi-job conflicts in support cases.
Added Portuguese (pt) locale, and extended panic-button and Job Configurator localization across languages (cn, de, en, es, fi, fr, nl, pl, rs, ru, se).
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (new pt.lua; extended panic-button and Job Configurator strings across languages).
In config/config.lua (both optional — defaults keep the previous behaviour):
Config.Cloakroom.backend now also accepts "rcore" to force the rcore_clothing job-changing room. "auto" detects it automatically.
Add the optional bodycamViewJobs key to the bodycam block to configure per-job bodycam visibility:
- bodycamItem = "bodycam"
+ bodycamItem = "bodycam",
+
+ -- Optional per-job bodycam visibility. Key = viewer job, value = jobs whose
+ -- bodycams it can see. Jobs not listed keep the default network (own job +
+ -- jobs in the same job group). Leave nil to keep the previous behaviour.
+ bodycamViewJobs = nil
No SQL migration required.
Version 1.20.0
Highlights
In-game Job Configurator — a new /jobconfig admin command opens a unified in-game interface to create and manage jobs live: general settings, locations, interactions (markers, blips, peds), vehicles, shops, props, features, and per-job settings. Changes are stored in the database and applied without editing config files by hand. Access is controlled via the new jobconfig entry in Config.CommandPermissions.
Configurable wardrobe / cloakroom backend — the cloakroom now works with a wide range of clothing systems through Config.Cloakroom.backend. "auto" detects supported systems (qb-clothing, 17movement, qs-appearance, ak47-clothing, tgiann-clothing, nf-skin, bl-appearance, izzy-appearance, codem-appearance, hex-clothing, illenium-appearance, ESX skinchanger/esx_skin, and more), or you can pin a specific one. A custom hook lets you wire up any other clothing resource. (Supersedes the ESX-only wardrobe from 1.18.0.)
Dynamic currency formatting — job payroll and finance amounts now use sky_base's configurable currency formatting, and payouts can target a chosen account via Config.Salary.accountType ("money" / "bank") or a custom sky_base currency via Config.Salary.currency. Requires the matching sky_base release.
Notable Changes
Added a global duty toggle Config.DutySystem — set to false to make all job members always count as on duty.
Added Jobs Creator support for player duty and job changes — jobs managed through an external Jobs Creator are now recognized for duty state and job switching.
The panic feature can now be restricted to specific jobs via Config.Panic.allowedJobs (e.g. police, ambulance); set it to nil to fall back to all registered job-related jobs.
Limited vehicle trunk props — job vehicles can carry a configured, limited set of placeable props (e.g. cones, barriers) via per-vehicle props / propCounts in Config.JobGarage.
Tablet apps are now configurable per app — hide an app by setting it to false, or use a table (e.g. cctv = { enabled = true, isNew = true }) to show a "new" badge. Tablet apps can also be opened directly from notifications.
Added comprehensive validation and logging to job finance operations.
Interaction points now support a configurable marker size (per-point markerSize) and an optional per-point interaction distance (e.g. on the duty terminal).
Tablet gallery images can now be zoomed with dedicated zoom controls.
ox_target actions now support entity-type filtering for more precise targeting.
Other Changes
Fixed bodycam saving occasionally getting stuck.
Fixed free (0-cost) garage vehicle purchases.
Smoother card-sliding UX on the duty terminal.
Expanded and updated job localization strings across multiple languages (cn, de, en, es, fi, fr, nl, pl, rs, ru, se).
Update sky_base first (required — the new currency formatting relies on the matching sky_base release).
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder if you use the bundled locales.
Database — the in-game Job Configurator adds new tables. With Config.AutoExecuteQuery = true (default) they are created automatically on start. If you manage SQL manually, import the updated import.sql.
In config/config.lua, add the new options:
Config.AutoExecuteQuery = true
+Config.DutySystem = true -- Set to false to make job members always count as on duty
Config.CommandPermissions = {
+ jobconfig = { "god", "superadmin", "admin" }, -- /jobconfig - open the in-game job configurator
setboss = { "god", "superadmin", "admin" },
...
}
In config/config.lua, add the new salary account options to Config.Salary:
Config.Salary = {
enabled = true,
+ accountType = "bank", -- "money" or "bank" - account used for payouts
+ currency = nil, -- optional custom sky_base currency key; overrides accountType when set
payIntervalsWhileOnDuty = true,
...
}
In config/config.lua, add the configurable wardrobe backend to Config.Cloakroom (use "auto" to keep auto-detection, or pin / customize a clothing system):
In config/config.lua, restrict the panic feature if desired via Config.Panic.allowedJobs:
Config.Panic = {
enabled = true,
+ allowedJobs = { "police", "ambulance" }, -- set to nil to allow all job-related jobs
useKeybind = true,
...
}
(Optional) Tablet apps now accept a table form for hiding apps / showing a "new" badge, e.g. cctv = { enabled = true, isNew = true } in Config.Tablet.apps. Limited trunk props can be set per job vehicle via props / propCounts in Config.JobGarage. No changes required to keep existing behavior.
Version 1.19.0
Highlights
Configurable garage behavior - server owners can now disable garage license plate changes globally via Config.JobGarage.allowPlateChange, and optionally warp players directly into spawned garage vehicles with Config.JobGarage.warpIntoVehicle.
Panic button in the job radial menu - the panic alert can now be exposed as a radial action with Config.Panic.useRadial, while Config.Panic.useKeybind lets you disable the default panic keybind registration if you want players to trigger panic only through your preferred flow.
Notable Changes
Fixed tablet Map zone interactions so zone points and alert markers can be clicked reliably without the map drag handling intercepting the input.
Improved tablet Map layout sizing so the map and sidebar stay aligned on more tablet aspect ratios.
Fixed map exclusion-zone cleanup so player-owned or occupied vehicles are not removed just because they are inside a zone.
Corrected German locale text for the garage and plate-change flow.
Other Changes
No additional changes.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, add the new garage options to Config.JobGarage:
Config.JobGarage = {
parkRadius = 4.0,
parkKey = 38,
sellPercentage = 50,
+ allowPlateChange = true, -- Set to false to disable license plate changes in the garage menu.
+ warpIntoVehicle = false, -- Set to true to put the player directly into the spawned garage vehicle.
spawnBlockRadius = 3.0,
...
}
In config/config.lua, add the new panic options to Config.Panic:
Config.Panic = {
enabled = true,
+ useKeybind = true, -- Set to false to stop registering the panic keybind.
+ useRadial = false, -- Set to true to show the panic button in the job radial menu.
requireOnDuty = true,
...
}
No SQL migration. No Config.AutoExecuteQuery action required.
Version 1.18.0
Highlights
ARGB color hex support — theme color values now accept FiveM-style 8-char hex (FFRRGGBB); the alpha channel is stripped before parsing, so existing 6-char hex colors keep working unchanged. Applies to the tablet Boss Menu theme as well as the matching server-side color handling.
Notable Changes
Config.Nui.itemImageBase default reverted to the Sky-Systems CDN — "https://cdn.sky-systems.net/items" is the default again (was nui://ox_inventory/web/images in 1.17.0). Set it explicitly if you prefer the ox_inventory path.
Wardrobe is now ESX-only — wardrobe creator interaction points are blocked on non-ESX frameworks with the new localized notification WardrobeUnsupportedFramework. Prevents partial wardrobe flows on unsupported setups.
/setboss argument hints — the /setboss command now declares optional job and grade parameters, so framework command-help displays the expected arguments.
Added graceful fallback handling for job-registry queries — integrations that look up registered jobs or per-job info before the registry is fully populated no longer error out.
Hardened duty-state lookups and made webhook key resolution nil-safe, preventing runtime errors with a partial Config.Webhooks setup.
Other Changes
Expanded job localization strings across 9 languages (cn, de, es, fi, fr, nl, pl, rs, ru) — new keys cover faction management (invites, role creation), vehicle garage (purchase, plate changes), cloakroom, interaction labels, and tablet features (CCTV, compass waypoints, station blips).
Refined Swedish (se) translations for improved clarity and consistency.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, the default itemImageBase has been reverted to the Sky-Systems CDN. If you want to keep the ox_inventory path from 1.17.0, set it explicitly:
No SQL migration. No Config.AutoExecuteQuery action required.
Version 1.17.0
Highlights
Management UI revamp — Dashboard, Finance, Members, Roles, Transactions, and Logs views have been redesigned with a more responsive layout, and the Tablet Boss Menu picks up the matching light theme. Role management is now fully flexible: create, reorder, and delete job grades from the UI, and item-based permissions can be assigned per role alongside the existing vehicle, app, and document permissions. ESX servers can now add new grades above the current highest grade — the previous "highest grade is read-only" limitation is gone.
Global salary toggle — new Config.Salary.enabled (default true) turns payroll on or off server-wide, and a new server export Sky_Jobs.SetJobSalaryEnabled(jobKey, false) lets you override it per registered job. When salary is disabled the management UI hides the related settings and the server throttles payout-counter writes to reduce database load.
Per-job society accounts — registered jobs can now point at a custom shared society account instead of the default society_<jobKey> convention, so multiple jobs can share a single society account (e.g. a city-services group sharing one balance across several sub-jobs).
Colleague map blips overhaul — colleague blips are now strictly pause-menu only and use server-snapshot coordinates (including vehicle type and heading) for every blip, instead of switching between live entity blips and stale coordinate blips. Single-instance tracking with explicit cleanup on duty end, pause-menu close, and resource stop. Fixes duplicate blips lingering on the map and the "blip stuck where the colleague used to be" lag for fast-moving colleagues out of streaming range. Configurable via Config.ColleagueMapBlips.pauseMenuSnapshotIntervalMs and pauseMenuRenderIntervalMs.
Direct duty status exports — new exports.sky_jobs_base:isPlayerOnDuty(source) (server) and exports.sky_jobs_base:isOnDuty() (client). Integrations can check on-duty state directly instead of reaching into the Sky_Jobs root table.
Notable Changes
Fixed setOfflineJob running both the QBCore and ESX update helpers on every non-Qbox framework, which spammed Table doesn't exist warnings in oxmysql logs whenever the wrong helper queried the missing framework table. The function now branches explicitly on Sky.Config.framework.
Fixed tablet prop cleanup deleting third-party prop_cs_tablet props (other phone or tablet resources) within ~1s of closing the Sky tablet. Cleanup is now restricted to the tablet prop sky_jobs_base actually spawned.
Fixed the tablet keeping NUI focus during its close animation — focus is now released as soon as the close animation starts, so chat and vehicle controls return immediately.
Standardized item image lookup — the legacy Config.Nui.useOxInventoryImages toggle was removed. The default Config.Nui.itemImageBase is now nui://ox_inventory/web/images; set it to "https://cdn.sky-systems.net/items" (or any other base path) if you want the Sky-Systems CDN icons or a custom source.
Removed the Billing Presets section from the management menu — the section is no longer part of the management flow.
Cloakroom outfit list now scrolls internally instead of growing the whole cloakroom view when many outfits are configured.
Other Changes
Internal: job grade calculation was consolidated through the shared Job.GetHighestGrade helper across the server and the role editor. Behaviour change is limited to the next-grade default being more reliable when the job currently has no grades.
Update sky_base first.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, the colleague-blip block has two new keys and a new default for showOnMinimap (now a legacy / no-op flag — colleague blips are pause-menu only):
Config.ColleagueMapBlips = {
enabled = true,
showSelf = true,
- showOnMinimap = true,
- updateIntervalMs = 500,
+ showOnMinimap = false, -- legacy; colleague blips are now pause-menu only
+ updateIntervalMs = 500, -- legacy fallback for pauseMenuRenderIntervalMs
+ pauseMenuSnapshotIntervalMs = 500, -- server snapshot interval while the pause-menu map is open
+ pauseMenuRenderIntervalMs = 200, -- local blip refresh interval while the pause-menu map is open
display = 4,
...
}
In config/config.lua, append enabled to the existing Config.Salary block:
In config/config.lua, the default Config.Nui.itemImageBase switched to the ox_inventory image path. If you relied on the previous Sky-Systems CDN default (or had useOxInventoryImages = true), set itemImageBase directly:
The legacy Config.Nui.useOxInventoryImages flag is gone — set itemImageBase directly instead.
9. No SQL migration. No Config.AutoExecuteQuery action required.
Version 1.16.0
Highlights
Wardrobe outfits can now be restricted by role / job grade - outfit editors can define which grades may use an outfit. The cloakroom UI shows unavailable outfits as disabled, and the server enforces the restriction when an outfit is applied.
Mechanic carry props can now integrate with station storage - when sky_mechanicjob is running, supported carried props can be deposited into station storage from the storage interaction and withdrawn back into the carry system.
Added server exports AddStorageItem(...) and AddStorageItems(...) so trusted integrations can add one or many items directly to station storage while respecting storage capacity.
Notable Changes
CCTV tablet app access now works for every job in the same registered job group instead of only one exact job key.
Tablet map labels no longer clip in tight layouts.
Other Changes
Added Russian (ru) translation.
Enhanced tablet homescreen details
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (new ru.lua and updated de.lua).
Replace fxmanifest.lua if you track the resource version from the manifest.
If Config.AutoExecuteQuery = false, run the wardrobe migration manually:
ALTER TABLE `sky_jobs_wardrobes` ADD COLUMN IF NOT EXISTS `allowed_grades` LONGTEXT NULL;
Optional for creator integrations: marker, interaction and extra interaction definitions may now set interactionDistance = 2.5 (or another number) to tune the use distance for that specific point.
Version 1.15.0
Highlights
New admin permission system — /setboss no longer uses Sky.FW.IsAdmin; it now resolves via FiveM ACE (sky_jobs_base.setboss) auto-wired from Config.CommandPermissions at server start. Sky_Jobs.RegisterCreator accepts a new opts.permission parameter (e.g. "sky_policejob.stationcreator") that the creator command and the openCreatorByJob NUI path consume directly; the legacy permissionResource / permissionCommand pair is preserved for backward compatibility. Fixes admin commands silently denying admins on QBox after qbx_core:HasPermission was deprecated in qbx_core v1.8.0.
Live colleague map blips for every Sky job — the world-map blip system that shows on-duty colleagues moved from sky_policejob into sky_jobs_base under the neutral name Config.ColleagueMapBlips (was Config.OfficerMapBlips). The implementation was already job-agnostic; it now ships in the right resource so every Sky job (ambulance, mechanic, custom jobs, …) gets the feature without copy-pasting code. Blips now render whenever the player is on-duty — visible on the minimap during normal gameplay, on the pause-menu map, and on the tablet map. Server owners who prefer a clean minimap can opt out via the new Config.ColleagueMapBlips.showOnMinimap = false (blips then stay on the big maps only). The server pushes a fresh per-job snapshot every ~1s instead of each client polling every 3.5s — fixes the customer-reported "blip at the place where the person was but isn't anymore" lag for fast-moving colleagues out of streaming range.
Added Sky_Jobs.OpenCreatorByJobWithoutPermission(source, jobKey) server export (and matching exports.sky_jobs_base:openCreatorByJobWithoutPermission) — opens the station creator for a player by job key without running the permission check. Intended for admin tooling and trusted integrations that have already authorized the caller upstream.
Interaction points now respect a forceMarkerInteraction flag on the creator entry definition — that single interaction always uses marker + help notification, even if a target backend (ox_target / qb-target) is active on the server. Pairs with the matching sky_base 1.14.0 feature.
Notable Changes
Fixed public interactions being unreachable for players whose current job didn't match the creator entry's jobKey. The 1.14.0 job-locking security check was too strict and also blocked entries explicitly marked public = true; those are now exempt while non-public entries stay job-locked as before.
/dutytest (debug command) now resolves via Config.CommandPermissions.dutytest instead of a hardcoded group.admin ACE lookup. Server owners can broaden access (e.g. add supporter) or restrict it via the same table as every other admin command.
Server-side map broadcast now routes name and grade lookups through Sky_Jobs.PlayerCache instead of Sky.FW.* — silences the per-second debug spam (Sky.FW.GetName(N), Sky.FW.GetJobData(N, grade), …) that flooded the console on servers with Sky.Config.debug = true. No behaviour change.
Wholesale shop purchases now accept free items (price 0) — parity with the per-job shop change shipped in 1.12.0.
Tablet Boss Menu and Tablet Chat views: fixed content overflow and inconsistent scrolling on long member/message lists.
Tablet Map app is now responsive — layout adapts cleanly to different tablet aspect ratios, the marker list pane resizes properly on narrow widths, and the Home view exposes the Map app at the correct size for tablets running in alternate UI scales.
Fixed panic / ping alerts being delivered to players of unrelated jobs. When a channel's allowedJobs filter was left empty, the system previously allowed any on-duty player to receive the alert; it now restricts delivery to players whose current job is a registered Sky job (or a linked off-duty variant). Setups that customized Config.Panic.allowedJobs / Config.Ping.allowedJobs are unaffected.
New Sky_Jobs.IsJobRelated(jobKey) server helper + sky_jobs_base:isJobRelated callback for integrators that need to check whether a job is registered with Sky_Jobs (covers both on-duty and linked off-duty job keys).
Server console now prints a clearer info message when the FiveManage API key is missing, instead of a silent fallback.
Other Changes
Added Swedish (se) translation.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder (new se.lua).
Required — update sky_base to 1.14.0 or newer first, and add the three permission bootstrap ACEs to your server.cfg:
Without these, /setboss and every creator command will deny everyone except the server console.
6. The new Config.CommandPermissions block in config/config.lua controls who can use /setboss and /dutytest:
Config.CommandPermissions = {
-- /setboss <job> <grade> - Set the boss grade for a job
setboss = { "god", "superadmin", "admin" },
-- /dutytest [playerId] [on|off] - Debug command to force a duty state on a player
dutytest = { "god", "superadmin", "admin" },
}
Adjust the allowed groups if needed — defaults match the previous behaviour.
7. The new Config.ColleagueMapBlips block in config/config.lua controls the colleague map blip system that previously lived in sky_policejob as Config.OfficerMapBlips:
Config.ColleagueMapBlips = {
enabled = true,
showSelf = true,
showOnMinimap = true, -- false = blips only on the big map (pause / tablet), hidden from minimap
updateIntervalMs = 500,
display = 4,
shortRange = false,
scale = 0.85,
color = 3,
colorLights = 3,
sprites = { foot = 1, car = 225, boat = 427, heli = 64, car_lights = 56, boat_lights = 427, heli_lights = 43 }
}
If you had customized Config.OfficerMapBlips in sky_policejob/config/config.lua, copy those values here and remove the old block from the police config (it is no longer read). refreshIntervalMs is no longer needed — the server now pushes positions automatically every ~1s.
8. Optional — third-party scripts calling Sky_Jobs.RegisterCreator(...) should migrate from the legacy permissionResource / permissionCommand pair to the new unified permission field:
Sky_Jobs.RegisterCreator("mycreator", "myjob", {
title = "My Creator",
- permissionResource = GetCurrentResourceName(),
- permissionCommand = "mycreator",
+ permission = "myresource.mycreator",
})
The legacy pair still works (no immediate breaking change for 3rd-party scripts).
Version 1.14.0
Highlights
Security fix: the server now enforces job ownership on every creator-interaction request (boss menu, wardrobe, storage, garage, …). Players whose current job doesn't match the station's assigned job can no longer reach those interactions.
Notable Changes
Garage: simplified the vehicle reclamation logic — reclamation now follows only the offline-and-unresolvable check introduced in 1.13.0, so vehicles no longer flip back to "stored" in additional edge cases.
A misconfigured pedHash in Config.Interactions now skips just that one NPC with a warning instead of aborting the rest of the interaction rebuild.
Boss menu / job-data lookups now handle unknown jobs or malformed grade tables gracefully instead of failing with a runtime error.
Other Changes
Tablet map dispatch details: action button labels now wrap inside their boxes so longer translations no longer overflow.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Make sure sky_base is up to date before starting the resource.
Version 1.13.0
Highlights
Added a new sky_jobs_base:creator:pedSpawned client event — consuming resources can react to creator NPC spawns through a single event handler instead of registering hooks per interaction.
Custom storage UI now accepts .webp background images alongside PNG/JPG.
CCTV tablet app is now only shown for police and ambulance jobs.
Notable Changes
Fixed garage vehicles flipping back to "stored" status when a player parked out and the vehicle briefly lost server scope. Reclaim now requires the owner to be offline AND the vehicle unresolvable for ~90 seconds before being marked stored, instead of triggering after a single 30 s tick.
Fixed Config.Interactions[*].scenario and onSpawn not re-applying when an existing NPC was reused on creator rebuild (job / duty change). Hooks now also run on reuse, not only on fresh spawns.
Fixed helicopter cam target lock not releasing in some cases.
Other Changes
No additional changes.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Make sure sky_base is at version 1.12.0 or newer (banking adapter rename).
Version 1.12.0
Highlights
Job radial menu and target integration now work under both ox_target and qb-target — follows the new Config.target selector introduced in sky_base 1.11.0.
Added a tablet push-notifications API — external resources can push notifications onto the tablet home screen.
Free items (price 0) are now allowed in per-job shops and the wholesale shop. Negative prices are still rejected.
Trunk prop placement is now exposed as a reusable export with optional confirmation callback, so external resources can consume an item only after placement is confirmed.
Notable Changes
Fixed Config.Interactions[*].onSpawn callbacks not firing for interaction NPCs. The scenario option was unaffected. External resources that need spawn-time customization (outfits, props, weapons) should register hooks via the documented client-side API.
Fixed garage vehicle purchase confirmation modal showing English fallback text — added the missing confirmPurchaseTitle, Confirm, Cancel, Message, purchaseSuccessTitle, and Message keys to all 9 locales.
Locale drift cleanup across CN, ES, FI, FR, NL, PL, RS — restored missing keys for the garage plate editor, CCTV / Map waypoint actions, station creator job-blip modals, tablet missingItem state, panic / ping mapping descriptions, and CameraUploadFailed.
Fixed speedcam image capture failure.
Config.JobRadial comments updated to reference the new Config.target from sky_base instead of the removed enableOXTarget flag (no behaviour change for existing values).
Other Changes
No additional changes.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Requires sky_base 1.11.0 or newer for target-system support. If you previously used Config.enableOXTarget = true in sky_base, set Config.target = "ox" (or "qb" / "auto").
Version 1.11.1
Highlights
Tablet now reopens the last-used app automatically after closing and reopening the tablet.
ox_target interaction labels are now fully localized — added a new InteractionLabels table in all 9 languages (CN, DE, EN, ES, FI, FR, NL, PL, RS). Manual overrides via Config.Interactions[id].label still take precedence.
Interaction NPCs now support optional scenario and onSpawn fields in Config.Interactions — NPCs can play a GTA scenario on spawn and run custom setup code (outfits, props, extra tasks).
Security fix: helicopter spotlight events are now validated against Config.HeliCam.allowedJobs and duty status, blocking non-authorized players from griefing with spotlights.
Notable Changes
Default Config.JobRadial.mode changed from hold to toggle.
Grade change notifications now show richer info and update live.
Fixed ox_target radial actions becoming unclickable after the first trigger.
Station creator blip handling refined.
Map exclusion zones now require police-group access.
Fixed rare server errors during public forms, gallery, and chat interactions.
Dispatch now cleans up correctly when a player disconnects.
Other Changes
CCTV bodycam cache is released when a player disconnects.
Refreshed mechanic and tuner card artwork.
Table header rendered transparent again.
General server-side performance improvements.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, update the existing Config.JobRadial.mode default:
(Optional) Each entry in Config.Interactions now accepts scenario and onSpawn:
-- scenario = "WORLD_HUMAN_CLIPBOARD" -- GTA scenario to play on spawn
-- onSpawn = function(ped) -- runs once after ped is created
-- SetPedArmour(ped, 100)
-- end
Version 1.11.0
Highlights
Storage, locker, and vehicle trunk now track item metadata as a separate stack — items with different metadata no longer collide under the same unique key (new metadata_key column and refreshed unique indexes).
Added ox_target integration for job radial actions (Config.JobRadial.oxTarget.enabled) so non-tablet actions can be triggered through ox_target without opening the radial menu.
Added optional tablet item requirement (Config.Tablet.requireItem + Config.Tablet.item) — when enabled, the tablet is registered as a usable item and required to open.
Added openCreatorByJob server export (Sky_Jobs.OpenCreatorByJob) to open the station creator by job key with per-job permission checks.
Notable Changes
Boss menu salary input rebuilt with an improved SliderInput component (unit labels, direct numeric entry, validation).
Weapon metadata is now preserved through garage and storage add/remove operations.
CCTV network is now shared across police sub-jobs.
Storage metadata-index migration now auto-resolves the correct prefix length from each column's declared type (VARCHAR/CHAR/TEXT/BLOB).
Other Changes
Added missing translations across all 9 locales (CN, DE, EN, ES, FI, FR, NL, PL, RS).
Fixed spurious error notification on every shop weapon purchase.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
In config/config.lua, update the existing Config.Tablet and Config.JobRadial blocks:
Config.Tablet = {
enabled = true,
+ requireItem = false, -- If true, the tablet requires the configured item and the item is registered as a usable item to open the tablet.
+ item = "tablet",
prop = { ... }
}
Config.JobRadial = {
- enabled = true,
+ enabled = true, -- Set to false only if you use ox_target for job actions and have both sky_base Config.enableOXTarget = true and the ox_target resource running, otherwise these actions cannot be triggered at all. Tablet access is not available through ox_target and must be handled through the tablet item's usable-item flow.
key = "g",
mode = "hold",
- deadzone = 0.25
+ deadzone = 0.25,
+ oxTarget = {
+ enabled = true -- Registers non-tablet job radial actions as ox_target actions so they can be used without opening the radial menu. Requires sky_base Config.enableOXTarget = true and the ox_target resource. Tablet access stays on the tablet item's usable-item flow.
+ }
}
If Config.AutoExecuteQuery = false, run the SQL migration manually:
ALTER TABLE `sky_jobs_vehicle_trunks` ADD COLUMN IF NOT EXISTS `metadata_key` VARCHAR(32) NOT NULL DEFAULT '__nil__';
ALTER TABLE `sky_jobs_storageitems` ADD COLUMN IF NOT EXISTS `metadata_key` VARCHAR(32) NOT NULL DEFAULT '__nil__';
ALTER TABLE `sky_jobs_lockeritems` ADD COLUMN IF NOT EXISTS `metadata_key` VARCHAR(32) NOT NULL DEFAULT '__nil__';
ALTER TABLE `sky_jobs_vehicle_trunks` DROP INDEX `uniq_plate_item`;
ALTER TABLE `sky_jobs_vehicle_trunks` ADD UNIQUE KEY `uniq_plate_item_metadata` (`plate`, `name`, `metadata_key`);
ALTER TABLE `sky_jobs_storageitems` DROP INDEX `uniq_station_item`;
ALTER TABLE `sky_jobs_storageitems` ADD UNIQUE KEY `uniq_station_item_metadata` (`station_id`, `name`(100), `metadata_key`);
ALTER TABLE `sky_jobs_lockeritems` DROP INDEX `uniq_station_player_item`;
ALTER TABLE `sky_jobs_lockeritems` ADD UNIQUE KEY `uniq_station_player_item_metadata` (`station_id`, `player_identifier`(255), `name`(100), `metadata_key`);
Version 1.10.0
Highlights
Added prop placement with in-game editor to the station creator.
Added license plate change feature in the garage menu with permission checks and DB sync.
Added per-job blip configuration directly from the creator UI (sprite, color, scale, display, short range).
Added garage vehicle grade restrictions — vehicles can now be locked behind job grades.
Notable Changes
Map App now has a button to set waypoints to station markers.
Added tablet:openHome event for external scripts to open the tablet to the home screen.
Creator placement settings for fine-tuning marker/interaction point positions.
Improved InputModal component with better validation and layout.
Other Changes
Comprehensive translation update across all 8 languages (CN, ES, FI, FR, NL, PL, RS, DE).
Fixed missing garage plateEditor and status locale keys in EN and DE.
Fixed merge conflicts in ES and FI locale files.
Fixed missing translation keys in garage interface.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
If Config.AutoExecuteQuery = false, run the SQL migration manually:
CREATE TABLE IF NOT EXISTS `sky_jobs_blips` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`job_key` VARCHAR(100) NOT NULL,
`sprite` INT NOT NULL DEFAULT 1,
`color` INT NOT NULL DEFAULT 0,
`scale` FLOAT NOT NULL DEFAULT 0.8,
`display` INT NOT NULL DEFAULT 4,
`short_range` TINYINT(1) NOT NULL DEFAULT 1,
`label` VARCHAR(255) NULL,
UNIQUE KEY `uniq_job` (`job_key`)
);
Version 1.9.0
Highlights
Added auto database migration (Config.AutoExecuteQuery) — missing tables and columns are created automatically on resource start.
Added dedicated fuel and fuel_type columns for job vehicles, persisted via the sky_base fuel bridge.
Added salary pause/resume exports (pausePlayerSalary, resumePlayerSalary, isPlayerSalaryPaused) to prevent paycheck farming via AFK.
Added unsaved changes confirmation popup in the Roles view.
Notable Changes
Roles can now only manage roles with a lower rank.
Management interfaces now rebuild client-side when a player's job or grade permissions are updated via boss command.
Vehicle mods and liveries are now safely persisted in the garage system.
Migration logic now uses centralized Sky.DB.Migrate() from sky_base.
Preserved NPCs are now repositioned when creator points are moved.
Added retry logic for Sky_Jobs export loading.
Other Changes
Added radial menu open sound.
Fixed "not on duty" notify not appearing.
Disabled default station blips for hospital creator points.
Added missing translation keys for wardrobe, billing, finance, garage, and management views.
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Add in config/config.lua:
-- Automatically create missing tables and add missing columns on resource start.
-- Set to false if you prefer to manually import the SQL file.
Config.AutoExecuteQuery = true
If Config.AutoExecuteQuery = false, run the SQL migration manually:
ALTER TABLE `sky_jobs_vehicles` ADD COLUMN `fuel` FLOAT NULL;
ALTER TABLE `sky_jobs_vehicles` ADD COLUMN `fuel_type` VARCHAR(50) NULL;
Version 1.8.0
Highlights
Added external garage integration exports for trunk/prop functionality with third-party garage systems.
Radial menu default changed from toggle to hold mode.
Notable Changes
Station map blips are now visible for all players; interaction points remain job-filtered.
Optimized CCTV bodycam validation with native framework functions and preserved cache on duty transitions.
Panic button now notifies off-duty players within notification scope.
NUI focus is disabled in creator menu to prevent input conflicts.
Other Changes
Garage location is now automatically set when clicking Add in creator menu.
Creator menu now plays navigation sounds for UX feedback.
Station blips set to short range to reduce map clutter.
Fixed station creation failing in creator menu.
Added missing CCTV config section (Config.Cctv).
Download sky_jobs_base from the CFX Portal.
Create a backup.
Replace the /source folder.
Replace the /config/locales folder.
Add in config/config.lua:
+Config.Cctv = {
+ requireBodycamItem = true,
+ bodycamItem = "bodycam"
+}
+
+----- REPLACE FULLY -----
+Config.JobRadial = {
+ enabled = true,
+ key = "g",
+ mode = "hold", -- "hold" (hold key, release to select) or "toggle" (press to open/close)
+ deadzone = 0.25 -- only used in "hold" mode (stick/mouse deadzone for directional selection)
+}
+
+Config.StationBlip.shortRange
+- shortRange = false
++ shortRange = true
Version 1.7.0
Highlights
Fixed SIGSEGV crash caused by screenshot-basic server export; uploads now go directly from client via presigned URL.
FiveManage API migrated from V2 (fmapi.net) to V3 (api.fivemanage.com) with unified baseUrl.
Removed hard screenshot-basic dependency from fxmanifest.
Notable Changes
FiveManage API key is no longer sent to the client during video uploads.
Fixed trunk transfer failures caused by incorrect return-value comparison.
Item metadata is now preserved through trunk transfers.
Garage now retries alternative spawn points when primary is blocked.
Server now tracks occupied spawn points to prevent concurrent spawn collisions.
Duty state is persisted by identifier and restored on rejoin.
Other Changes
NPC entities are preserved during job interaction rebuilds instead of being respawned.
Managers are now notified of member list changes on disconnect.
Reduced CPU overhead by increasing sleep intervals in non-time-sensitive loops.
Added TTL caching for CCTV plate lookups.
Added early exits in idle threads (CCTV, panic alerts, salary processing).
Replaced many direct framework calls with PlayerCache-first helpers.
Added Finnish translation.
Version 1.6.0
Highlights
Shop items now support quantity input for bulk purchases.
Locker and station storage now support item metadata for ox_inventory.
Notable Changes
Added CCTV/speedcam waypoint button to set GPS markers from tablet.
Added configurable station map blips.
Other Changes
Updated German translations and added new English locale keys.
Version 1.5.0
Highlights
Radial menu now supports hold and toggle modes with improved input blocking.
Added infinite scrolling and backend pagination for transaction logs.
Added localization and UI for vehicle selling feature.
Notable Changes
Table component now includes sticky headers, row limits, and text truncation tooltips.
Duty status changes now include retry logic with immediate UI feedback on failure.
Improved identifier resolution and job-data synchronization across resource starts.
Job creator now supports boat dock markers and interaction points.
Finance UI now refreshes in real-time through server triggers.
Refined duty-time tracking and salary payout calculations.
Other Changes
Player cache operations now gate on framework load state.
Calendar reminder polling now handles app availability more robustly.
Table timestamps now render in fixed German locale.
Hardened player cache refresh during initialization with protected calls.
Optimized server performance by caching job data and bodycam item status.
Removed calendar debug logging.
Added Chinese translation.
Added payroll localization strings across all languages.
Version 1.4.0
Highlights
Added image gallery and screenshot capture system with secure uploads.
Added boat garage support.
Added job invitation system with interactive popup.
Notable Changes
Added My submissions section in public forms.
Staff can now add internal or citizen-visible notes to public forms.
Added custom background image support for custom storage UI.
Added option to disable Go Back button in custom storage.
Panic ping and dispatch now use registered key mappings.
Ping and panic markers now auto-remove after configurable duration.
Radial menu now only shows for registered jobs.
Other Changes
CCTV now respects player visibility settings.
Improved unregistered-job duty handling.
Improved health percentage calculation to avoid negative values.
Improved member online/offline accuracy and multichar identifier resolution.
Version 1.1.1
Highlights
Hotfix: fixed storage bug.
Notable Changes
No additional notable changes documented.
Other Changes
No additional changes documented.
Version 1.1.0
Highlights
Added /setboss [job] [grade] command for boss/wholesale fallback access assignment.
Added option to disable tablet apps or entire tablet.
Added back off-duty job support.
Notable Changes
Fixed locale issues and missing locale entries for tablet apps.
Fixed duplicate NPC spawn on player join.
Fixed go-on-duty radial notify behavior when player lacks job.
Other Changes
Fixed NPC heading application.
Added image path config support.
Fixed dashcams and vehicles on map.
Screenshot & Webhook Update
Highlights
screenshot-basic is no longer a hard dependency.
Screenshot uploads now run client-to-FiveManage via presigned URLs (no server temp files).
FiveManage API updated from V2 to V3 endpoints.
Notable Changes
Video uploads now use presigned URLs for improved security.
Webhook config simplified to single baseUrl.
Other Changes
FiveManage SDK resource is no longer required for sky_jobs_base.