[{"data":1,"prerenderedAt":1084},["ShallowReactive",2],{"search-index":3,"doc-ota-updates-rauc-swupdate-mender-2026":101},[4,8,12,17,21,25,29,33,37,42,47,52,57,62,67,72,77,82,87,92,97],{"_path":5,"title":6,"description":7},"/dev/eu-cyber-resilience-act-firmware-evidence-pack","Eu Cyber Resilience Act Firmware Evidence Pack","title: \"EU Cyber Resilience Act in Practice for Firmware Teams: Engineering Tasks and Evidence Pack\"\ndescription: \"Practical breakdown of the EU Cyber Resilience Act requirements for embedded firmware teams, covering technical obligations, SBOM requirements, vulnerability handling, and the evidence pack needed for compliance.\"\ndate: 2026-04-19T08:00:00Z\nlastmod: 2026-04-19T08:00:00Z\ndraft: false\nhero: \"/images/hero/eu-cyber-resilience-act-firmware-evidence-pack-1600x900.jpg\"\ntags:",{"_path":9,"title":10,"description":11},"/dev/pkg/firmware-sboms-spdx-cyclonedx-2026","Firmware Sboms Spdx Cyclonedx 2026","title: \"Firmware SBOMs in 2026: SPDX vs CycloneDX, What to Publish, and What to Automate\"\ndescription: \"Practical comparison of SPDX and CycloneDX for firmware SBOMs, covering what to include, automation approaches, tooling, and publication strategies for embedded Linux products.\"\ndate: 2026-04-19T08:00:00Z\nlastmod: 2026-04-19T08:00:00Z\ndraft: false\nhero: \"/images/hero/firmware-sboms-spdx-cyclonedx-2026-1600x900.jpg\"\ntags:",{"_path":13,"title":14,"description":15,"date":16},"/dev/pkg/spdx-3-0-embedded-builds-practical","SPDX 3.0 for Embedded Builds: Packages, Files, and Relationships Engineers Actually Use","Practical guide to SPDX 3.0 for embedded Linux, covering the data model, package and file elements, relationship types, and how to produce useful SPDX documents from Yocto and Buildroot builds.","2026-04-19T08:00:00Z",{"_path":18,"title":19,"description":20},"/dev/slsa-build-provenance-firmware-sign-verify","Slsa Build Provenance Firmware Sign Verify","title: \"SLSA Build Provenance for Firmware: What to Collect, How to Sign, How to Verify\"\ndescription: \"Practical implementation guide for SLSA build provenance in firmware pipelines, covering provenance generation, signing with Sigstore, verification workflows, and integration with SBOMs.\"\ndate: 2026-04-19T08:00:00Z\nlastmod: 2026-04-19T08:00:00Z\ndraft: false\nhero: \"/images/hero/slsa-build-provenance-firmware-sign-verify-1600x900.jpg\"\ntags:",{"_path":22,"title":23,"description":24},"/dev/vex-csaf-embedded-not-affected-scale","Vex Csaf Embedded Not Affected Scale","title: \"VEX and CSAF for Embedded Devices: Publishing \"Not Affected\" at Scale\"\ndescription: \"How to produce and distribute VEX documents and CSAF advisories for embedded firmware, enabling downstream consumers to filter false positives from vulnerability scans.\"\ndate: 2026-04-15T20:03:00Z\nlastmod: 2026-04-15T20:03:00Z\ndraft: false\nhero: \"/images/hero/vex-csaf-embedded-not-affected-scale-1600x900.jpg\"\ntags:",{"_path":26,"title":27,"description":28},"/dev/yocto-5-2-walnascar-highlights-embedded-2026","Yocto 5 2 Walnascar Highlights Embedded 2026","title: \"Yocto 5.2 \"Walnascar\" Highlights for Embedded Teams: Toolchain, Security, SPDX 3.0\"\ndescription: \"Key changes in Yocto 5.2 Walnascar relevant to embedded product teams, covering toolchain updates, security improvements, SPDX 3.0 support, and migration notes.\"\ndate: 2026-04-12T08:14:00Z\nlastmod: 2026-04-12T08:14:00Z\ndraft: false\nhero: \"/images/hero/yocto-5-2-walnascar-highlights-embedded-2026-1600x900.jpg\"\ntags:",{"_path":30,"title":31,"description":32},"/dev/yocto-esdk-faster-iteration-2026","Yocto Esdk Faster Iteration 2026","title: \"Yocto eSDK in 2026: Faster Application Iteration Without Full Rebuild Cycles\"\ndescription: \"How to use Yocto's extensible SDK to speed up application development by building and testing packages without running full BitBake builds.\"\ndate: 2026-04-11T07:09:00Z\nlastmod: 2026-04-11T07:09:00Z\ndraft: false\nhero: \"/images/hero/yocto-esdk-faster-iteration-2026-1600x900.jpg\"\ntags:",{"_path":34,"title":35,"description":36},"/dev/yocto-layers-maintainable-strategy-2026","Yocto Layers Maintainable Strategy 2026","title: \"Yocto Layers That Stay Maintainable: Layer Model, Naming, and Upgrade Strategy (2026)\"\ndescription: \"Practical guidance on structuring Yocto layers for long-term maintainability, covering layer boundaries, naming conventions, version pinning, and upgrade workflows.\"\ndate: 2026-04-07T13:41:00Z\nlastmod: 2026-04-07T13:41:00Z\ndraft: false\nhero: \"/images/hero/yocto-layers-maintainable-strategy-2026-1600x900.jpg\"\ntags:",{"_path":38,"title":39,"description":40,"date":41},"/doc/bootlin-toolchains-arm-riscv-2026","Bootlin Toolchains in Practice: Picking the Right Prebuilt Toolchain for ARM and RISC-V","How to select and validate Bootlin prebuilt cross-compilation toolchains for ARM Cortex-A, Cortex-M, and RISC-V targets in embedded Linux projects.","2026-03-10T16:05:00Z",{"_path":43,"title":44,"description":45,"date":46},"/doc/buildroot-vs-yocto-2026","Buildroot vs Yocto in 2026: Which Embedded Linux Build System Fits Your Product Lifecycle?","A detailed comparison of Buildroot and Yocto for embedded Linux, covering build performance, long-term maintenance, layer ecosystems, and practical decision criteria for product teams in 2026.","2026-03-05T08:12:00Z",{"_path":48,"title":49,"description":50,"date":51},"/doc/cross-compilation-toolchain-triplet-clib-2026","Cross-Compilation in 2026: Choosing a Toolchain, Target Triplet, and C Library (glibc vs musl)","Practical guidance on selecting cross-compilation toolchains for embedded Linux, understanding target triplets, and choosing between glibc and musl for your production firmware.","2026-03-07T07:43:00Z",{"_path":53,"title":54,"description":55,"date":56},"/doc/erofs-vs-squashfs-2026","EROFS in 2026: When a Read-Only Filesystem Beats SquashFS (Performance, Dedupe, Updates)","Detailed comparison of EROFS and SquashFS for embedded Linux in 2026, covering read performance, compression ratios, deduplication, and integration with OTA update schemes.","2026-03-22T14:22:00Z",{"_path":58,"title":59,"description":60,"date":61},"/doc/ota-updates-rauc-swupdate-mender-2026","OTA Updates in 2026: RAUC vs SWUpdate vs Mender for Robust Fleet Management","Comparison of RAUC, SWUpdate, and Mender for embedded Linux OTA updates, covering update models, rollback strategies, fleet management, and integration with Yocto and Buildroot.","2026-03-28T19:07:00Z",{"_path":63,"title":64,"description":65,"date":66},"/doc/plat/device-tree-debugging-overlays-validation-2026","Device Tree Debugging for Embedded Linux: Overlays, Common Errors, and Validation","Practical guide to debugging device tree issues in embedded Linux, covering overlay mechanics, common DTS errors, validation tools, and runtime debugging techniques.","2026-04-05T06:58:00Z",{"_path":68,"title":69,"description":70,"date":71},"/doc/plat/porting-checklist-bootloader-kernel-rootfs-2026","Porting Checklist 2026: Bootloader → Kernel → RootFS for New Boards","Complete checklist for porting embedded Linux to a new board, from bootloader bring-up through kernel configuration to root filesystem validation, with practical tips for each stage.","2026-04-02T15:16:00Z",{"_path":73,"title":74,"description":75,"date":76},"/doc/real-time-linux-preempt-rt-latency-2026","Real-Time Linux in 2026: PREEMPT_RT Basics, Tuning, and How to Prove Latency","Practical guide to PREEMPT_RT on embedded Linux covering kernel configuration, IRQ threading, latency measurement with cyclictest, and tuning techniques for deterministic response times.","2026-03-23T05:48:00Z",{"_path":78,"title":79,"description":80,"date":81},"/doc/rootfs-integrity-dm-verity-immutable-images","Root Filesystem Integrity with dm-verity: Design Patterns for Immutable Images","How to design and implement dm-verity-protected root filesystems for embedded Linux, covering hash tree generation, kernel integration, error handling, and update strategies.","2026-03-19T08:56:00Z",{"_path":83,"title":84,"description":85,"date":86},"/doc/rtos-vs-embedded-linux-zephyr-2026","RTOS vs Embedded Linux in 2026: Where Zephyr Fits and Where Full Linux Wins","Practical comparison of RTOS (Zephyr, FreeRTOS) and embedded Linux for product design, covering latency, memory footprint, ecosystem maturity, and hybrid architectures.","2026-03-30T09:35:00Z",{"_path":88,"title":89,"description":90,"date":91},"/doc/secure-boot-uboot-fit-signatures-chain-of-trust","Secure Boot with U-Boot FIT Signatures: A Practical Chain-of-Trust Walkthrough","Step-by-step guide to implementing secure boot using U-Boot FIT image signatures, from key generation through verified boot to failure handling on embedded Linux targets.","2026-03-14T06:29:00Z",{"_path":93,"title":94,"description":95,"date":96},"/doc/verified-boot-patterns-uboot-keys-failure-modes","Verified Boot Patterns in U-Boot: What to Verify, Where Keys Live, and Failure Modes","Deep dive into U-Boot verified boot patterns covering signature scopes, key storage options, common failure modes, and practical debugging techniques for embedded Linux platforms.","2026-03-16T18:11:00Z",{"_path":98,"title":99,"description":100},"/image-manifest","ProteanOS Image Manifest","This document lists all hero and supporting images needed for the website.",{"_path":58,"_dir":102,"_draft":103,"_partial":103,"_locale":104,"title":59,"description":60,"date":61,"lastmod":61,"draft":103,"hero":105,"tags":106,"category":102,"body":110,"_type":1078,"_id":1079,"_source":1080,"_file":1081,"_stem":1082,"_extension":1083},"doc",false,"","/images/hero/ota-updates-rauc-swupdate-mender-2026-1600x900.jpg",[107,108,109],"Embedded Linux","ProteanOS","OTA Updates",{"type":111,"children":112,"toc":1049},"root",[113,121,128,133,140,145,150,156,161,167,172,178,183,189,194,199,239,245,274,280,293,299,304,309,323,327,370,375,403,408,426,432,437,442,447,451,489,494,522,527,545,583,589,830,836,845,863,871,894,902,925,931,936,950,993,999,1012,1025,1038,1044],{"type":114,"tag":115,"props":116,"children":117},"element","p",{},[118],{"type":119,"value":120},"text","Over-the-air updates are non-negotiable for connected embedded devices. The question is not whether to implement OTA but which framework to use. RAUC, SWUpdate, and Mender are the three dominant open-source options for embedded Linux. Each takes a different architectural approach, and the right choice depends on your update model, fleet size, and existing build infrastructure.",{"type":114,"tag":122,"props":123,"children":125},"h2",{"id":124},"update-model-fundamentals",[126],{"type":119,"value":127},"Update model fundamentals",{"type":114,"tag":115,"props":129,"children":130},{},[131],{"type":119,"value":132},"All three frameworks solve the same core problem: replace the running system software with a new version, atomically, with the ability to roll back if something goes wrong. The approaches diverge in how they achieve this.",{"type":114,"tag":134,"props":135,"children":137},"h3",{"id":136},"ab-dual-bank-updates",[138],{"type":119,"value":139},"A/B (dual-bank) updates",{"type":114,"tag":115,"props":141,"children":142},{},[143],{"type":119,"value":144},"The device has two complete system partitions. One is active; the other receives the update. After writing the update, the bootloader switches to the new partition on the next boot. If the new version fails to boot, the bootloader reverts to the old partition.",{"type":114,"tag":115,"props":146,"children":147},{},[148],{"type":119,"value":149},"RAUC and Mender both default to this model. It requires double the storage for the root filesystem but provides the most reliable rollback mechanism.",{"type":114,"tag":134,"props":151,"children":153},{"id":152},"in-place-delta-updates",[154],{"type":119,"value":155},"In-place (delta) updates",{"type":114,"tag":115,"props":157,"children":158},{},[159],{"type":119,"value":160},"SWUpdate can apply delta patches to the running partition. This saves storage (no need for a second partition) but makes rollback more complex—you need to store the delta in reverse or keep a snapshot.",{"type":114,"tag":134,"props":162,"children":164},{"id":163},"streaming-updates",[165],{"type":119,"value":166},"Streaming updates",{"type":114,"tag":115,"props":168,"children":169},{},[170],{"type":119,"value":171},"Some configurations stream the update directly from the network to flash, avoiding the need to store the complete update image in RAM or on a separate staging partition. RAUC supports streaming mode; SWUpdate supports it through handlers.",{"type":114,"tag":122,"props":173,"children":175},{"id":174},"rauc",[176],{"type":119,"value":177},"RAUC",{"type":114,"tag":115,"props":179,"children":180},{},[181],{"type":119,"value":182},"RAUC (Robust Auto-Update Controller) is a slot-based update framework developed by Pengutronix.",{"type":114,"tag":134,"props":184,"children":186},{"id":185},"architecture",[187],{"type":119,"value":188},"Architecture",{"type":114,"tag":115,"props":190,"children":191},{},[192],{"type":119,"value":193},"RAUC uses a \"slot\" abstraction. Each updatable component (rootfs, kernel, bootloader, application partition) is a slot. Slots are grouped into slot classes, and the update bundle specifies which classes to update.",{"type":114,"tag":115,"props":195,"children":196},{},[197],{"type":119,"value":198},"The update flow:",{"type":114,"tag":200,"props":201,"children":202},"ol",{},[203,209,214,219,224,229,234],{"type":114,"tag":204,"props":205,"children":206},"li",{},[207],{"type":119,"value":208},"RAUC receives an update bundle (a squashfs image containing the update payload and metadata)",{"type":114,"tag":204,"props":210,"children":211},{},[212],{"type":119,"value":213},"RAUC verifies the bundle's signature",{"type":114,"tag":204,"props":215,"children":216},{},[217],{"type":119,"value":218},"RAUC writes each slot's payload to the appropriate partition",{"type":114,"tag":204,"props":220,"children":221},{},[222],{"type":119,"value":223},"RAUC marks the new slot group as the boot target",{"type":114,"tag":204,"props":225,"children":226},{},[227],{"type":119,"value":228},"On next boot, the bootloader starts the new slot",{"type":114,"tag":204,"props":230,"children":231},{},[232],{"type":119,"value":233},"If boot succeeds, RAUC marks the slot as \"good\"",{"type":114,"tag":204,"props":235,"children":236},{},[237],{"type":119,"value":238},"If boot fails (no mark), the bootloader reverts",{"type":114,"tag":134,"props":240,"children":242},{"id":241},"strengths",[243],{"type":119,"value":244},"Strengths",{"type":114,"tag":246,"props":247,"children":248},"ul",{},[249,254,259,264,269],{"type":114,"tag":204,"props":250,"children":251},{},[252],{"type":119,"value":253},"Clean slot/class model scales to complex partition layouts",{"type":114,"tag":204,"props":255,"children":256},{},[257],{"type":119,"value":258},"Integrates with U-Boot, GRUB, and Barebox bootloaders",{"type":114,"tag":204,"props":260,"children":261},{},[262],{"type":119,"value":263},"D-Bus API for integration with management agents",{"type":114,"tag":204,"props":265,"children":266},{},[267],{"type":119,"value":268},"Good Yocto layer (meta-rauc) and Buildroot support",{"type":114,"tag":204,"props":270,"children":271},{},[272],{"type":119,"value":273},"Supports adaptive updates (binary delta)",{"type":114,"tag":134,"props":275,"children":277},{"id":276},"limitations",[278],{"type":119,"value":279},"Limitations",{"type":114,"tag":246,"props":281,"children":282},{},[283,288],{"type":114,"tag":204,"props":284,"children":285},{},[286],{"type":119,"value":287},"No built-in fleet management server (you need a separate backend)",{"type":114,"tag":204,"props":289,"children":290},{},[291],{"type":119,"value":292},"Configuration requires understanding slot semantics",{"type":114,"tag":122,"props":294,"children":296},{"id":295},"swupdate",[297],{"type":119,"value":298},"SWUpdate",{"type":114,"tag":115,"props":300,"children":301},{},[302],{"type":119,"value":303},"SWUpdate is a single-image update agent developed by Stefano Babic (DENX).",{"type":114,"tag":134,"props":305,"children":307},{"id":306},"architecture-1",[308],{"type":119,"value":188},{"type":114,"tag":115,"props":310,"children":311},{},[312,314,321],{"type":119,"value":313},"SWUpdate processes update images described by a ",{"type":114,"tag":315,"props":316,"children":318},"code",{"className":317},[],[319],{"type":119,"value":320},"sw-description",{"type":119,"value":322}," file (in libconfig or JSON format). The description lists handlers—each handler knows how to write a specific type of artifact (raw image to partition, UBI volume, file to filesystem, script execution, etc.).",{"type":114,"tag":115,"props":324,"children":325},{},[326],{"type":119,"value":198},{"type":114,"tag":200,"props":328,"children":329},{},[330,343,348,360,365],{"type":114,"tag":204,"props":331,"children":332},{},[333,335,341],{"type":119,"value":334},"SWUpdate receives a ",{"type":114,"tag":315,"props":336,"children":338},{"className":337},[],[339],{"type":119,"value":340},".swu",{"type":119,"value":342}," file (a cpio archive)",{"type":114,"tag":204,"props":344,"children":345},{},[346],{"type":119,"value":347},"SWUpdate verifies the signature",{"type":114,"tag":204,"props":349,"children":350},{},[351,353,358],{"type":119,"value":352},"SWUpdate parses ",{"type":114,"tag":315,"props":354,"children":356},{"className":355},[],[357],{"type":119,"value":320},{"type":119,"value":359}," and executes handlers in order",{"type":114,"tag":204,"props":361,"children":362},{},[363],{"type":119,"value":364},"Handlers write partitions, run scripts, update bootloader variables",{"type":114,"tag":204,"props":366,"children":367},{},[368],{"type":119,"value":369},"Bootloader variables control the next boot target",{"type":114,"tag":134,"props":371,"children":373},{"id":372},"strengths-1",[374],{"type":119,"value":244},{"type":114,"tag":246,"props":376,"children":377},{},[378,383,388,393,398],{"type":114,"tag":204,"props":379,"children":380},{},[381],{"type":119,"value":382},"Extremely flexible handler system (custom handlers for any update scenario)",{"type":114,"tag":204,"props":384,"children":385},{},[386],{"type":119,"value":387},"Supports both A/B and in-place updates",{"type":114,"tag":204,"props":389,"children":390},{},[391],{"type":119,"value":392},"Built-in web server for local updates",{"type":114,"tag":204,"props":394,"children":395},{},[396],{"type":119,"value":397},"Suricatta module for integration with Hawkbit server",{"type":114,"tag":204,"props":399,"children":400},{},[401],{"type":119,"value":402},"Streaming mode reduces RAM requirements",{"type":114,"tag":134,"props":404,"children":406},{"id":405},"limitations-1",[407],{"type":119,"value":279},{"type":114,"tag":246,"props":409,"children":410},{},[411,416,421],{"type":114,"tag":204,"props":412,"children":413},{},[414],{"type":119,"value":415},"Flexibility means more configuration work",{"type":114,"tag":204,"props":417,"children":418},{},[419],{"type":119,"value":420},"Handler ordering and dependencies need careful design",{"type":114,"tag":204,"props":422,"children":423},{},[424],{"type":119,"value":425},"No native fleet management (depends on Hawkbit or custom backend)",{"type":114,"tag":122,"props":427,"children":429},{"id":428},"mender",[430],{"type":119,"value":431},"Mender",{"type":114,"tag":115,"props":433,"children":434},{},[435],{"type":119,"value":436},"Mender is a complete OTA solution with both a client agent and a hosted or self-hosted management server.",{"type":114,"tag":134,"props":438,"children":440},{"id":439},"architecture-2",[441],{"type":119,"value":188},{"type":114,"tag":115,"props":443,"children":444},{},[445],{"type":119,"value":446},"Mender's client writes A/B rootfs images and communicates with the Mender server for deployment orchestration, device inventory, and reporting.",{"type":114,"tag":115,"props":448,"children":449},{},[450],{"type":119,"value":198},{"type":114,"tag":200,"props":452,"children":453},{},[454,459,464,469,474,479,484],{"type":114,"tag":204,"props":455,"children":456},{},[457],{"type":119,"value":458},"Mender client polls the server for pending deployments",{"type":114,"tag":204,"props":460,"children":461},{},[462],{"type":119,"value":463},"Server provides the update artifact",{"type":114,"tag":204,"props":465,"children":466},{},[467],{"type":119,"value":468},"Client verifies the artifact signature",{"type":114,"tag":204,"props":470,"children":471},{},[472],{"type":119,"value":473},"Client writes the rootfs to the inactive partition",{"type":114,"tag":204,"props":475,"children":476},{},[477],{"type":119,"value":478},"Client sets the bootloader to boot the new partition",{"type":114,"tag":204,"props":480,"children":481},{},[482],{"type":119,"value":483},"On successful boot, client commits the update",{"type":114,"tag":204,"props":485,"children":486},{},[487],{"type":119,"value":488},"On failure, bootloader reverts automatically",{"type":114,"tag":134,"props":490,"children":492},{"id":491},"strengths-2",[493],{"type":119,"value":244},{"type":114,"tag":246,"props":495,"children":496},{},[497,502,507,512,517],{"type":114,"tag":204,"props":498,"children":499},{},[500],{"type":119,"value":501},"Complete solution: client + server + UI",{"type":114,"tag":204,"props":503,"children":504},{},[505],{"type":119,"value":506},"Fleet management, deployment scheduling, device grouping out of the box",{"type":114,"tag":204,"props":508,"children":509},{},[510],{"type":119,"value":511},"Simple setup for A/B rootfs updates",{"type":114,"tag":204,"props":513,"children":514},{},[515],{"type":119,"value":516},"Good Yocto integration (meta-mender)",{"type":114,"tag":204,"props":518,"children":519},{},[520],{"type":119,"value":521},"SaaS option reduces operational burden",{"type":114,"tag":134,"props":523,"children":525},{"id":524},"limitations-2",[526],{"type":119,"value":279},{"type":114,"tag":246,"props":528,"children":529},{},[530,535,540],{"type":114,"tag":204,"props":531,"children":532},{},[533],{"type":119,"value":534},"Less flexible than RAUC or SWUpdate for complex partition layouts",{"type":114,"tag":204,"props":536,"children":537},{},[538],{"type":119,"value":539},"Server component adds operational complexity for self-hosted deployments",{"type":114,"tag":204,"props":541,"children":542},{},[543],{"type":119,"value":544},"Mender 4.x requires specific partition layout conventions",{"type":114,"tag":546,"props":547,"children":551},"div",{"className":548},[549,550],"callout","callout-success",[552],{"type":114,"tag":546,"props":553,"children":556},{"className":554},[555],"callout-content",[557,564],{"type":114,"tag":115,"props":558,"children":561},{"className":559},[560],"callout-title",[562],{"type":119,"value":563},"Hosting your update server",{"type":114,"tag":115,"props":565,"children":566},{},[567,569,581],{"type":119,"value":568},"If you self-host Mender or Hawkbit, a cloud VPS keeps your fleet management server available without managing physical hardware. ",{"type":114,"tag":570,"props":571,"children":578},"a",{"href":572,"target":573,"rel":574},"/posgo/digital-ocean-free-trial","_blank",[575,576,577],"nofollow","noopener","noreferrer",[579],{"type":119,"value":580},"DigitalOcean",{"type":119,"value":582}," offers a straightforward setup for running containerised update servers with managed databases.",{"type":114,"tag":122,"props":584,"children":586},{"id":585},"comparison-matrix",[587],{"type":119,"value":588},"Comparison matrix",{"type":114,"tag":590,"props":591,"children":592},"table",{},[593,619],{"type":114,"tag":594,"props":595,"children":596},"thead",{},[597],{"type":114,"tag":598,"props":599,"children":600},"tr",{},[601,607,611,615],{"type":114,"tag":602,"props":603,"children":604},"th",{},[605],{"type":119,"value":606},"Feature",{"type":114,"tag":602,"props":608,"children":609},{},[610],{"type":119,"value":177},{"type":114,"tag":602,"props":612,"children":613},{},[614],{"type":119,"value":298},{"type":114,"tag":602,"props":616,"children":617},{},[618],{"type":119,"value":431},{"type":114,"tag":620,"props":621,"children":622},"tbody",{},[623,647,670,693,716,739,762,785,807],{"type":114,"tag":598,"props":624,"children":625},{},[626,632,637,642],{"type":114,"tag":627,"props":628,"children":629},"td",{},[630],{"type":119,"value":631},"Update model",{"type":114,"tag":627,"props":633,"children":634},{},[635],{"type":119,"value":636},"A/B, streaming",{"type":114,"tag":627,"props":638,"children":639},{},[640],{"type":119,"value":641},"A/B, in-place, streaming",{"type":114,"tag":627,"props":643,"children":644},{},[645],{"type":119,"value":646},"A/B",{"type":114,"tag":598,"props":648,"children":649},{},[650,655,660,665],{"type":114,"tag":627,"props":651,"children":652},{},[653],{"type":119,"value":654},"Bundle format",{"type":114,"tag":627,"props":656,"children":657},{},[658],{"type":119,"value":659},"squashfs",{"type":114,"tag":627,"props":661,"children":662},{},[663],{"type":119,"value":664},"cpio (.swu)",{"type":114,"tag":627,"props":666,"children":667},{},[668],{"type":119,"value":669},"Mender artifact",{"type":114,"tag":598,"props":671,"children":672},{},[673,678,683,688],{"type":114,"tag":627,"props":674,"children":675},{},[676],{"type":119,"value":677},"Signing",{"type":114,"tag":627,"props":679,"children":680},{},[681],{"type":119,"value":682},"CMS (PKCS#7)",{"type":114,"tag":627,"props":684,"children":685},{},[686],{"type":119,"value":687},"CMS, GPG",{"type":114,"tag":627,"props":689,"children":690},{},[691],{"type":119,"value":692},"RSA, ECDSA",{"type":114,"tag":598,"props":694,"children":695},{},[696,701,706,711],{"type":114,"tag":627,"props":697,"children":698},{},[699],{"type":119,"value":700},"Bootloader support",{"type":114,"tag":627,"props":702,"children":703},{},[704],{"type":119,"value":705},"U-Boot, GRUB, Barebox",{"type":114,"tag":627,"props":707,"children":708},{},[709],{"type":119,"value":710},"U-Boot, GRUB, EFI",{"type":114,"tag":627,"props":712,"children":713},{},[714],{"type":119,"value":715},"U-Boot, GRUB",{"type":114,"tag":598,"props":717,"children":718},{},[719,724,729,734],{"type":114,"tag":627,"props":720,"children":721},{},[722],{"type":119,"value":723},"Delta updates",{"type":114,"tag":627,"props":725,"children":726},{},[727],{"type":119,"value":728},"Yes (adaptive)",{"type":114,"tag":627,"props":730,"children":731},{},[732],{"type":119,"value":733},"Yes (via handlers)",{"type":114,"tag":627,"props":735,"children":736},{},[737],{"type":119,"value":738},"Yes (Mender 3.4+)",{"type":114,"tag":598,"props":740,"children":741},{},[742,747,752,757],{"type":114,"tag":627,"props":743,"children":744},{},[745],{"type":119,"value":746},"Fleet management",{"type":114,"tag":627,"props":748,"children":749},{},[750],{"type":119,"value":751},"External",{"type":114,"tag":627,"props":753,"children":754},{},[755],{"type":119,"value":756},"Hawkbit",{"type":114,"tag":627,"props":758,"children":759},{},[760],{"type":119,"value":761},"Built-in",{"type":114,"tag":598,"props":763,"children":764},{},[765,770,775,780],{"type":114,"tag":627,"props":766,"children":767},{},[768],{"type":119,"value":769},"Yocto layer",{"type":114,"tag":627,"props":771,"children":772},{},[773],{"type":119,"value":774},"meta-rauc",{"type":114,"tag":627,"props":776,"children":777},{},[778],{"type":119,"value":779},"meta-swupdate",{"type":114,"tag":627,"props":781,"children":782},{},[783],{"type":119,"value":784},"meta-mender",{"type":114,"tag":598,"props":786,"children":787},{},[788,793,798,802],{"type":114,"tag":627,"props":789,"children":790},{},[791],{"type":119,"value":792},"Buildroot support",{"type":114,"tag":627,"props":794,"children":795},{},[796],{"type":119,"value":797},"Yes",{"type":114,"tag":627,"props":799,"children":800},{},[801],{"type":119,"value":797},{"type":114,"tag":627,"props":803,"children":804},{},[805],{"type":119,"value":806},"Limited",{"type":114,"tag":598,"props":808,"children":809},{},[810,815,820,825],{"type":114,"tag":627,"props":811,"children":812},{},[813],{"type":119,"value":814},"License",{"type":114,"tag":627,"props":816,"children":817},{},[818],{"type":119,"value":819},"LGPL-2.1",{"type":114,"tag":627,"props":821,"children":822},{},[823],{"type":119,"value":824},"GPL-2.0",{"type":114,"tag":627,"props":826,"children":827},{},[828],{"type":119,"value":829},"Apache-2.0 (client)",{"type":114,"tag":122,"props":831,"children":833},{"id":832},"choosing-a-framework",[834],{"type":119,"value":835},"Choosing a framework",{"type":114,"tag":115,"props":837,"children":838},{},[839],{"type":114,"tag":840,"props":841,"children":842},"strong",{},[843],{"type":119,"value":844},"Choose RAUC when:",{"type":114,"tag":246,"props":846,"children":847},{},[848,853,858],{"type":114,"tag":204,"props":849,"children":850},{},[851],{"type":119,"value":852},"You need a clean abstraction for complex multi-slot update scenarios",{"type":114,"tag":204,"props":854,"children":855},{},[856],{"type":119,"value":857},"You already have or plan to build a custom fleet management backend",{"type":114,"tag":204,"props":859,"children":860},{},[861],{"type":119,"value":862},"You use Buildroot or Yocto and want bootloader-agnostic update logic",{"type":114,"tag":115,"props":864,"children":865},{},[866],{"type":114,"tag":840,"props":867,"children":868},{},[869],{"type":119,"value":870},"Choose SWUpdate when:",{"type":114,"tag":246,"props":872,"children":873},{},[874,879,884,889],{"type":114,"tag":204,"props":875,"children":876},{},[877],{"type":119,"value":878},"You need maximum flexibility in what and how you update",{"type":114,"tag":204,"props":880,"children":881},{},[882],{"type":119,"value":883},"You want to combine A/B rootfs updates with file-level application updates",{"type":114,"tag":204,"props":885,"children":886},{},[887],{"type":119,"value":888},"You plan to use Hawkbit for fleet management",{"type":114,"tag":204,"props":890,"children":891},{},[892],{"type":119,"value":893},"You need in-place updates to save storage",{"type":114,"tag":115,"props":895,"children":896},{},[897],{"type":114,"tag":840,"props":898,"children":899},{},[900],{"type":119,"value":901},"Choose Mender when:",{"type":114,"tag":246,"props":903,"children":904},{},[905,910,915,920],{"type":114,"tag":204,"props":906,"children":907},{},[908],{"type":119,"value":909},"You want a complete, integrated OTA solution including fleet management",{"type":114,"tag":204,"props":911,"children":912},{},[913],{"type":119,"value":914},"Your update model is straightforward A/B rootfs replacement",{"type":114,"tag":204,"props":916,"children":917},{},[918],{"type":119,"value":919},"You prefer a managed service option",{"type":114,"tag":204,"props":921,"children":922},{},[923],{"type":119,"value":924},"Time to market is a priority over customization flexibility",{"type":114,"tag":122,"props":926,"children":928},{"id":927},"rollback-testing",[929],{"type":119,"value":930},"Rollback testing",{"type":114,"tag":115,"props":932,"children":933},{},[934],{"type":119,"value":935},"Whichever framework you choose, test the rollback path more thoroughly than the update path. Common rollback failures:",{"type":114,"tag":115,"props":937,"children":938},{},[939,941,948],{"type":119,"value":940},"For teams building CI/CD gates around OTA quality checks, this ",{"type":114,"tag":570,"props":942,"children":945},{"href":943,"rel":944},"https://diyai.io/ai-tools/code-generation/code-review-automation/",[576,577],[946],{"type":119,"value":947},"review code automation",{"type":119,"value":949}," guide is a helpful resource to rollback testing.",{"type":114,"tag":246,"props":951,"children":952},{},[953,963,973,983],{"type":114,"tag":204,"props":954,"children":955},{},[956,961],{"type":114,"tag":840,"props":957,"children":958},{},[959],{"type":119,"value":960},"Bootloader variable corruption:",{"type":119,"value":962}," Verify that failed updates leave the bootloader in a state that boots the previous version",{"type":114,"tag":204,"props":964,"children":965},{},[966,971],{"type":114,"tag":840,"props":967,"children":968},{},[969],{"type":119,"value":970},"Partial writes:",{"type":119,"value":972}," Interrupt an update mid-write (pull power) and verify the device boots the old version",{"type":114,"tag":204,"props":974,"children":975},{},[976,981],{"type":114,"tag":840,"props":977,"children":978},{},[979],{"type":119,"value":980},"Boot count limits:",{"type":119,"value":982}," Test that the boot-attempt counter correctly triggers rollback after the configured number of failed boots",{"type":114,"tag":204,"props":984,"children":985},{},[986,991],{"type":114,"tag":840,"props":987,"children":988},{},[989],{"type":119,"value":990},"Watchdog interaction:",{"type":119,"value":992}," Ensure the watchdog fires if the new image hangs during boot, triggering a reboot into the old partition",{"type":114,"tag":122,"props":994,"children":996},{"id":995},"integration-with-proteanos",[997],{"type":119,"value":998},"Integration with ProteanOS",{"type":114,"tag":115,"props":1000,"children":1001},{},[1002,1004,1010],{"type":119,"value":1003},"ProteanOS's ",{"type":114,"tag":570,"props":1005,"children":1007},{"href":1006},"/dev/pkg/spf-2.0/",[1008],{"type":119,"value":1009},"packaging system",{"type":119,"value":1011}," can generate update artifacts compatible with all three frameworks. The build pipeline produces the rootfs image; the packaging step wraps it in the appropriate bundle format.",{"type":114,"tag":115,"props":1013,"children":1014},{},[1015,1017,1023],{"type":119,"value":1016},"For fleet-managed devices, the ",{"type":114,"tag":570,"props":1018,"children":1020},{"href":1019},"/specs/",[1021],{"type":119,"value":1022},"specifications",{"type":119,"value":1024}," section covers the interface between ProteanOS package metadata and update server APIs.",{"type":114,"tag":115,"props":1026,"children":1027},{},[1028,1030,1036],{"type":119,"value":1029},"The ",{"type":114,"tag":570,"props":1031,"children":1033},{"href":1032},"/doc/install/",[1034],{"type":119,"value":1035},"installation guide",{"type":119,"value":1037}," covers setting up the partition layout for A/B updates during initial device provisioning.",{"type":114,"tag":122,"props":1039,"children":1041},{"id":1040},"summary",[1042],{"type":119,"value":1043},"Summary",{"type":114,"tag":115,"props":1045,"children":1046},{},[1047],{"type":119,"value":1048},"All three frameworks are production-ready in 2026. RAUC offers the cleanest architecture for complex scenarios. SWUpdate provides the most flexibility. Mender provides the most complete out-of-box experience. Choose based on your update model complexity, fleet management needs, and team capacity for integration work.",{"title":104,"searchDepth":1050,"depth":1050,"links":1051},2,[1052,1058,1063,1068,1073,1074,1075,1076,1077],{"id":124,"depth":1050,"text":127,"children":1053},[1054,1056,1057],{"id":136,"depth":1055,"text":139},3,{"id":152,"depth":1055,"text":155},{"id":163,"depth":1055,"text":166},{"id":174,"depth":1050,"text":177,"children":1059},[1060,1061,1062],{"id":185,"depth":1055,"text":188},{"id":241,"depth":1055,"text":244},{"id":276,"depth":1055,"text":279},{"id":295,"depth":1050,"text":298,"children":1064},[1065,1066,1067],{"id":306,"depth":1055,"text":188},{"id":372,"depth":1055,"text":244},{"id":405,"depth":1055,"text":279},{"id":428,"depth":1050,"text":431,"children":1069},[1070,1071,1072],{"id":439,"depth":1055,"text":188},{"id":491,"depth":1055,"text":244},{"id":524,"depth":1055,"text":279},{"id":585,"depth":1050,"text":588},{"id":832,"depth":1050,"text":835},{"id":927,"depth":1050,"text":930},{"id":995,"depth":1050,"text":998},{"id":1040,"depth":1050,"text":1043},"markdown","content:doc:ota-updates-rauc-swupdate-mender-2026.md","content","doc/ota-updates-rauc-swupdate-mender-2026.md","doc/ota-updates-rauc-swupdate-mender-2026","md",1792055458516]