Case · Web app · TypeScript

budget-split: shared expense tracker

A web app for a group's shared expenses without sign-up: a room behind a secret link, four ways to split, and a "who pays whom" settlement in at most n-1 transfers. A side project.

  • TypeScript
  • Vite
  • Cloudflare Workers
  • D1
  • WebGL
  • vitest
  • fast-check
  • axe
  • GitHub Actions

01 · How it looks

Screenshots

Screenshot of the project "budget-split: shared expense tracker" at 1280 pixels wide
Desktop, 1280 px
Screenshot of the project "budget-split: shared expense tracker" on a phone screen, 390 pixels wide
Phone, 390 px

02 · About

What it is and why

budget-split ("Split evenly") is a web app for tracking a group's shared expenses without sign-up. A room is created behind a 128-bit secret link, with separate view and edit links. A side project.

The back end runs on Cloudflare Workers with a D1 database, the front end is vanilla TypeScript with Vite, and the interface has kit-blob WebGL elements.

Limitations

No accounts: lose the link and you lose the right to edit.

Data in D1 is stored in plain text.

Offline edits and deletions are not queued.

What is inside

  • Split an expense equally, by shares, by amounts or by percentages
  • Multiple currencies with a manual rate
  • "Who pays whom": at most n-1 transfers; the algorithm is greedy, so the count is not always the minimum
  • Optimistic locking: of 4 simultaneous edits to one expense exactly one wins
  • 60 tests (vitest in workerd, fast-check property tests), green CI, npm audit 0, axe 0 violations
  • Deployed on Cloudflare Workers with D1

03 · How to run

Run it locally

git clone <repository on request> budget-split
cd budget-split
npm install
npm run dev

04 · Code

The repository is private

The source is in a private repository. Message me on Telegram and I will open access.

Request the code