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 type | What it creates | Output |
|---|---|---|
| Dispatch | One or more randomized local scanner channels made from reviewed MP3 calls. | A complete FiveM resource consumed by Radio or another compatible script. |
| Server Radio | Synchronized local stations with artwork, tracks, metadata, and optional identifiers. | A complete FiveM Station Pack resource. |
| Suite Setup | Guided 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.
Install Node.js and start locally
| Requirement | Current guidance |
|---|---|
| Node.js | Technical minimum 20; use a current supported LTS release for a new machine. |
| npm | Installed with Node.js; downloads the one direct dependency, node-unrar-js 2.0.2. |
| First-run network | Required for npm install --omit=dev because node_modules is not tracked. |
| Runtime binding | 127.0.0.1 only; normal port 4178, with an alternate local port selected when occupied. |
| Browser | A current mainstream desktop browser; folder import depends on directory-picker support. |
node --version
npm --version
cd "/full/path/to/San Andreas Sound Suite Content Builder"
npm install --omit=dev
npm startOn 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.
npm start
npm test
npm start -- --port 5000Workbench, autosave, and local projects
| Area | Purpose |
|---|---|
| Build type and navigation | Choose Dispatch, Server Radio, or Suite Setup, then move through Setup, Content, and Review and Export. |
| Main workspace | Edit resource, channel, station, media, or suite settings for the current step. |
| Project Health | Review content totals, generated files, and blocking issues. |
| Inspector | Preview Radio/Scanner presentation, manage selected media, or inspect the Suite deployment plan. |
| Autosave state | Meaning |
|---|---|
| UNSAVED | A value changed and the short debounce timer is running. |
| SAVING | The browser is writing project state to the loopback server. |
| SAVED | The local project file was written successfully. |
| SAVE FAILED | The write failed; inspect the toast and terminal. |
| IMPORTED | An archive or folder was restored into a new editable local project. |
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.
Build a Dispatch resource
| Key | Type | Default | Accepted values | Required | Description |
|---|---|---|---|---|---|
Resource folder | string | — | 3-64 lowercase letters, digits, underscore, or hyphen | Yes | FiveM folder and ZIP name. |
Author | string | — | — | Yes | Written to the generated manifest and audit. |
No-repeat history | integer | 6 | 0-100 | — | Recent clips withheld at a shuffled-deck boundary; keep below the smallest channel count. |
Initial delay | milliseconds | 1000 | 0-60000 | — | Delay before scheduling starts. |
Private provenance / rights note | string | — | Maximum 1000 normalized characters | — | Stored in BUILD_AUDIT.md. |
Media permission | confirmation | — | — | Yes | Operator declaration for intended use and distribution; not proof of rights. |
| Key | Type | Default | Accepted values | Required | Description |
|---|---|---|---|---|---|
Channel ID | string | — | 1-48 lowercase safe characters | Yes | Generated Dispatch configuration and catalog key. |
Scanner profile ID | string | — | 1-48 lowercase safe characters | Yes | Must match the Radio Config.ScannerProfiles[].Id consuming this channel. |
Full label / HUD label | string | — | — | Yes | Full and compact player-facing channel names. |
Talkgroup / Talkgroup label / System / Frequency | string | — | — | Yes | Lore-friendly public metadata. |
HUD accent | #RRGGBB | — | — | Yes | Scanner display color. |
Minimum / maximum gap | seconds | — | 0-3600 / 0-7200; maximum >= minimum | — | Quiet period after each call. |
Vehicle classes | integer list | — | 0-31 | — | Broad Radio eligibility emitted in the integration example. |
Vehicle models / disabled models | lowercase token lists | — | — | — | Explicit fleet eligibility and exclusions. |
Privacy review | confirmation | — | — | Yes | Separate human review declaration for each channel's current clips. |
| Dispatch upload rule | Value |
|---|---|
| Accepted format | Real MP3 with matching header; renaming another format is rejected. |
| Per-file ceiling | 500 MB safety limit, not a recommended size. |
| Minimum duration | 0.25 seconds. |
| Runtime names | Builder-generated normalized audio/<channel>/<channel>-dispatch-###.mp3 paths. |
| Audit data | Original names, exact measured duration, role, and SHA-256 remain in BUILD_AUDIT.md. |
- Choose Dispatch, enter resource identity and rights information, then add independent channels.
- Complete player-facing metadata, timing, vehicle hints, and the separate scanner profile ID for each channel.
- Add real MP3 clips and wait for browser duration measurement and server signature validation.
- Audition every complete call in a trusted local player; the preview is visual and does not play recordings.
- Remove privacy-sensitive or inappropriate content, then reconfirm the current channel's privacy review after every media change.
- Resolve all Project Health and deeper export errors, then use BUILD RESOURCE ZIP.
- Inspect RADIO_INTEGRATION.lua, BUILD_AUDIT.md, media rights notice, README, and portable project metadata before installation.
Build a Server Radio station pack
| Key | Type | Default | Accepted values | Required | Description |
|---|---|---|---|---|---|
Resource folder | string | — | 3-64 lowercase safe characters | Yes | FiveM folder and ZIP name. |
Author | string | — | — | Yes | Generated manifest and audit author. |
Broadcast anchor | Unix timestamp | — | — | Yes | Shared program-clock origin. |
Rotation seed | integer | — | 1-2,147,483,646 after normalization | Yes | Repeatable deterministic shuffle seed. |
Private provenance / rights note | string | — | — | — | Internal source, license, permission, and replacement record. |
Media permission | confirmation | — | — | Yes | Required operator declaration. |
| Key | Type | Default | Accepted values | Required | Description |
|---|---|---|---|---|---|
Station ID | string | — | 1-64 uppercase letters, digits, underscore, or hyphen | Yes | Stable catalog identity. |
Short label | string | SRV | Up to 16 normalized characters | — | Compact source label. |
Station name | string | — | — | Yes | Player-facing label. |
Genre / description | string | Server Radio | — | — | Player-facing station description. |
Accent | #RRGGBB | — | — | Yes | Radio display color. |
Program order | boolean | — | — | — | Deterministic shuffle when enabled; configured sequence when disabled. |
Identifier interval | integer | — | — | — | Songs between identifiers; at least one and no greater than track count. |
Identifier order | boolean | — | — | — | Deterministically randomizes identifiers instead of rotating them. |
| Drop area | Formats | Minimum duration | Notes |
|---|---|---|---|
| Music program | MP3, M4A, OGG, WAV | 1 second | Builder infers Artist - Title from filenames; review every field. |
| Station identifiers | MP3, M4A, OGG, WAV | 1 second | Normal synchronized segments, not overlays. |
| Station artwork | JPG, JPEG, PNG | N/A | Optional; copied without resizing or recompressing. |
- Choose Server Radio, set the stable resource name, anchor, seed, author, and private rights record.
- Add stations with unique uppercase IDs and complete display metadata.
- Add authorized artwork, music, and optional identifiers; correct inferred artist/title values and verify measured durations.
- Use the main and mini previews to review presentation. The preview does not prove FiveM playback.
- Resolve missing tracks, invalid IDs, duplicate IDs, missing duration, file role, token, and rights-confirmation errors.
- Build and inspect the complete resource ZIP before deployment.
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.
| Workflow | Base | Use it for |
|---|---|---|
| New Installation | Bundled release-safe config templates | Installing the matching release for the first time. |
| Existing Installation | Uploaded current config.lua for every selected resource | Preserving current code/comments/settings outside the Builder-managed block. |
| Existing config | Required source signature |
|---|---|
| Sound | SanAndreasSoundConfig = |
| Dispatch | Config.Channels = |
| Radio | Both 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.
| Preset | Starting selection |
|---|---|
| Complete Suite | Sound, Radio, local Dispatch, scanners, Bluetooth, and Server Radio packs. |
| Vehicle Radio | Sound and Radio without local Dispatch or Station Packs. |
| Scanner System | Sound, Radio, Dispatch, scanner profiles, and HUD without music sources. |
| Sound Compatibility | Sound with xSound and InteractSound compatibility only. |
| Custom | Retains current choices for manual configuration. |
| Managed area | Important controls |
|---|---|
| Sound basic | Spatial audio, cabin filtering, occlusion, streamer mode, xSound and InteractSound compatibility. |
| Sound advanced | 16-2000 ms active update, 50-10000 ms idle update, smoothing, filters, bass, and limiter settings. |
| Radio sources | Native GTA stations, Satellite streams, Bluetooth links/playlists, and separately built Server Radio packs. |
| Radio lifecycle | Mini display, accent picker, accessory retention, NPC station preservation, emergency restrictions, open key, and passenger access. |
| Radio advanced | Input behavior, title lookup, output scale/ceiling, distance, exterior trim, and disabled models. |
| Scanner | HUD/commands, per-profile Dispatch mapping or fallback URL, volume, YouTube resolver, engine/native-scanner and vehicle rules. |
| Dispatch schedule | Initial delay, no-repeat history, and shared min/max gaps for retained channels. |
| Station Packs | Separate resource names plus inside and exterior trims; no media is bundled here. |
| PMA bridge | Optional receive-only profile/channel mapping, target, volume, and display frequency; requires Radio and scanners. |
- Select New or Existing Installation and a starting preset.
- Enter the exact installed resource folders and select only components that exist.
- Keep advanced controls at defaults until a measured test or component guide justifies a change.
- Resolve dependency conflicts: Sound when Radio selects it, Dispatch for local calls, Radio for Server Radio, and Radio/scanners for the voice bridge.
- Review enabled behavior, deduplicated start order, every generated file, and integration warnings in the deployment plan.
- Confirm backups and line-by-line review, then build the configuration ZIP.
Validation and import limits
| Upload | Formats | Per-file limit | Additional validation |
|---|---|---|---|
| Dispatch calls | MP3 | 500 MB | Header matches; browser duration at least 0.25 seconds. |
| Station tracks/identifiers | MP3, M4A, OGG, WAV | 500 MB | Header matches; duration at least one second. |
| Station artwork | JPG, JPEG, PNG | 500 MB | Image signature matches. |
| Existing component config | Lua text | 2 MB | Expected resource assignment signatures. |
| Archive or folder import rule | Limit |
|---|---|
| Accepted archive | ZIP or RAR |
| Archive/selected folder upload | 1 GB maximum |
| One folder-imported file | 500 MB maximum |
| Entries | 1-4096 |
| Uncompressed validated content | 4 GB maximum |
| ZIP methods | Stored or deflated; ZIP64 unsupported |
| RAR | Password-protected and multi-part archives unsupported |
| Unsafe content | Symlinks 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.
Output contents and safe deployment
| Output | Important contents |
|---|---|
| Dispatch resource | fxmanifest, config, catalog, scheduler, normalized MP3 tree, RADIO_INTEGRATION.lua, README, audit, rights notice, portable metadata. |
| Station Pack resource | fxmanifest, config, catalog/scheduler, normalized audio/artwork, RADIO_INTEGRATION.lua, README, audit, rights notice, portable metadata. |
| Suite Setup bundle | README, INSTALL, configuration/source reports, server.cfg example, portable metadata, and selected complete config replacements under resources/. |
Config.ScannerProfiles = Config.ScannerProfiles or {}
for _, profile in ipairs(GeneratedScannerProfiles) do
Config.ScannerProfiles[#Config.ScannerProfiles + 1] = profile
end
Config.EmergencyScanner = Config.ScannerProfiles[1]- Back up Radio config, server.cfg, current component configs, and the downloaded ZIP; deploy first to a development server.
- Read every generated README, install report, configuration summary, source report, audit, integration snippet, rights notice, and warning.
- 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.
- Merge relevant ensure lines into the real server.cfg and preserve provider/catalog-before-Radio order.
- Test generated Dispatch in an eligible vehicle with two clients, its public metadata, offsets, and restart behavior.
- Test generated Station Packs for catalog, artwork, metadata, two-client offsets, boundaries, exterior volume, and restart reconstruction.
- Keep recoverable backups until all component and multiplayer tests pass.
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.
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.
Verification, maintenance, and troubleshooting
npm testPackage 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
- Install a current official LTS
- Open a new terminal
- 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
- Confirm package.json and lockfile
- Check network and folder permissions
- 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
- Use the exact printed 127.0.0.1 URL
- Keep the terminal alive
- 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
- Move the complete release to a writable user folder
- 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
- Read the complete toast
- 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
- Review ZIP/RAR limits
- Extract trusted unsupported archives and import the inspected folder
- 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
- Inspect Config.Dispatch and Config.ScannerProfiles
- 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
- Check exact names and both consoles
- Preserve other pack names
Expected result
The SERVER source lists every valid generated station.