import { CodeBracketIcon, RocketLaunchIcon, BookOpenIcon, CubeIcon, ServerIcon, CircleStackIcon } from '@heroicons/react/24/outline'; export default function Developers() { return (
{/* Page Header */}

Developers & Civic Tech

Build civic tech solutions with open data and open source tools

{/* Hero Section */}

Build the Future of Civic Engagement

Open Navigator is 100% open source. Join developers worldwide building tools for transparency, accountability, and community empowerment.

View on GitHub Join Hackathons
{/* Tech Stack */}

Tech Stack

{/* Frontend */}

Frontend

  • • React 18 + TypeScript
  • • Vite + Tailwind CSS
  • • TanStack Query
  • • Recharts for visualizations
{/* Backend */}

Backend

  • • Python FastAPI
  • • LangChain + LangGraph
  • • OpenAI, Anthropic APIs
  • • Supabase Auth
{/* Data */}

Data

  • • 925 jurisdictions
  • • 43,726 nonprofits
  • • 6,913 meeting pages
  • • Medallion architecture
{/* Quick Links */}

Get Started

Documentation

Setup guides, API docs, and architecture overview

Open Datasets

Download CSV/Parquet files from HuggingFace

Contribute Code

Pick an issue, submit a PR, or propose new features

Join Hackathons

Build solutions at our quarterly civic tech hackathons

{/* API Example */}

API Example

          {`# Search meeting transcripts
import requests

response = requests.get(
  'http://localhost:8000/api/search/',
  params={
    'q': 'dental health',
    'state': 'AL',
    'limit': 10
  }
)

for result in response.json()['results']:
  print(f"{result['title']} - {result['date']}")
  print(f"Score: {result['score']}")
  print(result['snippet'])
  print()`}
        
); }