Custom software · Municipal — cultural affairs

EventFlow for Tehran: the cultural events of 22 districts on one system

The integrated cultural events and venues system for Tehran: a multi-stage approval chain, a mapped cultural atlas, geofenced field reporting and citizen surveys — three clients, web, mobile and API, on one core.

Client
Tehran Municipality
Industry
Municipal — cultural affairs
Year
2025
Status
Live
  • Discovery and analysis
  • UX and UI design
  • Software architecture
  • Front-end development
  • Back-end and API development
  • Database design
  • Third-party integrations
  • Deployment and DevOps
  • QA and testing
  • Support and ongoing development

The result, in numbers

22
Tehran districts on the system

with each district’s areas and neighbourhoods

3
clients on one core

web, mobile app and API

The challenge

The cultural events of Tehran's 22 districts run to hundreds of programmes a year, and each one passes through several hands before it happens: content, budget, deputy, headquarters.

The problem had four heads. Approvals stalled somewhere nobody could name. Cultural venues — cultural centres, neighbourhood houses, Quran houses, parks — had no current record a citizen could consult to find out what was on where. Field reports proved nothing: a photograph with no evidence of where or when. And evaluation effectively did not happen, because collecting citizen feedback was harder than running the event.

One more constraint shaped the design: a field officer does not always have a stable connection, and an app built assuming an open internet breaks in the field.

The solution

EventFlow was built: one platform with three clients — a web panel for the cultural unit, the districts and headquarters; a mobile app for the field officer and the citizen; and an API that feeds both.

The event cycle is governed by a state machine inside the domain: draft → content approval → budget approval → deputy and headquarters → dispatch to districts and delivery → evaluation → closure. Programmes and sub-activities are versioned and the change history is kept.

Beside it sits a public cultural atlas: venues with categories, photographs, facilities and coordinates, on a map and open to citizens without signing in, each with a district approval flow. Venue services — classes, bookings for halls, libraries and workshops, club membership — sit on those venues, switched on per venue.

Field reports are captured inside a geofence and a time window and wait in an offline queue until the network returns; the reachability probe was tuned against our own server so national filtering does not make the system report itself offline. Evaluation runs on a question bank and single-use tokens, asking citizens and delivery teams different things.

Under all of it sits the access layer an organisation this size requires: the geographic hierarchy of districts, areas and neighbourhoods alongside the organisational one, capability-based permissions — each endpoint guarded by a named capability rather than a raw role — multi-tenancy, and an audit trail on every access.

Key features

  • A multi-stage approval chain

    Content, budget, deputy and headquarters — with a checklist gate at each stage and returns carrying a recorded reason.

  • A mapped cultural atlas

    Cultural centres, neighbourhood houses, Quran houses and parks with photographs, facilities and coordinates — open to citizens without a login.

  • Enrolment, booking and membership

    Classes, bookings for halls, workshops and free consultations, and club membership — enabled per venue.

  • Geofenced field reporting

    A photograph only at the location and inside the event’s time window; offline queue and automatic sync.

  • Token-based citizen surveys

    A question bank and evaluation plans, with single-use tokens and separate questionnaires for citizens and delivery teams.

  • Fine-grained access and audit

    Capability-based permissions, geographic and organisational scope, multi-tenancy and a full audit trail.

  • The citizen experience

    A Jalali calendar, “near me” by GPS, festivals, competitions and cultural ambassadors.

  • In-app updates

    The app fetches and installs a new version from the organisation’s own server, with forced updates supported.

Architecture and stack

Style
Monolith
Patterns
Clean architectureDomain-driven design

Clean Architecture with domain-driven principles: the business core — entities, the event state machine and the rules — at the centre with no outward dependencies; the application layer with services, DTOs and FluentValidation around it; infrastructure and presentation in the outermost layers. The reason is plain: this system had three clients on day one and was expected to gain more, and rules written into controllers would have been rewritten with every new client.

Permissions are capability-based rather than role-based: each endpoint is guarded by a named capability, the user's geographic and organisational scope is applied on top, and every access lands in the audit trail. In an organisation with 22 districts and several headquarters layers, raw roles cannot express who may do what.

Infrastructure: Entity Framework Core over SQL Server, scheduled jobs with Hangfire, object storage for images, centralised logging with Seq, and spatial data with NetTopologySuite — which is what the field-report geofence and "near me" run on. Deployment is Docker Compose behind nginx, with automatic incremental schema setup when the service starts.

Front end
React.jsViteTypeScriptLeaflet

Web panel for the cultural unit, districts and headquarters

Front end
React NativeExpo

Field and citizen app, offline-capable

Back end and API
.NET 10ASP.NET CoreC#REST APIClean Architecture

Versioned REST, JWT, capability-based authorisation, multi-tenancy

Database
SQL ServerEntity Framework Core
Infrastructure and deployment
HangfireNetTopologySuiteSeq

Scheduled jobs, spatial data and geofencing, centralised logging

CI/CD and monitoring
Dockernginx

Docker Compose behind nginx, automatic schema setup

Integrations

  • Object storage for event and venue images
  • Mapping and spatial data for the atlas and geofencing

Have a similar project in mind?

Fifteen minutes is enough to say what it needs, how long it takes and where to start.

Robocode: academy, online exams, shop and a partner network on one platform
Flagship

Custom software · E-commerce

Robocode: academy, online exams, shop and a partner network on one platform

The integrated platform for the Robocode academy on .NET 10: online and in-person courses, exams with report cards, a shop with wholesale pricing, certificate issuance with QR verification, a partner and instructor panel with commission, and single sign-on from Shad.

  • .NET 10
  • C#
  • Entity Framework Core
  • MediatR

Robocode training institute · 2025

Rosha counselling clinic: from online booking to counsellor settlement, on custom WordPress
Flagship

Custom software

Rosha counselling clinic: from online booking to counsellor settlement, on custom WordPress

An integrated clinic management platform on WordPress: online booking with a collision lock, payments and deposits, a 15-module reception desk, a counsellor panel with share calculation, and financial reporting with Persian PDFs. No booking plugin, no off-the-shelf theme.

  • WordPress
  • PHP
  • REST API
  • MariaDB

Rosha counselling clinic · 2025