smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기AI Radiology Reporting
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
AI-native radiology reporting MVP: a worklist, a reading room with a DICOM viewer next
to a structured report editor and a copilot panel, streaming AI report generation from
shorthand findings, and a hybrid copilot (deterministic safety rules + LLM review +
guideline calculators). Reports go through a sign/amend lifecycle and export to FHIR R4
and PDF.
Demo project. Synthetic data only. Not for clinical use.
Live: https://radpilot.vercel.app (demo login available on request)README 전문 보기 ↗AI-native radiology reporting MVP: a worklist, a reading room with a DICOM viewer next to a structured report editor and a copilot panel, streaming AI report generation from shorthand findings, and a hybrid copilot (deterministic safety rules + LLM review + guideline calculators). Reports go through a sign/amend lifecycle and export to FHIR R4 and PDF.
Demo project. Synthetic data only. Not for clinical use.
Live: https://radpilot.vercel.app (demo login available on request)
Stack: Next.js 16 (App Router) · TypeScript · Supabase (Postgres, Auth, Storage, RLS) · Vercel AI SDK · Tiptap · Cornerstone3D · shadcn/ui + Tailwind v4 · Vitest · Playwright.
All sessions (0, 0b, Docs, Tracks A-D, Session 5) are done: auth and worklist, templates and streaming AI generation, the copilot/guidelines/lifecycle, the DICOM viewer and FHIR/PDF export, and the reading room that wires them together. See docs/sessions.md for how the work was split, and docs/demo-script.md for a 5-minute walkthrough of the seeded studies.
Requires Node 22 and Docker Desktop (running). The Supabase CLI is a dev dependency, installed by npm install.
npm install
cp .env.example .env.local
npm run db:start # local Supabase: API :54321, Studio :54323. Prints the keys.
Fill .env.local with the values db:start printed (run supabase status to see them
again): NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY (publishable or anon key) and
SUPABASE_SERVICE_ROLE_KEY (secret or service_role key). Then:
npm run db:reset # apply migrations and supabase/seed.sql
npm run dicom:generate # write the synthetic phantom DICOM to supabase/dicom/ (gitignored)
npm run dicom:upload # upload it to the private `dicom` bucket (uses the service role key)
npm run dev # http://localhost:3000
Log in as the demo radiologist: [email protected] / radpilot-demo (an admin, [email protected], has the same password).
supabase/seed.sql creates 2 users and 6 report templates (CT chest, CT head, CT
abdomen/pelvis, chest radiograph, US thyroid, mammography), then calls
seed_demo_data() for 25 synthetic studies. Study times are relative to now(), so
the worklist always looks fresh.
The demo has a shared login, so the studies are restored to this set every night at
07:00 UTC by reset_demo_data() (pg_cron), and on demand from the admin's user menu
(Restore demo data). Both live in
supabase/migrations/20261002000000_demo_data.sql.
Studies 1 to 10 each demo one feature, starting from an unread study:
| # | Exam | Patient | Priority | Demonstrates | Images |
|---|---|---|---|---|---|
| 1 | CTA chest | F 58 | STAT | Suspected PE: critical finding | ct-chest-phantom |
| 2 | CT chest | M 64 | routine | Incidental nodule, 30 pack-years: Fleischner | ct-chest-phantom |
| 3 | XR chest | M 71 | STAT | Left subclavian line, pneumothorax: critical + laterality | cr-chest-pneumothorax |
| 4 | XR chest | F 45 | routine | Already signed (final): FHIR and PDF export | cr-chest-normal |
| 5 | CT head | M 82 | STAT | Fall on anticoagulation, hemorrhage: critical + laterality | ct-head-phantom |
| 6 | CT abdomen/pelvis | F 27 | urgent | Right lower quadrant pain: laterality + sex checks | |
| 7 | CT abdomen/pelvis | M 59 | routine | Cirrhosis, HCC surveillance: LI-RADS | |
| 8 | US thyroid | F 39 | routine | Palpable left nodule: TI-RADS + laterality | |
| 9 | Mammography | F 52 | routine | Screening: BI-RADS | |
| 10 | CT abdomen/pelvis | M 68 | urgent | Hematuria: sex-mismatch check |
Studies 11 to 25 are the same exam types in other states, so a visitor can pick up anywhere in the workflow:
| # | Exam | State | Demonstrates |
|---|---|---|---|
| 11 | CT chest | draft | AI draft pending review: Accept / Regenerate, sign gate |
| 12 | XR chest | draft | Pneumothorax: signing blocked until the critical finding is acknowledged |
| 13, 25 | CT head | preliminary | Ready to sign |
| 14 | CTA chest | final, critical | Signed pulmonary embolism: critical flag on the PDF |
| 15 | XR chest | amended | Re-opened after signing: edit and sign again |
| 16, 17, 18 | CT abdomen/pelvis, US thyroid, mammography | final | Signed reports to export (TI-RADS, BI-RADS) |
| 22 | CT abdomen/pelvis | draft | Left/right conflict between findings and impression |
| 19, 20, 21, 23, 24 | CT head (STAT), XR chest, CT chest, US thyroid, mammography | unread | Start from scratch |
The phantoms are drawn by scripts/dicom/phantoms.ts (a CTA chest with a right
pulmonary artery filling defect and an 8 mm right lower lobe nodule, a head CT with a
right subdural hematoma, and normal and pneumothorax chest radiographs) and written by
a small dependency-free DICOM Part 10 writer (scripts/dicom/part10-writer.ts).
Full walkthrough (local Supabase, OpenAI, hosted Supabase, Vercel) with a check after each
stage: docs/setup.md. npm run verify:setup tells you what's missing.
Opening a study from the worklist (/studies/[id]) loads a three-pane reading room
(src/app/(app)/studies/[id]/):
reports.version).The header has Sign (runs the sign gate first, with a friendly message if blocked), Mark preliminary, Amend (once final) and, once the report is final or amended, Export FHIR / Export PDF links to the Track D routes.
Panels are resizable (shadcn's resizable, wrapping react-resizable-panels).
| Script | What it does |
|---|---|
npm run check | typecheck + lint + unit tests |
npm run test / test:watch | Vitest |
npm run test:e2e | Playwright, including the reading-room happy path (e2e/reading-room.spec.ts) |
npm run eval | AI eval suite: 18 golden cases scored against the configured LLMProvider (evals/) |
npm run db:start / db:stop / db:reset | local Supabase (reset re-applies migrations + seed, the "reset to demo state" script) |
npm run verify:setup | check env, Supabase, seed, DICOM storage and OpenAI (-- --env <file>, -- --live-ai) |
npm run db:types | regenerate src/lib/supabase/database.types.ts |
npm run dicom:generate / dicom:upload | write the phantom DICOM series / upload them to Storage |
src/
app/ thin routes: call module use cases only
lib/ env (zod), Supabase clients, logger
modules/<name>/
domain/ pure types, zod schemas, rules (no frameworks)
application/ use cases, depend on ports
infrastructure/ Supabase repositories, LLM adapters, mappers
ui/ React components
index.ts public domain entry point -> @/modules/<name>
server.ts server-only entry point -> @/modules/<name>/server
supabase/migrations/ schema, RLS, storage (invariants enforced in the DB)
supabase/seed.sql demo users, templates, synthetic patients and studies
scripts/ phantom DICOM generator and uploader
evals/ golden cases, scorers and the eval runner (npm run eval)
e2e/ Playwright specs