Control Seat V0.1.4 — Run it on your own metal
V0.1.4 is the biggest release we've shipped since Flows. Control Seat now runs on your own hardware — download an installer for your OS, double-click, and the gateway opens in your browser. Or run it from a single Docker Compose tarball on a Linux server (air-gapped is fine). We also added MQTT and Sparkplug B as a first-class push datasource alongside the existing query-based sources, taught the AI assistant to read images you drop into the chat, and laid the foundation for OPC UA.
What's in V0.1.4
Run Control Seat on your own hardware
V0.1.4 ships native installers for all the platforms that matter. No Docker required, no config-file editing, no certificate dance — pick the installer for your OS, double-click, and the gateway opens at http://localhost:8090.
- macOS —
.pkginstalls Control Seat into/Applications/Control Seat.app, registers a LaunchAgent so the service starts at login, and opens the browser. - Windows 10/11 —
.msiinstalls toC:\Program Files\Control Seat\and registers a Windows Service. - Linux Debian/Ubuntu —
.debpackage installs to/usr/lib/controlseat/and registers a systemd unit. - Linux RHEL/Fedora/Rocky —
.rpmpackage, same structure as the .deb. - Docker Compose — for Linux servers, on-prem clusters, or shared infrastructure. Download the release tarball, point at the GHCR images,
docker compose up -d. For air-gapped sites, sideload the images withdocker loadfrom a separate bundle.
Each installer bundles the gateway, publish-service, gateway-worker, and an embedded PostgreSQL — one binary, one process, no external dependencies. Versioned releases live at downloads.controlseat.com — the website's download page picks them up automatically.
Updates
Native installers update by re-downloading the latest installer from controlseat.com/download and double-clicking — the new package replaces the binaries, runs migrations, and restarts the service. Your data directory is preserved across versions.
Docker Compose installs use the in-place updater script:
sudo /opt/controlseat/update.sh
It snapshots image digests, pulls the new release, runs migrations, and restarts the stack. If anything misbehaves, sudo /opt/controlseat/update.sh --rollback restores the previous version exactly. Volumes (database, license, TLS cert) are never touched by either path.
The Updates section in the gateway's Platform settings shows your current version and a "Check for updates" button that pings our release endpoint on demand. We don't phone home automatically.
Self-service TLS
The gateway's TLS settings page lets an admin upload a PEM cert + private key directly from the browser. The new cert hot-swaps without restart — useful when your existing cert is about to expire and you don't want to coordinate a maintenance window. HTTPS listens on :8443 alongside HTTP on :8090.
Bring your own cert or terminate TLS at a reverse proxy (nginx, Caddy, your existing edge) and point it at the gateway's :8090 port — your call. Private keys are encrypted at rest with the same vault used for datasource secrets.
License system (self-hosted only)
Self-hosted deployments now have a real license model. From the gateway's Platform → License page, click Activate online — a popup opens to controlseat.com, signs the license against your gateway's install ID + host fingerprint, and applies it to the gateway without restart and without copy-paste. For air-gapped installs, drop a license.json in the data directory before first boot.
License files are JSON signed with Ed25519. They include a customer name, install ID + host fingerprint (for hardware binding), edition, issue date, and expiry. Past expiry there's a 24-hour grace period to absorb NTP outages, then the gateway shows a renewal prompt — but the editor and configuration UI keep working so you can renew without losing access.
Cloud customers see none of this. The cloud SaaS doesn't run the license code path at all. License-related UI in the gateway only appears when CS_LICENSE_PATH is configured.
MQTT and Sparkplug B
A new push-driven datasource alongside the existing query-based ones (SQL, InfluxDB, Prometheus, HTTP, Table). Configure brokers in Gateway → Connectors → MQTT — broker URL (mqtt:// / mqtts:// / ssl:// / ws:// / wss://), credentials, optional client cert, keep-alive interval.
The tag form has a new MQTT source with three subscription modes:
- Topic per tag — explicit topic, value type (auto-infer / string / number / boolean / JSON), QoS 0 or 1, optional JSONPath for picking values out of larger payloads.
- Wildcard auto-create — point a wildcard subscription at a topic tree, and tags auto-materialize as messages arrive. Good for "I just want everything under
factory/floor1/#". - Sparkplug B — full Sparkplug B support, including:
- Node and device hierarchy — messages on
spBv1.0/<group>/NBIRTH/<edge>auto-create the metric tree under folders matching<group>/<edge>/<metric>. Device-level (<group>/<edge>/<device>/<metric>) works the same way. - Aliases and Rebirth — alias tables are tracked across reconnects; if the gateway restarts and we lose them, we send a
Rebirthcommand (Node Control) to recover. - Death cascade —
NDEATHmarks every metric under that edge as bad;DDEATHonly marks its specific device. No more silent stale values when a publisher disappears. - PropertySet metadata — Sparkplug payloads can carry per-metric metadata (unit, engineering low/high). We capture and persist it; UI surfaces (gauge units, chart engineering ranges) come next release.
- Node and device hierarchy — messages on
Tag quality preserved on disconnects
Previously, if an MQTT broker (or any source) dropped, tag values would freeze at their last-known-good number — and a chart looking at "pump RPM = 1450" couldn't tell whether the pump was actually running at 1450 or whether the broker had died ten minutes ago. Now, when a source goes offline, every tag bound to it is marked bad quality with the disconnect reason instead of being overwritten with stale data. Charts and bindings can react to that — show a warning ribbon, switch to a "stale data" color, route to a different alarm.
This is foundational for SCADA-grade reliability and applies across all push sources, not just MQTT.
OPC UA foundation
A new OPC UA Servers section in the gateway lets admins configure server connections — endpoint URL, security mode, authentication. Behind the scenes, OPC UA implements the same push-driver registry that MQTT uses, so per-tag binding will land in v0.1.5 with no UI churn.
If you've been waiting on OPC UA: configure your servers now and you'll be a few clicks away from full per-tag binding when the next release drops.
AI now sees images
The AI assistant gets image uploads — drop a screenshot, paste from clipboard, or click the attachment button to add an image to your conversation. Up to 20 MB per image, multiple images per message. Works in:
- The page editor's AI popover — for whole-page edits.
- The per-component AI Edit modal — for scoped edits on a selected component.
- The flow editor's AI popover — same in flows.
Useful for things like:
- "Make this dashboard look like the screenshot from our Excel mockup"
- "Here's a photo of the actual control panel — replicate the labels and layout"
- "Here's the alarm history we want to display — wire it up so it matches"
The model reads text from screenshots, identifies layout structure, and uses the visual context the same way it uses tag context.
Datasource consolidation
Under the hood, the four query-based source kinds (SQL, InfluxDB, Prometheus, generic Query) collapsed into a unified datasource source kind backed by a connector registry. Existing dashboards and tags keep working — same UX, same field names, no migration needed. The win: adding new query backends now takes one connector implementation instead of a whole bridge package.
Smaller things worth knowing
- Tag metadata as first-class fields —
unit,eng_low,eng_highare now real columns on tags, populated automatically from Sparkplug PropertySet metadata. The data is captured and exposed via the API now; gauges and chart axes that read these will show up in the next release. - License-aware UI — the gateway has a license context, an expiry toast, and a license urgency hook. Self-hosted customers see their license status in the topbar and on a dedicated Platform → License page; cloud users see nothing.
- Cloud license-gate fix — a small fix to the publish-service license gate ensures cloud tenants are correctly classified when no license is present.
Self-hosted? Read the on-prem deployment guide to get going. Already on cloud? Nothing's changed for you — your tenant's been auto-updated. Have a Sparkplug B network you want to wire up? Get in touch for a hands-on walkthrough.