factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
인구 특성을 고려해 인도와 전 세계 유전체 데이터를 비교하고 차이점을 이해하기 쉽게 설명하는 연구 인터페이스
A population-aware genomic research interface that compares Indian and global genomic evidence and makes representation differences understandable.
데이터TypeScript · PythonGitHub @Surajk86온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A population-aware genomic research interface that compares Indian and global
genomic evidence — and makes the difference understandable.
Research and educational prototype. Not a clinical tool. It does not provide
diagnosis, treatment advice, disease prediction, or clinical decision support.
Modern genomic reference resources are built from the populations that were
sequenced, and those populations do not represent India's genetic diversity in
proportion to its size or its population structure.
That matters because a genomic number is always a statement about a group:README 전문 보기 ↗A population-aware genomic research interface that compares Indian and global genomic evidence — and makes the difference understandable.
Research and educational prototype. Not a clinical tool. It does not provide diagnosis, treatment advice, disease prediction, or clinical decision support.
Live: https://bharatgenome.vercel.app
Modern genomic reference resources are built from the populations that were sequenced, and those populations do not represent India's genetic diversity in proportion to its size or its population structure.
That matters because a genomic number is always a statement about a group:
BharatGenome puts Indian population evidence next to global reference evidence for the same query, explains the difference in plain language, links supporting literature, and states the provenance, confidence, and limits of every figure.
When a provider has no data, BharatGenome says so. It never estimates a value it cannot source.
Search a gene / variant / rsID
↓ Indian population evidence ┐
↓ Global reference evidence ┘ side by side
↓ Allele frequency differences, explained
↓ Supporting literature with population context
↓ Provenance, confidence, and limitations
| Route | What it is |
|---|---|
/ | The problem, the solution, and how a comparison reads. |
/explore | The product. Gene / variant / rsID search and the full comparison result. |
/learn-genomics | A supporting educational section: 22 concepts from DNA to population representation. (/learn redirects here.) |
/methodology | What is compared, how, live provider status, and the limits of this version. |
Learn Genomics is a supporting section inside BharatGenome, not the product.
Requires Node.js 20+ and Python 3.12+.
# 1. Frontend
npm install
cp .env.example .env.local # everything is optional; defaults work
npm run dev # http://localhost:3000
# 2. Backend (separate terminal)
python3 -m venv backend/.venv
backend/.venv/bin/pip install -r backend/requirements-dev.txt
npm run dev:api # http://localhost:8000
Point the frontend at the local backend by setting, in .env.local:
NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:8000
On Vercel this is left empty: vercel.json rewrites /api/* to the Python
function, so the browser calls the same origin.
npm run build # Next.js production build
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm run test:api # pytest
cd backend && .venv/bin/ruff check . && .venv/bin/mypy
src/ Next.js App Router frontend
├── app/ routes: /, /explore, /learn-genomics, /methodology
├── components/ shared UI primitives
├── features/
│ ├── explore/ the result workflow
│ ├── genomic-search/ search input
│ ├── population-comparison/ allele frequency bars, comparison panel
│ ├── literature/ literature cards
│ ├── learn-genomics/ educational concepts
│ └── methodology/ live provider status
└── lib/ API client + the shared domain contract (types.ts)
backend/app/ FastAPI backend
├── schemas.py the contract, mirroring src/lib/types.ts
├── providers/ GenomicProvider and its scoped subclasses
├── comparison/engine.py the comparison layer
├── literature/ LiteratureProvider → PubMedProvider
└── services/analysis.py orchestration for /api/analyze
api/index.py Vercel entrypoint that serves the FastAPI app
supabase/ config + migrations (application metadata only)
Provider and comparison abstractions:
GenomicProvider ComparisonEngine
├── IndianPopulationProvider ├── allele-frequency comparison
├── GlobalReferenceProvider ├── population comparison
└── FuturePopulationProvider ├── coverage / availability comparison
└── evidence assessment
LiteratureProvider
└── PubMedProvider
Details: docs/architecture.md · docs/methodology.md · docs/data-providers.md · docs/contributing.md
| Endpoint | Purpose |
|---|---|
GET /api/health | Version and the configured/unconfigured state of every provider. |
POST /api/analyze | {query, kind} → identity, Indian and global evidence, comparison, evidence, literature, provenance, limitations. |
POST /api/literature/search | {query, population_context, limit} → literature results. |
This repository contains no downloaded genomic datasets and no synthetic genomic data standing in for one. GenomeIndia, IndiGen, gnomAD and similar resources are not vendored here.
Instead the repository ships provider contracts. A provider is the only component permitted to produce a genomic number, and each is off until its endpoint environment variable is set. With none set, the application runs and reports:
No live genomic provider is configured yet.
That is the honest state, and it is preferred to a plausible-looking number. The one set of invented figures anywhere in the product is the teaching example on the home page, which is visibly labelled "Illustrative example — not real data".
Copy .env.example to .env.local. All are optional; nothing is required to
run the app.
| Variable | Scope | Purpose |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL | browser | API origin. Empty = same origin. |
INDIAN_PROVIDER_ENDPOINT / _API_KEY | server | Indian population provider. |
GLOBAL_PROVIDER_ENDPOINT / _API_KEY | server | Global reference provider. |
PUBMED_BASE_URL / PUBMED_API_KEY | server | Literature provider. |
BHARATGENOME_ALLOWED_ORIGINS | server | CORS origins, comma separated. |
NEXT_PUBLIC_SUPABASE_URL / _ANON_KEY | browser | Supabase client (RLS enforced). |
SUPABASE_SERVICE_ROLE_KEY | server only | Bypasses RLS. Never NEXT_PUBLIC_. |
Only NEXT_PUBLIC_* variables reach the browser. API keys and the service role
key are server-side only and must never be given that prefix.
Supabase stores application metadata only. No individual-level genetic data is stored anywhere in the system.
supabase link --project-ref <your-project-ref>
supabase db push
Tables (supabase/migrations/):
provider_registry — which providers exist and which env var enables each
(descriptive only, never credentials). Publicly readable.search_events — which identifiers were looked up and whether providers
answered. No user identifiers, no genetic data. RLS: service role only.literature_cache — cached literature responses. RLS: service role only.app_metadata — key/value application state. Publicly readable.RLS is enabled on every table and defaults to deny; the two tables without a
policy are unreachable by anon and authenticated clients.
Frontend and backend deploy together as one Vercel project:
api/index.py is deployed as a Python function serving the FastAPI app, with
requirements.txt at the repository root.vercel.json rewrites /api/* to that function.vercel link
vercel env add INDIAN_PROVIDER_ENDPOINT production # optional, when available
vercel --prod
Server-side variables must be added without the NEXT_PUBLIC_ prefix so
they are never bundled into client JavaScript.
| Area | Start here |
|---|---|
| Indian / global providers | backend/app/providers/ + docs/data-providers.md |
| Literature | backend/app/literature/pubmed.py — only search() needs filling in |
| Comparison & visualisation | backend/app/comparison/engine.py, src/features/population-comparison/ |
| Learn Genomics | src/features/learn-genomics/concepts.tsx |
| Integration & polish | src/features/explore/, backend/app/services/analysis.py |
See CONTRIBUTING.md for branching, PR expectations, and the step-by-step for adding a provider.