ch. 01 — building

Building

Three projects, in roughly the order they mattered to me. Each one started as a notebook page.

p. 11
project · 01
shipped

Bookswagon — Flutter rebuild, end to end.

The existing app was a .NET WebView wrapper — every screen a web page in a mobile costume. Login broke. Checkout failed. The Play Store rating was near 1.8. It was averaging 3.4 orders a day. I rebuilt it alone in 8 weeks. By the end: 58 orders/day, 17×.

(a) the day the old app had to die

The turning point wasn't a single bug. It was reading review after review describing the same frustrations I was seeing myself. At some point I stopped asking "How do we patch this?" and started asking "Why are we making users suffer through this experience?"

Rebuilding became easier to justify than fixing.

(b) the first sketches

The first sketches weren't beautiful. They were boxes, arrows, and notes in a notebook.

  • Search immediately visible
  • Categories accessible without scrolling forever
  • Promotional content reduced and organized
  • Faster paths to discovery
  • Fewer actions competing for attention

One note that survived: "Use only 4–5 buttons in navigation."
I spent more time deciding what to remove than what to add.

emptywritingsaved
fig 1. home — boxes, arrows, removals

(c) why Provider + caching

Provider wasn't chosen because it was trendy. It was chosen because it was understandable. Bloc could have worked. Riverpod could have worked. But I wasn't trying to win an architecture competition. I was trying to ship a better app.

Caching mattered because users shouldn't wait for data they already downloaded five minutes ago. Performance improvements often come from avoiding work, not doing work faster.

(d) the biggest mistake

Two things. I underestimated drastically underestimated timelines. And I delayed testing.

When you're rebuilding quickly, shipping features feels like progress. Later, every change becomes harder because you don't have enough confidence in existing behavior.

Speed without verification eventually becomes slow.

(e) the moment the needle moved

The biggest jump didn't come from one feature. It came from reducing friction at the two places users were dropping off: authentication and the view → cart moment.

OTP-first login. Faster product pages. Cached carts. Fewer fields. Each change small. Compounded, they moved orders from 3.4 to 58 a day.

growth — 8 weeks
orders / day
58+17×
from 3.4
mau
9.4K+2×
from 4.7K
day-7 retention
3.2×
onboarding
conversion
11.6%
mid-tier benchmark beaten
crash rate
<0.04%
staged rollouts
play store acq.
organic
Product View100%
Add to Cart35%
Checkout18%
Order Complete11%
every extra field is a conversion experiment
the funnel — red circle is the whole story
coreauthbillingsearchnotify
fig 2. feature-based flutter modules

Next.js + GraphQL Federation

in progress

On the platform side, I'm migrating the legacy web stack to Next.js (SSR/SSG) and designing a company-wide microservices architecture — Orders, Cart, Payments, Inventory, User — with event-driven communication. A GraphQL Federation BFF unifies these for web, mobile, and admin. The component library is built on MUI Base and Emotion with strict TypeScript and WCAG 2.1 AA baked in. First release cycle retired 30+ one-off components and cut page load by ~40%; the BFF alone cut JS payload by ~35%.

clientapi gatewayqueueworkerspostgres
fig 3. client → BFF → 5 services
appPOST /v1/notesdbrequestwrite
fig 4. the request, the write, the regret
representative commits
commit a3f9c1d
Author: yash
Date:   week 8
otp-first auth, fewer fields, faster failure
commit 812bd07
Author: yash
Date:   week 6
cache product images aggressively, invalidate on stock change
commit 9f4e2a1
Author: yash
Date:   week 4
rewrite cart as a single screen instead of three
commit 1c0a7b6
Author: yash
Date:   week 2
staged rollout — 5% / 25% / 50% / 100%
scar tissue — in the margin
lesson
The application was technically correct and practically wrong.
lesson
Every feature adds complexity. Every removed step adds clarity.
lesson
Mobile users are not web users with smaller screens. They're different users with different expectations.
lesson
The best onboarding flow is usually the shortest one.
lesson
A sketch costs five minutes. A wrong implementation costs weeks.
project · 02
fintech

Pazy — automating the boring, expensive things.

B2B fintech. I joined as a Frontend Developer, ended up shaping API contracts, the design system, and a reconciliation pipeline that cut a finance team's manual work by 4–5×.

UTR reconciliation — hours to under 5 minutes

typescript · rest

ⓘ A UTR is the Unique Transaction Reference on a bank transfer. Matching UTRs from bank statements to invoices is what tells a finance team which invoice was actually paid.

Previously: someone downloaded a bank statement, opened it next to the invoices spreadsheet, and matched rows by hand. For a busy week, hours.

I built a TypeScript pipeline that ingested bank statements via REST, normalized the fields, and matched them against open invoices — first by exact UTR, then by amount + date proximity for the messy 5%.

Reconciliation time: hours → under 5 minutes.

clientapi gatewayqueueworkerspostgres
fig 5. bank → parser → matcher → invoices

Invoice automation + OCR reimbursements

Self-service invoice filtering/export (CSV/ZIP) reduced manual vendor requests by 60%. The reimbursement system parsed bulk uploads with OCR and supported multi-currency, accelerating submissions 5–10×.

The lesson from OCR: never trust a number you didn't double-check. The UI made it trivially easy to correct a misread cell inline.

Vue/Nuxt design system + 20+ reusable components

The codebase had drifted — duplicated buttons across screens, inconsistent tables, no shared tokens. I modernized 20+ components, drove design system adoption, and mentored engineers on the patterns.

The hardest component to standardize was the data table — every team needed it slightly differently. The trick was giving it composition, not configuration.

Co-designing the API while it was being built

The backend team was still designing the payment reconciliation APIs. Instead of waiting for a finished spec, I joined their design sessions and shaped the contract around what the UI actually needed. We documented it in the component library so the next person wouldn't have to guess.

Finding the gap between what's being built and what actually needs to connect — that's the work I enjoy most.

impact
reconciliation
<5 minfrom hours
utr matching
reimbursements
5–10×
bulk + ocr
vendor requests
−60%
self-service exports
form errors
−50%
inline validation
components
20+
standardized
manual ops
−4–5×
finance team
users.db
fig 6. the reconciliation graph
lesson
Co-designing the API was more valuable than building any component. The interface that isn't built yet is the cheapest one to change.
project · 03
college

ShareBoard — the first time I felt like a builder.

In college, before practical exams, our entire class had this strange ritual. We'd prepare dozens of possible programs in advance and store them on a tool called DontPad. If someone got a specific question, they could open the matching link and copy the code.

The problem was that DontPad only supported plain text. No images. No formatting. And anyone with the link could edit everything. One accidental change could ruin the entire document.

So I built ShareBoard — a collaborative board where people could add code, images, notes, and formatted content. The creator could switch between edit and read-only modes, protecting the board from unwanted changes during the exam.

What I remember most isn't the code. It's watching people actually use it. For the first time, something I built solved a real problem for real people. That's when software stopped feeling like assignments and started feeling like something I wanted to keep doing.

The name came from the difference between the old tool and what I wanted to build. A pad lets you write. A board lets you pin anything — text, images, notes, ideas. So I called it ShareBoard.

// program 3 — binary search
int binarySearch(int arr[], int n, int x) {
  int l = 0, r = n - 1;
  while (l <= r) { ... }
the board, mid-practical, full of code
the feeling i chase
50+ classmates opened my app, shared their code, helped each other. Not because of the tech, but because I'd identified a real pain point and actually fixed it for people around me.
also in the morgue

Things half-built, waiting their turn.

  • FlowForge — extract the essence of a chat and make it portable across models.
  • YouTube distraction extension — stay aligned with what you intended to watch.
  • Web Time Machine — resurrected from the notebook years after the first sketch.
~ $ ls morgue/
flowforge/ youtube-ext/ web-time-machine/
reader-only-highlights/ nudge-app/ ...
~ $ wc -l morgue/*/idea.md
142 total
~ $ echo 'most stay dead. some come back.'
most stay dead. some come back.