Yojika: billing software that assumes the internet is broken.
Our own product, and the reference for everything we build for other people. Windows and Android, offline-first, ~15 MB, invoices in 22 Indian languages — built solo in about four weeks.
- ~15 MB
- install size
- against a market leader’s ~250 MB
- 22
- invoice languages
- every official Indian language
- 2
- platforms
- Windows and Android, one codebase
- 108
- guide pages
- 54 English, 54 Hindi, coverage enforced in CI
The problem was not billing software
India has no shortage of GST billing products. What it has a shortage of is billing software that behaves when the conditions are bad — and at a small shop counter the conditions are always bad. The power flickers. The connection drops mid-sale. The machine is a six-year-old Windows laptop with 4 GB of RAM. There is a queue.
Most competitors treat the network as present and degrade badly without it. That is a defensible choice in a city office. It is the wrong choice at a counter in Theni.
Offline-first, taken literally
The local database is the source of truth, not a cache. A sale completes against local storage and returns immediately; nothing in the billing path awaits a network round trip. Sync runs afterwards, in the background, and is allowed to fail without the user ever learning that it did.
This is the harder architecture — conflict handling, device registration, and a schema that has to migrate on machines you cannot reach. It is also the only one that survives the environment the product is actually used in.
Size as a product decision
Shopkeepers install over patchy mobile data. An install that takes twenty minutes is an install that gets abandoned at minute twelve. We held the app to roughly 15 MB, which turned every dependency into an argument that had to be won rather than a line added to a manifest.
The market leader ships around 250 MB. That gap is not a benchmark we chase; it is a wedge we lead with, because a shopkeeper can verify it in thirty seconds on their own phone.
Twenty-two languages on the printed invoice
Not a translated interface — the bill in the customer’s hand. A shopper in Tamil Nadu should be given a receipt in Tamil, and one in Kerala a receipt in Malayalam. Getting Indic scripts to render correctly on a thermal printer is unglamorous, difficult work that incumbents have mostly not done.
It is also the feature customers repeat back to us unprompted, which is the only reliable signal that a feature was worth building.
The site and the pipeline behind it
yojika.com is a static Astro site on Cloudflare: over a hundred pages, including a 108-page user guide across English and Hindi, with a CI gate that fails the build if a guide page is missing from the navigation. Hosting costs nothing worth mentioning.
Behind it runs a content pipeline that researches, drafts, translates, checks and publishes SEO articles in 12 languages every morning at 06:49 IST, auto-merging only what passes its quality gate. Both of these are now services we offer — because we run them, not because they demo well.
Every service we sell appears somewhere in this project. The app, the static site, the content pipeline and the renewal automation are not capabilities we describe — they are one system we operate, and you can go and use it.
Yojika was built by a founder who worked as a daily-wage labourer, taught school, and ran a kirana store through 2020 — using the competing billing product at his own counter for a year before writing a line of this one. That is an unusual qualification for a software company, and it is the reason this particular product understands the counter it sits on.