Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
9357081
Initial app generation (no customisation yet)
microbit-matt-hillsdon Nov 26, 2025
a73398e
app: status bar; disable shared assets for now
microbit-matt-hillsdon Nov 26, 2025
2a1d55e
iOS and Android builds
microbit-matt-hillsdon Nov 26, 2025
80a1637
Initial workflows
microbit-matt-hillsdon Nov 26, 2025
c604d7d
Tweak Java version
microbit-matt-hillsdon Nov 26, 2025
097fd75
Add file not covered by tsconfig to make eslint happy
microbit-matt-hillsdon Nov 26, 2025
1e00cb9
The actual build times are nowhere near 45 mins
microbit-matt-hillsdon Nov 26, 2025
befb415
Keep system status bar out of the Action Bar area
glastonbridge Dec 2, 2025
367a8cc
Keep system status bar out of the Action Bar area
glastonbridge Dec 4, 2025
d47f637
Minimal apps branding (#642)
microbit-matt-hillsdon Dec 14, 2025
6d591e0
Mobile app BLE support (#643)
microbit-matt-hillsdon Jan 9, 2026
6c7e457
Switch to MEF development team for signing
microbit-matt-hillsdon Jan 9, 2026
86aaa19
Let's go with a pre-1.0 version
microbit-matt-hillsdon Jan 9, 2026
059597c
Apparently we need this string too.
microbit-matt-hillsdon Jan 9, 2026
ccfc8f1
We don't have our own crypto. Silence app store connect query.
microbit-matt-hillsdon Jan 9, 2026
105d085
Bump version
microbit-matt-hillsdon Jan 9, 2026
438fd70
Align the Android version with iOS
microbit-matt-hillsdon Jan 9, 2026
3d4f11e
Update data collection hex files with correct bluetooth pattern (#673)
microbit-grace Jan 13, 2026
51d81a3
Add a longer connect delay for Android (#674)
microbit-grace Jan 13, 2026
2457870
Use a state machine for connection and download flows; add tests (#660)
microbit-matt-hillsdon Jan 16, 2026
35cd273
Apps: Simplify "What you need to connect" (#681)
microbit-matt-hillsdon Jan 19, 2026
b0a0141
Bluetooth permissions; A+B reset (#682)
microbit-matt-hillsdon Jan 19, 2026
22f1970
Use fastlane for iOS signing; Android too (#686)
microbit-matt-hillsdon Jan 19, 2026
2874df5
An approach to tagging apps releases (#687)
microbit-matt-hillsdon Jan 19, 2026
889cf0b
Improve connection handling (#689)
microbit-matt-hillsdon Jan 21, 2026
62bc4b1
Share permission steps between data connection and download flows (#695)
microbit-matt-hillsdon Jan 21, 2026
3d92096
Fix Bluetooth name reuse across connection/download flows (#696)
microbit-matt-hillsdon Jan 21, 2026
adc71ac
Fix flicker in the download flow (#697)
microbit-matt-hillsdon Jan 21, 2026
20731c9
Add fastlane upload lanes for TestFlight and Google Play (#698)
microbit-matt-hillsdon Jan 21, 2026
d8a2fd7
Fix android connection fail after flashing (#699)
microbit-grace Jan 22, 2026
c731f97
Restore web deployment steps in build workflow (#703)
microbit-matt-hillsdon Jan 22, 2026
526b5d7
Remove reconnect delay now we wait to disconnect (#705)
microbit-matt-hillsdon Jan 23, 2026
033029c
Improve error handling for native Bluetooth (#702)
microbit-matt-hillsdon Jan 23, 2026
86ca7f4
Apps: open hex files on iOS and Android (#704)
glastonbridge Jan 23, 2026
1221de2
Wire up the Google credential for the Play upload (#707)
microbit-matt-hillsdon Jan 26, 2026
650969c
Default the language from navigator.language (#688)
microbit-matt-hillsdon Jan 26, 2026
6a26ea1
Android edge-to-edge fixes (#710)
microbit-matt-hillsdon Jan 28, 2026
17e90de
Improve native flow and handling edge cases (#711)
microbit-grace Jan 30, 2026
033e2f0
Improve dialogs on mobile (#684)
microbit-matt-hillsdon Jan 30, 2026
e0ed83e
Tweak iOS specific message to use icon (#717)
microbit-matt-hillsdon Jan 30, 2026
152fad5
Remove `ConnectionStatus.Reconnecting` and add auto-reconnect (#719)
microbit-grace Feb 5, 2026
24e6434
Track device bond state persistently to reduce time taken to connect …
microbit-grace Feb 9, 2026
58ef758
Merge branch 'support-multiple-projects-beta' into merge-mp-into-apps
microbit-matt-hillsdon Feb 9, 2026
0683056
Reinstate bond state storage (lost with persist)
microbit-matt-hillsdon Feb 9, 2026
56a8bcb
Give the new dialog mobile treatment
microbit-matt-hillsdon Feb 10, 2026
1527957
Fix up the recent merge
microbit-matt-hillsdon Feb 10, 2026
a595b78
Reinstate skipTours flag
microbit-matt-hillsdon Feb 10, 2026
362a39b
Another merge tweak - this was removed on the apps branch then reinst…
microbit-matt-hillsdon Feb 10, 2026
39a8af2
Sync Bluetooth name filter from settings at connection time
microbit-matt-hillsdon Feb 10, 2026
a08f9a6
Fix bad merge of bottomContent
microbit-matt-hillsdon Feb 10, 2026
9c3eada
Fix recording highlight drawing duplicate start lines on live graph
microbit-matt-hillsdon Feb 10, 2026
d3f24c8
Merge pull request #726 from microbit-foundation/merge-mp-into-apps
microbit-matt-hillsdon Feb 11, 2026
bb3365f
Reinstate simpler C++ data collection firmware (#732)
microbit-matt-hillsdon Feb 12, 2026
1f8226c
Merge branch 'support-multiple-projects-beta' into merge-mp-2
microbit-matt-hillsdon Feb 12, 2026
ba3b7b5
Merge pull request #734 from microbit-foundation/merge-mp-2
microbit-matt-hillsdon Feb 12, 2026
388bbf2
Fix Android fastlane upload for draft apps (#735)
microbit-matt-hillsdon Feb 12, 2026
90dd14b
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 13, 2026
9e98c98
Use macOS 26 runner for iOS CI builds (#739)
microbit-matt-hillsdon Feb 13, 2026
3cc5b86
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 16, 2026
02f7c2b
Tweak download message (#736)
microbit-matt-hillsdon Feb 16, 2026
2f6a9e5
Use SQLite storage on mobile replacing IndexedDB (#743)
microbit-matt-hillsdon Feb 18, 2026
344346d
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 18, 2026
ae17dfd
Bump capacitor-sqlite-vanilla for Android DDL fix
microbit-matt-hillsdon Feb 19, 2026
0347373
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 19, 2026
d5b4e07
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 19, 2026
4a1151e
Add Android back button support (#756)
microbit-matt-hillsdon Feb 20, 2026
875c35e
Fix iOS modal dialogs rendering at wrong size after app resume (#758)
microbit-matt-hillsdon Feb 20, 2026
6f6b373
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 20, 2026
47f479a
Merge branch 'apps' of github.com:microbit-foundation/ml-trainer into…
microbit-matt-hillsdon Feb 20, 2026
e20e06c
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 20, 2026
e63602f
Remove connecting dialog in background during Web Bluetooth connectio…
microbit-grace Feb 20, 2026
12a740d
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 20, 2026
b03019e
Merge branch 'apps' of github.com:microbit-foundation/ml-trainer into…
microbit-matt-hillsdon Feb 20, 2026
9296ec5
The storage warning/info doesn't apply to the app.
microbit-matt-hillsdon Feb 20, 2026
f53a8ff
Include native debug symbols in Android AAB for Play Console crash re…
microbit-matt-hillsdon Feb 20, 2026
b9a19df
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 24, 2026
42c1c18
Merge branch 'support-multiple-projects-beta' into apps
microbit-matt-hillsdon Feb 24, 2026
736b8ec
Apps: sharing and save/download (#761)
microbit-matt-hillsdon Feb 24, 2026
a3d30f5
Merge branch 'support-multiple-projects-beta' into support-mp-beta-apps
microbit-grace Feb 24, 2026
40e711d
Remove getLatestProject from sqlite version
microbit-grace Feb 24, 2026
62bf027
Merge branch 'beta' into support-mp-beta-apps
microbit-matt-hillsdon Feb 24, 2026
67a432a
Merge branch 'beta' into support-mp-beta-apps
microbit-matt-hillsdon Feb 25, 2026
165a496
Merge pull request #763 from microbit-foundation/support-mp-beta-apps
microbit-matt-hillsdon Feb 25, 2026
71925bd
Merge branch 'beta' into apps
microbit-matt-hillsdon Feb 25, 2026
e988fbb
Merge branch 'beta' into apps
microbit-matt-hillsdon Feb 25, 2026
d960d89
Increase native carousel x padding on tablet-sized screens
microbit-matt-hillsdon Feb 25, 2026
adb0c3a
Merge branch 'beta' into apps
microbit-matt-hillsdon Feb 25, 2026
ecee438
Merge branch 'beta' into apps
microbit-matt-hillsdon Feb 25, 2026
97fc526
Fix Bluetooth pattern checks and skip verification after download (#755)
microbit-grace Feb 26, 2026
db4d747
Merge branch 'beta' into apps
microbit-matt-hillsdon Feb 26, 2026
9480bd9
Remove partial flashing service from firmware
microbit-matt-hillsdon Mar 2, 2026
21dad4d
Update connection library
microbit-matt-hillsdon Mar 2, 2026
7392e38
Merge pull request #777 from microbit-foundation/no-pf
microbit-matt-hillsdon Mar 2, 2026
c658e82
Reload if editor is not ready when resuming app (#775)
microbit-grace Mar 3, 2026
8485c83
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 6, 2026
0e6f783
Update connection library (#784)
microbit-matt-hillsdon Mar 9, 2026
b314e5b
Fix crash when training model without a connected micro:bit (#789)
microbit-matt-hillsdon Mar 13, 2026
5b4ae53
Fix sharing issues (#792)
microbit-matt-hillsdon Mar 17, 2026
abffb02
Upgrade connection library (#791)
microbit-matt-hillsdon Mar 17, 2026
52df51e
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 17, 2026
71cedee
Fix download flow not using new Bluetooth name after pattern change (…
microbit-matt-hillsdon Mar 17, 2026
c7a5001
Don't center NameProjectDialog (#800)
microbit-matt-hillsdon Mar 18, 2026
8870634
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 18, 2026
2e1bdc1
Merge branch 'apps' of github.com:microbit-foundation/ml-trainer into…
microbit-matt-hillsdon Mar 18, 2026
45ee7e0
Prevent keyboard from obscuring action names on native (#801)
microbit-matt-hillsdon Mar 18, 2026
8b591ae
Apps: smoother prediction animation (#797)
glastonbridge Mar 18, 2026
dd4f509
Fix .hex file import on Android (#802)
microbit-matt-hillsdon Mar 19, 2026
7527bf4
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 19, 2026
a4a78d5
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 24, 2026
0277663
Rename makecode projects more consistently when they are not the acti…
glastonbridge Mar 24, 2026
ab00d47
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 24, 2026
ff7da84
Rename native data collection progress dialog to reference micro:bit …
microbit-grace Mar 25, 2026
2878e5c
Only reset on close if not hadSuccessfulConnection (#814)
microbit-grace Mar 25, 2026
806793e
Fix multiple attributes with the same name error (#816)
microbit-grace Mar 25, 2026
b23f9c1
Collapse compare/copy bluetooth pattern dialogs into one editable dia…
microbit-matt-hillsdon Mar 27, 2026
043b032
Add iPadOS 26 window controls offset for Capacitor web view (#818)
microbit-matt-hillsdon Mar 27, 2026
55f1a98
Replace native Bluetooth "What you need" dialog with battery pack dia…
microbit-matt-hillsdon Mar 30, 2026
068ebfd
Merge branch 'beta' into apps
microbit-matt-hillsdon Mar 30, 2026
bf49dfb
Fix bad import merge
microbit-matt-hillsdon Mar 30, 2026
f537ea5
Restrict app to tablets on Google Play and App Store (#830)
microbit-matt-hillsdon Mar 30, 2026
38cfaff
Merge branch 'beta' into merge-beta-storage-errors
microbit-matt-hillsdon Mar 31, 2026
b87aa3a
Add basic SQLite error handling
microbit-matt-hillsdon Mar 31, 2026
50bd5e4
Merge pull request #831 from microbit-foundation/merge-beta-storage-e…
microbit-matt-hillsdon Mar 31, 2026
c17acc0
Tweak layout
microbit-matt-hillsdon Mar 31, 2026
fb130f3
Format fix
microbit-matt-hillsdon Mar 31, 2026
8fdd8a6
Set VITE_STAGE in app CI builds so external links use correct URLs (#…
microbit-matt-hillsdon Apr 2, 2026
742ffe0
Merge branch 'main' into apps
microbit-matt-hillsdon Apr 2, 2026
54e4951
Use beta MakeCode for editor (#846)
microbit-grace Apr 8, 2026
c3dc922
Add cannot see pattern link to enter pattern dialog (#843)
microbit-grace Apr 8, 2026
bd66a95
Replace reset microbit GIF with animations (#832)
microbit-grace Apr 8, 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
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ module.exports = {
"bootstrap-template.js",
"playwright.config.ts",
"CMakeFiles",
"android",
"ios",
"firmware",
],
parser: "@typescript-eslint/parser",
parserOptions: {
Expand Down
106 changes: 106 additions & 0 deletions .github/workflows/android-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
name: Android Build

on:
release:
types: [created]
push:
branches:
- "**"

concurrency:
group: ${{ github.workflow }}-${{ startsWith(github.ref, 'refs/tags/v') && 'release' || github.ref }}
cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/v') }}

jobs:
build-android:
# Only run for apps releases, not web releases
if: ${{ github.event_name != 'release' || contains(github.event.release.tag_name, '-apps') }}
timeout-minutes: 15
runs-on: ubuntu-latest
permissions:
contents: read
packages: read
id-token: write
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
registry-url: "https://npm.pkg.github.com"

- uses: microbit-foundation/npm-package-versioner-action@v1

# Strip prerelease suffix - app stores require X.Y.Z format
- name: Set marketing version
run: echo "MARKETING_VERSION=$(jq -r .version package.json | sed 's/-.*//')" >> $GITHUB_ENV

- uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "21"

- uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: true

- run: npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- run: echo "ML_THEME_VERSION=$(jq -r '.["theme-package-version"]' workflow-config.json)" >> $GITHUB_ENV

- run: npm install --no-save @microbit-foundation/ml-trainer-microbit@${{ env.ML_THEME_VERSION }}
if: github.repository_owner == 'microbit-foundation'
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- run: node ./bin/print-apps-ci-env.cjs >> $GITHUB_ENV
- run: npm run build:apps

- run: npx cap sync android

- name: Decode keystore
run: |
echo "SIGNING_STORE_FILE=$RUNNER_TEMP/keystore.jks" >> $GITHUB_ENV
printenv SIGNING_STORE_FILE_BASE64 | base64 -d > "$RUNNER_TEMP/keystore.jks"
env:
SIGNING_STORE_FILE_BASE64: ${{ secrets.ANDROID_SIGNING_STORE_FILE_BASE64 }}

- name: Build with Fastlane
run: bundle exec fastlane android build
env:
SIGNING_KEY_ALIAS: upload
SIGNING_KEY_PASSWORD: ${{ secrets.ANDROID_SIGNING_PASSWORD }}
SIGNING_STORE_PASSWORD: ${{ secrets.ANDROID_SIGNING_PASSWORD }}
BUILD_NUMBER: ${{ github.run_number }}
MARKETING_VERSION: ${{ env.MARKETING_VERSION }}

- name: Clean up keystore
run: rm -f "$RUNNER_TEMP/keystore.jks"
if: always()

- uses: actions/upload-artifact@v4
with:
name: android-apk-${{ github.sha }}
path: android/app/build/outputs/apk/release/*.apk
retention-days: 30

- uses: actions/upload-artifact@v4
with:
name: android-aab-${{ github.sha }}
path: android/app/build/outputs/bundle/release/*.aab
retention-days: 30

- name: Authenticate to Google Cloud
if: github.event_name == 'release'
uses: google-github-actions/auth@v2
with:
workload_identity_provider: projects/311821962964/locations/global/workloadIdentityPools/github-actions-pool/providers/github-actions
service_account: fastlane-supply@microbit-fastlane.iam.gserviceaccount.com

- name: Upload to Google Play
if: github.event_name == 'release'
run: bundle exec fastlane android upload
8 changes: 6 additions & 2 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ concurrency:

jobs:
build:
# Skip apps releases - handled by ios-build.yml and android-build.yml
if: ${{ github.event_name != 'release' || !contains(github.event.release.tag_name, '-apps') }}
timeout-minutes: 10
runs-on: ubuntu-latest
permissions:
Expand All @@ -39,11 +41,13 @@ jobs:
- run: npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: npm install --no-save @microbit-foundation/ml-trainer-microbit@0.2.0 @microbit-foundation/website-deploy-aws@0.6 @microbit-foundation/website-deploy-aws-config@0.10
- run: echo "ML_THEME_VERSION=$(jq -r '.["theme-package-version"]' workflow-config.json)" >> $GITHUB_ENV
- run: npm install --no-save @microbit-foundation/ml-trainer-microbit@${{ env.ML_THEME_VERSION }} @microbit-foundation/website-deploy-aws@0.6 @microbit-foundation/website-deploy-aws-config@0.10
if: github.repository_owner == 'microbit-foundation'
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- run: node ./bin/print-ci-env.cjs >> $GITHUB_ENV

- run: node ./bin/print-web-ci-env.cjs >> $GITHUB_ENV
- run: npm run ci
- name: Run Playwright tests
if: env.STAGE == 'REVIEW' || env.STAGE == 'STAGING' || env.STAGE == 'BETA'
Expand Down
90 changes: 90 additions & 0 deletions .github/workflows/ios-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: iOS Build

on:
release:
types: [created]
push:
branches:
- "**"

concurrency:
group: ${{ github.workflow }}-${{ startsWith(github.ref, 'refs/tags/v') && 'release' || github.ref }}
cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/v') }}

jobs:
build-ios:
# Only run for apps releases, not web releases
if: ${{ github.event_name != 'release' || contains(github.event.release.tag_name, '-apps') }}
timeout-minutes: 25
runs-on: macos-26
permissions:
contents: read
packages: read
steps:
- uses: actions/checkout@v4

- uses: actions/setup-node@v4
with:
node-version: 20
cache: "npm"
registry-url: "https://npm.pkg.github.com"

- uses: microbit-foundation/npm-package-versioner-action@v1

# Strip prerelease suffix - app stores require X.Y.Z format
- name: Set marketing version
run: echo "MARKETING_VERSION=$(jq -r .version package.json | sed 's/-.*//')" >> $GITHUB_ENV

- uses: ruby/setup-ruby@v1
with:
ruby-version: "3.3"
bundler-cache: true

- name: Setup SSH for Match
run: |
eval "$(ssh-agent -s)"
echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> $GITHUB_ENV
echo "SSH_AGENT_PID=$SSH_AGENT_PID" >> $GITHUB_ENV
ssh-add - <<< "$FASTLANE_MATCH_DEPLOY_KEY"
env:
FASTLANE_MATCH_DEPLOY_KEY: ${{ secrets.FASTLANE_MATCH_DEPLOY_KEY }}

- run: npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- run: echo "ML_THEME_VERSION=$(jq -r '.["theme-package-version"]' workflow-config.json)" >> $GITHUB_ENV

- run: npm install --no-save @microbit-foundation/ml-trainer-microbit@${{ env.ML_THEME_VERSION }}
if: github.repository_owner == 'microbit-foundation'
env:
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- run: node ./bin/print-apps-ci-env.cjs >> $GITHUB_ENV
- run: npm run build:apps

- run: npx cap sync ios

- run: pod install
working-directory: ios/App

- name: Build with Fastlane
run: bundle exec fastlane ios build
env:
MATCH_PASSWORD: ${{ secrets.FASTLANE_MATCH_PASSWORD }}
BUILD_NUMBER: ${{ github.run_number }}
MARKETING_VERSION: ${{ env.MARKETING_VERSION }}

- uses: actions/upload-artifact@v4
with:
name: ios-app-${{ github.sha }}
path: ios/App/build/output/*.ipa
retention-days: 30

- name: Upload to TestFlight
if: github.event_name == 'release'
run: bundle exec fastlane ios upload
env:
APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }}
APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }}
APP_STORE_CONNECT_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_KEY_CONTENT }}
14 changes: 12 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/dist/
/.idea/
.idea/
/node_modules/

.DS_Store
Expand All @@ -16,7 +16,17 @@

.env.*

/screenshots/
/src/.DS_Store
/playwright-report/
/test-results/
/ml4f-output/
/ml4f-output/
/android/app/src/main/assets/public
/ios/App/App/public

# Fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
Gemfile.lock
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
src/translations.ts
src/messages/
src/images/
36 changes: 36 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# AI agent notes

## Formatting/style

Run `npm run format` to format code with Prettier.

New files should have a copyright header with the current year which is 2026. Use an existing file as a template but update the year.

When documenting properties/fields use the following style of comment:

```typescript
/**
* Example comment text.
*/
```

## Internationalization (i18n)

To add or amend UI strings:

1. Edit `lang/ui.en.json`
2. Run `find lang -type f -not -name ui.en.json | while read n; do git checkout beta -- $n; done && npm run i18n:compile` to update `src/messages/` via formatjs and ensure that outdated text of new message is not preserved in translation bundles as we iterate on the text.

## Vitest

To run a subset of unit tests, pass a file pattern directly (not `--testPathPattern`):

```bash
npm test -- download-machine-browser-default
```

## Playwright

If you run the e2e tests, be sure to run them headlessly via `npm run test:e2e:headless`.

When updating `@playwright/test` in package.json, also update the Docker image version in `.github/workflows/build.yml` to match.
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
@AGENTS.md
3 changes: 3 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
source "https://rubygems.org"

gem "fastlane"
52 changes: 52 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,58 @@ See the section about [running tests](https://facebook.github.io/create-react-ap
Builds the app for production to the `dist` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.

## iOS/Android development

### Local development

To get a proper dev server for iOS/Android development run:

```bash
npm run cap:sync:dev
```

Then run

```bash
npm run dev:apps
```

Use e.g. `npx cap open ios` to open the IDE and run from there.

The vite dev server run by dev:apps will be running inside the app.

### Signed builds

CI builds signed artifacts using [Fastlane](https://fastlane.tools/). iOS certificates and provisioning profiles are managed via [Fastlane Match](https://docs.fastlane.tools/actions/match/) with encrypted credentials stored in a private repository. Android signing uses a keystore stored in CI secrets.

To run Fastlane locally:

```bash
bundle install
bundle exec fastlane ios build # Build signed IPA (macOS only)
bundle exec fastlane android build # Build signed APK/AAB
```

Or you can use Homebrew via `brew install fastlane` and drop the `bundle exec` (this can sidestep Ruby version issues).

Android builds require the signing keystore and passwords via environment variables. iOS builds require Match credentials to fetch certificates.

### App versioning

App releases use tags with an `-apps` suffix to distinguish them from web releases on main until we merge the apps work back. The marketing version is derived from the tag with the suffix stripped (store limitation).

When creating an apps tag we target next unreleased minor version, so if main is on v1.2.3:

| Stage | Example tag | Marketing version | Build number |
| -------- | ------------------------ | ----------------- | ------------- |
| Internal | `v1.3.0-apps.internal.1` | 1.3.0 | CI run number |
| Beta | `v1.3.0-apps.beta.1` | 1.3.0 | CI run number |
| Public | `v1.3.0-apps` | 1.3.0 | CI run number |

If main releases a new minor version (e.g., 1.3.0) before apps ships, then we'll bump the next apps version (assuming we've merged main into apps).

If we've merged apps back into main before we get to a public release we can drop the apps suffix.

## Deployments

Most users should use the supported Foundation deployment at https://createai.microbit.org/
Expand Down
Loading
Loading