Skip to content
Tehran

Client work

MirOffice

The public website of MIR Architecture Office, on its own domain.

Role
Sole developer
Year
2025
Kind
Client work
Hosting
Own server, Tehran
Status
220 ms
miroffice.ir
MirOffice: the live product

Stack

Backend
Django
Frontend
React TypeScript
Data & ML
PostgreSQL
Infrastructure
Docker Nginx TLS

01 The problem

MIR Architecture Office needed a production website on its own domain — one that presents the office properly, stays reachable, and has someone looking after it once it is live.

They had the domain knowledge; they needed one person to handle everything else.

02 What I built

Designed, built and run by one developer.

A production web platform for MIR Architecture Office, delivered end to end: interface design, backend, frontend, deployment on the client’s own domain with TLS, and ongoing maintenance. Built alone, with the client in the loop throughout. Django and PostgreSQL behind a React + TypeScript front end, in Docker behind Nginx.

  1. The interface design, worked out directly with the client.
  2. A Django backend with PostgreSQL and a React + TypeScript front end.
  3. Deployment on the client's own domain with TLS, in Docker behind Nginx.
  4. Ongoing maintenance after launch.

03 Screens

The live product.

01 / 03

04 Architecture

How MirOffice fits together.

  • Component
  • Request
MirOffice’s components, grouped left to right by layer: Client, Edge, App, Data.

Connections

  • Visitors to miroffice.ir · DNS , DNS
  • miroffice.ir · DNS to Nginx · TLS , HTTPS
  • Nginx · TLS to React + TypeScript , static
  • Nginx · TLS to Django , /api
  • Django to PostgreSQL

05 Key decisions

What I chose, why, and what it cost.

  1. Decision

    Work directly with the client, in short loops

    Why

    The client knows their work and how they want it shown. Putting real screens in front of them early turned feedback into changes while the work was still in motion, not after it was finished.

    Trade-off

    More iterations and more of my time in conversation — which is the job when you are the only developer.

  2. Decision

    A real backend, not a site builder

    Why

    Django and PostgreSQL give the office a site that can grow with it, on infrastructure the client owns rather than rents from a platform.

    Trade-off

    A server to run and patch, where a hosted builder would have handled that.

  3. Decision

    Own domain, TLS and a containerised deploy

    Why

    The office owns its domain and its data. Docker keeps the deploy reproducible, and Nginx terminates TLS in front of the app.

    Trade-off

    Certificates, updates and backups are part of the maintenance I carry after launch.

06 Try it yourself

MirOffice is running. Go and use it.

A public website, so there is nothing to log in to.

esc
Top of the page
Proof in numbers
Selected work
Also shipped
How I ship
Experience
Stack
Work with me
Pico — case study
ArchPan — case study
Garsha — case study
Fenderesky — case study
MirOffice — case study
Copy email address
Download CV
Open GitHub
Open LinkedIn
Open live demo: Pico
Open live demo: ArchPan
Open live demo: Garsha
Open live demo: Fenderesky
Open live demo: MirOffice