Releases: itsDNNS/docsight
v2026-03-06.3 — Modulation Performance Module
New Feature: Modulation Performance
A new built-in analysis module that tracks how modulation levels change over time and surfaces degradation that single-snapshot views miss.
Highlights
- Per-protocol-group health index with correct scaling per DOCSIS version and direction (US 3.0 max 64QAM = 100/100, DS 3.0 max 256QAM, DS 3.1 max 4096QAM, US 3.1 max 1024QAM)
- Multi-day overview (7d/30d) with stacked modulation distribution bars and dual-axis health/low-QAM trend per protocol group
- Intraday channel drill-down — click any day bar to see per-channel modulation timelines with degradation summaries (e.g. "4.5h at 16QAM between 14:00–18:30")
- Low-QAM exposure KPI — percentage of time at or below a configurable threshold (default ≤16QAM)
- Sample density indicator — actual vs expected sample count with quality percentage
- Disclaimer displayed in both views, translated (EN/DE)
API Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/modulation/distribution?direction=us&days=7 |
Per-protocol-group distribution with daily breakdown |
| GET | /api/modulation/intraday?direction=us&date=2026-03-05 |
Per-channel timeline for a single day |
| GET | /api/modulation/trend?direction=us&days=7 |
Legacy trend data |
Demo Mode
Demo data now generates realistic modulation variation — bad periods every ~10 days where upstream channels drop to 16QAM and downstream edge channels degrade, plus evening congestion patterns (19–23h).
Closes #92 — Wiki documentation
v2026-03-06.2 — 4-Tier VFKD Health System
Changes
-
New 4-tier VFKD health system: Good → Tolerated → Marginal → Critical
- Replaces the previous 3-tier system with a "tolerated" level for values that deviate from ideal but are still within ISP-accepted ranges
- Applied across dashboard, channel tables, PDF reports, and LLM export
-
Per-metric health coloring in channel tables
- Power, SNR, and modulation cells now use
data-healthattributes instead of inline template conditions - Cleaner CSS-driven coloring, fully backward compatible with existing data
- Power, SNR, and modulation cells now use
-
Tolerated deviations no longer appear in Active Issues panel
- Values the ISP considers acceptable are still shown in metric cards and the health banner, but are no longer promoted as actionable issues
-
PDF report module updated for 4-tier health labels and thresholds
v2026-03-06.1 — Setup Redesign & PDF Fix
Changes
-
Redesigned setup wizard to match the Tribu Design System (#146)
- Glass cards, Lucide icons, mesh background, Outfit font
- Full i18n coverage for all setup wizard strings
- E2E tests for the setup flow
-
Fixed PDF report column overlap in all languages (#154)
- Dynamic key column width instead of fixed 60mm
- Shortened health-status labels to prevent overflow
v2026-03-04.1 — Prometheus Metrics Endpoint
What's New
DOCSight now exposes all DOCSIS signal metrics via a Prometheus-compatible /metrics endpoint, enabling integration with Grafana/Prometheus monitoring stacks.
Features
- GET /metrics returns all channel metrics in Prometheus text exposition format (
text/plain; version=0.0.4; charset=utf-8) - Per-channel downstream metrics: power, SNR, correctable/uncorrectable errors, modulation (as numeric QAM order)
- Per-channel upstream metrics: power, modulation
- Summary metrics: health status (0-3), channel counts
- Device info: model, software version, uptime
- Connection info: max downstream/upstream kbps
- Poll timestamp: Unix epoch gauge of last successful modem poll
- No auth required: endpoint is always accessible (like
/health) - No additional modem queries: reads from existing in-memory state
Technical Details
- Pure
format_metrics()function with no external dependencies - 60 new tests (52 unit + 8 integration), 860 total passing
- Closes #59
v2026-03-03.3
Bug Fixes
- BNetzA: Fix detail table showing 0.0 Mbit/s for all measurements (#148)
- BNetzA: Hide dashboard card when measurement fields are incomplete (#148)
- BNetzA: Handle NULL fields on dashboard to prevent crash (#148)
- BNetzA: Shorten German table column headers for readability (#148)
- BQM: Clamp spread offset to never schedule collection before 00:30 (#139)
- CH7465: Omit Username in login payload for password-only firmware (#149)
Features
- BNetzA: Extract tariff, provider, and SOLL values from Desktop App CSV imports (#148)
- Data-driven driver hints for setup and settings UI
v2026-03-03.2 — BNetzA Design System & CSV Parser Fix
What's New
BNetzA Page Design System Alignment
The BNetzA Broadband Measurement page now fully matches the app's design language:
- Lucide SVG icons replace all Unicode emojis (expand, refresh, complaint, PDF, delete, verdict)
- Verdict icons at a glance: green circle-check for compliant, red triangle-alert for deviation, with i18n tooltips
- Hover effects and animations on all action buttons (expand arrow rotates, action icons highlight on hover)
- CSS classes replace inline JS styles for detail tables, grid layout, and typography
- Complaint textarea uses the design system's monospace font variable
- Global value color utilities (
val-good,val-warn,val-crit) promoted from channel-table-only to app-wide, also fixing previously broken color coding in the Speedtest table
BNetzA CSV Parser Fix (#147)
- Recognize
Messzeitpunktcolumn header used by the breitbandmessung.de Desktop App and Web Test - Prefer exact header matches over substring matches to prevent false column mappings
- Extract time from combined
DD.MM.YYYY HH:MM:SSvalues when no separate time column exists - Remove overly broad
zeitcandidate that incorrectly matchedLaufzeit
BNetzA Demo Data
- Updated demo measurements to realistic 1 Gbit/s cable connection values
Housekeeping
- Moved
docker-compose.bnetz.ymlto the wiki (Example Compose Stacks page) - Updated README for Generic Router mode and community driver modules
- Linked Example Compose Stacks from README quick-start section
v2026-03-03.1 — Community Driver System & Generic Router Mode
What's New
Community-Contributed Modem Drivers (#131, #129)
DOCSight now supports community-contributed modem drivers via the module system. Third-party modules can declare a "driver" contribution in their manifest to add support for new modem types without modifying core code.
Architecture:
- New
DriverRegistryclass provides unified driver lookup (built-in + module-contributed) - Module drivers take priority over built-in drivers, enabling community overrides
- Driver modules are security-restricted from also contributing collectors or publishers
Generic Router Mode (#131, #129)
Users with non-DOCSIS connections (fiber, DSL, satellite, fixed wireless) can now select Generic Router (No DOCSIS) during setup. In this mode:
- DOCSIS-specific sections (channel tables, signal health, hero chart) are replaced with an informative placeholder
- All modem-agnostic features remain fully functional: Speedtest, BQM, BNetzA, Weather, Smokeping, Journal, and any module-contributed cards
- Setup and settings pages hide irrelevant credential fields when Generic Router is selected
Event Log Improvements (#137)
- Rich human-readable event messages replace raw JSON
- Mobile responsive layout with severity icons instead of text labels
- Severity filter pills wrap properly on small screens
- Lucide arrow icons for sorting
i18n & Polish (#144)
- Translated hardcoded English strings in channel tables and metric cards
- Color-coded upstream modulation indicators
- Updated
docker-compose.bnetz.ymlwith new upstream repo URL
v2026-03-02.1
What's New
Spike Expiry for Uncorrectable Errors (#141)
One-time uncorrectable error spikes no longer permanently penalize the health score. After a configurable observation window (default 48h), the spike is suppressed — uncorr_pct resets to 0.0 and health is recalculated from remaining issues. A new spike resets the timer automatically.
The summary includes a spike_suppression object when active, showing last spike time and hours since.
Configurable via errors.spike_expiry_hours in thresholds.
BQM Collection Fixes (#138, #139)
- Live polling now uses random jitter (0-120s) instead of fixed intervals, preventing clustered requests
- Daily collection spread offset fires before the configured time (00:00-02:00) instead of after
v2026-03-01.2 — BQM & Dashboard Polish
BQM Improvements
- User-Agent with repo URL — ThinkBroadband can now identify DOCSight traffic (
DOCSight/{version} (+github)) - Live refresh interval — reduced from 5min to 15min to be a better citizen on TBB infrastructure
Dashboard
- Errors card shows percentage — displays uncorrectable error ratio instead of raw count, with health badge (Good/Marginal/Poor) based on configurable thresholds
- Min codewords threshold — suppresses misleading percentages when total error count is below 1000 (e.g. right after modem boot)
- Hero card countdown fix — refresh timer no longer causes layout shift in meta items
- Health ring legend — zero counts are now muted to avoid confusion (e.g. "0/8")
Sidebar & Layout Fixes
- Prevent swipe-to-close on tablet/desktop layout
- Dark mode toggle aligned to right edge
- Sidebar appearance consistent between dashboard and settings
Other Fixes
- Lucide icons replace emoji/unicode in speedtest tracker
- Speedtest table horizontal scroll on mobile
- Settings scroll cutoff on mobile fixed
v2026-03-01.1 — Dashboard & Settings Redesign
Complete UI Overhaul
The entire frontend has been redesigned with a modern, mobile-first design system — new dashboard, new settings, theme engine, and PWA support.
Dashboard Redesign
- New layout shell — mobile sticky header, compact sidebar, bottom tab bar
- Hero card — status dot, health summary, provider info, gaming badge, inline refresh/countdown
- Metrics grid — DS Power, US Power, SNR, Errors, Speed cards with health badges and ranges
- Health rings — thin donut rings with channel breakdown (Good/Marginal/Poor)
- Channel tables — clean grouped layout by DOCSIS version
- Responsive — mobile-first with tablet and desktop breakpoints
Settings Redesign
- New structure — Core settings (Connection, Appearance, Notifications, Security, System, Support) + Module settings in sidebar
- Tribu design system — glass cards, toggle rows, card icons, consistent spacing
- Module cards — redesigned grid layout with enable/disable, settings links, author info
Theme Engine
- Themes as modules —
contributes: themein manifest.json withtheme.jsoncolor definitions - 3 built-in themes — Classic (default dark), Ocean (blue tones), Tribu (purple accent)
- Live preview — preview any theme before activating, instant switch without restart
- Theme gallery — browse installed themes in Appearance settings
- Theme registry — browse and install community themes (API ready)
- Mutual exclusion — only one theme active at a time
- Dark/Light mode — each theme defines both color schemes
PWA & Offline
- Service worker — offline caching for static assets
- Self-hosted dependencies — Chart.js, Lucide icons, date-fns adapter bundled locally (no CDN)
- Self-hosted fonts — Inter, Outfit, JetBrains Mono served from
/static/fonts/ - App manifest — installable as PWA with proper icons and theme color
Design System
- Design tokens (
tokens.css) — shared CSS custom properties for colors, spacing, typography - Components (
components.css) — reusable UI primitives (badges, toggles, cards, buttons) - Modular CSS — split from monolithic
main.cssinto tokens, components, views, modals, fonts - Per-module CSS — module-specific styles extracted into
modules/<name>/static/style.css
Module System Improvements
- Smokeping extracted — fully modular with own routes, i18n, templates, and JS
- Module CSS isolation — each module owns its styles, injected only when enabled
- Theme security validation — theme.json values validated against injection
- Settings integration — modules appear in Settings sidebar sorted alphabetically
Fixed
- CSS specificity:
.desktop-onlyutility class now properly overrides component styles - Hero meta items display on single line on desktop (no wrapping)
- Mobile header shows countdown + refresh only in sticky bar, not duplicated in hero
- Theme palette dots update when toggling dark/light mode
- Toggle switches visible in all contexts (table, card, standalone)
- Module-dependent sidebar links gated on module existence
closeMobileSidebar→closeSidebarJS reference error on resize