Convars
Convars wire Blixt to your server infrastructure: framework, storage,
trust allowlists, debug flags. Set them in server.cfg before
ensure blixt.
config.json covers the player-visible product surface (apps, wallpapers,
branding); convars cover everything else.
Quick reference
Section titled “Quick reference”The full set, copy-pasteable:
# Coreset blixt:framework "auto" # auto | qbox | qbcore | esx | standaloneset blixt:debug "false" # "true" enables verbose logs + the _dev tRPC routerset blixt:telemetry "true" # anonymous boot ping; see docs/PRIVACY.mdsetr blixt:custom_prop "false" # "true" swaps the GTA phone for the streamed Blixt prop
# Trustset blixt:trusted_resources "" # comma-separated list of resources allowed to call exports.blixt:*
# Photo + video + voice memo storageset blixt:image_storage "auto" # auto | r2 | s3 | fivemanage | discordset blixt:video_storage "auto" # auto | r2 | s3 | fivemanageset blixt:voice_memo_storage "auto" # auto | r2 | s3 | fivemanageset blixt:message_image_hosts "" # extra trusted hosts for pasted image URLsset blixt:image_path "photos"set blixt:video_path "videos"set blixt:voice_memo_path "voice-memos"
# Cloudflare R2 (account + bucket reused across images and voice memos)set blixt:r2_account_id ""set blixt:r2_bucket ""set blixt:r2_access_key_id ""set blixt:r2_secret_access_key ""set blixt:r2_public_url "" # optional pubsub.r2.dev or custom CDN
# Generic S3 (alternative to R2)set blixt:s3_endpoint ""set blixt:s3_bucket ""set blixt:s3_access_key_id ""set blixt:s3_secret_access_key ""set blixt:s3_region "us-east-1"set blixt:s3_public_url ""
# Fivemanage (third option)set blixt:fivemanage_token ""
# Discord (cheapest, least durable)set blixt:image_webhook ""
# Database (read by oxmysql + Blixt)set mysql_connection_string "mysql://user:pass@host:3306/blixt"All convars also surface under txAdmin → Server Configuration → Blixt.
blixt:framework
Section titled “blixt:framework”Selects the framework adapter. Adapter source:
packages/framework-adapter/src/.
| Value | Behaviour |
|---|---|
auto (default) | Detects qbox, then qbcore, then esx; falls back to standalone. |
qbox | Force qbox. |
qbcore | Force qbcore. |
esx | Force ESX. |
standalone | No framework integration. Useful for staging or custom forks. |
Override auto when you run multiple frameworks side-by-side during a
migration, or when auto-detection picks the wrong one.
blixt:debug
Section titled “blixt:debug”"true" enables verbose Winston logs and mounts the internal _dev tRPC
router (used by the dev HTTP API and the e2e harness). When explicitly set, it
overrides debug.enabled in config.json. Off in production.
blixt:debugLevel
Section titled “blixt:debugLevel”Optional. One of error, warn, info, debug, trace. Overrides the
debug.level field in config.json. Use this when you want to flip
verbosity from txAdmin without editing JSON.
blixt:telemetry
Section titled “blixt:telemetry”Anonymous boot ping. "true" (default) sends one POST per resource start
with a hashed license key, framework name, version, and boot timestamp.
See Privacy and telemetry for the exact payload.
Set "false" to disable; the network call is suppressed at the source.
blixt:custom_prop
Section titled “blixt:custom_prop”Replicated convar (setr, not set) — clients read it. When "true",
Blixt streams the blixt_phone model and swaps the default GTA
prop_amb_phone_01 whenever the player holds the phone.
Default "false" so out-of-the-box installs don’t depend on the streamed
asset reaching every client.
blixt:trusted_resources
Section titled “blixt:trusted_resources”Comma-separated allowlist of resources permitted to call gated Blixt
exports (e.g. RegisterExternalApp payload exports, internal data
readers). Without this allowlist, satellite apps can register themselves
but cannot call privileged APIs.
set blixt:trusted_resources "blixt-business,my-gov-app"The trust list is one-way: Blixt trusts these resources to call into it. It does not give those resources access to one another.
Note.
RegisterExternalAppitself is intentionally not gated by this convar — gating it creates a chicken-and-egg where unregistered resources can never become trusted. Only the privileged read/write exports are gated.
Storage
Section titled “Storage”Blixt persists three media types: photos (camera + gallery), camera videos, and voice memos (messages, voice notes). Each can target a different backend, configured independently.
Camera and gallery setup
Section titled “Camera and gallery setup”The Camera app requires screenshot-basic to be started before blixt. After
that, configure where Blixt uploads image files by setting blixt:image_storage
and video files by setting blixt:video_storage.
Use one of these image backends:
- Cloudflare R2 (
"r2") for most production servers. You control the bucket, credentials, and optional public CDN URL. - Generic S3 (
"s3") for AWS S3, MinIO, Wasabi, Backblaze B2, or another S3-compatible provider. - Fivemanage (
"fivemanage") if your server already uses Fivemanage media hosting. - Discord webhook (
"discord") for cheap testing only. It works for images, but is the least durable option and does not support voice memos.
Video storage supports R2, S3, and Fivemanage. Discord webhook storage remains image-only.
If you leave a media storage convar as "auto", Blixt chooses the first
complete credential set in the order below. If you pin a backend explicitly,
missing credentials do not fall back to another provider.
Resolution order: auto
Section titled “Resolution order: auto”When blixt:image_storage, blixt:video_storage, or
blixt:voice_memo_storage is "auto"
(default), Blixt picks the first backend whose credentials are set, in
this order:
- Cloudflare R2 — if
blixt:r2_account_id+blixt:r2_bucket+ access keys are set. - Generic S3 — if
blixt:s3_endpoint+blixt:s3_bucket+ access keys are set. - Fivemanage — if
blixt:fivemanage_tokenis set. - Discord (images only) — if
blixt:image_webhookis set. - None — uploads fail with a user-visible error.
Pin a specific backend with the explicit value ("r2", "s3",
"fivemanage", "discord") when you have multiple sets of credentials
configured and want to be explicit about which one wins.
Pasted message images
Section titled “Pasted message images”Messages turn a pasted image URL into a rich image only when the URL is HTTPS
and its host is trusted. Built-in trusted hosts cover Blixt’s bundled demo
images plus Discord and Fivemanage storage. blixt:r2_public_url,
blixt:r2_endpoint, blixt:s3_public_url, and blixt:s3_endpoint are trusted
automatically when configured. Add any other CDN hosts with
blixt:message_image_hosts as a comma-separated list.
Path prefixes
Section titled “Path prefixes”blixt:image_path (default "photos"), blixt:video_path (default
"videos"), and blixt:voice_memo_path (default "voice-memos") are the
bucket key prefix. Object keys are <prefix>/<id>.<ext>.
Cloudflare R2
Section titled “Cloudflare R2”Recommended for production: free egress, S3-compatible API, easy CDN.
| Convar | Required |
|---|---|
blixt:r2_account_id | yes |
blixt:r2_bucket | yes |
blixt:r2_access_key_id | yes |
blixt:r2_secret_access_key | yes |
blixt:r2_public_url | optional (defaults to pubsub.r2.dev) |
Generate the access keys under Cloudflare → R2 → Manage R2 API Tokens. Scope them to read+write on the single bucket.
Generic S3
Section titled “Generic S3”For AWS S3, MinIO, Wasabi, Backblaze B2 (S3-compatible mode), or any provider exposing the S3 API.
| Convar | Required |
|---|---|
blixt:s3_endpoint | yes — full URL incl. scheme |
blixt:s3_bucket | yes |
blixt:s3_access_key_id | yes |
blixt:s3_secret_access_key | yes |
blixt:s3_region | optional (default "us-east-1") |
blixt:s3_public_url | optional (default: derived from endpoint) |
Fivemanage
Section titled “Fivemanage”If you already have a Fivemanage subscription:
set blixt:image_storage "fivemanage"set blixt:video_storage "fivemanage"set blixt:voice_memo_storage "fivemanage"set blixt:fivemanage_token "your-token"Discord webhook (images only)
Section titled “Discord webhook (images only)”Lowest setup, least durable — Discord may delete your channel or rate-limit you. Fine for testing.
set blixt:image_storage "discord"set blixt:image_webhook "https://discord.com/api/webhooks/.../..."Test mode
Section titled “Test mode”These convars are read by the e2e test harness and the dev HTTP API. Leave them at defaults in production.
| Convar | Purpose |
|---|---|
blixt:test_mode | "1" enables the harness HTTP control surface. |
blixt:test_resources | Comma-separated list of resources permitted to drive it. |
Database
Section titled “Database”mysql_connection_string
Section titled “mysql_connection_string”Read by both oxmysql and Blixt’s @blixt/database package. Connection
URL form:
mysql://user:password@host:port/databaseBlixt runs all pending migrations against this database on startup, using
a tracking table called blixt_migrations. The user needs CREATE,
ALTER, DROP, INDEX, plus the standard CRUD grants.
If neither this convar nor the DATABASE_URL env var (used in the
browser-mode dev server) is set, Blixt fails to start and logs:
No database connection string found. Set DATABASE_URL env var or mysql_connection_string convar.