Releases: FedeFluork/multistore
Release list
v0.8.0-BETA
v0.8.0-BETA
New — the comparison table
The "available on N stores" block on an app page now opens a table of every store that has it, side by side: version, date, size, whether the store publishes a checksum, whether it declares the package name, and whether the build is a rework. The block itself is now a row of compact cards you swipe through rather than a stack, so nine sources no longer push everything under them off the page, and Compare and Search others sit next to each other on one line.
Possible matches stay out of it. A comparison invites you to pick a row and install from it, and a row that might be a different app is exactly what must never be offered that way: those keep their own section on the app page, where the question is "is this the same app?".
New — "this is a modified build"
Five of the nine current stores redistribute APKs reworked by somebody other than the developer. Until now the only place that said so was the title, written by the store in whatever words it chose. There is now a badge, and it has three states rather than two, because a store that publishes reworks and says nothing about this listing has not told you the build is clean. Three stores mark individual listings in their own markup (an1, MODYOLO, PDALIFE); the other two never do, so on those every listing says "possible" and none says "clean". Tapping the badge explains what the verification can and cannot prove: for a rework there is no original developer signature to compare against.
New — the permissions an app asks for, before you install it
The app already opens the archive to read its package, version and signers. The permissions were in the same manifest and nobody read them, and the modern system dialog no longer lists them, so there was no moment at all when you could know what an app demanded before it was on your phone.
- On F-Droid, before anything is downloaded. The index publishes them, so the section is there the first time you open the page.
- On the other eight, from the archive, after the file is verified and before it is installed.
Sensitive ones come first, and both the names and the "sensitive" judgement come from Android itself, in your device's language. A permission your Android version no longer asks for is not shown.
New — resume a paused download from the Downloads tab
The tab could cancel a transfer but not restart one: that lived on the app's page, which is the screen you leave the moment you press Install. Resume is now on every paused row, including the ones with no partial file.
It re-resolves the address rather than reusing the stored one: continuing a download paused overnight with the old address is an almost guaranteed failure. Two cases cannot be finished from a one-line row and say so instead of failing: a download needing a
human tap, and a signature conflict. Both point you at the app's page.
New — choose which store an app updates from
MultiStore has recorded the update channel separately from the provenance, and no screen could change it. Now the page of any other store that has the app offers "Update it from here". My apps now names the update source only when it differs from where the app came from.
New — your last searches
The last ten sit under the empty search field, in place of the sentence explaining what the screen is for. The row runs the search again; the ✕ forgets that one; Forget them all is at the bottom.
Settings → Search → Keep recent searches, on by default. Turning it off deletes what is already there rather than merely stopping.
New — a store's health, in a sentence
Settings showed one word beside each store: open or degraded. That cannot answer the only question worth asking: is this today, or has it been going on for a week?
Tapping the store in Settings, or the notice search shows next to incomplete results, now gives the whole answer: what kind of fault it was, when it last worked, and how long the current run has lasted, measured from the last success.
New — choosing your stores is a screen
Settings → Stores → Choose the stores was a dialog with nine switches that already did not fit the height a dialog has on a phone. It is now a screen, with the three things the dialog could not hold:
- Tabs by kind: All, Open source, Original, Modified, each carrying how many of its group are on.
- A search field, for finding one store by name or by address.
- Select or deselect a whole tab with one checkbox, and a line at the bottom saying how many sources are being searched in total.
A store is now a full-width card and the whole of it is the switch: tapping anywhere turns it on or off, and the selected state is a tinted fill and a border. There is no more a Save button: the change is written as you tap.
v0.7.2-BETA
v0.7.2-BETA
Two stores stopped working properly, in two different ways. Both are fixed.
Fixed
-
APKCombo: about half its catalogue could not be installed. The listing showed Install as usual, and tapping it answered "Not found on this store." every time, on the same app, forever, while the store's own page offered the file perfectly well. APKCombo wraps the address of the file in two different forms, and the app only knew one of them. On a listing served the other way every download link on the page was discarded, the listing fell back to the list of versions printed underneath, which is why the button was still there, and the resolution that happens when you tap it found nothing to resolve.
-
PDALIFE: screenshots disappeared from every listing, and versions lost their compatibility check. PDALIFE redesigned its app pages around 16 September. Two of the things the app reads from them moved: the screenshot gallery, and the block stating the minimum Android version. Both are read again. The screenshots now come through at full size, which is what the new page publishes.
v0.7.1-BETA
v0.7.1-BETA
A single hotfix, on the gesture the app is used for most.
Fixed
- Search results keep your place. Opening an app listing from the results and coming back sent the list back to the top, losing the row you had tapped from. It happened when you spent some time on the listing and not when you glanced at it and came straight back, which is what made it look random. It was not the navigation: the scroll position was being restored correctly and then thrown away.
Search deliberately holds the list at the top until you move it, because results arrive from up to nine stores one at a time and the list reorders on every arrival. Without that, a search would appear to open part-way down its own results. But "the reader has moved this list" was remembered only for as long as the screen was on the display, and opening a listing takes the results list off it: coming back, the app believed nobody had ever touched the list and pinned it to the top again, over the position it had just restored. How long you stayed on the listing decided whether that had happened yet.
v0.7.0-BETA
v0.7.0-BETA
New
-
Screenshots. An app listing now shows a horizontal strip of the screens the store publishes. Tap one and it opens full-screen, where you can swipe between all of them with a counter telling you where you are. Eight of the nine adapters fill that field, where a store publishes none, the strip is absent rather than replaced by an empty "no images" box.
-
"What's new in this version". The release notes of the offered version now appear under the description, truncated with a "read more", and every row of the version history shows its own. Three sources out of nine publish them, but among those three is by far the largest catalogue. Until now you pressed Update without knowing what you were getting. Where there are none, the section does not appear.
-
Author links. A "Links" block lists what the source actually published: source code, website, issue tracker, release notes, translations, donations, and the author's name. Each with its icon and with the address visible before you tap it.
-
Rating counts and download figures. Where a store publishes them, search rows and the listing header now show how many people voted next to the star, and the store's own downloads label. Counts come from five stores, download labels from three. Where they are absent, nothing is shown.
-
"Open", after installing. On a successful install, the listing and the Downloads row now offer Open. Previously the last step of the journey the app exists to complete happened outside the app: you left it and hunted for the icon in the launcher. The button is absent for packages that declare no launcher activity.
-
"Update all" in My apps. The gesture existed only on Home. My apps, the screen that actually lists what is updatable, one row at a time, with its own count, did not have it, so anyone who got there after seeing four "update available" badges had to go back. Now it is in both, with the same progress and the same outcome. MultiStore still updates itself last, updating yourself kills the process mid-commit, and going first would interrupt everything else.
-
Search and sort in My apps. A search field above the list, and a choice of four orders: by name, by install date, by source store, and updatable-first. The choice is remembered between visits and has its own entry under Settings → My apps.
-
Sharing. Two gestures, and the second is the one that was missing most.
-
The listing. A message naming the app, the store it came from, and the public address of its page.
-
The downloaded file, from the Downloads tab. A verified APK sits in a private directory no file manager can open: it was the one thing you had on your phone and could not pass to anyone. The message also states which hash was verified: the digest computed here while the bytes came down, not the one the store declared.
Known limit: the file reaches the recipient under its staging name (
2.apk, the download's id). The message says which app it is, the filename does not.
-
v0.6.0-BETA
v0.6.0-BETA
Everything a download does after you walk away from the listing.
A transfer has lived in a background worker since the first release, but until now the only place that showed it was the APK page that you may have left. This release gives downloads a surface of their own.
New - the Downloads tab
Between My apps and Settings. Three groups, always in this order:
- Ready to install - the APK is whole on the device and nothing has installed it. With the system installer this is the only thing it is waiting for: a tap. Install does it; Delete throws the file away, with a confirmation.
- In progress - what is coming down, with its size and bar, and a Cancel button that until now existed only on the app's page. Cancelling parks the transfer and keeps what has already arrived; the parked row offers Delete if you want the partial file gone, and says where to resume it.
- History - what you have downloaded, from which store, and how it went: installed, deleted before being installed, or failed. "My apps" answers a different question: what is on the device now, so it cannot tell you any of that.
History is capped, and you choose the cap: Settings → Storage → Download history, default last 100, up to keep them all. Pruning only ever touches concluded rows.
New - the download card says what it wants
- A finished download is now said in words instead of being drawn as a full bar. A full bar and "this can be installed now" are not the same news, and the card used to look most finished at the exact moment it had something to ask.
- The ✕ is now a struck-through eye. On a card carrying a progress bar an ✕ reads as "stop this download", which is the one thing it never did. The eye says hide, which is all it does.
- A new arrow that points forward, to the Downloads tab.
- The Downloads tab wears a dot while something is downloading or waiting to be installed.
New - offer to install as soon as the download finishes
Settings → Installation → Offer to install as soon as it is downloaded. Off by default, and deliberately so: the system's confirmation dialog appearing over whatever you were doing is an interruption, and the entry says so.
It is available only where a confirmation would actually be shown, with root or Shizuku installing silently there is nothing to offer, and the entry is disabled with its reason.
Fixed
- "Clear downloaded APKs" always said "nothing to free". It spared every
READYrow, that is precisely the "downloads you never installed" its own description offers to delete, while the size beside it counted them. It now really deletes them, after a confirmation that says how many ready-to-install apps are about to go. - A download row now survives its installation as a history entry instead of being deleted outright, which is what made a history possible at all.
v0.5.1-BETA
v0.5.1-BETA
A search-screen release. Typing was the part of the app that sometimes worked bad, and all of it came from one place: the text you were typing and the label saying which query the results belonged to were the same piece of state.
Fixed
- The search field no longer eats what you type. While stores were answering, the field sometimes reverted its text and the caret jumped back one or more letters, which made it impossible to type an app's full name.
- A search starts at the top of its own results. The list opened part-way down, with rows above the first visible one that nobody had scrolled past: a store answering late inserts higher-ranked results above what was on screen, and the list scrolled to keep the old row in place. It now stays at the top until you scroll, and once you have scrolled, an arrival no longer pulls you back up.
- The keyboard's search key now searches. It only hid the keyboard before.
- APKCombo listings with no file on their latest page are now immediately installable. Some apps publish nothing on the current-version page, their files live only under the per-version addresses, and the listing said "this store publishes no installable package for this app", with the way out reachable only by opening "Previous versions" and waiting.
Added
- The "some stores did not answer" notice can be dismissed. It sits above the results and cannot be scrolled off, so with a store paused it cost a screenful on every search. The X silences it for that search only: the next query's missing stores are news you have not seen yet.
Known limitations
- APKCombo entries on the Home screen show a placeholder instead of an icon (measured on this build's index: 10 of 40 "What's new" entries, all of them APKCombo; every other store is at zero). Its release feed carries the title, the link, the date and the package name, but no image.
- APKMody rows in search results show a placeholder until you have opened that listing once. Its search cards carry a cover image, not an icon, most often the theme's own placeholder, sometimes a video frame, so showing it would put the wrong picture next to the right title. The real icon is on the listing, and once opened it is remembered.
v0.5.0-BETA
First public release.
MultiStore searches nine third-party Android app stores at once, shows one row per app with every store that publishes it, and installs from the source you pick, through the same verification pipeline every time, with no exceptions for any store.
Requires Android 8.0 (API 26) or newer.
Install
- Download
multistore-0.5.0-BETA.apkbelow. - Open it. Android asks once whether MultiStore may install applications. If your device makes that setting hard to find, MultiStore has a shortcut straight to it.
- From then on MultiStore offers its own updates the same way it offers everyone else's, from a signed index it verifies before applying.
Verify what you downloaded
Every release is signed with the same key, and that key will not change. Android refuses an update signed by a different one, so a mismatch is worth stopping for.
apksigner verify --print-certs multistore-0.5.0-BETA.apkSigner #1 certificate SHA-256 digest:
1c55e627f183f0f3d0e16fc67b211f4f1bd7a7b228ee414c4a9e4eaa0da5d506
What's in it
- One search across nine stores. Queries fan out in parallel, results stream in as each store answers, and a store that fails or gets rate-limited is named next to the results instead of silently vanishing.
- A verification pipeline that runs identically for every store. Size, SHA-256 computed while streaming, the archive read with
apksig, signer comparison against the certificate already installed (including v3 key rotation), and anti-downgrade. The package-name match against the listing is a hard block with no setting to turn it off. - The file verified and the file installed are the same bytes. The hash is computed while writing into the install session, not before it.
- Split containers install properly. XAPK, APKM and APKS bundles are opened, the right ABI and density splits chosen for the device, every language split kept, and base plus splits go into a single
PackageInstallersession. - Updates come from the store the app came from. Each installed app remembers its own update channel, because changing publisher mid-life breaks the update at the OS level. You can change it deliberately and get warned about the signature conflict.
- Three ways to install. The system confirmation always works; Shizuku and root, where available, install silently. No feature requires a privileged channel.
- Everything stays on the device. No telemetry, no accounts, no analytics. The diagnostics log is off by default and is exported by you as plain text you can read first.
- Five languages, light and dark theme. English, Italian, French, Spanish, German.
Stores
AN1 · APKCombo · APKMirror · APKMODY · F-Droid · LiteAPKs · MODYOLO · PDALIFE · Uptodown
Each can be switched off individually in Settings.
What it is not
MultiStore does not host, mirror or rehost anything. It reads publicly reachable pages the way a browser does, on requests a person has just made. It does not solve captchas, forge TLS fingerprints or rotate addresses to get around a block.
Licensed under GPL-3.0.