SplitMint is a modern group expense-splitting web application that helps users create groups, add shared expenses, track balances, and view simplified settlement suggestions.
The app also includes MintSense, an AI-assisted feature that can parse natural-language expense entries and convert them into structured expenses.
Deployed App: https://splitmint-steel.vercel.app
- Email/password authentication
- Google OAuth login
- Create and manage expense groups
- Add participants to a group
- Add expenses manually
- Select payer and split participants
- Equal split calculation
- Balance calculation for each participant
- Settlement suggestions to minimize repayments
- MintSense AI for natural-language expense entry
- INR currency display with
₹ - Responsive mint-themed UI
- Supabase database integration
- Supabase Edge Function for AI parsing
- Vercel deployment
- User signs in using email/password or Google.
- User creates a group, for example
Coorg. - User adds participants like
A,B, andC. - User adds an expense manually, for example:
- Description:
Dinner - Amount:
₹1000 - Paid by:
You - Split between:
You, A, B, C
- Description:
- SplitMint calculates:
- Total spent
- Individual balances
- Who owes whom
- User can also use MintSense:
- Input:
I paid 800 for lunch today split with A, B and C - Output: A structured expense is automatically added.
- Input:
- React
- TypeScript
- Vite
- TanStack Router / TanStack Start
- Tailwind CSS
- Radix UI
- Lucide React
- Sonner
- Supabase
- Supabase Auth
- Supabase PostgreSQL
- Supabase Row Level Security
- Supabase Edge Functions
- MintSense AI via Supabase Edge Function
- OpenAI-compatible chat completions endpoint
- Gemini API-compatible configuration
- Vercel
- Supabase Cloud
SplitMint
├── src
│ ├── components
│ │ ├── AppShell.tsx
│ │ └── ui
│ ├── hooks
│ │ └── useAuth.tsx
│ ├── integrations
│ │ └── supabase
│ ├── lib
│ │ ├── balance.ts
│ │ └── utils.ts
│ ├── routes
│ │ ├── __root.tsx
│ │ ├── auth.tsx
│ │ ├── dashboard.tsx
│ │ ├── groups.$groupId.tsx
│ │ └── index.tsx
│ ├── router.tsx
│ ├── routeTree.gen.ts
│ └── styles.css
├── supabase
│ ├── functions
│ │ └── mintsense
│ │ └── index.ts
│ └── migrations
├── package.json
├── vite.config.ts
├── tsconfig.json
└── README.md
The main balance and settlement calculations are handled in:
src/lib/balance.ts
The app calculates:
- Total group spending
- Net balance for each participant
- Who should pay whom
- Simplified settlement suggestions
Example:
If one person pays ₹1000 for 4 people:
₹1000 / 4 = ₹250 per person
Payer's own share = ₹250
Other 3 participants owe ₹250 each
Payer's net balance = +₹750
MintSense allows users to enter expenses using natural language.
Example input:
I paid 800 for lunch today split with A, B and C
Expected result:
Description: lunch
Amount: ₹800
Paid by: current user
Split between: current user, A, B, C
Split mode: equal
MintSense is implemented as a Supabase Edge Function:
supabase/functions/mintsense/index.ts
Create a .env file using .env.example as reference.
SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_key_here
SUPABASE_URL=your_supabase_url_here
VITE_SUPABASE_PROJECT_ID=your_supabase_project_id_here
VITE_SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_key_here
VITE_SUPABASE_URL=your_supabase_url_hereFor Supabase Edge Function AI support, set these secrets in Supabase:
AI_API_KEY=your_ai_api_key_here
AI_API_URL=your_openai_compatible_chat_completions_url_here
AI_MODEL=your_ai_model_hereExample:
AI_API_URL=https://generativelanguage.googleapis.com/v1beta/openai/chat/completions
AI_MODEL=gemini-3-flash-previewDo not commit real API keys or secrets to GitHub.
git clone https://github.com/gokularaman-c/Splitmint.git
cd Splitmintnpm installCreate a .env file in the root directory and add your Supabase values:
SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_key_here
SUPABASE_URL=your_supabase_url_here
VITE_SUPABASE_PROJECT_ID=your_supabase_project_id_here
VITE_SUPABASE_PUBLISHABLE_KEY=your_supabase_publishable_key_here
VITE_SUPABASE_URL=your_supabase_url_herenpm run devThe app will usually run at:
http://localhost:3000
or:
http://localhost:5173
depending on the available port.
npm run buildCreate a new project in Supabase and copy:
- Project URL
- Publishable key
- Project reference ID
Run the SQL migration from:
supabase/migrations
You can apply it through:
Supabase Dashboard → SQL Editor → New Query → Paste SQL → Run
Enable:
- Email/password authentication
- Google OAuth provider
For Google OAuth, configure:
Supabase → Authentication → Sign In / Providers → Google
Add:
- Google Client ID
- Google Client Secret
In Supabase:
Authentication → URL Configuration
Set Site URL:
https://splitmint-steel.vercel.app
Add redirect URLs:
https://splitmint-steel.vercel.app/**
https://splitmint-steel.vercel.app/dashboard
https://splitmint-steel.vercel.app/auth
http://localhost:3000/**
http://localhost:3000/dashboard
brew install supabase/tap/supabasesupabase loginsupabase link --project-ref your_project_refsupabase functions deploy mintsensesupabase secrets set \
AI_API_KEY="your_ai_api_key_here" \
AI_API_URL="your_openai_compatible_chat_completions_url_here" \
AI_MODEL="your_ai_model_here"The app is deployed using Vercel.
npm run buildnpm installThe project uses TanStack Start with Nitro. The Vercel deployment should use the Nitro-compatible output generated during build.
The Vite config includes Nitro support:
import { nitro } from "nitro/vite";The current version supports:
- Working production deployment
- Google login
- Email/password login
- Group creation
- Manual expense creation
- AI-based expense creation through MintSense
- Balance calculation
- Settlement suggestions
- INR currency display
- Add multiple split modes with richer validation
- Add expense editing history
- Add group invite links
- Add recurring expenses
- Add export to CSV/PDF
- Add dashboard analytics
- Add multi-currency support
- Improve MintSense summaries
- Add mobile-first PWA support
Gokularaman C