diff --git a/apps/chat/apps/mobile/package.json b/apps/chat/apps/mobile/package.json index 057786a7f..5d2f0cfcb 100644 --- a/apps/chat/apps/mobile/package.json +++ b/apps/chat/apps/mobile/package.json @@ -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", diff --git a/apps/context/apps/mobile/package.json b/apps/context/apps/mobile/package.json index 261578753..e7707d233 100644 --- a/apps/context/apps/mobile/package.json +++ b/apps/context/apps/mobile/package.json @@ -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", diff --git a/apps/manacore/apps/mobile/package.json b/apps/manacore/apps/mobile/package.json index 14913d4fe..0c456fe14 100644 --- a/apps/manacore/apps/mobile/package.json +++ b/apps/manacore/apps/mobile/package.json @@ -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", diff --git a/apps/manadeck/apps/mobile/package.json b/apps/manadeck/apps/mobile/package.json index 69ca12bda..4533ada7d 100644 --- a/apps/manadeck/apps/mobile/package.json +++ b/apps/manadeck/apps/mobile/package.json @@ -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", diff --git a/apps/picture/apps/mobile/package.json b/apps/picture/apps/mobile/package.json index 200a4d2c1..63c35c373 100644 --- a/apps/picture/apps/mobile/package.json +++ b/apps/picture/apps/mobile/package.json @@ -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", diff --git a/apps/traces/apps/mobile/package.json b/apps/traces/apps/mobile/package.json index cf77bfafd..c4c587dff 100644 --- a/apps/traces/apps/mobile/package.json +++ b/apps/traces/apps/mobile/package.json @@ -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", diff --git a/docs/EXPO_SDK_UPGRADE.md b/docs/EXPO_SDK_UPGRADE.md new file mode 100644 index 000000000..2e21d28ab --- /dev/null +++ b/docs/EXPO_SDK_UPGRADE.md @@ -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)