Skip to main content

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.2 applies migration 0014 and 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 503 and 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 failed terminal 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.1 with dash 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.language when 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_threshold now use 17s; 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 0012 restores the required updated_at triggers.
  • 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_days setting 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/billing modes, P95, monthly snapshots, and rebuild APIs.
  • Migration 0013 rebuilds 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.language uses system.
  • database.retention_days now controls only raw NIC metrics and service checks.
  • An omitted database.metrics_raw_retention_days uses 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 run dash migrate before 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 update command. Jobs, phases, logs, and recovery state persist under $DASH_HOME/runtime/dash-update; update_dash_linux.sh remains only as a compatibility entry point.
  • Managed installs now use immutable releases/<version> directories and one atomic current symlink. 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_version to exactly match the binary. dash migrate advances 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_pwd requires at least 8 visible ASCII characters and no whitespace. auth.jwt_signing_key requires at least 32 bytes and no surrounding whitespace.
  • app.public_url accepts only IP literals or ASCII DNS hosts. Internationalized domains must use IDNA/punycode, and ports must be in 1..65535.
  • Runtime Redis support starts at 6.2.0; 8.2.3+ is recommended. Dash runs PING and INFO server against the configured endpoint. --no-redis skips Redis config, connection, and version validation.
  • API responses add CSP, Permissions Policy, Referrer Policy, nosniff, and framing protection. Refresh cookies use SameSite=Strict.
  • JSON bodies above a route limit return 413 body_too_large instead of 400 invalid_request.

Notifications and Alerts

  • dash migrate encrypts 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=null and can only be deleted and recreated.
  • The notification outbox adds paused, blocked, and discarded states. Channel delivery health is unknown, healthy, degraded, or disabled.
  • 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 307 and 308.
  • SMART alert messages include affected devices, failing ATA attributes, NVMe critical warnings, and media_errors when 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=default is 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 lite to billing, 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 billing mode. Switching to lite completes the current range and then stops the task.
  • Traffic responses remove the deprecated partial field. GET /api/statistics/traffic/monthly accepts months only in 1..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 400 or 422 errors.

Installation, Packaging, and UI

  • install_dash_linux.sh is first-install-only. Non-systemd hosts must explicitly use --service-manager=none; all later version changes use dash 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-v1 release.env records Dash/Node versions, the target platform, and every bundled Node/runner digest.
  • While the document is visible, the browser checks local /api/version and 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.sh through a systemd transient unit and store status under DASH_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_channel and dash_update_mode.

Fixes

  • After a Dash update completes, the admin console resynchronizes /api/version and 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.sh is 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/settings is a full replacement and must include history_guest_access_mode, dash_update_channel, dash_update_mode, logo_url, page_title, and topbar_text. Use PATCH for partial updates.
  • The prerelease channel 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 reinstall command. 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 require X-Node-Secret; legacy node upgrades use a short-lived upgrade_token generated 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, or clang is 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_errors field for the NVMe SMART media and data integrity error counter.

Compatibility

  • Node omits media_errors when smartctl does 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-Secret when downloading assets from an update manifest.
  • Linux and macOS managed install layouts switch /var/lib/ithiltir-node/current after 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 disabled and 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/current install layout.
  • Direct binaries outside the managed install layout do not apply update manifests. Rerun the install command or replace the binary manually.