Release Notes
Release Notes record version changes that affect deployment, upgrades, configuration, APIs, and runtime behavior.
Dash
0.3.3
Release date: 2026-09-19
GitHub Release: Ithiltir 0.3.3
Uptime and Dashboard
- Node cards show uptime for the latest 45 calendar days, including today. Hover over a day or select it with the keyboard to inspect its 24 hourly rates. The tooltip opens after the detail loads, with a 200 ms debounce when moving between days.
- Rates use online durations covered by node reports. Today and the current hour include only completed minutes. Unobserved periods remain unknown instead of counting as offline.
- System settings add a guest uptime switch and SLA color thresholds. Uptime is enabled for guest-visible nodes by default. Rates below 99% are yellow and rates below 95% are red; both thresholds are configurable.
- Card spacing adapts to visible content, avoiding an empty row when uptime is hidden.
Upgrades and APIs
- Upgrading from
0.3.2applies migration0014and starts collecting uptime history. Minute records and hourly aggregates are retained for 46 days. Earlier uptime is not backfilled automatically. - Daily and hourly uptime APIs are available. Guest uptime access is independent of history-metric and traffic access settings.
- Metric reports must finish persistence within 5 seconds of receipt by the server. Expired reports return
503and are not persisted. - Source builds require Go 1.27.1+. Package installations do not require Go.
Existing nodes and metric history are preserved. Prerelease installations using the early boolean uptime schema must follow the prerelease instructions in Upgrade; installations already using durations retain their uptime history.
0.3.2
Release date: 2026-08-30
GitHub Release: Ithiltir 0.3.2
Alerts and Traffic
- Existing non-offline alerts remain open when a node snapshot is missing, invalid, or stale. Dash closes an event only after a fresh sample proves that the condition cleared or after the corresponding rule is unmounted.
- The traffic interface list keeps historical interfaces but now orders them by latest sample time. An interface that is still reporting appears first, preventing the admin console from selecting an inactive interface with no current-cycle data by default.
Updates and Interface
- After a manual Dash update starts, the admin console stores the target version in the current browser session and blocks the stale UI with a root-level overlay. It checks the local version every 10 seconds during service cutover, shows a reconnecting state while Dash is unavailable, and waits for confirmation before reloading after the target version is installed.
- Browser wait time does not mark an update as failed. The overlay reports failure only after the backend job explicitly reaches the
failedterminal state. - Alert management now opens on the Events tab by default. The language menu uses a 250 ms hover delay while click activation remains immediate.
Compatibility
- This release has no database migration, configuration-format change, or new HTTP path.
- Historical interfaces are not deleted and remain available for old traffic queries; only the default list order changes.
- Managed installations can upgrade directly from
0.3.1withdash update.
Read Upgrade before upgrading from 0.3.1.
0.3.1
Release date: 2026-08-24
GitHub Release: Ithiltir 0.3.1
Notifications and Interface
- Telegram, email, and webhook channels can independently use the system language, Chinese, or English. System language resolves to backend
app.languagewhen a notification is enqueued; stored channels without the field continue to follow the system language. - Alerts, channel test messages, and Dash update notifications are rendered for each target channel. Changing the language affects only newly queued notifications; existing tasks keep their original text and language.
- Notification channel status switches and action controls are now aligned consistently.
- After a Dash update reloads the document, the admin console returns to the system update tab and shows a localized success message when the update job completes.
Installation and Maintenance
- Fresh Linux installs pin missing database dependencies to PostgreSQL 16.15 and TimescaleDB 2.29.1. Existing compatible PostgreSQL 16+ and matching TimescaleDB installations are not replaced; installation stops when repositories cannot supply the pinned versions.
- Fresh installations and configurations that omit
app.node_offline_thresholdnow use17s; version updates do not rewrite an existing explicit value. - Database migrations now run through EiluneKit. A mismatch in an application-managed schema causes migration to fail. Migration
0012restores the requiredupdated_attriggers. - Frontend and Go dependencies were updated, the source-build baseline moved to Go 1.26.6, and identified standard-library and frontend dependency vulnerabilities were fixed.
Metrics History and Storage
- Regular metrics now use one-hour chunks and lossless compression after one day. The new
database.metrics_raw_retention_dayssetting defaults to eight days of raw samples. Fifteen-minute aggregates retain 16 days, and one-hour aggregates retain 32 days. - History ranges explicitly select raw samples, 15-minute aggregates, or one-hour aggregates. CPU temperature, physical-disk temperature, and exposed PSI metrics use the same aggregate model. Fifteen-day averages are weighted by sample count, and queries include the latest samples.
- Traffic accounting keeps its existing data model and retention responsibilities, including raw NIC metrics, five-minute traffic records,
lite/billingmodes, P95, monthly snapshots, and rebuild APIs. - Migration
0013rebuilds and backfills continuous aggregates serially while Dash is stopped. The new raw retention policy is enabled only after backfill succeeds.
Compatibility
- Configuration syntax remains backward-compatible. An omitted notification-channel
config.languageusessystem. database.retention_daysnow controls only raw NIC metrics and service checks.- An omitted
database.metrics_raw_retention_daysuses the eight-day default. Set this field explicitly to retain regular metric samples for longer than eight days. - Managed installations run database migrations through
dash update. Before replacing a binary manually, back up PostgreSQL and the notification configuration key, then rundash migratebefore startup.
Read Upgrade before upgrading from 0.3.0.
0.3.0
Release date: 2026-08-01
GitHub Release: Ithiltir 0.3.0
Upgrade and Runtime State
- Linux update logic moved into the native
dash updatecommand. Jobs, phases, logs, and recovery state persist under$DASH_HOME/runtime/dash-update;update_dash_linux.shremains only as a compatibility entry point. - Managed installs now use immutable
releases/<version>directories and one atomiccurrentsymlink. Before stopping the service, the updater validates the release manifest, Dash/Node versions, and SHA-256 values for all seven bundled Node/runner assets. - Failures before database migration restore the previous release. Once migration starts, recovery is forward-only; an old binary cannot be restarted against an advanced schema.
- Normal startup requires the database
goose_db_versionto exactly match the binary.dash migrateadvances older schemas and rejects newer schemas. - PostgreSQL persists open alerts, notification outbox rows, traffic materialization progress, current node projections, and monthly traffic usage. Alert pending/cooldown state, MTProto login handshakes, node update requests, and traffic rebuild jobs remain process-local.
Configuration and Security
- YAML rejects unknown fields, multiple documents, and invalid explicit durations. A present environment variable overrides YAML even when empty; an empty integer variable means
0, while a non-empty invalid integer stops startup. monitor_dash_pwdrequires at least 8 visible ASCII characters and no whitespace.auth.jwt_signing_keyrequires at least 32 bytes and no surrounding whitespace.app.public_urlaccepts only IP literals or ASCII DNS hosts. Internationalized domains must use IDNA/punycode, and ports must be in1..65535.- Runtime Redis support starts at
6.2.0;8.2.3+is recommended. Dash runsPINGandINFO serveragainst the configured endpoint.--no-redisskips Redis config, connection, and version validation. - API responses add CSP, Permissions Policy, Referrer Policy,
nosniff, and framing protection. Refresh cookies useSameSite=Strict. - JSON bodies above a route limit return
413 body_too_largeinstead of400 invalid_request.
Notifications and Alerts
dash migrateencrypts complete notification channel configurations with AES-256-GCM and creates$DASH_HOME/configs/notify-config.key. Back up this key separately from PostgreSQL; Dash refuses to start without the matching key.- Notification channels use strict schemas. Invalid stored channels remain visible with
config=nulland can only be deleted and recreated. - The notification outbox adds
paused,blocked, anddiscardedstates. Channel delivery health isunknown,healthy,degraded, ordisabled. - Webhook, Telegram, and SMTP fields now have explicit size, address, URL, and redirect limits. Notification HTTP requests follow at most five safe same-host redirects; POST follows only
307and308. - SMART alert messages include affected devices, failing ATA attributes, NVMe critical warnings, and
media_errorswhen available. Node-provided labels are sanitized and bounded. - Rule names, durations, cooldowns, finite thresholds, and offsets are validated at the write boundary. Invalid stored rules close open events with
rule_invalid.
Traffic and Node Contracts
- Every node now owns an explicit billing cycle. Upgrade migration freezes inherited cycles to their pre-upgrade effective values; new nodes use a calendar month starting on day 1.
- Global traffic settings no longer accept billing-cycle fields. Legacy
traffic_cycle_mode=defaultis only an input alias and is stored as an explicit calendar month. - Monthly usage aggregation and five-minute traffic generation keep independent progress. After a switch from
litetobilling, five-minute records start 30 minutes before the switch. Earlier retained raw NIC data requires a per-node rebuild. - Traffic rebuild is available only in
billingmode. Switching tolitecompletes the current range and then stops the task. - Traffic responses remove the deprecated
partialfield.GET /api/statistics/traffic/monthlyacceptsmonthsonly in1..24. - Node names, secrets, tags, group names, and remarks have explicit length and control-character limits. Node payload integer ranges, ratios, rates, and fixed-column text are validated before database writes, returning stable
400or422errors.
Installation, Packaging, and UI
install_dash_linux.shis first-install-only. Non-systemd hosts must explicitly use--service-manager=none; all later version changes usedash update.- The Linux Node installer supports systemd, Alpine/OpenRC, and explicit
none. It stages and executes the candidate before stopping existing processes and switching the release. Rerunning it is a force install, not the Node updater's rollback path. - Linux, macOS, and Windows Node installers follow at most five safe same-host redirects while carrying
X-Node-Secret, and reject cross-host redirects and HTTPS downgrade. - Release packages include only
configs/config.example.yaml, never local config. Format-v1release.envrecords Dash/Node versions, the target platform, and every bundled Node/runner digest. - While the document is visible, the browser checks local
/api/versionand reloads after the installed Dash version changes. A remote Release lookup failure does not block the locally installed frontend. - The admin console adds skip-to-content, keyboard selection, focus trapping/restoration, dialog semantics, accessible loading and tooltip labels, and reduced-motion behavior.
- The dashboard summary label “Alerts” is now “Anomalies.” It counts offline, RAID, CPU, and disk conditions, not configured alert events.
Read Upgrade before upgrading from 0.2.7.
0.2.7
Released: 2026-07-01
GitHub Release: Ithiltir 0.2.7
Changes
- Added a Dash self-update page in the admin console for release/prerelease checks, current Dash version, bundled Node version, latest version, update task status, and recent logs.
- Dash self-update now supports manual update, reinstall, notification-only mode, and automatic mode. Automatic updates run the packaged
update_dash_linux.shthrough a systemd transient unit and store status underDASH_HOME/runtime/dash-update. - Added an alert records page with server, status, metric, time-range filters, and paginated loading.
- Added open-alert entry points on the node list. They show the current open alert summary and link to alert records filtered to that node.
- Alert notification channel management now has search and clearer status handling. Dash automatic update notifications reuse enabled global notification channels.
- Added runtime system settings for
dash_update_channelanddash_update_mode.
Fixes
- After a Dash update completes, the admin console resynchronizes
/api/versionand the update check result so current/latest version badges do not stay stale. - Dash self-update availability now reports clear reasons when systemd, git, tar, curl/wget, or
update_dash_linux.shis missing. - System settings PATCH and PUT now clearly separate partial updates from full replacement so newly added fields are not lost.
- Alert record custom time range validation avoids querying invalid ranges.
- The minimum Node version for automatic update delivery is now
0.2.3; older nodes must be updated by rerunning the install command or replacing the binary manually.
Compatibility
- Dash self-update supports Linux/systemd release-package installs only. Non-systemd environments report the updater as unavailable.
PUT /api/admin/system/settingsis a full replacement and must includehistory_guest_access_mode,dash_update_channel,dash_update_mode,logo_url,page_title, andtopbar_text. UsePATCHfor partial updates.- The
prereleasechannel checks prerelease tags only and does not fall back to stable releases. - The open-alert summary on the node list is loaded when entering the node page; it is not realtime polling.
0.2.6
Released: 2026-06-17
GitHub Release: Ithiltir 0.2.6
Changes
- The Dash updater adds the
reinstallcommand. It reinstalls the latest package from the selected channel even when the installed version already matches the target version. - Bundled
/deploy/*node binaries and runner assets are protected downloads. Normal requests requireX-Node-Secret; legacy node upgrades use a short-livedupgrade_tokengenerated by Dash. - Node automatic update handling supports SemVer build metadata. Node binaries with the same SemVer precedence but different build metadata can still be delivered.
- Linux node install scripts support Chinese and English output.
- The Linux node install script compiles a root-side connections cache helper when
cc,gcc, orclangis available. The helper counts TCP/UDP connections in host and container network namespaces. - Runtime metrics and historical metrics have clearer storage boundaries. TCP/UDP connection counts remain historical numeric metrics. SMART, thermal, and full runtime details stay in current snapshots or frontend caches.
Fixes
- Legacy node upgrade downloads receive a temporary authorized URL when they cannot send
X-Node-Secret. - Updating a node secret to one already owned by another node returns
409 duplicate_secret. - Frontend cache rebuilds no longer depend on the cancellation state of the initiating request.
- Dash closes the underlying server after a failed graceful shutdown.
Compatibility
- The minimum node version for automatic update delivery from the Dash admin console remains
0.2.1. - Install script templates under
/deploy/*remain public. Bundled node binaries and runner assets require authentication. - Back up the database before production upgrades. The release-package updater runs migrations; manual binary replacement requires manual migration.
Node
0.2.4
Released: 2026-08-21
GitHub Release: Ithiltir-node 0.2.4
Changes
- Disk SMART reports add the optional
media_errorsfield for the NVMe SMART media and data integrity error counter.
Compatibility
- Node omits
media_errorswhensmartctldoes not provide the value. The field is a backward-compatible JSON extension, so existing receivers can continue to ignore unknown fields.
0.2.3
Released: 2026-06-17
GitHub Release: Ithiltir-node 0.2.3
Changes
- Node sends the current target key as
X-Node-Secretwhen downloading assets from an update manifest. - Linux and macOS managed install layouts switch
/var/lib/ithiltir-node/currentafter staging an update, then exec the updated node with the original arguments and environment. - Windows managed installs use the runner to replace the binary and restart node after staging an update.
- Install layouts that do not support self-update report
self update disabledand continue the reporting loop. - On Linux, node keeps its built-in connection counting fallback when the connections cache is missing, stale, or unavailable.
Fixes
- Fixed staged updates that did not restart correctly or did not execute the updated binary.
- Fixed authentication handling for protected update asset downloads.
- Fixed connection counting fallback behavior when the connections cache is unavailable.
Compatibility
- Windows self-updates require runner-managed installs.
- Linux and macOS self-updates require the
/var/lib/ithiltir-node/releases/<version>and/var/lib/ithiltir-node/currentinstall layout. - Direct binaries outside the managed install layout do not apply update manifests. Rerun the install command or replace the binary manually.