A client-only VPN app for iPhone, iPad and Mac, built on Xray-core.
Prism speaks VLESS (with REALITY / TLS and the full Xray transport matrix) and Hysteria2, imports servers from share links or subscription URLs, and routes traffic through user-defined rule profiles backed by geoip / geosite assets.
- iOS 17+, macOS 15+ (iPhone, iPad, Mac — no Catalyst)
- SwiftUI, Swift Concurrency only (no Combine)
- Modularized with Tuist; the Xcode project is generated
Servers
- VLESS over
tcp,kcp,ws,http,quic,grpc,httpupgradeandxhttp, with REALITY, TLS, Mux/XMux and socket options — each fully editable in the UI - Hysteria2 with obfuscation and port hopping
- Import from
vless:///hysteria2://links, from a pasted blob of links, or from a subscription URL - Subscriptions refresh in place and carry their traffic/expiry user-info
Routing
- Rule profiles: ordered rules matching on
domain,geosite,iporgeoip, each pointing at an outbound - Per-profile domain strategy, default outbound and DNS (including FakeDNS)
- geoip.dat / geosite.dat downloaded per profile (Loyalsoldier/v2ray-rules-dat by default) into the app group
- Subscriptions can ship their own routing profile (Happ payload), applied and removed with the subscription
Tunnel
NEPacketTunnelProviderextension running Xray-core, with Outline's tun2socks bridging the TUN device to Xray's local SOCKS inbound- Config is built app-side into Xray JSON and handed to the extension through the provider configuration
Tooling is pinned in mise.toml — mise puts tuist and xcodebuildmcp on PATH.
mise install
tuist install # resolve Tuist/Package.swift
tuist generate --no-open # generate Prism.xcodeproj / Prism.xcworkspacePrism.xcodeproj and Prism.xcworkspace are generated. The project is
described in Swift under Tuist/ProjectDescriptionHelpers/; tuist edit opens those manifests in Xcode.
Running the app requires a development team and provisioning profiles for the app group
(group.viperr.prism), the Network Extension entitlement and the packet-tunnel extension.