<feed xmlns='http://www.w3.org/2005/Atom'>
<title>luci/modules/luci-mod-dashboard/htdocs, branch master</title>
<subtitle>Lua Configuration Interface (mirror)</subtitle>
<id>https://git.openwrt.org/project/luci/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/project/luci/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/'/>
<updated>2026-09-27T11:45:05Z</updated>
<entry>
<title>luci-mod-dashboard: preserve scroll position during polling</title>
<updated>2026-09-27T11:45:05Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-25T15:07:39Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=1958e9813502e0116471223776e95d9cdcd22332'/>
<id>urn:sha1:1958e9813502e0116471223776e95d9cdcd22332</id>
<content type='text'>
Rebuilding the dashboard on every poll discards DOM nodes, collapsing
document height and resetting vertical scroll position while reading tab
tables.

Keep persistent container shells in the root view and update table rows
in place following LuCI's table update pattern (cbi_update_table).
Preserve active tab selection, restore horizontal chart scroll offsets,
and isolate unsaved layout form edits across background poll ticks.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: show wireless band in Wireless detail tab</title>
<updated>2026-09-27T11:43:25Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-25T15:02:59Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=93db8b2628dd0909d1800e3fc44c8697f73fe530'/>
<id>urn:sha1:93db8b2628dd0909d1800e3fc44c8697f73fe530</id>
<content type='text'>
Add a Band column to the client table in the Wireless detail tab.
Map existing interface runtime frequencies to Sub-1, 2.4, 5, 6 and
60 GHz bands following Linux kernel wireless subsystem boundaries
(net/wireless/util.c and NL80211_BAND_S1GHZ), using a 2.312 GHz lower
bound for the 2.4 GHz band to accommodate extended channels (down to
channel -19 in ath9k/ath5k drivers), and displaying a dash when
unavailable.

Combine upload and download totals into one column to retain seven
columns.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: show IP addresses for wireless clients</title>
<updated>2026-09-23T15:52:08Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-22T11:58:20Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=f4f91aee257bab4eb9c6b7de6160cea294217956'/>
<id>urn:sha1:f4f91aee257bab4eb9c6b7de6160cea294217956</id>
<content type='text'>
Add an IP Address column to the wireless client table so users can
identify devices alongside their traffic without checking DHCP leases.

Match known host addresses by the client MAC and show at most one IPv4
and one IPv6 address, taking the first of each from the host hints after
excluding IPv6 link-local addresses. Show a dash when no address is known
and allow long addresses to wrap on narrow screens.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;

</content>
</entry>
<entry>
<title>luci-mod-dashboard: add live charts and a configurable layout</title>
<updated>2026-09-23T15:52:08Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-20T16:18:34Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=89764f4a69b8efa3fd3435a044c9c024d1109575'/>
<id>urn:sha1:89764f4a69b8efa3fd3435a044c9c024d1109575</id>
<content type='text'>
Add configurable dashboard cards and tabs, along with five-minute
WAN traffic, CPU and memory history charts. This includes:

- status cards for CPU, memory, load and uptime next to Internet, all
  of one shape: a title, a value and one line of text;
- charts of the WAN traffic and of CPU and memory usage over the last
  five minutes;
- a Layout tab to choose which cards, charts and tabs are shown and in
  what order, kept in UCI as dashboard.layout;
- the time a wireless client has been connected, in the tooltips of
  the wireless client data usage chart and in the client table;
- the IPv4 and the IPv6 address of the uplink on the Internet card,
  one line each, and the IPv6 address in the Internet tab.

The samples behind the charts are taken on the router by a small rpcd
ucode plugin, luci.dashboard, every five seconds whether or not
somebody is looking, so the charts are full whenever the page is
opened. It keeps the raw counters of /proc/stat, /proc/meminfo and
/proc/net/dev with the router's monotonic clock in a ring of 60
samples. The page fetches what is new since its last poll and takes
the differences, so a reload or a hidden tab leaves no gap and the
rates do not depend on the browser's timing. One pass takes 2 to 3 ms
on a quad-core IPQ60xx, about 0.07% of one core, and the ring about
360 kB of memory.

Includes declare their widgets with a slot, an order and whether they
show by default. An include with nothing on the page is not polled,
and polling stops while the page is hidden. The layout form is a
form.Map of three DynamicLists in the last tab; while it is open the
poll redraws the cards and charts only. ui.DynamicList greys out a
choice only once it is picked and always offers a custom value, so the
form marks the values a list starts out with and drops the custom
entry. All of it stays within luci-mod-dashboard.

Name the charts WAN traffic, Wireless client distribution and
Wireless client data usage to make their scope clear.

Remove &lt;code&gt; formatting for consistent data display in tab tables,
and add CPU usage breakdown tooltips to the total and per-core rows.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;

</content>
</entry>
<entry>
<title>luci-mod-dashboard: fix low contrast of muted elements</title>
<updated>2026-09-20T14:07:54Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-20T01:58:22Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=7c91cb278d7cf19878069a44d5d1992f65c4e315'/>
<id>urn:sha1:7c91cb278d7cf19878069a44d5d1992f65c4e315</id>
<content type='text'>
--dashboard-text-muted used --text-color-low, the step closest to the
page background, which left everything it paints hard to read: the
ifacebox property labels in the wireless tab, the chart axis ticks and
bar labels, the legends and the donut caption. They are all normal-size
text, so the token now takes --text-color-high and the muted look is
carried by size and weight instead of colour. The light fallback, used
by the themes that define no colour tokens, moves a step darker so it
stays legible on their grey card backgrounds as well.

The donut track and the no-signal bar are not text and must not follow
the token up to full emphasis. Both now use --dashboard-border, the
colour the chart gridlines already use.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: rework the layout using standard LuCI markup</title>
<updated>2026-09-17T20:01:15Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-17T05:14:07Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=1a7ea5810c48239b5835c300dbab351ac5f08157'/>
<id>urn:sha1:1a7ea5810c48239b5835c300dbab351ac5f08157</id>
<content type='text'>
Give each kind of data the form that suits it: a row of KPI cards for
the values you check at a glance, a row of charts for the per-client
data, and a tabbed panel for the details you look up once. Every field
the page showed before is still there, only shaped differently.

Build it from the markup LuCI and the themes already provide, so the
page takes the look of whatever theme it runs in instead of carrying
one of its own: .cbi-section with h3 and .cbi-section-descr for the
cards and KPI tiles, .cbi-map with a .cbi-map-tabbed group for the tab
panel and ui.tabs for its menu, .table with a .table-titles row and
cbi-rowstyle stripes for the tables, .ifacebox for the wireless radios,
the theme's .label for badges, and code, em, small and strong for
values. ui.tabs also keeps the selected tab across the poll re-render.

The charts are the one part LuCI has no component for, so they are
drawn in a new lib/charts.js as plain DOM and SVG, with no dependency.
Their colours, and the few rules left in custom.css, read the generic
LuCI colour variables. Not every theme defines those, so each one now
falls back to both a light and a dark literal, keyed on the theme's
darkmode attribute and on prefers-color-scheme. custom.css used to
fall back to light literals only, which left the page dark grey on
dark under a theme that has a dark mode but not the variables.

The five icons are redrawn as one stroke set and applied as a CSS
mask, so they take their colour from the theme as well.

The wireless signal is plotted as the RSSI the driver reports, in dBm,
rather than a percentage derived from an assumed noise floor, and
clients are graded against -67 dBm. Byte counters are formatted with
%1024.2mB and the traffic axis labelled in KiB/MiB/GiB, matching how
the status pages present the same values.

No new data is collected and no new ACL entry or RPC method is needed.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: retry failed include loads on the next poll</title>
<updated>2026-09-17T20:01:15Z</updated>
<author>
<name>Eamon Xiong</name>
</author>
<published>2026-09-17T05:14:02Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=a36da985d19b6ee7ad3f8d8d79b42ac621753f90'/>
<id>urn:sha1:a36da985d19b6ee7ad3f8d8d79b42ac621753f90</id>
<content type='text'>
A rejected load() latched the include's failed flag and nothing ever
cleared it, so one transient ubus error dropped that include from every
later poll cycle until the page was reloaded, and the rejection was
swallowed without a diagnostic. Reset the flag on each load pass and
log the error.

Signed-off-by: Eamon Xiong &lt;eamonxiong@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: fix word breaks</title>
<updated>2026-09-14T17:31:13Z</updated>
<author>
<name>Maxim Skokov</name>
</author>
<published>2026-06-28T12:17:42Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=31687c72dd619116f5e53d61372762cccfc34b96'/>
<id>urn:sha1:31687c72dd619116f5e53d61372762cccfc34b96</id>
<content type='text'>
word-break: break-all caused firmware version, model and architecture
strings to break at arbitrary character positions. Replace with
overflow-wrap: break-word and word-break: normal so strings only
break when they cannot fit on a single line.

Fixes openwrt/luci#7468.

Signed-off-by: Maxim Skokov &lt;skokov.m020709@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: correctness fixes</title>
<updated>2026-05-27T12:49:46Z</updated>
<author>
<name>Paul Donald</name>
</author>
<published>2026-05-25T22:42:01Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=d070b1db61f016ce25ea225d8d05cb6726ba1fb2'/>
<id>urn:sha1:d070b1db61f016ce25ea225d8d05cb6726ba1fb2</id>
<content type='text'>
Signed-off-by: Paul Donald &lt;newtwen+github@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-mod-dashboard: bug fixes and code cleanup</title>
<updated>2025-12-07T21:30:46Z</updated>
<author>
<name>Paul Donald</name>
</author>
<published>2025-12-07T21:30:46Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=16ee9c3e1fec34b9a389816b25b06fae19497496'/>
<id>urn:sha1:16ee9c3e1fec34b9a389816b25b06fae19497496</id>
<content type='text'>
Signed-off-by: Paul Donald &lt;newtwen+github@gmail.com&gt;
</content>
</entry>
</feed>
