andhbhakt README

The project's README from github.com/JCRYDER3/andhbhakt. As one markdown file: README.md.

Andhbhakt.org

A civic accountability platform that cross-references official government announcements against Comptroller and Auditor General (CAG) audit findings — so citizens can see the gap between political promises and ground reality.

Live site: andhbhakt.org


What it does

Stack

Layer Tech
Monorepo pnpm workspaces
Runtime Node.js 24, TypeScript 5.9
API Express 5 (artifacts/api-server)
Frontend React 19 + Vite + Tailwind CSS (artifacts/govlens)
Database PostgreSQL + Drizzle ORM (lib/db)
Validation Zod v4 + drizzle-zod (lib/api-zod)
API codegen Orval — OpenAPI spec → typed hooks + Zod schemas (lib/api-spec)
Bot protection Cloudflare Turnstile + HMAC-signed session cookie

Quick start

# Requires pnpm — https://pnpm.io
pnpm install

# Copy env vars and fill in your values
cp .env.example .env

# Create tables
pnpm --filter @workspace/db run push

# Load seed data (schemes, CAG audits, PIB entries — ~800 rows)
psql "$DATABASE_URL" -f lib/db/seed.sql

# Start the API server (port from $PORT env var)
pnpm --filter @workspace/api-server run dev

# Start the frontend (separate terminal)
pnpm --filter @workspace/govlens run dev

Environment variables

See .env.example for the full list. Minimum required:

Variable When Description
DATABASE_URL Always PostgreSQL connection string
PORT Always API server port (Replit sets this automatically)
SESSION_SECRET Production 64-char hex — signs session cookies. Generate: openssl rand -hex 32
ADMIN_TOKEN Production Token for /api/admin/* routes (X-Admin-Token header)
TURNSTILE_SECRET_KEY Production Cloudflare Turnstile bot-check secret
ALLOWED_ORIGIN Production CORS origin (e.g. https://govlens.in)

Where things live

artifacts/
  api-server/src/
    routes/          Express route handlers
    middlewares/     Auth, rate-limiting, cache, session
    jobs/            Background jobs (news fetcher)
  govlens/src/
    pages/           Frontend page components
    data/            Static civic data — schemes, state facts, ministers, manifestos, CAG reports
lib/
  db/                Drizzle schema + migrations
  api-zod/           Auto-generated Zod schemas
  api-spec/          OpenAPI 3.1 spec (openapi.yaml)

Architecture decisions

Static data in source files — scheme details, state facts, minister profiles, manifesto promises, and CAG report narratives live as TypeScript constants in artifacts/govlens/src/data/. This makes every data point auditable, diff-able, and contribution-friendly without a CMS. Only dynamic data (live PIB entries, CAG audit records, news) lives in the database.

Session cookie, not JWT — The Turnstile gate issues an HMAC-signed cookie. The server refuses to start in production without SESSION_SECRET.

Cloudflare in front — Production traffic passes through Cloudflare Turnstile + CF-Connecting-IP check + optional origin secret (CF_ORIGIN_SECRET). The cloudflareOnlyMiddleware is a no-op in development.

Admin via header only — X-Admin-Token is the only valid admin auth mechanism. Query-string tokens are rejected (they appear in server logs and browser history).

Data sources

All civic data is sourced from public documents:

Contributing

  1. Fork the repo and clone locally.
  2. Copy .env.example → .env and fill in DATABASE_URL, SESSION_SECRET, and ADMIN_TOKEN.
  3. Run pnpm install then pnpm --filter @workspace/db run push.
  4. Data corrections go in artifacts/govlens/src/data/ — each file has inline source citations.
  5. Open a PR with the source URL for any data change.

License

MIT

andhbhakt (JCRYDER3/andhbhakt)

Searching Database…

Что это?Andhbhakt.org — платформа гражданского контроля, которая сопоставляет официальные заявления правительства Индии (PIB) с результатами проверок CAG и независимыми данными опросов, показывая разрыв между политическими обещаниями и реальным положением дел.
Это работающий сайт или то, что я устанавливаю и запускаю сам?Это прежде всего работающий сайт (andhbhakt.org), но полный исходный код — pnpm-монорепозиторий с API на Express и фронтендом на React + Vite + Tailwind, который можно развернуть и у себя.
Как запустить проект локально?Сделайте форк или клонируйте репозиторий, скопируйте .env.example в .env со значениями DATABASE_URL, SESSION_SECRET и ADMIN_TOKEN, затем выполните pnpm install, а следом — скрипт пуша базы данных.
Что нужно, прежде чем его запускать?Как минимум нужны Node.js 24, pnpm (проверяется preinstall-скриптом) и строка подключения к базе PostgreSQL; для продакшен-развёртывания также нужны SESSION_SECRET длиной 64 символа и секретный ключ Cloudflare Turnstile.
Какой главный подводный камень при развёртывании?Сервер отказывается стартовать в продакшене без заданного SESSION_SECRET, а админские маршруты принимают только заголовок X-Admin-Token — токены в query-строке отклоняются намеренно, потому что утекают в логи и историю браузера.
Для кого этот сайт?Для граждан Индии, журналистов и исследователей, отслеживающих выполнение госпрограмм и управление в штатах: данные и интерфейс двуязычны, с полным переводом на хинди.
Как строятся оценочные карточки госпрограмм?Каждая крупная госпрограмма с 2014 года оценивается по пресс-релизам PIB, результатам аудитов CAG и независимым наборам данных вроде NFHS-5, NCRB, MOSPI и ASER.
Что такое трекер манифестов?Он по каждому сроку полномочий сопоставляет обещания из предвыборных манифестов 2014, 2019 и 2024 годов с фактическими свидетельствами их выполнения.
Откуда берутся гражданские данные?Из публичных документов: деклараций ECI через ADR/myneta.info, отчётов CAG с cag.gov.in, пресс-релизов PIB с pib.gov.in и данных национальных опросов (NFHS-5, NCRB, MOSPI, ASER).
Как данные остаются достоверными и редактируемыми?Статические данные — детали программ, факты о штатах, профили министров — хранятся как константы TypeScript со ссылками на источники прямо в коде, вместо CMS, поэтому каждую точку данных видно в diff и легко дополнить через pull request.
Creator
JCRYDER3
Size
9.2 MB
Stars
151
Updated
CommitAug 13
Age
2mo
Commits · 90 Days