Skip to main content
Version: Next

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/health for monitoring, used by the image's Docker health check.
  • @gateway diagnostic tags, @gateway.time clock tag, and @gateway.performance.* as real tags with history.
  • Configuration by environment and .env files; data directory layout with backups/, 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 /sync upgrade.
  • 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, user and session scope; 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; dtl is 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, with stale on 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.replay from 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​

  • /sync WebSocket: 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.clients tags.
  • 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, openPopup and openUrl directives, 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.json in 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, unsigned and tampered states.
  • 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.