A Bulgarian Platform for Anonymous Public Polls
Anketi.bg is a platform where people can create polls and vote on questions related to Bulgarian society and public life.
I started the project in 2020. At the time, I already had some experience with React, but I wanted to understand the library more deeply and learn how larger frontend applications are structured.
At the same time, I began exploring backend and full-stack development. Anketi.bg gradually became a complete application with a frontend, REST API, database, authentication system, administration panel, and production deployment.
How It Works
People can browse polls and vote without creating a permanent account first.
When someone votes anonymously, the system automatically creates a temporary account. This makes voting quick and accessible while allowing the backend to track whether the person has already voted in a particular poll.
The platform also supports standard registration, email and password authentication, and login through Google or Facebook.
A permanent account allows users to follow the polls they have created and view the polls in which they have participated.
Creating Polls and Voting
Anketi.bg supports several types of polls:
- Single-choice polls
- Multiple-choice polls
- Rating polls
- Polls with expiration dates
- Polls that can be embedded in other websites
When voting, users can optionally provide basic demographic information such as age, gender, and location.
This information is not required, but it allows poll results to be analysed across different demographic groups.
Results are displayed through charts showing both the overall distribution of votes and breakdowns based on demographic information. This provides a clearer view of how opinions differ between groups of people.
Users can also search for polls, explore current or popular topics, and view the latest results.
Moderation and Administration
Because the platform focuses on questions related to society and public life, newly created polls are not published automatically.
Every submitted poll is manually reviewed before it becomes publicly available.
I built a custom administration panel that allows me to:
- Review newly created polls
- Edit questions and available answers
- Publish or disable polls
- Manage users
- Monitor activity across the platform
- Review suspicious registrations and voting activity
Anonymous Voting and Abuse Prevention
One of the main challenges was allowing people to vote anonymously without making the system too easy to manipulate.
The platform uses several layers of protection:
- Temporary anonymous user accounts
- Google reCAPTCHA
- Request rate limiting
- IP address checks
- Proxy and VPN detection
- Additional monitoring through the administration panel
I integrated both GetIPIntel and IPQualityScore to identify potentially suspicious IP addresses.
I met the developer of one of these services online, and he provided the project with a large free usage limit that continues to work today. This has allowed Anketi.bg to retain part of its abuse-protection system without creating ongoing service costs.
Real Users
Since its launch, Anketi.bg has reached approximately 10,000 users.
The project has not been actively developed for a long time, but it continues to operate today. People still periodically visit the platform, create polls, and vote.
For me, it is a good example of a project that started as a learning experience, reached real users, and remained operational for years without major ongoing development.
Architecture
The project is divided into two separate parts:
- A React frontend application
- An ASP.NET Core backend and REST API
The frontend is built as a single-page application using React, TypeScript, and React Router.
The backend is written in C# with ASP.NET Core. It handles polls, votes, user accounts, authentication, moderation, administration, abuse prevention, and database communication.
The data is stored in Microsoft SQL Server and managed through Entity Framework Core.
The application is hosted on SmarterASP.NET. The production build of the React application is copied into the ASP.NET project’s wwwroot directory, allowing the frontend and API to be served as a single website.
Cloudflare is used for DNS management, caching, DDoS protection, and a basic additional layer of traffic security.
What I Would Change Today
The project’s biggest technical limitation is that the frontend is a standard React single-page application without server-side rendering.
This makes search engine optimisation more difficult and limits how search engines and social platforms process individual poll pages.
Another important architectural decision was using a separate React frontend and ASP.NET backend.
At the time, I wanted to learn React, C#, and ASP.NET Core simultaneously. However, this made development, deployment, and long-term maintenance significantly more complicated.
Despite these limitations, the project gave me the opportunity to build a complete full-stack application and go through the entire process—from the initial idea to a production system used by real people.
Technologies
Frontend
- React 17
- TypeScript
- Create React App
- React Router
- Redux Toolkit
- Material UI
- Axios
- Recharts
- React Helmet
- Google reCAPTCHA
- Google Analytics 4
- Sentry
- Cypress
Backend
- C#
- ASP.NET Core 3.1
- REST API
- Entity Framework Core
- Microsoft SQL Server
- ASP.NET Identity
- JWT authentication
- Google authentication
- Facebook authentication
- IP rate limiting
- GetIPIntel
- IPQualityScore
Hosting
- SmarterASP.NET
- IIS
- ASP.NET Core Module
- Cloudflare