github Fail-Safe/Technitium-DNS-Companion v1.5.0

latest release: v1.5.1
10 hours ago

[1.5.0] - 2026-03-06

Added

  • Query Logs: added a client-side Domain Exclusion List (Exclude Domains) with wildcard support (*), persisted to localStorage for per-browser noise reduction.
  • Domain Groups: added global SQLite-backed Domain Group CRUD (enabled by default; disable with DOMAIN_GROUPS_ENABLED=false) with optional group descriptions, per-entry notes, bindings to Advanced Blocking groups, materialization preview, apply/dry-run endpoints with conflict blocking and cluster primary-write guard (override via allowSecondaryWrites=true), and unified export/import with configurable domainsMode and domainGroupsMode merge strategies.
  • Domain Groups: apply operation uses a three-pass tracking model that records what each Domain Group last wrote per (Advanced Blocking group, action) pair, enabling zero-data-loss first-apply semantics — manually-added entries are never overwritten, and DG-managed entries are cleaned up automatically when bindings are removed.
  • Domain Groups (UX): drag Domain Group pills onto Advanced Blocking groups to bind them; active bindings are shown as chip summaries within each group's expanded view.
  • Domain Groups (UX): small layer icon on domain chips that are present via a Domain Group; count badge tooltip shows DG-managed vs manual domain breakdown per group.
  • Domain Groups (UX): informational toast when attempting to drag-remove a DG-managed domain (entries managed by Domain Groups must be removed from the Domain Group itself).
  • Domain Groups (UX): informational toast when dropping a domain onto a group that already contains it.
  • Log Alerts Rules (MVP): added SQLite-backed rule storage and CRUD/enable-toggle endpoints, plus Logs page rule management UI (create/list/delete/enable-disable) alongside existing SMTP test workflow.
  • Log Alerts Evaluator (MVP): added rule-evaluation status/manual-run endpoints and backend evaluator logic to scan recent stored logs, apply selector/pattern/debounce checks, and send SMTP rule alert summaries.
  • Configuration Sync: Primary + Secondaries mode now fully operational — select a primary node and diff/sync its Advanced Blocking config to each secondary independently or all at once.

Changed

  • DNS Filtering and Rule Optimizer: improved Advanced Blocking capability detection by preferring blockingStatus node install state, with fallback to node app discovery.
  • Docker Compose: replaced wget-based healthcheck probe with a Node.js HTTP/HTTPS probe (with protocol fallback) so checks work in minimal images without extra OS utilities.
  • Persistence: consolidated Domain Groups and Log Alert Rules from two separate SQLite databases into a single companion.sqlite (controlled by COMPANION_DB_PATH, default /app/config/companion.sqlite). Query log cache remains its own file. Removes the DOMAIN_GROUPS_SQLITE_PATH and LOG_ALERT_RULES_SQLITE_PATH env vars (neither had shipped in a release).
  • Docker Compose (production): ./data is now bind-mounted to /app/config by default, so companion.sqlite and query-logs.sqlite survive docker compose up --force-recreate and image rebuilds without any extra setup.
  • Log Alerts: advanced_blocking_group_name SQLite column renamed to advanced_blocking_group_names; a startup migration runs automatically via PRAGMA table_info so existing databases upgrade silently.
  • Snapshot services (DHCP History, DNS Filtering History, Zone History): refactored to share a common SnapshotFileStore base class, standardizing directory resolution, retention pruning, and atomic writes across all three.
  • Configuration Sync: sync helper functions (computeGroupDiffs, computeConfigDifferences, computeSyncPreview) extracted to module scope to support per-secondary diffs in P+S mode without duplicating logic.
  • Toast notifications: position adjusted from 1.5rem to 2rem from the top-right edge for a more comfortable placement.
  • Domain Groups (UX): added a --pending-sibling modifier style for binding chips whose partner binding in the same (group, action) pair has a pending change.

Fixed

  • DNS Filtering: fixed live search not applying filter results correctly, a save-on-change bug, a missing regex pattern guard, and improved rendering performance on large lists.
  • DNS Filtering bootstrap resilience: node configuration fetch now retries transient failures, emits a load-failed UI event, and surfaces clearer user feedback via toast + inline banner.
  • Domain Groups: fixed N+1 SQL queries in the materialization pending-pairs check and apply tracking bulk-load path.
  • Domain Groups (UX): groups card header now uses flex-start layout so controls stay left-aligned in single-node (non-clustered) mode.
  • Domain Groups (UX): fixed white-on-white text when hovering an already-selected Domain Group button.
  • Rule Optimizer availability and nav gating now handle pre-auth / post-login capability hydration more reliably (reduces false negatives until full state is loaded).
  • Configuration Sync: Primary + Secondaries mode no longer shows a blank UI — targetNode was always resolving to undefined in P+S mode, causing all diff/sync gates to fail silently.
  • Configuration Sync: sync completion now shows a success toast; previously the post-sync reloadAdvancedBlocking() re-render could swallow in-component success state before it rendered.

Docs

  • Added AGENTS.md with project structure, development conventions, and build/test commands for agentic coding assistants and contributors.
  • Docker guide now documents healthcheck probe behavior and quick verification commands.
  • Query Logs filtering docs now include the Domain Exclusion List behavior (UI-only, wildcard matching, local persistence).

Don't miss a new Technitium-DNS-Companion release

NewReleases is sending notifications on new releases.