factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A source-cited record of Indian defence, infrastructure, trade and manufacturing since 2001 —
with an honest assessment of how good it actually is, measured against global benchmarks rather
than against India's own past.
The core rule: every number rendered on this site must be traceable to a named source with a
URL and a verification date. This is enforced mechanically — npm run validate fails the build
if any series lacks a definition, a unit, a resolvable source, or a confidence grade.
No environment variables are needed. The site ships with committed data and works offline.README 전문 보기 ↗A source-cited record of Indian defence, infrastructure, trade and manufacturing since 2001 — with an honest assessment of how good it actually is, measured against global benchmarks rather than against India's own past.
The core rule: every number rendered on this site must be traceable to a named source with a
URL and a verification date. This is enforced mechanically — npm run validate fails the build
if any series lacks a definition, a unit, a resolvable source, or a confidence grade.
npm ci
npm run dev # http://localhost:3000
No environment variables are needed. The site ships with committed data and works offline.
npm test # validate data + audit registry + schema tests + typecheck
npm run etl # refresh World Bank series and the news tracker
npm run etl:dry # show what would be fetched, touch no network
npm run db:check # is the bharat_tracker schema reachable?
npm run db:push # seed Postgres from the committed JSON
npm run db:pull # hydrate the JSON from Postgres (runs before every build)
chad3456/india-defence-infra-corridor.vercel.json already
sets the build command so the data-validation gate runs before every deploy.Region is pinned to bom1 (Mumbai) in vercel.json, which is closest to the audience.
The site works with no database at all — chart data is committed as JSON and the tracker
falls back to data/live/news.json. Connecting Postgres makes it the store of record and
lets the news tracker refresh continuously instead of on rebuild.
Everything lives in a dedicated bharat_tracker schema. Nothing is created in public,
no public object is altered, and grants are scoped to that schema — so this is safe in a
Supabase project shared with other projects. drop schema bharat_tracker cascade removes
this project completely and touches nothing else. The schema tests assert the isolation
(npm run test:schema).
Two ways. Both are idempotent and produce the same result: 41 sources, 114 series, 1,742 data points, 434 peer values, 20 events.
A. Paste the SQL (no setup at all). Open supabase/seed.sql, copy it,
paste into the Supabase SQL Editor, run. Apply
supabase/migrations/0001_init.sql first if the schema
does not exist yet.
B. One secret, then a button. Add SUPABASE_DB_URL under
Settings → Secrets and variables → Actions, then Actions → Provision database → Run
workflow. It applies the schema, seeds it, and prints the row counts in the run summary.
SUPABASE_DB_URL is Supabase → Settings → Database → Connection string (URI), with your
real password substituted for [YOUR-PASSWORD]. If Supabase was connected through the Vercel
integration, POSTGRES_URL_NON_POOLING is the same value.
Seeding runs over plain Postgres rather than the REST API, so it needs nothing else and does not depend on the schema being exposed to PostgREST first.
supabase/seed.sql is committed so it can be read and pasted, and CI fails if it drifts from
the JSON it is generated from (npm run db:seed-check).
Without these the site renders from the committed JSON, which is complete. With them, the news tracker and the events map refresh without a redeploy.
| Secret / env var | Where to find it |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Settings → API → Project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Settings → API → anon / publishable key |
SUPABASE_SERVICE_ROLE_KEY | Settings → API → service role key — repo secret only, never the browser |
Set them in Vercel → Settings → Environment Variables for the app, and as repository
secrets for the scheduled pipeline. The Vercel Supabase integration injects SUPABASE_URL /
SUPABASE_ANON_KEY automatically and the app reads either naming.
Reading over the API also needs bharat_tracker in Settings → API → Exposed schemas. The
migration tries to add it itself and warns if it lacks the rights.
Locally: copy .env.example to .env.local, then npm run db:check / db:push / db:pull.
npm run db:seed-sql prints the same SQL the workflow runs, if you would rather paste it into
the SQL editor.
data/
sources.json # the source register — every publisher, URL, tier, access date
series/*.json # chart data, one file per domain; ETL owns wdi.json
geo/ # India basemap + corridor geometry
live/ # pipeline output: news.json, last-run.json
lib/
types.ts # the data model, and the rules encoded in it
data.ts # loaders
transforms.ts # yoy / index / cagr / share — all labelled as derived
registry.ts # generates the chart specs
wdi-catalogue.ts # 66 World Bank indicators the ETL tracks
assessment.ts # the graded verdicts
scripts/
validate.ts # the data gate — runs before every build
audit-registry.ts # fails if the gallery drops below its target size
etl/ # connectors + orchestrator
570 charts are generated from 117 series × a set of transforms, rendered by one SVG chart component. Two rules keep the gallery honest:
pending, and
render an explicit awaiting data state rather than an empty axis pretending to be a finding.At the time of writing all 570 render on committed data; see docs/data-sources.mdx
for where each series comes from.
scripts/lib/validate-series.ts refuses to publish a series that breaks any of these:
confidence: "low" without a note explaining the uncertainty → rejectedprovenance: "think-tank" graded high confidence → rejected (estimates are not records)Gaps stay gaps. Where a figure could not be located the period is stored as null and the
chart shows a break in the line. Nothing is interpolated or back-filled.
Three connectors, all fail-soft:
X_BEARER_TOKEN is set; X has no free read tier.Nothing from the news connector ever becomes chart data. Press reports of government figures are tier-3 evidence: they flag that a number may have moved, and a human verifies against the primary release before any series changes.
A connector that fails leaves the previous committed data in place and marks the run partial,
so the site keeps serving last-known-good values. Output is written only after validation passes.
.github/workflows/pipeline.yml runs this every 6 hours — and on any push touching the ingest
code — committing only if data changed. docs/data-sources.mdx documents
every provider, tier and classification gate.
Read /methodology on the site for the full list. The big ones:
Underlying data is public-domain government and multilateral output; each figure links to its publisher. Not affiliated with any government body, party or contractor.