Changelog
All notable changes to Fletr are documented here. Each section corresponds to a tagged release version. Newer versions appear first.
v0.3.1
- Fixed the server selection list (and other startup data) occasionally appearing empty right after an update. On a slow first launch the app could ask the backend for your servers before it had finished starting; that one failed request used to leave the list blank for the whole session. The app now retries the initial load until the backend is ready, so your saved servers reappear on their own without needing to restart or clear data.
- The message detail view gains a diff overview ruler: when comparing a message against the previous one on the same topic, a thin gutter beside the scrollbar marks every added (green) and removed (red) line across the whole payload, with a viewport box that tracks scrolling. Click the ruler to jump to a spot, or use the new Previous/Next change buttons (with a
2 / 5counter) to step through each change — handy for spotting what changed in longstateandordermessages.
v0.3.0
- New "Peripherals" sidebar section with an "Explorer" page, gated behind a
Peripheralstoggle in Settings → Feature Preview. Off by default; the section sits between the Historic and Testing groups when enabled. - The Explorer page now ships a live MQTT topic-discovery view. Discovery starts automatically when the page opens (and stops when you leave) — the page subscribes to all topics (
#) and renders them as an expandable tree with per-topic message counts, last-payload size, and last-seen timestamps. Topic metadata is kept only in memory on the backend and streamed to the page in 250 ms batches — payloads are never stored. - Explorer adds a Reset button that clears the tree without disconnecting; the live tree continues to populate as new topics arrive.
- The Explorer and Data Structures sidebar icons were updated for clarity (magnifying glass and rectangle-stack respectively).
- Structure Simulator (Testing → Simulation → Structure Simulator, behind the Peripherals feature preview): the right-hand Structures sidebar lists every Data Structure in your library — click a structure to add an instance with default placeholder values. Each instance can override placeholders, toggle individual topics and prepared messages on/off, and publish at a configurable per-instance interval (default 300 ms). The simulator round-robins through each topic's active prepared messages and stops automatically on broker disconnect. Configured instances and a running simulator are preserved when navigating to other pages and back; they are cleared on app restart.
- Explorer gains a right-hand Discovered Devices sidebar that groups topics into AGVs (matched against the configured topic template, with a colored bar per manufacturer and
manufacturer — serialNumberlabel) and other devices keyed by their first topic segment. - Explorer's Discovered Devices sidebar now classifies non-AGV traffic against your Data Structures instead of grouping it under a generic "Other" section: each matched structure becomes its own subheading with the discovered device rows underneath. Topics that match no AGV and no Data Structure are summarised by an
Unclassified topics: Ncounter at the bottom of the sidebar; if no Data Structures are defined yet, an inline hint links to the Data Structures page. - VDA 5050 v3.0 support: discovery, simulation, and the message pipeline now recognise both
uagv/v{version}/...(v1.x / v2.x) andvda5050/v{version}/...(v3.0, per the v3 spec §4.2) prefixes out of the box. Mixed-fleet brokers that publish under both interface names are picked up without changing the auto-discovery template. Simulated AGVs publish under the prefix that matches their declared VDA version. - New Data Structures page under Peripherals: describe your peripherals' topic families with a name, an auto-discovery path with
{namedPlaceholders}(e.g.factory/{zone}/conveyor/{deviceId}), and the list of topics that live underneath each structure. Add, edit, delete, import, and export structure definitions from the right-hand sidebar; each structure is persisted as a standalone JSON file underdata/data-structures/. Prepared actions targeted at a structure's topics are reserved for the next iteration. - Data Structures read-mode polish: the detail header now matches the edit form (sticky toolbar, larger structure name, copy-to-clipboard for the structure ID, destructive hover on Delete). Each topic shows a copy-topic-path button and a "Matches paths like…" preview now appears under any discovery path that uses
{placeholders}. Topics and prepared messages display their counts inline (Topics (3),Prepared messages (2)); each prepared-message payload exposes a copy button so the JSON can be pasted into other tools. - Peripherals are now first-class citizens in the right-hand devices sidebar across Observer, Timeline, and Alarms. Devices that match a Data Structure's discovery path appear automatically once they publish; you can also add a peripheral manually with the new Add peripheral dialog. Each peripheral row expands to show its topics and the prepared messages you've defined — clicking Send opens a dialog with the resolved topic and payload, so you can tweak the payload before publishing. Hiding a peripheral filters its messages out of Observer and Timeline. The Dashboard (AGV Overview) page intentionally keeps the sidebar AGV-only.
- The right-hand devices sidebar now shows AGVs or Peripherals one at a time. Switch panels with the new vertical icon menu pinned to the right edge of the window — AGVs is selected by default and your selection is preserved as you navigate between Observer, Timeline, and Simulation. The previous chevron-to-collapse control was replaced with an × close button in the sidebar header (clicking the active menu icon a second time closes the sidebar too); the menu strip stays visible so you can reopen either panel with one click.
- Observer and Timeline message details no longer surface a VDA version field for peripheral messages. The version is shown only when the topic matches a VDA AGV template (your configured template plus the well-known
uagv/...andvda5050/...prefixes), so peripheral topics — which share the same 5-segment shape — no longer leak an arbitrary path segment as a "VDA version". - Instant actions sent to a VDA 5050 v1.1 AGV now use the spec-required
instantActionsarray name; v2.0+ AGVs continue to receive the renamedactionsarray. - New Browse templates catalog on the Data Structures page: one-click add for M2X protocol archetypes (Load Handling Station, Transport Order, Door, Elevator, Signal Lamp, Traffic Light). LHS and Transport Order ship with the spec's full topic list and prepared messages; the other four ship with
factsheet+stateonly and are flagged as preliminary until the M2X spec defines their topics. Once added, templates behave like any other Data Structure — peripherals auto-discover when matching MQTT traffic arrives. - Peripheral messages classified by a Data Structure topic are now stored using the same snapshot+delta compaction the AGV state pipeline uses (30 s snapshots, field-level deltas). Each topic in a Data Structure has a new "Compact this topic" toggle, on by default; turn it off for topics where every raw message must be preserved (audit, debugging).
- New endpoints
GET /api/peripherals/:id/topics/:topicPath/stateand.../seriesreconstruct a peripheral's state at a chosen timestamp or over a time range from the compacted history. - Hiding a peripheral now reliably filters its messages out of every live message view (Observer timeline, Timeline route) the same way an AGV toggle does — the filter moved into the central message stream so any current or future view automatically respects the toggle.
- Structure Simulator instance rows now expose Duplicate and Delete as visible icon buttons in the instance header — they replace the previous
…overflow menu, so removing or copying an added instance is a single click. - The canvas image embedded in an exported incident bundle is now reliably fitted to the content before it's captured. Previously the screenshot could be taken before the map auto-fit ran, producing a near-empty view; the bundle's
render.pngnow always frames the AGV and the surrounding layout.
v0.2.8
- Instant actions sent to a VDA 5050 v1.1 AGV now use the spec-required
instantActionsarray name; v2.0+ AGVs continue to receive the renamedactionsarray.
v0.2.7
- Update-download progress bar in the auto-update dialog now announces itself to screen readers as a progressbar.
- Error tooltips on the timeline now stick to their bar when you scroll, instead of drifting in the viewport.
- Analytics charts now follow the app theme automatically — they read the dark/light setting straight from the store instead of relying on the parent route to thread the flag through, so they stay in sync if the theme is toggled.
- Smoother typing in the Edit & Republish dialog with large payloads — JSON validation no longer parses on every keystroke when typing is faster than React can commit.
- The "unread Observer" badge on the sidebar now appears whenever new messages arrive while a different page is open, and clears when you switch back to Observer. The route-detection fix landed in two parts: it first read the wrong piece of the URL, then read the right piece but missed router-driven navigation entirely (the in-app sidebar links navigate through an API that the previous listener didn't react to).
- New MQTT servers get their identifier from the backend instead of the client, so two simultaneously-saved servers can no longer collide on the same id.
- Faster order-path timeline updates: the per-AGV state delta tick no longer re-allocates four Maps and two Sets on every message — they're now memoized against their own inputs and only rebuilt when that input actually changes.
- Less render work for large maps: the static layout group now opts out of per-frame matrix updates and frustum-culling on its bookkeeping groups.
- Fixed: the "Add server" dialog now reliably appears on first launch when no broker is configured. A misconfigured Vite plugin was running a server-render of the page that bypassed the app provider, so the auto-open effect never fired.
- Fixed: sidebar navigation links are gray again instead of being tinted lagoon-deep green. A global anchor color rule was sitting outside Tailwind's cascade layers and overriding the per-link
text-gray-500/text-cyan-700styles regardless of class. - Active alarms no longer get duplicated when an AGV is reset and the same error is republished — the error tracker now reloads its cache from the database after a per-AGV reset instead of treating every recurring error as new.
- Importing a malformed
.fletr.zipincident bundle now surfaces a clear "not a valid zip file" message instead of a raw archive parser error. - Uploading a LIF file with malformed JSON now surfaces a friendly "Invalid LIF file: not valid JSON" error instead of the raw
SyntaxErrorfrom the JSON parser. - Discovered AGVs now expose their detected VDA version through the API so the UI can read what the auto-discovery wrote.
- Saving a custom AGV with an id that's already taken now returns a clear "Custom AGV with id X already exists" error instead of leaking a raw database constraint message.
- Importing an incident bundle whose internal data file is corrupted (not just the manifest) now fails the import with a clear error pointing at the bad file, instead of silently treating that section as empty.
- Building an incident bundle for an unknown AGV id without a
manufacturer/serialNumberseparator is now rejected with a clear error instead of producing a half-populated manifest. - MQTT order messages with the wrong shape (non-string
orderIdor non-numericorderUpdateId) are skipped in the order routing instead of producing confusing database errors mid-batch — the message itself is still saved.
v0.2.5
- Topic filter selections in the Observer and Timeline message sidebars are now remembered when navigating between pages. Each view maintains its own independent filter. Filters reset on application restart.
- Added a Reset link to the topic filter popup in the Observer and Timeline sidebars; clicking it re-enables all topics when at least one is hidden.
- AGV sidebar rows now stack serial number above manufacturer so longer names stay readable instead of being truncated on one line. The row also uses a consistent "go to details" arrow matching the dashboard.
- Toggle switches throughout the app are now more compact for a tighter, less visually heavy UI.
- Added Incident bundle export — one-click "Export incident" from the AGV Details page or the hover action on alarm rows. Bundles ship messages, alarms, orders, the active LIF map, and a canvas render as a single
.fletr.zipthat colleagues or AGV vendors can open in Fletr. - Added Incident bundle import via the new "Open Incident…" entry in the left sidebar. Imported bundles open in a read-only Incident Viewer at
/incident/:id; live data is never overwritten.
v0.2.4
- Merged Map into Recording — The Map section (Viewer and Setup) has been removed from the sidebar. Recording is now the single hub for all layout visualization, LIF file import, background images, and live AGV tracking. Stations (amber diamonds) are now visible and clickable on the recording canvas with a detail panel, and the Layers tool includes a Stations toggle.
- Removed Map Preview toggle — The "Map Preview" feature toggle in Settings → Feature Preview has been removed since Recording is now a first-class feature that replaces it.
- Import LIF files in Recording — Import existing LIF files to seed the recording with pre-defined nodes and edges. Works before or during a recording, with automatic deduplication of matching entries.
- Edit & Republish messages in Observer — Select any received message in the Observer, edit its JSON payload, and republish it on the same MQTT topic. The new edit button appears next to the copy button in the message detail view and is available when connected to a broker.
- Refined AGV sidebar design — The right-hand AGV sidebar now uses a flatter, more consistent design across all pages. Removed card borders from AGV rows, unified sidebar width, and improved visual hierarchy with a section header label and cleaner layout.
- Unified recording tool panel styling — Recording and map editor tool panels now match the flat sidebar design with consistent backgrounds, header labels, borders, and spacing.
- Analytics page — New Analytics page in the Historic section with interactive charts: Message Rate, Topic Distribution, Error Frequency, AGV Activity, and Battery Over Time.
- AGV Trips chart — New Gantt chart in Analytics showing order execution timelines per AGV, with tooltips displaying order ID, duration, and start/end times.
- Error Distribution chart — New pie chart in Analytics showing the proportion of time AGVs spent with errors, warnings, or no issues.
- Fixed system log export crash — Clicking "Export as TXT" in Settings → System Logs no longer crashes the app. The export dialog now opens reliably, including when there are no log entries in the selected range.
- Order Path: order update boundaries — Order updates are now visually separated by horizontal divider lines in the timeline, labeled with the update ID and timestamp.
- Order Path: completion timestamps — Completed nodes, edges, and actions now show the timestamp of when they were completed.
- Order Path: always-visible action summary — Action names and status icons are now always visible on each node and edge, even when collapsed. Expand for full details.
- Order Path: stale horizon cleanup — When a new order update arrives, outdated horizon nodes from previous updates are automatically removed from the timeline.
- Order Path: smoother real-time updates — The order path view no longer reloads entirely on every MQTT message. Updates are targeted to the specific AGV and only re-render changed items, eliminating visual jitter.
- Simulator: realistic order progression — The simulator now generates orders with 3 order updates spanning ~10 nodes, with proper VDA 5050 state messages sent for each node arrival and edge traversal.
v0.2.3
- Import LIF files in Recording — Import existing LIF files to seed the recording with pre-defined nodes and edges. Works before or during a recording, with automatic deduplication of matching entries.
- Edit & Republish messages in Observer — Select any received message in the Observer, edit its JSON payload, and republish it on the same MQTT topic. The new edit button appears next to the copy button in the message detail view and is available when connected to a broker.
- Refined AGV sidebar design — The right-hand AGV sidebar now uses a flatter, more consistent design across all pages. Removed card borders from AGV rows, unified sidebar width, and improved visual hierarchy with a section header label and cleaner layout.
- Unified recording tool panel styling — Recording and map editor tool panels now match the flat sidebar design with consistent backgrounds, header labels, borders, and spacing.
- Analytics page — New Analytics page in the Historic section with interactive charts: Message Rate, Topic Distribution, Error Frequency, AGV Activity, and Battery Over Time.
- AGV Trips chart — New Gantt chart in Analytics showing order execution timelines per AGV, with tooltips displaying order ID, duration, and start/end times.
- Error Distribution chart — New pie chart in Analytics showing the proportion of time AGVs spent with errors, warnings, or no issues.
v0.2.1
- Fixed "Send with Overrides" input revert — Editing parameter values in the Instant Actions "Send with Overrides" dialog no longer reverts typed input. Previously, real-time MQTT updates caused the dialog to reset fields while editing.
- Fixed recording missing initial edges — The Recording page now captures edges from both order and state messages, so the first connections are no longer missing when "Include AGV data" is disabled.
v0.1.28
- Recording always available — The Recording page is now always accessible from the sidebar without needing to enable it in Feature Preview settings. Recording sub-settings (auto-save, include AGV data) are available directly in the Recording page's Control panel.
- Recording origin tool — A new Origin tool in the Recording toolbar lets you set the coordinate origin of the recorded layout. Click the map pin icon, then click on the canvas and enter real-world coordinates to shift the layout offset. A Reset button returns the offset to zero.
- Recording background images — A new Images tool in the Recording toolbar lets you upload, position, scale, and manage background images on the recording canvas. Images are persisted to a backend map entity and survive page navigation. Includes scale measurement (click two points and enter real-world distance) and origin setting tools for precise image alignment.
- Tool switching deactivates sub-tool states — Switching between tools in both the Recording and Map Editor toolbars now automatically deactivates any active sub-tool states (e.g., origin click mode, scale measurement mode). Previously, sub-tool states persisted when switching tools, requiring manual deactivation.
- Recording save to map — Saved recordings are now also imported into the Recording map entity, co-locating the recorded layout with any background images added via the Images tool.
- Recording background layer toggle — The Layers tool in Recording now includes a Background toggle to show/hide uploaded background images.
- Recording search tool — Press Ctrl+F or click the magnifying glass icon (first button in the toolbar) to search for nodes, edges, and AGVs by name or ID. Results appear in a scrollable list with type-specific icons (cyan circle for nodes, arrow for edges, colored rectangle for AGVs). Click any result to open its detail panel.
- Recording auto-save — Recording data (nodes, edges, and AGV positions) is now automatically saved in the background and restored when you return to the Recording page. Auto-save is enabled by default and can be toggled in the Control tool panel or in Settings → Feature Preview.
- Include AGV data toggle — A new "Include AGV data" option lets you choose whether AGV positions are stored alongside nodes and edges. When disabled, only nodes and edges are saved, producing a pure LIF-compatible file. Available in both the Control tool panel and the Save tool panel.
- Version History in Settings — A new "Version History" section under Settings → Information displays the application's changelog directly inside the app. View all past release notes without leaving Fletr.
- Simulator VDA version selector — Each simulated AGV can now define its VDA 5050 protocol version (1.1, 2.0, 2.1, or 3.0). The version controls MQTT topic paths and message headers. Available topic checkboxes are filtered by version (e.g., Factsheet only appears for v2.0+, Zone Set/Responses for v3.0).
- Simulator responds to factsheet instant actions — Simulated AGVs now respond to incoming
factsheetinstant actions by publishing a complete VDA 5050 factsheet with version-appropriate default actions inprotocolFeatures.agvActions. This enables testing the Instant Actions factsheet request feature. - Simulator responds to stateRequest instant actions — Simulated AGVs now respond to
stateRequestinstant actions by immediately publishing their current state. - Instant Actions auto-detects VDA version — The Instant Actions tool now reads the VDA 5050 protocol version directly from the AGV's state/connection messages and uses it to determine default actions and factsheet support. Previously the version was only inferred from topic names or custom AGV configuration.
- AGV Danger Zone — A new "Danger Zone" tool in AGV Details lets you purge all data (messages, orders, error history) for a specific AGV while keeping its configuration, or completely delete the AGV and all associated data. Both actions require confirmation before proceeding.
- AGV detail panel on Recording map — Click any AGV marker on the Recording canvas to select it (highlighted with a cyan outline) and open an inline detail panel showing connection info, position, operating status with battery bar, and a collapsible Planned Path timeline. Click the same AGV to deselect, or click another AGV to switch.
- Recording tools flat design and dark mode — Recording tool panels (Control, Layers, Save) now follow the same flat design as the Map Editor tools. All map detail panels and toolbars also gained dark mode support.
- Smooth AGV motion on map — AGV markers on the recording and map canvas now smoothly interpolate between position updates instead of jumping. The marker shape changed from a triangle to a rectangle with a small directional arrow. Offline AGVs are shown in gray. A tooltip next to each AGV displays its serial number and current order ID.
- Fixed timeline message labels — The Timeline page now correctly displays AGV serial numbers, color-coded topic bubbles, and error/warning badges on each message in the sidebar. Previously, historic messages loaded from the database were missing these labels, making it impossible to identify which AGV a message came from.
- Clear stored data button in Settings → Database Settings — a new "Clear all data" button lets you permanently remove all messages, alarms, orders, and other operational data from the database in one click. Server configurations and settings are preserved. A confirmation dialog prevents accidental data loss, and the button shows a spinner while the operation is in progress.
- Recording node and edge details — Clicking on a node or edge in the Recording page now opens a detail sidebar showing the item's properties (ID, position, start/end nodes, vehicle type properties, actions). Uses the same detail panel as the Map feature for a consistent experience.
- Fixed order path traversal for initial orders — nodes and edges in the order path now use composite
(id, sequenceId)matching instead of ID-only matching, fixing incorrect status display when an order revisits the same node. Added a race condition guard to prevent stale API responses from overwriting newer progress data during rapid order/state message transitions. - AGV Details and Recording E2E tests and documentation screenshots — Added end-to-end Playwright tests that capture screenshots for the AGV Details General page (with order, actions, and error), AGV Details Order Path, and the Recording page (idle, active, layers, and save panels). Screenshots are integrated into the user guide documentation.
- Recording layer visibility — the Recording page now has a Layers tool in the right-hand toolbar that lets you toggle visibility of individual layers (Nodes, Edges, Labels, AGVs). Hiding unused layers improves rendering performance for large recordings.
- Order Path accumulates full path across order updates — VDA 5050 order updates (same
orderId, incrementedorderUpdateId) are now stitched together to show the complete accumulated path, including previously traversed base nodes that are no longer sent in newer update messages. Horizon (unreleased) nodes are visually distinguished with a dashed border and reduced opacity. - Simulator generates order updates — the message simulator now produces VDA 5050-compliant order updates with base/horizon splits and proper stitching node semantics, making it easier to test and demonstrate the order path feature.
- Instant Actions tool — The AGV Details Instant Actions page is now fully functional. It displays default VDA 5050 actions based on the AGV's protocol version, supports sending selected actions to the AGV, and for v2.0+ allows requesting the AGV's factsheet to discover supported actions. Custom actions can be added manually, and action sets can be imported/exported as JSON files using the VDA 5050 action schema.
- Instant Actions per-row send buttons — Each action now has its own Send and Edit & Send buttons inline. The Edit & Send button opens a dialog to temporarily override parameter values before sending, without modifying the original action definition. The UI uses flat design with no card wrappers and left accent bars for visual clarity.
- Instant Actions always available — The Instant Actions tool in AGV Details is now always visible without needing to enable it in Feature Preview settings.
- Instant Actions auto-persist — Configured instant actions are now automatically saved per AGV in a JSON file on disk, organized by server name (
data/agv-config/{serverName}/{manufacturer}_{serialNumber}.json). Actions are restored when reopening AGV Details. The config directory can be copied to another fletr instance to reuse AGV configurations. - Server name uniqueness — Server names must now be unique (case-insensitive). Attempting to add a server with the same name as an existing one will show an error. Renaming a server also renames its AGV config directory.
- Per-AGV config initialization — When the VDA version of an AGV is first detected from its messages, the AGV config file is automatically initialized with metadata (name, manufacturer, VDA version), default VDA 5050 actions for that version, and an empty routes array. Previously, config files were only created on first save.
- Instant Actions E2E tests and documentation screenshots — Added end-to-end Playwright tests covering the Instant Actions workflow: viewing default actions, creating custom actions with parameters, sending actions, and filtering with Ctrl+F search. Screenshots are integrated into the user guide.