NIMESH // BUILD SYSTEM
NIMESH DHUNGEL
FULL-STACK WEB DEVELOPER
REACTNODE.JSMONGODB
buildi
I design, build, and ship full-stack web apps — React on the front, Node.js and MongoDB behind it — turning rough ideas into systems that actually work.
Nimesh Terminal
Nimesh Terminal
Use ↑↓ for history · Tab to autocomplete · Ctrl+L to clear
Who am I?
Who am I?
The running config of a developer who treats learning like a compiler — input, process, output, repeat.
NOW → building RestroSanjal · exploring Next.js · learning NestJS
I'm a developer who enjoys turning ideas into working systems. I like understanding what happens behind an interface just as much as designing the interface itself. Most of what I know came from building things, breaking them, and figuring out why.
what you're looking at is the live state of a system named Nimesh — currently compiling experience, shipping experiments, and occasionally writing code that works on the first try.
How Everything Connects
How Everything Connects
A living map of the technologies and concepts I work with — hover a node to see how it's wired into the rest of the system.
tap a node to inspect it
Project Archive
Project Archive
Real products, real problems, real code.
RESTROSANJAL
Restaurant & Hotel SaaS Platform
RestroSanjal is a multi-tenant SaaS platform that runs restaurant and hotel operations end-to-end. It unifies the tools restaurants juggle separately — POS with table and floor management, a live kitchen display system with KOT/BOT ticket printing, QR-code table ordering, inventory and supplier tracking, a loyalty program, payroll, and hotel bookings — into a single subdomain-per-tenant system.
Tech Stack
Features
- Multi-tenant SaaS with subdomain support
- POS with table management & floor plans
- Kitchen Display System with KOT/BOT printing
- QR-code table ordering
- Hotel management (rooms/bookings)
- Inventory & suppliers
- Loyalty program
2× Momo, 1× Chowmein
Dal Bhat Special
2× Momo, 1× Chowmein
Butter Chicken, Naan ×2
3× Samosa, 1× Lassi
BUILDZILLA
ACTIVEBuildzilla is my flagship full-stack project — a MERN platform for building custom PCs. Its core is a compatibility engine that validates CPU, motherboard, RAM and GPU pairings against real socket and generation constraints, wrapped in price tracking, benchmarks, community forums and a completed-builds gallery. The interactive compatibility checker here on this page is the same idea in browser form.
Stack
Pick components to test
Features
- Build configurator with compatibility engine
- Products & cart with Stripe checkout
- Benchmarks, trends & guides
- Community forums & completed builds
ETERNAWRIST
COMPLETEDEarlier build — one of my first serious full-stack experiments.
EternaWrist was my first serious full-stack attempt. Built with Django, it covers the whole e-commerce lifecycle — product catalog with categories, a shopping cart, user authentication and admin-side product management. It is where databases, sessions and server-rendered templates stopped being theory and started being something I could ship.
Stack
Royal Chronograph
$2,490
Midnight Diver
$1,890
Heritage Classic
$3,200
Sport Titanium
$2,100
Features
- Product catalog with categories
- Shopping cart
- User authentication
- Admin management
NOVAFOUNDATION
ACTIVEBuilt with my brother — work for the NovaFoundation NGO.
NovaFoundation is an NGO site built with my brother — a Next.js platform for the foundation as it grows its programs and community. It combines a content site with structured program pages and a backend that will power the foundation’s operations as the organization scales.
Stack
Features
- Content & program pages
- MongoDB-backed data model
- Node API with security middleware
- Rich-text editing with TipTap
Build Log
Build Log
The development journey — one project, one commit at a time.
Why I learned Django for a watch shop
“Everything I had built until then lived in the browser. E-commerce touches a server, a database, sessions, money — I wanted to feel that under my hands instead of reading about it. A watch shop was the excuse to learn the whole loop.”
Catalog, cart, auth — the e-commerce trinity
“Django models for products, views rendered with templates, sessions carrying the cart, and a user auth layer on top. It was the first time databases stopped being theory and became something I could query on purpose.”
First real full-stack ship
“EternaWrist went live as a complete loop: browse, add to cart, register, order. It was small, but it was the first thing where every layer I touched was built by me.”
From restaurant problem to SaaS idea
“Watched restaurant owners juggle a POS, a kitchen display system, and bookkeeping in three separate tools. Thought: what if one system handled all of it? That single frustration became RestroSanjal.”
Multi-tenant: the domain + subdomain puzzle
“Every tenant gets a subdomain. Had to design DB scoping, middleware tenant resolution, and plan-based feature isolation before writing a single line of application code — because retrofitting multi-tenancy later is a rewrite dressed as a refactor.”
Kitchen Display System goes real-time
“KDS needed instant order updates shared between the kitchen and front staff. Used Reverb over WebSockets, with KOT/BOT printing flowing through an ESC/POS bridge. First time I saw a physical printer react to a web app — kind of magical.”
The QR code pointed at the wrong world
“Table QR ordering worked perfectly on localhost and broke the instant it hit production. The scan succeeded, the camera was fine — the payload itself contained a localhost URL that only existed on my machine.”
JWT refresh: a race through the stack
“Users were being logged out on refresh. Traced it from the auth context → localStorage → middleware. Turned out the token existed but was read a tick after the router had already declared the visitor a guest.”
v1.0 ships
“RestroSanjal went live for its first tenants. Reward: watching a real restaurant print a real KOT from my system. A portfolio is never finished — it just reaches a deployable state.”
A compatibility engine instead of a parts list
“Every PC builder I knew had a spreadsheet or a prayer. The idea was Buildzilla: not another parts catalog, but a rules engine that catches the CPU-motherboard mismatch before the money leaves the card.”
Modelling socket truth
“The hard part was representing why a pairing fails: socket type, chipset generation, RAM speed ceilings, GPU length and PSU headroom. Each rule needed to be both a data model and a human-readable "why not" message.”
MERN pipeline + Stripe cart
“React storefront, Express API, MongoDB catalog, and a checkout flow wired to Stripe. The configurator and the transactional store finally shared one codebase instead of living on separate machines in my head.”
The configurator validates itself
“First live rejection: a user paired a Ryzen with an Intel board and got a stamped, reasoned "why not" instead of a blank error. The rules engine did its job unassisted — that was the moment it stopped being a feature and became the product.”
Deployed to a production VPS
“Buildzilla moved off my laptop: PM2 keeping the process honest, nginx terminating TLS, MongoDB backing the catalog. The same ideas that started as a spreadsheet problem ended as a deployed product you can actually hit.”
Building for a real NGO — with my brother
“A foundation asked for more than a landing page: program pages, an editor who should not need a developer, and a backend that can grow with the org. Also the rare chance to build something meaningful with my brother.”
Content + admin in one Next.js base
“The whole site in Next.js with MongoDB behind it, and an admin layer using TipTap so the foundation can edit everything themselves. Server-rendered pages for the public; a private editing surface for the team.”
Program pages, rich text, Mongo models
“Turned the wireframe into queryable data: programs as first-class models, content flowing from the editor into server-rendered pages. Everything the foundation edits today lands on the live site through the same pipeline.”
Live at novaglobal.cloud
“Since that first session the foundation has been publishing through the admin layer. Non-profit engineering is just engineering with a mission attached.”
auto-scroll · hover to pause
— build log continues. The next entry is probably being written right now —
Bug Lab
Bug Lab
Professional-grade postmortems from ships that fought back.
How It All Connects
How It All Connects
6 steps · Frontend Flow
The Toolbox
The Toolbox
The layers I build with — and how honestly I know each one.
INTERFACE
01layer.interface
- Reactcomfortable
- Next.jsworking
- Flutterworking
- HTMLcomfortable
- CSScomfortable
- Tailwind CSScomfortable
- Bootstrapcomfortable
- Material UIworking
- Framer Motionworking
- Styled Componentsworking
- TipTapworking
LOGIC
02layer.logic
- JavaScriptcomfortable
- TypeScriptworking
- Node.jscomfortable
- Express.jscomfortable
- Pythonworking
- Djangoworking
- Flaskexploring
- Dartworking
- PHPexploring
- Laravelworking
- Reverb / WebSocketsworking
DATA
03layer.data
- MongoDBcomfortable
- Mongooseworking
- SQLworking
- MySQLworking
- PostgreSQLworking
- SQLiteworking
- Redisworking
- Prismaexploring
- REST APIscomfortable
ENGINEERING
04layer.engineering
- Gitcomfortable
- GitHubcomfortable
- JWT Authworking
- Axioscomfortable
- Redux Toolkitworking
- Formikworking
- Vitecomfortable
- Dockerexploring
- Linux (Ubuntu)working
- nginxworking
- PM2working
- npmcomfortable
Also on the bench
20 toolsLabels are honest. No fake percentages — just where I actually am.
Code Archive
Code Archive
Small pieces of code that taught me something.
// Resolves the tenant from the subdomain and scopes every downstream query.// RestroSanjal: one codebase, one DB per plan, zero cross-tenant leaks.
const { Tenant } = require('../models/tenant');
// Attach the tenant to the request before route handlers or models run.async function tenantResolver(req, res, next) { const host = req.headers.host || ''; // "cafe-himal.example.com" const subdomain = host.split('.')[0];
if (!subdomain || subdomain === 'www' || subdomain === 'localhost') { return res.status(400).json({ error: 'Unknown tenant subdomain' }); }
try { const tenant = await Tenant.findOne({ subdomain }).lean();
if (!tenant || tenant.status !== 'active') { return res.status(404).json({ error: 'Tenant not found or inactive' }); }
// Stash on req so models/controllers can read it without parsing again. req.tenant = { id: tenant._id, plan: tenant.plan, subdomain };
// Every mongoose query in this request should apply this scope. req.scopeTenant = (query) => query.where({ tenant_id: tenant._id });
next(); } catch (err) { next(err); }}
// Usage in a route: scope instantly, no WHERE clause scattered everywhere.// router.get('/tables', tenantResolver, async (req, res) => {// const tables = await Table.find().where({ tenant_id: req.tenant.id });// res.json(tables);// });
module.exports = tenantResolver;Why I wrote this
RestroSanjal runs one codebase for many restaurants. This middleware is what turns a subdomain into a scoped, leak-proof data boundary.
// Buildzilla compatibility engine — one rule per pairing, composed at the end.
// Reality check: a CPU and mobo must share a socket AND a supported generation.const RESULT = { COMPATIBLE: 'compatible', WARNING: 'warning', INCOMPATIBLE: 'incompatible' };
function checkCpuMotherboard(cpu, motherboard) { // Same physical socket? No socket, no seat. if (cpu.socket !== motherboard.socket) { return { check: 'CPU <-> Motherboard Socket', status: RESULT.INCOMPATIBLE, detail: `${cpu.socket} CPU does not fit a ${motherboard.socket} board`, }; }
// Same socket but a locked-down board (B-series) with a K-series CPU? // It will slot in but can't overclock — a warning, not a hard fail. if (cpu.unlockedCore && motherboard.chipset.startsWith('B')) { return { check: 'CPU <-> Motherboard Socket', status: RESULT.WARNING, detail: `${motherboard.chipset} board slots it, but unlocked overclocking is off the table`, }; }
return { check: 'CPU <-> Motherboard Socket', status: RESULT.COMPATIBLE, detail: `${cpu.socket} socket supported`, };}
// Every part submits its checks; the builder aggregates them into one verdict.module.exports = { checkCpuMotherboard };Why I wrote this
A mismatched socket is the #1 way first-time builders waste money. This rule is the heart of the engine and the demo on this very page.
// Auth middleware: proves the token before any protected route runs.const jwt = require('jsonwebtoken');const { User } = require('../models/user');
const JWT_SECRET = process.env.JWT_SECRET; // never commit this
async function requireAuth(req, res, next) { const header = req.headers.authorization || '';
// Expect: "Bearer <token>". Anything else fails fast and loud. if (!header.startsWith('Bearer ')) { return res.status(401).json({ error: 'Missing authorization header' }); }
const token = header.slice('Bearer '.length);
try { const payload = jwt.verify(token, JWT_SECRET);
// Don't trust the payload alone — confirm the user still exists // and the token id matches the current session. const user = await User.findById(payload.sub).select('-password'); if (!user || user.sessionVersion !== payload.sessionVersion) { return res.status(401).json({ error: 'Session revoked' }); }
// Downstream handlers get req.user typed and free of token parsing. req.user = user; next(); } catch (err) { // Expired, malformed, or signed with the wrong secret. return res.status(401).json({ error: 'Invalid or expired token' }); }}
module.exports = { requireAuth };Why I wrote this
The JWT refresh race in the build log taught me auth is ordering. This middleware encodes the "wall before the route" rule on the server side.
// Build one 30-day price series from raw price-events collection.// Input: { modelId, price, capturedAt } Output: [{ date, avgPrice }]
const PRICE_EVENTS = 'price_events';
async function dailyPriceTrend(modelId, days = 30) { const since = new Date(); since.setDate(since.getDate() - days);
return PriceEvent.aggregate([ // 1. Only this model, only recent events. { $match: { model_id: modelId, captured_at: { $gte: since } } },
// 2. Bucket by calendar day using the date part of captured_at. { $group: { _id: { $dateToString: { format: '%Y-%m-%d', date: '$captured_at' } }, avgPrice: { $avg: '$price' }, samples: { $sum: 1 }, }, },
// 3. Pad missing days so the chart has no holes. { $sort: { _id: 1 } }, { $set: { date: '$_id' } }, { $unset: '_id' }, ]);}
// Chart-ready shape:// [{ date: '2025-06-01', avgPrice: 4525000, samples: 14 }, ...]module.exports = { dailyPriceTrend };Why I wrote this
VoltGrid's price tracker needed 7d/30d/90d/1y history without hammering the DB per point. One aggregation pipeline, one query.
import { useEffect, useState } from 'react';
// Returns a "settled" copy of `value` that only updates// after `delay` ms of silence. While the user types, the// previous value is kept, so no fetch fires mid-keystroke.export function useDebounce<T>(value: T, delay = 400): T { const [debounced, setDebounced] = useState<T>(value);
useEffect(() => { const timer = window.setTimeout(() => setDebounced(value), delay);
// Clear the pending timer on change or unmount — the // classic cleanup that prevents "setState on unmounted". return () => window.clearTimeout(timer); }, [value, delay]);
return debounced;}
// Usage in a search box:// const [query, setQuery] = useState('');// const debouncedQuery = useDebounce(query, 400);// useEffect(() => {// if (debouncedQuery.length >= 2) searchProducts(debouncedQuery);// }, [debouncedQuery]);Why I wrote this
Buildzilla search was spamming the API at full typing speed. Debouncing turned a network-per-keypress into a network-per-pause.
Lab
Lab
Color System Generator
Tweak hue, saturation and lightness to compile an entire UI palette in real time.
API Request Visualizer
Step through a request as it travels from client to server to database and back.
CSS Playground
A live canvas to stretch CSS properties and watch boxes bend to your will.
REST vs WebSocket
Compare request/response REST with a persistent WebSocket connection — and see how overhead multiplies as messages pile up.
Sketchpad
A minimal canvas experiment with undo, colors and pressure-free doodling.
AI Prompt Studio
Launches the AI Engineer — ask it about the projects, the stack and the bugs that tried to kill the build.
How I Build
How I Build
UNDERSTAND
What exactly are we solving?
MODEL
How should the system behave?
BUILD
Turn the architecture into code.
BREAK
Find where assumptions fail.
DEBUG
Trace the system.
IMPROVE
Make the final solution cleaner.
Understood. Modelled. Built. Broken. Debugged. Improved.
That's how systems become real.
Off the Stack
Off the Stack
Not everything about a developer should be code.
Music
"Some code has rhythm. Some days, the playlist writes the commits."
Drawing
canvas.getContext('2d') — oldest relationship in my frontend life.
"A sketch before a spec. Shapes before structures."
Thinking
"Some ideas arrive while coding. Others arrive while doing something completely unrelated."
Inside the Lab
Inside the Lab
Some things aren't ready to be labeled yet.