Open to work — Remote & On-site

Hi, I'm Mohammadreza Rezaian

Front-End EngineerReact & Next.js

I build real products with React and Next.js — the kind with real users, fast loads and codebases that stay pleasant to maintain. Clean code, performance and the quirks of the Persian web are exactly where I like to be.

Karaj, Iran · Remote & On-site
Mohammadreza Rezaian

100

SEO Score · Lighthouse

3+

Years of Experience

3+

Years Experience

3

Production Products

100

SEO Score

4

Persian Tech Books

ABOUT

Engineering, done right.

I've spent the last three-ish years writing front-end code, most of it in React, Next.js and TypeScript. My favourite moment is when an idea turns into something real people use every day — like the medical booking platform I took from auth to caching to tests, or the real-estate app with an interactive map that kept its cool as it grew.

I care about the details: a Jalali calendar that never drifts by a day, an RTL layout that sits right everywhere, a page that's loaded before the user blinks. SEO, performance and accessibility aren't optional extras for me — they're part of what "done" means.

Good work isn't luck. It's obsessing over the details nobody notices — until they're missing.

Focus areas

React Server ComponentsPerformanceScalable ArchitectureSEODX

Persian — Native

English — Intermediate (B1)

LIGHTHOUSE

Doctor Booking on Google Lighthouse

0
Performance
0
Accessibility
0
Best Practices
0
SEO

Type-safe end to end

Strict TypeScript and Zod at the data boundary; bugs get caught before runtime

Clean, quiet code

Readable and maintainable, without complexity nobody asked for

Minimal scope

Only what the product truly needs — not one step more

Measurable quality

Lighthouse, automated tests and a11y; a good feeling isn't enough, we want numbers

SELECTED WORK

Selected Projects

A few things I've taken from idea to deployment myself — no demos, no templates.

Doctor Booking
Full-Stack · Production

Online medical appointment platform

Doctor Booking

A complete booking platform where users find a doctor, book with the Jalali calendar, leave reviews and read articles — while admins run everything from one panel. Under the hood: 9 Mongoose models, 20 Zod schemas, JWT auth on httpOnly cookies and multi-layer caching with Upstash Redis. Every sensitive flow is covered by Playwright.

167

Components

26

API Routes

17

Test Files

100

SEO

Next.js 16React 19TypeScriptTailwind v4MongoDBRedisZodPlaywright
Saghfinoo
Front-End · Scalable SPA

Real-estate platform for buying, selling and renting

Saghfinoo

A real-estate SPA designed to grow from day one: advanced search by district, type, price and area; multi-step listing creation; and an interactive Leaflet map you can browse neighbourhood by neighbourhood. Repeated logic lives in 17 custom hooks, and memoization across 100+ call sites keeps renders light.

107

Components

17

Custom Hooks

12

Pages

React 18ViteReact Router 7MUITailwindReact Hook FormReact-Leaflet
Malli Kids
Full-Stack · Client WorkClient Work

Online store for a children's clothing atelier

Malli Kids

For a children's clothing atelier, I built a store with a polished storefront, customer accounts and an admin console. App Router and Server Components by default, an ISR-served catalogue, Better Auth on accounts. Cart, inventory, coupons and orders live on MongoDB and get checked with Zod; stock locks at checkout so two people can't buy the last size at once. Client state comes up through Zustand with SSR-aware initial values, and OTP plus Redis keep abuse out. The thoughtful bits: Jalali-expiring coupons and a virtual try-on.

3

Access Tiers

RSC

Architecture

ISR

Catalogue

Next.js 16React 19TypeScriptTailwind v4MongoDBRedisBetter AuthZustandZodMotion
Source is private under client agreement.
ShoppingCart
Front-End · Open Source

Modern shopping cart in TypeScript

ShoppingCart

A light, tidy shopping cart that started as strict-TypeScript practice and ended up with a neat modular architecture: add and remove products, change quantities and watch totals update instantly — built with Webpack and Bootstrap 5.

TypeScriptWebpackBootstrap 5ESLint + Prettier

HOW I WORK

This is how I actually work.

Tools matter. What repeats is the working habits — not the slogans.

  1. 01

    Cause first, patch later

    When something jumps in the UI, I usually try to tell whether it's rendering, state, scroll timing or architecture — before I change how it looks. The mobile-menu scroll on this site was broken; instead of a magic offset, I dropped content-visibility and scrolled after the lock released, using the section's real position.

  2. 02

    Find the source of truth

    Appointment dates shouldn't depend on the server timezone. The last size in stock shouldn't depend on an optimistic client. I look for where the truth lives — Tehran wall-clock, the inventory row, a single content file — and I treat that as the source.

  3. 03

    Measure, then keep or cut

    A good feeling isn't enough. I brought in Motion and Radix, then took them out of the bundle after measuring, and moved the animation to CSS. I keep the Lighthouse numbers for Doctor Booking because "it's fast" without a number is just a claim.

  4. 04

    Read the constraint, don't add a breakpoint

    If a page breaks at 320px, I first ask whether it's intrinsic width, wrapping, padding, or a nowrap button. The CTA buttons and footer tiles here were pixel-centred that way — not by sprinkling another media query.

STRENGTHS

What tends to show up in the work.

Naming the layer

Detail isn't a visual pass for me. When RTL or 320px falls apart, I separate the layer first: size, wrap, constraint, or scroll. Then I touch the code.

Owning the whole path

The file with the error is rarely the whole story. The mobile menu wasn't a click bug; the scroll lock hadn't been released yet. I follow the flow until the real boundary shows up.

Quality I can measure

SEO 100, Playwright on the sensitive paths, Zod at the data boundary. If I can't measure it, I don't really consider it done.

Treating the Persian web as the product

A Jalali calendar that doesn't drift, coupons that expire on a Shamsi date, RTL that sits right. These aren't extras. They're the work.

WHERE I'M IMPROVING

Things I'm still working on.

Broken vs. just more polished

I sometimes stay on details I know could be more precise — a tile's alignment, an animation, a sentence. What I'm practising is asking sooner: is this actually wrong, or am I just tempted to polish it further?

Weighing a dependency before it lands

I added Motion and Radix first, then took them out of the bundle. The lesson: "do we need this?" should come before install, not after I've seen the weight.

WORKING PERSONALITY

A self-description, not a diagnosis.

Personally I see myself as closer to INTJ — not as a hard label, but because some of that type's thinking and working patterns sit close to how I actually work.

  • I like to understand the system before I change it.
  • Deep work is where I'm happiest — the four Persian handbooks came from that.
  • I usually try to get to the root on my own first.
  • I think about architectural consequences: stock locks, SSR-aware state, timezones.
  • I prefer long-term quality over a shortcut I'll pay for later.

IN PRACTICE

Soft skills, as they show up.

Framing the problem

I'd rather name the problem precisely before offering a solution — even in commit messages. "Scroll after the menu unlock, via a measured offset" means we're all talking about the same bug.

Owning the path

When something breaks, I don't usually stop at the file with the error. I walk the whole flow until the real boundary is clear — render, data, or a scroll lock.

Learning the model

When I pick up a framework, I spend more time on its mental model and trade-offs than on its APIs. That's how I wrote the Persian handbooks: why this decision, not just how this hook.

BEYOND THE CODE

Outside the editor

A lot of my time goes into understanding why something works the way it does, or writing that down in Persian so the next person is less lost. Real products for an RTL ecosystem interest me more than a pretty demo — and I tend to measure quality in the places nobody's looking.

OPEN SOURCE · PERSIAN HANDBOOKS

The handbooks I wish I'd had earlier

Four Persian guides I wrote because I wished they existed: project-based, focused on mental models and the "why", not just the "how". Free and open source.

JavaScript ES2025 — Persian Guide
38 chapters

JavaScript ES2025 — Persian Guide

From the language's mental model to production-ready architecture

React 19.2 — Persian Guide
37 chapters

React 19.2 — Persian Guide

From the first component to UI architecture in production

Next.js 16 — Persian Guide
37 chapters

Next.js 16 — Persian Guide

From App Router and Server Components to architecture and deployment

Git & GitHub 2026 — Persian Guide
36 chapters

Git & GitHub 2026 — Persian Guide

From zero to pro — one book, two tracks: the terminal and VS Code

SKILLS

Toolbox

The tools I reach for every day — from UI pixels down to the data layer.

Core

  • React
  • Next.js
  • TypeScript
  • JavaScript

UI & Styling

  • Tailwind CSS
  • shadcn/ui
  • MUI
  • RTL

State & Data

  • SWR
  • React Hook Form
  • Context
  • Redis

Backend-for-Frontend

  • API Routes
  • MongoDB
  • Zod
  • JWT / RBAC

Quality & Tooling

  • Playwright
  • Git
  • Vite
  • Accessibility

Architecture

  • Clean Code
  • Component-Driven
  • Performance
  • SEO
ReactNext.jsTypeScriptTailwind CSSshadcn/uiMongoDBRedisZodPlaywrightSWRReact Hook FormMUIViteGitRSCISRSEOA11yRTLReactNext.jsTypeScriptTailwind CSSshadcn/uiMongoDBRedisZodPlaywrightSWRReact Hook FormMUIViteGitRSCISRSEOA11yRTL

TECHNICAL HIGHLIGHTS

Technical Highlights

A few real problems that got in my way, and how I solved them.

Doctor Booking

Jalali-calendar scheduling with precise slots

Dates run on the Jalali calendar (jalaali-js) and Tehran wall-clock time is read independently of the server timezone — so slots never drift by a day. Each user also gets exactly one active appointment per day.

Doctor Booking

Authentication & security hardening

JWT on httpOnly cookies with admin/user roles and bcrypt hashing; OTP codes are hashed, compared timing-safely, and Redis keeps brute-force attempts out.

Doctor Booking

Performance & SEO engineering

Multi-layer caching with revalidateTag and Upstash Redis, next/image and dynamic code-splitting; dynamic metadata, dedicated sitemap/robots and ISR — good for a perfect 100 SEO score in Lighthouse.

Saghfinoo

Scalable front-end architecture

Form, filter, validation and OTP logic gathered into 17 custom hooks, 107 components organised into logical domains, and memoization across 100+ call sites keeping renders in check.

CONTACT

Let's build something that
actually works.

Open to remote and on-site roles. If you're looking for someone who cares about the pixels, the performance and the Persian-speaking user in equal measure, I'd love to chat.