Projects

Full-stack applications, AI systems, and programming language implementation focusing on robust backend engineering.

Shopify Multi-Store Analytics Platform providing real-time insights into sales performance, inventory health, and customer behavior through an intuitive dashboard.

React • Express.js • PostgreSQL • Prisma • Shopify API

Why I Built This

I built Metriq to solve a real problem I observed - merchants managing multiple Shopify stores had to log into each store separately to check analytics. This was time-consuming and made it difficult to get a unified view of their business. I wanted to create a single dashboard where they could see all their stores at once.

Challenges Faced

The biggest technical challenge was implementing proper multi-tenancy architecture. Each user should only see their own stores' data, and the database queries needed to be efficient even with thousands of products and orders. I also had to handle Shopify's API rate limits carefully while syncing data in real-time.

What I Learned

This project taught me a lot about database design for multi-tenant applications, implementing JWT authentication properly, and working with external APIs. I learned how to structure a React application for scalability and how to use Prisma ORM effectively with PostgreSQL.

Technical Decisions

I chose Prisma because it provides type-safe database queries, which caught a lot of potential bugs during development. For authentication, I went with JWT tokens stored in httpOnly cookies for better security. I used Neon serverless PostgreSQL for easy scaling and automatic connection pooling.

WasteGuard

Citizen-driven waste reporting system enabling users to report waste via image uploads with AI verification, streamlining municipal cleanup workflows.

FastAPI • Node.js • React • YOLOv8 • MongoDB

Why I Built This

During the Rajasthan Police Hackathon, we identified waste management as a critical issue in cities. Citizens often report garbage but have no way to track if it was cleaned up. We wanted to create a transparent system where AI verifies both the complaint and the cleanup.

Challenges Faced

Training the YOLOv8 model was challenging - we had to manually annotate 16,880 images of different types of waste. Getting 83% precision required multiple iterations of training and data augmentation. Integrating geolocation with MongoDB's geospatial queries was also new to me.

What I Learned

This project was my introduction to computer vision and ML model training. I learned how to curate datasets, annotate images in YOLOv8 format, and optimize model performance. I also gained experience with FastAPI for building ML model APIs.

Technical Decisions

We chose YOLOv8 because it offers a good balance between accuracy and inference speed. FastAPI was perfect for serving the ML model because of its async capabilities. MongoDB's geospatial indexing made location-based queries very efficient.

Production-ready URL shortening application with custom slug generation, session-based authentication, and comprehensive analytics dashboard.

React 18 • TypeScript • Express.js • PostgreSQL • Drizzle ORM

Why I Built This

I wanted to build a URL shortener to understand how they work under the hood. Services like Bitly are great, but I wanted to add analytics features and learn about handling high-volume redirects efficiently.

Challenges Faced

Implementing rate limiting for anonymous users while allowing unlimited access for authenticated users required careful session management. The analytics system needed to capture click data without slowing down redirects. Geographic data from IP addresses had accuracy issues.

What I Learned

I learned how to use Drizzle ORM with TypeScript for complete type safety. Implementing efficient database indexes for fast URL lookups was crucial. I also learned about session-based authentication and how to use express-rate-limit middleware.

Technical Decisions

TypeScript was essential for catching bugs early. Drizzle ORM provided better TypeScript integration than Prisma for this use case. I used Recharts for analytics visualization because it's lightweight and works well with React 18.

Lost & Found

Community item recovery platform with multi-image uploads, real-time search, and privacy-first design.

React 18 • TypeScript • Express.js • PostgreSQL • ImageKit CDN

Why I Built This

On our campus, people frequently lose items but there was no centralized system to report and find them. I built this platform to help students recover lost items quickly and efficiently.

Challenges Faced

Image upload optimization was critical - users were uploading large photos from their phones. I implemented client-side WebP compression to reduce file sizes by 95% before uploading to ImageKit CDN. The secret password verification system needed to be secure without exposing the actual password.

What I Learned

< p>This project taught me about image optimization techniques, CDN integration, and client-side compression. I learned to use TanStack Query for efficient data fetching and caching. The search functionality taught me about implementing full-text search in PostgreSQL.

Technical Decisions

ImageKit CDN was chosen for its automatic image transformations and global delivery. Client-side compression with WebP reduced bandwidth costs significantly. TanStack Query made the app feel faster with smart caching.

SupportBotAI

AI-powered customer support bot with contextual memory, FAQ matching, and automatic escalation handling.

Node.js • TypeScript • AI/LLM • React

Why I Built This

I wanted to explore LLMs and build something practical. Customer support seemed like a perfect use case where AI could handle common questions while escalating complex issues to humans.

Challenges Faced

Maintaining conversation context across multiple messages was tricky. The AI needed to remember previous interactions and provide relevant answers. Deciding when to escalate to human support required careful prompt engineering.

What I Learned

This project was my introduction to working with LLMs. I learned about prompt engineering, conversation management, and streaming responses. Session management with context retention was a new concept for me.

Technical Decisions

TypeScript helped manage the complex state of conversation sessions. Storing sessions in memory with a simple cleanup strategy worked for the MVP. The FAQ matching system uses semantic search to find relevant answers.

SimpleLang

A complete programming language implementation with lexer, parser, optimizer, bytecode compiler, and stack-based virtual machine. Features constant folding and strength reduction optimizations.

C++ • CMake • Ninja • GCP

Why I Built This

I wanted to understand how programming languages work from the ground up. Building a complete language - from tokenization to execution - seemed like the best way to learn about compilers, interpreters, and language design. I chose to build a simple but complete system to focus on understanding the core concepts.

Challenges Faced

The biggest challenge was implementing the optimizer correctly. Constant folding had to preserve semantics while strength reduction (converting multiplications by powers of 2 to bit shifts) required careful analysis. Getting the bytecode generator to produce correct stack-based instructions while maintaining proper variable scoping was also tricky. Deploying it with a web interface on GCP required creating a safe sandbox.

What I Learned

This project taught me how compilers work internally - lexical analysis, parsing theory, AST manipulation, and code generation. I learned about different optimization techniques and when to apply them. Building the VM gave me deep insights into how code actually executes. The deployment taught me about process sandboxing and security considerations when running user code.

Technical Decisions

I chose C++ for performance and low-level control over memory. Stack-based bytecode was simpler to generate than register-based. CMake with Ninja provided fast builds. For the web deployment, I built a simple Node.js server that creates temporary .ml files, compiles them, and returns output - this keeps the language execution isolated.