Skip to content
Merged
Show file tree
Hide file tree
Changes from 53 commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
413f113
Add tvOS (Apple TV) support for NetBird VPN client
shuuri-labs Dec 2, 2025
8ac8cee
Merge branch 'main' into feat/add-tvos-support-beta
shuuri-labs Dec 9, 2025
d4e573f
cleanup
shuuri-labs Dec 9, 2025
2e01447
fixed slow startup + added images
shuuri-labs Dec 9, 2025
7af9d71
fixed active networks not refreshing
shuuri-labs Dec 9, 2025
2b056c3
fix occasional failure of first connection
shuuri-labs Dec 9, 2025
4c79a6c
hostname properly set + removed debug logging
shuuri-labs Dec 9, 2025
a75a39d
- Fix "invalid Prefix" display on Networks tab by showing route name
shuuri-labs Dec 11, 2025
7f45512
Fixed focus escape bug on 'change server' dialog
shuuri-labs Dec 11, 2025
f3dbbd4
fixed switching of management servers
shuuri-labs Dec 11, 2025
1d7c0d2
fixes for change server settings menu
shuuri-labs Dec 11, 2025
6579821
- Extract TVColors and TVLayout to shared TVColors.swift
shuuri-labs Dec 11, 2025
72acdc1
apply recommended xcode settings
shuuri-labs Dec 11, 2025
2bc4cc3
display correct app name in tvOS UI
shuuri-labs Dec 11, 2025
5592944
added tv-specific assets, updated readme
shuuri-labs Dec 12, 2025
6c1a9d0
updated readme
shuuri-labs Dec 12, 2025
79afaae
- Add checkLoginError IPC to detect extension login failures
shuuri-labs Dec 12, 2025
9466287
integrated changes from main
shuuri-labs Dec 12, 2025
a8fa156
Fix CodeRabbit review issues: bundle IDs, force-unwraps, and error ha…
shuuri-labs Dec 17, 2025
3dbe268
- Delete unused updateManagementURL() and setSetupKey() functions
shuuri-labs Dec 17, 2025
71f06dd
Fix tvOS build issues from CodeRabbit review
shuuri-labs Dec 17, 2025
a05ded3
merge changes from main
shuuri-labs Dec 23, 2025
0a65a14
added empty box asset to tvOS app
shuuri-labs Dec 23, 2025
0e19334
- Preferences.swift: Use #if os(iOS) / #else for platform-specific
shuuri-labs Dec 23, 2025
77ef043
Add ConfigurationProvider protocol to abstract platform config storage
shuuri-labs Dec 23, 2025
c37ee47
implemented rosenpass toggle
shuuri-labs Dec 23, 2025
2462905
implemented preshared key setting
shuuri-labs Dec 23, 2025
418af69
Update GitHub Actions to use macOS 15 with Xcode 16
shuuri-labs Dec 23, 2025
def906a
Add tvOS app icons, Top Shelf images, and fix archive validation errors
shuuri-labs Jan 8, 2026
b57ba4d
Fix tvOS SDK path and add config update logging
shuuri-labs Jan 9, 2026
cbd956b
re-added test targets to project.pbxproj (lost in merge)
shuuri-labs Jan 12, 2026
63d1989
Replace regex-based JSON manipulation with JSONSerialization for
shuuri-labs Jan 12, 2026
f7277f2
Address PR review feedback for tvOS support
shuuri-labs Jan 13, 2026
df5831c
Removed dead variables from TVPeersListContent, Updated tvOS config J…
shuuri-labs Jan 13, 2026
8f48b17
update build platform (iphone 16 -> iphone 15) in an attempt to resol…
shuuri-labs Jan 13, 2026
1c23cc7
update build platform in an attempt to resolve github actions error
shuuri-labs Jan 13, 2026
7742d0b
update xcode build runner an attempt to resolve github actions error
shuuri-labs Jan 13, 2026
b8560be
update build.yml to specify downloading of ios 18.2 image to fix buil…
shuuri-labs Jan 13, 2026
557178d
update build.yml to remove specifying of ios 18.2 image download
shuuri-labs Jan 13, 2026
db108fd
downgrade macos build image to 14 to resolve ios build error on github
shuuri-labs Jan 13, 2026
4afd3ba
downgrade macos build image to 14 to resolve ios build error on github
shuuri-labs Jan 13, 2026
6e79396
upgrade build runner xcode version to 26.2 to resolve ios build error…
shuuri-labs Jan 13, 2026
42eb539
upgrade build runner xcode version to 26.2 to resolve ios build error…
shuuri-labs Jan 13, 2026
38f107a
upgrade build runner xcode version to 26.2 to resolve ios build error…
shuuri-labs Jan 13, 2026
1f366eb
upgrade build runner xcode version to 26.1.1 to resolve ios build err…
shuuri-labs Jan 13, 2026
0522317
upgrade build script sdk output path to resolve ios build error on gi…
shuuri-labs Jan 13, 2026
11e3786
added create dummy GoogleService-Info.plist build step to github work…
shuuri-labs Jan 13, 2026
6079677
Fix TVAuthView error UI not displaying by setting errorMessage state
shuuri-labs Jan 13, 2026
e59ca96
- replace pipe-delimited string parsing with typed LoginDiagnostics
shuuri-labs Jan 14, 2026
53be8b9
more pipe -> struct refactoring
shuuri-labs Jan 14, 2026
6f3b9bf
update readme and buildscript to use gomobile-netbird for building sd…
shuuri-labs Jan 15, 2026
359fb90
fix initial connection bug that required user to press 'connect' agai…
shuuri-labs Jan 15, 2026
897638f
improve app loading speed + add splash screen logo
shuuri-labs Jan 15, 2026
49b3a07
Fix race condition in tvOS VPN connection and revert Firebase to main…
shuuri-labs Jan 15, 2026
85f8e26
fix test github workflow
shuuri-labs Jan 15, 2026
207da2d
fix TVColors.swift UUID in project.pbxproj
shuuri-labs Jan 15, 2026
2d037e6
fix gomobile-netbird run in github workflow by adding 'gomobile-netbi…
shuuri-labs Jan 15, 2026
1fef7d5
Add gomobile-netbird init step to GitHub Actions workflow with proper…
shuuri-labs Jan 15, 2026
ba6e8fd
revert build script changes
shuuri-labs Jan 15, 2026
495fdf7
bump network extension ver to 7 - apple states this should match the …
shuuri-labs Jan 15, 2026
c0db032
remove unused wireguardkitgo paths
shuuri-labs Jan 15, 2026
21abfd6
Fix version mismatch between iOS app and network extension
shuuri-labs Jan 15, 2026
cbb0892
Add diagnostic logging to test workflow to capture crash details
shuuri-labs Jan 15, 2026
50617bb
use gomobile-netbird in build script, workflows
shuuri-labs Jan 16, 2026
a3d9075
update build workflow to use gomobile-netbird
shuuri-labs Jan 16, 2026
2ed8c02
force pulling of latest gomobile-netbird
shuuri-labs Jan 16, 2026
804f82e
install gobind manually rather than relying on gomobile init
shuuri-labs Jan 16, 2026
e4587a6
add gomobile-tvos-for support download module step to workflows
shuuri-labs Jan 16, 2026
8e42421
checkout gomobile-tv-fork module instead of go mod, which doesn't pla…
shuuri-labs Jan 16, 2026
09650af
Add gomobile-tvos-fork to netbird's go.mod so gobind can find bind pa…
shuuri-labs Jan 16, 2026
42e844d
revert debugging for test workflow
shuuri-labs Jan 16, 2026
556eb92
fix rosenpass toggle bug for ios - view does not read value from save…
shuuri-labs Jan 16, 2026
a7662cc
temporarily disable test workflow
shuuri-labs Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 44 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ permissions:
jobs:
build:
name: Build iOS App
runs-on: macos-14
runs-on: macos-15

steps:
- name: Select Xcode 26.1.1
run: sudo xcode-select -s /Applications/Xcode_26.1.1.app/Contents/Developer

- name: Checkout ios-client
uses: actions/checkout@v4
with:
Expand Down Expand Up @@ -66,6 +69,46 @@ jobs:
ls -la NetBird/Source/App/Views/Components/ || echo "Components dir not found"
ls -la NetBird/Source/App/ViewModels/ || echo "ViewModels dir not found"

- name: Create dummy GoogleService-Info.plist
working-directory: ios-client
run: |
cat > GoogleService-Info.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>dummy</string>
<key>REVERSED_CLIENT_ID</key>
<string>dummy</string>
<key>API_KEY</key>
<string>dummy</string>
<key>GCM_SENDER_ID</key>
<string>dummy</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>io.netbird.app</string>
<key>PROJECT_ID</key>
<string>dummy</string>
<key>STORAGE_BUCKET</key>
<string>dummy</string>
<key>IS_ADS_ENABLED</key>
<false/>
<key>IS_ANALYTICS_ENABLED</key>
<false/>
<key>IS_APPINVITE_ENABLED</key>
<false/>
<key>IS_GCM_ENABLED</key>
<false/>
<key>IS_SIGNIN_ENABLED</key>
<false/>
<key>GOOGLE_APP_ID</key>
<string>dummy</string>
</dict>
</plist>
EOF

- name: Resolve Swift packages
working-directory: ios-client
run: |
Expand Down
45 changes: 44 additions & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ permissions:
jobs:
test:
name: Build and Test
runs-on: macos-14
runs-on: macos-15

steps:
- name: Select Xcode 26.1.1
run: sudo xcode-select -s /Applications/Xcode_26.1.1.app/Contents/Developer

- name: Checkout ios-client
uses: actions/checkout@v4
with:
Expand Down Expand Up @@ -44,6 +47,46 @@ jobs:
working-directory: ios-client
run: gem install xcpretty

- name: Create dummy GoogleService-Info.plist
working-directory: ios-client
run: |
cat > GoogleService-Info.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CLIENT_ID</key>
<string>dummy</string>
<key>REVERSED_CLIENT_ID</key>
<string>dummy</string>
<key>API_KEY</key>
<string>dummy</string>
<key>GCM_SENDER_ID</key>
<string>dummy</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>io.netbird.app</string>
<key>PROJECT_ID</key>
<string>dummy</string>
<key>STORAGE_BUCKET</key>
<string>dummy</string>
<key>IS_ADS_ENABLED</key>
<false/>
<key>IS_ANALYTICS_ENABLED</key>
<false/>
<key>IS_APPINVITE_ENABLED</key>
<false/>
<key>IS_GCM_ENABLED</key>
<false/>
<key>IS_SIGNIN_ENABLED</key>
<false/>
<key>GOOGLE_APP_ID</key>
<string>dummy</string>
</dict>
</plist>
EOF

- name: Resolve Swift packages
working-directory: ios-client
run: |
Expand Down
11 changes: 11 additions & 0 deletions NetBird TV/Assets.xcassets/AccentColor.colorset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "app-store-icon.png",
"idiom" : "tv"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "app-store-icon.png",
"idiom" : "tv"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "netbird-tvos-icon.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"info" : {
"author" : "xcode",
"version" : 1
},
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "netbird-tvos-icon.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "netbird-tvos-icon.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"assets" : [
{
"filename" : "App Icon - App Store.imagestack",
"idiom" : "tv",
"role" : "primary-app-icon",
"size" : "1280x768"
},
{
"filename" : "App Icon.imagestack",
"idiom" : "tv",
"role" : "primary-app-icon",
"size" : "400x240"
},
{
"filename" : "Top Shelf Image Wide.imageset",
"idiom" : "tv",
"role" : "top-shelf-image-wide",
"size" : "2320x720"
},
{
"filename" : "Top Shelf Image.imageset",
"idiom" : "tv",
"role" : "top-shelf-image",
"size" : "1920x720"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "top-shelf-wide.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"images" : [
{
"filename" : "top-shelf.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "[email protected]",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions NetBird TV/Assets.xcassets/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
17 changes: 17 additions & 0 deletions NetBird TV/Assets.xcassets/icon-empty-box.imageset/Contents.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"images" : [
{
"filename" : "icon-empty-box.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading