factcircuit
FactCircuit: an auditable claim-and-evidence verification loop with immutable provenance, staged checks, bounded retrieval, and reproducible evaluation.
Turn raw customer feedback into prioritized, explained decisions.
Translation pending
DataTypeScript · JavaScriptGitHub @AbhishekKumarCodeOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Turn raw customer feedback into decisions: what to fix first, and why.
Live app: https://insightflow-blond.vercel.app
Built for Build Battle 2026 (Frontend Arena, AI × Web Development).
The dataset, and why cleaning comes first
The sample file has 7,000 reviews but only 320 distinct ones. A few sentences repeat hundreds of times, so treating rows as customers gives the wrong ranking.Read the full README ↗Turn raw customer feedback into decisions: what to fix first, and why.
Live app: https://insightflow-blond.vercel.app Built for Build Battle 2026 (Frontend Arena, AI × Web Development).
| Requirement | Where it lives |
|---|---|
| Feedback management: submit, import CSV, search, filter, sample data | New session popup (upload CSV, paste, add one), /feedback, "Use sample data" on /import. Each import can be its own session with its own dashboard, tracker and reports |
| AI-powered analysis: sentiment, topics, grouping, Adaption | Issue groups and sentiment for all 320 distinct reviews; a key-free matcher for new feedback; Adaption cleaning on /import |
| Analytics dashboard: metrics, sentiment, issues, trends, filters | /overview: category, sentiment and period filters drive every widget |
| Recommendations: priorities with a reason | /priorities: ranked issues, the score arithmetic, quotes, and actions |
| Reports and tracking: save/track, export | /tracker (drag cards between columns), /reports (print to PDF, CSV export, copy summary to share in chat or email, saved reports you can reopen and delete) |
The sample file has 7,000 reviews but only 320 distinct ones. A few sentences repeat hundreds of times, so treating rows as customers gives the wrong ranking.
score = 100 × (0.40 × volume + 0.35 × negative share + 0.25 × severity)
It is a ranking heuristic, not a measurement, and the app shows the arithmetic for every issue.
Being plain about this matters more than sounding impressive.
scripts/label.mjs: rules written after reading all 320 distinct reviews. I cross-checked them with a live language model (DeepSeek, scripts/validate-llm.mjs): sentiment agreed on 318 of 320 reviews (99%). The model used finer issue names (74 vs my 21), so the curated groups are kept for stability. The model output is committed in data/llm-labels.json.src/lib/match.ts), with no key. Leave-one-out accuracy on the sample: 88% on issue, 96% on sentiment. When nothing is close it says so, and those reviews are grouped with each other by similarity into new issues (src/lib/group.ts). Those groups are named after their most-repeated review and get a severity from keywords (money and fraud words rank highest), so any dataset gets a ranking. The names are rough, not written by a model.src/lib/analyze.ts has a server-side model labeling function (AI SDK + DeepSeek, schema-validated) that is not wired into the UI.[email], [phone], [card] before anything is stored.First visit. The root URL opens a short welcome: real reviews on a board that you tap to sort into their issue, and the path from 7,000 reviews to one decision. After you continue once, the root URL goes straight to the dashboard. The welcome can be reopened from the avatar menu.
npm install
npm run dev # http://localhost:3000
npm run build && npm start
No environment variables are required. To re-run the offline model cross-check, put DEEPSEEK_API_KEY in .env.local and run node --env-file=.env.local scripts/validate-llm.mjs.
A browser test walks the full flow (filters, tracking, drag and drop, search, CSV export, saved reports, the import popup, personal-data flagging, duplicate protection):
npm start # in one terminal
node scripts/smoke.mjs # or: BASE=https://insightflow-blond.vercel.app node scripts/smoke.mjs
A second test covers the phone layout (bottom bar, bottom-sheet popup, card lists, swipeable rows, no sideways scroll at 320 to 414px wide):
node scripts/phone.mjs # or: BASE=https://insightflow-blond.vercel.app node scripts/phone.mjs
Next.js 16 (App Router, TypeScript), Tailwind CSS 4, Recharts, PapaParse, zod, Playwright (tests). Deployed on Vercel.
src/app/ pages: overview, feedback, priorities, tracker, reports, import
src/components/ shell, import popup, filters, shared UI
src/lib/ data layer, store, matcher, scan, Adaption results
scripts/ dedupe → label → build-analysis pipeline, Adaption summary, tests
data/ sample.csv, analyzed.json, Adaption summary + trimmed output
docs/ ADAPTION.md, DEMO.md, screens/, planning/ (early notes)
Data pipeline: node scripts/dedupe.mjs && node scripts/label.mjs && node scripts/build-analysis.mjs regenerates data/analyzed.json from data/sample.csv.