{"id":50472457,"url":"https://github.com/sayeedjoy/factdrop","last_synced_at":"2026-06-01T11:03:43.754Z","repository":{"id":361408991,"uuid":"1230110193","full_name":"sayeedjoy/factdrop","owner":"sayeedjoy","description":"ai powered fact-check engine","archived":false,"fork":false,"pushed_at":"2026-05-30T14:24:17.000Z","size":9735,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-30T15:11:06.439Z","etag":null,"topics":["ai","aisdk","fact-checking","mcp-server","misinformation","misinformation-detection","open-source","openrouter","verification"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sayeedjoy.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-05T17:29:17.000Z","updated_at":"2026-05-30T14:24:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sayeedjoy/factdrop","commit_stats":null,"previous_names":["sayeedjoy/factdrop"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/sayeedjoy/factdrop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayeedjoy%2Ffactdrop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayeedjoy%2Ffactdrop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayeedjoy%2Ffactdrop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayeedjoy%2Ffactdrop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sayeedjoy","download_url":"https://codeload.github.com/sayeedjoy/factdrop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sayeedjoy%2Ffactdrop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33771630,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-01T02:00:06.963Z","response_time":115,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","aisdk","fact-checking","mcp-server","misinformation","misinformation-detection","open-source","openrouter","verification"],"created_at":"2026-06-01T11:03:43.661Z","updated_at":"2026-06-01T11:03:43.746Z","avatar_url":"https://github.com/sayeedjoy.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FactDrop\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./public/logo.png\" alt=\"FactDrop\" width=\"520\" /\u003e\n\u003c/p\u003e\n\n![Next.js](https://img.shields.io/badge/Next.js-16-000000?logo=next.js\u0026logoColor=white)\n![React](https://img.shields.io/badge/React-19-20232A?logo=react\u0026logoColor=61DAFB)\n![TypeScript](https://img.shields.io/badge/TypeScript-6-3178C6?logo=typescript\u0026logoColor=white)\n![tRPC](https://img.shields.io/badge/tRPC-11-398CCB?logo=trpc\u0026logoColor=white)\n![TanStack Query](https://img.shields.io/badge/TanStack%20Query-5-FF4154?logo=reactquery\u0026logoColor=white)\n![PostgreSQL](https://img.shields.io/badge/PostgreSQL-Database-4169E1?logo=postgresql\u0026logoColor=white)\n![Drizzle](https://img.shields.io/badge/Drizzle%20ORM-0.45-C5F74F?logo=drizzle\u0026logoColor=111111)\n![Better Auth](https://img.shields.io/badge/Better%20Auth-1.5-111111)\n![Tailwind CSS](https://img.shields.io/badge/Tailwind%20CSS-4-06B6D4?logo=tailwindcss\u0026logoColor=white)\n![pnpm](https://img.shields.io/badge/pnpm-Only-F69220?logo=pnpm\u0026logoColor=white)\n\nFactDrop is an AI-powered fact-checking engine designed to make claim verification faster, more accessible, and more scalable. Instead of relying solely on manual fact-checking workflows, FactDrop combines large language models, web intelligence, fact-check databases, and source credibility analysis to automate much of the verification process.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./public/hero-v2.webp\" alt=\"FactDrop product interface\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n## Stack\n\n- Framework: Next.js 16, React 19, TypeScript 6\n- AI: Vercel AI SDK, Anthropic, OpenAI, Google, xAI, Vercel AI Gateway, MCP\n- API and data: tRPC, TanStack Query, Drizzle ORM, PostgreSQL, Zod\n- Auth and UI: Better Auth, Tailwind CSS, Radix UI, Zustand, next-intl\n- Search and media: Tavily, Exa, Firecrawl, Parallel, Vercel Blob, Cloudinary\n- Editing and visualization: Lexical, CodeMirror, Recharts, ECharts\n- Tooling and observability: Ultracite, Playwright, Vitest, Evalite, Langfuse, OpenTelemetry, Pino\n\n## Quick Start\n\n```bash\npnpm install\ncp .env.example .env.local\npnpm check-env\npnpm db:migrate\npnpm dev\n```\n\nDev server runs at `http://localhost:3000`.\n\nDev login shortcut (development only): `GET /api/dev-login`\n\n## Scripts\n\n```bash\npnpm dev                  # Start dev server (runs check-env + DB branch resolution first)\npnpm lint                 # Biome via ultracite\npnpm format               # Biome format (auto-fix)\npnpm test:unit            # Vitest only (needs local Postgres)\npnpm test:e2e             # Playwright only (uses .env.local)\npnpm test                 # E2E + unit\npnpm test:types           # Next typegen + full type-check\npnpm build                # Production build (prebuild runs check-env)\npnpm check-env            # Validate required env vars\n```\n\n## Configuration\n\n`chat.config.ts` is the single source of truth for feature switches and model/gateway behavior.\n\nFlow:\n\n`chat.config.ts` -\u003e `lib/config-schema.ts` -\u003e `lib/config.ts`\n\nUse this to configure:\n\n- Gateway selection\n- Enabled models and defaults\n- Tool toggles (MCP, search, URL fetch, code execution, docs, research)\n- Credit and rate-limit behavior\n\n## Database Notes\n\n- Schema: `lib/db/schema.ts`\n- Migrations: `lib/db/migrations/`\n- Production migration runner: `lib/db/migrate.ts` (runs when `VERCEL_ENV=production`)\n- Database connection: set `DATABASE_URL` to your PostgreSQL instance\n\n## Architecture Notes\n\n- Most product routes live under `app/workspace/*`\n- Legacy route aliases redirect to workspace routes via `next.config.ts`\n- `lib/db/queries.ts` is server-only\n- tRPC root router: `trpc/routers/_app.ts`\n- Prefer `protectedProcedure` for authenticated endpoints\n- Lazy prefetch pattern: call `prefetchQuery` (without `await`) in Server Components and hydrate on client\n\n## Verification Dataflow\n\n```mermaid\nflowchart TD\n    A([User Query]) --\u003e B{Image attached?}\n    B -- Yes --\u003e C[Extract claim from image\u003cbr\u003eOCR or describe via vision model]\n    B -- No --\u003e D[Split into claims\u003cbr\u003eLLM claim-splitter]\n    C --\u003e D\n    D --\u003e E{Single or multi?}\n    E -- Single --\u003e F[Run pipeline once]\n    E -- Multi --\u003e G[Run pipeline per sub-claim\u003cbr\u003ein parallel via same pipeline]\n    F --\u003e H\n    G --\u003e H\n\n    subgraph PIPE [Per-claim pipeline]\n      H{Bangla?} -- Yes --\u003e I[Translate to English\u003cbr\u003eAdd English query]\n      H -- No --\u003e J[Run in parallel via Promise.all]\n      I --\u003e J\n      J --\u003e K[Web search\u003cbr\u003eTavily + Exa + Parallel + MCP\u003cbr\u003eConcurrent and merged]\n      J --\u003e L[Google Fact Check API]\n      K --\u003e M{Results empty?}\n      M -- Yes --\u003e N[Firecrawl fallback search]\n      M -- No --\u003e O[Trust-rank sources\u003cbr\u003eSourceCheck MCP: IFFY + IFCN + GDI + internal rules]\n      N --\u003e O\n      O --\u003e P[LLM final verdict\u003cbr\u003eRating + note]\n      L --\u003e P\n    end\n\n    P --\u003e Q([Output\u003cbr\u003eRating, note, ranked sources])\n```\n\n## Testing\n\n- Unit tests: `pnpm test:unit` (Vitest)\n- E2E tests: `pnpm test:e2e` (Playwright projects: `chat`, `reasoning`, `artifacts`, `dashboard`)\n- Types: `pnpm test:types`\n\n## Package Manager\n\nUse `pnpm` only.\n\n## License\n\nApache-2.0\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayeedjoy%2Ffactdrop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsayeedjoy%2Ffactdrop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsayeedjoy%2Ffactdrop/lists"}