anchor invitations
An invitation web project built with Next.js and TypeScript.
I turn complex problems into
software that feels simple.
And find stories in everything else.
Products I’ve helped ship.
Problems I’ve enjoyed solving.
An invitation web project built with Next.js and TypeScript.
JD’s Lounge — a TypeScript web project.
Multi-warehouse inventory, audit trails, and low-stock alerts for B2B teams.
An automotive landing page built with HTML.
An event management web project built with Next.js.
An independent project in my GitHub collection.
I’m Shantanu. A backend engineer who cares about how things work — and how they feel.
I work at Kurlo Labs, building the systems behind real products. My work on Joyne spans payments, ticketing, authentication, and real-time data. I enjoy connecting the moving parts into something reliable.
My toolkit crosses Python, TypeScript, databases, and AI-powered workflows. Away from the keyboard, I’m usually noticing a frame worth capturing, getting lost in a film, or finding a song to keep on repeat.
Python / Node.js / FastAPI / Express / REST APIs
PostgreSQL / MySQL / Convex / SQL
TypeScript / Next.js / React / Angular
LLM integrations / Docker / Git / CI/CD
PyTest / Playwright / Postman / API testing
MCA · PES Modern College of Engineering, Pune
2023–2025 · GPA 7.89
B.Sc. Computer Science · College of Computer Science & IT, Latur
2020–2023 · GPA 9.75
Payments, data, and AI-assisted engineering.
Small ideas that make a difference.
The interesting work starts when events arrive late, twice, or out of order.
A successful checkout is only one moment in a payment lifecycle. The backend still needs to connect a transaction to the right registration, verify its authenticity, and decide what state a ticket should be in.
Treat incoming events as things that can repeat. Give each event a stable identity, verify it before acting, and make the state change safe to run again. A repeated notification should not create a second ticket or a second charge record.
Keep the payment record and ticket state easy to inspect. Clear logs and explicit states make it much easier to understand a failure than a single success flag ever will.
A product is not a stock count. A warehouse is not a product attribute.
The same product can exist in several warehouses. Keeping a product separate from its inventory lets each warehouse hold its own quantity without duplicating the product itself.
A junction table makes that relationship explicit. An inventory movement then becomes a change to a particular product and warehouse pair, with a record explaining what changed.
Correctness matters as much as query speed. Use atomic transactions for related writes, keep an audit trail, and store money in a decimal representation. These choices support the multi-warehouse model used in StockFlow.
Useful assistance comes from better questions and verifiable answers.
AI can help brainstorm edge cases, draft test ideas, and explain an unfamiliar failure. It is most useful when the task is specific and the expected behaviour is clear.
Generated tests still need review. A test that repeats an implementation may prove very little. A stronger test describes the behaviour that matters: an unauthorised request is rejected, a repeated event stays safe, or an invalid input leaves stored data unchanged.
Keep the feedback loop grounded in running code. Use AI to widen the search for mistakes, then use test results, logs, and the actual system behaviour to decide whether the work is correct.
Frames, films, and frequencies.
The things that keep me curious.
Sometimes the best thing to do
is stop, look, and take the shot.
A project, an idea, a great movie recommendation.
I’m always up for a good conversation.