SYSTEM: ONLINESESSION: ACTIVEUPTIME: ∞
MODE: EXPLORATION23:03:06v3.1.0

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.

REACT
DB
API
GIT
NODE
MONGODB
LOGIC
UI
CORE
EXPLORE SYSTEM
[HISTORY]The first computer bug was a literal moth found in a Harvard Mark II in 1947.[JS]NaN in JavaScript is not equal to itself: NaN === NaN // false.[WEB]There's no semicolon in HTML. The HTML spec officially requires no semicolons in XML entity syntax.[JS]JavaScript was created in 10 days by Brendan Eich in 1995. Originally called Mocha, then LiveScript, then JavaScript.[ARCHITECTURE]The 'Gang of Four' design patterns book has sold over 500,000 copies.[CAUTION]A 'while(true)' loop that doesn't break will max out a CPU core at 100%. Ask me how I know.[OPS]DevOps engineers deploy on Friday if they hate themselves.[HISTORY]The first website ever is still online: info.cern.ch — published August 1991.[REACT]React was first used on Facebook's News Feed in 2011, open-sourced in 2013.[LANGUAGES]There are ~200 programming languages in active use. You only need to argue about 4 of them.[DATABASES]MongoDB's name comes from 'humongous.'[FUN]Nike's 'Just Do It' slogan was coined by an advertising exec named Dan Wieden — same week his company was losing its biggest client.[TOOLS]Git was created in 2005 so Linus Torvalds could maintain the Linux kernel after the previous VCS (BitKeeper) revoked its free license.[WINDOWS]The 'Blue Screen of Death' in Windows actually contains a QR code since Windows 10 — pointing to a help page.[TRUTH]Programmers' least favorite thing: other programmers' code. Most favorite: their own code from 2 years ago.[WORDS]The word 'robot' comes from the Czech 'robota', meaning 'forced labor.'[PROTOCOLS]Elephant in the room: HTTP 418 'I'm a teapot' is a real status code defined in RFC 2324 as an April Fools' joke.[TRUTH]The average developer spends 40% of their time typing — the rest is meetings, wondering where the bug is, and coffee.[TRUTH]According to Stack Overflow's survey, 'bad documentation' is the #1 obstacle to coding after 'I forgot to sleep.'[OPS]Notification sounds exist because someone once missed a deploy while the kettle was boiling.
// // TERMINAL

Nimesh Terminal

Nimesh Terminal

nimesh@build-system:~
v1.0.0
Type 'help' to see available commands.
>

Use ↑↓ for history · Tab to autocomplete · Ctrl+L to clear

// SYSTEM PROFILE

Who am I?

Who am I?

The running config of a developer who treats learning like a compiler — input, process, output, repeat.

System Profile v1.009/10/2026, 23:02:55
IDENTITYNimesh Dhungel
ROLEFull-Stack Developer
PRIMARY STACKReact / Node / Express / MongoDB
CURRENT MODEBuilding + Learning + Experimenting
INTERESTSystems / Interfaces / Products
MINDSET
UnderstandBuildBreakFixImprove
All systems operational

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.

8+PROJECTS SHIPPED
6TECH STACKS
CONSTANTLY LEARNING

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.

// DEVELOPER DNA

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.

neural.map — 40 nodes / 66 links
FrontendBackendDatabaseREST APIUIJavaScriptTypeScriptPythonDartReactNext.jsFramer MotionNode.jsRedux ToolkitTipTapAuthExpressStyled Comp.GitGitHubCSSFormikTailwindBootstrapMUIAxiosFlutterReverbLaravelPHPDjangoFlaskMongoDBMongooseSQLiteSQLMySQLPostgreSQLRedisPrisma

tap a node to inspect it

youconnectedidle
// // BUILDS

Project Archive

Project Archive

Real products, real problems, real code.

★ FeaturedACTIVE

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.

SAAS / RESTAURANT OPS2024
First real production product with paying tenantsSubdomain-per-tenant architecture from day oneKOT/BOT tickets printing to physical kitchen printersPOS, KDS and loyalty in one unified dashboard

Tech Stack

LaravelBACKENDInertia.js + ReactFRONTENDTailwind CSSSTYLINGMySQLDATABASEReverb / PusherREAL-TIMERabbitMQQUEUESStripePAYMENTS

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
KDS Online
QUEUE4
Table 4NEW
0:00

2× Momo, 1× Chowmein

Table 2NEW
0:00

Dal Bhat Special

Table 4NEW
2:34

2× Momo, 1× Chowmein

Table 7NEW
1:12

Butter Chicken, Naan ×2

TakeawayNEW
0:45

3× Samosa, 1× Lassi

BUILDZILLA

ACTIVE

Buildzilla 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.

MERN / CONFIGURATOR2024
Socket-level compatibility engine built from scratchThe demo on this very page runs the same rulesStripe-backed cart end to end

Stack

ReactUINode.jsRUNTIMEExpressAPIMongoDBDATABASEStyled ComponentsSTYLINGFormik + YupFORMS
Compatibility Demo
CPU
Mobo
RAM
GPU

Pick components to test

Features

  • Build configurator with compatibility engine
  • Products & cart with Stripe checkout
  • Benchmarks, trends & guides
  • Community forums & completed builds

ETERNAWRIST

COMPLETED

Earlier 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.

DJANGO / ECOMMERCE2023
The project that taught me full-stack fundamentalsDjango ORM, sessions and templates end-to-end

Stack

DjangoBACKENDPythonLANGUAGEHTML/CSSTEMPLATESBootstrapUI
eternawrist.com/shop
ETERNAWRIST
WatchesCollections
3

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

ACTIVE

Built 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.

NEXT.JS / NGO2025
First nonprofit build — different problem spaceBuilt together with my brotherEverything editable from an admin layer

Stack

Next.jsFRONTENDMongoDBDATABASEMongooseODMExpressAPITipTapRICH TEXTTailwind CSSSTYLING

Features

  • Content & program pages
  • MongoDB-backed data model
  • Node API with security middleware
  • Rich-text editing with TipTap
// // BUILD LOG

Build Log

Build Log

The development journey — one project, one commit at a time.

BUILDLOG // 0012023-03-10EternaWrist
IDEA

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.”

BUILDLOG // 0022023-04-02EternaWrist
IMPLEMENTATION

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.”

BUILDLOG // 0032023-06-15EternaWrist
RESULT

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.”

BUILDLOG // 0042024-05-02RestroSanjal
IDEA

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.”

BUILDLOG // 0052024-05-18RestroSanjal
ARCHITECTURE

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.”

BUILDLOG // 0062024-07-09RestroSanjal
IMPLEMENTATION

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.”

BUILDLOG // 0072024-08-01RestroSanjal
BUG

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.”

BUILDLOG // 0082024-08-12RestroSanjal
DEBUGGING

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.”

BUILDLOG // 0092024-09-01RestroSanjal
RESULT

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.”

BUILDLOG // 0102024-09-15Buildzilla
IDEA

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.”

BUILDLOG // 0112024-10-02Buildzilla
ARCHITECTURE

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.”

BUILDLOG // 0122024-10-20Buildzilla
IMPLEMENTATION

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.”

BUILDLOG // 0132024-11-08Buildzilla
BREAKTHROUGH

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.”

BUILDLOG // 0142024-12-01Buildzilla
RESULT

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.”

BUILDLOG // 0152025-01-20NovaFoundation
IDEA

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.”

BUILDLOG // 0162025-02-05NovaFoundation
ARCHITECTURE

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.”

BUILDLOG // 0172025-02-22NovaFoundation
IMPLEMENTATION

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.”

BUILDLOG // 0182025-03-10NovaFoundation
RESULT

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

Bug Lab

Professional-grade postmortems from ships that fought back.

postmortems: 8
// // ARCHITECTURE

How It All Connects

How It All Connects

React Component
State
Event Handler
Axios Call
Response
UI Update

6 steps · Frontend Flow

// TOOLBOX

The Toolbox

The Toolbox

The layers I build with — and how honestly I know each one.

INTERFACE

01

layer.interface

  • Reactcomfortable
  • Next.jsworking
  • Flutterworking
  • HTMLcomfortable
  • CSScomfortable
  • Tailwind CSScomfortable
  • Bootstrapcomfortable
  • Material UIworking
  • Framer Motionworking
  • Styled Componentsworking
  • TipTapworking

LOGIC

02

layer.logic

  • JavaScriptcomfortable
  • TypeScriptworking
  • Node.jscomfortable
  • Express.jscomfortable
  • Pythonworking
  • Djangoworking
  • Flaskexploring
  • Dartworking
  • PHPexploring
  • Laravelworking
  • Reverb / WebSocketsworking

DATA

03

layer.data

  • MongoDBcomfortable
  • Mongooseworking
  • SQLworking
  • MySQLworking
  • PostgreSQLworking
  • SQLiteworking
  • Redisworking
  • Prismaexploring
  • REST APIscomfortable

ENGINEERING

04

layer.engineering

  • Gitcomfortable
  • GitHubcomfortable
  • JWT Authworking
  • Axioscomfortable
  • Redux Toolkitworking
  • Formikworking
  • Vitecomfortable
  • Dockerexploring
  • Linux (Ubuntu)working
  • nginxworking
  • PM2working
  • npmcomfortable

Also on the bench

20 tools
VS CodeChrome DevToolsiTerm + ZshPostmanFigmaMongoDB CompassMySQL WorkbenchpgAdminVercelCloudflare PagesGitHub ActionsPM2nginxUbuntu VPSDockerStripeRabbitMQMapbox GL / MapLibreTraccarPusher / Reverb

Labels are honest. No fake percentages — just where I actually am.

// CODE ARCHIVE

Code Archive

Code Archive

Small pieces of code that taught me something.

middleware/tenant.jsjavascript
// 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.

#multi-tenant#middleware#saas#express
engine/compat.jsjavascript
// 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.

#compatibility#buildzilla#rules#validation
middleware/auth.jsjavascript
// 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.

#auth#jwt#middleware#protected routes
models/pricePoint.aggregate.jsjavascript
// 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.

#mongodb#aggregation#charts#voltgrid
hooks/useDebounce.tstypescript
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.

#react#hooks#search#performance
// // EXPERIMENT LAB

Lab

Lab

visual

Color System Generator

Tweak hue, saturation and lightness to compile an entire UI palette in real time.

interactive

API Request Visualizer

Step through a request as it travels from client to server to database and back.

visual

CSS Playground

A live canvas to stretch CSS properties and watch boxes bend to your will.

interactive

REST vs WebSocket

Compare request/response REST with a persistent WebSocket connection — and see how overhead multiplies as messages pile up.

interactive

Sketchpad

A minimal canvas experiment with undo, colors and pressure-free doodling.

utility

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

How I Build

01

UNDERSTAND

What exactly are we solving?

02

MODEL

How should the system behave?

03

BUILD

Turn the architecture into code.

04

BREAK

Find where assumptions fail.

05

DEBUG

Trace the system.

06

IMPROVE

Make the final solution cleaner.

Understood. Modelled. Built. Broken. Debugged. Improved.
That's how systems become real.

// // OFF THE STACK

Off the Stack

Off the Stack

Not everything about a developer should be code.

Music

Cursor lo-fi coding mix

"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."

// // CLASSIFIED

Inside the Lab

Inside the Lab

Some things aren't ready to be labeled yet.

● Surprise_2027access: restricted
build: #secretencryption: aes-256visibility: you_only
// // CONNECT

Open a Connection

Open a Connection

Available for:

  • Freelance development
  • Frontend work
  • React projects
  • Node.js APIs
  • Bug fixing
  • Website development
  • Small full-stack projects