Built like a ledger. Runs like a river.

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

Native clients, one sync contract

The river

One river. Many fish. One ledger.

POS — the first fish, in build Inventory & purchasing Khata — receivables Reports & tax Label studio AI copilot ← every fish, same river, one ledger

01

Stock is a sum, never a cell

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

Offline is the default

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

Every app is a fish in the river

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.


First fish · Counter POS

The counter, at legacy speed.

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.

River Fish POS
Sale F1 Purchase F3 Payments F4 Reports F6
Synced 18:42
Total Sales
Rs77,850.45
12.4%vs last Saturday
Sale Bills
68
Rs 1,144.86average bill
Purchases
Rs7,000.00
Rs 3,500.00freight allocated
Net Sales · Last 7 Days
MAIN RAVI ROAD
Sun 16
Mon 17
Tue 18
Wed 19
Thu 20
Fri 21
Sat 22

fish 01 · dashboard · recreated from design/Dashboard.dc.html · all-branches roll-up — the thing the legacy box cannot do


For developers

A native API, not an afterthought.

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.

POST /v1/sync
{
  "deviceId": "dev_01J9K3…",
  "ops": [ {
    "opId":     "01JD8FZK7Q…",   // ULID — the idempotency key
    "type":     "sale.create",
    "branchId": "br_ravi_road",
    "clientSeq": 4182,
    "payload":  { "totalPaisa": 7785045, "lines": […] }
  } ]
}
→ 200  { "applied": 1, "duplicates": 0, "cursor": "…" }

Native AI

Ask the ledger. Build on it.

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.

POSask the counter — sales, prices, stock, in your language
Inventoryreorder suggestions, slow movers, stock reconciliation
Khataoverdue-balance nudges, drafted reminder messages
Reportsplain-language questions become date-ranged, cited reports
Labelsdescribe a label, get a print-ready template
Roadmap — swims after the first fish Owner-approved actions only
Ask the ledger

کل راوی روڈ کی نیٹ سیل کتنی تھی؟

Rs 44,150.00

Ravi Road · Fri 21 Aug · 31 bills

grounded → stock_movements 18,204–18,412

Draft a slow-movers report for glue items

→ report.create queued · 14 items · awaiting owner approval


Built for every counter

Specifics, not features.

Multi-branch

Every counter, one view

Branch-level tills and stock with an all-branches roll-up. Role per user, per branch.

Tax

Full tax engine in V1

GST, VAT or sales tax — codes on documents, input/output reports, landed cost that knows if you are registered.

Languages

Multi-language, day one

UI, master data and printed bills in your language — LTR and RTL alike; per-user screen language, per-tenant print language.

Units

Sells rod by the gram

Multi-unit items, per-supplier pack sizes, weight goods with nominal piece factors.

Barcodes

Label studio

WYSIWYG label designer at true scale, batch sheets, a barcode per pack unit.

Import

3,284 items, dry-run first

Excel import with column mapping and a reviewable diff before anything commits.


Pricing

Priced with the pilot, not before.

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.

Talk to us about the pilot Read how it works

Follow the build.

Phase notes, app launches, and the eventual name — straight from the riverbed.