{"adoption": {"forks": 281, "observed_at": "2026-08-28T04:08:30.478006+00:00", "stars": 3955}, "canonical_url": "https://ross.abutalabs.com/products/apkupdater", "card": {"archived": false, "artifact_type": "application", "description": "APKUpdater is an open source tool that simplifies the process of finding updates for your installed apps.", "domain": ["android-tools", "self-hosted", "privacy"], "enriched": true, "function": ["package-manager", "scheduling", "search-engine", "developer-tools"], "health_score": 90, "homepage": null, "language": "Kotlin", "license": "GPL-3.0", "license_family": "copyleft", "maturity": "active", "member_repos": ["rumboalla/apkupdater"], "name": "rumboalla/apkupdater", "platform": ["jvm"], "pushed_at": "2026-05-28T11:22:07+00:00", "repo": "rumboalla/apkupdater", "stars": 3955, "tags": ["apk-updates", "app-store-alternative", "fdroid", "apkmirror", "jetpack-compose", "background-checks", "no-ads", "android-tv", "material-design-3", "open-source", "automation", "android", "mobile"], "topics": ["android", "open-source", "apk", "java", "play-store", "kotlin", "updater", "installer", "aptoide", "apkmirror", "google", "play", "f-droid", "flow", "gplv3", "jetpack-compose", "workmanager", "material-design-3"], "urls": [], "use_cases": ["find updates for installed android apps without play store", "aggregate app updates from apkmirror and fdroid", "schedule background update checks on android", "install apk updates without user interaction", "search for new apps across multiple apk sources", "avoid ads and tracking when updating apps", "update apps on android tv"], "what_it_is": "APKUpdater is an open-source Android app that finds updates for installed apps by aggregating results from multiple sources like APKMirror, Aptoide, F-Droid, IzzyOnDroid, APKPure, GitLab, GitHub, and Google Play. It supports background update checks with notifications, direct and root installs, and is built with Jetpack Compose, Flow, and WorkManager.", "when_to_avoid": ["you only use Google Play and are happy with its built-in updater", "you need an iOS or desktop update manager", "you want a library to embed update checking in your own app"], "when_to_choose": ["you want a single app to check updates across multiple APK sources", "you use F-Droid or sideloaded apps and want centralized update checks", "you want an ad-free, privacy-respecting updater on Android 5-14 or Android TV"]}, "data_as_of": "2026-08-30T08:39:29.467469+00:00", "members": [{"path": "/products/apkupdater", "repo": "rumboalla/apkupdater", "role": "main", "score": 84}], "provenance": {"archived": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "artifact_type": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "description": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "domain": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "enriched": {"inputs": [], "kind": "computed", "method": "enrichment_status"}, "function": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "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:08:30.478006+00:00", "source": "github"}, "language": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "license": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "license_family": {"inputs": ["license"], "kind": "computed", "method": "license_family"}, "maturity": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "member_repos": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "name": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "platform": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "pushed_at": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "repo": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "stars": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "tags": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "topics": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "urls": {"kind": "observed", "observed_at": "2026-08-28T04:08:30.478006+00:00", "source": "github"}, "use_cases": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "what_it_is": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "when_to_avoid": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}, "when_to_choose": {"confidence": null, "enriched_at": "2026-08-29T18:24:29.772809+00:00", "kind": "inferred", "prompt_version": 1, "sources": [{"content_hash": "e005240bbcf869c64bff7b6baa15c7e5182f2865a6505a9336f1b5e0482e6b69", "fetched_at": "2026-08-28T04:08:30.478006+00:00", "kind": "readme", "missing": false, "url": "https://github.com/rumboalla/apkupdater"}], "taxonomy_version": 1}}, "score": {"components": {"activity": 84, "longevity": 100, "rhythm": 74}, "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": 3664, "days_push": 97, "days_rel": 97, "gap_med": 37.0, "n_releases_24m": 5}, "score": 84, "version": 2}, "staleness": {"enrichment_outdated": false, "low_confidence": false, "scrape_days": 9, "stale_scrape": false}}