lexrus/VPNOn
Turn On your VPN like a hero.
Stale — last commit 6y ago
worst of 4 axesnon-standard license (Other); last commit was 6y ago…
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.
- ✓2 active contributors
- ✓Other licensed
- ✓CI configured
Show 5 more →Show less
- ⚠Stale — last commit 6y ago
- ⚠Small team — 2 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 98% of recent commits
- ⚠Non-standard license (Other) — review terms
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: clarify license terms
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 "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/lexrus/vpnon)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/lexrus/vpnon on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: lexrus/VPNOn
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/lexrus/VPNOn 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
WAIT — Stale — last commit 6y ago
- 2 active contributors
- Other licensed
- CI configured
- ⚠ Stale — last commit 6y ago
- ⚠ Small team — 2 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 98% of recent commits
- ⚠ Non-standard license (Other) — review terms
- ⚠ 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 lexrus/VPNOn
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/lexrus/VPNOn.
What it runs against: a local clone of lexrus/VPNOn — 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 lexrus/VPNOn | Confirms the artifact applies here, not a fork |
| 2 | License is still Other | Catches relicense before you depend on it |
| 3 | Default branch develop exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 2277 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of lexrus/VPNOn. If you don't
# have one yet, run these first:
#
# git clone https://github.com/lexrus/VPNOn.git
# cd VPNOn
#
# 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 lexrus/VPNOn and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "lexrus/VPNOn(\\.git)?\\b" \\
&& ok "origin remote is lexrus/VPNOn" \\
|| miss "origin remote is not lexrus/VPNOn (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Other)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Other\"" package.json 2>/dev/null) \\
&& ok "license is Other" \\
|| miss "license drift — was Other at generation time"
# 3. Default branch
git rev-parse --verify develop >/dev/null 2>&1 \\
&& ok "default branch develop exists" \\
|| miss "default branch develop no longer exists"
# 4. Critical files exist
test -f "VPNOn.xcodeproj/project.pbxproj" \\
&& ok "VPNOn.xcodeproj/project.pbxproj" \\
|| miss "missing critical file: VPNOn.xcodeproj/project.pbxproj"
test -f "TodayWidget/Widget.swift" \\
&& ok "TodayWidget/Widget.swift" \\
|| miss "missing critical file: TodayWidget/Widget.swift"
test -f "Cartfile" \\
&& ok "Cartfile" \\
|| miss "missing critical file: Cartfile"
test -f "TodayWidget/Info.plist" \\
&& ok "TodayWidget/Info.plist" \\
|| miss "missing critical file: TodayWidget/Info.plist"
test -f ".swiftlint.yml" \\
&& ok ".swiftlint.yml" \\
|| miss "missing critical file: .swiftlint.yml"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 2277 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~2247d)"
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/lexrus/VPNOn"
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
VPN On is an iOS app (Swift 5) that dramatically simplifies VPN activation via a Today Widget in Notification Center, allowing users to connect to IPSec IKEv1/IKEv2 VPN in ~3 seconds instead of navigating nested iOS settings. It also supports On Demand mode to auto-connect when visiting specified domains, and exposes a vpnon:// URL scheme for VPN providers to distribute pre-configured profiles. Single-target monorepo: main app code sits in project root with a Today Widget extension sharing keychain via App Groups. Uses Carthage for FlagKit (country flags) and KeychainAccess frameworks. SwiftLint config enforces code style. Xcode project structure implies container app + Today extension as distinct targets with shared VPN configuration logic.
👥Who it's for
iOS users frustrated by iOS's deeply nested VPN settings menus; VPN service providers who want to distribute easy-to-configure server profiles to customers; enterprise IT deploying corporate VPN configs.
🌱Maturity & risk
Moderately mature with active maintenance: published on App Store (id: 951344279), uses Swift 5 with SwiftLint enforcement, has TravisCI/CD integration, and follows gitflow branching. However, last visible activity in repo history is not provided; Carthage dependency management suggests pre-SPM era practices. Production-ready for iOS 10.3+ but may not be bleeding-edge.
Single-maintainer risk (lexrus/VPNOn) with no visible co-maintainers. Dependency on Carthage (vs modern SPM) and old build artifacts in repo suggest potential maintenance burden for iOS SDK updates. Requires developer account signing, MaxMind API key, and careful provisioning profile setup—mistakes here block builds entirely. VPN protocols (IPSec) have legacy status; newer protocols (WireGuard, OpenVPN) are community-driven alternatives.
Active areas of work
No recent commit or PR data visible in provided file list. Repo appears dormant or in maintenance mode; Carthage build artifacts are cached, suggesting infrequent dependency updates. Focus is likely bug fixes and compliance with iOS SDK versions rather than new features.
🚀Get running
- Clone:
git clone https://github.com/lexrus/VPNOn.git && cd VPNOn. 2. Install dependencies:carthage checkout && carthage build --platform iOS. 3. OpenVPNOn.xcodeprojin Xcode 10.3+. 4. Add your Apple Developer account, update bundle IDs, enable Personal VPN + Keychain Sharing + App Groups capabilities. 5. Provision profiles for both container app and Today extension. 6. Build and run on iOS 10.3+ device.
Daily commands:
carthage checkout && carthage build --platform iOS(install binary deps). 2. OpenVPNOn.xcodeprojin Xcode. 3. Select main app target, configure code signing (team + bundle ID). 4. Product → Run (or Cmd+R) to build and launch on simulator/device. 5. Today Widget requires adding to Notification Center in Settings after first launch.
🗺️Map of the codebase
VPNOn.xcodeproj/project.pbxproj— Main Xcode project configuration defining build targets, frameworks, and app structure; essential for understanding the app architecture and dependency setup.TodayWidget/Widget.swift— Core Today Widget implementation that provides the main VPN toggle functionality in Notification Center; primary user-facing feature.Cartfile— Dependency manifest declaring external frameworks (FlagKit, KeychainAccess, MMDB) needed for the app; critical for build reproducibility.TodayWidget/Info.plist— Widget configuration and entitlements definition; controls app capabilities, permissions, and widget behavior..swiftlint.yml— SwiftLint configuration enforcing code style consistency across the codebase; reflects project quality standards.
🛠️How to make changes
Add a new VPN configuration to the widget
- Define VPN data model fields matching IPSec IKEv1/IKEv2 parameters in your app's main code (
VPNOn.xcodeproj/project.pbxproj) - Extend VPNCell.swift to render new VPN properties (server name, protocol type, on-demand rules) (
TodayWidget/VPNCell.swift) - Update Widget+Collection.swift datasource to load and manage the new VPN entry from secure keychain storage (
TodayWidget/Widget+Collection.swift) - Store credentials securely by integrating KeychainAccess calls in Widget.swift toggle logic (
TodayWidget/Widget.swift)
Enhance VPN connection location detection
- Import and initialize MMDB framework in Widget.swift to query the MaxMind geolocation database (
TodayWidget/Widget.swift) - Query MMDB for current IP address location after VPN connection succeeds (
Carthage/Build/iOS/MMDB.framework/Headers/maxminddb.h) - Display country flag using FlagKit and resolved location from MMDB in VPNCell (
TodayWidget/VPNCell.swift) - Add animation transitions when location changes via VPNFlagAnimatable (
TodayWidget/VPNFlagAnimatable.swift)
Add a new VPN server to on-demand rules
- Update MainInterface.storyboard to add UI controls for domain entry (comma-separated domains list) (
TodayWidget/MainInterface.storyboard) - Create a domain rule model in your main app and extend Widget.swift to accept on-demand domain input (
TodayWidget/Widget.swift) - Store domain rules in keychain using KeychainAccess integration (same secure storage as VPN credentials) (
Carthage/Build/iOS/KeychainAccess.framework/Headers/KeychainAccess.h) - Implement URL matching logic in widget to auto-trigger VPN when user visits specified domains (
TodayWidget/Widget.swift)
🔧Why these technologies
- Swift 5 + iOS 10.3+ — Modern, type-safe language enabling faster development and safer VPN credential handling; iOS 10.3+ grants Today Widget access to VPN frameworks.
- Today Widget (NotificationCenter Extension) — Reduces friction from 5+ nested iOS Settings menu taps to 1-tap VPN toggle; users can activate VPN in ~3 seconds without launching main app.
- KeychainAccess framework — Encrypts and securely stores IPSec credentials (preshared keys, certificates) isolated from app sandbox; resistant to device backup exploitation.
- FlagKit framework — Provides country flag assets for visual server location identification; improves UX clarity on which VPN endpoint is active.
- MMDB (MaxMind) framework — Enables on-device IP geolocation lookup to detect connected VPN's exit node location; supports On Demand feature validation without external API calls.
- Carthage dependency manager — Decentralized, framework-based dependency resolution avoids CocoaPods source code vendoring; integrates prebuilt binaries for faster builds.
⚖️Trade-offs already made
-
Today Widget for primary VPN control (not main app)
- Why: Maximizes convenience and minimizes time-to-connect; fits iOS paradigm of quick toggles in Notification Center.
- Consequence: Widget UI must be lightweight; complex settings deferred to main app; requires separate entitlements and keychain sharing configuration.
-
On-device MMDB geolocation instead of cloud API
- Why: Preserves user privacy; avoids leaking VPN queries to external servers; enables offline IP lookup.
- Consequence: Requires MMDB database binary in bundle (~50MB); introduces local storage overhead; database updates require app releases rather than server pushes.
-
IPSec IKEv1/IKEv2 only (not OpenVPN, WireGuard)
- Why: Native iOS VPN framework (NEVPNManager) supports only IPSec; avoids third-party VPN plugins or jailbreak dependencies.
- Consequence: Users must deploy IPSec-compatible servers; incompatible with other VPN protocols; limits interoperability.
-
App Store distribution only
- Why: Official distribution channel ensures code review oversight and user trust; leverages App Store's secure download mechanism.
- Consequence: Subject to Apple review guidelines; cannot distribute alternative VPN implementations; no sideloading capability.
🚫Non-goals (don't propose these)
- Does not implement VPN server deployment; users must provision IPSec servers separately (or use provided Ansible Playbook).
- Does not provide real-time VPN performance metrics or kill-switch enforcement.
- Does not support OpenVPN, WireGuard, or other non-IPSec protocols.
- Does not offer VPN split tunneling or per-app VPN routing.
- Does not serve as a commercial VPN provider; app assumes user-owned/managed VPN infrastructure.
🪤Traps & gotchas
- Provisioning profiles required: both container app and Today extension must have valid provisioning profiles; missing or expired certs cause cryptic build failures. 2. App Groups entitlement: VPN state sharing between app and widget requires identical App Group ID set in both targets' capabilities—mismatch silently breaks communication. 3. MaxMind API key: README mentions MaxMind account needed for GeoIP; likely used in code but credentials not visible—must configure separately post-clone. 4. Carthage cache: repo commits prebuilt .framework binaries;
carthage updatemay conflict or be skipped; usecarthage checkout && carthage buildto rebuild from source if needed. 5. NetworkExtension sandbox: VPN config changes only apply after app restart; on-the-fly reloads don't reflect immediately.
🏗️Architecture
💡Concepts to learn
- IPSec IKEv1 / IKEv2 — VPN On's sole supported protocol; understanding IKE negotiation phases, SA setup, and encryption/auth options is essential to troubleshoot connection failures or add new protocol support.
- NetworkExtension framework (iOS) — Core Apple framework VPN On uses to create and manage VPN configurations at the OS level; knowledge of NEVPNProtocolIPSec, NEVPNConnection state machine, and sandbox restrictions is mandatory.
- Today Widget / Notification Center Extension — The key UX differentiator of VPN On; requires separate Xcode target, limited UI space, and inter-process communication via App Groups—design constraints that shaped the entire app.
- App Groups (iOS entitlement) — Mechanism allowing the main app and Today Widget to share Keychain data and preferences; misconfiguration silently breaks credential passing between targets.
- On Demand VPN rules — NEOnDemandRule feature enabling auto-connect based on domain matching; complex rule evaluation can unexpectedly trigger or suppress VPN activation—critical for corporate deployments.
- URL Scheme dispatch (vpnon://) — Custom protocol handler allowing VPN providers to distribute pre-configured profiles as clickable links; parsing is critical security boundary—malformed URLs could inject false credentials.
- Keychain Access (iOS Keychain API) — Secure credential storage for VPN passwords; VPN On wraps it via KeychainAccess framework; understanding entitlement sharing and access group scoping prevents credential leaks across app/widget boundaries.
🔗Related repos
OpenVPN/openvpn-ios— Official OpenVPN client for iOS; direct competitor supporting modern protocol but lacks the frictionless Today Widget one-tap design of VPN On.WireGuard/wireguard-ios— WireGuard VPN client for iOS; newer protocol with better performance but no Today Widget integration; VPN On architecture could be adapted to support WireGuard configs.lexrus/vpn-deploy-playbook— Companion Ansible project referenced in README; handles IPSec IKEv1/IKEv2 server setup that VPN On clients connect to—essential for developers testing VPN On functionality.transifex/vpnon— Crowdsourced localization project; VPN On strings are managed here, not in repo; contributors translate UI to 20+ languages.
🪄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.
Migrate from Travis CI to GitHub Actions with iOS build matrix
The repo uses .travis.yml which is outdated and limited compared to GitHub Actions. A modern CI workflow would support multiple iOS versions, Swift versions, and provide faster feedback. This is critical for an iOS app that needs to verify builds across different Swift versions and iOS deployment targets.
- [ ] Create .github/workflows/ios-build.yml with matrix for Swift 5.x and iOS 13+
- [ ] Add steps for: dependency resolution (Carthage), linting (.swiftlint.yml already present), building, and running tests
- [ ] Migrate badge URL in README from Travis to GitHub Actions
- [ ] Remove or archive .travis.yml after verification
Add unit tests for VPN connection management logic
The repo has extensive Carthage dependencies (KeychainAccess, MMDB, FlagKit) suggesting complex business logic for VPN management, but no visible test files in the structure. Adding tests for the core VPN on/off, credentials handling, and On Demand feature logic would prevent regressions and improve code quality.
- [ ] Create Tests/ directory structure mirroring source organization
- [ ] Write unit tests for VPN state management (on/off transitions)
- [ ] Write unit tests for KeychainAccess integration (credential storage/retrieval)
- [ ] Write unit tests for On Demand domain matching logic
- [ ] Add test target to .swiftlint.yml to lint test code
Document the Widget extension architecture and VPN configuration format
The app installs a Today Widget and supports VPN On Demand with domain specifications, but there's no documentation explaining how the widget communicates with the main app, how VPN configurations are stored/loaded, or what the data format is. This is essential for contributors wanting to extend the app.
- [ ] Create ARCHITECTURE.md explaining widget-to-app communication mechanism
- [ ] Document VPN configuration data structure and persistence (likely using Keychain via KeychainAccess dependency)
- [ ] Add CONTRIBUTING.md with setup instructions for building with Carthage
- [ ] Document the On Demand feature implementation and domain matching logic with code examples
🌿Good first issues
- Add unit tests for VPN URL scheme parser: create a test target that validates
vpnon://URL decoding (account, password, server, title, group, secret, alwayson, ikev2 params) against the documented scheme format in README.: Critical path for accepting third-party VPN configs; currently no visible test coverage in file list, and regex/parsing bugs silently accept invalid configs. - Document Carthage rebuild procedure in README: add explicit section explaining when to run
carthage checkout && carthage buildvs relying on cached binaries, and how to troubleshoot '.framework not found' errors.: Developers cloning the repo see Carthage/Build/ binaries and may skip rebuild; incompatibility with newer Xcode versions causes mysterious link failures without clear remediation steps. - Create a sample
vpnon://URL generator tool (Swift Playground or simple web form) to let VPN providers test their configs before distribution; document it in README.: No visible validation or testing utility for URL schemes; providers manually construct URLs and discover typos only after customer integration, leading to bad user experience.
⭐Top contributors
Click to expand
Top contributors
- @lexrus — 98 commits
- [@Lex Tang](https://github.com/Lex Tang) — 2 commits
📝Recent commits
Click to expand
Recent commits
147bf67— clean up (lexrus)9f2778e— fix flags (lexrus)174d8dd— fix status bar color for iOS 13 (lexrus)390564e— fix UISegmentControl for iOS 13 (lexrus)e9805b6— recompile frameworks with latest toolbelt (lexrus)2b05fcd— Fix signing and assets (lexrus)d14fd1f— Update travis config (lexrus)e8ba61a— Bump version to Swift 5 (lexrus)6086914— Update README (Lex Tang)2f0e1cc— Fix compile error (Lex Tang)
🔒Security observations
The VPNOn iOS application has a moderate security posture with some notable concerns. The primary risks involve outdated or unverified dependencies managed through Carthage, potential keychain data exposure if not properly configured, and missing security documentation. The application handles sensitive VPN credentials, making proper secure storage and access control critical. Key recommendations include modernizing dependency management (Swift Package Manager), verifying all framework integrity, implementing strict keychain protection classes, and establishing a formal security vulnerability disclosure process. The app should undergo security audits focusing on credential handling, network security configuration, and proper entitlements before production deployment.
- High · Outdated Dependency Management - Swift 5 with Legacy Framework —
Cartfile, Carthage/Build/iOS/. The codebase uses Carthage for dependency management with pre-built iOS frameworks. The Carthage/Build directory contains compiled binaries that may be outdated or vulnerable. The project references frameworks like KeychainAccess, FlagKit, and MMDB which require verification of current versions and security patches. Fix: Update all Carthage dependencies to their latest versions. Runcarthage updateand verify each dependency's security advisories. Consider using Swift Package Manager (SPM) as a more modern alternative with better security scanning. - Medium · Potential Keychain Data Exposure —
KeychainAccess.framework/. The application uses KeychainAccess framework to store VPN credentials. While the framework itself is reputable, there is risk if the app does not properly validate the keychain accessibility attributes or if credentials are not encrypted with proper protection classes. Fix: Verify that all keychain items are stored with kSecAttrAccessibleWhenUnlockedThisDeviceOnly or kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly protection class. Implement secure credential handling with proper access controls and ensure credentials are never logged. - Medium · Missing Code Signing and Security Configuration Validation —
Project root - missing visible Info.plist and entitlements files. No visible configuration files (Info.plist snippet, entitlements, or security headers) are provided for analysis. VPN apps require special entitlements and network security configuration that should be explicitly defined. Fix: Ensure App Transport Security (ATS) is properly configured for VPN connectivity. Define Network Security Configuration with appropriate settings. Review entitlements for Network Extension and VPN-related capabilities. Implement code signing with valid certificates. - Medium · Compiled Binary Framework Risk —
Carthage/Build/iOS/ (all .bcsymbolmap files and framework binaries). Pre-built .bcsymbolmap files and compiled frameworks in Carthage/Build/ may contain security issues or be built from untrusted sources. No SBOM (Software Bill of Materials) or verification hashes are visible. Fix: Verify the integrity of all pre-built frameworks using checksum validation. Consider building frameworks from source during CI/CD. Document all third-party dependencies and their versions in an SBOM. Use dependency scanning tools like Snyk or OWASP Dependency-Check. - Low · Missing Security Documentation —
Repository root. No security.md, SECURITY.txt, or vulnerability disclosure policy is visible in the repository structure. Security researchers have no clear path to report vulnerabilities. Fix: Create a SECURITY.md file with vulnerability disclosure guidelines and contact information. Consider implementing a bug bounty program. Provide security release notes for each version.
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.