Pod::Spec.new do |s| s.name = 'OfficerNet' s.version = '0.1.0' s.summary = 'OffTail VPN engine — Tailscale core bridge' s.description = 'Embeds the gomobile-built Tailscale core (libtailscale) as OfficerNet.xcframework and drives it behind an NEPacketTunnelProvider. Run scripts/build-libtailscale-ios.sh to populate libs/ before pod install. Talks directly to a self-hosted Headscale control server.' s.author = 'André Padez' s.homepage = 'https://pastilhas.dev' s.license = { :type => 'BSD-3-Clause' } s.platforms = { :ios => '15.1' } s.source = { git: '' } s.static_framework = true s.dependency 'ExpoModulesCore' # The gomobile-built Tailscale core. Produced once by scripts/build-libtailscale-ios.sh and vendored # under libs/ (gitignored). Vendored ONLY when present — until the build script runs, the pod compiles # as a stub (the Swift references no libtailscale symbols directly), so the app still builds + installs # with an inert engine. Once the xcframework exists it links automatically on the next pod install. # TODO(libtailscale): ship OfficerNet.xcframework here (arm64 device + arm64 sim slices). if File.directory?(File.join(__dir__, 'libs', 'TailCore.xcframework')) s.vendored_frameworks = 'libs/TailCore.xcframework' end s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'SWIFT_COMPILATION_MODE' => 'wholemodule' } # Only the RN-process module compiles into this pod (the main app). PacketTunnelProvider.swift compiles # into the Network Extension target instead — the config plugin (plugin/withNetworkExtensionTarget.js) # copies it into ios/OffTailTunnel/ and adds it to that target's sources, along with TailCore.xcframework. s.source_files = 'OfficerNetModule.swift' end