TunnelVision

See exactly what your iPhone is talking to — a network monitor that runs entirely on your device. No jailbreak, no computer, nothing ever leaves your phone.

TunnelVision shows you every connection your iPhone makes: which apps reach which servers, on what ports, and how much data they move — live, as it happens. You can follow a connection all the way down to the individual packets and their raw bytes, and save any capture as a standard .pcap file. All of it happens on the device; there is no server behind TunnelVision and no account to create.

It is also a tool for auditing what one app sends. Record a named session per version and build of the app you are assessing, mark the moment consent was given, and export what the network showed as a bundle of evidence — a capture, structured records, and a report laid against the network requirements of BSI TR-03161, the German technical guideline for health apps. More on that below.

Not on the App Store

TunnelVision was finished, submitted, and reviewed on 28 August 2026 — and rejected under Guideline 5.4, which requires that any app shipping a packet tunnel come from a developer account registered to a company, not an individual. Nothing was found wrong with the app: not its privacy, not its behaviour, not its design. Capturing traffic on iOS is only possible through NEPacketTunnelProvider, and shipping one makes you a “VPN app” in Apple’s classification even when, as here, the tunnel ends on your own phone and there is no server anywhere.

So it is published here instead, under the MIT licence, in full. You can read exactly how it handles your data, and you can build it and run it yourself. The whole story is in docs/APP-STORE.md.

See it

The dashboard, with live throughput and the busiest hosts The timeline of every recorded connection One connection, with its packets listed underneath
Live traffic, in and out, and who is talking most right now Your history, newest first, and whether each connection was encrypted One connection: how it was encrypted, with its packets underneath
A packet screen showing a decoded DNS reply Decrypted HTTPS shown turn by turn The captures list with the room left on the device
One packet, headers decoded — here a DNS reply, with the name looked up and the answer Inside your own HTTPS, turn by turn, when you switch it on Your capture files, and whether they are going to fill your phone

And the audit side — a session of one app version, what its evidence bundle holds, and that version against the one before it:

An ended audit session with its markers and the row that exports its evidence The sheet that says what an evidence bundle holds before it is shared Two versions of an app compared: the domains that are new, and whether the allowlist covers them
An audit session, named after the version and build it observed Its evidence bundle, and what is and is not in it, before anything is shared Two versions compared: what the newer one contacts that the older did not

TunnelVision follows the system appearance, so all of it comes in dark too:

The dashboard in dark mode

Your privacy comes first

TunnelVision is built to inspect your own traffic, and its design deliberately stops there:

Every one of those claims is now checkable rather than merely stated: the capture path, the storage, and the complete absence of any client that talks to a server of ours are all in this repository.

What you can do with it

Getting it on your phone

Since there is no App Store listing, you build it yourself. docs/BUILDING.md is the full guide; the shape of it:

git clone https://github.com/juanmmm21/TunnelVision.git
cd TunnelVision
Tools/set-bundle-prefix.sh com.yourname   # the bundle IDs here belong to another account
export DEVELOPMENT_TEAM=YOURTEAMID
xcodegen generate && open TunnelVision.xcodeproj

Be aware of one real cost before you start: the packet tunnel needs a paid Apple Developer Program membership. The Network Extension entitlement cannot be provisioned by a free personal team — that is Apple’s constraint, not ours. A free Apple ID is enough to read the code and run the full test suite in the Simulator, but not to run the tunnel on a device.

How to use it

  1. Start monitoring. Open TunnelVision — a short introduction explains what it does and what it will ask for — and tap Start monitoring. iOS will ask you to allow a VPN configuration; this is how on-device traffic monitoring works on iPhone, and it stays entirely local. The dashboard starts filling in immediately.
  2. Explore. Watch the live throughput, scroll the timeline, and tap any connection to open it, then any packet to see its bytes.
  3. Look inside HTTPS (optional). Go to Settings → set up secure traffic inspection. The app generates a certificate, hands you the profile, and walks you step by step through installing it and enabling trust in Settings → General → VPN & Device Management and Certificate Trust Settings — telling you in advance about the warnings iOS will show. Apps that pin their certificates stay private.
  4. Export. Share a capture as .pcap from Captures, or export your connection list as JSON — you see how much it contains before anything is shared.

You can stop monitoring at any time, and you can regenerate or remove the inspection certificate from inside the app or from iOS Settings whenever you like.

Auditing an app

The Audit tab turns a capture into evidence about one app. It was built around the network part of a security assessment against BSI TR-03161 — the review a digital health app (DiGA) goes through in Germany, usually done by hand with a desktop proxy — but nothing in it is specific to health apps.

  1. Create a project for the app: its name, optionally its bundle identifier, and an allowlist of the domains it is expected to contact (api.example.com, or *.example.com for every subdomain).
  2. Record a baseline before installing the app. The tunnel sees packets, not processes, so it cannot tell which app opened a connection; the baseline is how the device’s own background traffic is told apart from the app’s. That is the method, and the report states it.
  3. Record an audit session for each version and build, using only that app while it records. Place markers as you go — Consent given, Logged in, Logged out, or one you name — from the session screen, or without leaving the app under test: from Control Center or the Action Button (iOS 18), Shortcuts or Siri.
  4. Read what it found. Each connection of the session is checked for five things: the TLS version against the minimum of BSI TR-02102-2, an HTTP request seen in the clear, a host outside the allowlist (or a connection with no name to compare), whether the app accepted or refused a user-installed certificate, and activity before the consent marker.
  5. Compare two versions. From an ended session, Compare with shows the domains the later version contacted and the earlier did not, the ones it stopped contacting, and where the TLS version changed — with only the new domains the allowlist does not cover marked for attention.
  6. Export the evidence. One archive of eight files: session.json, flows.json and flows.csv, findings.json, capture.pcapng with every packet annotated with its flow and findings, capture.json saying what the capture does and does not hold, report.pdf, and a manifest.json with a SHA-256 of each. The app shows what the bundle contains — and what is missing from the capture — before the share sheet opens.

A sample report, written from the synthetic capture this repository’s tests use, shows what an assessor receives. One page of it:

A page of the PDF report: findings grouped by kind, each with the connections it was stated about

What it deliberately does not do matters as much as what it does:

The model is specified in docs/spec/audit.md, the screens in docs/ux/audit.md, and the scope in ADR 0008.

What you need

How it works

TunnelVision uses Apple’s built-in NetworkExtension framework to run a small, local VPN — one that ends on your own phone instead of forwarding to a company’s server somewhere. Your traffic passes through it, TunnelVision records what it sees, and the traffic continues to the internet unchanged. Latency-sensitive traffic such as calls and video streaming is passed straight through so your phone stays fast and your battery is spared.

The interesting engineering is in doing that inside the envelope iOS gives a network extension:

docs/ARCHITECTURE.md covers the whole picture, docs/spec/ documents each module with its actual Swift interfaces, and docs/decisions/ records why the load-bearing choices were made.

The code

Path What lives there
TunnelVision/ The SwiftUI app: views, view models, services
PacketTunnel/ The NEPacketTunnelProvider extension: flow table, TCP reassembly, TLS termination, relay
AuditControls/ The Control Center control that places an audit marker without opening the app
Shared/ Framework linked by both: models, persistence, IPC ring buffer, pcap, IP and QUIC parsing, TLS primitives, the audit model and the evidence bundle
CTVAtomics/, CTVResolv/ Small C shims — C11 atomics for the ring buffer, <resolv.h> for the system’s DNS servers. Both exist because Swift cannot reach those APIs on iOS
TunnelVisionTests/ The unit tests — about 2,900, all runnable on the Simulator
Tools/ Bundle-prefix script, screenshot driver, app icon renderer
docs/ Architecture, module specs, UX specs, decision records

Swift 6 with strict concurrency throughout. The Xcode project is generated from project.yml with XcodeGen and is not committed. CONTRIBUTING.md has the house rules; CHANGELOG.md has the history.

Questions

Privacy

TunnelVision collects nothing and has no server to collect it to. The full policy is at Privacy Policy — short version: everything stays on your device, nothing is sold, used, or disclosed to anyone, and the only way any of it leaves your phone is if you share a file yourself.

License

Released under the MIT License. © 2026 juanmmm21.