← Back to SansadSaar

SansadSaar — User guide

A tour of the eight corpora SansadSaar surfaces, how to set up AI, how the privacy model works, and what costs (if any) come with each option.

On this page

  1. What is SansadSaar?
  2. The eight corpora
  3. The interface at a glance
  4. Browse, search, filter
  5. Reading a report
  6. Setting up AI
  7. Generating an AI summary
  8. Asking questions about a report
  9. Web-search enrichment for Ask
  10. Exporting metadata and summaries
  11. Deep search (optional)
  12. Privacy & what's cached locally
  13. Costs & limits — what's free, what isn't
  14. Troubleshooting

1. What is SansadSaar?

A single-file browser app that opens up eight corpora of India's parliamentary and executive record — searchable, filterable, and (optionally) AI-readable in the same UI. Each corpus is scraped on its own schedule by an open-source GitHub Action and mirrored as static JSON on Cloudflare Workers. The app you're using runs entirely in your browser — there is no SansadSaar server, no account, no analytics.

Three things make it different from the upstream ParliamentWatch (whose Python scraper foundation powers the oversight corpora):

2. The eight corpora

The corpus chip strip near the top groups the eight datasets into four thematic buckets. Click any chip to switch the list and filter row to that corpus.

GroupCorpusWhat's in it
OversightDRSCReports from India's 24 Departmentally Related Standing Committees — 16 chaired by the Lok Sabha, 8 by the Rajya Sabha. The original SansadSaar corpus.
CAGAudit reports published by the Comptroller & Auditor General of India.
FCFinancial Committee reports — Public Accounts, Estimates, and Public Undertakings Committees.
LegislationBillsBills introduced or pending in Parliament, sourced from PRS Legislative Research.
LCLaw Commission of India reports — primary recommendations on legal reform.
ProceedingsDebatesLok Sabha and Rajya Sabha debate reports — full text where the upstream provides it.
QuestionsStarred and unstarred parliamentary questions from both houses.
ExecutiveGazettesCentral Gazette of India (Weekly + Extraordinary), pulled from the archive.org gazetteofindia collection with its bilingual OCR.

Header counts (X reports · Y with text) re-bind to whichever chip is active. The chip pill on the right ("DRSC: updated 4 hours ago") shows how fresh the mirror data is for that corpus.

Not every feature is available for every corpus. Full text extraction is rolling out by corpus — some have it (DRSC, CAG, FC, LC, Bills), some are metadata-only today (Questions). Filters, AI summary, and Ask only work when the report has text; the row badge tells you which state it's in.

3. The interface at a glance

SansadSaar main view: header with brand, header stats, AI pill, settings, help; corpus chip strip with all eight chips; filter row; report list with status badges

Main view — top header, corpus chip strip, filters, sortable report list.

The header runs across the top:

SansadSaar India's parliamentary record 14707 reports · 24 committees · 11369 with text AI off ?

Below the header is the corpus chip strip: eight chips grouped under four labels (oversight, legislation, proceedings, executive). The active chip is highlighted; everything below it — filter row, list, status badge — belongs to that corpus.

4. Browse, search, filter

The filter row is corpus-aware — each corpus emits the filters that make sense for it. The shapes you'll see:

CorpusFilters it shows
DRSCSearch · committee (24 options) · Lok Sabha term · category (DFG, AT, SUBJ, BILL, ASSURE) · sort
CAGSearch · ministry · sector · year · sort
FCSearch · committee (PAC / Estimates / PUC) · Lok Sabha term · category · sort
BillsSearch · house · status · year · sort
LCSearch · year · sort
DebatesSearch · house (LS / RS) · session · sort
QuestionsSearch · house · session · sort
GazettesSearch · category (Extraordinary / Weekly) · ministry · language (EN / HI / EN+HI) · year · sort

The Search box does substring match against titles by default. Open any report's Full text tab and that text becomes searchable too. To pre-fetch every extracted text for a corpus and search across its full body content, toggle Enable full-text search across <corpus> in Settings (size estimate shown — uses local cache after first fetch).

Each row also carries a status badge on the right:

Gazettes additionally carry an EN+HI badge when both English and Hindi text exist in the same record (the archive.org OCR is bilingual).

Cross-corpus search. Press ⌘K / Ctrl+K for the global search palette — it queries every loaded corpus at once and links straight to the matching report.

5. Reading a report

Report dialog open on a Standing Committee on Coal, Mines and Steel report, Details tab showing committee, report no., dates, PDF links

Report dialog — Details tab. PDF links go straight to sansad.in.

Click any row to open a four-tab dialog:

Details Full text AI summary Ask
If a report shows "Full text has not yet been extracted", it means the mirror's daily action hasn't gotten to it yet. Open the PDF directly via the Details tab in the meantime.

6. Setting up AI

Click the Settings icon in the header (or the AI status pill). Pick one of two modes:

Settings modal: AI mode = Local AI (WebGPU, Gemma); Local AI section with Model dropdown, Status pill, Load + Clear cache buttons

Settings → Local AI section.

Option A — Local AI (default, no key, free)

Runs an open-weight model entirely in your browser via Transformers.js on WebGPU. The first load downloads weights from Hugging Face; the browser caches them so subsequent visits are instant.

ModelSizeNotes
Gemma 4 E2B~1.5 GBDefault. Good balance of quality and download size.
Gemma 4 E4B~4.9 GBStronger summaries; takes longer to download and longer per response.
Ternary Bonsai 1.7B~470 MBSmallest download. Good for low-bandwidth or quick trials.
Ternary Bonsai 4B~1.1 GBSweet spot for quality vs. size on the Bonsai line.
Ternary Bonsai 8B~2.2 GBStrongest Bonsai option. Needs a recent GPU; 64K context.
  1. Open Settings. AI mode = Local AI.
  2. Pick a model from the dropdown.
  3. Click Load. First run shows a progress bar — your machine is downloading weights from Hugging Face.
  4. When the status pill says "<model> ready", you can use AI summary and Ask in any report dialog.
Auto-load on return visits. Once a model is cached, the next time you load SansadSaar it auto-loads in the background — no need to click Load again.
Requirements. WebGPU is needed. Recent Chrome / Edge / Brave (113+), Firefox 130+ on a recent device. If your browser doesn't support WebGPU the local-AI option is disabled and you'll see "No WebGPU" in the pill — switch to BYOK mode.

Option B — BYOK (Bring Your Own Key)

Settings modal: AI mode = BYOK; BYOK provider section with Provider dropdown (Anthropic), API key field, Model field

Settings → BYOK section. Provider list mirrors upstream ParliamentWatch.

Send the request directly from your browser to the provider you choose. Your key stays in this browser's localStorage — never sent to any other server.

  1. Open Settings. AI mode = BYOK.
  2. Pick a provider. Get a key from the provider's website (links in the table at §12 Costs & limits).
  3. Paste the key into the API key field. Optionally override the default model.
  4. Click Save. The pill turns to "BYOK: <Provider>".

7. Generating an AI summary

Report dialog AI summary tab with a generated summary about a Standing Committee report on AI in Electronics & IT

AI summary tab — a freshly-generated 4-section briefing.

  1. Make sure AI is configured (Local model loaded, or BYOK key saved).
  2. Click any report row to open the dialog.
  3. Switch to the AI summary tab.
  4. Click Generate. The model streams a 4-section plain-English briefing (what it's about, key findings, recommendations, why it matters).
  5. The summary is cached in your browser — opening that report again later shows it instantly. Click Regenerate for a fresh attempt.
Switching tabs while a summary is streaming — say to peek at the Full text — won't lose progress. Switch back and the latest token count is what you'll see.

8. Asking questions about a report

Report dialog Ask tab with system message and a chat input with Send button

Ask tab — chat input scoped to the open report.

  1. From the dialog, switch to the Ask tab.
  2. Type a question. Press Enter or click Send.
  3. The model gets the report's full text (truncated to fit the context window) plus your cached summary if one exists. It answers from the report only.
  4. Each new question + answer is appended to the thread for the duration of the dialog. Closing the dialog resets the thread.
Ask uses any cached AI summary as additional context, so generating a summary first sometimes produces sharper answers — especially for "what does this report recommend?" style questions.

9. Web-search enrichment for Ask

Settings modal Web search section with Provider = Tavily, API key field, Save button

Settings → Web search section.

Optional. When configured, you get a 🌐 button next to Send in the Ask tab. Clicking it does a web search first and feeds the top results into the prompt alongside the report text. Useful for "is there recent news on this?" or "has the government acted on this since the report?" style follow-ups.

ProviderFree tierWhere to get a key
Tavily1,000 queries/monthapp.tavily.com
Brave Search2,000 queries/monthapi.search.brave.com
SearXNG (self-hosted)Unlimited (you run it)Use any public instance with JSON output enabled, or self-host from github.com/searxng/searxng
  1. Settings → Web search section.
  2. Pick a provider. For Tavily / Brave, paste your API key. For SearXNG, paste the instance URL (e.g. https://searx.example.org).
  3. Save. The 🌐 button appears in the Ask tab.

10. Exporting metadata and summaries

Two buttons live in the toolbar above the report list:

Both downloads happen client-side — nothing leaves your machine.

By default, search hits report titles. The instant you open a report's Full text tab, that body becomes searchable too — and stays cached locally forever. If you want to search across the entire corpus' body content without opening reports one-by-one, enable Deep search in Settings — independently per corpus.

  1. Open Settings → scroll to the per-corpus search section for the corpus you want to deep-search.
  2. Tick "Enable full-text search across <corpus>". The estimate line tells you how much will download.
  3. Save. The app starts fetching every extracted text in the background (throttled). A small status appears below the filter row while it indexes.
  4. Once done, search hits body content for that corpus's full backfill. Cached locally — return visits use zero new bandwidth for it.
Why opt-in per corpus? A fully-extracted corpus can be a few hundred MB of text. Default-on across all eight would be unkind to first-time visitors on mobile and to the data mirror's bandwidth. The opt-in flow is the polite default; you flip on only the corpora you actually want to deep-search.

12. Privacy & what's cached locally

SansadSaar has no server. Everything you generate stays in your browser:

What leaves your browser:

What never happens: no analytics, no accounts, no telemetry, no server logs (no server). The page is a static index.html served from Cloudflare Workers, on the custom domain.

13. Costs & limits — what's free, what isn't

Three layers of cost. The first is always free; the other two depend on your choice.

Layer 1 — SansadSaar infrastructure

ComponentCostNotes
The app itselfFreeSingle static index.html, served via Cloudflare Workers Static Assets.
Scheduled scrapersFreeGitHub Actions free tier. Eight corpora, eight crons — hourly to daily depending on upstream cadence.
Data hostingFreeThree CF Workers Static Assets deployments (document-corpus + proceedings + gazettes). Under CF's free-tier file-count and bandwidth limits.
Custom domain (Cloudflare)FreeCloudflare DNS + Workers, free tier.

Layer 2 — Local AI inference

ModelCostLimits
Gemma 4 / Ternary Bonsai (any size)FreeRuns on your GPU. Bandwidth: one-time download, then nothing. CPU/GPU time is yours.

Layer 3 — BYOK API providers (optional)

ProviderFree tierPay-as-you-go
Anthropic (Claude) None — paid only. ~$3/M input · $15/M output (Sonnet 4.5). A 50-page summary ≈ $0.05–$0.10.
OpenAI (GPT) None on most models. Some accounts get $5 trial credit. ~$0.15/M input · $0.60/M output (GPT-4o-mini). A summary ≈ $0.005.
Google Gemini Yes. 15 req/min, 1M tokens/day free. Get a key at aistudio.google.com. Above the free tier, ~$0.075/M input · $0.30/M output (Gemini 2.5 Flash).
Groq Yes. Free tier with rate limits (~30 req/min). Inference is very fast (Llama 3.3 70B in seconds). Get a key at console.groq.com. Pay tier available for higher rate limits.
OpenRouter Yes. Free models (look for :free suffix in the model name). Get a key at openrouter.ai. Pay-as-you-go for premium models from many providers.
Ollama Yes — fully free. Runs on your computer. Install from ollama.com, then ollama pull llama3.2. Set OLLAMA_ORIGINS=https://sansadsaar.naklitechie.com when starting Ollama so the browser can reach it.
Custom OpenAI-compatible Whatever your endpoint charges (or doesn't). For self-hosted vLLM / LM Studio / Together.ai etc.

Layer 3b — Web-search enrichment (optional)

ProviderFree tierPay-as-you-go
Tavily1,000 queries/month$10–$80/month for higher tiers.
Brave Search2,000 queries/monthFrom $3/CPM (1,000 queries).
SearXNGFree, self-hosted
Recommended free path for most people. Local AI = Gemma 4 E2B (or Ternary Bonsai 1.7B if low on bandwidth) + Tavily for search enrichment. You'll never see a bill.

14. Troubleshooting

The local model won't load

Generation is slow

Ollama returns CORS errors

Ollama's HTTP API doesn't allow cross-origin requests by default. Set OLLAMA_ORIGINS when starting Ollama:

OLLAMA_ORIGINS="https://sansadsaar.naklitechie.com" ollama serve

If you opened the app via http://localhost:8000 for local dev, set OLLAMA_ORIGINS=http://localhost:8000 instead.

The mirror is missing data

Each corpus has its own GitHub Action on its own schedule — DRSC daily, CAG / FC / LC / Bills daily, Debates 2-hourly, Questions hourly, Gazettes hourly. A new upstream record typically appears in SansadSaar within that corpus's next cycle. On a fresh visit, the latest data loads automatically; if you've linked Save-to-Disk, the staleness check picks up updates and re-syncs in the background.

Where do credits live?

Help modal Credits tab showing Built on top of ParliamentWatch, Gazettes corpus inspired by egazette, open-source pieces, built by Chirag Patnaik, source links

Help → Credits tab. Open from the ? button in the header.

Built on top of ParliamentWatch by Pranay Kotasthane — the original DRSC scraper, committee config, and core idea are his. The Gazettes corpus shape is inspired by egazette by Sushant Sinha (independently implemented; no code copied). SansadSaar repackages all of this with on-device AI and the additional corpora. Full credit list in the Help → Credits tab.