Fokus
Everything a kommun offers its youth — in one app, mentors alongside.
Fokus puts a municipality's whole youth programme — news, video, courses, surveys and opportunities — in one mobile app for young people and their mentors, run from a single kommun dashboard. We built both sides on Next.js 16 and Firebase, with survey reporting engineered to stay instant and cheap at any scale.

- Client
- Fokus
- Industry
- GovTech · Community
- Timeline
- 10 weeks · 2026
- Services
- Web dashboard + mobile API, Firebase architecture, Data-cost engineering
The outcome, in numbers
Before and after.
Survey report cost @ 10k responses
Survey detail render (p99)
Youth + mentor channels
The challenge
Where they started.
A kommun supports its young people in a dozen different ways — posting news, sharing video, publishing training material, running feedback surveys, advertising opportunities, pairing them with mentors, answering questions in chat. Fokus's customers were doing each of these in a separate tool, or not at all. Nothing shared a login, a content model, or an audience, so a kommun could never see what its youth actually engaged with, and young people and mentors had no single app to open.
Surveys were the sharp edge. Youth surveys attract many viewers but relatively few respondents, and the obvious build — read every submission to draw the charts on each report view — gets quietly expensive: a survey with 10,000 responses costs 10,001 Firestore reads every single time someone opens the results. With dozens of daily viewers that's millions of reads a month on one page, and the bill and the latency both grow forever as responses accumulate.
On top of that the kommun dashboard and the youth-and-mentor mobile app had to run off one shared backend over the same API, stay within Firestore's per-document limits and security model, and be maintainable by a small team — which meant strict typing, server-validated inputs, and no client-side data fetching papering over a slow backend.
Our approach
How we built it.
01One backend, two front doors
Kommun staff manage everything from a server-first Next.js 16 dashboard — every page fetches on the server and streams HTML, no client round-trip for the initial render — while youth and mentors meet the same content in a mobile app reading through one shared, typed API. News, videos, articles, training courses, surveys, opportunities, the feed and chat all sit on one auth model, one Firestore data layer, and one design system, so what a kommun publishes is instantly what a young person sees.
02Surveys that cost one read to report
Instead of recomputing charts from raw submissions, each survey document carries pre-computed aggregates. Every submission updates them atomically with Firestore's FieldValue.increment inside a single batched write, and a compound document id (surveyId__userId) makes 'one response per user' a database guarantee, not application code. The report page then reads just the survey doc — so a results view costs one read whether the survey has ten responses or a hundred thousand.
03A community for youth and mentors, not a broadcast board
Young people don't just consume — they react to posts in a cursor-paginated feed, apply to community opportunities, and get selected through a transactional flow that closes the listing and notifies the applicant, with mentors supporting them alongside. Reactions and selections run inside Firestore transactions so concurrent taps can't double-count or double-book, and rich content is authored with a TipTap editor and stored with clean, content-typed media uploads.
04Push, performance, and guardrails built in
Chat and key events fan out as FCM push notifications through a fire-and-forget writer that never blocks the action that triggered it. Independent reads are batched with Promise.all, related documents are fetched in bulk to kill N+1 queries, and every route handler verifies the Firebase ID token and validates its inputs server-side — strict TypeScript throughout, with Firestore security rules as the real source of truth.
Stack we shipped
The result
What changed.
Municipalities went from juggling five-plus disconnected tools to running everything they offer young people — news, video, courses, surveys, community opportunities, feed and chat — from one dashboard, with the same content reaching youth and mentors through a shared mobile app.
The survey engine is the headline: report views dropped from scaling linearly with responses (10,001 reads at 10k responses) to a flat ~21 reads regardless of volume — roughly 476× cheaper at that scale and effectively unbounded savings as surveys age, while detail pages render in under 200 ms p99 no matter how popular a survey gets.
Because the build is server-first and strictly typed, the small team ships confidently: inputs are validated at the boundary, concurrency is handled by Firestore transactions rather than hope, and the data-cost ceiling that would have throttled growth simply isn't there.
Have a project like this?
Tell us what you want to build. We'll tell you how fast we can ship it — and walk you through this build live.
