factcircuit
FactCircuit는 불변 출처와 단계별 검증, 제한된 검색, 재현 가능한 평가를 제공하는 감사 가능한 주장·증거 검증 루프입니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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).
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.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.