CivicFlow: resident reports for councils
A resident reports a pothole or broken streetlight in a form and gets a case number; staff run the whole queue in one panel.
- Type
- Our own project
- Who it is for
- Councils: staff and local wardens
- Built
- 2026
- Similar project
- Application or system: from 15,000 PLN. Studio pricing and contact
At a glance
A resident fills in the form, and staff move the report through its statuses until it is resolved.
Resident reports get lost in inboxes and phone calls
No one sees right away what is urgent, what is already being handled, or how many similar reports came in.
From a resident's form to a staff dashboard
Submission
Category, priority, place and description, then the resident's details.
Save
The server checks the report and gives it a file number such as CF-0031.
Staff dashboard
A status bar, search, filters and a board where cards are dragged.
At rollout we set categories and permissions with the office.
The structure of a report in numbers
- 6
- report categories and 3 priorities, chosen by the resident
- 4
- statuses, changed by staff, every change goes into the history
- 2 h
- is how long a demo register lives, then it is gone
The register in the demo is your own private copy in a signed cookie, so one person's data never shows up on another person's screen.
For engineers: the technology stack
| Layer | Choice | What it does |
|---|---|---|
| Frontend | Next.js | The dashboard opens with the list already there. |
| Demo data | Signed HMAC cookie | The register you click is your own copy and expires on its own. |
| Validation | Zod | The same rules check the form on your side and on the server. |
| Security | CSRF (double-submit cookie) | Another site cannot file a report in your name. |
| Admin session | HMAC SHA-256 | Only a valid session opens the staff dashboard. |
Security headers (HSTS, X-Content-Type-Options, Referrer-Policy, a per-request CSP nonce) are set at the response level. The demo has no database: the register travels in the visitor's own signed cookie.
The full description of the demo
The problem in the office
A fault reaches the local office by email or phone. No one sees right away what is urgent, what is already being handled, or how many similar reports came in. So we built a portal: the resident picks a category and priority, and staff change status without digging through email.
Who it is for and what the demo contains
CivicFlow is for places where a report must reach the right person with a priority attached, not a shared inbox. The demo has fixed categories and one admin account. At rollout we set categories, departments and permissions with the specific office.
Submission
The form asks about the issue first (one of 6 categories, priority, place, description) and about the resident last. A carbon copy of the report fills in beside it. The browser and the server both check the data, and a report sent from another site is rejected.
Save
The server checks the report came from this site, enforces a rate limit, validates the content and only then adds it to the register. The resident gets a file number such as CF-0031 and uses it with the email to look up the status and the case history.
Staff dashboard
In the Admin panel tab, a status bar (Pending, In progress, Resolved, Rejected) shows how many cases are in each. The / key opens search, and Filters narrow the register by category and priority. Staff change a status in the row or in the side panel of the case. The Board view lets you drag cards between columns.
Numbers: the full description
6 report categories and 3 priorities, chosen by the resident in the form. 4 report statuses are changed by staff in the panel. Every change goes into the case history. 2 h is how long a demo register lives, counted from your first visit or your last change, whichever is later: then the cookie expires and there is nothing left to delete.
Data in the demo
One person's data never shows up on another person's screen. The register you click is your own private copy in a signed cookie, so you can try everything without an account.
