Changelog
What each documented release contains, by area. The first entry is the first release these docs describe; there is no earlier documented history.
0.1 — 2026-11-08
Gateway Core 0.1.0, module contract Scadex.Sdk 1.3. One appliance image with the gateway, a bundled NATS 2.12.3 JetStream server and the dashboard, on .NET 10.
Gateway
- Tag runtime with stable public ids, protobuf value and metadata events, and a value accepted only after JetStream persists it.
- SQLite for configuration and the current-state projection, WAL mode with a 5-second background checkpoint.
- Module state, driver passwords included, encrypted at rest with Data Protection keys in
DATA_DIR/keys; plaintext rows are encrypted on start. /api/v1/runtime/healthfor monitoring, used by the image's Docker health check.@gatewaydiagnostic tags,@gateway.timeclock tag, and@gateway.performance.*as real tags with history.- Configuration by environment and
.envfiles; data directory layout withbackups/,licenses/,modules/,logs/modules/.
Security
- Four roles,
viewer,operator,engineer,admin, each including the one before; every route names the role it needs and a route that names none is closed. - First account is the admin and the only self-service account; admins create the rest.
- Cookie sessions of 7 days; a trusted-origin check on every change and on the
/syncupgrade. - API keys with a role up to engineer and optional expiry, used as
Authorization: Bearer scx_.... - OpenID Connect sign-in providers with PKCE, state and nonce, and an admin-chosen role for first sign-ins.
- Write audit log of every attempt to change a value, with outcome, per tag and gateway-wide.
- Database connections (Postgres, SQL Server, MySQL) with store-and-forward of the audit log.
Tags and tag types
- Memory tags with
gateway,userandsessionscope; derived tags following a whole value, a property or one bit; expression tags in the script sandbox. - Scaling and deadband inside the runtime, with the raw value carried alongside and inverse scaling on writes.
- Tag types (UDTs) with parameters, nested types, alarm templates, and inheritance with sparse per-member patches up to 8 deep.
- Tags added to an instance outside its type, with parameter substitution.
- Built-in types under
@types.built-in, rewritten at every start;dtlis the first. - Types moved from
_types_to@types;@names reserved for Scadex.
Alarms
- One alarm per condition on a tag:
greater,less,equal,notEqual, severity 1 to 1000, deadband, on-delay up to a day. - States
normal,active,acknowledged,cleared, withstaleon untrusted quality and occurrence ids on acknowledgement. - Alarm history for 365 days, shelving, and alarm templates on tag type members resolved per instance.
- Alarm pipelines: webhooks on active, acknowledged or cleared above a severity, with a log of the last 500 sends.
History and replay
tag.replayfrom a running historian or from the event backbone, with the reply saying which answered and what it covers.- Hourly checkpoints of every tag's last value in their own stream.
- Replay of values, the clock and alarms to one socket at recorded pace, up to 8 at once; a browser-wide replay mode in the dashboard started from the clock.
- Historian module keeping every value for 90 days by default, resuming without loss or duplicates.
- Reports: shared definitions run as per-interval statistics from the historian, with CSV download.
Live data
/syncWebSocket: subscribe, write, replay, alarm and screen-event frames; 32 sockets per user, 10,000 subscriptions per socket.- Clients page listing live sockets with their statistics, and
@gateway.clientstags. - Event streams: tag paths batched by age or count and sent to a webhook, with refused batches held and resent.
Screens
- Designer with a widget palette, hierarchy, tag browser and property panel; screens, templates with parameters, and popups.
- Screen event scripts returning
toast,navigate,openPopupandopenUrldirectives, run with the session's identity. - Start screens: named entries opening a screen, limited to roles, instead of projects.
- Save conflicts refused with a choice to keep or take the other version; live presence of who has a screen open.
Scripting
- Sandboxed JavaScript in a pool of worker processes with statement, memory and CPU limits per script kind.
system.*API (tag,alarm,db,gateway,user,date,util) with a TypeScript contract checked in the editors.- Script console for admins: a dry run of a screen script, writes reported and never applied.
Modules
- Modules load from
module.jsonin collectible contexts, each with its own version and licence, and can be installed from a zip, started, stopped, restarted and removed while the gateway runs. - Per-module logs: 2,000 lines in memory, rotating files on disk, a live stream, a level changeable at run time, credentials masked.
- Licensing: signed grants per module, signed packages,
unlicensed,unsignedandtamperedstates. - OPC UA driver (read a Siemens S7-1500 over its own server; structured values and a wand to make a type from a structure), MQTT driver (run against Mosquitto), historian, cron jobs.
- Cron jobs: five-field schedules per time zone, script or tag-write actions, every run kept for 90 days with outcome, missed-run records and a failure tag.
Administration
- Diagnostics, gateway settings with performance figures, modes (stored, nothing reacts yet), storage, backup and restore of the database with a staged restore applied at the next start, gateway log viewer.
- WinCC Unified importer rebuilding a TIA Openness export as a connection, tags, alarms, tag type instances and screens.