Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1422 commits
Select commit Hold shift + click to select a range
130a638
version++
jonasbark Jan 22, 2026
c6296b0
version++
jonasbark Jan 22, 2026
29940d4
version++
jonasbark Jan 22, 2026
d3ab4f8
group buttons by device, add new unlock mechanism
jonasbark Jan 23, 2026
26047da
update changelog, actions
jonasbark Jan 23, 2026
7acd86f
UI adjustments
jonasbark Jan 23, 2026
25ff46d
update changelog, actions
jonasbark Jan 23, 2026
80bd472
actions, logs fix
jonasbark Jan 23, 2026
eb587c4
actions
jonasbark Jan 23, 2026
7043d16
actions
jonasbark Jan 23, 2026
f4c4707
fix build
jonasbark Jan 23, 2026
13d11dd
adjust logic
jonasbark Jan 24, 2026
8119d69
cleanup
jonasbark Jan 26, 2026
351e702
cleanup
jonasbark Jan 26, 2026
6c0942a
make phone steering option more clear
jonasbark Jan 26, 2026
15bc4ab
version++
jonasbark Jan 26, 2026
93ad9d3
Update Wi-Fi SSID instructions for MyWhoosh Link
jonasbark Jan 27, 2026
1693605
move scan settings
jonasbark Jan 28, 2026
8c77bce
update translations
jonasbark Jan 28, 2026
e3fc352
cleanup
jonasbark Jan 28, 2026
b0bf0bd
version++
jonasbark Jan 28, 2026
f0ad53e
Merge branch 'zcv2'
jonasbark Jan 28, 2026
1e22079
fix build for Windows
jonasbark Jan 28, 2026
cb62833
fix build for Windows
jonasbark Jan 28, 2026
6926f5d
fix build for Windows
jonasbark Jan 28, 2026
7a52828
fix build for Windows
jonasbark Jan 28, 2026
b14a645
Update README with YouTube video and clean up links
jonasbark Jan 28, 2026
5689980
potentially fix #276
jonasbark Jan 28, 2026
7e969b1
Merge remote-tracking branch 'origin/main'
jonasbark Jan 28, 2026
7ad65ba
version++
jonasbark Jan 28, 2026
875f5cb
fix issue #282
jonasbark Jan 29, 2026
99e6034
improve click V2 unlock logic
jonasbark Jan 29, 2026
4909a1a
fix issue when duplicating keymap
jonasbark Jan 29, 2026
586b17c
version++
jonasbark Jan 29, 2026
67ad3fb
Change YouTube video link in README.md
jonasbark Jan 30, 2026
c10666b
Update Windows Store version to 4.6.2
jonasbark Jan 30, 2026
babe564
fix action assignment
jonasbark Jan 30, 2026
69afc69
less messages when calibrating
jonasbark Jan 30, 2026
11095cf
move repository, adjust references, license
jonasbark Jan 31, 2026
50199ef
update license notice
jonasbark Jan 31, 2026
2404f0f
show a message in configuration when no buttons available for a device
jonasbark Feb 1, 2026
d26cf5e
cleanup streams on exit
jonasbark Feb 1, 2026
40a0eae
move predefined actions for keymap
jonasbark Feb 1, 2026
fd4e5f5
cleanup, proxy work
jonasbark Feb 1, 2026
e1bc66a
update translations
jonasbark Feb 1, 2026
b66285b
version++
jonasbark Feb 1, 2026
2c153f6
fix
jonasbark Feb 1, 2026
459597a
fix
jonasbark Feb 1, 2026
269fb23
fix shorebird?
jonasbark Feb 1, 2026
76bcf2a
fix shorebird?
jonasbark Feb 1, 2026
4d16eab
fix shorebird, button editor being opened without copying keymap
jonasbark Feb 1, 2026
9a74a14
Revise MyWhoosh Link connection instructions
jonasbark Feb 1, 2026
8b30b9b
optional: use magnetometer mode in phone steering
jonasbark Feb 2, 2026
5157f74
Merge branch 'main' of github.com:OpenBikeControl/bikecontrol
jonasbark Feb 2, 2026
6606586
introduce prop_public package with stubs, fixes issue #281
jonasbark Feb 2, 2026
551ed28
reenable web builds
jonasbark Feb 2, 2026
6fd319f
reset trial period on Android
jonasbark Feb 3, 2026
1a463f7
reset trial period on Android
jonasbark Feb 3, 2026
8ecac5d
bug fixes around keymap
jonasbark Feb 3, 2026
6b60046
Initial plan
Copilot Feb 3, 2026
175ff75
Update window title from bike_control to BikeControl
Copilot Feb 3, 2026
0f41c85
Fix Windows window title to display "BikeControl"
Copilot Feb 3, 2026
ab49da1
Merge pull request #286 from OpenBikeControl/copilot/update-window-ti…
jonasbark Feb 3, 2026
799234c
set long press by default for steering actions
jonasbark Feb 4, 2026
bfeb72a
Initial plan
Copilot Feb 4, 2026
67a4144
Implement media key detection persistence
Copilot Feb 4, 2026
c7e8450
Simplify assignment per code review feedback
Copilot Feb 4, 2026
5c8a593
Merge pull request #290 from OpenBikeControl/copilot/save-enable-medi…
jonasbark Feb 4, 2026
f662d0a
Merge branch 'main' of github.com:OpenBikeControl/bikecontrol
jonasbark Feb 4, 2026
fe898ce
fix #246
jonasbark Feb 5, 2026
dbf148c
fix messages
jonasbark Feb 5, 2026
79edebc
cleanup
jonasbark Feb 5, 2026
ccd1d46
reenable shorebird, fix button editor for remote setting
jonasbark Feb 5, 2026
9eaa9c5
add new remote keyboard connection method
jonasbark Feb 5, 2026
bed3dac
update submodule
jonasbark Feb 5, 2026
d8ceea9
purchasing the app on Android is now finally possible
jonasbark Feb 6, 2026
497528c
iOS: keep app alive in background
jonasbark Feb 6, 2026
288fbed
logic fixes
jonasbark Feb 6, 2026
0dc6ea7
fix module
jonasbark Feb 6, 2026
5c2ae38
fix module
jonasbark Feb 6, 2026
2802ead
missing methods in shared public
jonasbark Feb 6, 2026
8bea3b3
fix patch yaml
jonasbark Feb 6, 2026
a7e2b5b
Update Windows Store version from 4.6.2 to 4.7.2
jonasbark Feb 6, 2026
14f5486
fix potential crash
jonasbark Feb 7, 2026
a1cfe43
cleanup toast handling
jonasbark Feb 8, 2026
c4a8d1e
remove BLE services when disconnecting
jonasbark Feb 8, 2026
81f14f1
openbikecontrol via dircon
jonasbark Feb 8, 2026
76c5953
Initial plan
Copilot Feb 10, 2026
f7a0b8d
Fix headwind first button press issue by adding delay between mode an…
Copilot Feb 10, 2026
fb2068a
Merge pull request #296 from OpenBikeControl/copilot/fix-button-press…
jonasbark Feb 10, 2026
5c22851
Merge branch 'test'
jonasbark Feb 10, 2026
f844681
kickr headwind adjustments #11
jonasbark Feb 10, 2026
3eda3b5
update submodule
jonasbark Feb 10, 2026
21f7636
patch it
jonasbark Feb 10, 2026
3b6f9f6
version++
jonasbark Feb 10, 2026
84d9d1e
accessories should not be displayed in keymap customize tab
jonasbark Feb 10, 2026
732bb4a
version++
jonasbark Feb 10, 2026
59141c8
support Zwift Ride with old firmware
jonasbark Feb 11, 2026
ec4e4fc
fix public compilation
jonasbark Feb 11, 2026
edf19e3
fix MyWhoosh Link issue
jonasbark Feb 12, 2026
7b2f167
Initial plan
Copilot Feb 14, 2026
d2a41fc
Fix VS200 double shifting by handling non-long-press buttons correctly
Copilot Feb 14, 2026
d8a5280
Add comprehensive tests for VS200 single-click behavior
Copilot Feb 14, 2026
15dc34b
Add clarifying comments for two-call pattern in handleButtonsClickedW…
Copilot Feb 14, 2026
8dadc07
fix unit tests
jonasbark Feb 14, 2026
812a4ef
Merge remote-tracking branch 'origin/copilot/fix-vs200-double-shifting'
jonasbark Feb 14, 2026
07423fc
fix unit test
jonasbark Feb 14, 2026
8c4816f
actions
jonasbark Feb 14, 2026
226824c
actions
jonasbark Feb 14, 2026
aec24bb
enable audio button capture on iOS
jonasbark Feb 14, 2026
b1385e7
actions
jonasbark Feb 14, 2026
746a680
cleanup
jonasbark Feb 15, 2026
216dc97
zwift click: send 0xff command again
jonasbark Feb 15, 2026
7a77aca
local connection tile always show as suggested
jonasbark Feb 15, 2026
8d056b5
Di2: resolve issue #233
jonasbark Feb 15, 2026
a9cb929
cleanup ui
jonasbark Feb 15, 2026
7ed1ba4
fix import
jonasbark Feb 15, 2026
ad7bd64
cleanup
jonasbark Feb 16, 2026
ab379cf
shorebird cleanup
jonasbark Feb 16, 2026
ceeca9d
training peaks BLE workaround
jonasbark Feb 16, 2026
3f1a920
sign in with google, apple
jonasbark Feb 16, 2026
dcd11e6
Windows login
jonasbark Feb 16, 2026
f572a5c
macOS login
jonasbark Feb 16, 2026
aa80895
Merge branch 'login' of github.com:OpenBikeControl/bikecontrol into l…
jonasbark Feb 16, 2026
5c7e8b9
fix shimano di2 implementation
jonasbark Feb 16, 2026
05352d7
additional fixes
jonasbark Feb 16, 2026
02c038d
additional fixes
jonasbark Feb 16, 2026
207aaa0
Merge branch 'main' into login
jonasbark Feb 17, 2026
223d348
subscription #1
jonasbark Feb 17, 2026
d236695
subscription #2
jonasbark Feb 17, 2026
b7fe649
fix entitlements function name
jonasbark Feb 17, 2026
cddc402
fix windows function names
jonasbark Feb 17, 2026
2492292
fix endpoint logic
jonasbark Feb 19, 2026
e14ce0c
device registration logic
jonasbark Feb 19, 2026
0f96497
fix device ID
jonasbark Feb 19, 2026
16fae64
adjust login page and buy subscription
jonasbark Feb 19, 2026
5eedb85
check if current device is registered
jonasbark Feb 19, 2026
4523f1d
device ID adjustments
jonasbark Feb 19, 2026
a082d22
Android: increase buying fallback
jonasbark Feb 19, 2026
9946dda
Merge branch 'main' into login
jonasbark Feb 20, 2026
eca039b
ui adjustments
jonasbark Feb 20, 2026
f3a681b
update shadcn_flutter
jonasbark Feb 20, 2026
544d1f9
local pro version without needing to log in
jonasbark Feb 20, 2026
d6935b4
local pro version without needing to log in
jonasbark Feb 20, 2026
f5377e3
register current device
jonasbark Feb 20, 2026
b3f68b0
remove windows iap implementation
jonasbark Feb 21, 2026
031e196
stripe implementation
jonasbark Feb 21, 2026
99bb454
stripe implementation
jonasbark Feb 21, 2026
a9dfc4c
allow logging in without pro
jonasbark Feb 21, 2026
651d01e
revenuecat changes
jonasbark Feb 21, 2026
687a770
move subscription pages
jonasbark Feb 22, 2026
2bfdaad
user settings sync implementation
jonasbark Feb 22, 2026
4f3c302
user settings sync implementation
jonasbark Feb 22, 2026
8077a0f
user settings sync implementation
jonasbark Feb 22, 2026
cd43afb
mark some actions as pro only
jonasbark Feb 22, 2026
c854ff4
update Q&A
jonasbark Feb 22, 2026
0744e53
video grid
jonasbark Feb 22, 2026
e2815f7
no more material
jonasbark Feb 22, 2026
328a579
Android: support opening assistant
jonasbark Feb 22, 2026
293bd42
macOS: open specific shortcut
jonasbark Feb 22, 2026
85f6a8b
shortcuts only available on macOS
jonasbark Feb 22, 2026
7ca3585
Windows: run any command
jonasbark Feb 23, 2026
d758507
Initial plan
Copilot Feb 23, 2026
79bdf82
Add target app name setting to send key presses to a specific app on …
Copilot Feb 23, 2026
c71662d
Merge remote-tracking branch 'origin/copilot/allow-key-presses-to-rou…
jonasbark Feb 23, 2026
4518d02
work on issue #310
jonasbark Feb 23, 2026
87e785e
resolve issue #310
jonasbark Feb 23, 2026
763e2ce
dynamically get instruction videos
jonasbark Feb 23, 2026
f9adb9c
user settings fix
jonasbark Feb 23, 2026
2df2b0b
enable shortcuts on iOS as well
jonasbark Feb 24, 2026
cc6dccb
UI adjustment
jonasbark Feb 25, 2026
c229482
unlock video
jonasbark Feb 25, 2026
5fb0bfd
supports long press for base device as field
jonasbark Feb 25, 2026
65b7d81
individual actions for single, double, long press
jonasbark Feb 25, 2026
35c6558
add long press option for devices that do not support it (tap once = …
jonasbark Feb 25, 2026
4e50150
allow any trigger type when not pro, but replace others
jonasbark Feb 25, 2026
d8cef36
fallback when multiple triggers are defined
jonasbark Feb 25, 2026
ee4d181
ui fixes
jonasbark Feb 25, 2026
58218e8
adjustments to sram + thinkrider
jonasbark Feb 25, 2026
67549fe
create screenshot on Windows + macOS
jonasbark Feb 25, 2026
d15822e
keymap ui for mobile
jonasbark Feb 25, 2026
ada6dc9
ui fixes
jonasbark Feb 25, 2026
1ceed6d
paywall #1
jonasbark Feb 25, 2026
57e13d6
paywall for macOS + Windows
jonasbark Feb 25, 2026
c007cae
ui fixes
jonasbark Feb 25, 2026
e07ad39
ui fixes
jonasbark Feb 25, 2026
07c20cb
use prices from revenuecat
jonasbark Feb 26, 2026
c146268
create msix for publishing outside of Windows Store
jonasbark Feb 26, 2026
088dfc1
add msix to release
jonasbark Feb 26, 2026
cece3b7
Aktualisieren von pubspec.yaml
jonasbark Feb 26, 2026
91d0e16
cleanup
jonasbark Feb 26, 2026
f158120
Merge branch 'login' of github.com:OpenBikeControl/bikecontrol into l…
jonasbark Feb 26, 2026
037572a
UI adjustments
jonasbark Feb 27, 2026
f6c8fe2
ui adjustments
jonasbark Feb 27, 2026
d3afa3a
vidoe instructions UI
jonasbark Feb 27, 2026
bc3ef37
add missing NSPhotoLibraryUsageDescription
jonasbark Feb 27, 2026
591c04e
add missing NSPhotoLibraryUsageDescription
jonasbark Feb 27, 2026
0ccde0d
free trial for windows
jonasbark Feb 27, 2026
60a6f39
UI Fixes
jonasbark Mar 1, 2026
cf46586
free month paywall
jonasbark Mar 2, 2026
5928e4a
free month paywall
jonasbark Mar 2, 2026
b8c1c60
scripting #1
jonasbark Mar 2, 2026
8306b69
ipv4 for Rouvy
jonasbark Mar 4, 2026
7f99678
cleanup
jonasbark Mar 4, 2026
85fcc7f
mark some connection methods as recommended
jonasbark Mar 4, 2026
2e61dec
Merge branch 'login' into interpreter
jonasbark Mar 4, 2026
9cda77b
scripting #1
jonasbark Mar 4, 2026
c006fe4
scripting #2
jonasbark Mar 4, 2026
62c937a
cleanup
jonasbark Mar 4, 2026
c9fdd76
try script inline
jonasbark Mar 4, 2026
d94a7a8
Merge branch 'interpreter' into login
jonasbark Mar 4, 2026
86af900
clarify scripting
jonasbark Mar 4, 2026
09fe712
do not delay long press when keymap doesn't have single or double click
jonasbark Mar 5, 2026
4419ffe
translations #1
jonasbark Mar 6, 2026
c228103
translations #2
jonasbark Mar 6, 2026
55eb372
add spanish translation
jonasbark Mar 6, 2026
519d40b
add login with github
jonasbark Mar 6, 2026
1de8755
paywall translation
jonasbark Mar 6, 2026
3b40afd
login with facebook, UI fixes
jonasbark Mar 6, 2026
d29fd6c
version++
jonasbark Mar 6, 2026
d21584f
version++
jonasbark Mar 6, 2026
bddbba4
actions
jonasbark Mar 6, 2026
b2a994f
actions
jonasbark Mar 6, 2026
e52cefa
actions
jonasbark Mar 6, 2026
e2c36d4
no longer build self signed MSIX
jonasbark Mar 6, 2026
0b900ec
revise logic
jonasbark Mar 6, 2026
64b0712
version++
jonasbark Mar 6, 2026
5587a90
version++
jonasbark Mar 6, 2026
960eea0
re-add Windows Store MSIX
jonasbark Mar 6, 2026
f82900c
re-add Windows Store MSIX
jonasbark Mar 6, 2026
a9637aa
google sign in fix
jonasbark Mar 7, 2026
8ae32db
actions fix
jonasbark Mar 7, 2026
68a0704
fix theme
jonasbark Mar 7, 2026
31aae70
use store ID from Windows #1
jonasbark Mar 7, 2026
0c309e8
privacy notice
jonasbark Mar 7, 2026
d0c3656
store ID #2
jonasbark Mar 7, 2026
db85f56
revise long press hints
jonasbark Mar 7, 2026
0370e1f
translations
jonasbark Mar 7, 2026
a9797f0
fix change camera angle + emote on simulator for link, tuck action fo…
jonasbark Mar 8, 2026
dfda473
show recent value button in the simulator
jonasbark Mar 8, 2026
30c8ebb
version++
jonasbark Mar 8, 2026
83ceeb8
Apply suggestions from code review
jonasbark Mar 8, 2026
30bb2c9
feedback GA
jonasbark Mar 8, 2026
2fb9c7b
Merge branch 'login' of github.com:OpenBikeControl/bikecontrol into l…
jonasbark Mar 8, 2026
a275dab
Merge pull request #317 from OpenBikeControl/login
jonasbark Mar 8, 2026
a1b4e41
fix paywall check
jonasbark Mar 8, 2026
e0f5d5f
Merge branch 'login'
jonasbark Mar 8, 2026
0932f9a
version++
jonasbark Mar 8, 2026
c394e81
Windows direct download option
jonasbark Mar 8, 2026
7bbf23f
fix: resolve build errors with Flutter 3.41 / Dart 3.11
muskrat34 Mar 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
github: [jonasbark]
custom: ["https://paypal.me/boni", "https://donate.stripe.com/9B6aEX0muajY8bZ1Kl6J200"]
348 changes: 348 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,348 @@
name: "Build"

on:
workflow_dispatch:
inputs:
build_mac:
description: 'Build for macOS'
required: false
default: true
type: boolean
build_github:
description: 'Build for GitHub'
required: false
default: true
type: boolean
build_windows:
description: 'Build for Windows'
required: false
default: true
type: boolean
build_android:
description: 'Build for Android'
required: false
default: true
type: boolean
build_ios:
description: 'Build for iOS'
required: false
default: true
type: boolean

env:
SHOREBIRD_TOKEN: ${{ secrets.SHOREBIRD_TOKEN }}
FLUTTER_VERSION: 3.41.4

jobs:
build:
name: Build & Release
runs-on: macos-latest

permissions:
id-token: write
pages: write
contents: write

steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3
with:
submodules: recursive
token: ${{ secrets.PAT_TOKEN }}

- name: rename pubspec_overrides_ci.yaml to pubspec_overrides.yaml
run: |
if [ -f pubspec_overrides_ci.yaml ]; then
mv pubspec_overrides_ci.yaml pubspec_overrides.yaml
else
echo "No pubspec_overrides_ci.yaml found, skipping rename."
fi

- name: Install certificates
if: inputs.build_mac || inputs.build_ios
env:
DEVELOPER_ID_APPLICATION_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_APPLICATION_P12_BASE64_MAC }}
DEVELOPER_ID_INSTALLER_P12_BASE64_MAC: ${{ secrets.DEVELOPER_ID_INSTALLER_P12_BASE64_MAC }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
APPSTORE_PROFILE_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_IOS_BASE64 }}
APPSTORE_PROFILE_MACOS_BASE64: ${{ secrets.APPSTORE_PROFILE_MACOS_BASE64 }}
APPSTORE_PROFILE_DEV_IOS_BASE64: ${{ secrets.APPSTORE_PROFILE_DEV_IOS_BASE64 }}
run: |
# create variables
DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_application_certificate.p12
DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH=$RUNNER_TEMP/build_developerID_installer_certificate.p12
PP_PATH_IOS=$RUNNER_TEMP/build_pp_ios.mobileprovision
PP_PATH_IOS_DEV=$RUNNER_TEMP/build_pp_ios_dev.mobileprovision
PP_PATH_MACOS=$RUNNER_TEMP/build_pp_macos.provisionprofile
KEYCHAIN_PATH=$RUNNER_TEMP/pg-signing.keychain-db

# import certificate and provisioning profile from secrets
echo -n "$DEVELOPER_ID_APPLICATION_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH
echo -n "$DEVELOPER_ID_INSTALLER_P12_BASE64_MAC" | base64 --decode --output $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH
echo -n "$APPSTORE_PROFILE_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS
echo -n "$APPSTORE_PROFILE_DEV_IOS_BASE64" | base64 --decode -o $PP_PATH_IOS_DEV
echo -n "$APPSTORE_PROFILE_MACOS_BASE64" | base64 --decode -o $PP_PATH_MACOS

# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
# security default-keychain -s $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

# import certificate to keychain
security import $DEVELOPER_ID_APPLICATION_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security import $DEVELOPER_ID_INSTALLER_CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_IOS_DEV ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH_MACOS ~/Library/MobileDevice/Provisioning\ Profiles

- name: 🐦 Setup Shorebird
#if: inputs.build_mac || inputs.build_android || inputs.build_ios
if: inputs.build_android || inputs.build_ios
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true

- name: Set Up Flutter maCOS
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}

- name: Generate translation files
run: |
flutter pub global activate intl_utils;
flutter pub global run intl_utils:generate;

- name: 🚀 Shorebird Release macOS
if: inputs.build_mac && false
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: macos
args: "--obfuscate --split-debug-info=symbols -- --dart-define=VERIFYING_SHARED_SECRET=${{ secrets.VERIFYING_SHARED_SECRET }} --dart-define=REVENUECAT_API_KEY_IOS=${{ secrets.REVENUECAT_API_KEY_IOS }} --dart-define=SUPABASE_ANON_KEY=${{ secrets.SUPABASE_ANON_KEY }}"

- name: Flutter Release macOS
if: inputs.build_mac
run:
flutter build macos --release --obfuscate --split-debug-info=symbols --dart-define=VERIFYING_SHARED_SECRET=${{ secrets.VERIFYING_SHARED_SECRET }} --dart-define=REVENUECAT_API_KEY_IOS=${{ secrets.REVENUECAT_API_KEY_IOS }} --dart-define=SUPABASE_ANON_KEY=${{ secrets.SUPABASE_ANON_KEY }}

- name: Decode Keystore
if: inputs.build_android
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 --decode > android/android.keystore;
echo "${{ secrets.KEYSTORE_PROPERTIES }}" > android/keystore.properties;

- name: 🚀 Shorebird Release Android
if: inputs.build_android
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: android
args: "--obfuscate --split-debug-info=symbols -- --dart-define=REVENUECAT_API_KEY_ANDROID=${{ secrets.REVENUECAT_API_KEY_ANDROID }} --dart-define=SUPABASE_ANON_KEY=${{ secrets.SUPABASE_ANON_KEY }}"

- name: Extract latest changelog
id: changelog
run: |
chmod +x scripts/get_latest_changelog.sh
mkdir -p whatsnew
./scripts/get_latest_changelog.sh | head -c 500 > whatsnew/whatsnew-en-US

- name: Generate release body
if: inputs.build_github
run: |
chmod +x scripts/generate_release_body.sh
./scripts/generate_release_body.sh > /tmp/release_body.md

- name: 🚀 Shorebird Release iOS
if: inputs.build_ios
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: ios
args: "--export-options-plist ios/ExportOptions.plist --obfuscate --split-debug-info=symbols -- --dart-define=VERIFYING_SHARED_SECRET=${{ secrets.VERIFYING_SHARED_SECRET }} --dart-define=REVENUECAT_API_KEY_IOS=${{ secrets.REVENUECAT_API_KEY_IOS }} --dart-define=SUPABASE_ANON_KEY=${{ secrets.SUPABASE_ANON_KEY }}"

- name: Prepare App Store authentication key
if: inputs.build_ios || inputs.build_mac
env:
API_KEY_BASE64: ${{ secrets.APPSTORE_API_KEY_FILE_BASE64 }}
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
run: |
mkdir -p ./private_keys;
printf %s "$API_KEY_BASE64" | base64 -D > "./private_keys/AuthKey_${APPSTORE_API_KEY}.p8";

- name: Upload to Play Store
if: inputs.build_android
uses: r0adkll/upload-google-play@v1
with:
serviceAccountJsonPlainText: ${{ secrets.SERVICE_ACCOUNT_JSON }}
packageName: de.jonasbark.swiftcontrol
releaseFiles: build/app/outputs/bundle/release/app-release.aab
track: ${{ github.ref == 'refs/heads/main' && 'production' || 'alpha' }}
whatsNewDirectory: whatsnew

- name: Upload to macOS App Store
if: inputs.build_mac
env:
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
APPSTORE_API_ISSUER_ID: ${{ secrets.APPSTORE_API_ISSUER_ID }}
run: |
productbuild --component "build/macos/Build/Products/Release/BikeControl.app" /Applications "BikeControl.pkg" --sign "3rd Party Mac Developer Installer: JONAS TASSILO BARK (UZRHKPVWN9)";
xcrun altool --upload-app -f BikeControl.pkg -t osx --apiKey "$APPSTORE_API_KEY" --apiIssuer "$APPSTORE_API_ISSUER_ID";

- name: Upload to iOS App Store
if: inputs.build_ios
env:
APPSTORE_API_KEY: ${{ secrets.APPSTORE_API_KEY }}
APPSTORE_API_ISSUER_ID: ${{ secrets.APPSTORE_API_ISSUER_ID }}
run: |
xcrun altool --upload-app -f build/ios/ipa/swift_play.ipa -t ios --apiKey "$APPSTORE_API_KEY" --apiIssuer "$APPSTORE_API_ISSUER_ID";


#10 Extract Version
- name: Extract version from pubspec.yaml
if: inputs.build_github
id: extract_version
run: |
version=$(grep '^version: ' pubspec.yaml | cut -d ' ' -f 2 | tr -d '\r')
echo "VERSION=$version" >> $GITHUB_ENV

- name: Upload Symbols
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Symbols
path: symbols/

#13 Create Release
- name: Create Release
if: inputs.build_github
uses: ncipollo/release-action@v1
with:
artifacts: "build/app/outputs/flutter-apk/BikeControl.android.apk,build/macos/Build/Products/Release/BikeControl.macos.zip"
allowUpdates: true
prerelease: true
bodyFile: /tmp/release_body.md
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}

windows:
if: inputs.build_windows
name: Build & Release on Windows
runs-on: windows-2025

steps:
#1 Checkout Repository
- name: Checkout Repository
uses: actions/checkout@v3
with:
submodules: recursive
token: ${{ secrets.PAT_TOKEN }}

- name: rename pubspec_overrides_ci.yaml to pubspec_overrides.yaml
shell: pwsh
run: |
if (Test-Path pubspec_overrides_ci.yaml) {
Rename-Item -Path pubspec_overrides_ci.yaml -NewName pubspec_overrides.yaml
} else {
Write-Output "No pubspec_overrides_ci.yaml found, skipping rename."
}

- name: Extract version from pubspec.yaml (Windows)
shell: pwsh
run: |
$version = Select-String '^version: ' pubspec.yaml | ForEach-Object {
($_ -split ' ')[1].Trim()
}
echo "VERSION=$version" >> $env:GITHUB_ENV

- name: 🐦 Setup Shorebird
uses: shorebirdtech/setup-shorebird@v1
with:
cache: true

- name: Set Up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
flutter-version: ${{ env.FLUTTER_VERSION }}

- name: Generate translation files
run: |
flutter pub global activate intl_utils;
flutter pub global run intl_utils:generate;

- name: 🚀 Shorebird Release Windows
uses: shorebirdtech/shorebird-release@v1
with:
flutter-version: ${{ env.FLUTTER_VERSION }}
platform: windows
args: "--obfuscate --split-debug-info=symbols-win -- --dart-define=SUPABASE_ANON_KEY=${{ secrets.SUPABASE_ANON_KEY }}"

- name: Zip Windows release
shell: pwsh
run: |
$source = "C:\Windows\System32"
$destination = "build\windows\x64\runner\Release"

# List of required DLLs
$dlls = @("msvcp140.dll", "vcruntime140.dll", "vcruntime140_1.dll")

# Copy each file
foreach ($dll in $dlls) {
$srcPath = Join-Path $source $dll
$destPath = Join-Path $destination $dll

if (Test-Path $srcPath) {
Copy-Item -Path $srcPath -Destination $destPath -Force
Write-Output "Copied $dll to $destination"
} else {
Write-Warning "$dll not found in $source"
}
}
$zipPath = "build/windows/bike_control.windows.zip"
if (Test-Path $zipPath) {
Remove-Item $zipPath -Force
}
Compress-Archive -Path "build/windows/x64/runner/Release/*" -DestinationPath $zipPath

- name: Create Store MSIX package
run: dart run msix:create --store --output-name bike_control.store

- name: Upload Store Artifact
uses: actions/upload-artifact@v4
with:
overwrite: true
name: BikeControl Store
path: build/windows/x64/runner/Release/bike_control.store.msix

- name: Upload Windows artifact
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Windows Release
path: build/windows/bike_control.windows.zip

- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
overwrite: true
name: Windows Symbols
path: symbols-win/

- name: Create Release (Windows zip)
if: inputs.build_github
uses: ncipollo/release-action@v1
with:
artifacts: "build/windows/bike_control.windows.zip"
allowUpdates: true
prerelease: true
replacesArtifacts: false
tag: v${{ env.VERSION }}
token: ${{ secrets.TOKEN }}
Loading