A single web platform where residents get city news and announcements, take part in discussions and polls, accumulate points and redeem them for partner offers — with content managed through Directus and a shared API for web and mobile.
A public web client of the municipal portal for Kharkiv residents. Users read news, browse events, take part in votes and discussions, form their position on initiatives, and accumulate bonus points for activity. There is also a separate catalog of partner offers where points can be redeemed for rewards.
The Kharkiv City Council is developing a digital communication channel with residents for informing citizens, engaging them in city initiatives, running partner programs, and collecting feedback. It was critical for council representatives to get a tool that runs stably under mixed load and lets them quickly manage content and rules without depending on developers.
One product — different scenarios
We had to combine a news section, an event feed, voting, discussions, and bonus logic in a way that keeps the interface simple.
Shared API
The architecture had to support both web and mobile apps through a single API layer, without duplicating business logic.
Content management
The admin panel had to provide control over publications, moderation, user roles, and access rights, so editors and moderators could work independently.
Stability
Publications and votes can produce short spikes in load, so the system needed predictable API responses, thoughtful caching, and pagination.
Bonus points
The bonus system required a well-ordered data model and checks to avoid double point accruals and disputed cases with rewards.
We structured the full solution as a set of clear modules: a public web interface, a JavaScript API layer, a managed back office in Directus, and a data model for content, participation, and bonuses. Directus is both a headless CMS with roles and access rights, and the central point for managing content structures and reference data.
Public web client on React
We designed the visual design and UI logic around the core scenarios: the news feed, events, discussion pages, the voting participation form, and the profile with the points balance and activity history.
Node.js API server as a single backend for web and mobile
We implemented REST/GraphQL integrations with Directus and dedicated endpoints for user operations: registration/authentication, roles, participation in votes, comments, points transactions, and redemption for partner offers.
Directus as a managed back office for content and reference data
We designed collections for news, events, partners, rewards, bonus rules, and moderation. Editor, moderator, and administrator roles were separated so the client's team could publish and update sections on its own.
Bonus model
We modeled the point system as tied to events and transactions, so it is clear what points were credited or debited for and when. At the same time, the system remained extensible so new activity types could be added later.
Integrations through the API for city services
We structured the API layer so the platform can exchange data with external services for scenarios like booking an appointment, online document verification, and ordering paid services once the counterparties are ready.
Together with the customer's team, we defined that the first version should include reading news, viewing events, participating in votes, taking part in discussions, accruing points, and redeeming them for rewards. For every scenario we defined: what the starting point is, what counts as a successful completion, which errors can occur, and where moderation is required. Separately, we agreed which actions should be as simple as possible for the resident and which could stay more complex but only in the admin part.
+2 Resource
After launch, the city got a working web client of the portal that covers the main scenarios of resident engagement — news, events, participation in votes and discussions, bonus motivation, and partner rewards.
for web and mobile
in the data model
Transactional accounting of bonuses
tied to events
daily and for every process
in critical actions and under load
for connecting city modules through the API
Or send us a message and we'll get back to you within 15 minutes during business hours