Kryze is a voice-first expense and settlement assistant for groups. It helps people capture expenses from SMS, receipts, voice notes, and manual entry, then organize those costs into shared groups, track who owes what, and nudge people to settle up.
The codebase is split into two main apps:
backend: an Express + TypeScript API with Prisma, PostgreSQL, Twilio, OpenAI, Cloudinary, Google sign-in, and ElevenLabs call reminders.mobile: an Expo + React Native app for the end user experience on iOS, Android, and web.
This repo is called splitx in a few package files, but the product experience and docs here use the Kryze name.
Kryze is designed around a simple idea: spending and settlement should feel conversational instead of manual.
It can:
- Turn expense-related SMS messages into drafts.
- Parse receipts with OCR and structured AI extraction.
- Record voice notes and convert them into expense drafts.
- Organize people into groups and split expenses.
- Track coin-based rewards and premium access.
- Link WhatsApp for bot-driven workflows.
- Send opt-in reminder calls using ElevenLabs Agents + Twilio.
- SMS inbox parsing for expense notifications.
- Receipt upload and OCR extraction.
- Voice-based expense entry.
- Draft review and editing before committing an expense.
- Create groups.
- Add and remove members.
- Create expenses inside a group.
- Split expenses among members.
- Verify or update expenses.
- Manage member UPI details for settlement flows.
- Coin balance and coin history.
- Redeem coins for premium access.
- Premium status checks.
- Settlement payment link generation.
- WhatsApp linking and webhook handling.
- Draft creation from chat workflows.
- Opt-in voice call reminders for users who want a more proactive nudge.
- Expo Router
- React Native
- TypeScript
- Zustand
- Expo Audio
- Expo Camera
- Expo Notifications
- Expo Secure Store
- Expo Image Picker
- Google Sign-In
- SMS reading via a patched native module
- Node.js
- Express
- TypeScript
- Prisma ORM
- PostgreSQL
- JWT authentication
- Multer file uploads
- Twilio
- Cloudinary
- OpenAI
- ElevenLabs
- Google auth libraries
- PostgreSQL for persistence
- Prisma migrations and schema management
- Cloudflare tunnel for local webhook exposure when needed
- Optional Docker Compose for local PostgreSQL
The system is split into a client app and an API layer:
- The mobile app captures user actions such as login, SMS import, receipt upload, voice recording, group management, and reminders.
- The backend authenticates users, validates requests, and writes data to PostgreSQL through Prisma.
- AI services process unstructured inputs:
- OpenAI helps with receipt parsing and structured extraction.
- ElevenLabs handles voice reminder conversations.
- Twilio handles outbound and webhook-based communication.
- Cloudinary stores uploaded receipt images.
For the reminder-call flow, Kryze keeps the user in control:
- A user opts in to reminder calls.
- The app stores a scheduled call reminder.
- A protected scheduler dispatches due reminders.
- The backend places the outbound call through Twilio.
- Twilio connects the call to the configured ElevenLabs agent.
- ElevenLabs delivers the reminder in a natural voice.
backend: API server, Prisma schema, controllers, routes, Docker Compose config, and deployment notes.mobile: Expo app, screens, UI components, hooks, and client-side API helpers.backend/prisma/schema.prisma: database schema.backend/.env.example: backend environment template.mobile/.env.example: mobile environment template.
- Node.js 20 or newer
pnpm- PostgreSQL
- A Twilio account for SMS and calls
- An OpenAI API key
- A Cloudinary account
- A Google OAuth client if you use Google sign-in
- An ElevenLabs API key and agent if you want reminder calls
Install dependencies in each app directory:
cd backend
pnpm installcd ../mobile
pnpm installThe backend uses PostgreSQL through Prisma.
You can run Postgres locally with Docker Compose from the backend directory:
cd backend
docker compose up -dThen point DATABASE_URL in backend/.env at the running database.
After the database is available, push the schema and generate the client:
pnpm prisma:push
pnpm prisma:generateIf you already have a database and migrations prepared, you can also use the normal Prisma migration workflow for your environment.
Copy the example file and fill in the real values:
The most important variables are:
DATABASE_URLJWT_SECRETGOOGLE_CLIENT_IDGOOGLE_IOS_CLIENT_IDTWILIO_ACCOUNT_SIDTWILIO_AUTH_TOKENTWILIO_PHONE_NUMBEROPENAI_API_KEYOPENAI_EXPENSE_MODELOPENAI_RECEIPT_MODELCLOUDINARY_CLOUD_NAMECLOUDINARY_API_KEYCLOUDINARY_API_SECRETELEVENLABS_API_KEYELEVENLABS_AGENT_IDENABLE_ELEVENLABS_OUTBOUND_CALLSCALL_REMINDER_CRON_SECRETENABLE_LOCAL_CALL_REMINDER_SCHEDULER
The reminder-call settings are opt-in and safe-by-default:
ENABLE_ELEVENLABS_OUTBOUND_CALLS=falsekeeps live calls disabled.ENABLE_LOCAL_CALL_REMINDER_SCHEDULER=trueis only for local development.- Production should call
POST /api/call-reminders/dispatchfrom an external protected scheduler.
Copy the mobile example file and set the API URL and any client-specific values:
The mobile client reads EXPO_PUBLIC_API_URL and falls back to http://localhost:3000 if it is not set. If you are running the backend locally, set that value to your reachable local URL or tunnel URL and restart Expo after changing it.
cd backend
pnpm devUseful backend scripts:
pnpm devstarts the API in watch mode.pnpm buildcompiles the TypeScript server.pnpm prisma:studioopens Prisma Studio.pnpm prisma:pushsyncs the schema to the database.
The API exposes:
GET /for a simple status responseGET /healthfor health checks
cd mobile
pnpm startUseful mobile scripts:
pnpm startstarts Expopnpm androidlaunches Androidpnpm ioslaunches iOSpnpm weblaunches the web buildpnpm lintruns Expo linting
The backend mounts the following route groups:
/api/auth/api/drafts/api/groups/api/ocr/api/coins/api/premium/api/whatsapp/api/voice/api/call-reminders
- Auth: signup, login, Google sign-in, phone verification, profile updates, user search.
- Drafts: create, list, and update expense drafts.
- Groups: create groups, manage members, add expenses, verify expenses, and create settlement payment links.
- OCR: receipt upload and parsing.
- Voice: voice-note expense interpretation.
- WhatsApp: link, unlink, status checks, and webhook handling.
- Call reminders: schedule, list, cancel, and dispatch opt-in voice reminders.
This is the later-stage feature that makes Kryze feel proactive instead of passive.
The current implementation uses:
- A Twilio outbound call from the backend.
- An ElevenLabs agent configured for reminder-only conversations.
- A protected dispatcher so reminders only go out when explicitly scheduled.
Important safety and product rules:
- Calls are opt-in only.
- Users must have a verified phone number.
- The backend does not enable live calls unless the environment flag is turned on.
- The scheduler is intentionally external in production to avoid duplicate calls.
- The agent is configured as a reminder assistant, not a general-purpose financial agent.
Kryze also supports a one-way reminder-call provider using Gnani Timbre TTS and Twilio. Set
CALL_REMINDER_PROVIDER="gnani", add GNANI_API_KEY, and explicitly enable
ENABLE_GNANI_OUTBOUND_CALLS="true". The backend keeps the Gnani key private, creates a
signed audio URL for each opted-in reminder, and returns TwiML that asks Twilio to play the
generated WAV audio. CALL_REMINDER_AUDIO_SECRET protects that public audio callback.
This path is intentionally one-way: it speaks the scheduled reminder and hangs up. A
future conversational version would use Twilio Media Streams with Gnani realtime STT/TTS.
Twilio still requires a funded account, a verified caller ID/number, and a public HTTPS
PUBLIC_API_URL (for example, a deployed backend or a Cloudflare tunnel during testing).
The profile also exposes Call now for demos. It uses POST /api/call-reminders/call-now,
requires the same explicit consent as scheduled reminders, and records the call as a
reminder before dispatching it immediately.
The Prisma schema includes support for:
- Users
- Phone verification
- Groups and group members
- Expenses and expense splits
- Transaction drafts
- Coin balances and coin ledgers
- Subscriptions
- WhatsApp link state
- Bot command logs
- Voice call reminders
The backend deployment guide lives here:
That guide covers:
- PaaS deployment options
- Docker Compose deployment
- Environment variables
- Twilio, OpenAI, Cloudinary, and ElevenLabs configuration
- Reminder-call setup
If you are running the backend locally but need public webhooks for Twilio or Expo, a Cloudflare tunnel is a convenient option.
- Make sure PostgreSQL is running.
- Confirm
DATABASE_URLis correct. - Run
pnpm prisma:generateafter schema changes. - Check for missing environment variables.
- Confirm the API URL in
mobile/.env. - If you are using a local backend, expose it with a tunnel or use a reachable host.
- Restart Expo after changing environment variables.
- Confirm
ENABLE_ELEVENLABS_OUTBOUND_CALLS=truein the backend environment. - Make sure the user has a verified phone number.
- Make sure
CALL_REMINDER_CRON_SECRETis set and your scheduler sends it. - Check that the backend can reach Twilio and ElevenLabs.
- Verify the OpenAI key is set.
- Check file-size limits for uploads.
- Make sure the backend can accept multipart form uploads.
This repo is currently optimized for active product development. If you add a feature, try to update:
- The backend route/controller layer
- The Prisma schema if data changes
- The mobile client if the feature is user-facing
- This README if the setup or architecture changes
No explicit license is declared in the repository yet.