Android app store for open-source apps on GitHub. Developers publish an app by adding the topic "arkstore" to its repository; the store installs and updates APKs straight from GitHub releases.
Kotlin
12
101 commits
updated Oct 4, 2026
ARK-Store is an Android app store for open-source apps published on GitHub. A developer adds one topic to the repository and the app is in the store; new versions follow every release. No account, no submission form, no review queue, no fees.
LICENSE file from
GitHub's license picker.arkstore to the repository (the gear next to About).The app appears for every user at the next index run, usually within a few hours. To take it out of the store, remove the topic. Private or unlicensed repositories are never listed.
The same four steps work on Codeberg and GitLab with ARK-Store 1.4 and later.
LICENSE or COPYING in the
repository root. The file must hold the full, unchanged text of a common license (GPL,
AGPL, LGPL, Apache, MIT, BSD, MPL, ISC, EUPL, Unlicense, CC0), preceded only by a title and
copyright lines. After a license that ends in "END OF TERMS AND CONDITIONS" the file may
go on; after the others only the licenses of included parts may follow. A file that only
names a license or changes its terms is not recognised.The store refreshes when opened, at most once every five minutes; pulling down or the
refresh button checks right away. If an app is still missing after half a day, check that
the repository is public, has a recognised license and that its latest full release has an
.apk file attached.
Under Sources in the app, anyone can type a GitHub user name or paste a link to a profile or a repository. That account's apps, or that one app, are then listed on that device, under the same two requirements. Useful for trying your own app before adding the topic, or for following a developer who has not added it.
arkstore-communication, arkstore-productivity,
arkstore-tools, arkstore-personalization, arkstore-media, arkstore-games,
arkstore-travel, arkstore-news, arkstore-system, arkstore-health,
arkstore-finance or arkstore-education. Without one, a few common topics such as
launcher, keyboard, dialer and weather are recognised; the rest goes under Other.arm64-v8a, armeabi-v7a, x86_64, x86 or
universal) in the file name and each device gets the right one.versionCode each time. Android refuses an
update signed with another key.versionCode) is offered only to users with Show beta versions on, marked Beta. Drafts
are ignored.Besides the apps developers publish with the topic, the index searches GitHub for other open-source Android apps. They are shown only with Found on GitHub on, and their card says the developer did not publish them here. Nobody has checked these apps.
The search covers repositories with the topic android written in Kotlin, Java or Dart, and
repositories with the topic android-app. A repository qualifies when it
The limits are constants at the top of tools/build_index.py. To stay off this list, remove
the topic the search found the repository by; to be listed for everyone, add arkstore.
What the list does not promise:
The list is auto.json next to the index, downloaded only while the switch is on. Beta
versions of these apps are not offered.
Found on Codeberg does the same for Codeberg with lower limits: topic android or
android-app, at least 5 stars, active within 30 days, a license recognised from the license
file, and a full release at most 180 days old with an APK (codeberg.json). Mirrors are
skipped. Found on GitLab does the same for gitlab.com with the same limits; few projects
there attach APKs, so the list is short (gitlab.json).
Two catalogues can be turned on in the settings, each with a switch of its own:
The index reads each catalogue's own index, checks it against the catalogue's checksum and
writes izzy.json and fdroid.json. The APKs are downloaded from the catalogue and checked
against its SHA-256 checksum before installing. The newest version the device can run is
offered, and for an installed app the newest one signed with the same key. Their cards carry
the catalogue's name, and their details show the catalogue's warnings, such as tracking or
non-free network services. Stars and download counts are not shown for them.
A package is listed once, in this order:
arkstore topic,An installed app stays with the place whose files are signed the way it is: an app installed from F-Droid keeps updating from F-Droid even when its developer also releases on GitHub. The details name the other places.
Those two requirements are the store's only gatekeeping, checked on every refresh. A public repository means the source can be read; an open-source license means the code may be used, studied and shared. A repository that loses its license disappears from the store.
ARK-Store does not review, build or host apps. Every app shows where it comes from and who made it, and its source is one tap away.
What the store checks:
What the store does not check:
tools/build_index.py, published on the index branch) and HTTPS.Install apps from developers you trust.
.github/workflows/index.yml) asks GitHub for every
repository with the arkstore topic. Forks, archived repositories and repositories
without a recognised license are dropped..apk file attached.icons folder of the index branch,
vector icons as their paths.index.json on the index branch.The app reads one file instead of asking GitHub about every repository, so the number of apps does not affect loading and GitHub's request limit does not come into it. The limit is GitHub's search, which returns at most a thousand repositories for the topic.
Sources added by hand are not in that file: the app asks GitHub about them directly, within the 60 anonymous requests an hour GitHub allows per network. The same lookup is the fallback when the index is missing or more than a day old.
./gradlew assembleDebug
The debug build installs as org.jarsi.arkstore.debug next to a release build.
The store topic, the index locations, the account that is a source on every new installation
and the store's own repository are build config fields in app/build.gradle.kts
(STORE_TOPIC, INDEX_URL, AUTO_INDEX_URL, FORGE_INDEX_URL, CODEBERG_INDEX_URL,
GITLAB_INDEX_URL, IZZY_INDEX_URL, FDROID_INDEX_URL, GITHUB_OWNER, STORE_REPO). The
lists are built with python3 tools/build_index.py --output index.json --auto-output auto.json,
python3 tools/build_repos.py --output-dir . and python3 tools/build_forge.py --output-dir ..
Release signing is read from a keystore.properties file in the project root, which is never
committed:
storeFile=release.jks
storePassword=...
keyAlias=...
keyPassword=...
Without that file the release build is left unsigned.
ARK-Store is licensed under the GNU General Public License v3.
Kotlin
60.4%
Python
39.6%
Android app store for open-source apps on GitHub. Developers publish an app by adding the topic "arkstore" to its repository; the store installs and updates APKs straight from GitHub releases.
Kotlin
12
101 commits
updated Oct 4, 2026
ARK-Store is an Android app store for open-source apps published on GitHub. A developer adds one topic to the repository and the app is in the store; new versions follow every release. No account, no submission form, no review queue, no fees.
LICENSE file from
GitHub's license picker.arkstore to the repository (the gear next to About).The app appears for every user at the next index run, usually within a few hours. To take it out of the store, remove the topic. Private or unlicensed repositories are never listed.
The same four steps work on Codeberg and GitLab with ARK-Store 1.4 and later.
LICENSE or COPYING in the
repository root. The file must hold the full, unchanged text of a common license (GPL,
AGPL, LGPL, Apache, MIT, BSD, MPL, ISC, EUPL, Unlicense, CC0), preceded only by a title and
copyright lines. After a license that ends in "END OF TERMS AND CONDITIONS" the file may
go on; after the others only the licenses of included parts may follow. A file that only
names a license or changes its terms is not recognised.The store refreshes when opened, at most once every five minutes; pulling down or the
refresh button checks right away. If an app is still missing after half a day, check that
the repository is public, has a recognised license and that its latest full release has an
.apk file attached.
Under Sources in the app, anyone can type a GitHub user name or paste a link to a profile or a repository. That account's apps, or that one app, are then listed on that device, under the same two requirements. Useful for trying your own app before adding the topic, or for following a developer who has not added it.
arkstore-communication, arkstore-productivity,
arkstore-tools, arkstore-personalization, arkstore-media, arkstore-games,
arkstore-travel, arkstore-news, arkstore-system, arkstore-health,
arkstore-finance or arkstore-education. Without one, a few common topics such as
launcher, keyboard, dialer and weather are recognised; the rest goes under Other.arm64-v8a, armeabi-v7a, x86_64, x86 or
universal) in the file name and each device gets the right one.versionCode each time. Android refuses an
update signed with another key.versionCode) is offered only to users with Show beta versions on, marked Beta. Drafts
are ignored.Besides the apps developers publish with the topic, the index searches GitHub for other open-source Android apps. They are shown only with Found on GitHub on, and their card says the developer did not publish them here. Nobody has checked these apps.
The search covers repositories with the topic android written in Kotlin, Java or Dart, and
repositories with the topic android-app. A repository qualifies when it
The limits are constants at the top of tools/build_index.py. To stay off this list, remove
the topic the search found the repository by; to be listed for everyone, add arkstore.
What the list does not promise:
The list is auto.json next to the index, downloaded only while the switch is on. Beta
versions of these apps are not offered.
Found on Codeberg does the same for Codeberg with lower limits: topic android or
android-app, at least 5 stars, active within 30 days, a license recognised from the license
file, and a full release at most 180 days old with an APK (codeberg.json). Mirrors are
skipped. Found on GitLab does the same for gitlab.com with the same limits; few projects
there attach APKs, so the list is short (gitlab.json).
Two catalogues can be turned on in the settings, each with a switch of its own:
The index reads each catalogue's own index, checks it against the catalogue's checksum and
writes izzy.json and fdroid.json. The APKs are downloaded from the catalogue and checked
against its SHA-256 checksum before installing. The newest version the device can run is
offered, and for an installed app the newest one signed with the same key. Their cards carry
the catalogue's name, and their details show the catalogue's warnings, such as tracking or
non-free network services. Stars and download counts are not shown for them.
A package is listed once, in this order:
arkstore topic,An installed app stays with the place whose files are signed the way it is: an app installed from F-Droid keeps updating from F-Droid even when its developer also releases on GitHub. The details name the other places.
Those two requirements are the store's only gatekeeping, checked on every refresh. A public repository means the source can be read; an open-source license means the code may be used, studied and shared. A repository that loses its license disappears from the store.
ARK-Store does not review, build or host apps. Every app shows where it comes from and who made it, and its source is one tap away.
What the store checks:
What the store does not check:
tools/build_index.py, published on the index branch) and HTTPS.Install apps from developers you trust.
.github/workflows/index.yml) asks GitHub for every
repository with the arkstore topic. Forks, archived repositories and repositories
without a recognised license are dropped..apk file attached.icons folder of the index branch,
vector icons as their paths.index.json on the index branch.The app reads one file instead of asking GitHub about every repository, so the number of apps does not affect loading and GitHub's request limit does not come into it. The limit is GitHub's search, which returns at most a thousand repositories for the topic.
Sources added by hand are not in that file: the app asks GitHub about them directly, within the 60 anonymous requests an hour GitHub allows per network. The same lookup is the fallback when the index is missing or more than a day old.
./gradlew assembleDebug
The debug build installs as org.jarsi.arkstore.debug next to a release build.
The store topic, the index locations, the account that is a source on every new installation
and the store's own repository are build config fields in app/build.gradle.kts
(STORE_TOPIC, INDEX_URL, AUTO_INDEX_URL, FORGE_INDEX_URL, CODEBERG_INDEX_URL,
GITLAB_INDEX_URL, IZZY_INDEX_URL, FDROID_INDEX_URL, GITHUB_OWNER, STORE_REPO). The
lists are built with python3 tools/build_index.py --output index.json --auto-output auto.json,
python3 tools/build_repos.py --output-dir . and python3 tools/build_forge.py --output-dir ..
Release signing is read from a keystore.properties file in the project root, which is never
committed:
storeFile=release.jks
storePassword=...
keyAlias=...
keyPassword=...
Without that file the release build is left unsigned.
ARK-Store is licensed under the GNU General Public License v3.
Kotlin
60.4%
Python
39.6%