The journal
Honest notes from shipping a real product. The practices I fought, the incidents I survived, the lessons that only made sense months later — and, sometimes, where my head actually is.
29 of 29 entries shown
A cold LinkedIn message turned into a referral, the referral turned into a Java full stack interview I'm not qualified for on paper, and I crammed for one night to get there. The interviewer overslept. Then the only answer that came out without effort was the architecture nobody had to remind me about.
I started counting my prompts. One prompt gets a working prototype. A few more get you to 85%. Then the curve flattens and the remaining stretch can take hundreds — and almost none of them are feature requests. They're me correcting things the model assumed.
Our first real school used the app for a week and sent back thirteen points of feedback. Not one of them was about architecture. Almost all of them were about the model of the world I had quietly assumed while building it.
A diary entry, not a lesson. I got most of the things I once wished for, and I still feel like I'm waiting. This is the honest state of me in August 2026.
I didn't write code by hand for two years. I knew the architecture, I shipped constantly, and I let AI do the rest. Then someone asked me the basics and I had nothing. This is the honest version.
The payment integration worked. Money moved, subscriptions activated. Then someone asked me how the backend knows a payment is genuine, and I heard myself say the word 'decrypt'. There is no decryption anywhere in it — and the code had been working fine without me understanding that.
My payment flow confirmed the payment from the browser. Which is fine, until someone pays and closes the tab before the browser gets a chance to tell my backend. Money captured, account never activated — the worst kind of bug, because from the outside it looks like nothing happened at all.
I got the JNTUGV gold medal for the highest marks in AIML across every affiliated college. I had a rant drafted, with the line already written: recognition after success doesn't erase how they treated me before success. I didn't post it — because when I look at the medal, I don't see them.
I was working on two tickets and I stayed on the same branch for both, because they touched completely different files. That was the assumption that broke. I asked it to raise a PR, it pushed into development instead, and I only found out the next morning.
My lead read one AI-generated migration for five seconds and asked why I was adding a column for data we already store. I had no answer. That question became a full schema audit.
A search bug in the faculty tab got fixed in the frontend, by loading all 1000 records into the browser and filtering there. There was no API call at all. I never read the ticket.
Gender is a dropdown — three options. The 'top-tier' model guarded it with a length check that accepts 'banana', then burned 100k tokens answering a question I never asked. This is the intelligence we're told will take our jobs.
Our backend goes route to controller to service to repository to adapter. The AI skipped a link and imported the adapter straight into the service. It ran perfectly, so I missed it.
We started on Firebase, single-tenant. Then schools with multiple branches showed up and one portal had to hold all of them without ever leaking data between them.
Every schema change has to update both the migration and the base schema, so I would ask Claude each time. Then I stopped asking, and the two quietly drifted for months.
I automated the schema-sync check with a hook and trusted it completely. Months later the tables had drifted again. The hook lived in the backend folder — but I do most of my work from the frontend, a separate repo with its own Claude session, where it never once fired.
We cut plan prices for rural schools and shipped the change to the landing page, deliberately deferring the rest as a tracked follow-up. That was a reasonable call. It became a bug anyway — because 'the price' was never one thing to defer. It was three things wearing the same name, in two repositories.
I finished the subscription flow and I was proud of it. Checkout worked, signatures verified, the webhook activated the school. Then my lead asked where the auto-renewal option was, and I realised I'd built a payment — not a subscription. The gap wasn't in the code. It was in what nobody had written down.
The principal gave us the quiz idea and my brain went straight to screens and scoring. Jagan sir gave it a name, a subdomain, a logo and a completely different pitch.
A principal's challenge, a prototype built in secret, and 300 students live on event day. How our quiz platform was born.
My tracking system was a notepad app and my own memory. The notepad never forgot anything, but it never calculated anything either.
Claude built me a school dashboard with beautiful graphs and it rendered fast on my screen. Then my lead asked why one page was hitting the backend so many times.
Years of typing his paint-contract bills into MS Word with a calculator in hand. The mistakes were always in the same place, and it was never the typing.
My frontend was showing pages and the backend was still sending the entire list every time. It looked complete and it was not complete.
A discount was approved. The certificate froze it as ₹0. Nothing in the code was wrong — new Date() is what every codebase writes. But the database stamps its own time, my machine was 0.76 seconds behind, and for a fraction of a second an approval that already happened looked like it hadn't.
The payment was correct, the database was correct, nothing crashed. The receipt was answering the wrong question.
I thought tests were for finding bugs. Then I fixed one small thing and broke something completely unrelated, in code I had no reason to open.
My lead pulled me up on the same font and colors in every PR review. I thought it was the least important part of the ticket.
I thought it was busywork. The text was right there in the component, so why move it. Then a school asked for the product in their regional language.