A self-hosted app store you run entirely from your phone.
Install, refresh, and manage sideloaded apps on-device — no computer required.
Most sideloaders need either a jailbreak or a Mac running companion software. MiniStore needs neither.
After the initial setup, everything happens on your phone — install apps, refresh them before they expire, and update them, all over Wi-Fi. It uses minimuxer, which runs inside iOS's sandbox and talks to the device using Apple's own protocols. No Mac, no USB, no companion app running on a computer.
MiniStore is a fork of SideStore and AltStore, with extra work on stability, performance, and display/personalization options.
- Untethered — Wi-Fi signing and refresh, no companion app required after setup
- Free Apple ID — uses your personal development certificate; apps are valid for 7 days and auto-refreshed before they expire
- Multiple sources — add any AltStore-compatible source URL and browse its apps directly
- App sorting — sort the browse feed by name, developer, or last-updated date, saved per source
- App backups — back up and restore sideloaded apps via the bundled AltBackup companion
- Stable + nightly tracks — flip "Beta Updates" in Settings to follow the nightly build channel
The Display screen in Settings controls how the app looks:
| Toggle | What it does |
|---|---|
| OLED Dark Mode | Pure-black backgrounds in dark mode — easier on OLED panels. |
| Hide Tab Bar Labels | Strips the text from tab bar icons for a cleaner look. |
| Compact My Apps Cards | Shrinks installed app cards from 88 → 66pt. More apps on screen at once. |
| Widget Accent Color | Pushes your accent color to the home screen widget so it all matches. |
| Accent Color | Replace the default teal with any color — presets or a full color picker. |
The Display screen also hosts Change App Icon (alternate icons) and Tab Order (reorder the bottom tabs).
Track your sideloaded apps' expiry countdowns right from your home screen.
- Multiple sizes — small, medium, and large home screen configurations
- Lock screen — compact complications with expiry progress rings
- StandBy mode — full-screen layout when your phone is on the charger
- Accent color sync — respects whatever accent color you've set in the app
- iOS 26 glass — automatically adapts to the new glass home screen mode
MiniStore has been carefully tuned for iOS 26's Liquid Glass redesign:
- Navigation bar appearances are correctly scoped — item-level and bar-level set together where needed to fully suppress the glass compositor
- OLED Dark Mode resolves to pure black across every screen, including the parallax-card detail pages and grouped settings lists (no grey backdrop leaks)
- Large-title rendering in the settings stack is preserved (scroll-edge always stays glass)
- Custom bar button items nil themselves out instead of just hiding, preventing ghost glass capsule artifacts
- The
#unavailable(iOS 26)guard inNavigationBar.layoutSubviewsskips the ContentView position adjustment that would cause layout artifacts on the new bar design
| Requirement | Version |
|---|---|
| iOS | 17.1+ |
| Xcode (to build) | 26+ |
| Apple ID | Free or paid |
Download the latest MiniStore.ipa from the Releases page and install it using any AltStore-compatible sideloader.
Once installed, MiniStore can update itself — just keep an eye on the "My Apps" tab.
# Clone with submodules
git clone --recursive https://github.com/The-Big-Mini/MiniStore.git
cd MiniStore
# Set up code signing for local builds
cp CodeSigning.xcconfig.sample CodeSigning.xcconfig
# Fill in your DEVELOPMENT_TEAM in CodeSigning.xcconfig
# Build, fake-sign extensions, and package
make build
make fakesign
make ipaEverything else is pulled in automatically during the build, so the three make steps are all
you need. The IPA lands at MiniStore.ipa in the repo root. CI and unsigned builds use
AltStoreFree.entitlements with CODE_SIGNING_ALLOWED=NO; local signed builds use the
DEVELOPMENT_TEAM and identity from your CodeSigning.xcconfig.
Tip:
MARKETING_VERSIONinBuild.xcconfigis the single source of truth for version numbers. Don't edit it anywhere else.
AltStore/ Main app target (Swift + ObjC)
Browse/ Source browser — search, sort, install from any source
My Apps/ Installed apps — expiry countdowns, refresh, backup/restore
Settings/ Settings UI including Display and Accent Color screens
Operations/ Async pipeline: download → verify → resign → send → install
Components/ Shared cells, cards, navigation bar, pill buttons
AltStoreCore/ Shared framework — CoreData models, extensions, UserDefaults
AltWidget/ WidgetKit extension — home screen, lock screen, StandBy
AltBackup/ Companion backup app (embedded as an IPA inside the main bundle)
SideStore/ minimuxer bridge + IfManager Wi-Fi interface layer
Dependencies/
AltSign/ Apple developer portal API — certificate + profile management
minimuxer/ On-device communication library (Wi-Fi link to the device)
em_proxy/ Loopback proxy for the device-communication channel
Roxas/ Riley Testut's UIKit framework powering collection views
libimobiledevice/ + libplist/ + libusbmuxd/ — lockdown/usbmux protocol stack
xcconfigs/ Per-target build settings (all inherit from Build.xcconfig)
scripts/ci/ Python CI helpers — versioning, release notes, workflow logic
MiniStore signs apps with your personal Apple development certificate — the same kind Xcode uses when running an app on your own device. Free accounts get 7-day validity per app; paid developer accounts get a full year.
The refresh flow re-signs apps before they expire. minimuxer runs inside the iOS sandbox, communicating with the device over a loopback Wi-Fi channel using Apple's own lockdown protocol. This is what makes the whole thing untethered — the "device" it's talking to is the same device it's running on.
Anisette data (Apple's time-sensitive authentication token) is fetched from a community server. The server URL is configurable under Settings → Advanced if you want to run your own.
Two sources are pre-loaded at first launch:
| Source | What's in it |
|---|---|
| Mini's Repo | A curated personal collection — EeveeSpotify, YouTube tweaks, X/Twitter mods, and more |
| MiniStore Updates | How the app updates itself. Don't remove this one. |
Tap the + button in the Sources tab to add any AltStore-compatible source by URL. The source icon and tint color will be used throughout the browse experience once it loads.
| Channel | Trigger | Notes |
|---|---|---|
| Stable | Manual tag push or workflow dispatch | Attached to GitHub Releases |
| Nightly | 00:00 UTC daily (if commits exist) | Opt in via Settings → Beta Updates |
| PR builds | Every push to a PR (Swift/config changes) | IPA attached to the PR by Actions |
All pipelines run on macos-26 / Xcode 26.2. The version number is stamped by scripts/ci/workflow.py before building, so you never need to manually update version fields in multiple places.
Pull requests welcome. A few things worth knowing before diving in:
Architecture:
- The operations pipeline (
AltStore/Operations/) usesNSOperation, notasync/await. Don't mix them in the same chain — dependency management, cancellation, and progress reporting are all built around the NSOperation model. - The UI has been migrated from UIKit to SwiftUI. All five tabs (Browse, My Apps, Updates, Sources, News), the app-detail and source-detail screens, the authentication flow, and every Settings screen are now SwiftUI, hosted in
UIHostingControllers that plug into the existing UIKit navigation stack. Only the launch bootstrap (LaunchViewController), the tab/navigation controllers, andToastViewremain UIKit by design. Write new screens in SwiftUI;SettingsHostingControlleris the standard host for settings screens. - Never hardcode bundle IDs — debug builds append the team ID suffix, so
com.SideStore.SideStore.S32Z3HMYVQandcom.SideStore.SideStoreare the same app in different build configurations.
A few gotchas:
side.json/sidenightly.jsonare the self-update sources and live in this repo, served raw from thedevelopbranch. CI stamps them automatically on each stable/nightly build — no manual editing needed. (The oldMiniStore-Publicmirror was retired in 2026-06; this repo is public now.)- The minimuxer
documentsDirectoryargument must stay as.absoluteString, not.path. The bridge expects thefile://prefix. This has been changed twice by mistake and reverted both times. configureWithDefaultBackground()must stay onscrollEdgeAppearancein the settings stack. Using an opaque appearance there suppresses large-title rendering on iOS 26.
The project uses a Claude Code intelligence system (.claude/) with architecture decision records, gotcha documentation, and pattern guides. Worth reading if you're making structural changes.
See CONTRIBUTING.md for the full development setup walkthrough.
MiniStore is developed with heavy use of AI — specifically Claude, via Claude Code. Development currently runs on Opus 4.8 and will move back to Fable 5 once it's available again. Claude assists with writing and reviewing code, hunting bugs, and maintaining documentation, and it authored the .claude/ intelligence system (architecture decision records, gotchas, and pattern guides) that the project relies on. Commits and pull requests produced with AI assistance are marked as such in their messages.
All changes are reviewed before merging, and the maintainers are responsible for everything that ships. This note is here for transparency, not as a disclaimer of ownership.
MiniStore wouldn't exist without:
- Riley Testut — for building AltStore, AltSign, and Roxas, and open-sourcing all of it
- SideStore contributors — for showing untethered sideloading was possible and open-sourcing it
- jkcoxson — for minimuxer, em_proxy, and the on-device communication stack
- The broader sideloading community for keeping the ecosystem alive
Licensed under the AGPL v3. See LICENSE for the full text.
Portions derived from AltStore and SideStore, both AGPL v3. The minimuxer library carries its own license.