Release Notes
What changed in each release, filtered to what matters for operators running an edge box. For how versions are reported on your device, see Versions & Updates.
1.58.4 — 2026-10-02
Section titled “1.58.4 — 2026-10-02”- The Logs page ties every line of an inference tick together. Each line shows chips for its input and output datasource, and the Tick chip opens every line of that tick, from the input read to each output write. See Monitoring.
- Opening and leaving live pages no longer floods the Logs page with connection lines.
1.58.3 — 2026-10-01
Section titled “1.58.3 — 2026-10-01”- Input tag mapping opens with one fixed row per channel. After Browse tags, Fill empty channels fills only the empty rows; check their order before you save, because browse order is not always the model’s input order.
- A partial mapping now saves and tells you how many channels are still unmapped. A flow still needs every channel mapped before it can be enabled.
1.58.2 — 2026-10-01
Section titled “1.58.2 — 2026-10-01”- Before it takes the pre-update backup, an update stops every container that writes to the database, so the backup is consistent.
- After a successful update, the box keeps the newest 3 backups
(
AIBOARD_BACKUP_KEEP,0keeps all) and the images of the current and the previous release, and removes the rest.
1.58.1 — 2026-10-01
Section titled “1.58.1 — 2026-10-01”- The sidebar uses one item style, expanded or collapsed.
1.58.0 — 2026-10-01
Section titled “1.58.0 — 2026-10-01”- The Memory card describes the whole machine, including swap, and shows the inference service against the memory limit it runs under.
- A new Storage Health card shows disk use and the database size.
- GPU memory says whether it is shared with system RAM (Jetson) or dedicated.
1.57.3 — 2026-09-30
Section titled “1.57.3 — 2026-09-30”- The sidebar collapse toggle moved into the Workspace header.
1.57.2 — 2026-09-30
Section titled “1.57.2 — 2026-09-30”- The collapsed sidebar shows square, centred items, and the account card at the foot of the sidebar is no longer clipped.
1.57.1 — 2026-09-30
Section titled “1.57.1 — 2026-09-30”- When two writers meet on the database, the second one now waits instead of dropping its batch of inference results.
1.57.0 — 2026-09-30
Section titled “1.57.0 — 2026-09-30”- The Logs page reports when the pipeline changes state and which outputs it writes, instead of a once-a-second “nothing to do” line that crowded out everything else.
1.56.0 — 2026-09-28
Section titled “1.56.0 — 2026-09-28”- The inference service’s own log lines now reach the Logs page.
1.55.0 — 2026-09-28
Section titled “1.55.0 — 2026-09-28”- The About panel reports the release installed on the box. See Versions & Updates.
- The dashboard reconnects on its own after a backend outage of any length.
- Installing over an existing box takes the same database snapshot as an update
(skip with
--no-backup), and the newcompact-db.shgives disk space back after retention has deleted rows. See Disk fills / database grows unbounded.
1.54.0 — 2026-09-23
Section titled “1.54.0 — 2026-09-23”- The running stack now lives under
/opt/aiboard, outside the bundle directory it was installed from, so deleting an old bundle no longer stops the box.
1.53.0 — 2026-09-22
Section titled “1.53.0 — 2026-09-22”- The sidebar follows the light or dark theme, and the navigation group above System has a name.
1.52.0 — 2026-09-19
Section titled “1.52.0 — 2026-09-19”- After a reboot, the box starts the same TLS setup you configured, and the pre-update backup uses an image that ships in the bundle, so it works without internet access.
- When you switch models, the previous one keeps serving until the new one is ready, and one refused payload no longer discards the whole batch.
- Config table rows can be deleted from a right-click menu, and a Modbus datasource accepts a hostname in the Host field.
1.51.0 — 2026-09-03
Section titled “1.51.0 — 2026-09-03”- Inference history is kept for 1 day by default, and request payloads for 6 hours. Retention now deletes in small steps, so it no longer blocks writes. See Disk fills / database grows unbounded.
1.50.0 — 2026-09-02
Section titled “1.50.0 — 2026-09-02”- The tag dead-band setting is removed. It was shown and saved but never applied to the data.
- The input tag offset is now applied, as documented: value = raw × scale + offset.
Maintenance release without an operator-visible change: 1.49.0 (2026-09-01) changes a GPU runtime setting on JetPack 4.5 to reduce host memory use during inference. No action needed.
1.48.0 — 2026-08-31
Section titled “1.48.0 — 2026-08-31”- The dashboard names its uptime figure and shows the backend’s uptime beside it.
1.47.0 — 2026-08-27
Section titled “1.47.0 — 2026-08-27”- Pipeline Health counts the last 5 minutes, as the page says, not everything since boot.
1.46.0 — 2026-08-27
Section titled “1.46.0 — 2026-08-27”- After the inference engine restarts, it loads the model again on its own.
- An update skips images that did not change, and the inference memory limit matches what the Jetson can provide.
1.45.0 — 2026-08-26
Section titled “1.45.0 — 2026-08-26”- You can give a model a name when you upload it.
- Install checks that the GPU can actually compute, not only that it is present.
- Error messages explain the reason instead of showing a code, and when the inference engine stops, the dashboard says why.
1.44.0 — 2026-08-25
Section titled “1.44.0 — 2026-08-25”- A failed model reload no longer leaves the box reporting Ready.
- Guidance tooltips can be reached with the keyboard.
1.43.0 — 2026-08-24
Section titled “1.43.0 — 2026-08-24”- Repeated failed logins from one computer no longer lock every operator out of the box.
- The dashboard shows Standby when no model is loaded, and the engine refuses to stream with a model it cannot serve.
- Configuration-import skip reasons are translated, and the external Alarms API
answers
501 Not Implementedinstead of returning placeholder data.
1.42.0 and earlier
Section titled “1.42.0 and earlier”The count of what an overloaded sink dropped is now on screen
Section titled “The count of what an overloaded sink dropped is now on screen”Last release let a sink that cannot keep up drop its own oldest predictions, and said every drop was counted. The count lived in the backpressure view — reachable, but not somewhere anyone looks while watching a box run.
Pipeline Health now carries it. The headline is every sink added together, so a glance answers whether anything is dropping at all; hovering breaks it down per output datasource, which answers which one. A sink that has never dropped reads as zero, and the tile turns red the moment it does not.
The number is cumulative since the backend last started, so it tells you that this happened, not whether it is happening right now. For that, watch it move across a couple of refreshes.
A sink that is behind now says so in your language
Section titled “A sink that is behind now says so in your language”An output sink falling behind and an output sink failing to write are different conditions, and until now the notification called both of them “Output write failed” — with the reason appended in English regardless of the language you run the interface in.
A backlog now has its own wording in English, Korean and Vietnamese: the sink is falling behind, this many predictions were dropped from its queue, inference is unaffected. A genuine write failure is unchanged and still shows the reason the sink itself reported, since that text comes from the broker or the device and is worth reading even untranslated.
The live chart’s tooltip shows a time again
Section titled “The live chart’s tooltip shows a time again”Hovering a point on the Real-time Monitor chart titled the tooltip with a raw timestamp number instead of a time of day. It now reads as a clock time, in whichever format your display preference is set to, matching the axis beneath it and the Latency Over Time chart.
Latency lines are drawn as curves
Section titled “Latency lines are drawn as curves”The latency percentile lines on Inference Stats are now smooth curves, matching the error-rate chart and the sparklines that already were.
The curve passes through every measured point and never rises above or falls below one, so nothing on screen is a figure that was not computed. What changes is the shape between buckets: a spike confined to a single bucket now reads as a rounded hump rather than a sharp corner. Read a single-bucket spike off the tooltip, not off how sharp the line looks.
The Real-time Monitor chart is deliberately left with straight segments. It plots raw sensor readings watched for anomalies, where a curve drawn between two samples would suggest a shape nothing measured.
An output sink that falls behind no longer slows the whole pipeline
Section titled “An output sink that falls behind no longer slows the whole pipeline”Each output sink has its own short queue — a few seconds of predictions — to absorb an ordinary hiccup. Until now, a sink that stayed behind for longer than that queue could hold made everything wait for it: inference itself slowed to whatever the slowest sink could manage, and every other sink slowed with it.
A sink that cannot keep up now drops its own oldest queued predictions to make room for newer ones. Inference keeps running at its configured cadence, and the sinks that are healthy are unaffected.
The newest reading is the one kept: a dashboard wants the current score, not one from six seconds ago.
Nothing is dropped silently. Every dropped prediction is counted per sink and readable from the backpressure view, and a sink that keeps dropping raises an alert of its own — reported as falling behind, which is deliberately distinct from a sink that is failing. A slow sink and a broken sink need different responses.
Leaving a busy chart page no longer leaves you on a blank one
Section titled “Leaving a busy chart page no longer leaves you on a blank one”Clicking away from the Real-time Monitor while it was drawing a long window of many channels could change the address bar and nothing else — the page you asked for never appeared until you reloaded.
The chart was not slow to draw so much as unwilling to let go. It redraws on a timer, and each redraw runs to completion before anything else can use the browser; the page you were navigating to needed that same moment to load its own code. Now the chart stops redrawing the instant a navigation starts and resumes once the new page is up, and a page begins loading as soon as you hover its menu entry rather than after you click it.
Nothing is lost while the chart is paused: readings keep accumulating and the first redraw afterwards shows all of them.
Sampling is configured as a period, so a slow sensor is finally expressible
Section titled “Sampling is configured as a period, so a slow sensor is finally expressible”A datasource’s cadence used to be a frequency in whole hertz, which could not describe a tank temperature read once every twenty seconds: as a whole number the rate rounds to zero. The field is now Sampling period (ms), bounded from 1 ms up to one sample every five minutes.
Existing datasources are converted on upgrade — a source set to 10 Hz becomes 100 ms and behaves exactly as before, with nothing to do by hand. The direction is inverted from the old field: a larger period means slower sampling.
Two displays that read wrongly at slow rates were fixed alongside it. Sensor cards no longer show a permanent staleness warning on a datasource that is behaving exactly as configured, because the threshold now follows the configured cadence instead of a fixed five seconds. The Real-time Monitor gains 5-, 15- and 30-minute windows, since a 60-second window holds three points at one sample per 20 seconds.
Chart lines now join the readings you actually have
Section titled “Chart lines now join the readings you actually have”Lines used to be drawn as smooth curves, which meant the shape between two readings was invented by the drawing library rather than measured. On a chart you watch for a sudden spike that is the wrong trade: a curve rounds the corners off exactly where the detail matters, and a smooth arc between two points reads as a trend when the data only says “these two readings”.
Readings are now joined with straight segments on the Real-time Monitor and the latency time series. Lines look more angular than before; nothing about the underlying data changed, only how honestly it is drawn.
Other charts — GPU/CPU history, error rate, the small summary sparklines — are unchanged.
The chart holds up on long windows and many channels
Section titled “The chart holds up on long windows and many channels”The Real-time Monitor used to build one row per sample in the selected window, so its cost grew with sampling rate and window length and had no ceiling. On a 50-channel datasource at 100 Hz, a 30-second window took roughly twice as long to prepare as the interval it had to be ready in, and a 60-second window nearly four times — the chart fell behind the data and the page felt sticky.
Charts are now drawn at the resolution the screen can actually show. The 30- and 60-second windows now cost about the same as each other, because the work follows the width of the chart rather than how fast the datasource runs.
Gaps still show as gaps — a channel with no reading in a stretch stays blank rather than being joined across, so warmup and dropped predictions remain visible.
Closed-by-default network surfaces
Section titled “Closed-by-default network surfaces”Three surfaces shipped open that an operator would reasonably assume were closed. Check these before upgrading if anything of yours depends on them.
- Swagger is no longer served on a shipped box. It used to answer at
http://<box>:5000/in every environment, anonymously, with the full internal API catalogue. It is now Development-only and mounted at/swagger; a box runningASPNETCORE_ENVIRONMENT=Productionserves no API docs at all. Use the API reference instead. - The release compose file no longer publishes port 50051 to the host. The inference gRPC service has no authentication of its own, so it is reachable only on the container network now (on the Jetson: loopback only).
- Turning the external API off now closes it.
ExternalApi:Enabled=falseused to let/api/external/v1/*through without authentication — the switch read as a kill switch and behaved as a bypass. Those routes now return 404. Internal routes are unaffected.
A box running with INFERENCE_STUB=1 also stops reporting itself healthy while
emitting fabricated predictions; the health check now says it is in stub mode.
The Sensor Monitor keeps the channels you hid
Section titled “The Sensor Monitor keeps the channels you hid”Starting a flow used to make every channel visible again, so an operator watching 4 of 100 channels got all 100 back on every start — including a restart of the flow they were already watching. Visibility now belongs to a flow: restarting the same flow keeps your choices, and only switching to a different flow resets to all-visible, because channel numbering means something different under a different tag mapping.
Steadier charts at high sampling rates
Section titled “Steadier charts at high sampling rates”The Real-time Monitor no longer redraws once per arriving sample. Chart updates
are capped at a steady cadence independent of the datasource rate, and the chart
buffer is now sized from the datasource’s actual SamplingHz instead of a fixed
100 Hz assumption — which previously truncated the selected time window on any
datasource configured above that rate.
Benchmarks report per flow
Section titled “Benchmarks report per flow”The benchmark summary groups results by flow instead of merging them, and every measurement tier records which flow produced it — including the power and microbench tiers, which previously left it blank. The summary says so explicitly when tiers disagree rather than silently picking one.
Config transfer carries the whole pipeline
Section titled “Config transfer carries the whole pipeline”An exported configuration describes connections, tag mappings and the flows over them, so moving a pipeline to another box no longer means rebuilding every flow by hand. Flows reference their datasources and model by name, so a file carries no database Ids.
Imported flows always arrive disabled; loading a file never arms a pipeline. If the target box does not have a flow’s model, that flow is skipped and named in the import report with what to upload — upload it and re-import the same file.
An import that would rewrite a datasource the enabled flow is using is
refused with disable_flow_first, naming the flow. Disable it, import, enable it
again. This includes re-importing a box’s own export, which previously worked
only because the values happened to be identical.
Also fixed: exported configurations were dropping input samplingHz and output
tagCount, so a config moved between boxes came out subtly different.
Flows replace per-datasource pairing and enabling
Section titled “Flows replace per-datasource pairing and enabling”A flow binds one input datasource, one model version and any number of output datasources. It is now the only record of which pipeline is selected: enabling a flow arms it, and at most one may be enabled at a time.
What you need to do after upgrading: nothing for an existing install — the upgrade creates a flow from your current pairing and keeps it enabled. But two things behave differently:
- Enabling moved. The Data Source page is connection management now; enable and model pairing live on the Task Manager page.
- Config import no longer carries flows. An exported configuration is connections and tag mappings; after importing onto a new box, create the flows in Task Manager. Envelopes exported before this release still import; their per-datasource enabled flag is ignored.
Removed API: POST /api/datasources/{input,output}/{id}/enable, and
POST|DELETE /api/datasources/input/{id}/active-model. Use /api/flows.
intentSource in /api/model-runtime now reports "flow" where it reported
"datasource".
See Task Manager and API Reference.
Live pipeline view (Preview Flow)
Section titled “Live pipeline view (Preview Flow)”- A new Preview Flow page visualizes the Input → Model → Output pipeline as an interactive, read-only graph, with live data-flow animation on the running inference chain. It draws every configured flow and dims the ones that are not running.
- Click any node to jump straight into its config dialog — edit mapping, test-write — from the canvas. Pairing and enabling now happen in Task Manager; the canvas links there.
See Preview Flow.
System notifications
Section titled “System notifications”- A new NotificationCenter (bell icon in the header) surfaces inference start/fault, model activation, log warnings/errors, and sink write failures as toasts and a running list.
- Inference now raises an alert when it stops for a reason you didn’t directly request — another datasource taking over, or the active datasource being edited or deleted while running.
- After a backend restart, a previously enabled input datasource automatically regains its Ready state and Start control — it does not restart inference by itself — see Monitoring.
See Notifications.
MQTT reliability hardening
Section titled “MQTT reliability hardening”- The MQTT input adapter now subscribes only to its mapped tags instead of the wildcard base topic, so unrelated broker traffic can’t starve inference.
- A mapped topic that goes quiet halts inference instead of feeding the model a frozen last value, and the adapter reconnects with backoff after a broker drop.
NaN/Infinityreadings are rejected before they reach the model, and Test Connection now reports real socket-level failures (refused, unreachable, DNS) instead of a raw exception name.
See Input Datasources and MQTT input stops or faults.
Delivery guarantees for predictions
Section titled “Delivery guarantees for predictions”- The MQTT output sink now publishes at QoS 1, so a broker-rejected write (for example, an ACL-denied topic) surfaces as a failure instead of silently reporting success.
See Output Datasources.
Datasource configuration UX
Section titled “Datasource configuration UX”- Config fields now show or hide based on what you’ve already selected — TLS fields only appear once TLS is enabled, for example — so the form only asks for what applies.
- Tag-mapping and connection errors now read as plain sentences instead of raw backend codes.
- Test Write starts from a payload template matching the datasource type, and an output with no tag mapped can no longer be enabled.
See Input Datasources and Output Datasources.
Datasource TLS certificates on the offline bundle
Section titled “Datasource TLS certificates on the offline bundle”- MQTT and OPC UA datasource TLS certificates are now supported on the offline/air-gapped installer and bundle-update path, not just local development.
2026-06 — Execution providers, CSV output & container hardening
Section titled “2026-06 — Execution providers, CSV output & container hardening”Execution-provider modes for edge hardware
Section titled “Execution-provider modes for edge hardware”- The runtime now classifies its execution provider explicitly: TensorRT, CUDA, or CPU. GPU boxes prioritize GPU acceleration by default and fall back gracefully if a GPU library is unavailable.
- A strict mode can turn a silent CPU fallback into a startup failure, so a GPU box never quietly runs on CPU.
- The dashboard now shows the active execution provider so you can confirm what your box is really using. See Monitoring.
CSV output datasource
Section titled “CSV output datasource”- A new CSV output writes prediction results to rotating CSV files, with configurable file size, rotation, and flush behavior. See Output Datasources.
Reliability & observability
Section titled “Reliability & observability”- Honest CPU temperature. When a box has no readable CPU thermal sensor, the
dashboard now shows N/A instead of a misleading
0 °C. - Disk space reclamation. The metrics database now returns freed space to the operating system after its retention sweep, and caps total rows so a traffic burst can’t fill the disk.
- Accurate runtime status. The Model Manager runtime card no longer shows a false “Desync” when idle or warming up.
Hardened containers
Section titled “Hardened containers”- All services now run as non-root users.
- The web frontend listens on an unprivileged port internally (host ports are unchanged).
v0.5 — Inference observability dashboard
Section titled “v0.5 — Inference observability dashboard”- Latency decomposition (queue / pre-process / model exec / post-process)
- Window & bucket controls for time aggregation
- Per-model latency thresholds
v0.4 — Datasource platform
Section titled “v0.4 — Datasource platform”- OPC-UA and MQTT adapters
- Rate limiting and backpressure reporting
v0.3 — Model lifecycle
Section titled “v0.3 — Model lifecycle”- Model versioning and staged promotion
v0.2 — Web dashboard
Section titled “v0.2 — Web dashboard”- Live, push-driven dashboard updates
- Role-based access control and an audit log