Changelog
All notable changes to Fletr are documented here. Each section corresponds to a tagged release version. Newer versions appear first.
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.