Skip to content

Release Notes

This page provides release notes for the Zelos App and the Zelos SDK.

26.0.6

Summary

Trace sharing is here. Save a recording to Zelos Cloud, send your team a link, and explore it together in Zelos. No more passing large trace files around. New Notebooks turn investigations into repeatable analyses you can publish through Zelos Cloud. A new Cloud library, a new Home, and a much more capable Zelos AI bring everything together.

Added

  • Share Traces with Your Team: When you are recording data in Zelos, choose Save trace → Upload, copy the link, and share it in Slack, email, or anywhere your team works. Anyone in your organization can open the link and select Open in Zelos to explore the same trace in the app. Share a trace →
  • Zelos Notebooks: Turn an investigation into a repeatable analysis by combining explanations, executable Python, and results in one document. Query live or recorded data, adjust parameters, rerun your work, and add images while keeping the reasoning, code, and results together. Get started with notebooks →
  • Publish and Share Notebooks: Publish a notebook with its results to Zelos Cloud. Set access to Only me or your organization, or create a version-pinned public link. Browse its version history in the console and open any published notebook back in the app. Publish a notebook →
  • Cloud Library: Browse your organization's uploaded traces and published notebooks from the new Cloud view. Search traces by name or tag, and notebooks by title, description, author, or tag. Open an item, inspect its details, copy its console or app link, edit tags, open it in the console, or delete a trace when permitted. Explore the Cloud view →
  • Cloud Management: The console now has complete trace and notebook libraries with search, tag filters, notebook access controls, publish history, downloads, and links back into the app. See how much cloud storage the organization is using; owners can also pause new uploads without affecting existing cloud data. Manage Zelos Cloud →
  • Home: Zelos now opens to one place to ask AI, connect to localhost, open local or cloud traces, or create a notebook. Recent workspaces show the layout, agents, and traces they contain. Pin your favorites, rename them, or remove them from the list without deleting any traces. Meet Home →
  • More Capable Zelos AI: Create and work with notebooks, search your organization's cloud library, open cloud traces and notebooks, change panel options, control playback, and ask questions about Zelos using the published documentation. Notebook changes require your approval and can be undone from the conversation. Learn what Zelos AI can do →
  • Organizations and Tags: Create or join an organization without leaving the app, accept invitations, and switch between organizations. Shared tags now organize traces, layouts, and notebooks everywhere they appear. Set up an organization →
  • Standalone Extension Actions: Extensions can now offer actions even while the extension is stopped. This makes file-based tools such as CAN log conversion available without starting a long-running extension. Action panels show what an action printed and clearly report failures or timeouts.
  • Remote Agent Settings: Open a remote agent's menu to manage its retention, storage settings, and logs, or to clear its stored data.
  • Close Other Tabs: Right-click a tab to close every other tab at once. One Undo brings the whole group back.
  • Drag and drop one or more .trz files into Zelos to open them together.
  • Report a Problem: Send a problem report with recent diagnostics directly to Zelos Support, or choose Export to save the diagnostic bundle and send it to us manually. Diagnostics settings →

Changed

  • Global Keyboard Shortcuts: Toggle the left sidebar with Cmd+\ / Ctrl+\, and open AI Chat with Cmd+L / Ctrl+L. They used to be Cmd+B and Cmd+I, which are bold and italic in the notebook editor. App shortcuts now work inside notebooks, Python cells, and app extensions; Cmd+K / Ctrl+K opens the command palette from any tab, even while typing. Keyboard shortcuts →
  • Agent Network Access: Zelos now keeps its built-in agent available only to your computer by default. If other computers need to connect to it, choose Settings → System → Network and select the address to use. Network settings →

Fixed

  • Plot markers no longer appear and disappear unpredictably. Auto judges each signal by its own density, so sparse signals keep their markers beside high-rate signals, and Always renders a lone visible sample.
  • Boolean signals now show true / false in plot tooltips and measurements instead of an empty value.
  • Zelos no longer crashes when working with hundreds of signals, and requests that are too broad now explain how to narrow them.
  • Panels now keep identically named signals from different agents or traces distinct.
  • A trace with an unsupported signal type now opens with its other signals still available.
  • When a trace cannot be opened, Zelos now shows what went wrong instead of leaving you with an empty workspace.
  • Local traces and connections keep working when Wi-Fi is unavailable.
  • When another app or agent blocks Zelos from starting, the error now identifies what is in the way and explains how to fix it.
  • A temporary connection problem no longer signs you out, and switching accounts or organizations no longer leaves data from the previous session on screen.
  • Playback and Undo shortcuts no longer affect the workspace behind an open dialog, and grid-panel resize handles are easier to grab.
  • Scaled and floating-point CAN signals now show their value-table labels instead of raw numbers, including in traces you already recorded.
  • The Explorer and Notebooks trees now remember which folders you left open. Switching to another view and back, or restarting Zelos, keeps them the way you had them.

26.0.5

Summary

This is one of our biggest updates yet: Zelos AI, redesigned sidebars, layout version history, new State and Raw panels, richer Plot readouts, and many more panel controls.

Added

  • Zelos AI: Open AI Chat with Cmd+I / Ctrl+I. Zelos understands your agents, traces, panels, time range, and cursor. It can find signals, inspect values, summarize ranges, detect crossings, and evaluate checks across live or recorded data. It can also build panels and tabs, control the workspace, and run enabled actions with confirmation. Conversations are saved for later. Zelos AI is rolling out in phases to select users first, then everyone, so it may not appear immediately after updating. Open AI Chat →
  • All-New Sidebars: Both sides now use a compact moveable app rail. Pin or reorder apps, drag them between sides, and keep your arrangement across restarts. Search works across Explorer, Data, Marketplace, and Settings — even when a sidebar is closed — while All apps holds unpinned and overflowed apps. Learn more →
  • Layout Version History: Every content-changing save records who saved it and what changed. Name important versions to keep them permanently, or safely restore an earlier version as a new entry without losing your current state. Existing layouts begin recording on their next save. Learn more →
  • State Panel: See discrete values as colored spans over time. Hover for value and duration, or highlight the same interval across Plot panels and the timeline. Fast transitions turn neutral until you zoom in instead of showing a misleading state. Learn more →
  • Raw Panel: Inspect events exactly as recorded. Search or filter rows, follow live data, sync with the timeline cursor, copy JSON, and export CSV or JSON. Byte fields render as hex, with alternate formats for numeric columns. Learn more →
  • Plot Legend Readouts: Show paused-cursor or live values in signal chips. Side legends use a dedicated value column, while measurement mode adds Δt and each signal's delta. Learn more →
  • Panel Controls and Defaults: Configure Plot interpolation, markers, line styles, area fill, Y-axis lanes, alignment, and axis visibility. Set defaults for every new panel type under Settings → Panels, with independent reset controls. Plot options → Panel defaults →

Changed

  • Settings Redesign: New sidebar navigation and search make settings easier to find. Search names, descriptions, or terms such as "fps" and "telemetry," then jump directly to the highlighted control. Learn more →
  • Stacked Plot Alignment: Y-axis gutters and side-legend widths now synchronize so plots, cursors, and legend values line up vertically.
  • Recording Gaps: Plot lines now break across missing data instead of drawing an invented connection.

Fixed

  • String and dictionary-backed signals now plot correctly in trace mode.
  • Panel editing and saved layouts resolve agents, trace producers, overlapping segments, and colors more reliably.
  • Actions no longer fall back silently to localhost when their target agent is unavailable.
  • Extension and Marketplace state stays in sync, and embedded apps no longer interfere with dragging or the host cursor.
  • Saved traces release their readers when closed, allowing reliable reopen.
  • Drag-and-drop, menus, and dialogs no longer use stale targets or leave pointer input disabled.
  • Plot markers, measurement deltas, resize handles, and light/dark chrome received additional readability fixes.

26.0.4

Summary

This release introduces App Extensions, a new extension surface for building rich, custom workflows directly inside the Zelos desktop app. Extensions can now provide full APP tabs for dashboards and purpose-built tools, alongside major improvements to workspace history, panel display controls, layout editing, search, and large-workspace performance.

Added

  • App Extensions: Installable extensions can now add full workflow UIs to Zelos, not just signals and actions. App extensions open in dedicated APP tabs and can be launched from the app rail, making room for workflows like custom dashboards and extension-specific tools. Learn more →
  • Developers can create their own app extensions with the new app-extension templates and SDK. Build an app extension →
  • Workspace History: Undo and redo workspace changes with Cmd+Z / Ctrl+Z and Cmd+Shift+Z / Ctrl+Shift+Z. The command palette shows the next undo/redo action when history is available. Learn more →
  • Display Format Menu: Right-click panel chips, table cells, or value cells to copy values, copy signal paths, or show values as default, hex, binary, octal, or scientific notation. Learn more →
  • Multi-Signal Value Panels: Value panels can now show multiple signals in a compact grid, with configurable column count. Learn more →
  • Plot Legend Placement: Plot legends can be placed at the bottom, left, or right of the chart, with a resize handle for tuning the space between legend and plot. Learn more →
  • Signal Units: Signal units now appear alongside values across panels, tooltips, chips, and measurement results.
  • Action Panel Controls: Action panels now support Enter-to-execute, inline execute buttons, configurable request timeouts, and clearer execution states. Learn more →
  • Analytics Opt-Out: Settings now include a toggle for sharing anonymous usage analytics. Learn more →

Changed

  • Workspace Naming: Default workspaces are now named "Workspace" instead of "Untitled", and empty workspaces no longer clutter Recents.
  • Live Cursor Behavior: When pausing, scrubbing, or zooming live data, the cursor stays anchored to the right edge of the visible window so paused live inspection matches live-follow behavior.
  • Layout Drag and Drop: Panel creation and rearranging now have clearer merge-vs-insert previews, ghost placeholders, edge auto-scroll, and cross-tab panel moves. Learn more →
  • Plot Line Style: New plot panels default to linear lines instead of stepped lines. Existing panel overrides are preserved.
  • Table Signal Names: Table panels now default to short signal names, with the full-name toggle still available per panel.
  • Sidebar Search: Signal tree sources expand by default, search jumps to the first match, clearing search restores prior expansion state, and manually closed branches stay closed.
  • Natural Sorting: Numbered names now sort naturally across lists, so signal_2 appears before signal_10.

Fixed

  • Layouts no longer accidentally lock dragged signals to a specific trace or agent, so reusable layouts work more reliably across similar traces and live connections.
  • Plot colors now stay stable when signals update, table panels re-render, or segment-scoped signals are displayed.
  • Large numeric values render correctly on plot Y-axis tick labels.
  • Recorded live data is now flushed more reliably on shutdown.
  • Missing action status is no longer treated as a passing result.
  • Linux auto-update is restored with clearer installation errors and timeouts.
  • Login and loading screens have improved light-mode icon contrast, a clearer "Login with code" button, and fewer title-bar glitches.
  • Large workspaces with tens of thousands of signals are faster and more stable, especially in the signal tree and multi-signal drag-and-drop flows.
  • Table column width, order, and pinning now persist across sessions.

26.0.2

Summary

This release adds a Command Palette for instant access to any action in the app, along with trace re-export, multi-file open, and automatic segment expansion. It also includes a redesigned plot tooltip, improved measurement tool, and various panel sizing and UI refinements.

Added

  • Command Palette: Open with Cmd+K / Ctrl+K to quickly search and run any action across the app — playback controls, workspace management, layouts, settings, extensions, and more. Includes keyboard shortcut hints and fuzzy search. Learn more →
  • Trace Re-Export: Export opened trace files to a new .trz file. Supports time-range selection and merging multiple open traces into a single output.
  • Segment Auto-Expansion: Overlapping data segments for the same signal now automatically expand into distinct series in plots, tables, and value panels — similar to scoped signals. Non-overlapping segments remain merged.
  • Multiple File Selection: The open file dialog now supports selecting and opening multiple .trz files at once.

Changed

  • Plot Tooltip Redesign: Compact, data-dense layout with monospace numeric alignment and better readability.
  • Measurement Tool: Updated design to match the new tooltip style. Cursors can now snap to any data point and move freely with automatic swap behavior.
  • Plot Panel at Small Sizes: Adaptive Y-axis tick labels that scale to available panel height. X-axis ticks adjust based on plot width.
  • Signal Chips Area: Cleaner expand/collapse with fixed row heights and a compact chevron toggle.
  • Panel Minimum Size: Increased minimum panel width and height to prevent unusable sizing.
  • Extensions UI: Clearer status messaging and disabled buttons when not connected to an agent.

Fixed

  • Cursor not following navigation (pan, zoom, scroll) while paused
  • Incorrect file name display on Windows due to backslash path separators

26.0.1

Summary

This release introduces a brand-new timeline and playback experience for live and trace workflows. You can now navigate with a shared cursor across any panel, compare traces more easily with ABS/REL modes, and inspect data faster in any workflow.

Added

  • All-new Timeline UI: A redesigned timeline with transport controls, zoom controls, fit-all, view presets, and more - all in one place. Learn more →
    • Supports collapsed and expanded views
    • Expanded mode includes source segment lanes with rich hover details
  • Shared Cursor Across Panels: Timeline, plot, log, table, and value panels now work from one shared cursor for synchronized inspection.
  • Plot Cursor Controls:
    • Right-click in plot to jump the global timeline cursor
    • Drag the plot cursor handle in paused mode to scrub precisely
  • Log Cursor Controls:
    • Right-click any log row to jump timeline cursor to that log timestamp
    • Use Jump to cursor to re-center log view while following cursor context
  • Live and Playback Modes:
    • Clear Live state indicator
    • One-click return to live follow (plus Esc shortcut)
    • Timeline playback/step controls for trace and paused live analysis
  • Multi-Trace Time Alignment (ABS/REL):
    • REL mode aligns traces at t=0 for side-by-side run comparison
    • ABS mode preserves wall-clock timestamps for real-world event correlation
  • Expanded Timeline Shortcuts: Keyboard support for play/pause, stepping, zoom, fit-all, and jump-to-live.
  • Tab Bar Menu: New tab bar menu that mimics your browser. Keyboard shortcuts included.

Changed

  • Tooltips: Displays left closest shared x timestamp and closest value to the hover position
  • Contrast: Improved visibility between dark/light modes
  • Export data: Export larger data sets from panels into CSV and JSON with proper feedback

Fixed

  • Workspace migration issues in recents list
  • Action config reset when changing the chip
  • Lots of a little bugs and UI/UX consistency improvements throughout!

26.0.0

Summary

This release introduces multi-trace and multi-agent support. You can now open multiple trace files simultaneously, connect to multiple live agents, and compare data across them in the same panels.

Added

  • Multi-Trace Support: Open and compare multiple trace files in a single workspace. Learn more →
    • View signals from different traces side-by-side
    • Signal paths show trace and agent context (e.g., flight_test_001:agent::motor/status.rpm)
  • Multi-Agent Support: Connect to multiple live agents and view their data together.
    • Monitor signals from different agents in the same panels
    • Signal tree organized by Agent → Source → Message → Signal
  • Right Sidebar:
    • Pin frequently used layouts, connections, and traces for one-click access
    • Sections for pinned and recently used items
    • Status indicators show items states
  • Color Palette: New expanded color palette.
    • Colors are visually distinct even for colorblind users
    • Click any signal chip to customize its color
  • Panel Descriptions: Add notes to panels.
    • Descriptions are saved with layouts
  • Panel Data Builder: New workflow for configuring panel signals/actions. Learn more →
    • Autocomplete signal paths as you type
    • Scope signals to specific traces or agents
    • Copy and paste signal configurations between panels
  • Cross-Tab Panel Movement: Drag panels between tabs to reorganize your workspace. Learn more →

Changed

  • Table Panel: Faster performance with large datasets, filter/search state persists across sessions
  • Plot Panel: Scrollable signal list (shows 2 rows by default, expandable)
  • Panel Chips: Better drag and drop support for all signals/action with visual dropzone indications

Fixed

  • Inconsistent app zoom handling across all platforms
  • App lockup when configuring an extension
  • Improved cache strategy
  • Lots of a little bugs and UI/UX consistency improvements throughout!

25.0.22

Summary

This release introduces a major redesign of the application with a new Extension Marketplace, improved navigation with redesigned sidebars, and enhanced plot panel capabilities. Key highlights include the ability to browse and install extensions directly from the app, multi-select signals for easier plot creation, and improved user feedback throughout. The layout has been completely reimagined with dedicated sections for connections and layouts, making it easier to manage your workspace.

Added

  • Extension Marketplace: Browse, install, and manage extensions with one click. Read more.
    • Install community-built protocols, integrations, and tools directly from the app
    • Start, stop, restart, and uninstall extensions from the extensions section
    • Detailed extension pages showing readme, changelog, and version history
    • Quickly and easily configure extensions directly in the app
    • Works with both local and remote agents
  • Redesigned Application Layout:
    • New left sidebar for signals, actions, and installed extensions
    • New right sidebar for managing connections and layouts
    • Sidebars can be collapsed for unobtrusive visualization dashboards
    • App rail for quick navigation between home, workspaces, marketplace, and settings
    • Custom title bar that works across Windows, macOS, and Linux
    • Three distinct tab types with icons: Layout tabs, Extension tabs, and Settings tabs
  • Connections & Layouts Sections:
    • Dedicated connections section in right sidebar for managing agent connections
    • Dedicated layouts section for creating, saving, and managing layouts
    • Share personal layouts with your team
    • Rename layouts directly from the layouts section
    • Improved layout save/save-as workflow with dialogs
  • Plot Panel Improvements:
    • Choose line rendering style: stepped (default), linear, or smooth spline
    • Fill area under plot lines with configurable transparency
    • Add custom Y-axis labels to your plots
    • Navigate zoom history with backward button or double-click
    • Configure plot options globally in settings or per-panel
    • All plot settings save with your layouts
  • Signal & Action Tree Enhancements:
    • Multi-select signals and drag them all at once to your plots
    • Multi-select works seamlessly with search
    • Trees automatically expand for easier navigation
    • Hover over signals to see their data type
    • Expand/collapse state persists when switching tabs
  • Improved User Feedback:
    • Better error messages throughout the app
    • More informative feedback when operations succeed or fail
    • Loading states and progress indicators throughout
  • Settings Improvements:
    • Reorganized settings pages with better grouping
    • Memory limit controls now show units (MB, GB) with dropdown selector
    • Update notifications show available version information

Changed

  • Table expand/collapse state now persists when changing tabs
  • More consistent styling and feedback throughout all user interactions
  • Improved memory management for better stability
  • Finer control of panel sizing and placement

Fixed

  • Fixed scroll behavior in sidebars and resizable panels
  • Fixed font sizing in log and value panels
  • Fixed play/pause button position when zooming in plots
  • Fixed plot highlighting in light mode (now more visible)
  • Fixed various Windows-specific issues with file paths and dialogs
  • Many additional bug fixes, stability improvements, and UI polish throughout the app

25.0.21

Added

  • Memory limit controls for limiting the memory footprint of the Zelos App to a particular value
    • Navigate to Settings -> General -> Memory Limit to enforce a particular limit
    • Default limit = 25% of total system memory
    • Clear memory limit setting to set value to None/Unlimited
  • Plot panel configurable Y axis settings

Changed

  • Memory management to facilitate limit-based pruning by removing oldest data

Fixed

  • Hourly heap memory trimming to release heap space back to OS

25.0.20

Added

  • Added "Release Notes" to the app so you can stay up to date on all the latest changes!

Changed

  • Renamed zelos-server process to zelos-app-agent

Fixed

  • Improved agent shutdown behavior when closing the app across all platforms
  • Improved client and agent reconnection handling
  • Fixed flickering tooltip

25.0.19

Added

  • Connect Shortcut: Double-click a device in the connection list to quickly establish a connection.
  • Remote Actions: Execute Actions on remote agents.

Changed

  • Actions UI: The Actions sidebar is now automatically hidden when viewing a trace file.
  • Performance: Improved performance for actions by reusing a single client instance.

Fixed

  • Resolved an issue where Action panels had a generic title if no action was selected.
  • Fixed a bug that prevented using "double-click to go live" when viewing a trace.
  • Fixed an issue with the workspace timeline when switching between trace and live modes.

25.0.18

Changed

  • Actions UI: Actions are now organized in a nested tree structure, similar to signals, for easier navigation.
  • Value Panels: Value panels will now automatically use the signal name as the title by default.

Fixed

  • Removed redundant labels from toggle widgets in the Actions panel.

25.0.17

Added

  • Actions: Introducing Actions, a powerful new way to script and automate interactions with your devices and services directly from the Zelos app.
    • A dedicated sidebar pane for browsing and managing your Actions.
    • Support for a variety of input widgets to create rich, interactive Action panels.

25.0.16

Fixed

  • X Axis Labels: Resolved issue where X axis labels were displaying incorrect values.

25.0.15

Added

  • Plot Measurement Tool: Measure Δx and Δt between two points in any plot with a new overlay. See more here.

25.0.14

Added

  • Log Panels: Visualize live log streams in dedicated panel. See more here.
  • Log TXT Export: Download raw log data directly from any Log panel.
  • Font Size Picker: Quickly adjust log font size for better readability.
  • Persistent Filters & Search: Filters and search terms are now saved with your layout, so they persist across sessions.
  • Signal Chips: Interactive chips beneath each plot for per-signal series control. See more here.
  • One-click show/hide toggle
  • Inline color picker with preset & custom colors
  • Drag chips between panels to reorganize signals

Fixed

  • Improved Query Performance: Queries are now 10-1000× faster.
  • Value Truncation: Axis and tooltip values are no longer truncated.
  • Timeline: Resolved timeline zoom quirks.

25.0.13

Added

  • Log in with Code: Added support for signing into the app via code.

25.0.12

Fixed

  • Query Performance: Resolved issues with query performance in live mode.

25.0.11

Fixed

  • Duplicate Time Values in Export: Merged duplicate time values in the exported csv.

25.0.9

Added

  • Plot Search: All new signal tree with significant performance improvements
    • Added glob pattern searching with highlighting for matches
    • Added new controls to plot pane for expanding/collapsing all data
    • Added ctrl+f to quickly search across sources, events, fields

Fixed

  • Panel Exports: Fixed a bug where you couldn't export panel data from trace
  • Color Picker: Fixed a bug where the color picker would not work properly

25.0.8

Fixed

  • Fixed a bug with displaying value tables in the UI

25.0.7

Added

  • Remote Connections:
    • Connect and capture data from either a local or remote app
    • Data is stored in your local app in addition to the remote app
  • Panel Exports: Exports all signal data from a panel within the timeline range into CSV/JSON format. Read more.
  • Panel Titles: Titles appear at the top of a panel and saved as apart of the overall layout. Set and edit these directly in the panel editor.

Changed

  • Connect/Open: Open file and connect live buttons have been moved from the top to the plot sidebar
  • Layouts:
    • Better searching across name, user, dates, etc.
    • Continue loading layouts as you scroll the dropdown

25.0.6

Fixed

  • Export With No Fields: Fixed a bug that prevented exporting trace events when no fields were present.
  • Export Error Handling: The export process will continue with remaining trace events, rather than stop at the first error.

25.0.5

Changed

  • Double-Clicking: On Plot panels, the first double-click will return to your initial pause point, and the second will resume live mode
  • Timeline Reset Button: When zoomed or panned on a plot, a reset icon will appear to return back to your initial view

25.0.4

Fixed

  • Crash Reporting On Native Errors: Improved crash reporting to capture native process crashes.
  • Plotting Non-Numeric Signals: Fixed issue where plotting non-numeric signals resulted in no data displayed.
  • Signal Pane Flickering: The signal pane no longer flickers when not attached to a live connection or trace.
  • Log Spam With Expired Refresh Tokens: We no longer attempt to retry logins once the refresh token has expired.

25.0.2

Fixed

  • Log spam resulting in full disk: Improved log filtering to decrease log disk utilization.

25.0.1

Fixed

  • Exporting Data with NaN values: Resolved an issue where NaN values were not processed correctly when exporting data.

25.0.0

Changed

  • Improved Table Panel: All new redesign and implementation for the table panel. Read more.
  • Easily filter, sort, and view multiple events/fields in a tabular view
  • Built in column searching that works across events, field names and values
  • Quickly copy data to your clipboard as JSON
  • Default Data Retention: 8 hours is now the default data retention period.

Fixed

  • Memory Leak in Live Mode: The app should no longer cause an out-of-memory condition when running in live mode.
  • Auto-restart UI on Crash: The UI will automatically restart if it crashes (white screen).

24.1.11

Added

  • Timeline: An interactive timeline bar with finely tuned controls. Read more.
  • Drag left and right markers to adjust the start and end times of your time window
  • Click and drag the highlighted area to move the entire time window along the timeline range
  • New pulsating live data indicator shows when live data is being streamed
  • Play/Pause live data with a single click, and use Left/Right arrow buttons to navigate the time window
  • Timeline Shortcuts: Added shortcuts for controlling the timeline
  • Left/Right Arrow Keys: Move the time window left or right
  • Spacebar: Play or pause live data in live mode

Changed

  • Tooltips: Improved tooltip behavior for better usability and responsiveness
  • Station Configs: Renamed "Trace Config" to "Station Config" for improved clarity and consistency

Fixed

  • Tabs:
  • Enhanced light/dark mode support for tabs
  • Active tab is always visible in the tab bar
  • Fixed maximum character limit for tab names to prevent truncation

24.1.10

Added

  • Tab Reordering: Tabs can now be dragged to reorder them
  • Tab Shortcuts: Added shortcuts (with associated macOS command variants)
    • ctrl-t new tab
    • ctrl-w close tab
    • ctrl-[1-9] switch to tab
    • ctrl-shift-[ previous tab
    • ctrl-shift-] next tab
    • alt-left-arrow previous tab
    • alt-right-arrow next tab

24.1.9

Fixed

  • Time Axis Labels: Axis labels always indicate the full timestamp

0.0.11

The read side of the SDK — everything you do after the data is recorded — is now one surface. connect() returns a handle that browses the catalog, queries live and recorded data, computes on unit-carrying series, charts, checks invariants, and re-opens .trz files, with one glob grammar and one time grammar across every call. It is the surface Zelos Notebooks run on.

Everything you already wrote keeps working: every old spelling is kept as a deprecated alias that warns once. The behavior changes below are the exceptions, and each one replaces a result that was quietly wrong.

Added

  • connect() — one entry point for a running agent. It verifies the connection before returning, reads ZELOS_AGENT_URL when given no argument, and works as a context manager. Read more.
  • SignalFrameagent.query(paths, start=…) returns a frame that is one row per distinct timestamp, one column per signal, and null wherever a signal had no sample. ffill(), dropna(), between(), resample(), head(), rename(), short_names() and describe() operate on it directly. Read more.
  • SignalSeries carries its unit through arithmetic. voltage * current arrives as W, .integrate() over time gives J, and power / current cancels back to V. Adding mismatched units raises instead of lying, and reductions return a NamedScalar that prints 3.629 V.
  • plot() on a frame or a series emits Vega-Lite. It renders inline in the app, offline in an exported HTML page, and in any Jupyter viewer — with nothing added to dependencies.
  • One glob grammar. * and ? expand against the catalog everywhere a path is accepted: match(), query(), latest(), at(), window() and export().
  • One time grammar. The sign tells a time from a duration: "-30s" is a point on the clock, "30s" is a length. ISO 8601 strings, datetime and timedelta are accepted wherever they fit.
  • agent.check.that(lhs, op, rhs) reports a verdict instead of raising, so a suite always runs to completion. Every result carries its evidence — the first violating sample on a failure, the closest approach on a pass — with a timestamp. agent.check.count() measures without judging. Read more.
  • CheckResults.raise_if_failed() raises AssertionError listing every check that did not pass, each with its predicate, window and evidence. For a single check, assert agent.check.that(...) — a result is truthy when it passed.
  • agent.window() returns a ReplayWindow — the opening snapshot plus one entry per change — for states and events, where a query would return thousands of rows repeating one string.
  • agent.watch() streams live values on an interval, with a deadline.
  • agent.export() saves a window to a .trz file, and .open() re-reads it with the same calls you used against the agent.
  • Everything renders itself. Agent, SignalCatalog, SignalFrame, SignalSeries, Snapshot, ReplayWindow, Trace and CheckResult all print a useful summary and render as a rich table in a notebook. to_pandas() is for handing data to pandas, not for looking at it.

Changed

  • A multi-signal frame is one row per timestamp, not one row per message table. Cells are null where a signal had no sample; nothing is interpolated on the way in.
  • A bare int passed where a time belongs raises below 1015 instead of being read as an epoch in nanoseconds. A number that small is nearly always seconds by mistake — write "-30s".
  • A naive datetime is accepted and read as UTC instead of being rejected.
  • Wildcards in query() expand against the query window rather than a fixed 60-second catalog, so a glob over a long window matches what the window actually contains.
  • latest() takes a wildcard. agent.latest("bus0/BMS_message/cells.*") returns a Snapshot of every match; one literal path still returns a single LatestValue.
  • Trace.latest() / Trace.at() and the TraceSet pair return the live shapes — a LatestValue for one literal path, a Snapshot otherwise — and ReplayWindow.snapshot is a Snapshot rather than a list.
  • TraceSet.query() on offset bounds puts the runs on one grid. Every sample is numbered by how many sample periods into its own run it sits, and the runs join on that number at the coarsest run's rate, so two runs recorded at different sub-second phases share rows instead of leaving each other's columns null. Only the edge of the window can leave a row unshared, when it holds one more sample of one run than of the other. to_pandas() on such a frame indexes by offset, not by a 1970 date.
  • Trace.signals() and TraceSet.signals() come back sorted by path, and so do the columns of a Trace.query() frame.
  • Relative times on a file anchor to the file's own span rather than to wall-clock now.
  • where() masks out values as nulls instead of NaN.
  • Mixing a series with a pandas or numpy object raises instead of silently producing garbage. Convert explicitly with to_pandas().
  • count() returns a CheckResult whose .count is None on error, instead of 0 — a failed measurement no longer reads as a real zero.
  • A literal-vs-literal type mismatch in a check raises when the check is built, instead of producing an error row at evaluation.
  • to_pandas() returns a timezone-aware UTC DatetimeIndex. Pass index=False for time as an ordinary column.
  • producers= on query(), latest(), at() and window() defaults to every connected producer instead of localhost only. On check.that() / check.count() it stays the local store; a check reports one verdict per target.
  • A trace duration check (temporal="for_duration" / "within_duration") anchors at the end of the recording — its last N seconds — instead of the start.
  • trace.check accepts lookback= for signature parity with agent.check and ignores it.
  • Trace checks no longer emit zelos.check.result.v1 events.
  • std() uses ddof=1 — the sample standard deviation, matching pandas.
  • median() is exact instead of approximate.
  • An enum value compares equal to its wire string: DataType.Int32 == "int32".
  • A derived series names itself. voltage * current is voltage × current, and ÷, +, follow; a chart legend never reads null.
  • A NamedScalar prints as a measurement: four significant digits and the unit (3.629 V), with f"{peak:.2f}" keeping the unit too. float(peak) is still the exact value.
  • ExportResult and TraceSet.series() render themselves — one row per producer, one column per run.
  • from zelos_sdk import * binds the agent TimeRange.
  • Every repr shares one time and number format — UTC to the millisecond, four significant digits, the unit after the value — and a check result renders as a checkerboard row: when it happened, the rule with the measured value in it, the window, the verdict.
  • window(duration=…) with a plain number means seconds, not nanoseconds.
  • TraceSet.time_range is a TimeRange.
  • watch() yields a Snapshot — a Mapping that renders itself — instead of a plain dict.
  • A cell that raises AssertionError fails the notebook run (exit code 1); any other exception errors it.
  • --param names must be ASCII Python identifiers — no keywords and no dunders — so a parameter is always usable as params.<name> in a cell. A bad name is refused before the run starts.
  • Notebook front matter no longer gains an empty dependencies: list when the notebook declares none.
  • Core dependencies shrank to jsonschema and pyarrow. pytest, rich and colorama are no longer installed by default; pip install "zelos-sdk[test]" restores pytest and rich, and [notebook] adds the analysis stack (pandas, numpy).

Deprecated

Each of these still works and raises one DeprecationWarning naming its replacement. Nothing is removed.

Old New
Agent.connect() zelos_sdk.connect(target, timeout=…)
Agent.health_check() Agent.health()
Agent.resolve_paths() agent.signals().match(pattern)
SignalCatalog.by_path(path) catalog[path]
SignalCatalog.to_list() list(catalog)
SignalSeries.derive() SignalSeries.from_arrow(values, name=…, unit=…)
SignalSeries.get() SignalSeries.to_pandas()
SignalSeries.time_arrow() the SignalSeries.time attribute
sort_order= sort="asc" / sort="desc"
relative_start= / relative_end= start="+30s" / end="+30s"
time_mode= nothing — the bounds pick the axis
export(paths=…) export(signals=…)
lookback= on query() nothing — wildcards resolve against the query window

Kept without a warning: the [analysis] extra is an alias of [notebook]; TraceSet.traces and TraceSet.max_duration remain as properties beside the new TraceSet.time_range; and every alphabetic and natural-language operator spelling (gt, is greater than, is not equal to, in, …) still parses to the same canonical operator as its symbol.

Fixed

  • integrate() and derivative() refuse a series with nulls instead of guessing across a gap, and name ffill() / dropna() as the fix.

Upgrade notes

Three one-line fixes cover almost every migration:

# 1. to_pandas() already indexes by time.
frame.to_pandas().set_index("time")   # before
frame.to_pandas()                     # after — or to_pandas(index=False) to keep the column

# 2. Look a signal up by path with an index.
catalog.by_path("bus0/BMS_message/status.pack_current")   # before
catalog["bus0/BMS_message/status.pack_current"]           # after

# 3. A relative time is a signed string, not a number.
agent.query(paths, start=-30)      # before
agent.query(paths, start="-30s")   # after

If you combine columns from different messages, add .ffill().dropna() — a frame is joined on time and sparse by construction, and integrate() / derivative() refuse a series with nulls rather than guessing across a gap.

0.0.10

Added

  • Agent SDK (zelos_sdk.agent): Connect to a running Zelos Agent from Python and query live or recorded data through one handle — browse the signal catalog, query and downsample time-series into Arrow/pandas, read latest values, watch for live updates, run actions, manage extensions, and open .trz trace files. Read more.
  • Layout version history: agent.layouts CRUD (list/show/create/update/delete) plus full version history — list a layout's versions, restore a previous version, or label one. Read more.
  • Typed Check API: agent.check.that(lhs, op, rhs) asserts a predicate against a live signal or .trz trace, with temporal quantifiers such as always/eventually evaluated server-side; agent.check.suite(...) runs a JSON suite of checks in one round-trip. Read more.
  • zelos_sdk.schemas.Log — a predefined schema for typed log events (zelos.log.v1); pass a schema class directly to add_event(name, schema) instead of a field list. Read more.
  • TraceSource.log_batch() — log a pyarrow.RecordBatch or Table directly for zero-copy, high-throughput ingestion.
  • TraceSource.log_many() — log a list of (time_ns, event_name, data) tuples in a single call, cutting Python↔Rust overhead for high-frequency sources like CAN decoders.
  • TraceSource(name, strict=True) — opt into strict type coercion; rejects lossy float→int narrowing instead of silently truncating it.
  • TraceNamespace.drain() — flush every source and block until all queued events reach subscribers, for deterministic teardown ahead of closing a TraceWriter.

Changed

  • Action execution now returns a typed ActionExecuteResult (value + status) with PASS/FAIL/ERROR/DONE states instead of a bare value; the old ActionResult/ExecuteStatus names remain as deprecated aliases.
  • Action JSON Schema and UI Schema property order now matches @action declaration order end-to-end instead of being alphabetized, so generated forms render fields in the order they were declared.

Fixed

  • SignalFrame now resolves columns correctly when the same signal name appears across multiple producers or segments, raising AmbiguousSignal on a genuine tie instead of matching the wrong column.
  • TraceReader no longer drops a trace's last row when its timestamp has sub-microsecond precision.
  • TraceWriter now captures every event logged before its with block exits, without needing a sleep before close to avoid losing in-flight data.
  • TraceSourceCache now stores a Python None as a null value instead of raising an error.

0.0.9

Added

  • FolderPickerWidget for Actions, enabling folder selection in extension UIs
  • pyarrow as a direct dependency — no longer needs to be installed separately for TraceReader

Fixed

  • NaN and Infinity float values are now properly stored as null and read back as None instead of causing serialization errors

0.0.8

Added

  • TraceReader API: Read .trz trace files for offline analysis, debugging, and post-processing. Read more.
    • Query specific signals and time ranges from trace files
    • Discover available fields hierarchically (sources → events → fields)
    • List data segments and metadata
    • Full PyArrow integration for efficient data processing
  • Trace File Utilities:
    • Hook to open existing trace files (useful for merging WAL and TRZ after ungraceful exit)

0.0.7

Added

  • Added value-table support to TraceSourceCacheLast
  • Additional widgets and validation hooks for Actions

Fixed

  • Addressed lingering lint warnings across pytest helpers and ensured artifact directories are configurable in automated runs.

0.0.6

Added

  • Action decorators now capture a field_type, enabling richer, type-aware rendering in the Zelos App without custom widgets.
  • Action parameters default to required=True, surfacing missing inputs during validation instead of at execution time.

Improved

  • Updated examples and tests to exercise the stricter defaults so extension authors can adopt the new metadata with confidence.

0.0.5

Added

  • Zelos Actions: A powerful new way to script interactions with your devices and services.
    • Define actions with simple Python functions and decorators.
    • Automatic discovery and registration of actions.
    • Support for various field types for action inputs, including object.
    • Note: Only available in the python release of the SDK

Changed

  • Dependencies: Removed the setuptools dependency.

Fixed

  • Zelos Trace:
    • Resolved a deadlock that could occur in async contexts.
    • Fixed an issue that could prevent querying data if a TraceSegmentStart message was missed.
    • Fixed URL handling in the TracePublishClient.