FIG. 03 — Case study

behajtasi.hu

My own SaaS product, in development, for weight-restricted-zone entry permits: a map-based zone painting editor for the clerk's office, an address-driven permit wizard for residents, and government-grade foundations underneath it all.

Client
Own product — municipal sector
Year
2026
Role
Own SaaS product — design and engineering
Status
In development
Stack
Next.js 16SupabasePostGISLeafletTypeScript

The challenge

May it enter? The map decides.

A weight-restricted zone is a simple rule with hard questions: may this vehicle enter at this address? The answer doesn't come from a table but from geometry — street segments, zone boundaries, weight limits. And three parties work the same case: the resident or company requesting the permit, the municipal office reviewing it, and the operator managing vehicles and municipalities.

behajtasi.hu is not client work — it's my own product: a multi-tenant SaaS I design and build for municipalities. That is a different job than a marketing site — data model, map tooling, access control and invoicing form one whole, and the bar is set by public administration: accessibility, security and two full languages as standard equipment.

The product — 01 · Zone editor

Clerks don't fill forms — they paint the map

Maintaining restricted zones is the most delicate part of the system, so the clerk side got a custom map painting editor: on a Leaflet interface over OpenStreetMap, the officer marks street segments — by click or lasso, with tooling in the spirit of BKK's Tóbi editor. Edit state lives in a custom reducer, so every step stays traceable.

A painted zone isn't a drawing, it's data: street-segment geometry lives in PostGIS with GIST indexes. When a request arrives for an address, a real spatial query decides whether it touches a zone — no address lists, no manual checks.

FIG. 03.A — ZONE MAP · WEIGHT-RESTRICTED SEGMENTS (DEMO)

The product — 02 · Permit request

Address, vehicle, decision — a wizard leads the way

The resident and company side is a permit wizard: the applicant starts typing an address, an OSM Photon typeahead completes it, and the system matches it against the zone geometry immediately. From there the wizard walks through vehicle and trailer details.

Verifying vehicles and trailers is its own workflow: approval runs with the super-admin, and status changes fire database-trigger notifications — to the applicant and the office alike.

FIG. 03.B — PERMIT WIZARD · NEW APPLICATION (DEMO)

The product — 03 · Tariffs and operations

Tariff grid, invoice, heatmap

Pricing is a weight-class tariff grid, editable inline — each municipality manages its own tariffs, no developer needed. Invoices for issued permits are generated from the system as PDFs, via @react-pdf.

Onboarding is handled by the product too: a municipality's existing street list imports from PDF or DOCX, fuzzy-matched to the map's street segments. Day-to-day visibility comes from officer and admin statistics dashboards with an OSM heatmap.

FIG. 03.C — MUNICIPAL DASHBOARD (DEMO)

Government-grade readiness

The bar isn't startup — it's public administration

Multi-tenant separation isn't promised by application code — the database enforces it: Supabase row-level security decides who sees what, per role and per municipality. On top: NIS2-aligned controls, a completed security audit series, per-IP rate limiting and a full set of security headers with CSP.

The same bar applies to the interface: WCAG 2.1 AA accessibility work with an accessibility statement, and full Hungarian–English parity (next-intl). The codebase is Next.js 16 + React 19 in strict TypeScript with Tailwind v4; underneath, Supabase (Postgres 17 + PostGIS, Frankfurt region); around it, 32 Vitest tests with axe accessibility checks and GitHub Actions CI. Hosted on Coolify, on Hetzner.

Results

When the web app is the business.

roles: resident · office · super-admin
3
multi-tenant codebase under every municipality
1
database indexes, spatial GIST included
24
automated tests — Vitest + axe
32
WCAG 2.1 accessibility, with a statement
AA
languages at full parity — HU / EN
2

The product is in development — these numbers describe the system built, not market traction.