hello, I am

Wahaj Ahmed

Full-stack engineer. I build React and Node systems that hold up past 100,000 users.

  • islamabad, utc+5
  • ~5h overlap with CET
  • open to roles and freelance
dataPostgres, DynamoDB, S3{ }</>fnservicesNode, GraphQL, RESTUIReact, Next.js, Tailwind
fig. 1: the full stack, exploded view. the case files below are what happened inside it.

capabilities

What I build

Four areas of work. The common thread is production: real users, real data, and the failure modes that only ever show up there.

Full-stack product engineering

core focus

React and Next.js in front, Node.js and GraphQL behind it. Production applications where one person owns the interface, the service, and the deploy.

  • React and Next.js frontends, Node.js and Express services
  • Client-facing dashboards and admin panels
  • Shared component libraries, documented in Storybook
  • End to end delivery, from design through deployment
  • TypeScript, JavaScript, Python, Java, SQL

APIs and service architecture

Services that deploy and scale on their own, behind contracts explicit enough that neither side breaks quietly.

  • GraphQL and REST APIs in microservice architectures
  • Standardized response shapes and reusable middleware
  • Scalable schemas and consistent data contracts
  • Pagination, filtering and sorting over large datasets
  • Role-based authorization with JWT and Clerk

Performance and reliability

Slow things made fast and silent failures made loud, measured in production before and after rather than estimated.

  • Code splitting, lazy loading and render optimization
  • TanStack Query caching and state management
  • Lighthouse and Core Web Vitals measurement
  • Structured logging with request correlation
  • Incident investigation down to root cause

Cloud and AI in production

Serverless backends that stay up and say something useful when they fail, and AI features built with the same care as the rest of the system.

  • AWS Lambda, SQS and S3, with DynamoDB and PostgreSQL
  • Scheduled pipelines and pre-signed URL delivery
  • MCP servers putting internal data inside the customer's Claude
  • OAuth with company, sector and per-user entitlement checks
  • CI with Jenkins and SonarQube, deploys on Vercel

case file 01

Scheduling for a district of 100,000 students

React, Node.js, GraphQL, AWS Lambda, SQS, S3, DynamoDB

ClientAPI GatewayCron, every 2hLambdaDynamoDBSQSS3504: timeoutreport built every 2h -> S3 -> pre-signed URL
errors down 90%

A scheduling system under enterprise load.

Full-stack scheduling for an enterprise tutoring platform: over 100,000 students per district, every one of them needing conflict-free assignments. Validation and consistency checks block conflicting or duplicate placements before they ever reach the database.

The diagram on the left is the real pipeline.

Then report exports started timing out.

Large districts produced datasets big enough that the request died at API Gateway before the response finished. No query tuning could fix it, because the gateway timeout is a platform limit, not a slow query. The failure lived in the architecture, not the code.

So exports left the request path entirely.

A cron job builds the report file every two hours and writes it to S3, and the client receives a pre-signed URL instead of a payload. API Gateway is no longer in the data path.

That is what stopped report size from being an availability problem: the thing that timed out is no longer asked to carry the data.

Shipped, stamped, in production.

Alongside the pipeline: an admin dashboard with downloadable schedule summaries, and the consistency layer that took scheduling errors down 90%.

case file 02: incident report

Payday, minus thirty teachers

Node.js, AWS Lambda, DynamoDB, New Relic

the reportlogsupdateEarnings()DynamoDB index~30 of 4,500 missingno error capture: failures vanishthrottled: provisioned capacityprovisioning raised
fig. 2: the investigation, as it actually went. the error existed for weeks before anything admitted it.
all 30 paid

Symptom: money missing, logs quiet.

Around 4,500 teachers were due payment. Product sent over a spreadsheet with about thirty names on it: paid nothing. In DynamoDB, the earnings attribute for exactly those teachers had never been written. No alert had fired and no error had been logged. As far as the system was concerned, nothing had happened.

Investigation: the function that never confessed.

The trace led through New Relic to the update function. It was invoked, it completed, and the write simply never landed. The reason nothing surfaced: no error capture at the process level, so the failure had nowhere to land and quietly vanished. You cannot debug an error that is never allowed to exist.

Root cause: the index was throttling.

Error capture went in first, before any fix. The very next run confessed: DynamoDB was rejecting writes because the index's provisioned capacity was too low for payday load. Roughly thirty writes lost that race every cycle, silently, and the names changed each time.

Remediation, then prevention.

The thirty were paid manually, verified name by name against the sheet. The provisioning was raised, and the failure never recurred.

What stayed with me is the prevention: errors that are captured where they happen, and logs that mean something. An incident should start from a query, not from a spreadsheet someone else noticed.

case file 03

AI in production for institutional investors

Next.js, Supabase, Trigger.dev, Claude Haiku, MCP

cron, weeklyTrigger.devdigest emailtheir ClaudeMCP serverpublished researchparallel tasksfan out -> haiku one-linerscompany / sector / user / oauth12 inboxes, weekly
fig. 3: AI in both directions. pushed out on a schedule, pulled in through entitlements.
7 tools, just launched

A market-intelligence platform, end to end.

Channel Dynamics serves institutional investors. I work across the whole surface: the public site, the portal's analytics and its filtering, and the observability wiring, so problems show up as traces instead of guesses.

Every week, the numbers explain themselves.

A weekly job compiles leadership metrics into charts and one-line AI summaries. Trigger.dev runs it as a queue and fans it out into parallel tasks, because work that takes minutes does not belong inside a request.

The summaries are written by Haiku on purpose: they are one-liners, and one-liners do not need a frontier model. Right-sized is faster, cheaper, and just as sharp at that length. A dozen leadership inboxes, every week, on time.

Their research, queryable from inside Claude.

A production MCP server puts the published research inside the customer's own Claude: seven tools to list, fetch, and semantically search reports.

The hard part is entitlements. A company-level flag, sector-level report entitlement, and per-user checks, with OAuth tied to the customer's real account. People only ever see what they are entitled to see, which in financial data is the entire product.

Just launched, in early use.

The MCP is newly launched and real customers are using it. Same principles as every other case file here: long work moved off the request path, access checked before anything else, and contracts explicit enough that an AI client can rely on them.

case files 04 + 05

The quick files

case file 04

First render, cut in half

3.5s1.8s

initial page load, landing routes

The bundle shipped the whole app on every route, so code the first paint never needed was parsed before anything drew. Route-level splitting and lazy loading fixed the paint; a second pass moved data fetching to TanStack Query with a deliberate cache, cutting redundant requests 40% and server load 20%.

lighthouse 65 to 92

case file 05

The library that ended copy-paste

6 copies1 source

modal, form field, table: everywhere

Teams kept rebuilding the same primitives, and the real cost was not the duplicate code: fixing one accessibility bug meant finding six copies of it first. One documented shared library later, feature cycles run 30% faster and frontend duplication is down 20%.

cycles down 30%

case file 06

Exhibit A: this website

A portfolio that claims performance numbers has to be fast, or the claim is dead on arrival. So this site is built the way I build for clients: fully static, self-hosted fonts, zero blocking scripts, and every diagram is hand-projected SVG instead of a canvas library.

Open the devtools. The numbers on the right are from this page, measured the same way I measured the 3.5s app.

100

Lighthouse performance, desktop. 98 mobile

0

cumulative layout shift

0ms

total blocking time

100%

static, prerendered at build

How I work

Services behind explicit contracts.

Microservices only earn their operational cost if the boundaries are real. I settle the contract first and the implementation second, so a change on one side cannot quietly break the other.

see: case file 01

One response shape, one middleware path.

Standardized API responses and reusable middleware for auth, validation, and errors. Consumers stop writing a special case for every route.

see: case file 05

Logs you can query, not grep.

Structured logging with request correlation, so an incident starts from a query instead of a guess. Cheapest item on this list, biggest cut to resolution time.

see: case file 02

Own it to production.

Design through deployment, including the deploy. Running the thing in production changes the decisions you make while building it.

see: case file 06

The stack

Grouped by layer, because that is how systems are built. Depth lives in the TypeScript and React and Node column; the rest is working fluency.

Languages

  • TypeScript
  • JavaScript
  • Python
  • Java
  • SQL

Frontend

  • Next.js
  • React
  • TanStack Query
  • Tailwind
  • Chakra UI
  • shadcn/ui
  • Storybook

Backend

  • Node.js
  • Express
  • GraphQL
  • Spring Boot
  • Flask
  • Django
  • REST
  • Microservices
  • MCP
  • Claude API

Data

  • PostgreSQL
  • Supabase
  • MongoDB
  • MySQL
  • DynamoDB
  • Prisma
  • Mongoose

Infra

  • AWS Lambda
  • SQS
  • S3
  • Trigger.dev
  • Jenkins
  • SonarQube
  • Vercel
  • Render

Auth

  • JWT
  • Clerk
Wahaj Ahmedest. islamabad

About

I work on the parts of a product users never see directly: the data layer that has to stay consistent, the endpoint that has to stay fast, the component everyone else builds on. Most of what I am proud of is invisible when it works.

The pattern across the case files is the same. Measure the thing that is actually failing, change the shape of the system rather than tuning around the symptom, then check the number moved. A gateway timeout is not a query problem. Duplicate components are not a code problem. Both are architecture answering the wrong question.

Recent client work includes Channel Dynamics, a market-intelligence platform for institutional investors.

Based in Islamabad, working remotely with teams anywhere.

Let's build something that holds up.

Open to engineering roles and freelance work. Email is the fastest way to reach me, and I answer.

Get in touchwahajahmed55@live.com