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.
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.
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.
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.