Project River Fish is a river of apps for everyone, anywhere in the world — offline-first, append-only, provably correct. The keyboard-first point of sale is the first fish in the water. More are swimming behind it.
codename: riverfish · phase 0 · brand tbd
fig. 01 — river fish, sampled at 9px
0.00
Float drift — money is integer minor units
100%
Sales that complete offline
0
Conflicts when branches re-sync
2×
Native clients, one sync contract
01
Every movement of inventory or money appends an immutable row. On-hand stock is SUM(delta) — there is no mutable column to corrupt, so “−22.5 PAIR” can never happen silently again.
02
The counter completes sales with the network down. Operations queue in a local outbox and sync later — idempotent and commutative, so two branches re-joining after an outage converge with no conflict resolution at all.
03
POS is the first fish, not the whole river. Purchasing, receivables, reporting, label printing — each swims as its own app against the same operation log and the same native API, so the river grows without rewrites.
Keyboard-first with the F-key map the staff already know, a scan field that never loses focus, and sync state always visible. Dense on purpose — matched to a twelve-hour shift, not a demo.
fish 01 · dashboard · recreated from design/Dashboard.dc.html · all-branches roll-up — the thing the legacy box cannot do
tablet 1194×834 · recreated from design/TabletDashboard.dc.html · reference layout for the native Android client · 44px hit targets
owner's phone · installable PWA · the same ledger, from anywhere
Every mutation is an operation in an append-only log, keyed by a client-generated ULID — replay it twice, it applies once. Device identity is a first-class credential: pairing, seat metering, remote revoke.
The same /v1 + /sync contract drives the web PWA, the Kotlin Android client, and whatever ships next — held together by shared conformance fixtures, not shared code.
Because every fact is a row in one append-only ledger, AI answers are grounded — every figure cites the movements it was summed from. Ask in your own language, typed or spoken, from any counter or the owner's phone.
And because every mutation is an operation on the native API, you can build with AI too: draft reports, reconcile stock, scaffold whole apps — agents act through the same op-log, the same permissions, the same audit trail as any user.
Multi-branch
Branch-level tills and stock with an all-branches roll-up. Role per user, per branch.
Tax
GST, VAT or sales tax — codes on documents, input/output reports, landed cost that knows if you are registered.
Languages
UI, master data and printed bills in your language — LTR and RTL alike; per-user screen language, per-tenant print language.
Units
Multi-unit items, per-supplier pack sizes, weight goods with nominal piece factors.
Barcodes
WYSIWYG label designer at true scale, batch sheets, a barcode per pack unit.
Import
Excel import with column mapping and a reviewable diff before anything commits.
River Fish is being built inside a real, working shop — tenant #1 sets the bar for speed, density and correctness before a single subscription is sold. Pricing lands with the public release, worldwide. Wherever your shop is, if it wants to swim early — talk to us.
Phase notes, app launches, and the eventual name — straight from the riverbed.