You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
BREAKING: Rename NetworkInterface to NetworkPath.Interface across public APIs, including Device.interfaceInfo, InterfaceInfoClient, TracerouteClient, and the InterfaceMonitor Wi-Fi/VPN/Ethernet/Cellular dependency factories
BREAKING: Replace the top-level TracerouteProbe and TracerouteError with nested Traceroute.Probe (now carrying an ID and Response) and Traceroute.Error
BREAKING:TracerouteClient.traceroute is now async throws and yields enriched Traceroute.Probe values
BREAKING: Replace the stored InterfaceInfoClient.live and TracerouteClient.live values with factory functions: InterfaceInfoClient.live(interface:) and TracerouteClient.live(device:bundleInfo:logger:)
BREAKING:IPInfoAPIClient.lookup now threads request headers through the call
BREAKING: Remove the path parameter from InterfaceMonitor.init
Device and all of its accessor closures are now @Sendable
Deprecate Traceroute.Probe.probeIndex in favor of index
Added
Ping API with configurable host, timeout, and interval, emitting Reply values (Response/Error) as an async sequence
String.isPrivateIPAddress for classifying IP-address strings
CellularNetwork.interfaceNetwork, backed by a new NetworkInterface.Network enum
Sendable, Codable, Hashable, and Equatable conformances across Traceroute, Device, PathMonitor, CellularNetwork, IPInfoResponse, and the traceroute/ping error types
Removed
BREAKING: Remove the public traceroute property and its initializer from IPInfoHeaders
Fixed
Add an explicit import HTTPClient in RetryConfiguration so the pre-built XCFrameworks compile under the MemberImportVisibility upcoming feature. SwiftPM source builds were unaffected; only XCFramework distribution builds failed to archive
Changed
BREAKING:NetworkInfo and InterfaceData protocols now require Sendable conformance.
Add Sendable conformance to built-in NetworkInfo and InterfaceData conformers
Added
Sendable conformances for public model types. This enables passing these types across actor boundaries without @preconcurrency workarounds
Changed
BREAKING: Rename IPInfoMonitor.InterfaceState to IPInfoMonitor.Interface. The new type exposes a .state property (.loading / .unavailable / .available(_:)) to enable exhaustive switching
BREAKING: Replace IPInfoMonitor.primaryInterfaceState and the async primaryInterface getter with a synchronous primaryInterface: Interface? that returns the first element of interfaces
BREAKING:IPInfoMonitor is now @MainActor-isolated. Per-interface monitors are created dynamically from NWPathMonitor updates instead of statically at initialization, and are reconciled to match the system's interface order
BREAKING:IPInfoMonitor.Dependencies now exposes per-type factory closures (makeWifiDependencies, makeVPNDependencies, makeEthernetDependencies, makeCellularDependencies) that receive a NetworkInterface, instead of static per-monitor dependency instances. This supports interface monitors being created on demand from NWPathMonitor updates. Most call sites can continue using IPInfoMonitor.Dependencies.live(logger:)
Forward the IPInfoMonitor logger to its per-interface monitors so SDK-wide logging configuration propagates correctly
Added
IPInfoMonitor.interfaces: [Interface] active interfaces ordered by the system's routing preference
Top-level NetworkInterface model exposing the underlying interface's name, type, and helpers (isVPN, isEthernet)
IPInfoMonitor.availableInterfaces: [NetworkInterface] available system interfaces without enrichment data, for diagnostic tools (ping, traceroute)
InterfaceMonitoring protocol for type-erased per-interface monitor storage
HTTPClient.Client.InterfaceBinding (.interfaceType(_:), .interface(_:)) and a bind: argument on request builders, allowing callers to route a request through a specific interface or interface type
Fixed
Crash when enabling logging from a widget extension on macOS, where NSApp is unavailable
Removed
BREAKING:PrimaryInterfaceState type. Use interfaces for the full list or primaryInterface for the highest-priority one
Fixed
Throw response code errors from IPInfoAPIClient so 429 retry logic works
correctly
Changed
Use .otherNavigation as location activity type
Retry 429 response codes after one hour
Changed
BREAKING: Reduce public API surface — DeviceKit, AsyncAlgorithms, and NIOConcurrencyHelpers are now implementation details
BREAKING: Remove IPinfoKit type
BREAKING: Replace swift-log with built-in logger
Favor system APIs over AsyncDNSResolver dependency
Implement own HTTP types, replacing dependency
Relax dependency versions
Added
Canonical log lines for SDK debugging; single-line logs per request with IP version, application state, update reason, and request count
Support cellular interface on macOS
XCFramework build infrastructure for third-party distribution
Fixed
Report correct macOS model identifier and OS version in device headers
Added
Report Wi-Fi security type
Fixed
Fix SSID and BSSID being sent as empty strings instead of being omitted
Refresh Cloudflare traces that are older than an hour
Changed
Update location for each request
Added
Titanium module
Fixed
Report ethernet instead of VPN information for ethernet interface
Remove additional headers from traceroute requests
Removed
BREAKING: Remove reverse geocoding
Changed
Report interface type in traceroute header
Emit updates when IP hasn't changed
Fixed
Use hardware UUID as vendor identifier on macOS
Only start location monitoring after we're granted permission
Added
BREAKING: Add support for ethernet interfaces
Fixed
Bind traceroute to a specific interface
Changed
Only emit updates when data changes
Reduce redundant enrichments. Only update when IP address has changed
Changed
Use kernel timestamps (SO_TIMESTAMP) for traceroute RTT measurements instead of user-space timing, improving accuracy
Replace Swift-NIO with plain BSD sockets for traceroute implementation to improve performance
Added
swift run hopscotch compare to compare system and Hopscotch traceroute performance
Removed
Ping functionality (Ping.swift, PingResult) because it was using Swift-NIO and it wasn't worth the rewrite