qosify sets up CAKE traffic shaping and uses an eBPF classifier to set each packet’s DSCP field, so voice, video, bulk and best-effort traffic land in the right CAKE tin. This app puts all of it on one page under Network → qosify. From there you can turn shaping on, set your bandwidth, edit the config and the classification rules, and watch what qosify is doing. Every setting is a real qosify option; the app adds nothing of its own on top.
It is in openwrt/luci master and ships in snapshots as the luci-app-qosify package. New features reach the installer first, and the package picks them up once the upstream PR merges.
Install
On snapshots, install the package:
apk add luci-app-qosify
On 24.10, 25.12 or any other build, use the installer:
wget -O /root/qosify-luci.sh https://raw.githubusercontent.com/choppyc79/luci-app-qosify/main/qosify-luci.sh && sh /root/qosify-luci.sh install
After installing, press Ctrl+F5 once on Network → qosify. The installer adds qosify if it is missing and creates default configs without overwriting yours. It also lists its files in sysupgrade’s keep list, so the app survives sysupgrade, attended sysupgrade and owut.
The installer has these commands:
install: installs qosify if needed, the app and default configs, then restarts services
files: writes the app files only, with no packages and no restarts (for ImageBuilder)
reset: puts both config files back to qosify’s defaults
uninstall: removes the app, qosify and both configs, plus the clsact and ifb-dns that qosify leaves behind
migrate: switches to the luci-app-qosify package and keeps both config files
Quick start
Open Overview and find the quick settings.
Tick qosify.
Set Upload and Download bandwidth a little under your measured line speed.
Click Save & Apply.
The shipped config has QoS disabled, so nothing is shaped until you do this.
Tabs
Overview
Service status: green means shaping, amber means running but idle, red means stopped.
Also shows uptime, autostart, and one row per shaped interface or device.
A service bar with Start, Restart, Reload, Reload Rules and Stop.
File validity for both configs.
Quick settings in four tabs: Basic, Shaping, Overhead and Advanced (CAKE options).
Config
Editor for /etc/config/qosify.
Warns as you type about anything qosify would silently ignore or drop.
Quick Add forms for defaults, class/alias and interface/device sections.
A reference of DSCP values and qosify’s defaults.
Rules
Editor for /etc/qosify/00-defaults.conf.
Quick Add for ports, port ranges, IPv4/IPv6 addresses, dns: patterns and regex, and dns_c:.
Lines qosify would skip are reported rather than silently saved.
Dynamic Entries adds entries to the running qosify with a timeout, and lists or removes the live ones.
Status
Full qosify-status output, refreshed at LuCI’s interval while the tab is open.
Counters
Traffic by Class.
Traffic by DSCP (snapshots only).
Traffic by CAKE Tin.
DNS Entries (snapshots only).
Reset counters.
Advanced
Backup and Restore of both files (checked before use, 64 KB maximum).
Check Devices, which picks up a device that appeared after qosify started.
Reset both files to defaults.
Good to know
25.12 and snapshots:qosify.init only applies its config on reload. After a reboot, qosify can run with no config until you press Reload. Start, Restart and Save & Apply in the app send the reload for you.
Stop and uninstall only remove what qosify created. Another shaper on the same device, such as SQM, is left alone.
Read-only users get a read-only page.
Unknown status: if rpcd does not answer, the page shows an amber Unknown rather than guessing. Running /etc/init.d/rpcd restart usually clears it.
Good job, thank you very much for your time.
I would like to be able to test your work, but at the moment I am using DSCPCLASSIFY 2.0 and I am satisfied with the results.
v2.0 is out — the biggest update since initial release.
Quick Settings on the Overview tab lets you edit all WAN interface options (bandwidth, overhead, queue mode, NAT, host isolate, CAKE options) and enable/disable QoS without touching raw config.
QoS Active indicator next to the enable checkbox — shows whether qosify is actually shaping traffic, not just running.
Quick Add Rules on the Classification Rules tab — pick type (tcp/udp/dns), enter a port or pattern, select a class from a dropdown populated from your config, and append. Input validation catches mistakes before they hit the rules file.
DSCP class reference — collapsible panel showing your defined classes with ingress/egress DSCP codes. Default/fallback classes are excluded automatically.
Other improvements:
Config file validation with size and last-modified timestamps
Unsaved changes warning on Config and Rules tabs
Backup download buttons on Advanced tab
Auto-refresh on Overview (30s) and Status (5s)
Confirm dialogs on all save/upload/reset actions
Option name normalisation prevents duplicates when mixing Quick Settings with uploaded configs
Big release — rewrite from the legacy Lua controller + .htm template architecture to the modern client-side JS LuCI view. Same five tabs, same install command, same single-script installer, but underneath it's now built the way official LuCI apps like luci-app-firewall ship.
What's different
No more luci-compat dependency — only luci-base is needed
File uploads handled client-side, no more CSRF / multipart POST issues
UCI accessed via the proper JS API, no more text parsing
Service controls via ubus call luci setInitAction
Save / Upload / Reset wait for qosify to come back up before refreshing the UI
Quick Settings, Service Controls and Service Status all refresh after save/upload/reset — no stale form fields or buttons
Polling auto-refresh via LuCI's poll module (Status 5 s, Overview 30 s, pauses when tab is hidden)
What stayed the same
Same five tabs (Overview, Config, Classification Rules, Advanced, Status), same Quick Settings form, same Quick Add Config / Quick Add Rule builders, same WAN-disabled-by-default for safe first-run, same single shell-script installer, still POSIX sh / BusyBox ash compatible.
Upgrading from v2.2: installer cleans up the old /usr/lib/lua/luci/controller/qosify.lua and friends automatically. Hard-refresh the browser (Ctrl-F5) after install to pick up the new JS.
One question for update/upgrade of OpenWrt over owut or attended sysupgrade. What is the best way to update/upgrade the OpenWrt system due to that this app is not in the OpenWrt repo?
I just would just run the install again, firstly save / download your qosify config and 00-default files and just upload them via the luci-app once its installed.
Connections tab: Not worth adding. qosify doesn't expose per-connection DSCP state, so the best we could do is guess based on your rules — which you can already read yourself. No real value.
Config tab question: No, you don't need to change anything in Config. Adding the rule in Rules tab is enough.
Sysupgrade survival: writes /lib/upgrade/keep.d/luci-app-qosify for configs, copies installer to /root/qosify-luci.sh; ACL grants /usr/sbin/tc exec; uninstall cleans both up
luci‑app‑qosify can offer improvements over the regular LuCI SQM QoS app — but only in situations where qosify itself provides benefits. If your traffic or connection doesn’t make use of qosify’s DSCP marking or per‑app classification, then it will behave the same as SQM or QoSMate.
Why:
SQM is a shaper (CAKE) with basic built‑in heuristics.
qosify is a classifier (eBPF DSCP marking) that feeds CAKE better metadata.
luci‑app‑qosify just provides a GUI for qosify — it doesn’t change how qosify works.