Breaking Changes
- Python 3.10 or newer is required. Python 3.9 reached end of life in October 2025.
pip install dolphieon 3.9 now resolves to 6.15.0.
New Features
- Start with filters applied: A new
--filtersflag, thefiltersconfig option, and afiltersfield in credential profiles apply thread filters at startup in the formatname=value, for example--filters user=!azure_superuser,time=5. Supportsuser,host,db,hostgroup,time, andquery(#124, thanks @ben-morin). - Negated filters: Prefix a filter value with
!to exclude what it matches, in the filter modal (f) and in--filters. The modal now shows the filters currently in effect (#124). - Graph dashboard rebuilt: Graphs come from one validated registry with explicit layouts, availability rules, and per-graph renderers. Series controls show the live value with a color swatch and support keyboard navigation. Series visibility is per host and survives a metrics reset (#123).
- Threshold and error annotations on graphs: The checkpoint graph labels its warning and critical thresholds, the redo log bar shows the hourly rate against the configured log size, and a graph that fails to render shows
Graph unavailableinstead of stopping the dashboard (#123).
Replay
- Smaller replay files: New recordings use a raw-content zstd dictionary and 16 KB SQLite pages. Files are about a third of their previous size. Existing files still play back.
- Faster seeking on large files: The metric window query on seek is bounded by the target frame, 213 ms to 0.23 ms on a 208k-row daemon file.
- Hold
[or]to scrub: While the key is held only the replay position updates. The frame renders when the key rests. The step doubles as the key is held and caps at 1% of the file, so a scrub across a day-long recording takes a few seconds. - Playback is read-only: Playback opens the file with
mode=roand never runs DDL,VACUUM,chmod, or a retention purge, so a daemon can keep writing the file that is being watched. - Unreadable rows are skipped: A corrupt or truncated row is skipped with a notification instead of ending playback. A frame that fails to render pauses the replay instead of crashing.
- Version warning: Playing a file recorded by a newer Dolphie shows a warning, and the daemon records its version in the file metadata.
Bug Fixes
AttributeError: 'list' object has no attribute 'get'on playback: Payload fields are coerced to the shapes the panels expect, so a file recorded by a different Dolphie version loads instead of crashing.NoMatcheson exit: A worker finishing during shutdown no longer queries widgets that are already gone.- Replay seek with a stepped-back clock: The metric window ignores rows written after the system clock moved backwards.
- Metrics are thread-safe: Metric history is snapshotted atomically between the poll worker and the renderer, and a counter reset after a missing sample sets a new baseline instead of emitting a negative rate (#123).
Packaging
- Dependency management moved from Poetry to uv and Hatchling.
uv sync --locked --all-groupssets up a development environment (#123). - The wheel and sdist ship the
dolphiepackage only.
Testing
- The real app now runs in CI against MySQL 5.7, 8.0, 8.4, 9.7, Percona 8.4, MariaDB 10.11, 11.4, 11.8, 12.3, and ProxySQL 3.0, plus MariaDB replication, Group Replication, Galera, multi-source, and InnoDB ClusterSet topologies, and SVG snapshots of every panel from committed daemon recordings.
Dependency Updates
| Package | Old | New | Note |
|---|---|---|---|
| textual | 8.2.7 | 8.2.8 | |
| orjson | 3.11.5 | 3.12.0 | No longer held back, Python 3.10 floor |
| requests | 2.32.5 | 2.34.2 | No longer held back, Python 3.10 floor |
| sqlparse | 0.5.5 | 0.6.0 | |
| packaging | 26.2 | 26.3 | |
| textual-plotext | 1.0.1 | New, replaces the vendored plotext widget |