ROHAN

WORK / RYBO

RYBO

Run Your Business Operation - billing, stock, dues, deliveries and team for wholesale distributors, on Android and the web. Formerly MyLedger, and running a real distributor's business every day.

ROLE

Product & systems design, built with Claude Code as an engineering partner

STACK

Flutter · Riverpod · Firebase (Firestore, Cloud Functions) · Razorpay · S3

TIMELINE

2026 - ongoing · v1.3.7

STATUS

Live - Gate of India Food

RYBO preview

INSIDE THE PRODUCT

Billing applies each buyer's agreed rate and quantity tier
A bill is saved whole on the server, or not at all
Couriers tap through each delivery step
Live dues per customer, from stored totals
Collections: overdue balances, promises and follow-ups
Deliveries board for owners and admins
Reports: revenue, top products, collection rate
Profit & loss from the real cost of goods

THE PROBLEM

Every wholesale business I looked at runs on a paper notebook - stock, dues, and per-buyer pricing tracked by hand. Goods go out with a delivery boy, every buyer has their own rate, and every unpaid rupee has to be remembered and chased. The owner can't see profit in real time, and staff mistakes stay invisible until a reconciliation goes wrong.

RYBO replaces the notebook. One bill saves the sale, moves the stock, records the money, starts the delivery and updates the customer's due - at once, on every phone and PC in the shop.

CONSTRAINTS

  • -Real, non-technical end users - every screen has to work without training
  • -Several staff billing at the same time on one shared company account
  • -Patchy connectivity on the shop floor - billing can't stop when the signal drops
  • -Real money: a double tap or a retry must never count a payment twice
  • -Old app versions stay installed in the field, so backend changes have to roll out in steps

ARCHITECTURE

Flutter clients (Android and web) read live from Firestore, but every write that moves money, stock or plan usage goes through Cloud Functions - one Firestore transaction per call, carrying an ID made on the device. Triggers keep running totals, so screens read stored figures instead of adding up history.

  • 01Flutter + Riverpod - one codebase for the Android app and the web app
  • 02Cloud Functions (asia-south1) - createBill, recordPayment, addStock, deliveries, plans; each one transaction
  • 03Idempotent writes - device-made request IDs, so a retry, double tap or offline replay lands exactly once
  • 04Offline queue - bills made without signal wait on the device and sync themselves; nothing is silently lost
  • 05Stored aggregates - triggers maintain customer dues, daily stats and bill counters, so reads stay flat as data grows
  • 06Security rules - per-company isolation and Owner / Admin / Staff roles; purchase cost lives in a private ledger staff can't read
  • 07Razorpay - checkout in the app, pricing and verification on the server

DECISIONS

1.Moving money writes from the client to the server

The first version wrote straight to Firestore, with security rules doing the access control - it cut out a whole backend and got the product in front of a real distributor fast. Once several people billed at once over patchy connections, that stopped being enough. Now the server is the authority for bills, payments, stock and plan limits, and the rules refuse direct money writes once old app versions are retired.

2.Average cost over FIFO

Real wholesale stock doesn't arrive in clean batches - a true FIFO model needs lot tracking most buyers don't do by hand either. A running average cost is close enough to reality and dramatically simpler to compute and explain to a non-technical owner.

3.Read stored totals, not history

Dashboard figures and customer dues come from aggregates kept up to date by triggers, so the customer list is one small live read whether the business has fifty bills or fifty thousand.

4.Built with Claude Code as an engineering partner

I specified the data model, the server's transaction boundaries, the security rules and the UX; Claude Code handled a large share of implementation. The judgment call was knowing what to specify precisely - schema, access rules, pricing logic - and what to delegate. Not outsourcing the thinking, just the typing.

RESULTS

2,000+

Bills processed

4+ mo

Live with a real distributor

2

Platforms - Android and web

what I'd do differently…

I'd make the server the authority for money from day one. Starting with client-side writes was the right call for speed, but moving off them with old app versions still installed meant a staged rollout - feature switches and a minimum-build gate - that a server-first design would never have needed.

quick answers

Quick answers about RYBO

What is RYBO?
Run Your Business Operation - billing, stock, dues, deliveries and team for wholesale distributors, on Android and the web. Formerly MyLedger, and running a real distributor's business every day.
What is RYBO built with?
RYBO is built with Flutter, Riverpod, Firebase (Firestore, Cloud Functions), Razorpay, S3.
What was SK Rohan Parveag's role on RYBO?
Product & systems design, built with Claude Code as an engineering partner.
What is the current status of RYBO?
Live - Gate of India Food. Links: rybo.rohanparveag.in (https://rybo.rohanparveag.in) and Web app (https://app.rybo.rohanparveag.in).