updateWidgetNote scanned every key in the appPreview preferences and rewrote any whose value contained the note id. That included the remindersList key, so a match replaced the entire reminders list with a note and then threw NumberFormatException parsing "remindersList" as a widget id. hasWidgetNote had the same unguarded scan. Match on the parsed note's id instead of on the raw JSON containing it, and treat only keys that parse as an int as widget entries, so non-widget keys are excluded structurally rather than by name. Also guards the casts and gson parses that could throw on a malformed entry.
Notesnook Mobile
The mobile app is built with React Native for both iOS and Android.
Build instructions | Developer guide | E2E tests
Build instructions
Before you start, it is recommended that you read the contributing guidelines.
Setting up the development environment
Requirements:
- Node.js 20+ (the repo is pinned to Node
22.20.0via Volta) - git
npm- React Native environment setup
To run the app locally, first complete React Native native tooling setup:
- Open React Native environment setup
- Select
React Native CLI Quickstart - Select your OS and target platform(s): iOS and/or Android
- Follow the steps listed.
Expo is not used in this project.
Clone the monorepo:
git clone https://github.com/streetwriters/notesnook.git
# change directory
cd notesnook
Install dependencies and bootstrap the mobile workspace:
# this might take a while to complete
npm install
npm run bootstrap -- --scope=mobile
Running the app on Android
Set up an Android emulator from Android Studio (or connect a physical device), then run:
npm run start:android
If you are using a physical device, enable USB debugging.
Running the app on iOS
Install CocoaPods dependencies first, then run the iOS app:
# this might take a while to complete
npm run prepare:ios
npm run start:ios
Useful development commands
# start Metro only
npm run start:metro
# start Re.Pack bundler
npm run start:repack
Developer guide
The mobile app is a mixed TypeScript/JavaScript codebase.
The tech stack
We try to keep the stack as lean as possible:
- React Native
0.82 - React
19 - TypeScript + JavaScript
- Zustand (state management)
- Detox (end-to-end testing)
- libsodium (encryption)
Project structure
Top-level directories in apps/mobile/:
app/: Main React Native app source (components,common,hooks,navigation,screens,services,stores,utils, etc.)android/: Android native projectios/: iOS native projecte2e/: Detox test suite and configpatches/:patch-packagepatchesscripts/: Mobile-specific scripts
Running E2E tests (Detox)
Detox device defaults in this repo:
- Android emulator:
Pixel_5_API_36 - iOS simulator:
iPhone 17 Pro Max
Android
Build and run Android Detox tests:
npm run build:android
npm run test:android
For debug configuration:
npm run build:android:debug
npm run start:metro
npm run test:android:debug
iOS
Build and run iOS Detox tests:
npm run build:ios
npm run test:ios
If simulator tooling is missing, install AppleSimulatorUtils:
brew tap wix/brew
brew install applesimutils
Release commands
Android release helpers:
npm run release:android
npm run release:android:bundle
