{"adoption": {"forks": 462, "observed_at": "2026-08-28T04:05:45.351100+00:00", "stars": 1860}, "canonical_url": "https://ross.abutalabs.com/products/swupdate", "card": {"archived": false, "artifact_type": "application", "description": "Software Update for Embedded Systems", "domain": ["embedded-systems", "iot", "security", "self-hosted"], "enriched": true, "function": ["deployment", "security", "configuration-management", "webhook", "cli"], "health_score": 98, "homepage": null, "language": "C", "license": "GPL-2.0", "license_family": "copyleft", "maturity": "stable", "member_repos": ["sbabic/swupdate"], "name": "sbabic/swupdate", "platform": ["embedded", "iot", "c", "lua"], "pushed_at": "2026-08-19T12:49:46+00:00", "repo": "sbabic/swupdate", "stars": 1860, "tags": ["ota-updates", "firmware-update", "delta-updates", "hawkbit", "atomic-update", "embedded-linux", "fota", "rescue-system", "devops", "linux"], "topics": ["embedded", "embedded-systems", "flashes", "emmc", "swupdate", "lua", "iot", "ota", "industrial-linux", "fota", "software-update", "firmware-update", "ota-updater", "ota-firmware-updates", "linux", "hawkbit"], "urls": [], "use_cases": ["update firmware on embedded linux devices over the air", "deploy OTA updates to a fleet of IoT devices", "perform atomic fail-safe rootfs updates on eMMC", "integrate device updates with Eclipse hawkBit", "sign and verify firmware update images", "run delta updates to reduce bandwidth on constrained devices", "build a rescue system to restore bricked devices"], "what_it_is": "SWUpdate is a Linux update agent for safely updating embedded Linux devices in the field, supporting local and OTA updates with multiple strategies. It handles updating rootfs, kernel, bootloader, and firmware across various flash types, with cryptographic signing, delta updates, and hawkBit fleet management integration.", "when_to_avoid": ["you need OTA updates for Android or non-Linux embedded OSes", "you only update desktop or server Linux systems", "you want a managed cloud update service without self-hosting components", "your devices are not running Linux"], "when_to_choose": ["you maintain embedded Linux devices that need secure field updates", "you need atomic, fail-safe updates across rootfs, kernel, and bootloader", "you want hawkBit integration for fleet-wide OTA updates", "you need signed/encrypted update artifacts and delta updates", "you target multiple flash types like NAND, UBIFS, SPI-NOR, or eMMC"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/swupdate", "repo": "sbabic/swupdate", "role": "main", "score": 87}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "health_score": {"inputs": ["days_since_push", "days_since_release", "archived"], "kind": "computed", "method": "health_v1"}, "homepage": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:05:45.351100+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-30T03:15:55.929458+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "64d687fb9a65a91979ad317f1b532a62c9dd9b307f84bb8a1f9e7dc25a75f68c", "fetched_at": "2026-08-28T04:05:45.351100+00:00", "kind": "readme", "missing": false, "url": "https://github.com/sbabic/swupdate"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 98, "longevity": 100, "rhythm": 65}, "computed_at": "2026-09-02T17:46:02.011165+00:00", "flags": [], "formula": "round(0.45*activity + 0.35*rhythm + 0.20*longevity); archived -> min(score, 10)", "inputs": {"age_days": 4672, "days_push": 14, "days_rel": 72, "gap_med": 103, "n_releases_24m": 6}, "score": 87, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}