Target: AXIS OS 13.0, scheduled September 2026. Preview firmware available April 2026.
Status: P0 (SDK + manifest) and P1 (recording API) are done as of v1.9.14, built against ACAP Native SDK 12.10.0. Remaining: manual ACAP signing (P0), plus P2/P3 items below. Signing must be done through the Axis ACAP Portal and cannot be automated here.
- Why: 64-bit
time_tABI break means existing.eapfiles won't install on OS 13. The device will rollback the upgrade if our ACAP is present. - Done:
Dockerfilebumped toacap-native-sdk:12.10.0onubuntu24.04(from1.15.1/ubuntu22.04). Build verified. - GLib symbol gotcha (fixed): The SDK 12.x toolchain ships GLib 2.80. GLib 2.76+ redefines the
g_string_free()macro to callg_string_free_and_steal, so a binary built with the new SDK fails at runtime on older firmware withundefined symbol: g_string_free_and_steal. Fixed by capping the GLib API inapp/Makefile:-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_66 -DGLIB_VERSION_MAX_ALLOWED=GLIB_VERSION_2_66. Verified absent from both.eapbinaries viareadelf --dyn-syms. - glibc symbol gotcha (fixed, validated on OS 11.11): The SDK 12.10 toolchain ships glibc 2.42, which bumped the symbol version of the termios calls
cfsetispeed()/cfsetospeed()(used by the Modbus RTU/serial code inmodbus_pool.c). This made the binary requireGLIBC_2.42, so it installed but crash-looped on AXIS OS 11.x withlibc.so.6: version 'GLIBC_2.42' not found. These were the only two symbols pulling in 2.42. Fixed with arch-conditional.symverpins inmodbus_pool.c(aarch64 ->@GLIBC_2.17, armv7hf ->@GLIBC_2.4); behaviour is unchanged for standard baud rates. The binary now tops out atGLIBC_2.34and runs on AXIS OS 11.11 (verified on an AXIS P3265-LVE, FW 11.11.212).
- Why: OS 13 refuses to install or upgrade ACAPs that don't declare OS version compatibility.
- Done: Added
compatibleOsVersions: [{ "min": "11.11", "max": "13" }]toacapPackageConf.setup(the field iscompatibleOsVersions, not the earlier guessedcompatibleWith). If onlymaxis given,acap-buildauto-injectsmin= the SDK baseline (12.10.68), which would needlessly block OS 12.0-12.10.67 devices (OS 11.x ignores the field entirely). Pinningminexplicitly to11.11is honored and matches the real runtime floor (glibc 2.34, present since AXIS OS 11.11).
- Why: OS 13 enforces manifest schema v2.
- Done:
schemaVersionbumped1.5.0->2.0.0. Schema v2 changes that were required:vendorId(10 hex chars) is now required.embeddedSdkVersionis no longer allowed insetupand was removed.architectureis required but auto-injected byacap-buildfrom the build ARCH.httpConfig/reverseProxy/resources.dbusremained valid unchanged.
- Why: OS 13 only accepts signed ACAPs.
- What: Sign each built
.eapthrough the Axis ACAP Portal (ties to vendor account /vendorId). Cannot be automated in this repo.
- Why: Both endpoints are removed in OS 13.
- Where:
app/engine/actions.c-action_recording(),while_active_undo()recording branch,recording_stop_timeout_cb(), and new continuous-recording helpers. - Done: Capability-aware implementation. On products where
Properties.LocalStorage.ContinuousRecording=yes(OS 13, and OS 12 products that support it) recordings use:- Start:
record/continuous/addconfiguration.cgi?diskid=<id>&eventid=eventengine[&options=streamprofile%3D<p>]-> returnsprofilenumber (tracked like the old recording ID). - Stop:
record/continuous/removeconfiguration.cgi?profile=N, orcontinuous_remove_ours()which lists profiles vialistconfiguration.cgiand removes all Event Engine (eventid=eventengine) profiles on the disk. - Products without continuous-profile support fall back to the legacy
record.cgi/stop.cgipath (unchanged), so one binary serves both OS 12 and OS 13. list.cgiis still used for the legacy fallback (Axis cancelled the plannedlist.cgichange).
- Start:
- Gotcha (validated on hardware): unlike legacy
record.cgi,addconfiguration.cgirequires theoptionsparameter — omitting it returns HTTP 400. When no stream profile is configured we default tooptions=videocodec%3Dh264, which keeps the sensor's native resolution/frame rate. - Device limit:
Properties.LocalStorage.NbrOfContinuousRecordingProfilesis often1. If the single slot is already in use (e.g. a user-configured continuous recording), a start action fails withMax number of configurations already configuredand is logged. - Verified end-to-end on AXIS Q3538-LVE (FW 12.10.73): start creates an
eventid=eventengineprofile and an ongoing recording; stop removes the profile vialistconfiguration.cgi+removeconfiguration.cgiand the recording is finalized on the SD card. - API docs: Edge Storage API
- Why:
MotionRegionDetector/Motionevent is removed. Any user rules using the camera tampering trigger will silently stop firing. - What: Update docs/UI to recommend AXIS Image Health Analytics events as replacement. Consider adding a deprecation warning in the UI if the trigger type is
tnsaxis:CameraApplicationPlatform/MotionRegionDetector/Motion. - Effort: Low.
- Why: Cameras factory-reset on OS 13 default to HTTPS-only. The
remote_hostfeature previously only sent HTTP requests to remote cameras, which those devices reject. - Done: Added a per-target
remote_httpsboolean to remote-capable actions and conditions (UI checkbox "Use HTTPS"). When set, the remote curl helpers inactions.c/conditions.cbuildhttps://URLs and disable TLS peer/host verification to accept the self-signed certificates Axis cameras use by default. Left off, the transport stays HTTP, so mixed HTTP/HTTPS fleets both work. Verified on hardware: an overlay pushed from an OS 12.10 camera to an OS 11.11 camera over HTTPS succeeded.
- Why:
localtime()andgmtime()use a static buffer and are not thread-safe. HTTP handlers run in a thread pool, so these can race. - Where:
app/engine/scheduler.clines ~162, 205 - usegmtime_r()/localtime_r()app/engine/conditions.cline ~46 - uselocaltime_r()app/engine/event_log.clines ~148, 157 - uselocaltime_r()
app/ACAP.candapp/engine/alert_stream.calready use the_rvariants correctly.- Effort: Low.
- Done (v1.9.14): SDK bump (#1), GLib API cap + glibc symver pin (runs on OS 11.11-13), manifest
compatibleOsVersions11.11-13 + schema v2 +vendorId(#2, #3), recording API migration (#5), remote-host HTTPS toggle (#7). All verified on hardware (OS 11.11 + 12.10). Both.eapfiles build clean and are symbol-verified. - April 2026 preview: Validate on preview firmware.
- Before September 2026: Sign the
.eapfiles via the Axis ACAP Portal (#4). - Opportunistic: Fix non-thread-safe time functions (#8) in any upcoming release.
- Docs/UX: Address the tampering trigger (#6) as part of any OS 13 release notes.
- AXIS OS 13 breaking changes overview
- Full changes list
- Edge Storage API (recording replacement)
- OS 13.0 scheduled: September 2026
- Preview firmware: April 2026