MeetSettle is an open-source toolkit for building meetup attendance and settlement flows. It includes a reusable settlement engine, invite-token based meetup pages, a C# Web API, and a Next.js demo app.
Small teams and independent developers often need lightweight group-planning features: invite people, collect attendance, record shared costs, and show who should send money to whom. MeetSettle packages that flow as a practical OSS template instead of a one-off product feature.
- Developers adding attendance and payment-splitting flows to a small product.
- Indie builders who want a working reference app rather than a blank starter.
- Maintainers who need a simple, testable settlement algorithm for group expenses.
- Contributors who want a focused early-stage OSS project with clear next steps.
MeetSettle is an early-stage OSS project. The reusable settlement-core package is the core value of the repository; the ASP.NET Core API and Next.js web app are reference/demo implementations that show how the engine can be used in a real meetup flow.
The current v0.1.0 focus is a reliable settlement foundation, clear API structure, local development setup, tests, and contributor-friendly documentation. Production payment handling, full authentication, push notifications, and hosted demo deployment are planned or intentionally out of scope for this initial release.
- Keep the settlement engine small, deterministic, and easy to reuse.
- Keep API and web examples practical without pretending they are production SaaS.
- Add issues, releases, and documentation only when they represent real planned maintenance work.
- Grow the project through reviewable changes, tests, and clear roadmap items.
- Reusable C# settlement engine with unit tests.
- KRW whole-won rounding policy with deterministic remainder handling.
- Participant, expense, share, balance, and transfer models.
- ASP.NET Core Web API with PostgreSQL, EF Core commands, and Dapper queries.
- Next.js App Router frontend with mobile-first meetup and settlement screens.
- Invite-token based guest access for MVP flows.
- Docker Compose setup for local PostgreSQL, API, and web app.
- GitHub Actions CI for frontend build and backend tests.
- Hosted public demo deployment.
- Invite token expiration and rotation policy.
- API integration tests around meetup, expense, and settlement flows.
- PWA installation guide and offline-friendly demo notes.
- Korean and English localization plan.
- Calendar export and notification integrations.
Screenshots will be added after the first public demo deployment. The current focus is the v0.1.0 OSS foundation: settlement engine, API structure, demo app structure, tests, and documentation.
- Frontend: Next.js App Router, TypeScript, Tailwind CSS.
- Backend: C# ASP.NET Core Web API, Entity Framework Core, Dapper.
- Database: PostgreSQL.
- Tooling: Docker Compose, GitHub Actions.
apps/
web/ Next.js frontend
api/ ASP.NET Core Web API
packages/
settlement-core/ Reusable settlement algorithm
settlement-core.tests/ Unit tests
docs/
architecture.md
api.md
settlement-algorithm.md
deployment.md
roadmap.md
The API follows a CQRS-lite style: GET endpoints use Dapper query DTOs, and create/update operations use EF Core entities and Fluent API mappings.
git clone https://github.com/sbpark-escape/meetsettle.git
cd meetsettle
docker compose up --buildThen open:
- Web:
http://localhost:3000 - API Swagger:
http://localhost:5076/swagger - PostgreSQL:
localhost:5432
Run the database:
docker compose up dbRun the API:
dotnet restore
dotnet ef database update --project apps/api/MeetSettle.Api.csproj --startup-project apps/api/MeetSettle.Api.csproj
dotnet run --project apps/api/MeetSettle.Api.csprojRun the web app:
npm install
npm --workspace @meetsettle/web run devdocker-compose.yml starts PostgreSQL, the API, and the web app. It uses development-only defaults from .env.example; replace them in real deployments.
docker compose up --build
docker compose downCopy .env.example into your local environment and adjust values as needed.
POSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORDConnectionStrings__DefaultConnectionNEXT_PUBLIC_API_BASE_URLALLOWED_ORIGINS
Do not commit real production secrets.
POST /api/meetupsGET /api/meetups/{id}POST /api/meetups/{id}/participantsPATCH /api/meetups/{id}/participants/{participantId}POST /api/meetups/{id}/expensesGET /api/meetups/{id}/settlementPATCH /api/meetups/{id}/transfers/{transferId}POST /api/meetups/{id}/invite-tokenGET /api/invites/{token}
See docs/api.md for request and response notes.
The settlement engine calculates:
- How much each participant paid.
- How much each participant owes.
- Net balance per participant.
- A minimal list of transfers from debtors to creditors.
KRW uses whole-won rounding by default. If an amount does not divide evenly, the remaining won is distributed deterministically by participant order so totals always reconcile.
See docs/settlement-algorithm.md for details.
If Alex pays 60,000 KRW for Alex, Bora, and Chris:
- Bora sends Alex
20,000 KRW. - Chris sends Alex
20,000 KRW.
If multiple people paid, MeetSettle nets all balances first and then creates the fewest practical transfers.
dotnet build
dotnet test packages/settlement-core.tests/MeetSettle.SettlementCore.Tests.csproj
npm --workspace @meetsettle/web run lint
npm --workspace @meetsettle/web run build
npm auditGitHub Actions runs on pull requests and pushes to main.
- Backend: restore, build, settlement-core tests.
- Frontend: npm install, lint/type check, production build.
The initial release target is v0.1.0. See docs/release.md for the release checklist, tag command, GitHub Release command, and fallback steps when GitHub CLI is unavailable.
See docs/roadmap.md.
See CONTRIBUTING.md, CODE_OF_CONDUCT.md, and the issue templates in .github/ISSUE_TEMPLATE.
See SECURITY.md. Do not commit real secrets, production database URLs, JWT keys, or third-party API keys.
MIT. See LICENSE.