Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
945 commits
Select commit Hold shift + click to select a range
7c5795c
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 2, 2026
0b17d0b
Change Control - Edit: edit marks sit on the scrollbar's track, and a…
tvancott42 Nov 2, 2026
4359e4c
Change Control - Set Up Zones: a rename on the board finishes its Sec…
tvancott42 Nov 2, 2026
acd0d94
Change Control: the tab row shows whether the site's gateway is provi…
tvancott42 Nov 2, 2026
1de18f8
Change Control - Review Plan: the footer shows whether the site's gat…
tvancott42 Nov 2, 2026
e9691c3
Change Control - Set Up Zones: + Add Zone focuses the Zone name field
tvancott42 Nov 2, 2026
d2ab373
Change Control - Set Up Zones: the whole + Add Zone card opens the Zo…
tvancott42 Nov 2, 2026
ef232c7
Change Control - Set Up Zones: Enter in Zone name adds the zone, Esca…
tvancott42 Nov 2, 2026
8140574
Change Control - Set Up Zones: one note names every Threat Intelligen…
tvancott42 Nov 2, 2026
68e7762
Change Control - Changes: the gateway indicator shows when one site i…
tvancott42 Nov 2, 2026
74d9530
Change Control - Set Up Zones: exception coverage reads the Audit's p…
tvancott42 Nov 2, 2026
88a7727
Change Control - Edit: search fields and values across every collection
tvancott42 Nov 2, 2026
7c7a024
Change Control - Edit: the search finds collections and lists by the …
tvancott42 Nov 2, 2026
b980953
Change Control - Edit: the Collections search runs as you type
tvancott42 Nov 2, 2026
5148e11
Change Control: a gateway block is a lockout only from the zone Netwo…
tvancott42 Nov 2, 2026
36d01f3
Change Control - Edit: search aliases for routing and load balancing …
tvancott42 Nov 2, 2026
f9f8efb
Change Control: lockout checks judge the address Network Optimizer re…
tvancott42 Nov 2, 2026
014050e
Change Control - Edit: device kind and DNS server search aliases; a c…
tvancott42 Nov 2, 2026
a7e49e3
Change Control - Edit: search aliases derived from a full site config
tvancott42 Nov 2, 2026
4b0d975
Change Control - Edit: "bandwidth" search alias
tvancott42 Nov 2, 2026
79af8a6
Change Control - Edit: search finds a Wi-Fi channel width by bw80 or …
tvancott42 Nov 2, 2026
30c352c
Change Control - Edit: "local DNS" and "LAN DNS" find a LAN's DNS ser…
tvancott42 Nov 2, 2026
1a3fac3
Change Control - Edit: "dns1" finds dhcpd_dns_1; device DNS aliases
tvancott42 Nov 2, 2026
c0850e5
Path Localization: a resumed episode's server vantage follows the sit…
tvancott42 Nov 3, 2026
1392bea
Path Localization: hop RTT reads each trace, so a slowdown that comes…
tvancott42 Nov 3, 2026
c2579a9
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
598c45c
Path Localization: pairing needs a clean point, so Starlink jitter is…
tvancott42 Nov 3, 2026
e8c1447
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
eb83437
Path Localization: a start placed only by trace pairing stays Unverif…
tvancott42 Nov 3, 2026
4f2fffc
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
9eee0f7
Path Localization: a hop shared by several destinations is not Confir…
tvancott42 Nov 3, 2026
b04203c
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
bf19430
Path Localization: hop RTT "normal" never reads above most of the hop…
tvancott42 Nov 3, 2026
86b44d1
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
964c7f8
Path Localization: an episode does not open on an access-link swing (…
tvancott42 Nov 3, 2026
24c2706
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
752f11b
Security Audit: a deny on INVALID packets no longer reads as shadowin…
tvancott42 Nov 3, 2026
b5a417f
Security Audit: rule-order and eclipse checks honor connection state …
tvancott42 Nov 3, 2026
d006fa2
Security Audit: a run that loses the UniFi Console connection is not …
tvancott42 Nov 3, 2026
6b0fea5
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
6154ba4
Performance Tweaks: verify UniFi OS 6.0.17 on the UCG-Fiber
tvancott42 Nov 3, 2026
6e1d7b1
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
58ba1d8
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
2a501e5
Security Audit: a source-port-only allow's Rule Order Issue says why …
tvancott42 Nov 3, 2026
e4dd0c9
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
ca27ef6
Security Audit: a source-port-only allow's Rule Order Issue costs 2 p…
tvancott42 Nov 3, 2026
a187bbd
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
083db31
Versions: preview9 is below preview15 in the update notice and the ag…
tvancott42 Nov 3, 2026
65357f3
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
3735246
Date & Time: show times on the viewer's clock, with a per-user and in…
tvancott42 Oct 27, 2026
c9d2e98
Notifications: write times on a notification clock, labeled
tvancott42 Oct 27, 2026
b676ae9
Date & Time: hardening, review fixes, and Path Localization on the vi…
tvancott42 Oct 27, 2026
e086522
Time zone: pages and alerts read each site's own time zone by default
tvancott42 Nov 3, 2026
17752ca
Time zone: Change Control on the viewer's and the site's clocks
tvancott42 Nov 3, 2026
25e016b
Time zone: site-local schedules and billing on the site's clock
tvancott42 Nov 3, 2026
206b78c
Time zone: charts on the viewer's clock
tvancott42 Nov 3, 2026
8643ab4
Date & Time: each viewer's time and date format
tvancott42 Nov 3, 2026
acefc88
A page whose first circuit fails to start says so instead of staying …
tvancott42 Nov 3, 2026
ed47477
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
724ce80
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
284dbb4
Web Application Firewall: offer netopt-waf 1.0.4
tvancott42 Nov 3, 2026
98d693c
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
6177c22
Traces: run BusyBox's traceroute applet where no traceroute binary ex…
tvancott42 Nov 3, 2026
a886daa
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
1572b43
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
c70bcec
Change Control: smaller value text on the Last Network App Upgrade card
tvancott42 Nov 3, 2026
c797372
UniFi Console: reconnect a lost console whatever else is enabled
tvancott42 Nov 3, 2026
d0382f3
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
c92fcf6
Change Control: a console that is back shows no unreachable item
tvancott42 Nov 3, 2026
ca5243c
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
e40ff04
UniFi Console Connection: remove Remember credentials
tvancott42 Nov 3, 2026
e5985ff
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
eb91015
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
64f3eee
UniFi Console: log out at the path the sign-in used
tvancott42 Nov 3, 2026
9f20530
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
327d149
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
633e244
Security: Go builds move to 1.27, the speedtest image takes Alpine fi…
tvancott42 Nov 3, 2026
390be43
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
4ec48b8
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
52c8d0c
Settings: password managers no longer fill the InfluxDB fields
tvancott42 Nov 3, 2026
4530a84
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
2ae54c9
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
ce20cf9
Password managers no longer fill credential fields for other systems
tvancott42 Nov 3, 2026
dd4e851
AP Agent: a version bump reaches a large site in one pass, and a cut-…
tvancott42 Nov 3, 2026
121c157
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 3, 2026
6612b63
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 3, 2026
c582fbe
ThreatBlockingRegistrationTests: register ISiteTimeZones, which AddTh…
tvancott42 Nov 3, 2026
ac775c3
Network Performance: a changed time range consumes the link that set …
tvancott42 Nov 4, 2026
14283a0
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
a7adc37
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
dd170bb
Device Stats: WAN Throughput chart when the gateway is the only devic…
tvancott42 Nov 4, 2026
d3d9d6b
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
cccc006
Starlink: lower_signal_than_predicted needs obstruction or SNR behind…
tvancott42 Nov 4, 2026
60cda62
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
dd0bd6c
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
77ec704
Starlink: state what the data shows about lower_signal_than_predicted…
tvancott42 Nov 4, 2026
59f97f0
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
31be1f6
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
686dc63
Starlink: weather sets lower_signal_than_predicted; restore the cause…
tvancott42 Nov 4, 2026
5aad6de
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
c25a3d4
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
6efc374
Threat Intelligence: document that an exception save reprovisions the…
tvancott42 Nov 4, 2026
dac3be8
Threat Intelligence: document that an exception save reprovisions the…
tvancott42 Nov 4, 2026
38d8a58
ISP Health: one WAN counter per WAN, and WAN profiles store the conso…
tvancott42 Nov 4, 2026
7781eb7
Device Stats: WAN Throughput sums what the WAN live chart stacks for …
tvancott42 Nov 4, 2026
53ac7f3
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
a7c7c2f
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
bfeab50
Path Localization: a time-limited episode stays the only one after a …
tvancott42 Nov 4, 2026
d6d5c79
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
1698c80
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
93e0159
ISP Health: a traced route change shows once, as its path shift with …
tvancott42 Nov 4, 2026
d531afd
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
8c802de
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
3cfd03f
Threat Intelligence: a public block list contact a Blocking exception…
tvancott42 Nov 4, 2026
693fa07
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
91722cc
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
142e6a6
Threat Intelligence: test that a Blocking exception silences only the…
tvancott42 Nov 4, 2026
1b6f05f
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
e3bddf7
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
8b4ff0a
Firmware Rollout: a moved start updates its open alerts, and a stale …
tvancott42 Nov 4, 2026
fd6e01b
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
188c19a
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
b377309
TODO: an install default date and time format for alert text
tvancott42 Nov 4, 2026
2ed457d
Live charts: the WAN and Client Performance live tick labels follow t…
tvancott42 Nov 4, 2026
52e7a2f
Date & Time: charts keep ApexCharts' own time scale on the viewer's c…
tvancott42 Nov 4, 2026
b136d73
Threat Intelligence: Filters toggle tooltip says it changes only your…
tvancott42 Nov 4, 2026
b8093ca
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
ba6e729
Alerts: webhook and Discord timestamps always carry their UTC marker
tvancott42 Nov 4, 2026
0ddebd9
Charts: ApexCharts' own axis whenever the viewer reads the browser's …
tvancott42 Nov 4, 2026
71fddbf
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
b246d44
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
4ea1dd7
Alerts tests: the webhook UTC tests pass the zone and format the chan…
tvancott42 Nov 4, 2026
b033fd9
Charts: time-axis labels at a readable density, evenly spaced, always…
tvancott42 Nov 4, 2026
15fd8b4
Charts: a day axis marks the month change as "Nov '26" and the new ye…
tvancott42 Nov 4, 2026
241d2bf
Charts: time-axis labels one step denser (about one per 85px)
tvancott42 Nov 4, 2026
3d49ad0
Charts: half-hour time-axis labels for windows up to 12 hours (6h was…
tvancott42 Nov 4, 2026
8624b78
Charts: midday marks on 7d, the month change reads "Nov '26" on every…
tvancott42 Nov 4, 2026
0857dce
Performance Tweaks: UXG-Fiber and UXG-Max verified through UniFi OS 6…
tvancott42 Nov 4, 2026
6acdb20
Merge branch 'dev' into release/2.11
tvancott42 Nov 4, 2026
61f9d7d
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
b332af8
Firmware Rollout: Active Traffic before a scheduled start
tvancott42 Nov 4, 2026
72cd489
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
38b1bab
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
fd52706
Firmware Rollout: title the pre-start traffic card "Clear to Deploy?"
tvancott42 Nov 4, 2026
0bc8cae
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
6b85a44
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
4811553
SFP Stats: mark the host device's reboots and events when one device …
tvancott42 Nov 4, 2026
e884538
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
29be753
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
6a267d7
Performance Tweaks: note the live UXG-Fiber 6.0.17 check in the firmw…
tvancott42 Nov 4, 2026
a8e97cf
Merge branch 'dev' into release/2.11
tvancott42 Nov 4, 2026
15cb24d
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
ac9ed24
ISP Health: access latency is the floor across all access hops (#1348)
tvancott42 Nov 4, 2026
9e67f72
SFP Stats: match host device events on the builder's MAC form
tvancott42 Nov 4, 2026
ce1af3a
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
4889780
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
9204ef8
Site Health: Internet latency is the access floor across all access hops
tvancott42 Nov 4, 2026
1007e3c
Merge remote-tracking branch 'origin/release/2.11' into feature/displ…
tvancott42 Nov 4, 2026
2e27de9
ISP Health: outage hop status column fits the 12-hour "back @ 12:59:5…
tvancott42 Nov 4, 2026
5d25cd2
ISP Health: outage hop status column is 7rem on 24-hour clocks, 9rem …
tvancott42 Nov 4, 2026
79cc851
Merge pull request #1322 from Ozark-Connect/feature/display-timezone
tvancott42 Nov 4, 2026
cde2c74
Agent: LatestAgentVersion 2.10.7 (traces from a gateway Agent's Multi…
tvancott42 Nov 4, 2026
8f6f09e
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
91720e1
Agent: LatestAgentVersion 2.11.0-preview18 (traces from a gateway Age…
tvancott42 Nov 4, 2026
9169588
Notifications: ResolveFormatAsync takes the site, as ResolveAsync does
tvancott42 Nov 4, 2026
79904e4
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
1b1a239
SFP Stats, ONT Stats: mark ONT reboots
tvancott42 Nov 4, 2026
ac8c963
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 4, 2026
2dac4fd
Sparklines on the Dashboard signal cards and Live View tiles; ISP lat…
tvancott42 Nov 5, 2026
e0a1478
Feature index: Live View tile sparklines and the ISP access floor on …
tvancott42 Nov 5, 2026
c0b8023
Live View: tile sparklines run from the left edge on mobile, 0.2rem s…
tvancott42 Nov 5, 2026
953d89b
Live View: tile sparklines start 0.1rem from the left on desktop
tvancott42 Nov 5, 2026
8019b0f
Sparklines: a gap breaks the line only when it is long for that series
tvancott42 Nov 5, 2026
bb656ab
ISP Loss: fall back to the access hops' mean where the floor's loss h…
tvancott42 Nov 5, 2026
63419c3
Site Health: name the measure and keep the card's scopes apart
tvancott42 Nov 5, 2026
390aa02
Live View: tiles ride through a console or agent tunnel reconnect
tvancott42 Nov 5, 2026
d2337ff
Change Control: a change to an unused WAN profile is not a lockout on…
tvancott42 Nov 5, 2026
504be57
Security Audit: check the gateway enforces what UniFi Network says (#…
tvancott42 Nov 5, 2026
63400d9
Agent: LatestAgentVersion 2.11.0-preview19 (Automatic Blocking hooked…
tvancott42 Nov 5, 2026
e965165
Change Control: pre-flight for WAN record changes on every site
tvancott42 Nov 5, 2026
0f4072f
Change Control: a WAN change on a direct site is a possible lockout
tvancott42 Nov 5, 2026
d4d6a43
Fixed Multi-Site enable checkbox race bug
tvancott42 Nov 5, 2026
b7140df
Fixed Multi-Site enable checkbox race bug
tvancott42 Nov 5, 2026
d4247e2
Security Audit: a WAN zone ID that matches no zone uses the External …
tvancott42 Nov 7, 2026
803b513
ISP Health: singular 'path' when one monitored path stayed clean
tvancott42 Nov 7, 2026
e54c593
Change Control: YAML downloads show a spinner while the export builds
tvancott42 Nov 7, 2026
55f9a72
ISP Health: loaded latency with an outlier path is no longer blamed o…
tvancott42 Nov 7, 2026
7d45832
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 7, 2026
5c4cc74
ISP Health: ICMP-noise wording for a hop above a load floor
tvancott42 Nov 7, 2026
87fb9f3
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 7, 2026
e6c4cb1
Settings - Application: help text under Default time format, one per …
tvancott42 Nov 7, 2026
166191a
Date & Time: ISO 8601 date format (2026-11-03)
tvancott42 Nov 7, 2026
30d6200
Date & Time: PDF headers join date and time per format (no comma for …
tvancott42 Nov 7, 2026
8809421
RF Environment: Site Access Points card, and one own-network rule (#1…
tvancott42 Nov 7, 2026
ae137d5
Change Control: WAN Latency and WAN Loss lanes draw middle-band windo…
tvancott42 Nov 7, 2026
cca1d4f
Change Control: acronym labels, and LTE/5G backup modems written as U…
tvancott42 Nov 7, 2026
2853222
Upstream Discovery: wait for a quiet WAN, pause a target only after t…
tvancott42 Nov 7, 2026
f0d7109
Wi-Fi Optimizer: busy-radio, channel, and Site Health recommendations…
tvancott42 Nov 7, 2026
ec1ee95
Firmware Rollout: share Network builds per platform, real URLs only (…
tvancott42 Nov 7, 2026
6731161
ISP Health: route changes are Path shifts, not congestion (#1360)
tvancott42 Nov 7, 2026
3f147ce
Wi-Fi Optimizer: Site Access Points shows siblings last heard up to a…
tvancott42 Nov 7, 2026
a318951
Wi-Fi Optimizer: Channels 5 GHz score colors fit real sites, and matc…
tvancott42 Nov 8, 2026
9b1ebc9
Wi-Fi Optimizer: Site Access Points names mesh backhaul and hidden VAPs
tvancott42 Nov 8, 2026
f1109d3
Wi-Fi Optimizer: Site Access Points labels the UniFi Auto-Link VAP
tvancott42 Nov 8, 2026
fbb74f1
Wi-Fi Optimizer: RF Environment AP names filter the page
tvancott42 Nov 8, 2026
477ee02
Wi-Fi Optimizer: RF Environment wide-channel finding and AP filter chip
tvancott42 Nov 8, 2026
a64317d
Change Control: renaming a network is not a Security Audit fix plus r…
tvancott42 Nov 8, 2026
5996a30
Wi-Fi Optimizer: RF Environment Heard By names the loudest two, and a…
tvancott42 Nov 8, 2026
7dd9f24
Wi-Fi Optimizer: RF Environment AP names are pills, and the active on…
tvancott42 Nov 8, 2026
ebad177
Wi-Fi Optimizer: Channel {ch} is congested counts what that channel's…
tvancott42 Nov 8, 2026
523924a
Tour v2.11.0: Site Access Points (minor, improved)
tvancott42 Nov 8, 2026
668a028
Firmware Rollout: History pages instead of stopping at the newest 20
tvancott42 Nov 8, 2026
58e30f5
Firmware Rollout: History reads Stopped for a rollout an admin stopped
tvancott42 Nov 8, 2026
d7cfb6d
ISP Health: Acknowledge a recurring path finding that cannot be pinne…
tvancott42 Nov 8, 2026
d3c955d
FEATURES.md: Upstream Path Discovery health gate, busy-radio issue, a…
tvancott42 Nov 8, 2026
1fb72e1
ISP Health: Acknowledge in the finding's corner, and under a traced e…
tvancott42 Nov 8, 2026
9e36375
ISP Health: acknowledged findings leave the events list and chart; on…
tvancott42 Nov 8, 2026
dfc8b73
ISP Health: the Acknowledged event pill is an on/off switch, not a ca…
tvancott42 Nov 8, 2026
d6eca43
ISP Health: an acknowledged finding's episodes no longer raise the to…
tvancott42 Nov 8, 2026
4b56aff
ISP Health: the banner checks each episode against acknowledged findi…
tvancott42 Nov 8, 2026
37a3928
ISP Health: on a phone, an off event pill no longer keeps the tapped …
tvancott42 Nov 8, 2026
ce68e2e
Agent tunnel: a dial in the reconnect gap waits for the tunnel
tvancott42 Nov 8, 2026
918253e
Change Control - Snapshots: an action's error shows in the card of it…
tvancott42 Nov 8, 2026
825f6ba
Change Control: note that a network's LTE/5G backup modem list is adm…
tvancott42 Nov 8, 2026
4cdf22d
Agent tunnel: no reconnect wait after a silent tunnel is reaped; a ca…
tvancott42 Nov 8, 2026
28d429a
Change Control - Snapshots: every action's error shows next to its co…
tvancott42 Nov 8, 2026
4745d39
Change Control: a small YAML object keeps one key order, whatever ord…
tvancott42 Nov 8, 2026
d6ba917
Change Control: the LTE/5G modem list note says an upgrade can fill i…
tvancott42 Nov 8, 2026
6706070
Change Control - Templates: space between a template's name and its B…
tvancott42 Nov 8, 2026
b192081
Change Control: Compare, YAML, and templates refuse a live config tha…
tvancott42 Nov 8, 2026
5d58ae0
Change Control - Snapshots: Take Snapshot says when it could not read…
tvancott42 Nov 8, 2026
27e02ce
Change Control: every action that builds from the live config refuses…
tvancott42 Nov 8, 2026
7dc1220
Change Control - Edit: the toolbar's buttons stay right-aligned when …
tvancott42 Nov 8, 2026
e56d160
Sites: switching sites on Review Plan opens Change Control on the new…
tvancott42 Nov 8, 2026
09cbe9c
Sites: the nav bar site switcher drops what belongs to the site being…
tvancott42 Nov 8, 2026
e18bd9a
Firmware Rollout: an SSH install start returns at once, and the page …
tvancott42 Nov 8, 2026
72ce7e0
Firmware Rollout: tests for the start sequence and the Rollout Starti…
tvancott42 Nov 8, 2026
de5967f
AP Telemetry creates missing InfluxDB buckets; Add a site connects th…
tvancott42 Nov 8, 2026
134b1d7
Firmware Rollout: a failed backup before an SSH install says no backu…
tvancott42 Nov 8, 2026
0889aaf
Tour: the Site Access Points step requires AP Telemetry
tvancott42 Nov 8, 2026
1e7e6b1
Feature index: Firmware Rollout history is paged; AP Telemetry create…
tvancott42 Nov 8, 2026
5b0d3b3
Multi-Site: the Name step's step bar shows Agent before Console when …
tvancott42 Nov 8, 2026
d56c0eb
Re-address Networks: devices find the Console at its new address (#1370)
tvancott42 Nov 9, 2026
b96c177
Netgear CM: Genie sign-in for CM1000 firmware V7.01.01 (#1369)
tvancott42 Nov 9, 2026
afc3490
Update Docker Pulls badge in README
tvancott42 Nov 4, 2026
1127a2f
README: add missing modems and ONTs to Access Network Monitoring (Uni…
tvancott42 Nov 8, 2026
1b2c3b2
README: credit uci-inform-exporter on the UniFi Cable Internet bullet
tvancott42 Nov 8, 2026
ab8dc70
Merge remote-tracking branch 'origin/dev' into release/2.11
tvancott42 Nov 9, 2026
d7638ac
ONT Stats: Peter-Pon GPON firmware (Lantiq PEB98035 sticks) (#1368)
tvancott42 Nov 9, 2026
60454ba
ISP Health: a tracing episode on an Acknowledged finding's Targets ra…
tvancott42 Nov 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
111 changes: 100 additions & 11 deletions FEATURES.md

Large diffs are not rendered by default.

14 changes: 9 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# Network Optimizer for UniFi

[![GitHub Release](https://img.shields.io/github/v/release/Ozark-Connect/NetworkOptimizer)](https://github.com/Ozark-Connect/NetworkOptimizer/releases)
[![Docker Pulls](https://img.shields.io/badge/docker_pulls-767k-blue?logo=docker)](https://github.com/orgs/Ozark-Connect/packages?repo_name=NetworkOptimizer)
[![Docker Pulls](https://img.shields.io/badge/docker_pulls-803k-blue?logo=docker)](https://github.com/orgs/Ozark-Connect/packages?repo_name=NetworkOptimizer)
[![Windows Downloads](https://img.shields.io/github/downloads/Ozark-Connect/NetworkOptimizer/total?label=windows%20downloads)](https://github.com/Ozark-Connect/NetworkOptimizer/releases)
[![GitHub last commit](https://img.shields.io/github/last-commit/Ozark-Connect/NetworkOptimizer)](https://github.com/Ozark-Connect/NetworkOptimizer/commits)
[![GitHub Stars](https://img.shields.io/github/stars/Ozark-Connect/NetworkOptimizer)](https://github.com/Ozark-Connect/NetworkOptimizer/stargazers)
Expand Down Expand Up @@ -108,6 +108,7 @@ Track signal quality on your cable modem, fiber ONT, and cellular modems over ti
- **Vodafone Station** - ARRIS TG3442DE
- **Sagemcom** - F3896LG (Virgin Media Hub 5, Ziggo SmartWifi)
- **FRITZ!Box Cable** - 6690 Cable (FRITZ!OS 8.40)
- **UniFi Cable Internet** - through an On-Site Agent on the gateway (thanks to robry84, whose [uci-inform-exporter](https://gitlab.com/robry84/uci-inform-exporter) we checked our inform decoding against)

![Cable Modem Stats card with downstream SNR gauge, channel counts, power levels and FEC error counts](docs/images/cable-modem-stats.png)

Expand All @@ -117,9 +118,11 @@ Track signal quality on your cable modem, fiber ONT, and cellular modems over ti
- **Quantum Fiber** - Q1000K SmartNID (CenturyLink)
- **Nokia** - XS-010X-Q (Alcatel-Lucent, ALCL). GPON siblings (G-010S-P, G-010G-Q) may share the same GponForm API - untested, reports welcome
- **Deutsche Telekom** - Glasfaser-Modem 2 (FTTH bridge mode)
- **Realtek-based GPON sticks** (RTL960x) - ODI DFP-34X-2C2, V-SOL V2801F, T&W TWCGPON657
- **Richerlink** - RL821GWV-D
- **Realtek-based GPON sticks** (RTL960x) - ODI DFP-34X-2C2, ODI DFP-34X-2IY3, V-SOL V2801F, T&W TWCGPON657, Luleey LL-XS2510
- **Zyxel GPON stick** - PMG3000-D20B (MaxLinear / T&W based)
- **8311 community firmware XGS-PON sticks** - WAS-110 (MaxLinear PRX126), X-ONU-SFPP, WT-ONU-STICK, and other sticks running 8311
- **Peter-Pon firmware GPON sticks** - FS.com GPON-SFP-ONT-MAC-I, Huawei MA5671A, and other Lantiq PEB98035 sticks

SFP-based ONT monitoring (modules plugged into your gateway that expose DDM optical data) is part of the Network Monitoring feature below and also has a custom ONT stats augmentation API you can code to.

Expand All @@ -128,9 +131,10 @@ SFP-based ONT monitoring (modules plugged into your gateway that expose DDM opti
**Cellular Modems** - RSRP, RSRQ, SNR, and Signal Quality charted over time with per-band, per-device series and filter badges.

- **Ubiquiti** - U-LTE, U5G-Max, U5G-Backup, and the UDR-5G-Max's built-in modem (over Gateway SSH)
- **Netgear Nighthawk** - modems and hotspots
- **GL-iNet / Quectel** - modems and routers
- **Netgear Nighthawk** - modems and hotspots (MR5200, M6)
- **GL-iNet / Quectel** - modems and routers (GL-X3000, GL-XE3000, GL-X2000, GL-E750V2, GL-E5800 Mudi 7)
- **Inseego** - FX4100 5G gateway
- **MikroTik** - RouterOS 7 LTE/5G routers over SSH
- **Zyxel** - NR7101, NR7102, NR7301, NR7302, NR7303, NR5103E, NR5103 v2, NR5307, FWA505, FWA510, FWA710, LTE3202, LTE5398, LTE7490

Dual-connectivity mode tracks LTE and NR5G bands separately for NSA setups.
Expand Down Expand Up @@ -171,7 +175,7 @@ These are the highlights. For the complete list, organized the way the app is na

### Wi-Fi Optimizer & Signal Map

Site health scoring, RF environment analysis, client stats, roaming tracking, band steering, and airtime fairness across twelve analysis tabs. Most channel pickers count nearby networks. Channel Recommendation models your RF physically: propagation from your floor plan, walls, and antenna patterns, each AP's real transmit power, and contention judged at the CCA threshold where radios actually defer. Add measured airtime, noise floor, triangulated neighbors, and months of how your own channels performed, and it solves for the least-interference plan across the whole site. Every move must clear its own improvement bar and never lands on a channel that measures worse, and mesh, DFS, and pins are respected. Apply Recommended Channels writes the plan to UniFi Network in waves, so a client always has a neighbor to roam to.
Wi-Fi health scoring, RF environment analysis, client stats, roaming tracking, band steering, and airtime fairness across twelve analysis tabs. Most channel pickers count nearby networks. Channel Recommendation models your RF physically: propagation from your floor plan, walls, and antenna patterns, each AP's real transmit power, and contention judged at the CCA threshold where radios actually defer. Add measured airtime, noise floor, triangulated neighbors, and months of how your own channels performed, and it solves for the least-interference plan across the whole site. Every move must clear its own improvement bar and never lands on a channel that measures worse, and mesh, DFS, and pins are respected. Apply Recommended Channels writes the plan to UniFi Network in waves, so a client always has a neighbor to roam to.

On the client side, you get a sortable, searchable table view with online/offline filtering, per-client signal and roaming history, and band-segmented Wi-Fi generation breakdowns showing exactly where your airtime is going. Environmental correlation heatmaps surface interference patterns by time of day and day of week, and every recommendation includes the specific UniFi Network UI navigation path to apply the change.

Expand Down
45 changes: 45 additions & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ through our own SSH-deployed components, where we control the format and the rol
MLO-enabled WLANs. The WiFi Optimizer health issue has not adopted it - `WiFiOptimizerService` still
flags MLO from `hasWifi7Aps && hasMloEnabledWlan` (any AP + any WLAN), so an AP that broadcasts no
MLO SSID is still counted. Reuse the path-analysis pattern.
- **Propagation calibration from sibling sightings** - an AP's scan radio hears every sibling AP's BSSIDs
with a real signal level (`NeighborNetwork.IsSiteBssid`, shown on RF Environment's Site Access Points
card). That is measured AP-to-AP path loss. It could calibrate the propagation model, and stand in for
floor-plan placement on sites without one.
- **MLO STR mesh backhaul (multi-band):** Channel recommendations pin a mesh child to its leader's channel only on the single band `AccessPointSnapshot.MeshUplinkBand` reports. AP-to-AP MLO STR backhaul can run over multiple bands at once (e.g. 5 + 6 GHz). When UniFi exposes per-link bands, make `MeshUplinkBand` a set and have `BuildMeshConstraints` emit one constraint per participating band. The reconciliation logic in `ChannelRecommendationService` keys off `MeshGroupLeader` and needs no change - only the constraint-building. See `TODO(MLO)` in `BuildMeshConstraints`. Dormant: no AP-to-AP MLO STR backhaul hardware exists yet (today's MLO STR is client/bridge only - UDB-Switch and AirWire, the MLO STR bridge - which are endpoints, not mesh-AP children, so they never hit this path).

### AP Catalog: Enforce 5 GHz EIRP Cap (US Regulatory)
Expand Down Expand Up @@ -404,6 +408,14 @@ all - it is collected and never shown. Either surface it or drop the field.
- **Affected code:** `Alerts.razor: FormatStartTime()`, `UtcToLocalTimeOnly()`, `ParseTimeInput()`
- **Options:** Store IANA timezone per schedule, use `TimeZoneInfo.ConvertTimeFromUtc`, or store local time + timezone

### Default date and time format for alert text
- Alert text is written once, for no viewer, so its times are 24-hour on every install
- Settings has an install-wide **Default time zone**, which the notification clock already falls back to (`NotificationTimeZoneResolver`); the time format and date order have no install default, only each user's own choice (`ITimeZonePreferenceSource.GetOwnFormatAsync`)
- Two places format alert times without a viewer:
- Rollout alert copy (`RolloutScopeCopy.AlertStartLabel`, `Moved`) uses `DisplayFormat.Fallback` (24-hour, month first)
- The Email, Slack, Teams, Discord, and ntfy channels stamp times with `TimestampFormatter`, which hard-codes `yyyy-MM-dd HH:mm:ss` and `HH:mm`
- **Fix:** add a default time format and date order beside **Default time zone**, resolve it with the notification clock, and use it in both places

### Threat Alert Dedup Tuning (if users report noise)

Current state (as of v1.5.x): Dedup is working - event-level dedup via InnerAlertId, pattern-level dedup via DedupKey with 6h merge window, rule-level cooldown at 1h. No spam reported yet, but here are levers to pull if it gets noisy:
Expand Down Expand Up @@ -1448,3 +1460,36 @@ The Threat Intelligence noise filters no longer apply to WAF events (`ThreatRepo
they describe IPS flows, and a WAF event's port 443 is a placeholder, so "my phone, port 443" hid
every WAF event from that phone. If the WAF page needs a hide-this-source control, give it filters of
its own (source, host, rule) rather than reusing the IPS ones. False positives belong in exclusions.

## Change Control: auto-revert for changes made in UniFi Network

The auto-revert covers plans applied through Change Control: if a plan cuts the site or a device off
from Network Optimizer, it rolls itself back (the On-Site Agent does it on an agent site). A change
made directly in UniFi Network (the console UI, the mobile app, another integration) has no such
safety net, though Change Control records it within a poll.

Offer the same trigger for those: when a recorded change is followed by the site or its devices
dropping off, roll that change back automatically, or offer the Roll Back in the alert. Open
questions: opt-in per site, since the operator made the change on purpose and may be mid-work; how
long to wait after the change before treating a drop as caused by it; and telling a change-caused
drop from an unrelated outage (ISP Health already separates ISP from local).

## User setting: 12-hour or 24-hour clock, everywhere

Times are formatted inline today and the two styles are mixed: about 30 server-side format strings
use a 12-hour clock (`h:mm tt`) and about 120 use 24-hour (`HH:mm`), and roughly 18 JS files format
times on their own (ApexCharts axes and tooltips, `toLocaleTimeString`, hand-built labels). Add a
per-user preference (`IUserPreferences`, falling back to the install-wide value) for 12- or 24-hour,
and route every displayed time through it.

- **Server:** `TimeFormatHelper` holds the one time format (`FormatLocalDateTime` and friends, added
2026-10-31 for Change Control) and reads the preference; the inline `h:mm tt` / `HH:mm` strings in
C# and Razor move onto it. `CcFormat` already delegates there.
- **JS:** one shared formatter module that chart and page scripts import (axis labels, tooltips,
table cells), fed the preference from Razor on page load, so a chart and the card beside it agree.
- **Out of scope:** outbound notifications (alerts to email, Slack, and other channels) go to people
who are not signed-in users, so they keep the install default; logs, CSV/PDF exports, and API
responses keep fixed formats a machine can read.

Open question: whether the same setting should choose the date order too (Oct 31 vs 31 Oct), since
the formats are being centralized anyway.
38 changes: 38 additions & 0 deletions scripts/build-codemirror-bundle.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Rebuilds the vendored CodeMirror 6 bundle used by Change Control's YAML editor.
# Output: src/NetworkOptimizer.Web/wwwroot/lib/codemirror/codemirror.bundle.js (+ LICENSE).
# Needs Node and npm. Installs from scripts/codemirror-bundle/package-lock.json (every transitive
# version pinned) with install scripts off, in a temp folder; nothing is installed into the repo.
# After a rebuild, bump the ?v= on the bundle import in wwwroot/js/cc-editor.js.
param([switch]$UpdateLock)
$ErrorActionPreference = 'Stop'

$repo = Split-Path -Parent $PSScriptRoot
$pkgDir = Join-Path $PSScriptRoot 'codemirror-bundle'
$out = Join-Path $repo 'src/NetworkOptimizer.Web/wwwroot/lib/codemirror'
$work = Join-Path ([System.IO.Path]::GetTempPath()) "cm-bundle-$([guid]::NewGuid().ToString('N'))"
New-Item -ItemType Directory -Force $work, $out | Out-Null

Push-Location $work
try {
Copy-Item (Join-Path $pkgDir 'package.json'), (Join-Path $pkgDir 'entry.js') .
if ($UpdateLock -or -not (Test-Path (Join-Path $pkgDir 'package-lock.json'))) {
npm install --package-lock-only --ignore-scripts --no-audit --no-fund | Out-Null
Copy-Item package-lock.json (Join-Path $pkgDir 'package-lock.json')
}
else {
Copy-Item (Join-Path $pkgDir 'package-lock.json') .
}
npm ci --ignore-scripts --no-audit --no-fund | Out-Null
# esbuild's binary comes from an optional platform package, which ci installs without scripts.
npx --no-install esbuild entry.js --bundle --format=esm --minify --legal-comments=eof --outfile=bundle.js
$pkg = Get-Content package.json -Raw | ConvertFrom-Json
$versions = ($pkg.dependencies.PSObject.Properties | Where-Object Name -ne 'esbuild' | ForEach-Object { "$($_.Name)@$($_.Value)" }) -join ', '
$header = "/* CodeMirror 6 bundle for Change Control (MIT; licenses at the end and in LICENSE). Built by scripts/build-codemirror-bundle.ps1 from: $versions */`n"
Set-Content -Path (Join-Path $out 'codemirror.bundle.js') -Value ($header + (Get-Content bundle.js -Raw)) -Encoding utf8 -NoNewline
Copy-Item node_modules/codemirror/LICENSE (Join-Path $out 'LICENSE')
}
finally {
Pop-Location
Remove-Item -Recurse -Force $work
}
Get-Item (Join-Path $out 'codemirror.bundle.js') | Select-Object Name, Length
12 changes: 12 additions & 0 deletions scripts/codemirror-bundle/entry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// What cc-editor.js imports from the bundle. Add an export here, then rebuild.
export { EditorView, keymap, hoverTooltip, Decoration, WidgetType, ViewPlugin, MatchDecorator, gutter, GutterMarker } from '@codemirror/view';
export { EditorState, Compartment, StateEffect, StateField, Prec, RangeSetBuilder, Text } from '@codemirror/state';
export { basicSetup } from 'codemirror';
export { indentWithTab } from '@codemirror/commands';
export { indentUnit, syntaxHighlighting, HighlightStyle, syntaxTree, codeFolding, foldEffect, unfoldEffect, foldedRanges } from '@codemirror/language';
export { autocompletion, completionKeymap, startCompletion, closeCompletion, completionStatus, currentCompletions, setSelectedCompletion } from '@codemirror/autocomplete';
export { linter, setDiagnostics, lintGutter } from '@codemirror/lint';
export { openSearchPanel } from '@codemirror/search';
export { Chunk } from '@codemirror/merge';
export { yaml } from '@codemirror/lang-yaml';
export { tags } from '@lezer/highlight';
Loading
Loading