Simple expense splitter for friend trips. Create a trip, add participants, log expenses, and see who owes what.
- Download the latest APK from GitHub Releases
- On your Android device, enable "Install from unknown sources" in Settings > Security (or when prompted)
- Open the downloaded APK file to install
- Launch SplitDumb from your app drawer
You can also use the web app at splitdumb.emilycogsdill.com
- Backend: Hono on Cloudflare Workers
- Database: Cloudflare D1 (SQLite)
- Frontend: Vanilla JS with Vite build
- Testing: Vitest (unit), Playwright (e2e)
- Node.js 18+
- Wrangler CLI (
npm install -g wrangler) - Cloudflare account (for deployment)
# Install dependencies
npm install
# Initialize local database
npm run db:init
# Start dev server (builds frontend + runs worker)
npm run devThe app runs at http://localhost:8787.
npm run db:initFirst, create a D1 database in your Cloudflare dashboard or via CLI:
wrangler d1 create splitdumb-dbUpdate wrangler.toml with the returned database_id, then initialize the schema:
npm run db:init:remote-
Log in to Cloudflare:
wrangler login
-
Create the D1 database:
wrangler d1 create splitdumb-db
-
Copy the
database_idfrom the output intowrangler.toml -
Initialize the production database:
npm run db:init:remote
-
(Optional) Configure custom domain in
wrangler.toml:[[routes]] pattern = "your-domain.com" custom_domain = true
npm run deployThis builds the frontend and deploys the worker to Cloudflare.
# Unit tests
npm test
# E2E tests (requires app running or uses production URL)
npm run test:e2e
# E2E tests with UI
npm run test:e2e:uisrc/
├── api/ # Hono API routes
├── db/ # Database schema and queries
├── frontend/ # Static frontend (HTML, CSS, JS)
├── lib/ # Shared utilities
├── index.ts # Worker entry point
└── types.ts # TypeScript types