Kto Głosował
Project Brief
Project Timeline
2024 – Present
Project Type
Mobile App, Web Platform, Backend Integration, Semantic Search
Client
Internal Project (Poland)
My Contribution
Architecture & Development Lead — Mobile (Flutter), Web (React/Next.js), Backend (Node.js/Python), API Integration, Data Engineering
Transparency
in
democracy
starts here.
Kto Głosował is a civic-tech platform designed to increase transparency in Poland's legislative process. The application enables citizens to quickly check how Members of Parliament (Sejm, Term 10) voted on any issue, explore full voting breakdowns by party and individual MPs, and read related public documents such as parliamentary prints (druki sejmowe).
The platform integrates directly with the official Sejm API, processes vote data in real time, and presents it in a modern, mobile-first interface. It also includes a semantic search engine that allows users to discover legislation by topic—not only by bill number.
Challenges
Building a comprehensive civic-tech platform with real-time data integration and semantic search
Real-Time Data Integration
Semantic Search Implementation
Cross-Platform Architecture
SEO & Discoverability
Democracy thrives when citizens can see how their representatives vote.
Backend & Data Integration
Real-time synchronization with Sejm API
Built with Node.js and Python micro-services handling fetching and synchronizing voting data from the Sejm Term 10 API. The system aggregates and transforms votes, deputies, and document metadata, linking vote events with printed documents through pattern extraction.
Optimized caching and data normalization ensure fast load times, while scheduled background tasks detect and publish new voting events automatically. The architecture maintains data consistency across multiple systems and provides reliable real-time updates to both mobile and web platforms.
- • Backend Stack: Node.js, Express, Python micro-services
- • Data Source: Sejm Term 10 API integration
- • Data Processing: Aggregation, transformation, pattern extraction
- • Optimization: Caching, data normalization, scheduled background tasks
- • Real-time Updates: Automatic detection and publishing of new voting events
Frontend Development
Mobile-first design with modern architecture
Mobile App – Flutter
Modern UI with BLoC architecture providing voting explorer, deputy lists, filters, and visual charts. The app includes deep linking into web-hosted voting pages and a built-in share system generating SEO-optimized URLs.
- • BLoC architecture for state management
- • Voting explorer with filters and visualizations
- • Deep linking to web voting pages
- • SEO-optimized share system
Web – React / Next.js
Dedicated voting pages (e.g., /voting/35-4) automatically generated from the backend. SEO-ready content structure with metadata, open graph tags, and indexing rules. Fast, static + dynamic hybrid rendering for optimal performance.
- • Auto-generated voting pages from backend
- • SEO-optimized with metadata and Open Graph
- • Hybrid static + dynamic rendering
- • Fast load times and indexing support
Semantic Search
Natural language discovery of legislation
Vector search implemented using Pinecone enables users to query in natural language (e.g., "climate votes", "education budget", "schools", "abortion law"). Embeddings match topics to specific votes, MPs, and prints, enabling exploratory browsing across political themes.
This semantic search capability transforms how citizens discover and understand legislative activity, moving beyond bill numbers to topic-based exploration that reveals patterns, trends, and political positions.
From bill numbers to topics—discover legislation the way you think about it.
- • Vector Database: Pinecone for semantic search
- • Query Type: Natural language topic queries
- • Matching: Embeddings match topics to votes, MPs, and prints
- • Discovery: Exploratory browsing across political themes
UX & Information Architecture
Clean, informative interface optimized for comprehension and speed
Voting Detail Views
Each voting detail view includes a summary of the vote, party-level breakdown with visualization, individual MP votes, and linked parliamentary prints (druki). The interface is designed for accessibility and readability on both mobile and desktop devices.
- • Vote summary and context
- • Party-level breakdown with visualizations
- • Individual MP vote tracking
- • Linked parliamentary documents
Mobile-First Design
The platform prioritizes mobile experience while maintaining full functionality on desktop. Fast load times, intuitive navigation, and clear information hierarchy ensure users can quickly find and understand voting information regardless of device.
- • Mobile-first responsive design
- • Fast load times and performance
- • Intuitive navigation patterns
- • Accessibility-focused interface
Outcomes & Impact
Real-time transparency: Citizens can instantly understand how their representatives voted on any issue, increasing accountability and civic engagement.
Media-ready data: The generated pages act as stable, linkable sources for journalists, enabling fact-checking and investigative reporting.
High discoverability: SEO-driven architecture increases organic traffic from Google, making parliamentary data more accessible to the general public.
Civic empowerment: Topics-based search helps users understand patterns, trends, and political positions, enabling more informed democratic participation.
Scalable foundation: Architecture can be extended to future Sejm terms or adapted to other parliaments, creating a reusable civic-tech framework.
Technology Stack
Modern technologies powering the civic-tech platform
Flutter
Cross-platform mobile development
React & Next.js
Web frontend framework
Node.js
Backend services
Python
Data processing & microservices
Pinecone
Semantic vector search
Sejm API
Parliamentary data integration
Firebase Hosting
Deployment & hosting
GitLab CI/CD
Automated deployment
Next Project
Explore more of our innovative solutions