2026·Founding Engineer at Crescentia One LLP
Production E-commerce Platform
End-to-end e-commerce platform for a Gen Z clothing brand, built as Founding Engineer at Crescentia One LLP
- Next.js
- Express.js
- TypeScript
- PostgreSQL (Neon)
- Prisma
- Better Auth
- Razorpay
- Delhivery
- Cloudflare R2
- Hetzner
- Vercel
The problem
A Gen Z clothing brand wanted a custom storefront that could express their visual identity and scale with the catalog as they grew. Shopify was the obvious starting point, but the templates constrained the look they wanted, and the platform fees and tier limits would bite as catalog and traffic scaled. They came to Crescentia One LLP for a custom build that gave them full control of the storefront design, the admin tooling, and the underlying infrastructure cost curve.
Architecture
The storefront is Next.js on Vercel, talking to an Express backend that runs on a Hetzner VM. The admin dashboard is a separate Next.js app on Vercel, sharing the same backend. Postgres lives on Neon (serverless, branchable for staging). Prisma sits between Express and the database. Authentication is Better Auth with email plus Google OAuth. Razorpay handles checkout, with the verify step gated on HMAC SHA-256 signature validation against the raw request body buffer. Delhivery handles shipping. Product images live in Cloudflare R2 and are served directly from R2's CDN, which avoids egress charges entirely.
The order lifecycle moves through PENDING, PROCESSING, SHIPPED, DELIVERED, with CANCELLED reachable from any state. Carts persist server-side, so a logged-in user has the same cart on any device. The admin dashboard exposes order management, product CRUD, coupon rules, support inbox, and a daily visitor analytics view fed by a node-cron job.
What I owned
Architecture and infrastructure decisions across the whole stack. The Express backend in full (controllers, routes, payment integration, Razorpay webhook verification, support and email flows via Resend, rate limiting, the cron scheduler). End-to-end deployment, including the Hetzner setup, R2 bucket configuration, and the Vercel deploys for both Next.js apps. Client engagement and engineering leadership across the build. The Postgres schema and Prisma layer, the Better Auth setup, and the storefront frontend were built by a teammate.
Hardest technical decision
The product schema. The catalog needed variants by size and colour, inventory tracked per SKU, pricing that could differ per variant, and image associations that sometimes belong to a variant and sometimes to the whole product. Cart items had to reference variants, not products, but order line items needed enough denormalised product data to survive future product edits without rewriting history. Getting this right upfront mattered because every controller (cart, checkout, admin, analytics) reads from it. I went with a Product / ProductVariant split with a separate Image table that can attach to either, and order line items snapshot the variant's price and key product fields at the time of order. The other contender was an EAV-style attribute model, which I rejected because it would have made every catalog query painful for no real flexibility win at this catalog size.
The other recurring decision was on the client side. Continuous follow-ups, scope conversations, and translating "we want it to feel premium" into specific design and behaviour calls. Less glamorous than the schema work, but it shaped what got built more than any single technical choice.
What I'd do differently
Treat the order lifecycle as an explicit, idempotent state machine. Right now the PENDING to PROCESSING to SHIPPED to DELIVERED transitions are spread across controllers and depend on the Razorpay webhook firing exactly once. In practice webhook retries happen, and a clean state machine with idempotency keys would have prevented the edge cases I patched reactively (duplicate cart clears, double order updates on retry). I would also pull transactional emails (Resend) off the request path into a background job. A Resend hiccup currently has a small chance of slowing or failing order placement, which it should never be able to do.
Other projects
WhatsApp PharmAgent
AI pharmacy assistant on WhatsApp with multi-pipeline orchestration over Azure
- Master orchestrator on Azure Functions routes incoming WhatsApp messages between three pipelines, invoice OCR, voice billing, and natural language inventory queries.
- Architected the data layer across 4 Cosmos DB containers (inventory, transactions, invoices, sessions) with phone-number partitioning and a session-based confirmation flow that survives function restarts.
- Recognised in the Top 250 globally at Microsoft AI Unlocked 2026.
- Python
- Azure Functions
- Azure OpenAI (GPT-4.1)
- Cosmos DB
- Document Intelligence
- Speech-to-Text
GoYaana Travel Chatbot
Conversational AI travel planner on AWS Lambda with LLM-driven itinerary generation
- Built a serverless Java 21 backend on AWS Lambda that plans end-to-end trips from Bangalore to 118+ destinations, deployed via AWS SAM with API Gateway.
- Used a dual-LLM strategy on Groq (Llama 3.3 70B for routing and date extraction, Llama 3.1 8B for batch description generation) to keep itinerary generation under the 29-second API Gateway timeout.
- Containerised a Python Gradio frontend in Docker with FPDF2 and DejaVu fonts for Unicode and rupee support in downloadable PDF itineraries.
- Java 21
- AWS Lambda
- AWS SAM
- API Gateway
- Groq (Llama 3.3 70B + Llama 3.1 8B)
- Python
TrackWell
Cross-platform mobile app for AI-powered nutrition tracking, fitness planning, and GPS-tracked activity
- Three distinct Gemini AI integrations: vision-based food recognition from camera images, personalised daily fitness plan generation from onboarding inputs, and weekly health insights synthesised from 7 days of tracking data.
- Real-time GPS walk tracker with foreground location streaming, Haversine-based distance calculation, and MET-based calorie estimation that uses the user's actual weight rather than a fixed multiplier.
- Production touches across the app: 6-hour cache on weekly AI insights to keep API costs sane, debounced FatSecret OAuth 1.0 search, Clerk auth with Google OAuth, scheduled local notifications, and per-day log persistence in Firestore.
- React Native (Expo SDK 54)
- TypeScript
- Expo Router
- Google Gemini 3 Flash
- Clerk
- Firebase Firestore