DEV Community

Cover image for How I Built VoteWise in 48 Hours Using Google Antigravity + Gemini AI
Manas kolaskar
Manas kolaskar

Posted on

How I Built VoteWise in 48 Hours Using Google Antigravity + Gemini AI

A civic education app for Indian voters — built entirely through prompts for PromptWars Virtual Hackathon


The Problem

Every election cycle in India, millions of first-time voters face the same confusion. How does the ECI actually conduct elections? What is VVPAT? How do I register? What even happens between announcement and results?

The existing resources are either government PDFs that nobody reads or Wikipedia articles that assume you already know half the terminology. There was a gap — a simple, conversational, AI-powered guide that treats first-time voters like intelligent people who just need things explained clearly.

That's what VoteWise is.


What I Built

VoteWise is a full-stack civic education app with four features:

  • Election Timeline — a visual 6-phase stepper walking through how India conducts a general election, from ECI announcement to oath-taking
  • Voter Guide — step-by-step voter registration walkthrough with official ECI portal links
  • Ask VoteWise — an AI chat powered by Gemini, locked to a neutral non-partisan civic educator persona
  • Civic Quiz — AI-generated MCQ quiz with instant grading and per-question explanations

Stack: React + Vite on the frontend, Python FastAPI on the backend, Google Gemini 2.5 Flash Lite as the AI brain.


The Google Antigravity Experience

This is the part worth talking about.

Google Antigravity is an agentic IDE — you describe what you want, and the agent writes, edits, and runs the code. I had never used it before this hackathon. By the end, I was building features faster than I could test them.

My workflow was:

  1. Write a precise prompt describing the feature, file structure, and design constraints
  2. Antigravity generates all the code across multiple files simultaneously
  3. Check the browser preview, fix what's broken, iterate

The key insight I learned: the quality of your output is entirely determined by the quality of your context files. Before writing a single line of code, I created five markdown files:

  • PROJECT_CONTEXT.md — stack, features, API endpoints, ports, constraints
  • ARCHITECTURE.md — full folder structure, module responsibilities, data flow diagrams
  • CODING_RULES.md — naming conventions, Tailwind token rules, API call patterns
  • UI_CONTEXT.MD — design tokens, component patterns, what NOT to do
  • FEATURE_LOG.md — every change tracked

Every prompt I gave Antigravity started with: "Read all files in project-docs/ first."

This meant the agent never forgot the design system, never introduced inconsistencies, and never had to be corrected on naming conventions. The context files were the real product — the code was just the output.


The Hard Parts

Tailwind v3 custom token resolution. I set up custom color tokens in tailwind.config.js but they weren't resolving in production. Spent an hour debugging before realizing the fix: bypass custom tokens entirely and use hardcoded hex values with Tailwind's arbitrary value syntax (bg-[#0F0F0F] instead of bg-base). Ugly but bulletproof.

Google GenAI SDK version chaos. The google-generativeai package had breaking API changes. GenerativeModel no longer accepts system_instruction as a constructor argument in newer versions. Then switching to google-genai (the new SDK) revealed the old package was falling back to Google Cloud ADC instead of using the API key. Fixed by using genai.Client(api_key=...) with an explicit dotenv path loaded relative to __file__.

Free tier rate limits. gemini-2.0-flash hit daily quota limits during testing. Solution: run client.models.list() to see what's actually available on your key, then switch to gemini-2.5-flash-lite which has higher free tier quota.

CORS on deploy. Local development worked perfectly. Production on Render + Vercel had CORS issues because allow_credentials=True conflicts with wildcard origins. Fixed by setting allow_origins=["*"] and allow_credentials=False for the hackathon deploy.


What I'd Build Next

  • Constituency lookup — user enters pincode, app shows their Lok Sabha + Vidhan Sabha constituency, current MP/MLA
  • Ballot explainer — upload a photo of your ballot, Gemini explains every candidate and measure
  • Multi-language support — Hindi, Tamil, Telugu, Bengali. Most first-time voters don't consume civic info in English
  • Election myth buster — common misconceptions about EVMs, NOTA, re-elections, debunked with ECI citations

Try It

Live app: https://vote-wise-manas.vercel.app

GitHub: https://github.com/manasscodes/VoteWise

Built for PromptWars Virtual Hackathon — Election Process Education challenge.


The entire app was built using Google Antigravity IDE. From blank folder to deployed full-stack app in 48 hours. The future of coding is writing really good instructions.

Top comments (0)