This flow was submitted before accounts existed, so nobody owns it yet. If you submitted it, open the edit link you were given — it still works — and you can attach the flow to an account from there. There is no deadline, and attaching it retires the link for good.
Update Checker
Appears in your rotation when a newer AWTRIX NG release exists
| System | AWTRIX NG Scripts |
|---|---|
| Firmware | AWTRIX NG |
| Topic | Miscellaneous |
| Built by | Blueforcer |
| File | v2sWDvY99ZH3.ax · 2.5 KB |
| Icons | — |
| Published | 4 Aug 2026 · updated 7 Aug 2026 |
| Downloads | 66 |
Tells you when a new AWTRIX NG firmware is out - and stays invisible until then.
This app compares the firmware running on your panel with the latest AWTRIX NG release on GitHub. When a newer version exists, it joins your rotation and shows a rainbow UPDATE banner with a download arrow. When you are up to date, it skips its turn entirely, so it costs you nothing in the loop.
Nothing to configure. It reads the installed version from the panel itself and checks GitHub once at startup, then every 6 hours.
v2sWDvY99ZH3.ax
# @name UpdateCheck
# @desc Appears only when a newer AWTRIX NG release exists
# @author Blueforcer
# @version 1.1
# @config every number "Check every" default=60 min=5 max=1440 unit=min
import string
class UpdateCheck
var installed, latest, ticks, busy, period
def init()
self.installed = self.digits(version())
self.latest = nil
self.period = int(store.get("every")) * 60
self.ticks = 0
self.busy = false
end
# "1.0.13" -> 1000013, so 1.0.9 sorts below 1.0.13. A "-dev" suffix is dropped.
def rank(v)
var d = string.find(v, "-")
if d >= 0 v = v[0 .. d - 1] end
var p = string.split(v, ".")
var n = 0
for i : 0 .. 2
n = n * 1000 + (i < size(p) ? int(p[i]) : 0)
end
return n
end
# Keeps the first run of digits and dots, so "1.0.13\n" and {"version":"1.0.13"}
# both reduce to the bare number.
def digits(s)
var v = ""
for i : 0 .. size(s) - 1
var c = s[i]
if (c >= "0" && c <= "9") || c == "."
v += c
elif v != ""
break
end
end
return v
end
def newer()
if self.installed == nil || self.latest == nil return false end
return self.rank(self.latest) > self.rank(self.installed)
end
# The whole point: no update, no turn in the rotation.
def should_show()
return self.newer()
end
def on_github(body, status)
self.busy = false
self.ticks = 300 # retry in 5 min unless we parsed something
if body == nil return end
var v = self.digits(body)
if v == "" return end
self.latest = v
self.ticks = self.period # back to the configured period once it worked
log("uc: latest=" + v + " newer=" + str(self.newer()))
end
def loop()
if !self.busy && self.ticks <= 0
self.busy = true
self.ticks = self.period
http.get("https://raw.githubusercontent.com/Blueforcer/awtrix-ng/main/version",
/ b, st -> self.on_github(b, st))
end
self.ticks -= 1
end
# A download arrow into a tray, 8x8 at the left edge.
def arrow(col)
rect_fill(3, 0, 2, 3, col)
line(1, 3, 6, 3, col)
line(2, 4, 5, 4, col)
line(3, 5, 4, 5, col)
line(1, 7, 6, 7, col)
end
def draw()
clear()
if !self.newer()
text(1, 6, self.installed, 0x404040)
return
end
var ph = int(now_ms() / 12) % 360
self.arrow(hsv(ph, 100, 100))
var s = "UPDATE"
var x = 9
for i : 0 .. size(s) - 1
x += text(x, 6, s[i], hsv((ph + i * 40) % 360, 100, 100))
end
end
end
return UpdateCheck()
Install it on your AWTRIX NG
Your browser writes the script straight to the device on your network. It joins the app rotation right away.
Some browsers refuse to talk to a device on your network from a public page. Download the flow and paste it into the Scripts tab of your device, or install it from a terminal:
More flows for AWTRIX NG Scripts or Miscellaneous
Something wrong with this flow? Report it.