<feed xmlns='http://www.w3.org/2005/Atom'>
<title>luci/applications, 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-19T17:56:54Z</updated>
<entry>
<title>luci-app-banip: sync with base package 1.9.0</title>
<updated>2026-09-19T17:56:54Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-19T17:56:54Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=39530b2b69e8882fb0b491a9ff631075e57f8ba5'/>
<id>urn:sha1:39530b2b69e8882fb0b491a9ff631075e57f8ba5</id>
<content type='text'>
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>luci-app-shunt: sync with base package 0.1.10-1</title>
<updated>2026-09-18T14:07:49Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-18T14:07:32Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=aef4a826321a18f26c86412801a539e3a78bd130'/>
<id>urn:sha1:aef4a826321a18f26c86412801a539e3a78bd130</id>
<content type='text'>
Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>luci-app-qosify: cut the cost of a poll tick</title>
<updated>2026-09-17T05:02:55Z</updated>
<author>
<name>Ash Clarke</name>
</author>
<published>2026-09-13T20:57:00Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=3791919f3eee317a59d4bebc5bea14a3fd9c9089'/>
<id>urn:sha1:3791919f3eee317a59d4bebc5bea14a3fd9c9089</id>
<content type='text'>
The page polls, so the work per tick matters on the targets this
package is aimed at. The tick no longer re-reads both config files and
rebuilds three fieldsets; it patches the service table cells and the
autostart button in place with dom.content.

The Status tab is the expensive one -- qosify-status forks tc twice per
active interface -- so it now fetches when the tab is opened rather
than on every page load, keeps its 10 s tick rather than picking up
L.env.pollinterval, paints the per-interface summary from ubus without
waiting on the fork, and patches the &lt;pre&gt; in place so a tick cannot
reset the scroll position while it is being read. Poll.step() holds the
next tick until the promise settles and an overlapping refresh is
dropped, so a fork slower than the interval skips ticks instead of
stacking up.

po/templates/qosify.pot regenerated with build/i18n-scan.pl.

Signed-off-by: Ash Clarke &lt;clarkeaj@hotmail.co.uk&gt;

</content>
</entry>
<entry>
<title>luci-app-qosify: follow LuCI UI conventions</title>
<updated>2026-09-17T05:02:55Z</updated>
<author>
<name>Ash Clarke</name>
</author>
<published>2026-09-13T20:56:57Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=b562acac48066c323bf472ccf3c9665e853e95d4'/>
<id>urn:sha1:b562acac48066c323bf472ccf3c9665e853e95d4</id>
<content type='text'>
Honour L.hasViewPermission() and disable the controls when the ACL is
read-only, replace the confirm() and alert() calls with ui.showModal
and ui.addNotification, drop the last innerHTML and the hand-rolled
escaper with it, build the tabs with ui.tabs.initTabGroup instead of a
hand-rolled show and hide, use the theme's cbi-button-* classes,
associate every label with its control, and put the remaining bare
strings through _() and N_(). Add the SPDX identifier.

The inline &lt;style&gt; becomes a shipped qosify.css loaded with L.resource.
That also changes the size of the three big boxes: both editors and the
tc output now take the viewport less the chrome above them, with
height: calc(100vh - ...), a min-height floor for short screens and
resize: vertical, instead of a fixed rows=28 textarea and an
auto-height block. rows=28 stays on the textareas as the fallback if
the sheet does not load.

Signed-off-by: Ash Clarke &lt;clarkeaj@hotmail.co.uk&gt;

</content>
</entry>
<entry>
<title>luci-app-qosify: stop a save overwriting the whole config</title>
<updated>2026-09-17T05:02:55Z</updated>
<author>
<name>Ash Clarke</name>
</author>
<published>2026-09-13T20:56:53Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=5b4ef8c2f633fe313ebbbd0b5056036c4afe6836'/>
<id>urn:sha1:5b4ef8c2f633fe313ebbbd0b5056036c4afe6836</id>
<content type='text'>
Quick Settings read /etc/config/qosify with L.resolveDefault(..., ''),
so a failed read fell through to setOpts()'s create path and replaced
the whole file with a single section, taking every class and the
defaults section with it. Fail the save instead, and refuse to write
when the file is non-empty on disk but came back empty. Both editors
now record the size and mtime they loaded from and prompt before
overwriting a file that changed underneath them, and a reload after a
save only refreshes the editor for the file just written, so unsaved
edits in the other one are no longer discarded. Saving an empty config
editor truncates the file, so that path takes both checks too: an
editor left empty by a failed read still carries the size and mtime
found on disk, so the prompt alone would let a wipe through.

Read the daemon's booleans the way the daemon reads them: ingress,
egress, nat, host_isolate and autorate_ingress go through
json_add_boolean, which converts with !!atoi(), so 'true' means off,
while disabled goes through config_get_bool, which accepts the word
forms. Warn when a value is neither.

Recognise UCI headers with a trailing comment or a ';' separator,
refuse to rewrite an option that is a list in that section, widen the
options lint from ' to every shell metacharacter (qosify assembles the
tc command and runs it with sh -c), parse raw DSCP values and ports
with strtoul(base 0) semantics, so 077 is 63 and 08 is not a number,
accept the tc rate forms the daemon accepts, and allow the IPv4-mapped
form for ipv6 rules, which inet_pton takes. Drop the w.option
fallback: qosify only reads options.

validateRules() no longer rejects a line with a single field: qosify
skips those, so ruleWarn() reports them as a warning instead of the
save being blocked. It rejects a line over 1023 characters instead,
which the rule loader reads in fixed-size chunks and would split.
Reset writes the two files in turn rather than in parallel and names
the one that failed, so a partial reset is no longer reported as a
success. Quick Add Config rejects a section name with invalid
characters instead of silently stripping them, and finds duplicates
from the parsed sections rather than a regex that matched one quoting
style.

Signed-off-by: Ash Clarke &lt;clarkeaj@hotmail.co.uk&gt;

</content>
</entry>
<entry>
<title>luci-app-qosify: move service control and status onto ubus</title>
<updated>2026-09-17T05:02:55Z</updated>
<author>
<name>Ash Clarke</name>
</author>
<published>2026-09-13T20:56:43Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=ff61c2775fd3bc32ae921e64310e98e68254f0cd'/>
<id>urn:sha1:ff61c2775fd3bc32ae921e64310e98e68254f0cd</id>
<content type='text'>
luci.setInitAction was removed from luci-base in 4440b267d, so every
service action in this app called a method that no longer exists.
rpc.declare treats a remote exception as a resolved value unless reject
is set, so the page reported success while doing nothing. Move service
control to the rc namespace, which is part of the rpcd core binary, so
there is no new dependency, and treat a start or stop that does not
take effect as a failure.

Take autostart state from rc.list with skip_running_check instead of
forking /etc/init.d/qosify enabled -- a stat of /etc/rc.d/S19qosify,
which also avoids the init script's 10 s ubus wait_for against rpcd's
3 s cap -- and shaping state from ubus call qosify status instead of
forking qosify-status, which forks tc twice per active interface. A
page load is now eight ubus calls -- uci get, service.list, rc.list,
qosify.status, and a file.stat and file.read per config file -- and no
shell forks. Save reload instead of restart, since qosify_ubus_config
re-reads the rule files and only touches interfaces whose config
changed, so shaping is no longer torn down and rebuilt and the dynamic
DNS and IP map entries survive a save.

The service table follows the calls: the Package row goes, since the
/usr/sbin/qosify stat it reported is gone, and a Shaping row takes its
place with the count of active interfaces the daemon reports. A file
read that fails now yields null rather than an empty string, so the
editors fill null-safely.

Rewrite root/usr/share/qosify-luci/cleanup: it deleted the root qdisc
on a hardcoded pppoe-wan, which could destroy an unrelated shaper.
Enumerate qosify's own sections with config_foreach, resolve interface
names with network_get_device, derive the ifb name the way qosify
derives it, and run it only once the daemon is confirmed stopped -- it
deletes the qdiscs and the ifb devices the daemon is using. The lock is
an flock on an open fd, which the kernel releases even when rpcd kills
the script at its exec timeout, so a double click cannot race a restart
and a leftover lock cannot turn every later run into a silent exit 0.

Rebuild the ACL around the calls that remain: rc.init, rc.list and
qosify.status granted, exec grants moved into the write scope, the
unused /etc/init.d/qosify and /usr/sbin/qosify grants and file.list
dropped.

Add +luci-base to LUCI_DEPENDS: it was missing, so nothing pulled in
rpcd-mod-file, which the entire UI depends on.

Drop LUCI_PKGARCH:=all: luci.mk already defaults it to all for a package
without a src/Makefile.

Signed-off-by: Ash Clarke &lt;clarkeaj@hotmail.co.uk&gt;
</content>
</entry>
<entry>
<title>luci-app-shunt: sync with base package 0.1.8-1</title>
<updated>2026-09-16T17:52:54Z</updated>
<author>
<name>Dirk Brenken</name>
</author>
<published>2026-09-16T17:52:54Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=06e111ab07b902f2a746fcd465763eb78e2acf35'/>
<id>urn:sha1:06e111ab07b902f2a746fcd465763eb78e2acf35</id>
<content type='text'>
Co-authored-by: Claude &lt;noreply@anthropic.com&gt;
Signed-off-by: Dirk Brenken &lt;dev@brenken.org&gt;
</content>
</entry>
<entry>
<title>treewide: sync translations</title>
<updated>2026-09-16T15:50:14Z</updated>
<author>
<name>Hannu Nyman</name>
</author>
<published>2026-09-16T15:50:14Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=6da86dba37ad73cdde635f827db29ce275aebe48'/>
<id>urn:sha1:6da86dba37ad73cdde635f827db29ce275aebe48</id>
<content type='text'>
Sync.

Signed-off-by: Hannu Nyman &lt;hannu.nyman@iki.fi&gt;
</content>
</entry>
<entry>
<title>Translated using Weblate (Russian)</title>
<updated>2026-09-16T15:46:04Z</updated>
<author>
<name>Hosted Weblate</name>
</author>
<published>2026-09-16T15:38:48Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=6d81abb6a9f281a9dce3c8e36d31bf3daa7c7df2'/>
<id>urn:sha1:6d81abb6a9f281a9dce3c8e36d31bf3daa7c7df2</id>
<content type='text'>
Currently translated at 100.0% (162 of 162 strings)

Translation: OpenWrt/LuCI/applications/ustreamer
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsustreamer/ru/

Translated using Weblate (Russian)

Currently translated at 100.0% (45 of 45 strings)

Translation: OpenWrt/LuCI/applications/cloudflared
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationscloudflared/ru/

Translated using Weblate (Russian)

Currently translated at 100.0% (151 of 151 strings)

Translation: OpenWrt/LuCI/applications/usteer
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsusteer/ru/

Translated using Weblate (Russian)

Currently translated at 100.0% (515 of 515 strings)

Translation: OpenWrt/LuCI/applications/dockerman
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsdockerman/ru/

Translated using Weblate (Korean)

Currently translated at 87.2% (2824 of 3238 strings)

Translation: OpenWrt/LuCI/modules/luci-base
Translate-URL: https://hosted.weblate.org/projects/openwrt/luci/ko/

Translated using Weblate (Korean)

Currently translated at 100.0% (34 of 34 strings)

Translation: OpenWrt/LuCI/applications/adguardhome
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsadguardhome/ko/

Translated using Weblate (Russian)

Currently translated at 100.0% (151 of 151 strings)

Translation: OpenWrt/LuCI/applications/usteer
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsusteer/ru/

Translated using Weblate (Korean)

Currently translated at 100.0% (28 of 28 strings)

Translation: OpenWrt/LuCI/applications/udpxy
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationsudpxy/ko/

Translated using Weblate (Korean)

Currently translated at 63.0% (104 of 165 strings)

Co-authored-by: Hosted Weblate &lt;hosted@weblate.org&gt;
Co-authored-by: Hyeonjeong Lee &lt;h9101654@gmail.com&gt;
Co-authored-by: SnIPeRSnIPeR &lt;snipersniper@users.noreply.hosted.weblate.org&gt;
Signed-off-by: Hyeonjeong Lee &lt;h9101654@gmail.com&gt;
Signed-off-by: SnIPeRSnIPeR &lt;snipersniper@users.noreply.hosted.weblate.org&gt;
Translate-URL: https://hosted.weblate.org/projects/openwrt/luciapplicationscoovachilli/ko/
Translation: OpenWrt/LuCI/applications/coovachilli
</content>
</entry>
<entry>
<title>luci-app-dcwapd: remove package</title>
<updated>2026-09-14T10:21:14Z</updated>
<author>
<name>Yanase Yuki</name>
</author>
<published>2026-05-15T08:14:12Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=f4eebd44d6a9380779a6191d70b972156361f4e4'/>
<id>urn:sha1:f4eebd44d6a9380779a6191d70b972156361f4e4</id>
<content type='text'>
It seems dcwapd is no longer maintained, because
the latest upstream commit is 7 years ago.
I think Wi-Fi 7 MLO provides similar feature.

Signed-off-by: Yanase Yuki &lt;dev@zpc.st&gt;
</content>
</entry>
</feed>
