Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 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
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
Comment on lines +19 to +20
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

Xcode versions available GitHub Actions macOS runner January 2026

💡 Result:

Short answer — what’s available and where to check (Jan 13, 2026):

  • GitHub-hosted macOS runners provide different Xcode sets per image (macos-14, macos-15, macos-26 beta). See the runner-images release notes for each image for exact installed Xcode builds. [1][2].
  • GitHub support policy in practice (affects what Xcode minors are kept on images): Xcode 15: all minor releases with full platform tools; Xcode 16: “last two” minor releases (oldest replaced as new minors ship). See the GitHub changelog / announcement. [3].
  • Recent/deprecation notes: simulator runtimes for Xcode 16.3 and older on macos-15 were deprecated on Jan 12, 2026 (and related Xcode deprecation announcements appear in the runner-images releases). Check the image release notes for exact removal dates and which Xcode minor versions remain. [1][2].

If you want the precise Xcode version list for a specific runner image (e.g., macos-15 or macos-14) right now, tell me which image and I’ll fetch the exact installed Xcode builds from the image README/release page.

Sources: GitHub Actions runner-images releases and changelog. [1] GitHub runner-images releases (macOS image notes). [2] Recent macOS image release entries (macos-14 / macos-15). [3] GitHub Changelog announcement about Xcode 16.2 / Xcode support policy.


🌐 Web query:

GitHub Actions runner-images macos-15 Xcode versions installed 2026

💡 Result:

On the macos-15 GitHub Actions images (2026), available Xcode toolsets have been updated; notable items:

  • Xcode 26.0 (beta) is included on macos-15 images (added in mid‑2025). [1]
  • Xcode 16.3 (and its SDKs) was present on earlier macos-15 images (spring 2025). [2]
  • Xcode 15.4 (and its simulator runtimes) was removed from macos-15 images (targeted May 29, 2025). If you depend on older platform SDKs (pre‑Xcode 16.3), you must install them manually or use macos-14 images. [3]

If you want the exact Xcode versions and SDKs on a specific macos-15 image version (for example image_version 20260105.0094.1), tell me which image tag/date and I’ll pull the precise Xcode table for that release.

Sources: [1] [actions/runner-images macos-15 20250616 release], [2] [actions/runner-images macos-15 20250331 release], [3] [issue: Xcode 15.4 removal].


🌐 Web query:

Xcode 26.1 release version macOS Apple 2026

💡 Result:

Xcode 26.1 (build 17B55) was released November 3, 2025. It requires macOS Sequoia 15.6 or later to install/run. [1][2]

Sources:

  • Apple Developer release notes listing Xcode 26.1 (Nov 3, 2025). [1]
  • Apple Xcode support page showing "macOS Sequoia 15.6 or later" as the minimum for Xcode 26.1. [2]

🌐 Web query:

Xcode 26.1.1 patch release Apple Developer

💡 Result:

Xcode 26.1.1 (build 17B100) was released November 11, 2025. It’s a patch update that includes coding‑intelligence/AI tooling fixes, Swift 6.2.1 compatibility, and multiple bug fixes across indexing, Instruments, Interface Builder, Swift packages, Xcode Cloud, and more. Download and full release notes are available from Apple’s developer pages. [1][2][3]

Sources:

  • Apple Releases page (Xcode 26.1.1 — Nov 11, 2025). [1]
  • Xcode support / releases listing (Xcode 26.1.1 entry). [2]
  • Coverage summarizing fixes (9to5Mac). [3]

Would you like the direct download/release‑notes link?


🌐 Web query:

GitHub Actions macos-15 runner Xcode 26.1.1 installed January 2026

💡 Result:

Short answer: No — the macos-15 GitHub Actions runner in January 2026 has Xcode 26.2 installed (not Xcode 26.1.1). See the macos-15 image release notes showing Xcode 26.2 on the image (Image Version 20260112). [1] An issue requesting Xcode 26.1.1 was filed but not reflected in the January 2026 macOS images. [2]

Sources:

  • actions/runner-images release notes (macos-15 image, 2026-01-12) — shows Xcode 26.2 installed. [1]
  • Issue requesting Xcode 26.1.1 on actions/runner-images. [2]

Update Xcode version to 26.2 — version 26.1.1 is not available on the macos-15 runner.

The macos-15 GitHub Actions runner (as of January 2026) includes Xcode 26.2, not 26.1.1. The xcode-select step will fail because /Applications/Xcode_26.1.1.app does not exist on the runner. Update the version to 26.2 to match the installed toolchain.

🤖 Prompt for AI Agents
In @.github/workflows/build.yml around lines 19 - 20, The workflow step named
"Select Xcode 26.1.1" is selecting a non-existent Xcode path; update the
xcode-select target to the installed toolchain by changing the path from
/Applications/Xcode_26.1.1.app/Contents/Developer to
/Applications/Xcode_26.2.app/Contents/Developer (i.e., update the run line in
the step that currently runs `sudo xcode-select -s
/Applications/Xcode_26.1.1.app/Contents/Developer` to use Xcode_26.2).


- 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
Comment on lines +19 to +20
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Same Xcode version issue as build.yml.

The Xcode version 26.1.1 does not exist. This needs to be corrected to a valid version (likely 16.x).

🤖 Prompt for AI Agents
In @.github/workflows/test.yml around lines 19 - 20, The workflow step
referencing a non-existent Xcode "26.1.1" should be updated to a valid macOS
Xcode version; change the step name "Select Xcode 26.1.1" and the run command
path to a real Xcode install (for example rename to "Select Xcode 16.2" and use
sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer or the
appropriate /Applications/Xcode_16.app path for your runner).


- 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