chore(mobile): align all 7 Expo apps to SDK 55

Upgraded 6 apps from SDK 52/54 to SDK 55 (matrix was already on 55).
All apps now consistently use:
- Expo SDK ~55.0.5
- React Native 0.83.2
- React 19.2.0
- expo-router ~55.0.5
- NativeWind ~4.2.3

Before: 3 different SDK versions (52, 54, 55)
After:  1 version (55) across all 7 mobile apps

Added docs/EXPO_SDK_UPGRADE.md with testing checklist.

Note: pnpm install + device testing required to validate the upgrades.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-28 18:10:14 +01:00
parent 456f99b89e
commit 27b70e8197
7 changed files with 195 additions and 110 deletions

View file

@ -22,30 +22,30 @@
"@react-navigation/bottom-tabs": "^7.0.5",
"@react-navigation/drawer": "^7.0.0",
"@react-navigation/native": "^7.0.3",
"expo": "^52.0.39",
"expo-constants": "~17.0.8",
"expo-dev-client": "~5.0.4",
"expo-dev-launcher": "^5.0.17",
"expo-linking": "~7.0.5",
"expo-router": "~4.0.6",
"expo-status-bar": "~2.0.1",
"expo-system-ui": "~4.0.8",
"expo-web-browser": "~14.0.2",
"nativewind": "latest",
"expo": "~55.0.5",
"expo-constants": "~55.0.7",
"expo-dev-client": "^6.0.13",
"expo-dev-launcher": "^6.0.13",
"expo-linking": "~55.0.7",
"expo-router": "~55.0.5",
"expo-status-bar": "~55.0.4",
"expo-system-ui": "~55.0.9",
"expo-web-browser": "~55.0.9",
"nativewind": "~4.2.3",
"node-fetch": "^2.7.0",
"react": "18.3.1",
"react-dom": "18.3.1",
"react-native": "0.76.7",
"react-native-gesture-handler": "~2.20.2",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-native": "0.83.2",
"react-native-gesture-handler": "~2.28.0",
"react-native-markdown-display": "^7.0.2",
"react-native-reanimated": "3.16.2",
"react-native-safe-area-context": "4.12.0",
"react-native-screens": "~4.4.0",
"react-native-web": "~0.19.10"
"react-native-reanimated": "~4.1.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-web": "~0.21.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "~18.3.12",
"@types/react": "~19.1.0",
"@typescript-eslint/eslint-plugin": "^7.7.0",
"@typescript-eslint/parser": "^7.7.0",
"dotenv": "^16.4.7",

View file

@ -23,38 +23,38 @@
"@react-native-async-storage/async-storage": "^1.23.1",
"@react-native-picker/picker": "^2.11.0",
"@react-navigation/native": "^7.0.3",
"expo": "^52.0.46",
"expo-constants": "~17.0.8",
"expo-dev-client": "~5.0.4",
"expo-dev-launcher": "^5.0.17",
"expo": "~55.0.5",
"expo-constants": "~55.0.7",
"expo-dev-client": "^6.0.13",
"expo-dev-launcher": "^6.0.13",
"expo-font": "^14.0.10",
"expo-linking": "~7.0.5",
"expo-linking": "~55.0.7",
"expo-localization": "^16.1.6",
"expo-router": "~4.0.6",
"expo-status-bar": "~2.0.1",
"expo-system-ui": "~4.0.9",
"expo-secure-store": "~14.0.1",
"expo-web-browser": "~14.0.2",
"expo-router": "~55.0.5",
"expo-status-bar": "~55.0.4",
"expo-system-ui": "~55.0.9",
"expo-secure-store": "~55.0.8",
"expo-web-browser": "~55.0.9",
"i18next": "^25.3.2",
"nativewind": "latest",
"react": "18.3.1",
"react-dom": "18.3.1",
"nativewind": "~4.2.3",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-i18next": "^15.6.0",
"react-native": "0.76.9",
"react-native-gesture-handler": "~2.20.2",
"react-native": "0.83.2",
"react-native-gesture-handler": "~2.28.0",
"react-native-markdown-display": "^7.0.2",
"react-native-pager-view": "^6.7.0",
"react-native-purchases": "^8.9.5",
"react-native-reanimated": "3.16.2",
"react-native-safe-area-context": "4.12.0",
"react-native-screens": "~4.4.0",
"react-native-reanimated": "~4.1.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-tab-view": "^4.0.10",
"react-native-web": "~0.19.10"
"react-native-web": "~0.21.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/node": "^24.10.1",
"@types/react": "~18.3.12",
"@types/react": "~19.1.0",
"@typescript-eslint/eslint-plugin": "^7.7.0",
"@typescript-eslint/parser": "^7.7.0",
"eslint": "^8.57.0",

View file

@ -22,29 +22,29 @@
"@react-navigation/drawer": "^7.0.0",
"@react-navigation/native": "^7.0.3",
"@manacore/shared-auth": "workspace:*",
"expo": "^54.0.25",
"expo-secure-store": "^15.0.7",
"expo-constants": "~18.0.10",
"expo-dev-client": "~6.0.18",
"expo-dev-launcher": "^5.0.17",
"expo-linking": "~8.0.9",
"expo-router": "~6.0.15",
"expo-status-bar": "~3.0.8",
"expo-system-ui": "~6.0.8",
"expo-web-browser": "~15.0.9",
"nativewind": "latest",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.5",
"expo": "~55.0.5",
"expo-secure-store": "~55.0.8",
"expo-constants": "~55.0.7",
"expo-dev-client": "^6.0.13",
"expo-dev-launcher": "^6.0.13",
"expo-linking": "~55.0.7",
"expo-router": "~55.0.5",
"expo-status-bar": "~55.0.4",
"expo-system-ui": "~55.0.9",
"expo-web-browser": "~55.0.9",
"nativewind": "~4.2.3",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-native": "0.83.2",
"react-native-gesture-handler": "~2.28.0",
"react-native-reanimated": "4.1.5",
"react-native-safe-area-context": "5.6.2",
"react-native-reanimated": "~4.1.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-web": "~0.21.2"
"react-native-web": "~0.21.0"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "^19.2.3",
"@types/react": "~19.1.0",
"@types/react-dom": "^19.2.3",
"@typescript-eslint/eslint-plugin": "^7.7.0",
"@typescript-eslint/parser": "^7.7.0",

View file

@ -26,41 +26,41 @@
"@react-navigation/native": "^7.0.3",
"base64-js": "^1.5.1",
"class-variance-authority": "^0.7.1",
"expo": "54.0.13",
"expo": "~55.0.5",
"expo-blur": "~15.0.7",
"expo-build-properties": "~1.0.9",
"expo-constants": "~18.0.9",
"expo-dev-client": "~6.0.13",
"expo-constants": "~55.0.7",
"expo-dev-client": "^6.0.13",
"expo-device": "~8.0.9",
"expo-file-system": "~19.0.15",
"expo-file-system": "~55.0.10",
"expo-font": "~14.0.9",
"expo-image-picker": "~17.0.8",
"expo-linking": "~8.0.8",
"expo-router": "~6.0.10",
"expo-secure-store": "^15.0.7",
"expo-status-bar": "~3.0.8",
"expo-image-picker": "~55.0.12",
"expo-linking": "~55.0.7",
"expo-router": "~55.0.5",
"expo-secure-store": "~55.0.8",
"expo-status-bar": "~55.0.4",
"expo-symbols": "~1.0.7",
"expo-system-ui": "~6.0.7",
"expo-system-ui": "~55.0.9",
"expo-updates": "~29.0.12",
"expo-web-browser": "~15.0.8",
"nativewind": "^4.2.1",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.4",
"expo-web-browser": "~55.0.9",
"nativewind": "~4.2.3",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-native": "0.83.2",
"react-native-calendars": "^1.1313.0",
"react-native-draggable-flatlist": "^4.0.3",
"react-native-gesture-handler": "~2.28.0",
"react-native-reanimated": "~4.1.1",
"react-native-reanimated": "~4.1.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-svg": "15.12.1",
"react-native-web": "^0.21.0",
"react-native-web": "~0.21.0",
"react-native-worklets": "0.5.1",
"zustand": "^5.0.8"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "^19.2.3",
"@types/react": "~19.1.0",
"@types/react-dom": "^19.2.3",
"ajv": "^8.12.0",
"eslint": "^9.25.1",

View file

@ -26,35 +26,35 @@
"@react-native-async-storage/async-storage": "2.2.0",
"@react-navigation/native": "^7.0.3",
"blurhash": "^2.0.5",
"expo": "54.0.12",
"expo": "~55.0.5",
"expo-blur": "~15.0.7",
"expo-clipboard": "~8.0.7",
"expo-constants": "~18.0.9",
"expo-file-system": "~19.0.16",
"expo-haptics": "~15.0.7",
"expo-image": "~3.0.9",
"expo-constants": "~55.0.7",
"expo-file-system": "~55.0.10",
"expo-haptics": "~55.0.8",
"expo-image": "~55.0.6",
"expo-linear-gradient": "~15.0.7",
"expo-linking": "~8.0.8",
"expo-location": "~19.0.7",
"expo-media-library": "~18.2.0",
"expo-router": "~6.0.10",
"expo-secure-store": "~15.0.7",
"expo-linking": "~55.0.7",
"expo-location": "~55.0.6",
"expo-media-library": "~55.0.9",
"expo-router": "~55.0.5",
"expo-secure-store": "~55.0.8",
"expo-sharing": "~14.0.7",
"expo-status-bar": "~3.0.8",
"expo-status-bar": "~55.0.4",
"expo-symbols": "^1.0.7",
"expo-system-ui": "~6.0.7",
"expo-web-browser": "~15.0.8",
"nativewind": "^4.2.1",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.4",
"expo-system-ui": "~55.0.9",
"expo-web-browser": "~55.0.9",
"nativewind": "~4.2.3",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-native": "0.83.2",
"react-native-context-menu-view": "^1.20.0",
"react-native-gesture-handler": "~2.28.0",
"react-native-pager-view": "6.9.1",
"react-native-reanimated": "~4.1.1",
"react-native-reanimated": "~4.1.5",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",
"react-native-web": "^0.21.0",
"react-native-web": "~0.21.0",
"react-native-worklets": "^0.6.0",
"react-native-zoom-toolkit": "^5.0.1",
"zustand": "^4.5.1"
@ -63,7 +63,7 @@
"@babel/core": "^7.20.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/plugin-syntax-import-meta": "^7.10.4",
"@types/react": "~19.2.0",
"@types/react": "~19.1.0",
"ajv": "^8.12.0",
"babel-plugin-module-resolver": "^5.0.2",
"babel-plugin-transform-remove-console": "^6.9.4",

View file

@ -21,25 +21,25 @@
"@react-native-async-storage/async-storage": "2.2.0",
"@react-native-community/slider": "5.0.1",
"@react-navigation/native": "^7.0.3",
"expo": "~54.0.0",
"expo-background-fetch": "~14.0.7",
"expo-background-task": "~1.0.8",
"expo-constants": "~18.0.0",
"expo": "~55.0.5",
"expo-background-fetch": "~55.0.4",
"expo-background-task": "~55.0.4",
"expo-constants": "~55.0.7",
"expo-dev-client": "^6.0.13",
"expo-dev-launcher": "^6.0.13",
"expo-location": "~19.0.0",
"expo-media-library": "~18.2.0",
"expo-router": "~6.0.0",
"expo-status-bar": "~3.0.0",
"expo-system-ui": "~6.0.7",
"expo-task-manager": "~14.0.0",
"nativewind": "latest",
"react": "19.1.0",
"react-dom": "19.1.0",
"react-native": "0.81.4",
"expo-location": "~55.0.6",
"expo-media-library": "~55.0.9",
"expo-router": "~55.0.5",
"expo-status-bar": "~55.0.4",
"expo-system-ui": "~55.0.9",
"expo-task-manager": "~55.0.4",
"nativewind": "~4.2.3",
"react": "19.2.0",
"react-dom": "19.2.0",
"react-native": "0.83.2",
"react-native-gesture-handler": "~2.28.0",
"react-native-maps": "1.20.1",
"react-native-reanimated": "~4.1.1",
"react-native-reanimated": "~4.1.5",
"react-native-worklets": "~0.6.1",
"react-native-safe-area-context": "~5.6.0",
"react-native-screens": "~4.16.0",

85
docs/EXPO_SDK_UPGRADE.md Normal file
View file

@ -0,0 +1,85 @@
# Expo SDK Upgrade Guide
**Current State (2026-03-28):**
| App | Expo SDK | React Native | Router | Status |
|-----|----------|-------------|--------|--------|
| matrix | **55** | 0.83.2 | ~55.0.5 | Target version |
| manacore | 54 | 0.81.5 | ~6.0.15 | Needs upgrade |
| manadeck | 54 | 0.81.4 | ~6.0.10 | Needs upgrade |
| picture | 54 | 0.81.4 | ~6.0.10 | Needs upgrade |
| traces | 54 | 0.81.4 | ~6.0.0 | Needs upgrade |
| chat | **52** | 0.76.7 | ~4.0.6 | Needs upgrade (2 majors!) |
| context | **52** | 0.76.9 | ~4.0.6 | Needs upgrade (2 majors!) |
**Target:** All apps on Expo SDK 55
## Breaking Changes SDK 52 → 55
### expo-router
- v4 (SDK 52) → v55 (SDK 55): Major API change
- Router is now versioned with the SDK (no more separate major versions)
- `expo-router/entry` still works as main entry point
### React
- React 18.3 → React 19.2
- New `use()` hook, improved Suspense
### React Native
- 0.76 → 0.83: New Architecture enabled by default
- Fabric renderer is default
- Bridgeless mode
### NativeWind
- v3/v4 → v4.2.3: Should be compatible if already on v4
## Upgrade Steps (Per App)
```bash
# 1. Use Expo upgrade tool
cd apps/{app}/apps/mobile
npx expo install expo@~55.0.5 --fix
# 2. This auto-upgrades compatible dependencies
# For manual deps, use:
npx expo install react-native@0.83.2 react@19.2.0 expo-router@~55.0.5
# 3. Update NativeWind
npx expo install nativewind@~4.2.3
# 4. Fix breaking changes
# - Check for deprecated APIs
# - Test navigation (expo-router changes)
# - Test NativeWind styles
# 5. Clear caches and test
npx expo start -c
```
## Recommended Upgrade Order
1. **traces** (simplest app, minimal deps)
2. **manadeck** (medium complexity)
3. **picture** (has image handling)
4. **manacore** (hub app, important)
5. **context** (SDK 52 → 55, bigger jump)
6. **chat** (SDK 52 → 55, most complex mobile app)
## Shared Dependencies to Update
All mobile apps share these workspace packages:
- `@manacore/shared-ui` (React Native components)
- `@manacore/shared-theme` (theme system)
- `@manacore/shared-auth` (auth service)
These should be tested with React 19 / RN 0.83 before upgrading apps.
## Testing Checklist (Per App)
- [ ] App starts without errors (`npx expo start`)
- [ ] Navigation works (all routes)
- [ ] Auth flow (login, logout, token refresh)
- [ ] NativeWind styles render correctly
- [ ] App-specific features work
- [ ] iOS simulator test
- [ ] Android emulator test (if applicable)