Multi-tenant SaaS
ArchPan آرچیپنل
Operations software for architecture offices, with an AI assistant built in.
Stack
- Backend
- Django REST Celery
- Frontend
- React TypeScript
- Data & ML
- PostgreSQL MinIO
- Infrastructure
- Docker
- Integrations
- Claude API
01 The problem
An architecture office juggles project stages, budgets, contractors and quality checks across spreadsheets and chat threads.
The tools that could replace them assume English, left-to-right layouts and the Gregorian calendar — the wrong defaults for an Iranian office. The goal was one product that many offices can use, each seeing only its own data.
02 What I built
Designed, built and run by one developer.
A multi-tenant SaaS for architecture offices: project stages, budget tracking, contractor management, quality control and portfolio publishing, with a Claude-powered assistant built in. Tenants are isolated at the row level, files live in MinIO and background work runs on Celery. Persian right-to-left interface and Jalali calendar throughout.
- Project stages, budget tracking, contractor management and quality control in one place.
- Portfolio publishing, so finished projects can be shown without a separate site.
- A Claude-powered assistant that works inside the product.
- Row-level multi-tenancy — every office is a tenant in the same database.
- A Persian right-to-left interface with the Jalali calendar throughout.
- File storage on self-hosted MinIO and background work on Celery, deployed with Docker.
03 Screens
The live product.
01 / 02
Sign-in screen, Persian RTL

Mobile finance view: client payments vs. actual costs
04 Architecture
How ArchPan fits together.
- Component
- Worker pool
- Third party
- Request
Connections
- Browser (fa · RTL) to Nginx , HTTP
- Nginx to React + TypeScript , static
- Nginx to Django REST , /api
- Django REST to Tenant scoping
- Tenant scoping to PostgreSQL , tenant rows
- Django REST to MinIO , files
- Django REST to Queue broker , enqueue
- Queue broker to Celery workers , jobs
- Celery workers to PostgreSQL
- Celery workers to MinIO
- Django REST to Claude API , assistant
05 Key decisions
What I chose, why, and what it cost.
-
Decision
Row-level tenancy instead of a schema or database per office
Why
One schema means one migration path and one database to back up on a single server, and onboarding a new office is a row, not a provisioning step.
Trade-off
Every query must be scoped to a tenant, and a missed filter is a data leak. Scoping lives in one central layer so views never do it by hand.
-
Decision
Self-hosted MinIO for drawings and documents
Why
It speaks the S3 API without depending on foreign cloud providers that are unreliable or unavailable from Iran, and it can be swapped for S3 later without rewriting storage code.
Trade-off
Disk, backups and upgrades are mine to run instead of a provider's.
-
Decision
Jalali and RTL as first-class, not a translation layer
Why
Dates drive stages and budgets, so the calendar is core behaviour. Dates are stored in a standard form and converted at the edges, and every component is built and checked in right-to-left first.
Trade-off
Conversion logic exists in both the API and the interface, and third-party UI components often need RTL fixes before they can be used.
06 Try it yourself
ArchPan is running. Go and use it.
Demo login · click to copy