Skip to content

Latest commit

 

History

History
235 lines (163 loc) · 12.5 KB

File metadata and controls

235 lines (163 loc) · 12.5 KB

MiniStore

MiniStore

A self-hosted app store you run entirely from your phone.
Install, refresh, and manage sideloaded apps on-device — no computer required.

Latest Release Nightly Build CI iOS 17.1+ iOS 26 Ready AGPL v3


What is MiniStore?

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.


Features

Core

  • 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

Display & personalization

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).

Home screen widget

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

iOS 26 & Liquid Glass

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 in NavigationBar.layoutSubviews skips the ContentView position adjustment that would cause layout artifacts on the new bar design

Requirements

Requirement Version
iOS 17.1+
Xcode (to build) 26+
Apple ID Free or paid

Installing a pre-built release

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.


Building from source

# 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 ipa

Everything 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_VERSION in Build.xcconfig is the single source of truth for version numbers. Don't edit it anywhere else.


Project layout

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

How signing works

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.


Sources

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.


Releases & CI

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.


Contributing

Pull requests welcome. A few things worth knowing before diving in:

Architecture:

  • The operations pipeline (AltStore/Operations/) uses NSOperation, not async/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, and ToastView remain UIKit by design. Write new screens in SwiftUI; SettingsHostingController is the standard host for settings screens.
  • Never hardcode bundle IDs — debug builds append the team ID suffix, so com.SideStore.SideStore.S32Z3HMYVQ and com.SideStore.SideStore are the same app in different build configurations.

A few gotchas:

  • side.json / sidenightly.json are the self-update sources and live in this repo, served raw from the develop branch. CI stamps them automatically on each stable/nightly build — no manual editing needed. (The old MiniStore-Public mirror was retired in 2026-06; this repo is public now.)
  • The minimuxer documentsDirectory argument must stay as .absoluteString, not .path. The bridge expects the file:// prefix. This has been changed twice by mistake and reverted both times.
  • configureWithDefaultBackground() must stay on scrollEdgeAppearance in 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.


AI disclosure

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.


Acknowledgements

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

License

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.