Android-first Expo / React Native app for splitting a receipt between people or groups after OCR recognition.
The project is a native companion to billsplitter-mobile: it keeps the same receipt parsing core, but adds camera capture, photo import, mobile editing flows, and device-friendly export/import.
- scans or imports a receipt photo on device
- sends the image to Yandex OCR
- parses the recognized text into receipt items, discounts, and total
- assigns line items to color groups with live totals and unassigned remainder
- supports manual correction of item cards and total card
- exports and re-imports split state as JSON
- includes dev-client and e2e-oriented debug flows for repeatable OCR testing
- Expo SDK 54 + React Native 0.81 app with custom dev client support
- mobile split studio UI with editable receipt cards
- Yandex OCR integration through
EXPO_PUBLIC_YANDEX_OCR_*env variables - receipt parser shared from the web project and adapted for the native workflow
- optional e2e sample-photo flow for OCR -> parser -> edit testing without system dialogs
- JSON share/import flow for moving receipt state between app installs or devices
- cloud Android builds through EAS for
development,preview, andproduction
- Expo
- React Native
- TypeScript
- Vitest
expo-cameraexpo-image-pickerexpo-document-pickerexpo-sharing
npm install— install dependenciesnpm run test— run Vitest testsnpm run dev-client— start Expo dev client server on port8084npm run dev-client:android— open the Android dev client with the expected deep linknpm run e2e:metro— start dedicated e2e Metro with debug tools enabled on port8088npm run e2e:android— run Android e2e flow with the dedicated Metro portnpm run android— run the Android app locallynpm run apk— create a cloud APK build via EASnpm run apk:local— create a local APK build via EAS local buildnpm run aab— create a production Android App Bundlenpm run prebuild— regenerate native Expo projects
- Install dependencies with
npm install. - Create
.env.localwithEXPO_PUBLIC_YANDEX_OCR_FOLDER_IDandEXPO_PUBLIC_YANDEX_OCR_API_KEY. - Restart Metro or Expo after any env change.
- For the most stable local Android flow, start
npm run dev-clientand then runnpm run dev-client:android. - If native projects need regeneration, run
npm run prebuildbefore native rebuilds.
- Automation hooks for camera, OCR result blocks, and receipt cards are available in the app.
- Internal e2e debug controls are enabled only when
EXPO_PUBLIC_E2E_DEBUG_TOOLS=1is set. - That flag exposes
Debug autofillandE2E sample photo, which makes it possible to test the full OCR -> parser -> edit flow without system dialogs. - To run the dedicated Android e2e path without Metro port conflicts, use
npm run e2e:android. - To keep only the dedicated Metro server running, use
npm run e2e:metro. - You can override the e2e port with
E2E_DEV_SERVER_PORT, for exampleE2E_DEV_SERVER_PORT=8090 npm run e2e:android.
Поделиться JSONcreates a real.jsonfile and opens the system share sheet.Загрузить из файлаreads a JSON file through the native file picker and restores the split studio state.- The exported payload currently includes
schemaVersion,exportedAt,language,merchantName,detectedTotal,ignoredLineCount,customTotalCardTitle,ocrText,receiptItems, andocrRecognitionResult. - The format is currently versioned as
schemaVersion: 1.
previewineas.jsonproduces an installable.apkwith arm64-only ABI to keep cloud builds smaller.productionproduces an.aabfor store publishing.developmentproduces the dev client build.- The
previewAPK is intended for real Android devices, not x86/x86_64 emulators.
- This repository lives next to
billsplitter-mobileand reuses the same receipt parsing domain. - OCR currently runs directly from the client app. For wider distribution, it would be safer to move the OCR call behind a backend proxy instead of shipping client-visible
EXPO_PUBLIC_*credentials.