Skip to content
Client projectGovTech · City Hall website · Admin panel

Primăria Vatra

A government site built to banking standards: 417 pages with zero accessibility violations and online citizen requests.

Client
primariavatra.md
City
Vatra, Chișinău
Year
2026
Status
Live
Primăria Vatra — GovTech · City Hall website · Admin panel
277API operations
417pages with zero accessibility violations (axe)
312redirects from the old WordPress site
5roles + mandatory 2FA
// Challenge

Challenge

City Hall ran on WordPress with plugins. The new site had to comply with the law: accessibility for people with disabilities (HG 728/2023), publication of decisions and the budget, and response deadlines for citizen requests under the Administrative Code. We had to migrate 166 documents and hundreds of old URLs and give staff a secure admin panel.

// Solution

Solution

We designed a system of four independent parts (website, API, admin panel, infrastructure) with a single OpenAPI contract. We built the existing design 1:1 and added everything it lacked: the mobile version, UI states, legal pages, search. We built the admin panel from scratch, with roles, 2FA, revisions and Facebook auto-posting.

Our role: The website design isn’t ours: we received a finished Figma mockup and built it 1:1. Our work covered architecture and development of the website, API, admin panel and infrastructure. We designed the admin panel ourselves.

// Project screens

Project screens

Mobile home page
News on mobile
Home page: city video and services sidebar
Document registry: search and filters
Accessibility widget per HG 728/2023
Services section
News feed
// What we built

What we built

Public website

  • News, announcements, events, services with forms, city council, “Transparency”
  • Document registry with search and filters by category and year
  • Citizen requests with a registration number and a legal response deadline
  • Accessibility widget per HG 728/2023: contrast, font, cursor, navigation
  • Three languages with localized URLs, RSS, search, sitemap
  • Form protection with ALTCHA, free of third-party services and cookies

Admin panel

  • Sign-in: password, mandatory 2FA and backup codes
  • 5 roles and a “content type × action” permission matrix
  • Editor with RO/RU/EN tabs and “missing translation” flags
  • Version history with line-by-line diff and rollback
  • Scheduled publishing, preview, drafts that survive a page reload
  • Requests section: assignees, deadlines, overdue items, legal extensions
  • Auto-posting of news and events to Facebook with photos and video

API

  • NestJS on Fastify: 277 operations, 59 PostgreSQL tables
  • Record lifecycle: draft → review → published → archived
  • Typo-tolerant full-text search in three languages
  • Media: ClamAV antivirus, EXIF stripping, PDF rebuilding, video up to 4 GB
  • RU slugs per GOST 7.79, automatic 301s when a URL changes

Security and infrastructure

  • OWASP ASVS L2: Argon2id, breached-password checks, CSRF, strict CSP
  • Append-only audit log, with edits blocked at the database level
  • Docker, Prometheus/Grafana/Loki monitoring, Telegram alerts
  • restic backups with a monthly restore test
  • ≈400 API tests, 228 website tests, e2e in two viewports
// Outcome

Outcome

01

City Hall runs its own stack with no WordPress dependency: staff manage content through an admin panel with roles and 2FA.

02

Citizens file requests online and get a registration number, and response deadlines are tracked automatically.

03

The site passes the automated axe accessibility audit on all 417 pages with zero violations.

04

312 old URLs now 301-redirect, and documents were migrated with nothing lost.

05

Posts are automatically mirrored to City Hall’s Facebook page.

// Stack

Stack

Nuxt 4Vue 3Tailwind 4NestJS 11 · FastifyPostgreSQL 17Redis · BullMQPrimeVue 4Tiptap 3MinIO · ClamAVDocker · Caddy
// Integrations

Integrations

Facebook Graph APIOpen-MeteoClamAVALTCHAHave I Been PwnedCloudflarePrometheus · Grafana
// Services involved

Services involved

Next case →Valeriia FlowersMoved off WordPress with zero traffic loss, and Google clicks grew 3.5x.
Valeriia Flowers

Want the same?

Tell us about your challenge — within 24 hours we’ll come back with a solution, timeline and launch plan.