Move the Lottie button into an overlay on the background image so
both share the same coordinate space, matching Android's approach
of placing btn_connect as a sibling of bg_mask inside bg_mask_container.
The response from github.rest.pulls.get is destructured as
`const { data: pr } = ...` on line 102, so `pr` is already the PR
object. Lines 110, 111, and 115 then did `pr.data.head.*` — double
dereference — which crashed with 'Cannot read properties of undefined
(reading head)' the first time anyone commented /testflight after
PR #97 landed the issue_comment handler.
* fix layout on ipad
* Create multi profiles
* multi-profile server config, connection cache, and auth fixes
Split ProfilesView into ProfilesListView, AddProfileSheet, ProfileBadge, AddProfileViewModel
- Add server URL + setup key fields to Add Profile screen
- Store per-profile connection data (ip/fqdn/managementURL) as typed model in ProfileConnectionCache
- Show cached connection info immediately on profile switch; empty if no prior data
- Fix profile deletion persistence via tombstone in profiles.json
- Fix logout to remove both netbird.cfg and state.json (cfg holds auth tokens)
- Preserve managementURL in UI after logout via cache fallback
- Guard polling from overwriting new profile's data during disconnect/reconnect cycle
* fix(multi-profile): reinitialize VPN adapter on profile switch and show current server URL
* Update project.pbxproj
* fix(multi-profile): prevent default server overwrite on logout/re-login
* Update PacketTunnelProvider.swift
* fix(multi-profile): address code review findings
- Normalize only scheme and host to lowercase when saving management
server URL; previously the full URL was lowercased which could corrupt
case-sensitive paths on self-hosted servers
- Move switchConnectionInfo(to:) inside the do-block so the connection
UI is only updated after a successful profile switch
- Add ProfileConnectionCache.remove(for:) and clearConnectionData(for:)
to prevent stale ip/fqdn/managementURL from persisting after a profile
is deleted or logged out; call them from removeProfile and logoutProfile
- Use ASWebAuthenticationSession.Callback.customScheme on iOS 17.4+,
falling back to the deprecated callbackURLScheme initializer on older
versions; add a comment explaining why "http" is used and that a
proper fix requires custom-scheme support in the SDK
- Guard presentationAnchor against a missing key window with
assertionFailure in debug builds instead of silently returning an
empty UIWindow
The example testflight lines were inside an HTML comment intended to
be hidden, but the gate's command parser (testflight.yml) scans by
line prefix without stripping HTML comments, so the template's
`testflight version=0.1.5 build-number=3` leaked through as a real
override on every PR, forcing builds to 0.1.5 (3) regardless of tags.
* Update project settings and marketing version to 0.1.5
Reorganized build phases, frameworks, and targets in the Xcode project file. Restored and adjusted configurations for NetBirdTests and other related components. Incremented the marketing version across targets for consistency.
* Remove Package.resolved from project workspace configuration
* Add `Package.resolved` to workspace configuration to track dependencies
* Derive marketing version from git tags instead of Xcode project
On main pushes, compute the version by finding the latest v* tag and
bumping the patch component (e.g. v0.1.4 → 0.1.5). This eliminates
manual "bump version" commits and aligns with how android-client
manages versions.
Also remove tag trigger from testflight.yml since release.yml already
handles v* tag pushes, avoiding duplicate builds.
* Validate semver tags and derive version for PR builds too
- Add strict semver regex validation on the tag from git describe
- Use shell parameter expansion instead of cut for parsing
- Run checkout and version derivation for PR events too, so
/testflight without explicit version= gets a tag-derived version
* Fix false TestFlight upload triggered by /testflight in HTML comments
Strip HTML comments from PR body before checking for /testflight
directive. The PR template contained /testflight examples inside
a comment block, which was incorrectly matching. Also fall back
to tag-derived version for PRs without explicit version= parameter.
* Fix build number to use unique workflow run number
The build number was falling back to the reusable workflow's own
GITHUB_RUN_NUMBER (always 3), causing duplicate builds across PRs.
Now the gate job always sets build-number from the caller's
github.run_number, which is unique per workflow trigger.
* Trigger CI
* Fail build on invalid or missing version tags instead of silent fallback
Falling back to 0.0.1 would silently upload a build with a wrong
version. Better to fail loudly so the bad tag gets noticed.
* Fix Go library version to use netbird submodule tags instead of iOS client version
The build was passing the iOS client version (e.g. 0.1.5) to build-go-lib.sh,
which injected it into the Go library via ldflags. This caused the Dashboard to
report the iOS app version instead of the actual netbird core version. Now
build-go-lib.sh auto-detects the version from netbird-core submodule tags,
matching how android-client handles it.
The tvOS build job was using -scheme NetBird which only supports iOS.
Use -target "NetBird TV" and -target "NetBirdTVNetworkExtension" to
match the actual tvOS targets in the Xcode project.
Broken since #69 (2026-03-17).
* Add Home Screen widget with VPN toggle and refactor app activation logic
- Add NetBirdWidgetExtension target with small/medium widget sizes
- Support direct connect/disconnect from widget via interactive buttons (iOS 17+)
- Detect missing VPN config or login-required state and open app via deep link
- Poll for stable VPN state after toggle to prevent loader getting stuck
- Add widget shared state keys to GlobalConstants and sync status from MainViewModel
- Fix false "authentication required" alert on app resume after widget disconnect
- Deduplicate app activation logic into shared startActivation/stopActivation
- Extract polling helpers: updateDetailsIfChanged, updatePeersIfChanged, applyExtensionStatus
* Harmonize CI with Android: netbird submodule, merged build script
- Add netbird as git submodule at netbird-core/
- Merge build-go-lib.sh and build-go-lib-tv.sh into single script with --tvos flag
- Smart version resolution: git tag → ci-<hash>/dev-<hash> (matching Android pattern)
- Read Go version from netbird-core/go.mod instead of hardcoding
- Use submodule recursive checkout in all workflows
- Fix release.yml: use pinned submodule instead of assuming matching netbird tag
- Support netbird-ref override in build-upload.yml for TestFlight PR builds
- Update README with submodule setup instructions
- Route all DNS through the tunnel on iOS by always setting matchDomains=[""], eliminating the drift between Go's DNS server (which has a root zone fallback handler) and iOS
tunnel settings that only matched specific domains
- Handle empty route notifications from Go — when the exit node was the only route and was deselected, the notifier sent an empty string that Swift silently dropped, leaving
stale 0.0.0.0/0 in the tunnel and black-holing all traffic
- Fix route card status indicator showing green after deselecting a route by checking route.selected before evaluating peer connection status
* bump marketing version to 0.1.4
* add optional netbird-ref input to build-upload workflow
* add concurrency control and support for parsing optional parameters in testflight workflow
* add logging for parsing optional parameters in testflight workflow
* fix ui state for airplaine mode
* fix slide bar
* Keep VPN tunnel alive during network unavailability
- Add isNetworkUnavailable flag to NetBirdAdapter to track network state
- Modify ConnectionListener to stay in 'connecting' state when network
is unavailable instead of transitioning to 'disconnected'
- Update PacketTunnelProvider to set network unavailable flag and
trigger automatic reconnect when network returns
- Fix CustomLottieView to show grey 'Disconnected' state immediately
when network is lost, without closing the VPN tunnel
- Ensure UI shows correct state after app foreground/background cycle
This allows the VPN tunnel to survive temporary network outages
(e.g. airplane mode) and automatically reconnect when network returns.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix UI state after app foreground/background cycle
Show correct connected/disconnected state immediately when app returns
from background, without replaying animations. Use extensionStatus
(iOS VPN state) as the source of truth for UI state.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* netbird credential
* Update MainView.swift
* Separate button by state
* Add gogoleServiceInfo plist reference
* Remove dead code in animation state machine and fix copy-to-clipboard UX - Remove unreachable shouldForceReset block in CustomLottieView (already handled by earlier return) - Guard against copying empty fqdn/ip strings when disconnected - Use consistent .smooth animation for both fqdn and ip copy feedback
- Remove unreachable shouldForceReset block in CustomLottieView (already handled by earlier return)
- Guard against copying empty fqdn/ip strings when disconnected
- Use consistent .smooth animation for both fqdn and ip copy feedback
* Tab bar
* Update peer view
* Update fonts
* Redesign tvOS connection screen and add peer search
- Move logo to top-left brand anchor (smaller, semi-transparent)
- Restyle connect button with gradient fill, glow shadow, and
press-down scale animation (TVConnectButtonStyle)
- Add search bar with clear button to peers list view
* Redesign tvOS UI with gradient backgrounds
* Update logo position
* Redesign tvOS peers & resources lists to match settings UI style
* Add color-coded connection status indicator and debug state overlay
* Stabilize connection screen layout and remove debug overlay
* Update project.pbxproj
* Delete mock data
* Update info plist
* Update project.pbxproj
* add go get
* fix Self-hosted management URL
* Fix infinite connecting state after canceling QR code auth on tvOS
* Code refactoring
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: mlsmaycon <mlsmaycon@gmail.com>
* fix ui state for airplaine mode
* fix slide bar
* Keep VPN tunnel alive during network unavailability
- Add isNetworkUnavailable flag to NetBirdAdapter to track network state
- Modify ConnectionListener to stay in 'connecting' state when network
is unavailable instead of transitioning to 'disconnected'
- Update PacketTunnelProvider to set network unavailable flag and
trigger automatic reconnect when network returns
- Fix CustomLottieView to show grey 'Disconnected' state immediately
when network is lost, without closing the VPN tunnel
- Ensure UI shows correct state after app foreground/background cycle
This allows the VPN tunnel to survive temporary network outages
(e.g. airplane mode) and automatically reconnect when network returns.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* Fix UI state after app foreground/background cycle
Show correct connected/disconnected state immediately when app returns
from background, without replaying animations. Use extensionStatus
(iOS VPN state) as the source of truth for UI state.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
* netbird credential
* Update MainView.swift
* Separate button by state
* Add gogoleServiceInfo plist reference
* Remove dead code in animation state machine and fix copy-to-clipboard UX - Remove unreachable shouldForceReset block in CustomLottieView (already handled by earlier return) - Guard against copying empty fqdn/ip strings when disconnected - Use consistent .smooth animation for both fqdn and ip copy feedback
- Remove unreachable shouldForceReset block in CustomLottieView (already handled by earlier return)
- Guard against copying empty fqdn/ip strings when disconnected
- Use consistent .smooth animation for both fqdn and ip copy feedback
* Tab bar
* Update peer view
* Add offline state handling and network warning banner
- Show "Offline" instead of "Connected" when VPN tunnel is active but device has no internet
- Add NetworkWarningBanner with "Network Issues" warning when connected without internet
- Remove InternetStatusView (online/offline indicator) from connection screen
- Add FirstLaunchView onboarding screen
- Remove unused components (CustomBackButton, Extensions, JustifiedText, SolidButton, TransparentGradientButton)
- Update AboutView, AdvancedView, ServerView, PeerTabView, RouteTabView, iOSNetworksView styling
- Add EmptyTabPlaceholder component
* Add AppButton component with liquid glass support for iOS 26+
* Update FirstLaunchView.swift
* old version
* Update project.pbxproj
* Code refactoring
* Update project.pbxproj
* VPN On Demand
* Update MainViewModel.swift
* Add granular VPN On Demand settings with per-interface rules and conflict detection
* Update project.pbxproj
* code refactoring
* Add Wi-Fi network management for VPN On Demand settings
* Fix ai comments
Prevent On Demand enable when user is not logged in
Add login status check in setOnDemandEnabled() to prevent reconnect
loops when VPN On Demand is enabled without an active session.
---------
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
* Add netbird version logging and pass version to Go build
Log netbird ref, commit SHA, and version during CI build.
* Fix ci/cd
* Update build-upload.yml
* Update build-upload.yml
* Update build-upload.yml
* Add netbird version resolution and logging to CI build
* delete netbird-ref