Kumpelkasse is a full-stack app for tracking debts in friend groups, shared apartments, trips, and games such as poker or blackjack.
This repository contains:
app/: React Native + Expo app using Expo Routerapi/: Kotlin + Spring Boot API with MySQL, JPA, and server-side debt calculation
- Multiple groups per user
- Direct debts, splits, one-off expenses, and games
- Optimized settlement transfers between members
- Payment tracking with references to the debts that were settled
- User profiles with payment details
- Password login and InteraApps OIDC login
- Deep links and invite links for
kumpelkasse.interaapps.de - Dark mode, push notifications, and background refresh
.
├── api/ # Spring Boot backend
└── app/ # Expo / React Native frontend- Node.js 20+
- Java 21
- MySQL 8+
- Xcode version compatible with Expo SDK 55
- Android Studio / Android SDK
cd api
./gradlew bootRunBy default, the API runs on http://localhost:8080.
Important defaults from api/src/main/resources/application.properties:
SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/mydatabase?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTCSPRING_DATASOURCE_USERNAME=myuserSPRING_DATASOURCE_PASSWORD=secretSPRING_JPA_HIBERNATE_DDL_AUTO=updateAPP_PUBLIC_BASE_URL=https://kumpelkasse.interaapps.de
cd app
npm install
npm run startOther useful commands:
npm run iosnpm run androidnpm run web
The frontend uses the following default logic:
- Expo Go on a local network:
http://<your-metro-host>:8080/api - Local iOS:
http://localhost:8080/api - Android emulator:
http://10.0.2.2:8080/api - Production:
https://kumpelkasse.interaapps.de/api
You can override the API URL explicitly:
EXPO_PUBLIC_API_URL=http://192.168.0.10:8080/apiOther relevant frontend variables:
EXPO_PUBLIC_INTERAAPPS_CLIENT_ID
Backend:
INTERAAPPS_OIDC_CLIENT_IDINTERAAPPS_OIDC_CLIENT_SECRET
Frontend:
- uses InteraApps OIDC through Expo Auth Session
- app scheme:
kumpelkasse://
The app is configured for:
- App scheme:
kumpelkasse:// - Universal links:
https://kumpelkasse.interaapps.de/invite/...
The backend also serves the required well-known endpoints:
/.well-known/apple-app-site-association/.well-known/assetlinks.json
cd api
./gradlew testcd app
npx tsc --noEmitWhen the backend is running:
- OpenAPI JSON: http://localhost:8080/v3/api-docs
- Swagger UI: http://localhost:8080/swagger-ui.html
app/eas.json includes these profiles:
developmentpreviewproduction
Example:
cd app
eas build --platform ios --profile productioncd api
./gradlew build- Expo Router with tab navigation
- global dashboard store
- Axios for API calls
- local session handling with a Bearer token
- Safe Area support, dark mode, and iOS-oriented UI
- Spring Boot 3
- Kotlin
- JPA / Hibernate
- MySQL
- server-side calculation for balances, settlements, and optimized transfers
- The actual debt logic lives in the backend.
- The frontend uses preview event lists and paginated event feeds in some places, so summaries and statistics should come from backend-calculated data.
- Group joining is currently still based on
groupIdand is not yet protected by signed invite tokens.