{
  "name": "Rubus",
  "icon": "https://bb10repo.whytofly.de/img/bb10-apkui.png",
  "category": "Utilities",
  "homepage": "https://bb10repo.whytofly.de/",
  "description": "Rubus — Cydia-style GUI for the apk package manager on BlackBerry 10. Browse and install BB10 native (.bar), Android (.apk), and CLI packages from any apk repo. Named after the bramble genus that gives blackberries their name.",
  "type": "bar",
  "history": [
    {
      "version": "1.0.43",
      "released": "2026-06-01",
      "changes": "- Self-upgrade now ends with a \"Restart Rubus\" button instead of leaving the progress page hanging. Since bb10-bar-install no longer fires msg::removeApp, navigator stops killing Rubus mid-upgrade — so the new BAR lands but the old process keeps running with no signal to refresh. Tapping the button spawns a detached relauncher via /bin/__devuser that waits ~2s and then writes msg::launchApp to navigator/control, then Rubus exits and navigator launches the new version."
    },
    {
      "version": "1.0.42",
      "released": "2026-06-01",
      "changes": "- No code changes — version bump only, to retest the self-upgrade trampoline end-to-end now that the bb10-bar-install no-removeApp fix is live and the lib/apk/exec permission issue on /accounts/1000/shared/misc/apk has been resolved."
    },
    {
      "version": "1.0.41",
      "released": "2026-06-01",
      "changes": "- Dropped the bundled apk + bar-install binaries from the .bar. Both are now installed and kept current by the bb10-apk-tools and bb10-bar-install packages (which Rubus already depends on), so shipping copies in our own bundle was dead weight and a stale-version risk. Bar size drops ~1.5 MB.\n- Pair this update with bb10-bar-install 20260601, which removes the legacy `msg::removeApp` that caused Rubus's icon to vanish when a self-upgrade trampoline failed mid-install."
    },
    {
      "version": "1.0.40",
      "released": "2026-05-30",
      "changes": "- HTTPS works in Rubus. Rebuilt the bundled Qt6 Network module with -openssl-linked against a static OpenSSL 1.1.1w (no-asm, no-async). Before this, per-package sidecar JSONs, icons, screenshots, and pretty-print names — all served over HTTPS — silently failed because the Qt build had no working TLS backend.\n- Self-upgrade is now routed through /bin/__devuser so bar-install runs in the devuser perimeter and survives navigator's msg::removeApp kill of Rubus's own BAR."
    },
    {
      "version": "1.0.39",
      "released": "2026-05-30",
      "changes": "- Per-package sidecar fetches (icons, descriptions, categories, screenshots) now go through QNetworkAccessManager instead of shelling out to curl, removing the BerryCore curl dependency."
    },
    {
      "version": "1.0.38",
      "released": "2026-05-30",
      "changes": "- Home page text rewritten: dropped the reference to a 'Browse' tab that never existed, added an explicit list of the actual six tabs (Home/Sources/Changes/Installed/Search/Queue) and what each does, corrected the CLI tool install paths (the apk binary is at the root of /accounts/1000/shared/misc/apk/, not under usr/bin/), pointed the 'Running your own repo' section at app_dev/apk-repo-source/, and added BerryCore + per-package log paths to the 'Paths Worth Knowing' list."
    },
    {
      "version": "1.0.37",
      "released": "2026-05-30",
      "changes": "- Removed the duplicate refresh button from the top-right of the Changes tab header. The labeled 'Refresh Repos' button in the bottom row is now the only one (it does the same full-refresh)."
    },
    {
      "version": "1.0.36",
      "released": "2026-05-30",
      "changes": "- Search now finds substrings, not just name prefixes (typing 'telegram' now finds 'bb10-telegramx'). Switched from `apk search` (prefix only) to `apk list -v \"*<query>*\"` and lowercased the query because the glob is case-sensitive. As a bonus this also covers installed-but-no-longer-in-APKINDEX packages."
    },
    {
      "version": "1.0.35",
      "released": "2026-05-29",
      "changes": "- Detail page: Queue Install / Queue Remove moved ABOVE the description so it's reachable without scrolling past long blurbs. Long descriptions are now collapsed to ~280 characters with a 'Show more' toggle."
    },
    {
      "version": "1.0.34",
      "released": "2026-05-29",
      "changes": "- Self-upgrade: dropped the detached-trampoline pattern (which lost the race against navigator's perimeter kill) and the helper-service idea. Rubus now drives bar-install synchronously. bar-install copies the new bar to /var/android/<dname> and writes the runtimeInstall PPS object BEFORE issuing msg::removeApp; by the time navigator kills Rubus, everything upd needs to complete the install is on disk. upd finishes the install in its own perimeter, immune to the kill.\n- UI nits: 'Upgrade All' moved out of the cramped Changes-tab header into the bottom button row (was being clipped on narrow screens); the round ↻ refresh icon replaced with a 'Refresh' text button (the Unicode glyph rendered as a missing-glyph line on stock BB10 fonts)."
    },
    {
      "version": "1.0.33",
      "released": "2026-05-29",
      "changes": "- Sacrificial bump for testing the new self-upgrade flow introduced in 1.0.32. No functional changes."
    },
    {
      "version": "1.0.32",
      "released": "2026-05-29",
      "changes": "- Self-upgrade flow: when the queue contains bb10-apkui, Rubus now prompts and then writes the install commands to a script, spawns it detached, and quits cleanly. The script sleeps 3s (Rubus is gone by then), runs apk add -u and bar-install. Goal: navigator has no live Rubus to kill when bar-install fires msg::removeApp, so the install can complete. Log: /accounts/1000/shared/misc/apk/var/log/pending-self-upgrade.log."
    },
    {
      "version": "1.0.31",
      "released": "2026-05-29",
      "changes": "- The Done button on the Progress page (shown after refresh / install / upgrade) now returns to whichever tab kicked off the operation, instead of always jumping back to Home."
    },
    {
      "version": "1.0.30",
      "released": "2026-05-29",
      "changes": "- Removed the debug 'View fetch log' button from the Home page (no longer needed for diagnosing the BAR-perimeter curl issue)."
    },
    {
      "version": "1.0.29",
      "released": "2026-05-29",
      "changes": "- Fixed: the 'Refresh Repos' button on the Changes tab (and the header refresh on Changes/Installed) only ran `apk update` — the sidecar JSON metadata cache was NEVER wiped, so newly added fields (like a package's screenshots) silently never reached the device. Unified both refresh buttons to wipe + re-fetch metadata."
    },
    {
      "version": "1.0.28",
      "released": "2026-05-26",
      "changes": "- Added a translucent busy overlay that appears whenever an apk call takes >300ms, so refreshing sources / opening a category no longer feels frozen.\n- Added a 'View fetch log' button on Home that opens the icon/screenshot diagnostic log (also written to /accounts/1000/shared/documents/rubus-fetch.log for off-device inspection)."
    },
    {
      "version": "1.0.27",
      "released": "2026-05-26",
      "changes": "- Self-upgrade now actually upgrades. The queue executor was running `apk add <pkg>` which is a no-op for already-installed packages — switched to `apk add -u <pkg>` so the upgrade-available path runs.\n- Home page now shows the running version (under the tagline) — quick way to verify a self-upgrade landed."
    },
    {
      "version": "1.0.26",
      "released": "2026-05-25",
      "changes": "- Version picker overhaul: queue now dedupes by package name, so picking a version after queueing the bare name (or switching versions) leaves exactly one entry. Picker shows installed + queued markers per row, has a 'Clear pin' button, and an explicit 'Close' button. Detail page shows 'Queued for install: x.y.z' when a version is pinned, and the 'Other versions' button changes to 'Queued: x.y.z   change ▾'.\n- Queue tab: tap any row to unqueue just that entry (used to be all-or-nothing).\n- Tapping the installed version in the picker now clears the pin instead of being a silent no-op."
    },
    {
      "version": "1.0.25",
      "released": "2026-05-25",
      "changes": "- Fixed: screenshot + icon fetch failed inside the Rubus BAR perimeter because /accounts/devuser/berrycore/bin/curl isn't readable from there. The curl probe now tries /accounts/1000/shared/misc/berrycore/bin/curl first (shared dir, BAR-accessible), then the apk-shipped path, then the old devuser path."
    },
    {
      "version": "1.0.24",
      "released": "2026-05-25",
      "changes": "- Tapping a source no longer pre-fetches every package's screenshots. Screenshots are now fetched lazily when you open a package's detail page — first source-tap is dramatically faster on cold caches."
    },
    {
      "version": "1.0.23",
      "released": "2026-05-25",
      "changes": "- Home page CLI TOOLS section rewritten: no longer references BerryCore; instead documents the apk PATH ($APK_HOME/usr/bin and $APK_HOME/bin) so package-installed CLI tools work out of the box"
    },
    {
      "version": "1.0.22",
      "released": "2026-05-25",
      "changes": "- Detail page now shows SCREENSHOTS (horizontally-scrollable thumbnails from the sidecar JSON)\n- Home page rewritten with sections: installing, upgrading, adding sources, running your own repo, CLI tools, paths reference\n- bb10-balatro added (Love2D runtime; bring your own balatro.love)\n- bar-install: dev-slot reclaim message is no longer noisy — only reports actual leaked markers"
    },
    {
      "version": "1.0.21",
      "released": "2026-05-25",
      "changes": "- Package detail page now shows a CHANGELOG section\n- New \"Other versions\" picker lets you install / downgrade to any past release"
    },
    {
      "version": "1.0.20",
      "released": "2026-05-25",
      "changes": "- Bottom tabs respond instantly on touch (use `pressed` signal — old `clicked` was missing taps because of digitizer slop)"
    },
    {
      "version": "1.0.19",
      "released": "2026-05-25",
      "changes": "- Refresh ↻ button in the header of Installed and Changes tabs — re-polls apk's state when an install/uninstall was done out-of-band (e.g. from Term49)"
    },
    {
      "version": "1.0.18",
      "released": "2026-05-25",
      "changes": "- Install progress page now shows colored hints under known opaque apk-tools / curl errors (e.g. integrity error → \"refresh sources\")"
    },
    {
      "version": "1.0.17",
      "released": "2026-05-25",
      "changes": "- Live-streamed install output in the progress page so long installs (Telegram X, etc.) don't look frozen"
    },
    {
      "version": "1.0.16",
      "released": "2026-05-25",
      "changes": "- Passes --root explicitly to apk again, now that apk-tools handles it correctly\n- Bundled apk + bar-install updated"
    }
  ]
}
