Loading page...Загружаем страницу...正在加载页面...
AtlasRepo

We built a Splitwise alternative where the link is the account

Description and use

PeanutSplit lets friends share expenses without account creation, using a single URL as credential and data key, with deterministic split handling, offline support, and secure real-time updates.

Problem

Friends will not create accounts, so the room URL must serve as invite, login, and data key.

Outcome

PeanutSplit allows friends to share expenses without account creation, using a single URL as credential and data key, with deterministic split handling, offline support, and secure real-time updates.

Workflow

  • Generate 16 random bytes, base64url encode, append to readable stem to form URL
  • Use URL as bearer credential; no recovery or owner override
  • Store money as strings + BigInt; display only with Number
  • Handle equal splits deterministically; test with 300 random rooms
  • Lock FX rates at entry; fetch rates via same-origin route
  • Queue new expenses offline; replay when online; limit features to avoid CRDT complexity
  • Use SSE to notify changes; client refetches data; stream carries no room data
  • Route push, FX, receipt model through allowlisted proxy; containers cannot reach internet

Evidence

If your friends have to make an account, they won't. So the room URL had to be the whole product: the invite, the login and the data key in one string.

Source

The link is a bearer credential. 16 random bytes, base64url, appended to a readable stem. No recovery, no owner override. Treat it like a key.

Source

Money as strings + BigInt. A Number never touches an amount except for display. Equal splits hand out remainders deterministically.

Source

FX locked at entry. Editing an expense never re-prices history. Rates are fetched through a same-origin route so the browser never talks to a second host.

Source

Realtime that leaks nothing. SSE sends "something changed", the client refetches. The stream itself carries no room data.

Source

No egress in prod. Containers can't reach the internet; push, FX and the receipt model go through an allowlisted proxy.

Source

  • Record date: 2026-10-01T04:08:10.207Z