Business website design
A professional website that presents your services clearly and builds trust with customers.
I'm Mahdi Elahipour, a web designer and developer
for websites and custom applications.
I design and build web solutions around the way your business works.

From your first website to a custom application,
I can help you build the next step for your business.
A professional website that presents your services clearly and builds trust with customers.
An online store tailored to your business, with a straightforward shopping experience.

A Persian-language tutoring platform built with Next.js, NestJS, MySQL, and Redis. It covers tutor profiles and dashboards, contact requests, media management, technical SEO, and production releases with rollback support.
Ostadki connects students and language learners with private tutors for online and in-person lessons. Tutors can complete a profile, publish listings, set weekly availability, and share résumés, handouts, and videos. Learners can browse by subject or city and send contact requests.
The platform runs in production. My work spans the frontend, API, data modeling, authentication, media management, technical SEO, and server deployment.
The frontend and backend are separate applications in one repository. The modular backend communicates with the frontend through a REST API.
| Area | Technology and purpose |
|---|---|
| Frontend | Next.js 15 App Router, React 18, JavaScript, and TypeScript |
| User interface | Tailwind CSS, CSS Modules, Material UI, and Emotion |
| Interaction and animation | Framer Motion, interactive components, and responsive carousels |
| Client data management | TanStack Query, React Context, and custom hooks |
| Backend | NestJS 11, TypeScript, and Express |
| Database | MySQL and TypeORM |
| Caching | Redis, Cache Manager, and Keyv |
| Authentication | JWT, Passport, Google OAuth 2.0, and one-time passcodes |
| Input validation | DTOs, class-validator, and class-transformer |
| Media storage | S3-compatible storage and the AWS SDK |
| Image processing | Sharp |
| Live updates | Server-Sent Events for video like counts |
| External services | SMS.ir, Zarinpal, and ArvanCloud |
| Testing | Jest, NestJS testing tools, and the Node.js test runner |
| Deployment infrastructure | Ubuntu, Nginx, PM2, HTTPS, and CDN |
Next.js renders public pages on the server so search engines can access their main content. Category, profile, and video pages include dynamic titles, descriptions, and canonical URLs.
| Challenge | Implemented solution |
|---|---|
| Irrelevant listings matching a subject mentioned in the description | Taxonomy-first matching with stricter subject rules and mappings for legacy categories |
| Multiple requests to check category branches | Batch checks for listing availability across categories |
| Extra data returned for listing cards | A dedicated card response with only the fields needed by the interface |
| Repeated processing of public requests | Redis caching for listing and taxonomy results |
| Live events conflicting with a user's liked state | Separate public counts from personal like status and guard response ordering |
| Likes becoming inconsistent when IP addresses change | Verified account identity and signed browser identifiers for guests |
| Routes missing from a release build | Check existing routes and their compiled files before activation |
The project includes API access controls, token and session checks, OTP limits, input validation, and private route protection. The image proxy restricts allowed hosts, response types, request duration, and file size.
Releases use backups, targeted SCP transfers, tests and builds in a separate release directory, health checks, and PM2 activation. The previous runnable build is retained for rollback.

A multi-school platform built with Laravel, React, and MariaDB. It supports administrator, teacher, and parent dashboards, timetables, attendance, assessments, finance, and absence notifications by SMS. It is deployed on Liara.
Famooz is a Persian-language web application for academic and administrative work across multiple schools. It provides dashboards for platform administrators, school staff, teachers, and parents, and brings enrollment, scheduling, attendance, assessments, finance, and communications into one system.
| Area | Technology |
|---|---|
| Backend | PHP 8.2 and Laravel 12 |
| Frontend | React 19, React DOM, and Inertia.js |
| Frontend build and bundling | Vite and React Compiler |
| Production database | MariaDB 12 |
| Data access | Eloquent ORM and Query Builder |
| User interface | Custom CSS, Tailwind CSS, Lucide icons, and Vazirmatn |
| Dates and localization | Solar Hijri dates with Morilog Jalali, Persian numerals, and the Tehran time zone |
| Testing | PHPUnit, Mockery, JavaScript tests, and Playwright browser testing |
| Deployment | Liara's Laravel platform and persistent storage |
| External services | SMS.ir, SMTP email, and the MET Norway weather API |
Automated tests cover role access, school isolation, enrollment, attendance, assessments, finance, parent access, and SMS integration. Browser checks cover user workflows, React navigation, mobile layouts, and network errors.
Release preparation includes production builds, excluding development dependencies, secrets, and the local database from the ZIP archive, verifying SHA-256 hashes, and running the application from the final archive. Server readiness and database backup tools are also included.
I'm Mahdi Elahipour, a web designer and full-stack developer. I combine practical design with reliable engineering to build software that's clear and easy to use.
I work across frontend and backend development, custom web applications, and education platforms. Every project starts with understanding your goals and how your business works.

If your business needs a professional website or a custom application,
I'd be happy to discuss your idea.