Skip to content

feat: v10 – Bun, Expo SDK 57, React Compiler, Nitro Fetch and Argent - #543

Open
hamzamekk wants to merge 15 commits into
masterfrom
chore/template-upgrade
Open

hamzamekk wants to merge 15 commits into
masterfrom
chore/template-upgrade

Conversation

@hamzamekk

@hamzamekk hamzamekk commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Upgrades the starter to v10: Bun replaces pnpm, Expo goes from SDK 54 to SDK 57 (React Native 0.86, React 19.2), and the template gains React Compiler, Nitro Fetch and an opt-in Argent setup for AI assistants. It also fixes broken CI workflows and outdated documentation.

Closes #536, closes #440, closes #449. Supersedes #540, which is included here.

Each step is a separate commit, so the PR can be reviewed commit by commit.

Breaking changes for existing projects

  • Bun is required. The install guard rejects pnpm. Node 24 is pinned in .nvmrc.
  • Expo SDK 57. Navigation APIs are imported from expo-router/react-navigation instead of @react-navigation/*, the legacy architecture is gone, and iOS builds need Xcode 26.4 or newer.
  • Removed packages: react-native-edge-to-edge (built into Expo), react-native-restart (replaced by Expo's reloadAppAsync) and several unused dependencies.
  • TypeScript 6: baseUrl is replaced by explicit paths and an @env alias.

The new Migrating to v10 guide walks existing projects through every step.

What's new

  • React Compiler is enabled, so manual useMemo and useCallback are rarely needed. Guide
  • Nitro Fetch: in release builds, axios runs on a native HTTP stack (URLSession on iOS, Cronet on Android). Dev builds keep XHR, so network inspectors still work. The guide also covers prefetching before navigation and on app start.
  • Argent (opt-in): bun run argent:setup lets AI assistants build, drive and debug the app on simulators and emulators.
  • Dependencies: Nitro Modules 0.37, MMKV 4.3, i18next 26, Tailwind 4.3.3 (matching Uniwind's bundled engine), plus newer lint-staged, commitlint and np.

Fixes

  • CI: the E2E workflows targeted a removed staging environment and failed env validation. Retired GitHub Actions (artifact v3 and others) are bumped. The release workflow now falls back to the default token when GH_TOKEN is not set.
  • App: flash messages no longer render under the status bar.
  • Tooling: the post-merge hook checked a lockfile name that never existed.
  • Docs: the website covers Bun, SDK 57, React Compiler and Nitro Fetch. It also fixes older errors: a tailwind.config.js that no longer exists, React Hook Form and Prettier claims, and wrong Uniwind links.

Verification

Check Result
Type-check, lint, translations lint Pass
Jest 40 of 40 tests pass
Expo Doctor 21 of 21 checks pass
iOS 27 simulator, Xcode 27 Debug and release builds run; onboarding, login and feed work
Android API 37 emulator Debug and release builds run; feed loads over Cronet in release
Docs website Builds all pages

CI and EAS cloud builds run on Bun for the first time with this PR, so please watch the first runs.

After merging

  1. Run the New App Version workflow with major to release v10.0.0. Setting the GH_TOKEN secret makes the tag trigger the GitHub release.
  2. Publish create-obytes-app 2.0.0 only after v10.0.0 exists. The CLI clones the latest release tag and now installs with Bun.
  3. Related open PRs: fix: lowercase URL schemes so EAS Update can publish #538 (lowercase URL schemes) and fix: stop tracking .env and ship .env.example instead #539 (stop tracking .env) are worth merging. If fix: stop tracking .env and ship .env.example instead #539 lands, the APK build step in CI needs .env.example copied to .env.

@netlify

netlify Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for obytes-starter ready!

Name Link
🔨 Latest commit 43783db
🔍 Latest deploy log https://app.netlify.com/projects/obytes-starter/deploys/6ac7dc9b7eba4000075ef1c5
😎 Deploy Preview https://deploy-preview-543--obytes-starter.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

💯 Test Coverage

Lines Statements Branches Functions
Coverage: 31%
30.78% (129/419) 35.04% (82/234) 27.36% (52/190)

😎 Tests Results

Tests Skipped Failures Errors Time
40 0 💤 0 ❌ 0 🔥 13.767s ⏱️
👀 Tests Details • (31%)
File% Stmts% Branch% Funcs% LinesUncovered Line #s
All files30.7835.0427.3631.42 
src/app0000 
   _layout.tsx000024–92
src/components/ui65.1852.3162.964.74 
   focus-aware-status-bar.tsx00009–15
   modal-keyboard-aware-scroll-view.tsx0100100028–35
   select.tsx92.353.8483.3392174, 221
   use-theme-config.tsx00007–34
src/features/settings0000 
   settings-screen.tsx000020–24
src/lib35033.3341.17 
   test-utils.tsx100100100100 
src/lib/api0000 
   client.tsx00100012–25
   utils.tsx000016–54
src/lib/i18n3613.3316.6633.33 
   utils.tsx20016.6615.7822–56

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

✅ Good news! We ran Expo Doctor for this PR and everything looks good, Great job!

@hamzamekk
hamzamekk requested a review from yjose October 8, 2026 17:57
@hamzamekk hamzamekk changed the title chore: upgrade template (Bun, Expo SDK 57, Argent, cleanup) feat: v10 – Bun, Expo SDK 57, React Compiler, Nitro Fetch and Argent Oct 8, 2026
@hamzamekk
hamzamekk marked this pull request as ready for review October 8, 2026 18:02
- switch packageManager to bun@1.3.14 and convert pnpm-lock.yaml to
  bun.lock with identical resolved versions
- replace .npmrc with bunfig.toml (hoisted linker) and pin Node 24 in .nvmrc
- update scripts, husky hooks and lint-staged to use bun
- fix post-merge hook that checked a non-existent pnpm-lock.yml
- replace the CI setup action with setup-node-bun-install (setup-bun,
  bun cache, node from .nvmrc) and update all workflows
- update project docs with bun commands
- convert docs and cli lockfiles to bun.lock
- create-obytes-app now installs dependencies with bun, since the
  template's preinstall guard only allows bun
- update all documentation commands from pnpm to bun
- upload/download-artifact v3 were shut down by GitHub: bump to v4
- bump cache, setup-java, stale and create-pull-request, and replace the
  deprecated gradle-build-action with gradle/actions/setup-gradle
- e2e and EAS workflows targeted a removed "staging" environment and
  com.obytes.staging app id: use preview
- stop disabling .env in the APK build step, which made strict env
  validation fail during prebuild
- remove unused deps: react-native-url-polyfill, expo-crypto,
  @tanstack/zod-form-adapter, dotenv, react-error-boundary,
  @types/i18n-js, @types/invariant
- remove nativewind-env.d.ts left over from the Uniwind migration
- remove babel @env alias pointing at a file that no longer exists
- ignore the uniwind-generated types file in eslint
- upgrade expo and all expo-managed packages to SDK 57 and let expo
  manage react-native-worklets again
- migrate @react-navigation imports to expo-router/react-navigation
  (SDK 56 split)
- replace deprecated react-native-edge-to-edge with expo-status-bar;
  edge-to-edge is built in since SDK 55
- remove newArchEnabled (legacy architecture removed in SDK 55)
- enable iOS scene support via expo-build-properties, required to build
  with the iOS 27 SDK (Xcode 27)
- drop the manual reanimated babel plugin; babel-preset-expo adds the
  worklets plugin
- offset flash messages by the safe-area inset so they no longer render
  under the status bar
- regenerate bun.lock: the pnpm-migrated lock pinned peers to React 19.1
  and nested a second React copy, crashing the app at runtime

TypeScript 6 and tooling:
- replace deprecated baseUrl with explicit paths and an @env alias
- declare jest/node types and *.css modules
- add react-test-renderer 19.2.3 for Testing Library
- remove eslint-plugin-react-compiler (rules ship in react-hooks v7) and
  override zod-validation-error to v4 so react-hooks loads
- scope custom eslint rules to JS/TS files and fix new lint findings
- add `bun run argent:setup`, which runs the official Argent installer
  (MCP server, skills and rules for the current workspace)
- document setup, team-wide local mode and telemetry opt-out in a new
  docs recipe page
- add Argent guidance to CLAUDE.md and the project README
- gitignore Argent secrets, recordings, temp files and logs while keeping
  flows and project config committable

Argent is opt-in: it downloads platform-specific native binaries that are
licensed by Software Mansion and must not be vendored into the repo.
Uniwind rewrites this file whenever Metro runs. Keeping the generated
format avoids a permanent diff. The file is excluded from eslint.
- bump react-native-nitro-modules to 0.37 (required by nitro-fetch) and
  react-native-mmkv to 4.3, which runs on nitro
- bump i18next to 26 and react-i18next to 17; none of the removed
  options are used
- bump tailwindcss to 4.3.3 to match the engine bundled in uniwind
- bump lint-staged 17, commitlint 21, np 12 and jest-junit 17
- remove unused @tailwindcss/cli
- replace react-native-restart and DevSettings.reload with expo's
  built-in reloadAppAsync, which works in debug and release builds
- enable experiments.reactCompiler and add babel-plugin-react-compiler
- document in CLAUDE.md that manual memoization is not needed
- add react-native-nitro-fetch and route axios through it with the fetch
  adapter (native URLSession on iOS, Cronet on Android)
- keep XHR in dev builds so network inspectors keep working, and the
  browser stack on web
- mock nitro-fetch in jest and document the behavior in CLAUDE.md

Verified in release builds on an iOS 27 simulator and an Android API 37
emulator: the feed loads over the native stack (Cronet loaded on Android).
- add Nitro Fetch to the data fetching guide and a React Compiler section
  to the rules page
- note expo-router/react-navigation imports on the navigation page
- require Node 24 in the setup guide
- update features on the home page, overview and README
- fix outdated content: tailwind.config.js and ui/theme paths on the
  theming page, React Hook Form and Prettier on the home page, wrong
  Uniwind repository links and a Maestro typo
The fallback step exported GH_TOKEN as an env variable, but checkout
read secrets.GH_TOKEN, so the fallback was never used. Checkout now uses
the GH_TOKEN secret when set and the default token otherwise. The docs
explain why a personal access token is still recommended.

Closes #449
- exclude react-native-nitro-fetch from the React Native Directory check;
  its metadata says untested on the New Architecture, but nitro modules
  only run on it (verified on iOS and Android)
- add docs/netlify.toml so Netlify builds the docs with Bun now that the
  docs site uses bun.lock instead of pnpm-lock.yaml
- new website guide with step-by-step upgrade instructions from v9:
  Bun, Expo SDK 57, navigation imports, config, TypeScript 6, restart,
  optional features and troubleshooting
- bump create-obytes-app to 2.0.0, since it now requires Bun
@hamzamekk
hamzamekk force-pushed the chore/template-upgrade branch from 375966d to 954fdca Compare October 8, 2026 18:04
@hamzamekk
hamzamekk requested review from SihamBen and kelmag October 8, 2026 18:04
- new guide on native networking with Nitro Fetch: how the client uses
  it, testing release builds, direct use, prefetching before navigation
  and on app start (with the Android config plugin), Jest and removal
- new React Compiler guide: setup, writing components without manual
  memoization, Rules of React, linting, DevTools check and opting out
- shorten the data fetching and rules sections to link to the guides
- mark the v10 pages as new in the sidebar and drop stale badges

@0x1337ak 0x1337ak left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

description: 'APP_ENV (one of): development, preview, production'
required: true
default: staging
default: preview

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why changing the staging to preview ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Upgrade the template to Expo SDK 56 Wrong read for GH_TOKEN Use bun instead of pnpm

2 participants