Inspiration

I built CivicSync out of frustration. In my city, planning and development decisions seem to happen behind closed doors. Developers, lawyers, and city councillors have a seat at the table, but regular residents? Most of us don't even know the table exists. Zoning amendments, new developments, road changes... they all get posted on clunky municipal websites buried under layers of jargon, and by the time anyone in the neighborhood hears about it, the decision is already made.

I wanted to build something that would level that playing field. Something that could automatically monitor the city's planning portal, translate the bureaucratic language into plain English, and give everyday people a real voice in the process.

Then, during a test run of the CivicSync MVP, the app proved its own case. The system scraped 83 planning applications from london.ca and flagged something none of us in the neighborhood knew about: a proposal to build a cemetery directly across the street from our homes. I live in a rural area outside London, Ontario. There is no municipal water supply here. Every household relies on well water. A burial site that close to our community is a genuine environmental risk. Biological runoff from gravesites can contaminate groundwater, which is our only water source. Not a single person on our road had been notified in any meaningful way, and the public feedback window had already closed.

The city ultimately declined the project due to environmental concerns. But that was luck, not civic participation. If CivicSync had existed earlier, my neighbors and I could have been alerted the moment the application was filed, understood what it meant in plain language, and submitted our objections before the deadline passed.

That experience confirmed exactly why I was building this. The blindspot is real, and it affects real people.

I only heard about the Amazon Nova AI Hackathon 12 days ago. As a solo developer with zero prior full-stack experience, I was able to put this entire application together in under two weeks because of what Nova makes possible, combined with vibe coding through Emergent. The AI did not just power the app. It made building the app feasible for someone like me.

What it does

CivicSync is a full-stack Civic engagement platform with four core features, each powered by a different Amazon Nova capability:

  1. Live Data Scraping and Monitoring CivicSync automatically scrapes the City of London's planning portal (london.ca) every 24 hours, extracting real planning notices across all pages. No mock data. Every notice you see in the app is real, current, and linked to its source.

  2. Visual Site Plan Decoder (Nova 2 Lite) Click any notice and Nova 2 Lite translates dense zoning documents into plain English. "Official Plan and Zoning Amendment" becomes "This developer wants to change the rules for what can be built on this lot, from single-family homes to a mixed-use building with retail on the ground floor."

  3. Voice Council Roleplay (Nova 2 Lite + Nova 2 Sonic) CivicSync lets you practice speaking at a council meeting in a realistic voice conversation with an AI councilor named Karen. You speak into your microphone and Nova 2 Lite powers the councilor's conversation logic. She listens, asks follow-up questions, and pushes back on weak arguments. Nova 2 Sonic is integrated for voice synthesis using the "tiffany" female voice, with browser-based TTS as a fallback for environments without the full SDK. When you end the session, you get detailed coaching: confidence score, clarity analysis, strengths, areas for improvement, and suggested talking points.

  4. One-Click Advocacy (Nova Act + Nova 2 Lite + Resend) Select a notice, state your position, and Nova 2 Lite drafts a personalized advocacy letter. Nova Act uses act_get with Pydantic schemas to extract the assigned planner's contact information directly from the city's website. The letter is then emailed to the planner automatically via the Resend API. One click, your voice is heard.

Plus: a Neighborhood Impact Dashboard with real-time analytics, upcoming meeting alerts, and notice expiration tracking.

How I built it

This was my first full-stack application. I had no prior experience with React, FastAPI, or the AWS SDK...None. I built the entire thing in under 12 days as a solo developer, using Amazon Nova for the AI capabilities and vibe coding through Emergent to accelerate development.

Frontend: React + Tailwind CSS + Shadcn UI + Recharts Backend: FastAPI (Python) + MongoDB AI Stack: Amazon Nova 2 Lite (us.amazon.nova-lite-v1:0) - Powers the site plan decoder, written statement coaching, council roleplay conversation logic, advocacy letter drafting, and session feedback analysis

Amazon Nova 2 Sonic (amazon.nova-sonic-v1:0) - Integrated for voice synthesis in the council roleplay using the "tiffany" female voice via bidirectional streaming. Requires Python 3.12+ with aws-sdk-bedrock-runtime. Falls back gracefully to browser SpeechSynthesis in environments without the full SDK.

Amazon Nova Act - Automates form submission on municipal websites using act for navigation and act_get with Pydantic schemas for structured data extraction (planner contacts, file numbers, deadlines)

Resend API - Email delivery for advocacy letters

Web Speech API - Browser-based speech-to-text for real-time voice input in the council roleplay

Data Pipeline: BeautifulSoup4 scrapes london.ca across all pagination pages plus the public notices section. Automatic deduplication and expired notice detection. Daily 6 AM auto-refresh via asyncio background scheduler. MongoDB stores real planning notices with full metadata.

Architecture Highlights: Stateful multi-turn conversation management for the council roleplay, with full conversation history passed to Nova 2 Lite for context-aware responses.

Nova 2 Sonic voice pipeline: after Nova 2 Lite generates the councilor's text, the response is passed to Nova Sonic's bidirectional stream for audio synthesis with the "tiffany" voice. When the SDK is not available (Python < 3.12), the frontend seamlessly falls back to browser SpeechSynthesis with a matched female voice.

Adaptive feedback system: ending a session without speaking gives a 0/100 with specific advice on how to start. A full conversation gets turn-by-turn analysis.

Nova Act structured extraction: act_get with Pydantic schemas (PlanningApplication, CityPlannerContact) to pull file numbers, planner emails, and deadlines directly from planning pages Graceful degradation at every layer: voice input falls back to text, Nova Sonic falls back to browser TTS, Nova Act falls back to email delivery via Resend

Challenges I ran into

Building a full-stack app with zero experience. I had never built anything like this before. Learning React, FastAPI, and the AWS SDK at the same time was a steep curve. Amazon Nova's clear API and documentation made the AI integration the easiest part, which says a lot about the platform.

Making the voice conversation feel real. Early versions had the user typing responses, which felt nothing like a real council meeting. The breakthrough was switching to voice input, having users actually speak into their microphone and hear the councilor respond. I integrated Nova 2 Sonic with the "tiffany" female voice for Councilor Karen's speech synthesis, with browser TTS as a graceful fallback. Getting speech recognition, multi-turn conversation state management, and voice output to work together smoothly took significant iteration.

Navigating SDK requirements. Nova 2 Sonic's bidirectional streaming API requires the aws-sdk-bedrock-runtime package, which needs Python 3.12+. The cloud deployment runs 3.11, so I architected the voice pipeline with a clean fallback chain: try Nova Sonic, then fall back to browser TTS. The code is production-ready for Python 3.12+ environments, and both paths deliver the same conversational experience.

Scraping real government data. Municipal websites are not built for programmatic access. London.ca paginates results, uses inconsistent HTML structures across different sections, and has no API. Building a robust scraper that handles all pages, deduplicates notices, and detects expired ones required careful engineering.

Smart feedback calibration. Early versions gave a 70/100 score even when the user said nothing. I had to add participation detection so the coaching is honest. Silence gets a 0 with encouragement, not a fake pat on the back.

Accomplishments that I'm proud of

  • Real planning notices scraped from a live government website, with no mock data anywhere
  • Voice-to-voice council roleplay that genuinely prepares people for public speaking at municipal meetings
  • End-to-end civic workflow: discovering a notice, understanding it, practicing your response, and submitting formal feedback, all in one platform
  • Built as a solo developer with zero prior full-stack experience, in under 12 days, demonstrating how accessible Amazon Nova makes building sophisticated AI applications
  • Every Nova model family represented: Nova 2 Lite for reasoning, Nova 2 Sonic for voice synthesis, and Nova Act for UI automation and structured data extraction

What I learned

Amazon Nova 2 Lite is remarkably good at structured output. Asking it to return JSON with specific fields for coaching feedback, tone analysis, and talking points worked consistently without complex prompt engineering. The converse API made multi-turn conversation management straightforward. Just maintain a message history and pass it with each call.

Nova Act's approach to UI automation is genuinely different from traditional web scraping. Instead of brittle CSS selectors, it understands the intent of what you are trying to do on a webpage. I used act_get with Pydantic schemas to extract structured planning data (file numbers, planner contacts, deadlines) directly from london.ca pages. For civic technology, where government websites change their layouts frequently, this intent-based approach is critical.

Nova 2 Sonic's bidirectional streaming architecture is purpose-built for real-time voice conversations. While the full SDK requires Python 3.12+, the integration pattern (send text to Sonic, receive audio output, play via Web Audio API) is clean and production-ready. The graceful fallback to browser TTS means users always get a voice experience regardless of the runtime environment.

The biggest lesson: AI lowers the barrier to building things that matter. I am not a professional developer. Twelve days ago I could not have built any of this. Nova's capabilities, combined with clear documentation and vibe coding through Emergent, made it possible for one person to build a platform that could genuinely help their neighbors participate in democracy.

What's next for CivicSync

This version of CivicSync is built for London, Ontario. But the architecture is designed from the ground up to scale beyond a single city.

Dynamic location input: Future versions will accept a user's city, town, or village as input. Nova Act would then locate the corresponding municipal planning portal automatically, configure the scraper, and begin monitoring. The same workflow that powers London today could serve any municipality in Canada or beyond.

Nova Act as a universal civic navigator: Instead of hardcoding URLs for a single city, Nova Act's intent-based browser automation can adapt to any government website layout. Point it at a new city and it finds the planning applications, extracts the data, and identifies the right contacts.

Multi-language support: Many residents most affected by zoning changes are non-English speakers. Nova 2 Lite's multilingual capabilities could make CivicSync accessible in dozens of languages.

Community alerts: Push notifications when a new notice appears in your area or when a comment deadline is approaching.

Expanded Nova Act workflows: Beyond submitting feedback, Nova Act could monitor the status of applications, track council votes, and notify residents of outcomes.

The goal is simple: no resident, in any community, should be caught off guard by a planning decision that affects their home. CivicSync is the starting point.

Built With

Share this project:

Updates

Submission history