Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
2782e5a
Refactor lightly to fix some glaring issues
ftchirou Jun 14, 2026
586788a
Update README.md
ftchirou Jun 14, 2026
95fd602
Remove alt-store.json
ftchirou Jun 14, 2026
da03616
Update README.md
ftchirou Jun 14, 2026
052e54c
Move service implementations into their own files
ftchirou Jun 14, 2026
d30af09
Update README.md
ftchirou Jun 14, 2026
f752087
Start migrating to AppKit
ftchirou Jun 21, 2026
c3b1515
Port most of the UI and the logic to AppKit
ftchirou Jun 21, 2026
240e214
Adapt the accuracy ring to AppKit and macOS
ftchirou Jun 22, 2026
f1e7a64
Color the accuracy ring lightGray when it is disabled
ftchirou Jun 22, 2026
0dc9b42
Complete the port of the app to macOS and AppKit
ftchirou Jun 22, 2026
490c7d3
Add scripts for building and validating the macOS app
ftchirou Jun 23, 2026
f91a848
Update macOS distribution script and GH action
ftchirou Jun 24, 2026
ef2a270
Update translations
ftchirou Jun 24, 2026
e763e1f
Add a pre-build step to create a signing file if needed
ftchirou Jun 24, 2026
e2a649b
Update README.md
ftchirou Jun 24, 2026
3b7b4c6
Add reference links in build scripts
ftchirou Jun 25, 2026
62a0133
Make sure setUp is called on all views
ftchirou Jun 25, 2026
81cee12
Add landing page
ftchirou Jun 25, 2026
b172870
Disable the keyboard when questions are playing
ftchirou Jun 25, 2026
6d1e6a5
Fix translation warnings
ftchirou Jun 25, 2026
a29796e
Update build scripts
ftchirou Jun 25, 2026
41ed138
Update Github workflows
ftchirou Jun 25, 2026
8fc6518
Fix warning
ftchirou Jun 25, 2026
0bdb3ae
Update minimum deployment target
ftchirou Jun 25, 2026
fe29baf
Load and cache sound font during tests
ftchirou Jun 25, 2026
78fb409
Update action cache version
ftchirou Jun 25, 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
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
name: Upload to TestFlight
name: Publish iOS App
on:
push:
branches:
- main
paths:
- Shared/**
- iOS/**
env:
DEVELOPER_DIR: /Applications/Xcode_16.2.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_26.5.app/Contents/Developer

jobs:
upload:
runs-on: macos-15-large
make:
if: false
runs-on: macos-26-large
steps:
- uses: actions/checkout@v4
with:
Expand All @@ -17,17 +21,17 @@ jobs:

- name: Load cached sound font
id: load-cached-sound-font
uses: actions/cache@v4
uses: actions/cache@v6
with:
key: sound_font
path: ./Bemol/Resources/sound_font.sf2
path: ./Shared/Resources/sound_font.sf2

- if: ${{ steps.load-cached-sound-font.outputs.cache-hit != 'true' }}
name: Download sound font
env:
SOUND_FONT_URL: ${{ secrets.SOUND_FONT_URL }}
run: |
curl -L -o ./Bemol/Resources/sound_font.sf2 ${SOUND_FONT_URL}
curl -L -o ./Shared/Resources/sound_font.sf2 ${SOUND_FONT_URL}

- name: Set up the development team
env:
Expand All @@ -41,20 +45,20 @@ jobs:
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
APP_STORE_CONNECT_API_KEY_CONTENTS: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENTS }}
run: |
mkdir ./private_keys
mkdir ./iOS/private_keys
echo -e "$APP_STORE_CONNECT_API_KEY_CONTENTS" > ./private_keys/AuthKey_${APP_STORE_CONNECT_API_KEY}.p8

- name: Install the Apple certificates
# https://docs.github.com/en/actions/deployment/deploying-xcode-applications/installing-an-apple-certificate-on-macos-runners-for-xcode-development
env:
DEVELOPMENT_CERTIFICATE: ${{ secrets.DEVELOPMENT_CERTIFICATE }}
DEVELOPMENT_CERTIFICATE_PASSPHRASE: ${{ secrets.DEVELOPMENT_CERTIFICATE_PASSPHRASE }}
DISTRIBUTION_CERTIFICATE: ${{ secrets.DISTRIBUTION_CERTIFICATE }}
DISTRIBUTION_CERTIFICATE_PASSPHRASE: ${{ secrets.DISTRIBUTION_CERTIFICATE_PASSPHRASE }}
DEVELOPMENT_CERTIFICATE: ${{ secrets.IOS_DEVELOPMENT_CERTIFICATE }}
DEVELOPMENT_CERTIFICATE_PASSPHRASE: ${{ secrets.IOS_DEVELOPMENT_CERTIFICATE_PASSPHRASE }}
DISTRIBUTION_CERTIFICATE: ${{ secrets.IOS_DISTRIBUTION_CERTIFICATE }}
DISTRIBUTION_CERTIFICATE_PASSPHRASE: ${{ secrets.IOS_DISTRIBUTION_CERTIFICATE_PASSPHRASE }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
development_certificate=$RUNNER_TEMP/BemolDevelopmentCertificate.p12
distribution_certificate=$RUNNER_TEMP/BemolDistributionCertificate.p12
development_certificate=$RUNNER_TEMP/BemolIOSDevelopmentCertificate.p12
distribution_certificate=$RUNNER_TEMP/BemolIOSDistributionCertificate.p12
keychain_path=$RUNNER_TEMP/certificates.keychain-db

echo -n "$DEVELOPMENT_CERTIFICATE" | base64 --decode -o $development_certificate
Expand All @@ -78,10 +82,10 @@ jobs:
run: |
chmod +x ./Scripts/next_marketing_version.sh
chmod +x ./Scripts/next_build_version.sh
chmod +x ./Scripts/upload_to_testflight.sh
chmod +x ./Scripts/make_ios_app.sh
marketing_version=`./Scripts/next_marketing_version.sh`
build_version=`./Scripts/next_build_version.sh`
./Scripts/upload_to_testflight.sh $marketing_version $build_version
./Scripts/make_ios_app.sh $marketing_version $build_version
echo "TAG_NAME=$marketing_version" >> "$GITHUB_OUTPUT"

- name: Create tag
Expand Down
110 changes: 110 additions & 0 deletions .github/workflows/publish_macos_app.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
name: Publish macOS App
on:
push:
branches:
- main
paths:
- Shared/**
- macOS/**
env:
DEVELOPER_DIR: /Applications/Xcode_26.5.app/Contents/Developer

jobs:
make:
runs-on: macos-26-large
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: main

- name: Load cached sound font
id: load-cached-sound-font
uses: actions/cache@v6
with:
key: sound_font
path: ./Shared/Resources/sound_font.sf2

- if: ${{ steps.load-cached-sound-font.outputs.cache-hit != 'true' }}
name: Download sound font
env:
SOUND_FONT_URL: ${{ secrets.SOUND_FONT_URL }}
run: |
curl -L -o ./Shared/Resources/sound_font.sf2 ${SOUND_FONT_URL}

- name: Set up code signing
env:
DEVELOPMENT_TEAM: ${{ secrets.DEVELOPMENT_TEAM }}
run: |
configuration="CODE_SIGN_IDENTITY = Developer ID Application;\nDEVELOPMENT_TEAM = ${DEVELOPMENT_TEAM};\nCODE_SIGN_STYLE = Manual;\n"
echo -e "$configuration" > ./Configurations/Signing.xcconfig

- name: Install the App Store Connect API key
env:
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
APP_STORE_CONNECT_API_KEY_CONTENTS: ${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENTS }}
run: |
mkdir ./macOS/private_keys
echo -e "$APP_STORE_CONNECT_API_KEY_CONTENTS" > ./private_keys/AuthKey_${APP_STORE_CONNECT_API_KEY}.p8

- name: Install the Apple certificates
# https://docs.github.com/en/actions/deployment/deploying-xcode-applications/installing-an-apple-certificate-on-macos-runners-for-xcode-development
env:
DISTRIBUTION_CERTIFICATE: ${{ secrets.MACOS_DEVELOPER_ID_APPLICATION_CERTIFICATE }}
DISTRIBUTION_CERTIFICATE_PASSPHRASE: ${{ secrets.MACOS_DEVELOPER_ID_APPLICATION_CERTIFICATE_PASSPHRASE }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
run: |
distribution_certificate=$RUNNER_TEMP/BemolDeveloperIDApplicationCertificate.p12
keychain_path=$RUNNER_TEMP/certificates.keychain-db

echo -n "$DISTRIBUTION_CERTIFICATE" | base64 --decode -o $distribution_certificate

security create-keychain -p "$KEYCHAIN_PASSWORD" $keychain_path
security set-keychain-settings -lut 21600 $keychain_path
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $keychain_path

security import $distribution_certificate -P "$DISTRIBUTION_CERTIFICATE_PASSPHRASE" -A -t cert -f pkcs12 -k $keychain_path

security list-keychain -d user -s $keychain_path

- name: Archive and notarize
id: archive-and-notarize
env:
APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}
APP_STORE_CONNECT_API_ISSUER: ${{ secrets.APP_STORE_CONNECT_API_ISSUER }}
run: |
chmod +x ./Scripts/next_marketing_version.sh
chmod +x ./Scripts/next_build_version.sh
chmod +x ./Scripts/make_macos_app.sh
marketing_version=`./Scripts/next_marketing_version.sh`
build_version=`./Scripts/next_build_version.sh`
./Scripts/make_macos_app.sh $marketing_version $build_version
echo "TAG_NAME=$marketing_version" >> "$GITHUB_OUTPUT"

- name: Upload
id: upload
uses: actions/upload-artifact@v7
with:
name: "Bemol-${{ steps.archive-and-notarize.outputs.TAG_NAME }}"
path: |
./Artifacts/macOS/Bemol.zip
./Artifacts/macOS/NotarizationResponse.plist
if-no-files-found: error
overwrite: true

- name: Create tag
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}
script: |
github.rest.git.createRef({
owner: context.repo.owner,
repo: context.repo.repo,
ref: `refs/tags/${{ steps.archive-and-notarize.outputs.TAG_NAME }}`,
sha: context.sha
})

- name: Clean up
run: |
rm -rf ./macOS/private_keys
security delete-keychain $RUNNER_TEMP/certificates.keychain-db
26 changes: 21 additions & 5 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ name: Test
on:
pull_request:
branches: [ main, develop ]
paths:
- Shared/**
env:
DEVELOPER_DIR: /Applications/Xcode_16.2.app/Contents/Developer
DEVELOPER_DIR: /Applications/Xcode_26.5.app/Contents/Developer

jobs:
test:
runs-on: macos-15-large
runs-on: macos-26-large
steps:
- uses: actions/checkout@v4

Expand All @@ -16,15 +18,29 @@ jobs:
DEVELOPMENT_TEAM: ${{ secrets.DEVELOPMENT_TEAM }}
run: |
configuration="CODE_SIGN_STYLE = Automatic\nDEVELOPMENT_TEAM = ${DEVELOPMENT_TEAM}\n"
echo -e "$configuration" > ./Configurations/Signing.xcconfig
echo -e "$configuration" > ./macOS/Configurations/Signing.xcconfig

- name: Load cached sound font
id: load-cached-sound-font
uses: actions/cache@v6
with:
key: sound_font
path: ./Shared/Resources/sound_font.sf2

- if: ${{ steps.load-cached-sound-font.outputs.cache-hit != 'true' }}
name: Download sound font
env:
SOUND_FONT_URL: ${{ secrets.SOUND_FONT_URL }}
run: |
curl -L -o ./Shared/Resources/sound_font.sf2 ${SOUND_FONT_URL}

- name: Run tests
run: |
chmod +x ./Scripts/test.sh
./Scripts/test.sh

- name: Publish test results
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v7
with:
name: test-results.xcresult
path: ./Artifacts/test-results.xcresult
path: ./Artifacts/Tests/test-results.xcresult
12 changes: 7 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
*/xcshareddata/IDEWorkspaceChecks.plist
xcuserdata/
Artifacts/
private_keys/
Certificates/
Configurations/Signing.xcconfig
Bemol/Resources/sound_font.sf2
Screenshots/
iOS/private_keys/
iOS/Certificates/
iOS/Configurations/Signing.xcconfig
macOS/private_keys/
macOS/Certificates/
macOS/Configurations/Signing.xcconfig
Shared/Resources/sound_font.sf2
Loading
Loading