Repository navigation
Releases: Kataglyphis/OmniAccelerANT
Release list
OmniAccelerANT 2.1.0
The first release made by a merge into main, and the first the ObservANT cameras update
themselves from. Most of it is the cat cam, ObservANT since 2026-10-14, whose guide is
docs/source/camera-streaming.md § The ObservANT package.
Added
-
Branches, CI rounds and releases (2026-10-15, owner; the family's rule in
ANTfrastructure'sdocs/branch-and-release-strategy.md). A push todevelopruns Linux x64
alone; the Linux arm64, Windows x64 and arm64, Android and web lanes run when a commit message
asks with[ci <lane>]([ci windows],[ci arm64],[ci all]), read by the new
on-request.yml, or by hand, since every lane has Run workflow now.mainmoves only
by the owner's fast-forward to a fully greendevelopcommit. -
Releases, and cameras that update themselves (2026-10-15, owner). Every push to
main
runs the newrelease.yml: every lane once more, then the tagv<version>and a GitHub
release withweb.yml's tested ObservANT packages, aSHA256SUMSand the version's
CHANGELOG section as notes, only when every lane is green. A version that is released
already, or has no CHANGELOG section, stops it within a minute
(scripts/linux/publish-release.sh --check). The.debbringsomni-observant-update.timer: every night
it installs a newer release's package for the camera's architecture once it matches the
release's checksum, and leaves the camera alone otherwise;systemctl disable --now omni-observant-update.timerturns it off. Both are tested: the release script against a
stand-inghin the native lane, the updater against a local stand-in for GitHub in the
package jobs (an update, no downgrade, a bad checksum, a missing architecture). -
Visit statistics on the Stream page (2026-10-15, owner). A Visits button opens the
last two weeks: visits today and in all, the average stay, and bars per day and per hour of the
day, counted in the viewer's own time zone. They come from ObservANT's new/visits(OxidANT),
which keeps every visit of the last 30 days invisits.jsonand is read only while the panel
is open, every minute;/healthz, which the page polls, stays as small as it was.
test/visit_stats_test.dartcovers the counting at the window's and midnight's edges, the
average over the visits that left, and the panel opening, closing and a camera that does not
answer. -
The Camera page's requests to ObservANT are tested in Chrome (2026-10-15).
observant_api_web.dart, which reads/healthzand/settingsand saves settings, had no
test, since it loads only in a browser.test/observant_api_web_test.dartruns in the web
lane's Chrome (@TestOn('browser'), so the VM lanes skip it), swaps the page'sfetchfor a
fake and checks each request's URL, method,content-type, JSON body and timeout, and that an
error status or a failed request reads as nothing. It fails against aPUTand against a
page that ignores the status. -
Benchmarks in the projects' own tooling, tracked in CI (2026-10-14, owner). The Flutter side
isintegration_test/performance_test.dartunderflutter drive --profilewith
test_driver/perf_driver.dart:watchPerformancetimes the start, three rounds through every
tab and resizes across both breakpoints. The native lane runs it on x64 under Xvfb, and
scripts/linux/frontend-perf-report.pycompares it in the run's summary with the median of
the default branch's last 20 runs (2026-10-15; first against the run before, which a slow
creep never crossed): above +25 % it warns, and an average or 90th-percentile build time at
double the median fails the lane once 3 earlier runs exist. The Rust side is OxidANT's
Criterion benches undercargo bench, judged the same way.bench/page-perf.mjsalso times
the signalling socket now, andscripts/linux/flutter-trace-summary.pynames what a slow
frame builds (how the 0.94 s start-up block below was found). -
A test audit, and tests that can fail (2026-10-15, the owner asked whether the tests catch
regressions).docs/source/testing.mdsays what each kind of test proves, the rules that
keep a green run honest, and the gaps still open. Here:test/widget_test.dartasserted only thatAppexisted after pumping it;
test/bootstrap_settings_test.dartreads the shipped settings files instead (locales
against the translations, unique blog routes, every post's markdown present).test/app_layout_test.dartalso checks each route lands on its page, notErrorPage; a
planted/noSuchPagenow fails it.- The plugin's Linux gtest has six tests of the texture beside
GetPlatformVersion: pipeline
errors as Dart sees them, a transparent test pattern shown opaque,knt_push_frame's codes
and registry. Each was run against a planted bug inmy_texture.cc. - The perf scripts have a 23-assertion suite in the native lane, and the frame timings are
kept inout/perf/, which the docs step'sflutter cleanno longer deletes. - In the submodules: OxidANT tests its webcam engine with its real features, property-tests
ObservANT's network and config inputs, holds every crate to its own coverage floor, and
caught 142 of 145 planted bugs in ObservANT's network code (mutation testing);
AccelerANTgine fails its Linux lane on a skipped test or a UBSan report and keeps
main()out of its library; ANThology tests its settings readers instead ofexpect(1, 1).
-
Performance tools and a baseline (2026-10-14, the owner's benchmark).
scripts/linux/observant/bench/model.shtimes models in the installed service on a board,
viewer.shmeasures a board idle and with one viewer plus the page's cold load
(page-perf.mjs), and camera-streaming.md § Measuring performance keeps the numbers: the
model is 99 % of a detection, every viewer costs an encoder, and plain HTTP makes browsers
load the 0.75 MB larger renderer. -
"Too dark" on the Stream page (2026-10-14). ObservANT's
/healthzsaysdarkwhile
its picture is black, as a camera without IR is at night and the model idles; the status
line says so instead of looking like a quiet camera. -
"Recent detections" on the Camera page (2026-10-14): the last five arrivals with their
pictures, each with "Not a cat", which ignores the spot it was seen at. A false arrival is
seldom on screen when it happens, so the live button alone rarely caught one. -
An overview of the other cat cams, and a calmer Stream page (2026-10-14). With
peersincatcam.toml, the Stream page shows a card per other cat cam: its name,
picture and cat. It also says since when a cat cam is unreachable, folds out the whole
visit log, shows each earlier video with its arrival's picture, and closes the video of
a tab hidden for a minute./healthznames the build (version, also on the Camera
page) and the tabs connected (viewers); more thanmax_viewers(8) get503. -
"Not a cat", and a cat must move to arrive (2026-10-14). Under the Camera page's
preview, "Not a cat" marks the boxed spot, such as a drying rack, so the cat cam ignores
it from then on; the marked spots show grey, and "Watch again" forgets them. And a
detection now starts a visit only where something moved in the last 10 s, so a still
object the model takes for a cat never counts, while a cat that sits down stays counted. -
A Camera page for the cat cam's settings (2026-10-13), in the bottom bar beside
Stream. ⟲ and ⟳ turn the picture a quarter each way, for a board that gets moved about; a
slider sets how sure detection must be before a cat counts, against false alarms; a field
renames the camera. A live preview shows the result, the score of the last detection under
the slider says where a false one sits, and a table shows what the camera runs.
The cat cam applies each change at once and keeps it across restarts. It turns the
picture itself, so detection, the arrival picture and the clips turn with the stream, and
a quarter turn is bordered into the frame now, where it used to come out stretched. -
An installable cat cam (2026-10-05/06). The
cat_webrtcproducer, its GStreamer
plugins, the chain ONNX Runtime, the model and the web build travel as one bundle:
a .deb with a systemd service and a ufw profile, an AppImage that runs it or installs
it as that service, and a flatpak. On Windows it is an MSI and a signed MSIX, each
starting at logon with a firewall rule for the LAN.web.ymlpackages each one and
install-tests it. -
The cat cam on riscv64 (2026-10-13).
package-catcam.shbuilds its .deb and tarball
natively on a riscv64 board, in that board's own:latest; no AppImage or flatpak, as
flatpak has no riscv64 runtime. It runs on a SpacemiT board with a USB webcam, at about
24 fps to a browser on the LAN. No CI lane builds it yet. -
It reports the cat (2026-10-11/12).
/healthzsays whether a cat is in view,
when one last was, how many visits it counted, and when the latest 20 began and how
long they lasted./snapshot.jpgis the latest
boxed frame and/arrival.jpgthe frame each arrival was confirmed on. A cat counts
after two detections in a row. Visits and the arrival frame outlive a restart. -
It can notify (2026-10-12):
notify_urlgets every arrival and departure as a
JSON POST, which a Home Assistant webhook trigger takes as it is. -
The Stream page shows the cat (2026-10-12). Under the video: the cat cam's name,
then "Cat in view", "Cat last seen: 14:32" or "No cat seen yet" in English or German,
the latest visits with their stays, and the last arrival's picture. On a phone the video keeps its 4:3 and the line wraps. -
The web app boots without its Rust core, as Firefox and Safari need without
cross-origin isolation;serve.sh --httpserves the page with no certificate
(2026-10-05). -
The integration test runs on Windows x64 an...
🗡️New stable binary release targeting Linux and Windows🗡️
Enjoy my first binary ready to use packages of my app.
🍻Cheers!🍻