Changelog
v1.1.1 — Hotfix : ACE Permission Mismatch + Actionable Error
2026-05-18
Bug Fixes
- ACE fallback inconsistency — when
HZBridge.Panel.AcePermissionwas missing,nil, or empty inconfig.lua, the panel fell back to"HZ-Bridge.admin"while the documented default (and theconfig.luashipped default) were both"admin". Customers with a validadd_ace group.admin admin allowwere locked out for no reason. Fallback now correctly resolves to"admin", aligned on config + docs. - Fixed in both
modules/panel/api_server.luaandmodules/panel/theme.lua(the mismatch lived in two places).
Improvements
- Permission error message is now actionable. When
/hzpanelACE check fails, the server console prints the exact two lines to copy-paste, with the player's license already interpolated:
add_principal license:abcdef... group.admin
add_ace group.admin admin allow
- Chat notification names the missing ACE node explicitly instead of a vague
"perm. HZ-Bridge". Players know exactly what to fix. - The console output also explicitly flags that
command.hzpanelis NOT the right ACE node — customers were trying it out of confusion (most common ticket source pre-v1.1.1).
Upgrade Notes
- Drop-in replace. No config / DB / event / schema changes.
- If your panel was working in v1.1.0 it still works in v1.1.1 — the fix only unblocks customers who were locked out by the bad fallback.
- See the Permissions setup section of the Admin Panel guide for the canonical setup (and the qb-core boilerplate gotcha that explains why so many tickets reference this).
v1.1.0 — Centralised Admin Panel + Theme Cascade
2026-05-15
The headline change: HZ-Bridge ships a full in-game admin panel. Every HZ-Script module now declares its config schema via a small Lua DSL, and the panel auto-builds a typed editor for it. No more per-script commands, no more touching config.lua between every tweak, no more restart-to-apply.
New Features
/hzpanelcommand — opens the central admin panel in-game. ACE-gated (defaultadmin, configurable viaHZBridge.Panel.AcePermission). Skips the ACE check entirely whenHZBridge.Panel.DevAllowAll = true(dev only — turn off in production).- Schema DSL (
bridge_schema.lua) — every module declares its config as a sandboxed Lua chunk that callsmodule()/section()/group()/field()/invariant()/migrations(). The panel auto-builds a typed editor from the declaration. Field types supported:boolean,number,string,enum,color,keybind,list,list,vehicle-list,weapon-list,action,enum-action,view. enum-multifield type — constrained multi-select picker (toggle chips). Stored aslist, but the admin can only tick values from a fixedchoicesarray. First consumer: HZ-Weather'sBlackoutExceptions.- Custom views — modules can register full-width React components in the panel under
web/src/views/. Used by HZ-Weather to ship a polygon + circle zone editor, a satellite map, a forecast graph, a calendar, a seasons panel, and a time controller./ - Theme cascade ("Apparence" tab) — one place to control the visual surface of every HZ NUI. Four orthogonal axes:
accent / accentHi / gold) — Vice signature pink / hot pink / gold. Presets: Vice, Industrial.
* Surfaces (surface / subpanel / tint) — outer panel / inner sub-panel / hover tint. RGB only — opacity decided per consumer via rgb(var(--hz-surface-rgb) / 0.X).
* Gradient mode (gradient / solid) — solid collapses every accent gradient to a 1-stop flat fill.
* Radii (radiusNone / Xs / Sm / Md / Lg / Xl) — six-tier corner scale. Presets: Sharp (0/2/4/6/8/10), Soft (0/3/6/8/12/16), Round (0/4/8/12/16/20), Industrial (0/0/2/2/4/4).
- Live broadcast —
HZ-Bridge:theme:updated(server + client) fires on every save. Resources subscribe and applyapplyTheme()to their own NUI. NewGetTheme()export returns the current effective theme synchronously. OpenPanel(src, module?)server export — open the panel for a player from another script, optionally preselecting a module's tab.
Safety + ops
- Sandboxed schemas — DSL runs without raw
io/os/debug, with restrictedstring/table/mathsubsets. A buggybridge_schema.luafails to load (logged) but can't crash the server. - Rate-limited writes — default
10 writes per 5sper source (configurable). - Session tokens — every panel open issues a short-lived token (default 5 min TTL) that gates every save.
- Per-source ACE check on every action — not just at panel open. A revoked admin can't keep editing on an already-open panel.
- Audit log — every accepted save writes a line to
data/audit-YYYY-MM-DD.log. Rolling files older thanAuditRetentionDays(default 90) are pruned at boot. - Atomic writes — effective config per module is written via tmpfile + rename (
data/). Pending writes use.json data/and are committed atomically..pending.json
Performance
- Map tile pre-fetch — the 257 satellite tiles used by HZ-Weather's Map / ZoneEditor views are pre-warmed in CEF's cache at panel mount via
requestIdleCallback, capped at 12 concurrent requests. First open of a map view is now instant instead of 1-3s. - No backdrop-filter anywhere — compositor blur was removed from every HZ NUI (the previous "allowed on overlays" carve-out is revoked). Even paused overlays cost 8-12 FPS to a single blur. Replaced with deeper alpha scrims (
rgba(0,0,0,0.78)+on backdrops,0.55–0.92on glass cards).
Improvements
- Mercator-safe circle rendering in HZ-Weather views — Cayo Perico (game Y ≈ -5150) used to render circles too small because the previous
ignored Mercator stretch at high latitudes. Now uses a true projected ellipse with local px-per-meter on each axis. Both the editor and the map view agree. - Default Apparence colour matches the rest of the HZ ecosystem — Vice palette + Vice surfaces + Sharp radii pre-applied at first boot.
Upgrade Notes
- No breaking changes for consumers of the bridge's framework / inventory / notification APIs — those continue to work identically.
- Resources that want to expose config in the panel ship a
bridge_schema.luaat their root. See the Admin Panel guide for the DSL reference. - If you set
HZBridge.Panel.DevAllowAll = truewhile iterating, set it back to false before going live — the panel is a serious tool, not something to leave open.
v1.0.0 — Initial Release
2026-02-15
- Universal framework adapter — auto-detects ESX, QBCore, QBX, Ox Core, vRP, or runs standalone
- Inventory adapter — ox\_inventory, qs-inventory, ps-inventory, codem, core, origen, tgiann, or framework native
- Notifications adapter — ox\_lib, okokNotify, mythic\_notify, codem, pNotify, framework, or GTA native
- Target adapter — ox\_target, qb-target, interact, or built-in TextUI fallback
- Menu / input adapter — ox\_lib (full), qb-menu + qb-input, ESX menu, or GTA native fallback
- Dispatch adapter — cd\_dispatch, ps-dispatch, qs-dispatch, rcore\_dispatch, emergencydispatch, or built-in
- Bidirectional callbacks (client ↔ server) with rate limiting + timeout
- Built-in minigames — progress bar, skill check, sequence
- Single
'auto'mode that resolves the right backend per system
