Local tool guide

Content Builder

Install and operate the local Content Builder, create Dispatch and Station Pack resources, generate complete suite configurations, and deploy exports safely.

Resource
San Andreas Sound Suite
Version
Sound 1.5.16 · Dispatch 1.0.0 · Radio 1.0.0
Updated
Updated August 21, 2026
Resource GitHub
Browse documentationSan Andreas Sound Suite
Guide pagesContent Builder
Sections
01 / Overview

What the Builder creates

The Content Builder is a loopback-only local browser application. It copies selected files into local projects, validates them, and downloads ZIPs for manual review and installation; it never edits a live FiveM server.

Build typeWhat it createsOutput
DispatchOne or more randomized local scanner channels made from reviewed MP3 calls.A complete FiveM resource consumed by Radio or another compatible script.
Server RadioSynchronized local stations with artwork, tracks, metadata, and optional identifiers.A complete FiveM Station Pack resource.
Suite SetupGuided Sound, Dispatch, Radio, scanner, provider, and optional voice settings.A configuration bundle containing complete config.lua replacements, not a runnable resource.
  • The Builder does not install Node.js, transcode or master audio, prove media rights, edit a live resource, merge arbitrary Lua semantically, install ZIPs, or replace multiplayer testing.
  • Its local HTTP routes and CommonJS exports are implementation/test internals, not a supported SDK.
  • Keep the Builder outside the FXServer resources tree and never add it to server.cfg.
  • A Build button validates the current project and creates a content ZIP; it does not compile the Builder software.
02 / Installation

Install Node.js and start locally

RequirementCurrent guidance
Node.jsTechnical minimum 20; use a current supported LTS release for a new machine.
npmInstalled with Node.js; downloads the one direct dependency, node-unrar-js 2.0.2.
First-run networkRequired for npm install --omit=dev because node_modules is not tracked.
Runtime binding127.0.0.1 only; normal port 4178, with an alternate local port selected when occupied.
BrowserA current mainstream desktop browser; folder import depends on directory-picker support.
Verify and runshell
node --version
npm --version
cd "/full/path/to/San Andreas Sound Suite Content Builder"
npm install --omit=dev
npm start

On Windows, Launch Content Builder.cmd runs the dependency installation and starts server.js with browser opening enabled. Leave its terminal open. The launcher checks that node exists but does not enforce the minimum major version, so verify node --version yourself.

On macOS and Linux, start manually and open the exact printed http://127.0.0.1:<port> address. The --open behavior in Builder 0.5.3 is Windows-only. Do not open web/index.html directly because it requires the local API.

Press Ctrl+C in the terminal to stop. Closing only the browser tab leaves Node.js running. A temporary /download URL expires when the Builder process restarts; build again if necessary.

Supported package scriptsshell
npm start
npm test
npm start -- --port 5000
03 / Workbench

Workbench, autosave, and local projects

AreaPurpose
Build type and navigationChoose Dispatch, Server Radio, or Suite Setup, then move through Setup, Content, and Review and Export.
Main workspaceEdit resource, channel, station, media, or suite settings for the current step.
Project HealthReview content totals, generated files, and blocking issues.
InspectorPreview Radio/Scanner presentation, manage selected media, or inspect the Suite deployment plan.
Autosave stateMeaning
UNSAVEDA value changed and the short debounce timer is running.
SAVINGThe browser is writing project state to the loopback server.
SAVEDThe local project file was written successfully.
SAVE FAILEDThe write failed; inspect the toast and terminal.
IMPORTEDAn archive or folder was restored into a new editable local project.
Local data layouttext
San Andreas Sound Suite Content Builder/
  data/
    projects/<project UUID>/
      project.json
      uploads/
    exports/
    imports/

The three build types are independent drafts inside one local project. Switching modes does not clear other drafts or uploaded media. Most changes save about 650 ms after input stops.

The browser stores only the active project UUID under san-content-builder-project; uploaded media remains in the local project folder. Builder 0.5.3 has no project library or cleanup screen, so old projects and exports can accumulate.

Before creating a new project, wait for SAVED and retain a generated ZIP as the supported portable backup. Stop the Builder before intentionally archiving or deleting exact local project folders.

04 / Dispatch workflow

Build a Dispatch resource

Resource setup
KeyTypeDefaultAccepted valuesRequiredDescription
Resource folderstring3-64 lowercase letters, digits, underscore, or hyphenYesFiveM folder and ZIP name.
AuthorstringYesWritten to the generated manifest and audit.
No-repeat historyinteger60-100Recent clips withheld at a shuffled-deck boundary; keep below the smallest channel count.
Initial delaymilliseconds10000-60000Delay before scheduling starts.
Private provenance / rights notestringMaximum 1000 normalized charactersStored in BUILD_AUDIT.md.
Media permissionconfirmationYesOperator declaration for intended use and distribution; not proof of rights.
Per-channel fields
KeyTypeDefaultAccepted valuesRequiredDescription
Channel IDstring1-48 lowercase safe charactersYesGenerated Dispatch configuration and catalog key.
Scanner profile IDstring1-48 lowercase safe charactersYesMust match the Radio Config.ScannerProfiles[].Id consuming this channel.
Full label / HUD labelstringYesFull and compact player-facing channel names.
Talkgroup / Talkgroup label / System / FrequencystringYesLore-friendly public metadata.
HUD accent#RRGGBBYesScanner display color.
Minimum / maximum gapseconds0-3600 / 0-7200; maximum >= minimumQuiet period after each call.
Vehicle classesinteger list0-31Broad Radio eligibility emitted in the integration example.
Vehicle models / disabled modelslowercase token listsExplicit fleet eligibility and exclusions.
Privacy reviewconfirmationYesSeparate human review declaration for each channel's current clips.
Dispatch upload ruleValue
Accepted formatReal MP3 with matching header; renaming another format is rejected.
Per-file ceiling500 MB safety limit, not a recommended size.
Minimum duration0.25 seconds.
Runtime namesBuilder-generated normalized audio/<channel>/<channel>-dispatch-###.mp3 paths.
Audit dataOriginal names, exact measured duration, role, and SHA-256 remain in BUILD_AUDIT.md.
  1. Choose Dispatch, enter resource identity and rights information, then add independent channels.
  2. Complete player-facing metadata, timing, vehicle hints, and the separate scanner profile ID for each channel.
  3. Add real MP3 clips and wait for browser duration measurement and server signature validation.
  4. Audition every complete call in a trusted local player; the preview is visual and does not play recordings.
  5. Remove privacy-sensitive or inappropriate content, then reconfirm the current channel's privacy review after every media change.
  6. Resolve all Project Health and deeper export errors, then use BUILD RESOURCE ZIP.
  7. Inspect RADIO_INTEGRATION.lua, BUILD_AUDIT.md, media rights notice, README, and portable project metadata before installation.
05 / Station workflow

Build a Server Radio station pack

Pack setup
KeyTypeDefaultAccepted valuesRequiredDescription
Resource folderstring3-64 lowercase safe charactersYesFiveM folder and ZIP name.
AuthorstringYesGenerated manifest and audit author.
Broadcast anchorUnix timestampYesShared program-clock origin.
Rotation seedinteger1-2,147,483,646 after normalizationYesRepeatable deterministic shuffle seed.
Private provenance / rights notestringInternal source, license, permission, and replacement record.
Media permissionconfirmationYesRequired operator declaration.
Station fields
KeyTypeDefaultAccepted valuesRequiredDescription
Station IDstring1-64 uppercase letters, digits, underscore, or hyphenYesStable catalog identity.
Short labelstringSRVUp to 16 normalized charactersCompact source label.
Station namestringYesPlayer-facing label.
Genre / descriptionstringServer RadioPlayer-facing station description.
Accent#RRGGBBYesRadio display color.
Program orderbooleanDeterministic shuffle when enabled; configured sequence when disabled.
Identifier intervalintegerSongs between identifiers; at least one and no greater than track count.
Identifier orderbooleanDeterministically randomizes identifiers instead of rotating them.
Drop areaFormatsMinimum durationNotes
Music programMP3, M4A, OGG, WAV1 secondBuilder infers Artist - Title from filenames; review every field.
Station identifiersMP3, M4A, OGG, WAV1 secondNormal synchronized segments, not overlays.
Station artworkJPG, JPEG, PNGN/AOptional; copied without resizing or recompressing.
  1. Choose Server Radio, set the stable resource name, anchor, seed, author, and private rights record.
  2. Add stations with unique uppercase IDs and complete display metadata.
  3. Add authorized artwork, music, and optional identifiers; correct inferred artist/title values and verify measured durations.
  4. Use the main and mini previews to review presentation. The preview does not prove FiveM playback.
  5. Resolve missing tracks, invalid IDs, duplicate IDs, missing duration, file role, token, and rights-confirmation errors.
  6. Build and inspect the complete resource ZIP before deployment.
06 / Suite Setup

Build a Suite Setup configuration bundle

Suite Setup creates complete config.lua replacements for selected resources plus reports and a start-order example. It is not another FiveM resource and does not include Station Pack media.

WorkflowBaseUse it for
New InstallationBundled release-safe config templatesInstalling the matching release for the first time.
Existing InstallationUploaded current config.lua for every selected resourcePreserving current code/comments/settings outside the Builder-managed block.
Existing configRequired source signature
SoundSanAndreasSoundConfig =
DispatchConfig.Channels =
RadioBoth Config.Audio = and Config.Bluetooth =

Each uploaded config must be text Lua no larger than 2 MB. Existing Installation preserves the uploaded source, removes one prior complete managed block, rejects unmatched block markers, appends one new managed assignment section, and records filename and SHA-256 in CONFIG_SOURCE_REPORT.md.

This is assignment-based preservation, not semantic Lua merging. Later assignments override earlier values; review the entire generated replacement and every custom dependency on assignment order.

PresetStarting selection
Complete SuiteSound, Radio, local Dispatch, scanners, Bluetooth, and Server Radio packs.
Vehicle RadioSound and Radio without local Dispatch or Station Packs.
Scanner SystemSound, Radio, Dispatch, scanner profiles, and HUD without music sources.
Sound CompatibilitySound with xSound and InteractSound compatibility only.
CustomRetains current choices for manual configuration.
Managed areaImportant controls
Sound basicSpatial audio, cabin filtering, occlusion, streamer mode, xSound and InteractSound compatibility.
Sound advanced16-2000 ms active update, 50-10000 ms idle update, smoothing, filters, bass, and limiter settings.
Radio sourcesNative GTA stations, Satellite streams, Bluetooth links/playlists, and separately built Server Radio packs.
Radio lifecycleMini display, accent picker, accessory retention, NPC station preservation, emergency restrictions, open key, and passenger access.
Radio advancedInput behavior, title lookup, output scale/ceiling, distance, exterior trim, and disabled models.
ScannerHUD/commands, per-profile Dispatch mapping or fallback URL, volume, YouTube resolver, engine/native-scanner and vehicle rules.
Dispatch scheduleInitial delay, no-repeat history, and shared min/max gaps for retained channels.
Station PacksSeparate resource names plus inside and exterior trims; no media is bundled here.
PMA bridgeOptional receive-only profile/channel mapping, target, volume, and display frequency; requires Radio and scanners.
  1. Select New or Existing Installation and a starting preset.
  2. Enter the exact installed resource folders and select only components that exist.
  3. Keep advanced controls at defaults until a measured test or component guide justifies a change.
  4. Resolve dependency conflicts: Sound when Radio selects it, Dispatch for local calls, Radio for Server Radio, and Radio/scanners for the voice bridge.
  5. Review enabled behavior, deduplicated start order, every generated file, and integration warnings in the deployment plan.
  6. Confirm backups and line-by-line review, then build the configuration ZIP.
07 / Validation

Validation and import limits

UploadFormatsPer-file limitAdditional validation
Dispatch callsMP3500 MBHeader matches; browser duration at least 0.25 seconds.
Station tracks/identifiersMP3, M4A, OGG, WAV500 MBHeader matches; duration at least one second.
Station artworkJPG, JPEG, PNG500 MBImage signature matches.
Existing component configLua text2 MBExpected resource assignment signatures.
Archive or folder import ruleLimit
Accepted archiveZIP or RAR
Archive/selected folder upload1 GB maximum
One folder-imported file500 MB maximum
Entries1-4096
Uncompressed validated content4 GB maximum
ZIP methodsStored or deflated; ZIP64 unsupported
RARPassword-protected and multi-part archives unsupported
Unsafe contentSymlinks and path traversal rejected

File extensions are not trusted. The server checks opening bytes, while the browser measures duration before upload. Re-export invalid media with a trusted tool; renaming a file does not repair it.

If the browser cannot obtain a finite duration, test the file locally, use a current Chromium-based browser, convert to a broadly supported codec, and add the corrected file again rather than editing project JSON.

A 500 MB ceiling is only a safety boundary. Oversized or uncompressed media increases export size, client downloads, memory, and startup time.

08 / Export and install

Output contents and safe deployment

OutputImportant contents
Dispatch resourcefxmanifest, config, catalog, scheduler, normalized MP3 tree, RADIO_INTEGRATION.lua, README, audit, rights notice, portable metadata.
Station Pack resourcefxmanifest, config, catalog/scheduler, normalized audio/artwork, RADIO_INTEGRATION.lua, README, audit, rights notice, portable metadata.
Suite Setup bundleREADME, INSTALL, configuration/source reports, server.cfg example, portable metadata, and selected complete config replacements under resources/.
Append generated scanner profiles after their tablesan_andreas_radio/config.lualua
Config.ScannerProfiles = Config.ScannerProfiles or {}
for _, profile in ipairs(GeneratedScannerProfiles) do
    Config.ScannerProfiles[#Config.ScannerProfiles + 1] = profile
end

Config.EmergencyScanner = Config.ScannerProfiles[1]
  1. Back up Radio config, server.cfg, current component configs, and the downloaded ZIP; deploy first to a development server.
  2. Read every generated README, install report, configuration summary, source report, audit, integration snippet, rights notice, and warning.
  3. For Suite Setup, replace only the matching config.lua after line-by-line comparison; do not copy or ensure the bundle root and do not modify manifests.
  4. Merge relevant ensure lines into the real server.cfg and preserve provider/catalog-before-Radio order.
  5. Test generated Dispatch in an eligible vehicle with two clients, its public metadata, offsets, and restart behavior.
  6. Test generated Station Packs for catalog, artwork, metadata, two-client offsets, boundaries, exterior volume, and restart reconstruction.
  7. Keep recoverable backups until all component and multiplayer tests pass.
09 / Import

Import and revise projects

IMPORT RESOURCE accepts a generated ZIP or RAR. A current SAN_ANDREAS_BUILDER.json restores editable settings and referenced media into a new local project. Folder import sends a selected generated folder to the loopback server and validates it through the same archive shape.

Older recognized Dispatch or Station Pack output without portable metadata may be reconstructed from expected Lua and media paths. The importer is not a converter for arbitrary third-party resources.

Round trip restores editable project data, not legal or human-review approvals. Dispatch/station rights confirmations, every Dispatch channel privacy confirmation, and Suite backup/review confirmation reset to false after import.

Builder 0.5.3 has no old-project library. Keep a generated ZIP as the supported portable backup before clearing browser state, moving the Builder, or creating a new project.

10 / Security

Local security, privacy, and rights

  • The server binds to 127.0.0.1, uses a per-process request token, applies restrictive browser headers, rejects unsafe static paths, and validates archive paths.
  • Do not expose or forward the Builder port, bind it publicly, or run the Builder as administrator.
  • Uploads are working copies; the Builder does not modify original source files. Keep independent backups because local data can still be lost.
  • BUILD_AUDIT.md may contain original filenames, hashes, private provenance notes, media roles, durations, and privacy-review status. Keep a private compliance copy and remove sensitive audit details from a public distribution copy when appropriate.
  • A checkbox records the operator's declaration; it does not establish copyright ownership, redistribution rights, consent, privacy compliance, stream terms, availability, or attribution completion.
  • Listen to every scanner clip and keep public metadata lore-friendly. A file that passes structural validation can still fail in a specific FiveM CEF, so test the chosen codec on representative clients.
11 / Operations

Verification, maintenance, and troubleshooting

Run the included Builder verificationshell
npm test

Package metadata, lockfile, visible top-bar identity, cache marker, and /api/health should all report Builder 0.5.3. If they disagree, stop and replace the complete Builder folder before exporting.

The included test suite and syntax checks verify Builder code, not user media rights, provider adapters, custom fleet rules, generated resource behavior, or production configuration.

Use the Builder packaged with the same Suite release. On update, back up local data and installed resources, review release notes and source hashes, reinstall locked dependencies when needed, and rerun export and in-game restart tests.

node or npm is missing or too old.

Likely causes

  • Node.js is not installed
  • The terminal predates the PATH update
  • Installed major version is below 20

Checks

  1. Install a current official LTS
  2. Open a new terminal
  3. Run node --version and npm --version

Expected result

Both commands work and Node reports v20 or newer.

npm install fails.

Likely causes

  • Wrong directory
  • Registry/proxy/firewall issue
  • No write permission
  • Locked node_modules

Checks

  1. Confirm package.json and lockfile
  2. Check network and folder permissions
  3. Retry npm install --omit=dev

Expected result

The locked node-unrar-js dependency installs locally.

The page is blank or browser did not open.

Likely causes

  • web/index.html opened directly
  • Node process stopped
  • Auto-open unsupported
  • Different local port selected

Checks

  1. Use the exact printed 127.0.0.1 URL
  2. Keep the terminal alive
  3. Read the terminal error

Expected result

The workbench loads through the local server API.

SAVE FAILED.

Likely causes

  • Read-only/protected folder
  • Disk space
  • Security software
  • Missing write permission

Checks

  1. Move the complete release to a writable user folder
  2. Check data/projects and free space

Expected result

Project status reaches SAVED.

Project Health says READY but export fails.

Likely causes

  • Deeper server validation not mirrored by the summary

Checks

  1. Read the complete toast
  2. Check profile uniqueness, gap range, minimum durations, duplicate upload tokens, file presence, command names, and normalized resource lists

Expected result

Both client summary and server export validation pass.

Import fails.

Likely causes

  • Unsupported archive feature
  • Size/entry limit
  • Unsafe path
  • Not a recognized generated project

Checks

  1. Review ZIP/RAR limits
  2. Extract trusted unsupported archives and import the inspected folder
  3. Confirm portable metadata or known generated layout

Expected result

A new local editable project is created and review confirmations reset.

Generated Dispatch starts but Radio has no local calls.

Likely causes

  • Wrong start order or resource name
  • Mapping/profile IDs differ
  • Generated profiles were not merged
  • Vehicle rules do not match

Checks

  1. Inspect Config.Dispatch and Config.ScannerProfiles
  2. Confirm enabled channel and vehicle eligibility

Expected result

The mapped scanner uses the generated local channel.

A generated Station Pack does not appear.

Likely causes

  • Pack not started before Radio
  • Folder not appended to Resources
  • ServerRadio disabled
  • Catalog/provider error

Checks

  1. Check exact names and both consoles
  2. Preserve other pack names

Expected result

The SERVER source lists every valid generated station.