Sjj1024/PakePlus-iOS
Turn any webpage/HTML/Vue/React and so on into desktop and mobile app under 5M with easy in few minutes. 轻松将任意网站/HTML/Vue/React等项目构建为轻量级(小于5M)多端桌面应用和手机应用仅需几分钟. https://ppofficial.netlify.app
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 3d ago
- ✓2 active contributors
- ✓MIT licensed
Show 4 more →Show less
- ✓CI configured
- ⚠Small team — 2 contributors active in recent commits
- ⚠Concentrated ownership — top contributor handles 73% 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/sjj1024/pakeplus-ios)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/sjj1024/pakeplus-ios on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Sjj1024/PakePlus-iOS
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/Sjj1024/PakePlus-iOS 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 3d ago
- 2 active contributors
- MIT licensed
- CI configured
- ⚠ Small team — 2 contributors active in recent commits
- ⚠ Concentrated ownership — top contributor handles 73% 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 Sjj1024/PakePlus-iOS
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Sjj1024/PakePlus-iOS.
What it runs against: a local clone of Sjj1024/PakePlus-iOS — 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 Sjj1024/PakePlus-iOS | 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 | Last commit ≤ 33 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Sjj1024/PakePlus-iOS. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Sjj1024/PakePlus-iOS.git
# cd PakePlus-iOS
#
# 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 Sjj1024/PakePlus-iOS and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Sjj1024/PakePlus-iOS(\\.git)?\\b" \\
&& ok "origin remote is Sjj1024/PakePlus-iOS" \\
|| miss "origin remote is not Sjj1024/PakePlus-iOS (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"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 33 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~3d)"
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/Sjj1024/PakePlus-iOS"
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
PakePlus-iOS is a Swift-based framework that wraps web applications (HTML, Vue, React, etc.) into a lightweight native iOS app under 5MB by embedding a WebView and bundling the web assets. It provides a CLI-driven build pipeline (visible in Makefile and scripts/) that handles app icon generation, configuration injection, and IPA packaging—enabling developers to ship web apps as native iOS binaries in minutes. Single-target Xcode project structure: PakePlus/ contains the core Swift app (ContentView.swift, WebView.swift, TabBarView.swift, SideBarView.swift) that loads bundled web assets (index.html, custom.js, vConsole.js). Build automation lives in Makefile and npm scripts/ (pp:worker, build:ipa). Assets and entitlements are in standard Xcode locations (Assets.xcassets, PakePlus.entitlements, Info.plist).
👥Who it's for
Web developers and cross-platform teams who want to convert existing web projects into native iOS apps without learning Swift or maintaining separate codebases. Particularly suited for startups and indie developers who need multi-platform distribution (iOS, macOS, Windows, Linux, Android) without the overhead of native development.
🌱Maturity & risk
Actively developed: the project has 30KB of Swift code, GitHub Actions CI configured (.github/workflows/build.yml), release badges, and sponsor integration in the README. However, the single developer (1024小神) and limited test files visible in the structure suggest it's community-facing but not enterprise-hardened. Verdict: actively maintained but pre-1.0 (current version 1.0.0 in package.json suggests recent stabilization).
Single-maintainer project with external build dependencies (GitHub Actions for CI, relies on GitHub Token for builds per README). The codebase shows recent Xcode project activity but file structure includes stale user data artifacts (xcuserdata directories with breakpoints and scheme files), indicating potential local development clutter. Node.js dependencies like sharp for icon generation add complexity; the pnpm config marks sharp as 'onlyBuiltDependencies', suggesting binary compatibility concerns.
Active areas of work
No specific recent commits visible in provided data, but the workflow files (.github/workflows/build.yml) and Makefile suggest active CI/CD setup. The package.json shows recent npm dependency versions (commander@13.1.0, sharp@0.34.1), and the project maintains multi-platform distribution (see README mentions of Mac, Windows, Linux, Android support alongside iOS). GitHub Discussions active (reference to discussion #108 in README).
🚀Get running
- Clone:
git clone https://github.com/Sjj1024/PakePlus-iOS.git && cd PakePlus-iOS. 2. Install:pnpm install(specified in package.json and pnpm config). 3. Build:make package FINALPACKAGE=1 PACKAGE_FORMAT=ipaor use Xcode to openPakePlus.xcodeprojdirectly. 4. For CI/CD: push to GitHub and rely on .github/workflows/build.yml (requires GitHub Token per README).
Daily commands:
- Open
PakePlus.xcodeprojin Xcode 15+. 2. Select the PakePlus target, choose a simulator or connected device. 3. Build & run: Cmd+R. 4. For release IPA:pnpm run build:ipaormake package FINALPACKAGE=1 PACKAGE_FORMAT=ipa. 5. The app loads index.html from the bundle; edit PakePlus/index.html and rebuild to see changes.
🗺️Map of the codebase
- PakePlus/WebView.swift: Core WKWebView wrapper that loads bundled web assets and handles JavaScript-to-native bridge; central to the entire web-to-native translation
- PakePlus/ContentView.swift: Main SwiftUI view that orchestrates the UI layout (sidebar, tab bar, web view integration); entry point for native iOS UI customization
- PakePlus/index.html: The bundled web app entry point; users replace this with their own HTML/Vue/React build to determine what loads in the WebView
- PakePlus/custom.js: Custom JavaScript injected into every page load; mechanism for extending web app with native iOS capabilities
- Makefile: Build automation and packaging rules (make package FINALPACKAGE=1 PACKAGE_FORMAT=ipa); defines the production release pipeline
- PakePlus.xcodeproj/project.pbxproj: Xcode project configuration; defines build settings, dependencies, code signing, and deployment targets
- PakePlus/Info.plist: iOS app metadata (bundle identifier, version, supported orientations, URL schemes); critical for AppStore submission and device capabilities
- .github/workflows/build.yml: GitHub Actions CI/CD pipeline; automates IPA building and release distribution
🛠️How to make changes
To add web content: edit PakePlus/index.html directly or replace it with your Vue/React build output. To customize native UI: modify PakePlus/ContentView.swift (main view layout) or PakePlus/TabBarView.swift (bottom navigation). To inject custom scripts: edit PakePlus/custom.js (runs before page load) or modify WebView.swift to inject additional JavaScript. To change app icons: run pnpm run icon with a new source image. For entitlements (push, camera, etc.): edit PakePlus/PakePlus.entitlements.
🪤Traps & gotchas
- GitHub Token required: README states builds require a GitHub Token; CI/CD will fail without .github/workflows/build.yml configured with secrets. 2. Sharp native dependency: pnpm config marks
sharpas onlyBuiltDependencies—binary prebuilds must match your macOS arch (arm64 vs x86_64);pnpm installmay fail if prebuilts unavailable. 3. Bundle path assumptions: WebView.swift likely assumes index.html exists at a specific bundle path; modifying the Xcode build phases without updating the path reference will cause app crashes on load. 4. Info.plist constraints: iOS deployment target and bundle identifier must match your Apple Developer account for signing; mismatches block device installation. 5. Xcode user data artifacts: .xcuserdatad/ directories checked into git will cause merge conflicts; should be gitignored.
💡Concepts to learn
- WKWebView JavaScript Bridge — PakePlus's core capability—custom.js and WebView.swift implement message passing between JavaScript and Swift; understanding this pattern is essential for extending native features into web code
- SwiftUI View Composition — ContentView.swift, TabBarView.swift, and SideBarView.swift use SwiftUI's declarative view hierarchy; grasping view state and layout containers is necessary to customize the native UI shell around the web view
- iOS App Bundle Structure — index.html, custom.js, and vConsole.js are bundled as resources in the Xcode project; understanding how iOS locates and loads bundled assets explains why WebView.swift hardcodes specific file paths
- Xcode Build Phases & Code Signing — Makefile and PakePlus.xcodeproj orchestrate compilation, linking, and code signing; contributors need to understand build phases to troubleshoot icon generation, entitlements injection, and IPA packaging
- GitHub Actions Secrets & Artifacts — .github/workflows/build.yml requires GitHub Token management and artifact upload for CI/CD; contributors deploying via GitHub Actions must understand how to configure secrets and handle signed binaries
- npm/pnpm Monorepo Patterns — package.json uses pnpm with custom onlyBuiltDependencies config (sharp); this pattern is used for cross-platform asset pipelines; understanding pnpm workspace discipline helps avoid dependency issues
- iOS App Store Connect & Provisioning — Info.plist and PakePlus.entitlements define app metadata and capabilities required for AppStore submission; contributors need to understand bundle IDs, signing certificates, and provisioning profiles to ship releases
🔗Related repos
tauri-apps/tauri— Similar cross-platform framework for wrapping web apps as lightweight native desktop/mobile binaries, but uses Rust backend; PakePlus is the Swift/iOS-specific alternativeapache/cordova-ios— Older established iOS web wrapper framework; PakePlus modernizes this approach with SwiftUI, lighter footprint (<5MB vs Cordova's 20MB+), and faster buildsionic-team/ionic-framework— Web framework for building cross-platform apps; PakePlus complements Ionic by providing the iOS native packaging layer that Ionic alone cannot doSjj1024/PakePlus— Parent multi-platform repository; this iOS fork is part of the broader PakePlus ecosystem that also includes Android, Windows, macOS, and Linux variantselectron/electron— Desktop equivalent: wraps web apps into Electron binaries; PakePlus brings the same philosophy to iOS/Android with much smaller footprints
🪄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 GitHub Actions workflow for iOS app build validation
The repo has a .github/workflows/build.yml file but no corresponding workflow for validating iOS builds on pull requests. Currently, contributors can't verify their changes compile correctly before submission. Adding an xcodebuild validation workflow would catch integration issues early and ensure the Xcode project remains buildable.
- [ ] Create
.github/workflows/ios-build.ymlthat runs on PR events - [ ] Configure the workflow to run
xcodebuild buildagainstPakePlus.xcodeprojwith the appropriate scheme - [ ] Add validation for the
PakePlus.entitlementsandInfo.plistfiles to catch configuration issues - [ ] Test the workflow by creating a test PR and verifying it passes on valid changes
Extract WebView configuration into a reusable module (WebView.swift refactoring)
The PakePlus/WebView.swift file handles web view initialization and likely contains business logic mixed with UI code. By extracting configuration into a dedicated WebViewConfig.swift or WebViewManager.swift module, the code becomes more testable and maintainable. This also enables easier reuse across ContentView.swift, SideBarView.swift, and TabBarView.swift.
- [ ] Create
PakePlus/WebViewManager.swiftto encapsulate WKWebView setup, custom.js injection, and vConsole.js initialization - [ ] Move URL loading logic and configuration parameters from
WebView.swiftto the manager - [ ] Update
WebView.swiftto use the new manager and reduce its responsibility to UI rendering only - [ ] Update
ContentView.swiftand other views to use the centralized manager for consistency
Add unit tests for iOS app entitlements and configuration validation
The repository lacks test coverage for iOS-specific configuration. With PakePlus.entitlements and Info.plist files present, adding tests to validate entitlements, capabilities, and deployment targets would prevent configuration regressions. This is especially important for a tool that packages web apps—misconfigured entitlements can break functionality.
- [ ] Create
PakePlusTests/ConfigurationTests.swiftto unit test entitlements parsing fromPakePlus.entitlements - [ ] Add tests to validate required Info.plist keys (e.g., NSBonjourServices, privacy descriptions if needed)
- [ ] Add tests to verify the Makefile package target can correctly reference these configurations
- [ ] Create
PakePlusTests/WebViewTests.swiftto test custom.js and vConsole.js injection in WebView.swift
🌿Good first issues
- Add unit tests for WebView.swift's JavaScript bridge logic (no test files visible in the structure)—contributors could write XCTest cases for custom.js injection and message passing between native and web layers
- Document the exact web app build process and bundling requirements in a BUILD.md file—currently only README mentions 'Vue/React etc.' but no step-by-step guide for converting a Create React App or Vue CLI project into PakePlus format
- Create an example/ or templates/ directory with pre-built starter apps (blank HTML, Vue 3 template, React template)—new users have no concrete starting point for what index.html should contain
📝Recent commits
Click to expand
Recent commits
c15079d— Update build.yml to upgrade pnpm action from v3 to v4 and specify pnpm version 10 for improved dependency management. (Sjj1024)b3d955f— Update package.json to include pnpm configuration for built dependencies, modify build.yml to allow installation without (Sjj1024)73c202f— Update pnpm-lock.yaml to version 9.0, modify dependencies for improved compatibility, and update build.yml to set Node.j (Sjj1024)fdc0226— Update build.yml to change the Node.js version from 20 to 24 for improved compatibility and performance. (Sjj1024)a12246a— Update pppwd.html to set a transparent background for the HTML element and update UserInterfaceState.xcuserstate to refl (Sjj1024)8481650— Update UserInterfaceState.xcuserstate to reflect recent binary changes in project state. (Sjj1024)88ce723— Enhance WebView configuration by adding support for a transparent background. Update UserInterfaceState.xcuserstate to r (Sjj1024)e6bf2e4— Update pppwd.html to adjust body styling for improved layout and update UserInterfaceState.xcuserstate to reflect recent (Sjj1024)f2c00d7— Refactor HTML copying logic in ppworker.cjs to remove wildcard usage, ensuring proper directory copying for password and (Sjj1024)2c85ad8— Refactor ppworker.cjs to streamline HTML copying logic and update UserInterfaceState.xcuserstate following binary file c (Sjj1024)
🔒Security observations
- High · WebView Content Loading Without Proper Validation —
PakePlus/WebView.swift. The WebView.swift component loads web content which could potentially execute arbitrary JavaScript. Without proper content validation and CSP headers, this could lead to XSS vulnerabilities if the loaded content is from untrusted sources. Fix: Implement Content Security Policy (CSP) headers, validate all loaded URLs, restrict script execution origins, and sanitize any user-provided input before loading. - High · Custom JavaScript Injection Point —
PakePlus/custom.js, PakePlus/vConsole.js. The presence of custom.js and vConsole.js files indicates script injection into the WebView. vConsole is a debugging tool that should never be enabled in production as it exposes console access and debugging capabilities to users. Fix: Remove vConsole from production builds, implement environment-based conditional loading, add build-time stripping of debug tools, and ensure custom.js is thoroughly reviewed for security issues. - Medium · Entitlements File Review Required —
PakePlus/PakePlus.entitlements. PakePlus.entitlements file is present but content not provided. Overly permissive entitlements (network access, filesystem access, etc.) could expand attack surface. Fix: Review entitlements and apply principle of least privilege. Only request necessary permissions (networking, storage, camera, etc.). Remove any unused capabilities. - Medium · IPA Package in Repository —
packages/com.pakeplus.xiao.shen_0.0.1.ipa. Binary compiled application (packages/com.pakeplus.xiao.shen_0.0.1.ipa) should not be committed to version control, as it increases repository size and may contain sensitive debug information. Fix: Add *.ipa to .gitignore, store builds in artifact repositories or CI/CD pipelines only, and ensure production builds are signed and distributed through official channels. - Medium · Exposed Xcodeproj User Data —
PakePlus.xcodeproj/project.xcworkspace/xcuserdata/. Xcodeproj workspace contains user-specific data (xcuserdata, UserInterfaceState.xcuserstate) which may contain debugging breakpoints and local configuration that should not be in version control. Fix: Add xcuserdata to .gitignore and remove existing committed user data from git history using git filter-branch or similar tools. - Medium · Unrestricted Git Merge Operations in Scripts —
package.json (merge:main script). package.json contains a 'merge:main' script that automatically merges and pushes code between branches without apparent safeguards, increasing risk of unreviewed code reaching main branch. Fix: Remove automated merge/push scripts or implement pre-push hooks that verify code quality, run security tests, and require branch protection rules on main. - Medium · Build Configuration Exposure —
.github/workflows/build.yml, Makefile. Build configuration files in .github/workflows and Makefile may contain sensitive build parameters, signing certificates, or deployment credentials. Fix: Never commit private signing certificates, use GitHub Secrets for sensitive values, implement proper environment separation (dev/staging/prod), and audit all build configuration files. - Low · Info.plist Configuration Review —
PakePlus/Info.plist. Info.plist file controls iOS app permissions and capabilities but content not provided for review. Missing or incorrect security settings could be misconfigured. Fix: Review and ensure: NSAllowsArbitraryLoads is false (HTTPS only), NSAllowsArbitraryLoadsInWebContent is restricted, proper URL scheme whitelist is defined, and all Info.plist keys follow iOS security best practices. - Low · Dependency Pinning —
package.json (dependencies section). package.json uses caret (^) version constraints which allow automatic minor/patch updates. While acceptable for development, lock file (pnpm-lock.yaml) should be committed and verified for reproducible builds. Fix: Ensure pnpm-lock.yaml is committed and
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.