The challenge
Indian freelancers and small businesses need GST-correct invoices, often on a phone with patchy connectivity · and many are uneasy handing their books to someone else's server.
Fintech & Compliance
Free GST invoicing that works offline on any device and keeps every record in the user's own Google Drive, not on a server.

01 · Brief
Indian freelancers and small businesses need GST-correct invoices, often on a phone with patchy connectivity · and many are uneasy handing their books to someone else's server.
A local-first app with no backend: a pure, versioned GST engine runs on the device, data lives in IndexedDB, and a convergent sync engine keeps every device in step through the user's own Google Drive. One static export ships to web, Android, Windows and Linux.
Free invoicing that works offline in English, Tamil and Hindi, costs nothing to serve per user, and never holds a customer's business data.
02 · Stack
| Layer | Technologies | Key libraries |
|---|---|---|
| Frontend Framework |
|
|
| UI & Styling |
|
|
| Motion & Animation |
| · |
| State Management |
|
|
| Backend / Runtime |
|
|
| Database & Storage |
|
|
| Authentication & Security |
|
|
| Integrations & APIs |
|
|
| Hosting & Infrastructure |
|
|
A "glass on black" system: a pure-black canvas lit by a faint sky-blue glow, inverted to sky-50 fading to white in light mode. Sky blue is the only brand accent; green, amber and rose are reserved for status. Every colour is a light-dark() custom property, and a unit test keeps the CSS tokens and their TypeScript mirror in step and checks every pair for WCAG AA contrast. Geist Sans sets the interface; Noto Sans Tamil and Devanagari carry the Indian scripts.
A Turborepo monorepo of ten packages whose layering is enforced by dependency-cruiser, so it cannot erode. Inside the app, components are split by domain rather than by type, and route groups separate the public surface from the signed-in one. Lint rules hold components under 300 lines and forbid hard-coded user-facing text.
IndexedDB is the source of truth, read through Dexie live queries, so every screen re-renders when a local write or an incoming sync batch lands, with no cache to invalidate. The invoice editor keeps its draft in a Zustand store and recalculates totals through the pure tax engine on every keystroke.
One codebase serves a 360px Android phone, a tablet, a desktop browser and a Windows window. The target is WCAG 2.2 AA including motion: axe runs inside the end-to-end suite, a reduced-motion Playwright project replays everything, and the full interface is available in English, Tamil and Hindi.
Initial JavaScript is held under 350 KB gzipped and the landing route under 60 KB beyond the framework, with a CI step that fails any pull request crossing them. pdf.js, docx and exceljs load only on export, and the service worker precaches the whole app so every feature works offline from the first install.
Invoices are drawn once as vector layouts by pdf-lib with fontkit's OpenType Indic shapers, so Tamil vowel signs and Devanagari conjuncts render correctly. Motion runs on CSS tokens across three tiers kept honest by a custom ESLint rule; the WebGL canvas is capped at 30 fps and never runs on the lower tiers.
Local-first with no backend at all. One Next.js static export ships as an installable PWA, is wrapped by Capacitor for Android and by Electron for Windows and Linux. All business logic runs on the device; the user's Google Drive is a dumb store the sync engine reads and writes. It costs nothing to run per user, and no customer data is ever held centrally.
Fourteen IndexedDB tables model the real domain. Every synced record carries a ULID, a hybrid logical clock stamp and a schema version; fourteen schema versions have shipped, each with a fixture-based migration test.
Firebase Authentication proves identity only and never sees business data. Drive access is scoped to drive.appdata and drive.file. Up to 25 permission-scoped profiles unlock with their own PIN and auto-lock. Backups are AES-256-GCM with a PBKDF2 key at 600,000 iterations, and every page ships a build-time hash-based CSP checked in CI.
With no server, the integration surface is the device and the user's own accounts.
Every tax rule lives as versioned JSON, never in code. The tax engine is pure: no React, no database, no network, no Date.now(). Money is integer paise behind a branded type, and it handles CGST/SGST/IGST by place of supply, cess, reverse charge, exports, SEZ, TDS, TCS and round-off, all checked against a 205-case workbook.
05 · Features
A live-preview editor for nine document types that saves as the user types and splits tax automatically by place of supply. GSTIN entry is validated and fills the state and PAN.
A phone, a laptop and a Windows PC stay in step through the user's own Google Drive, and every feature except sign-in and sync works with no connection.
Payments are matched to the oldest open invoices and feed a dashboard of billed, received and overdue. Nine Excel reports and a GSTR-1-ready workbook turn month-end into an export.
Staff work with only the permissions and businesses they are given. New users are walked through a first invoice in a practice business, in all three languages.
06 · Standout engineering
Every project has two problems that determined whether it worked. These were theirs.
Two devices editing the same invoice offline must end up identical with no server to referee. Per-device, gzipped, double-checksummed batches merge through a commutative per-field function ordered by hybrid logical clocks. All 22 specified conflict scenarios are covered, and a property test runs 10,000 random edit histories to prove every replica converges.
Each of six templates is written once as a pdf-lib layout with fontkit's Indic shapers. The preview is that same PDF rendered by pdf.js and the JPEG is rasterised from it, so what the user sees is exactly what the customer receives. 222 visual baselines fail CI on any unintended pixel change.
07 · Engineering practice
akmo-invoice/ ├── apps/ │ ├── app/ # Next.js 16 static export + Capacitor Android │ │ ├── app/ │ │ │ ├── (public)/ # Landing (en/ta/hi), legal, sign-in │ │ │ ├── (authed)/ # Dashboard, documents, editor, payments, … │ │ │ └── sw.ts # Serwist service worker │ │ ├── components/ # Split by domain │ │ └── android/ # Capacitor project │ └── desktop/ # Electron shell · NSIS, AppImage, auto-update ├── packages/ │ ├── domain/ # Zod schemas, Money, ULID, HLC │ ├── tax-rules/ # Versioned JSON rules │ ├── tax-engine/ # Pure GST calculation │ ├── db/ # Dexie schema, migrations │ ├── sync/ # Drive sync, encrypted backup │ ├── render/ # Templates, PDF/DOCX/JPEG/XLSX │ ├── platform/ # Web, Capacitor, Electron │ ├── i18n/ # en / ta / hi │ ├── ui/ # Tokens, glass components, motion │ └── guide/ # Onboarding engine ├── tools/eslint-plugin-akmo/ # House lint rules ├── tests/ # e2e, visual, sync harness, tax workbook └── docs/ # PRD, 127 ADRs
Strict TypeScript with no any, ESLint 9 at zero warnings plus a custom house plugin, and dependency-cruiser enforcing the layering. About 3,100 Vitest cases across 492 files cover the domain, tax engine, migrations and sync, with property-based tests for money, allocation and convergence. Fifty-one Playwright specs run on desktop and mobile Chromium with axe checks and 222 visual baselines. CI also fails on a missing Tamil or Hindi key, a bundle over budget or a page without a CSP.
Pull requests run a single combined check; merges to main add the end-to-end and visual suites. Vercel serves the static export with security headers. Android APK and Windows / Linux desktop builds come from dispatched GitHub Actions workflows, desktop installs auto-update from GitHub Releases, and one version number drives every platform.
08 · Impact
Budgets are written into the specification and enforced in CI rather than claimed: initial JS under 350 KB gzipped, editor totals within 50 ms, a one-page PDF in under 3 seconds. No Lighthouse figure is published because none has been measured on production traffic yet.
With no server, one more business costs nothing to serve: every user brings their own compute and Drive storage. Capacity tests cover 50,000 documents per account, tax rules change as data rather than code, and the same codebase already ships to web, Android, Windows and Linux.
09 · Interface
Select any screen to view it full size.
Contact
The best fit is a business that needs a system to hold up under real use · not a template with your logo on it.