The Problem
Installing apps from GitHub releases is manual and error-prone: you must find the right repository, verify it ships an actual APK, pick the correct asset for your device architecture, and track updates yourself. RepoStore turns GitHub releases into a Play Store-style browsing and installation experience, filtering to repositories that genuinely publish installable APK assets.
What This Does
RepoStore is a native Android app (pure Kotlin, Material 3, MVVM) that discovers GitHub repositories shipping APKs, shows their latest releases, and installs them directly. The app/ module contains the full UI: home feed with trending/featured sections, category browsing, search, favorites, and a detail screen with README rendering, changelogs, and screenshots. The GitCore/ module is a small library for resolving app names, icons, and package IDs from GitHub repos.
The app tracks installed apps via InstalledAppMappingDao and shows update availability. Downloads go through MultiPartDownloader, and installation is handled by AppInstaller. GitHub authentication is supported via GitHubAuth with token storage in SecureTokenStorage.
How It Is Wired
Execution starts at MainActivity.kt, which hosts the bottom-navigation fragments: HomeFragment, SearchFragment, TrendingFragment, GameFragment, and SettingsFragment. Each fragment delegates to a ViewModel (HomeViewModel, SearchViewModel, etc.) that calls GitHubRepository.kt. That repository routes through GitHubApi.kt (Retrofit) to hit the GitHub REST API, and through AppDatabase.kt (Room) for local favorites and install mappings.
The heavy path is the detail flow: DetailActivity.kt (634 lines) fetches repo metadata, latest release, README, and screenshots, then triggers downloads via MultiPartDownloader and installation via AppInstaller. The GitHubRepository is the central hub — most ViewModels depend on it, so changes there ripple widely.
The module graph shows no internal modules and no cycles; GitCore is a standalone library with no dependency on app. The wiring is straightforward: UI → ViewModel → Repository → API/DB, with utility classes (ApkArchitectureHelper, PackageIdFetcher, VersionComparator) handling the messy details.
How To Use It
Clone and build with Gradle:
git clone https://github.com/moses-y/RepoStore
cd RepoStore
./gradlew assembleDebug
Install the APK from app/build/outputs/apk/debug/. The app works without configuration; GitHub API rate limits apply. Optional: provide a GitHub token in the app's settings screen (GitHubTokenActivity) to raise limits. The fastlane/ directory suggests release automation exists but no CI workflow is present in the repo.
Real-World Use
A user wants an open-source app that's not on Google Play. RepoStore finds it, shows the latest release, checks if it's already installed, and offers a single-tap install. For a developer, it's a reference for building a GitHub-releases-as-app-store client, including APK architecture detection and multi-part downloads.
Code Health & Issues
Static analysis (not opinion) found 36 issues: 7 high, 29 medium. Key findings:
- High - Deep nesting (x28) —
GitHubAuth.kt,GitHubRepository.kt,HomeFragment.kthit indentation depth 8. Fix with early returns and guard clauses. - High - Duplicated code blocks — 172 repeated 6-line blocks across 40 files, including
AppNameResolver.ktandIconResolver.kt. Extract shared helpers. - Medium - Oversized files —
DetailActivity.ktandAppInstaller.ktexceed 600 lines. Split by responsibility. - Medium - High branching density —
ApkArchitectureHelper.kthas 35 branch points over 119 lines. Consider strategy dispatch. - High - No CI — 84 source files, no build/test workflow. Every change merges unverified.
Tests exist (9 files) but are mostly placeholder ExampleUnitTest/ExampleInstrumentedTest files. No Dockerfile, no lockfile, no committed secrets.
The Bottom Line
A solid, feature-complete Android app with a clean MVVM structure and a useful GitCore library. The main risks are maintainability — deep nesting, duplication, and oversized files — and the complete absence of CI. Worth using as a reference for GitHub-API Android integration, but production adoption needs CI and refactoring first.