Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
9db57be
Add a double-clickable macOS app bundle
JYPochez Aug 25, 2026
724e94b
Localize the app into French, German, Spanish and Italian
JYPochez Aug 25, 2026
0c621e1
Localize the Internet, Wireless, Network, Disks and Advanced panes
JYPochez Aug 25, 2026
7b45c41
Localize the 172 wireless region names through Foundation
JYPochez Aug 25, 2026
ec7fa33
Stop fixed control widths from truncating translations
JYPochez Aug 25, 2026
13d6e5e
Localize device status, topology, services and the setup flow
JYPochez Aug 25, 2026
ce3cf1b
Localize the status and validation messages in the model extensions
JYPochez Aug 25, 2026
0539def
Localize the sheet footer, window title and remaining shared UI text
JYPochez Aug 25, 2026
99a3d80
Use VNS.airport.utility as the bundle identifier
JYPochez Aug 25, 2026
7700b65
Fix status colours and comparisons broken by localizing display text
JYPochez Aug 25, 2026
36c88c9
Size fixed-width controls to the label when a translation needs more …
JYPochez Aug 25, 2026
8194628
Fix untranslated and truncated controls in the options sheets
JYPochez Aug 25, 2026
f622d63
Keep the fork's bundle identifier out of the committed tree
JYPochez Aug 25, 2026
7189439
Localize the option menus and disk sheets
JYPochez Aug 25, 2026
eea60b0
Fix the device popover: wrong "Edit" translation, English labels, tru…
JYPochez Aug 25, 2026
d4fb703
Keep the keychain account lookup compilable on Swift 6.0
JYPochez Aug 25, 2026
0b27c2e
Merge Swift 6.0 compile fix from feature/macos-app-bundle
JYPochez Aug 25, 2026
6752ffc
Point the README at the downloadable build
JYPochez Aug 25, 2026
5d657bb
Revert "Keep the keychain account lookup compilable on Swift 6.0"
JYPochez Aug 25, 2026
4861f44
Build CI against the newest Xcode the runner provides
JYPochez Aug 25, 2026
86b0f21
Merge CI toolchain fix from feature/macos-app-bundle
JYPochez Aug 25, 2026
5ae281f
Merge branch 'feature/localization'
JYPochez Aug 25, 2026
41c8877
Stop committing Packaging/Local.xcconfig
JYPochez Aug 25, 2026
63a95f8
Merge branch 'feature/localization'
JYPochez Aug 25, 2026
656f469
Merge Local.xcconfig ignore rule from feature/macos-app-bundle
JYPochez Aug 25, 2026
e7366f3
Merge branch 'feature/localization'
JYPochez Aug 27, 2026
fe65f89
Localize interpolated text, and size tabs to the label
JYPochez Aug 27, 2026
0c93b3e
Point the download link at the releases list
JYPochez Aug 27, 2026
be464a8
Let the release workflow succeed without signing secrets
JYPochez Aug 27, 2026
95f14a4
Merge branch 'feature/localization'
JYPochez Aug 27, 2026
8d12852
Merge workflow secrets guard from feature/macos-app-bundle
JYPochez Aug 27, 2026
ee36463
Show published file-sharing protocols and the reported SMART status
JYPochez Aug 27, 2026
c11f908
Show published file-sharing protocols and the reported SMART status
JYPochez Aug 27, 2026
a5841b2
Declare the file-sharing Bonjour types, show SMART inline, name the g…
JYPochez Aug 27, 2026
ef4de14
Merge branch 'feature/disk-health-and-protocols'
JYPochez Aug 27, 2026
4faad3d
Fail the tests when a strings table contains conflict markers
JYPochez Aug 27, 2026
ec5c817
Remove the duplicate SMART button left by the merge
JYPochez Aug 27, 2026
b36df5f
Open the main window at the top-left instead of centred
JYPochez Aug 27, 2026
b2596e4
Merge branch 'feature/disk-health-and-protocols'
JYPochez Aug 27, 2026
f0ed403
Localize the popover version label
JYPochez Aug 27, 2026
f7eea04
Merge branch 'feature/disk-health-and-protocols'
JYPochez Aug 27, 2026
b86bbfc
Remove the SMART button and let partitions inherit disk capacity
JYPochez Aug 27, 2026
efe2a9f
Decode the wrapped integer form the device actually sends
JYPochez Aug 27, 2026
9934f2a
Show vendor, firmware revision and used capacity on the disk row
JYPochez Aug 27, 2026
0084a9d
Say which capacity number is the used one
JYPochez Aug 27, 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
142 changes: 142 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
name: Release macOS app

# Builds, signs, notarizes and staples "AirPort Utility.app", then attaches the
# zip to a GitHub release.
#
# Required repository secrets:
# MACOS_CERTIFICATE base64 of the "Developer ID Application" .p12
# (base64 -i cert.p12 | pbcopy)
# MACOS_CERTIFICATE_PWD password used when exporting that .p12
# KEYCHAIN_PASSWORD any throwaway string; unlocks the temp keychain
# NOTARY_APPLE_ID Apple ID used for notarization
# NOTARY_TEAM_ID 10-character Developer Team ID
# NOTARY_PASSWORD app-specific password for that Apple ID
# Optional:
# BUNDLE_ID overrides the bundle identifier

on:
push:
tags:
- "v*"
workflow_dispatch:
inputs:
version:
description: "Version to build (e.g. 0.1.0)"
required: true
default: "0.1.0"

permissions:
contents: write

jobs:
release:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4

# Pinning a specific Xcode is wrong here: the project uses concurrency
# features that Swift 6.0 (Xcode 16) rejects, so pick the newest toolchain
# the runner provides rather than an arbitrary one.
- name: Select the newest Xcode on the runner
run: |
echo "Available:"
ls -d /Applications/Xcode*.app
LATEST=$(ls -d /Applications/Xcode*.app | sort -V | tail -1)
echo "Selecting $LATEST"
sudo xcode-select -s "$LATEST"

- name: Show toolchain
run: |
swift --version
python3 --version

- name: Run tests
run: |
swift test
python3 -m unittest Tests/BackendPythonTests/test_backend_modules.py

- name: Derive version
id: version
run: |
if [ "${{ github.event_name }}" = "push" ]; then
VERSION="${GITHUB_REF_NAME#v}"
else
VERSION="${{ github.event.inputs.version }}"
fi
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
echo "Building version $VERSION"

- name: Import Developer ID certificate
if: ${{ secrets.MACOS_CERTIFICATE != '' }}
env:
MACOS_CERTIFICATE: ${{ secrets.MACOS_CERTIFICATE }}
MACOS_CERTIFICATE_PWD: ${{ secrets.MACOS_CERTIFICATE_PWD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
set -euo pipefail
CERT_PATH="$RUNNER_TEMP/certificate.p12"
KEYCHAIN="$RUNNER_TEMP/app-signing.keychain-db"

echo -n "$MACOS_CERTIFICATE" | base64 --decode -o "$CERT_PATH"

security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
security set-keychain-settings -lut 21600 "$KEYCHAIN"
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
security import "$CERT_PATH" -P "$MACOS_CERTIFICATE_PWD" \
-A -t cert -f pkcs12 -k "$KEYCHAIN"
# Without this, codesign blocks on a UI prompt for keychain access.
security set-key-partition-list -S apple-tool:,apple:,codesign: \
-s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN" >/dev/null
security list-keychain -d user -s "$KEYCHAIN" login.keychain-db

rm -f "$CERT_PATH"
security find-identity -v -p codesigning "$KEYCHAIN"

- name: Build, sign, notarize and staple
if: ${{ secrets.MACOS_CERTIFICATE != '' }}
env:
MARKETING_VERSION: ${{ steps.version.outputs.version }}
CURRENT_PROJECT_VERSION: ${{ github.run_number }}
BUNDLE_ID: ${{ secrets.BUNDLE_ID || 'io.github.jackhumphries.airport-utility' }}
NOTARY_APPLE_ID: ${{ secrets.NOTARY_APPLE_ID }}
NOTARY_TEAM_ID: ${{ secrets.NOTARY_TEAM_ID }}
NOTARY_PASSWORD: ${{ secrets.NOTARY_PASSWORD }}
run: ./make-app.sh --sign --notarize --zip

- name: Verify the shipped bundle
if: ${{ secrets.MACOS_CERTIFICATE != '' }}
run: |
set -euo pipefail
APP="dist/AirPort Utility.app"
echo "--- architectures ---"
lipo -archs "$APP/Contents/MacOS/AirPort Utility"
echo "--- signature ---"
codesign --verify --strict --verbose=2 "$APP"
echo "--- stapled ticket ---"
xcrun stapler validate "$APP"
echo "--- gatekeeper ---"
spctl --assess --type exec --verbose=2 "$APP"

- uses: actions/upload-artifact@v4
if: ${{ secrets.MACOS_CERTIFICATE != '' }}
with:
name: AirPort-Utility-${{ steps.version.outputs.version }}
path: dist/*.zip

- name: Publish release
if: ${{ github.event_name == 'push' && secrets.MACOS_CERTIFICATE != '' }}
uses: softprops/action-gh-release@v2
with:
files: dist/*.zip
generate_release_notes: true

- name: Note that signing was skipped
if: ${{ secrets.MACOS_CERTIFICATE == '' }}
run: |
echo "::notice::Built and tested only. Signing, notarization and"\
" release publishing were skipped because the signing secrets are"\
" not configured for this repository."

- name: Clean up keychain
if: always()
run: security delete-keychain "$RUNNER_TEMP/app-signing.keychain-db" || true
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,13 @@ local-artifacts/network-captures/
*.log
*.keylog
DerivedData/

# macOS app bundle build output
dist/
build/
Build/
*.xcuserdatad
xcuserdata/

# Local build overrides (bundle identifier, signing team) -- never committed
Packaging/Local.xcconfig
Loading