[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 viaallowSecondaryWrites=true), and unified export/import with configurabledomainsModeanddomainGroupsModemerge 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
blockingStatusnode 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 byCOMPANION_DB_PATH, default/app/config/companion.sqlite). Query log cache remains its own file. Removes theDOMAIN_GROUPS_SQLITE_PATHandLOG_ALERT_RULES_SQLITE_PATHenv vars (neither had shipped in a release). - Docker Compose (production):
./datais now bind-mounted to/app/configby default, socompanion.sqliteandquery-logs.sqlitesurvivedocker compose up --force-recreateand image rebuilds without any extra setup. - Log Alerts:
advanced_blocking_group_nameSQLite column renamed toadvanced_blocking_group_names; a startup migration runs automatically viaPRAGMA table_infoso existing databases upgrade silently. - Snapshot services (DHCP History, DNS Filtering History, Zone History): refactored to share a common
SnapshotFileStorebase 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.5remto2remfrom the top-right edge for a more comfortable placement. - Domain Groups (UX): added a
--pending-siblingmodifier 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 —
targetNodewas always resolving toundefinedin 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.mdwith 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).