The visible feature was only the surface
Bangladeshi families track wedding, aqiqah, and birthday gifts in paper notebooks that are hard to search, easy to lose, and impossible for several relatives to update at once, while generic apps store the family's financial records on a third-party server and ignore Bangla numerals and lakh formatting.
The system also had to respect concrete constraints. The ledger must live in the owner's Google Drive with no application server or database, so the app may request only the drive.file scope and never see the rest of the Drive. Gift entry happens at crowded events with unreliable connectivity, so writes must land locally first and reach the sheet later without duplicating rows. Several family members edit the same sheet from different phones, so the sync rule has to be simple, predictable, and safe when two devices change the same row. The sheet remains a spreadsheet that people may edit by hand, so the app must detect header changes and stop syncing instead of corrupting data. The whole interface, including numerals, dates, currency, and validation errors, must read naturally in Bangla rather than relying on browser defaults in English.
My role covered product designer and frontend engineer, with responsibility for product specification, bangla-first interface design, local-first data model, google sheets synchronization, sharing workflow, pwa packaging, testing, and netlify deployment.
I turned the constraints into boundaries
A TanStack Start single-page PWA keeps a per-ledger Dexie database as the working copy, and a sync engine pulls, merges, and pushes rows against a three-tab Google Sheet whose columns are derived from Zod schemas.
Avoiding a server means the family keeps ownership of its data, can open or back up the sheet directly, and the product carries no hosting cost or data-retention liability.
Dexie holds the working copy so entries never block on the network; the navbar reports synced, syncing, offline with a pending count, or needs attention.
Family ledgers rarely see simultaneous edits of the same row, so a simple, explainable rule beat a merge system; deleted rows stay in the sheet with a deletedAt timestamp.
Only the schema's leading columns must match, so hand-added columns on the right are tolerated, while a renamed header halts sync with a clear Bangla banner instead of writing bad data.
Account chooser, Drive, Picker, and Sheets mocks make the entire product testable in a browser without an OAuth client and let two profiles rehearse the sharing flow.
The key decision: Use the owner's Google Sheet as the only backend.
The implementation had to prove the model
I delivered the work across the full path: Specified the product from an approved HTML prototype and rebuilt it in TanStack Start with TypeScript, Tailwind CSS v4, shadcn/ui, and Hugeicons across mobile, tablet, and desktop layouts. Designed the Zod-driven ledger schema that doubles as the sheet column contract, the per-ledger Dexie store, the single repository write path, and live-query hooks. Implemented the sync engine with header verification, last-write-wins merge, duplicate-append protection, and nine Node.js test runner cases covering rows, merge, and the full cycle. Built Google Drive, Sheets, Picker, and Identity Services adapters plus a complete localStorage mock, QR and link sharing with member management, Excel export, and a print view. Wrote the Bangla copy, numeral, date, and lakh-grouped currency formatting, custom form validation, PWA manifest and offline shell, social preview assets, and deployed to Netlify with secrets from Infisical.
The result is concrete: Families can record who gave what at weddings, aqiqahs, and birthdays from any phone, offline, and see per-event received, given, and unopened-envelope summaries. The ledger stays in the owner's Google Drive as an editable spreadsheet, with the app holding only drive.file access and no server-side copy. Multiple relatives write to the same ledger through a QR link, and conflicting edits resolve predictably without duplicate rows. The complete workflow, including sharing and sync failure simulations, runs in mock mode without Google credentials, and nine automated sync tests guard the merge and cycle logic. The app is live at giftbook.netlify.app as an installable PWA with a fully Bangla interface, including numerals and currency.
The senior engineering lesson was that solving the visible workflow is only half the job. The architecture must also make constraints, failure modes, evidence, and ownership explicit enough for the next change to remain safe.
