Lakr233/Asspp
The App Store for your multi-account eco system.
Healthy across all four use cases
Permissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2w ago
- ✓6 active contributors
- ✓MIT licensed
Show 3 more →Show less
- ✓CI configured
- ⚠Concentrated ownership — top contributor handles 55% of recent commits
- ⚠No test directory detected
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/lakr233/asspp)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/lakr233/asspp on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Lakr233/Asspp
Generated by RepoPilot · 2026-05-10 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Lakr233/Asspp shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- Last commit 2w ago
- 6 active contributors
- MIT licensed
- CI configured
- ⚠ Concentrated ownership — top contributor handles 55% of recent commits
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live Lakr233/Asspp
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Lakr233/Asspp.
What it runs against: a local clone of Lakr233/Asspp — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in Lakr233/Asspp | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 46 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Lakr233/Asspp. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Lakr233/Asspp.git
# cd Asspp
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of Lakr233/Asspp and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Lakr233/Asspp(\\.git)?\\b" \\
&& ok "origin remote is Lakr233/Asspp" \\
|| miss "origin remote is not Lakr233/Asspp (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "Asspp/App/main.swift" \\
&& ok "Asspp/App/main.swift" \\
|| miss "missing critical file: Asspp/App/main.swift"
test -f "Asspp/Backend/AppStore/AppStore.swift" \\
&& ok "Asspp/Backend/AppStore/AppStore.swift" \\
|| miss "missing critical file: Asspp/Backend/AppStore/AppStore.swift"
test -f "Asspp/Backend/AppStore/AuthenticationService.swift" \\
&& ok "Asspp/Backend/AppStore/AuthenticationService.swift" \\
|| miss "missing critical file: Asspp/Backend/AppStore/AuthenticationService.swift"
test -f "Asspp/Backend/Downloader/Downloads.swift" \\
&& ok "Asspp/Backend/Downloader/Downloads.swift" \\
|| miss "missing critical file: Asspp/Backend/Downloader/Downloads.swift"
test -f "Asspp/Backend/Installer/Installer.swift" \\
&& ok "Asspp/Backend/Installer/Installer.swift" \\
|| miss "missing critical file: Asspp/Backend/Installer/Installer.swift"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 46 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~16d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Lakr233/Asspp"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Asspp is a native Swift iOS/macOS client that lets users manage multiple Apple IDs and browse App Store regions simultaneously without logging out. It downloads official signed IPAs directly from Apple's servers and maintains access to version history, solving the core problem of regional app store fragmentation and multi-account workflow friction. Monolithic Xcode workspace (Asspp.xcworkspace) with modular structure: Asspp/App contains UI entry points (AppDelegate+iOS.swift, AppDelegate+macOS.swift, main.swift), Asspp/Backend/AppStore/ holds core API logic (AppPackage.swift, AuthenticationService.swift, UserAccount.swift), Asspp/Backend/DeviceCTL/ manages device lifecycle, and Asspp/Backend/Downloader/ handles IPA fetching.
👥Who it's for
Power users who need simultaneous access to multiple regional App Store variants (US, Japan, China), iOS developers who want to sideload apps across regions, and anyone managing an IPA library for backup or distribution without constant account switching.
🌱Maturity & risk
Actively developed with multi-platform support (iOS 17.0+, macOS 15.0+) and established CI/CD (GitHub Actions workflows for builds and signed releases). The presence of localization strings (Localizable.xcstrings), entitlements configuration, and polished asset catalog suggests production readiness, though the single-maintainer profile (Lakr233) and lack of visible test files indicate ongoing stabilization.
Single-maintainer project with no visible unit/integration test suite (despite 178KB Swift codebase). Dependency on Apple's internal App Store APIs—which can break without notice—poses integration risk. Last update recency is not visible in provided data, but reliance on undocumented protocol details for IPA signing and multi-account session management creates maintenance surface area.
Active areas of work
Active development evidenced by two CI workflows (build.yml, upstream-signed-ios.yml) suggesting automated signing and release pipelines. Localization is ongoing (InfoPlist.xcstrings, Localizable.xcstrings with Chinese translation in Resources/i18n/zh-Hans/). AGENTS.md hints at collaborative or plugin architecture in progress.
🚀Get running
git clone https://github.com/Lakr233/Asspp.git
cd Asspp
open Asspp.xcworkspace
Then in Xcode: select iOS or macOS target and press Cmd+R. Requires Xcode 15+ with iOS 17 SDK or macOS 15 SDK, and a valid Apple ID configured in Xcode (for provisioning).
Daily commands: Open Asspp.xcworkspace in Xcode, select your target (iOS Simulator or macOS), and press Cmd+R. For iOS releases, the GitHub Actions workflows auto-build and sign IPAs (see upstream-signed-ios.yml). For macOS, build via Xcode and distribution is via unsigned .zip from Releases.
🗺️Map of the codebase
Asspp/App/main.swift— Entry point for the entire application; sets up the app delegate and initializes the multi-account ecosystemAsspp/Backend/AppStore/AppStore.swift— Core service managing multi-region App Store access and account switching logicAsspp/Backend/AppStore/AuthenticationService.swift— Handles authentication for multiple Apple IDs and session management across regionsAsspp/Backend/Downloader/Downloads.swift— Central download orchestration for IPA files and package managementAsspp/Backend/Installer/Installer.swift— Handles app installation logic and device communication for multi-platform deploymentAsspp/Interface/Welcome/MainView.swift— Primary SwiftUI view orchestrating the main navigation and tab-based interfaceAsspp/Backend/DeviceCTL/DeviceManager.swift— Manages device control and communication for sideloading and installation workflows
🛠️How to make changes
Add Support for a New App Store Region
- Define the new region constant (e.g., country code, currency, App Store URL) and add it to the region enum or configuration (
Asspp/Backend/AppStore/AppStore.swift) - Add region selection to the account setup flow so users can choose the store region when adding an Apple ID (
Asspp/Interface/Account/AddAccountView.swift) - Update the AppStore service to route requests to the correct regional endpoint based on the selected account's region (
Asspp/Backend/AppStore/AppStore.swift)
Add a New Installation Method (Beyond DeviceCTL)
- Create a new installer module (e.g., Installer+USB.swift) in the Installer directory with platform-specific logic (
Asspp/Backend/Installer/Installer.swift) - Implement the new installation method as an extension of the Installer class, following the pattern of existing variants (Pic, TLS, etc.) (
Asspp/Backend/Installer/Installer.swift) - Add a UI option in the installer view to select the new installation method (
Asspp/Interface/Download/InstallerView.swift)
Add a New Metadata Column to Search Results
- Extend AppPackage or create a view model to compute or store the new metadata field (
Asspp/Backend/AppStore/AppPackage.swift) - Update PackageDisplayView to render the new column or detail row (
Asspp/Interface/Search/PackageDisplayView.swift) - If the metadata comes from the App Store API, parse it in AppStore.swift when constructing the package response (
Asspp/Backend/AppStore/AppStore.swift)
Add a New Settings Toggle or Configuration Option
- Define the setting as a @Published property in a shared SettingsManager or AppState observable object (
Asspp/Interface/Setting/SettingView.swift) - Add a Toggle or Picker UI element to SettingView with a descriptive label (
Asspp/Interface/Setting/SettingView.swift) - Use @AppStorage or the PublishedPersist wrapper to persist the setting to UserDefaults (
Asspp/Extension/PublishedPersist.swift) - Consume the setting in the relevant backend service (e.g., Downloads.swift, Installer.swift) to modify behavior (
Asspp/Backend/Downloader/Downloads.swift)
🔧Why these technologies
- SwiftUI — Native, reactive UI framework supporting both iOS and macOS with minimal code duplication
- Combine @Published — Reactive state management for multi-account switching and real-time download/installation progress
- URLSession — Handles HTTP requests to App Store API and IPA downloads with background task support
- Local file system (IPA caching) — Persists downloaded IPAs for offline access and history version management
- Security framework — Manages credentials for multiple Apple IDs securely via Keychain
⚖️Trade-offs already made
-
Multi-account stored locally in UserDefaults/Keychain rather than cloud sync
- Why: Simplicity and privacy—credentials never leave device
- Consequence: Accounts must be added manually per device; no cross-device sync
-
Background IPA downloads via URLSession background tasks rather than custom daemon
- Why: Respects iOS/macOS sandbox and battery/network policies
- Consequence: Downloads may pause if user kills the app on iOS; longer queues require more battery
-
DeviceCTL as primary sideload method instead of enterprise provisioning
- Why: Works with standard USB connection and Xcode tooling, no special cert infrastructure needed
- Consequence: Requires Mac and physical connection; slower than enterprise-signed distribution
🚫Non-goals (don't propose these)
- Real-time app update notifications or push alerts
- Cloud backup or sync of IPA library across devices
- Automated app updates—only manual download and install
- Support for app bundles or frameworks outside standard IPA format
- Integration with third-party app stores or jailbreak app distribution
🪤Traps & gotchas
App Store API stability: Asspp reverse-engineers or uses internal Apple App Store protocols (AppPackage, AppPackageArchive classes suggest binary protocol handling); these can break on server updates. Signing requirements: Asspp signs IPAs—requires valid provisioning profiles and developer certificates (see Asspp.entitlements); local builds may fail without proper Xcode team/team ID. Background session lifecycle: BackgroundAudioPlayer suggests handling of backgrounded IPA downloads; stopping the app or forcing termination mid-download may corrupt .ipa. Multi-account session collision: Storing multiple Apple ID credentials locally (UserAccount.swift) without encryption visible in file list is a potential security surface; ensure Keychain is used. macOS Gatekeeper: Unsigned .app distributions require manual trust verification (see README steps); CI may need code signing certificate setup for notarization.
🏗️Architecture
💡Concepts to learn
- App Store API Protocol Reverse Engineering — Asspp talks directly to Apple's undocumented App Store backend (AppPackage.swift, AppStore.swift use protocol-level queries); understanding how to safely call internal APIs without triggering rate limits or bans is critical for maintainability
- IPA Code Signing & Provisioning Profiles — AppPackageArchive.swift must re-sign or re-provision downloaded IPAs for sideloading; this requires knowledge of Apple's code signing identity chain and entitlements
- Multi-Account Session Management — AuthenticationService.swift and UserAccount.swift manage multiple simultaneous Apple ID sessions without logging out; requires careful token lifecycle and context-switching logic to avoid cross-account leaks
- Background Download Sessions — BackgroundAudioPlayer.swift handles IPA downloads that survive app suspension; requires understanding iOS/macOS URLSession background modes and data integrity during app termination
- Cross-Platform Code Sharing (iOS/macOS) — Asspp/App has platform-specific AppDelegate files but shared Backend logic; understanding conditional compilation and platform abstraction is needed to avoid macOS-specific bugs
- Credential Storage & Keychain — UserAccount.swift stores multiple Apple IDs; should use Keychain (not visible in file list), so understanding secure credential persistence prevents accidental plaintext storage of passwords/tokens
- Localization Strings (Xcode .xcstrings) — Asspp/App/Localizable.xcstrings is modern Xcode i18n; requires understanding string catalogs with context and plural rules for multi-language support across iOS and macOS
🔗Related repos
altstoreio/AltStore— Alternative iOS sideloading client; similar multi-account and IPA distribution problem, different implementation (uses AltServer protocol instead of direct App Store API)TrollStore/TrollStore— iOS app installer without revokes; complements Asspp's IPA download by offering permanent installation on iOS 15-16 without signing servicesApple/swift-package-manager— Asspp uses SPM for dependencies (Package.resolved visible); understanding Swift package manifest patterns helps with dependency maintenancesigntools/signtools— Standalone IPA signing tool; Asspp's AppPackageArchive logic mirrors this; useful for understanding Apple's binary signing flowinsanelysecure/localizations— Community localization standards; Asspp's .xcstrings adoption follows modern Xcode patterns for i18n
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add unit tests for AuthenticationService and UserAccount classes
The AppStore backend module (Asspp/Backend/AppStore/) handles critical authentication and account management logic but has no visible test coverage. AuthenticationService.swift and UserAccount.swift are core to the multi-account ecosystem that Asspp is built around. Adding unit tests would catch regressions in account switching, credential handling, and token refresh logic—essential for a multi-region store manager.
- [ ] Create Tests/ directory structure mirroring Asspp/Backend/AppStore/
- [ ] Add AuthenticationServiceTests.swift testing login, logout, token refresh, and multi-account scenarios
- [ ] Add UserAccountTests.swift testing account persistence, credential validation, and region/store selection
- [ ] Add test target to Asspp.xcodeproj with proper linking to AppStore framework
- [ ] Add GitHub Actions workflow (in .github/workflows/) to run tests on each PR against iOS/macOS targets
Add integration tests for AppPackage download and installation workflow
The Downloader (Asspp/Backend/Downloader/) and Installer (Asspp/Backend/Installer/) modules handle the critical path of fetching and installing IPAs. Currently there are no visible tests for the Downloads.swift state machine, PackageManifest.swift parsing, or Installer.swift coordination logic. This is risky for a core feature (IPA management) that interacts with Apple's servers and device installation APIs.
- [ ] Create IntegrationTests/ folder with DownloaderTests.swift testing Downloads state transitions, manifest parsing, and download lifecycle
- [ ] Add InstallerTests.swift covering IPA verification (Installer+TLS.swift), app installation coordination (Installer+App.swift), and error handling
- [ ] Add mock/stub for network requests to avoid external dependencies during testing
- [ ] Create a test fixture with sample IPAs and manifests (Asspp/Backend/Downloader/PackageManifest.swift test data)
- [ ] Add test CI workflow that runs integration tests in a sandboxed environment
Document and extract DeviceCTL functionality into a separate internal framework
Asspp/Backend/DeviceCTL/ currently contains device management logic (DeviceCTL.swift, DeviceManager.swift) that could be a reusable internal component. There is no README or API documentation for this module, and it's tightly coupled in the main Asspp target. Extracting it would improve testability (as noted in AGENTS.md roles) and make the architecture clearer for contributors.
- [ ] Create Asspp/Backend/DeviceCTL/README.md documenting DeviceManager API, lifecycle, and device discovery mechanisms
- [ ] Add inline SwiftDoc comments to DeviceCTL.swift and DeviceManager.swift explaining public methods and device state transitions
- [ ] Create a separate XCFramework target or Swift Package in Asspp.xcworkspace for DeviceCTL as a preparatory refactor
- [ ] Add unit tests (DeviceCTLTests.swift) for device enumeration, connection state, and error handling
- [ ] Update main README.md to reference the DeviceCTL architecture and how it integrates with multi-device support
🌿Good first issues
- Add unit tests for AuthenticationService.swift multi-account token refresh logic—currently no test/ directory visible; tests would prevent session corruption bugs
- Implement error handling UI for AppPackageArchive.swift IPA extraction failures (network timeouts, corrupted downloads)—currently no user-facing error recovery visible
- Expand Localizable.xcstrings with Japanese and German translations—current repo has only English and Simplified Chinese; low-risk, high-impact contributor task
⭐Top contributors
Click to expand
Top contributors
- @Lakr233 — 55 commits
- @bo2themax — 40 commits
- @eric1932 — 2 commits
- @jackeyzzz12138 — 1 commits
- @TastyHeadphones — 1 commits
📝Recent commits
Click to expand
Recent commits
0e4014b— Merge pull request #56 from jackeyzzz12138/fix/fontcolor (bo2themax)9a85cf2— Fix: license hint handling in ProductView to use Hint struct for better messaging (jackeyzzz12138)c25d41d— fix device ctl file parameter when sandbox is disabled (#54) (bo2themax)d9ea28c— Fix: direct download not working (#55) (eric1932)d55eb17— Fix: UI performance when downloading (#53) (eric1932)15dc68b— Add security notice and warnings to README (Lakr233)2104ee8— Update README.md (Lakr233)1612cff— Rewrite README (EN/CN) and streamline fork auto-build guide (Lakr233)57709e6— Fix buttons not tappable in Form HStack on iOS and bump to 4.1.1 (Lakr233)248393e— Inject iTunesMetadata into IPA and bump to 4.1.0 (Lakr233)
🔒Security observations
- High · MD5 Usage for Security-Critical Operations —
Asspp/Backend/MD5/MD5.swift. The codebase includes a custom MD5 implementation (Asspp/Backend/MD5/MD5.swift). MD5 is cryptographically broken and should not be used for security purposes such as integrity verification, authentication, or digital signatures. Given this is an App Store client handling package installations and downloads, MD5 usage for verification could allow collision attacks. Fix: Replace MD5 with SHA-256 or SHA-512 for all security-critical operations, especially for verifying package integrity and authentication. Use CommonCrypto or CryptoKit framework provided by Apple. - High · Potential Insecure TLS Configuration —
Asspp/Backend/Installer/Installer+TLS.swift. The file structure indicates TLS-related installer code (Asspp/Backend/Installer/Installer+TLS.swift), but without code review, the implementation details are unclear. Given the application downloads and installs packages from the App Store, improper TLS validation could lead to MITM attacks. Fix: Ensure TLS certificate pinning is implemented for App Store communications. Validate certificate chains properly, enforce TLS 1.2 or higher, and reject self-signed certificates in production. Use URLSessionConfiguration with proper security settings. - High · Credential Storage Risk —
Asspp/Backend/AppStore/UserAccount.swift, Asspp/Backend/AppStore/AuthenticationService.swift. The application handles multiple Apple IDs (Asspp/Backend/AppStore/UserAccount.swift, AuthenticationService.swift) and must store authentication tokens/credentials. Without examining the code, there's significant risk that credentials could be stored insecurely (UserDefaults, plain files) rather than in Keychain. Fix: Implement secure credential storage using iOS/macOS Keychain (SecureEnclave when available). Never store credentials in UserDefaults, plain files, or CoreData. Use Codable with SecureEnclave for sensitive data. - Medium · Insufficient Input Validation in Download/Installation Pipeline —
Asspp/Backend/Downloader/Downloads.swift, Asspp/Backend/Installer/Installer.swift, Asspp/Backend/Downloader/PackageManifest.swift. The application downloads and installs packages from potentially multiple sources. Files like Asspp/Backend/Downloader/Downloads.swift and Asspp/Backend/Installer/Installer.swift may lack proper validation of downloaded content, including IPA signature verification, bundle ID validation, and entitlements checking. Fix: Implement comprehensive IPA validation: verify Apple's code signatures, validate bundle identifiers, check app entitlements, verify provisioning profiles, and confirm package integrity with SHA-256 hashing. - Medium · Potential Information Disclosure via Logs —
Asspp/Backend/LogManager.swift. The presence of LogManager.swift suggests extensive logging capabilities. Sensitive information such as authentication tokens, user account details, or file paths could be inadvertently logged and exposed. Fix: Implement structured logging with sensitive data redaction. Ensure logs don't contain tokens, credentials, or PII. Use os_log with appropriate log levels and privacy settings. Avoid logging user account information or API responses containing credentials. - Medium · AirDrop and Clipboard Data Exposure —
Asspp/Extension/AirDrop.swift, Asspp/Extension/Clipboard.swift. The application implements AirDrop and Clipboard functionality (Asspp/Extension/AirDrop.swift, Asspp/Extension/Clipboard.swift). Sensitive data like authentication tokens or package manifests could be exposed if shared via these channels without encryption. Fix: Implement encryption for any sensitive data shared via AirDrop or Clipboard. Consider disallowing sensitive operations on these channels or requiring additional user confirmation. Never share raw authentication tokens. - Medium · Potential Race Conditions in Multi-Account Downloads —
Asspp/Backend/Downloader/Downloads.swift, Asspp/Backend/AppStore/AppStore.swift. The application manages multiple accounts simultaneously with concurrent downloads. Files like Asspp/Backend/Downloader/Downloads.swift may have insufficient synchronization, leading to race conditions where wrong account credentials are used for downloads or cross-account data leakage. Fix:
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.