In-app network inspector for iOS/macOS. Captures HTTP/HTTPS and WebSocket traffic and lets you view it with a built-in SwiftUI viewer — no proxy, no certificates, no desktop app.
Fork of Proxyman/Atlantis. Original Atlantis streamed captured traffic over Bonjour to the Proxyman desktop app; Porthole removes that dependency and views traffic in-app instead.
- Removed the Bonjour transport layer and remote Proxyman integration
- Added a built-in SwiftUI viewer: traffic list + detail view
- Added body search and traffic filtering
- Added export as cURL command and HAR file
- Added clear/pause and a bounded in-memory store (
Atlantis.trafficStore) - Replaced the
AtlantisSwiftUIAppexample withPortholeExample, wired to the new viewer
- Automatic HTTP/HTTPS capture, no proxy or certificate trust needed
- WebSocket capture (
URLSessionWebSocketTask) - Built-in SwiftUI viewer: list + detail, search, filter
- Export as cURL command or HAR file
- Pause/resume and clear captured traffic
- iOS 16.0+ / macOS 11+ / Mac Catalyst 13.0+ / tvOS 13.0+ / watchOS 10.0+
- Xcode 14+, Swift 5.0+
Swift Package Manager — add this repo's URL to your project.
import SwiftUI
#if DEBUG
import Atlantis
#endif
@main
struct MyApp: App {
init() {
#if DEBUG
Atlantis.start()
#endif
}
}UIKit: call Atlantis.start() in application(_:didFinishLaunchingWithOptions:).
struct DebugTrafficView: View {
var body: some View {
NavigationStack {
AtlantisTrafficListView()
}
}
}AtlantisTrafficListView() observes Atlantis.trafficStore and lists captured requests newest-first; tap a row for full request/response detail.
Atlantis.trafficStore.clear()— wipe captured entriesAtlantis.trafficStore.isPaused— pause/resume captureAtlantis.trafficStore.capacity— max entries held (default 500)
- cURL: from the detail view, or
package.curlCommand() - HAR: from the list's Export action, or
Atlantis.trafficStore.exportHAR()
Example/PortholeExample demonstrates integration end to end.
- Debugging tools (Map Local, Breakpoint, Scripting) aren't supported — use a normal proxy for those.
- All captured data lives in memory only; nothing leaves the device and nothing persists after the app closes.
Apache-2.0. See LICENSE.