smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A web app for UX researchers and academic labs to upload raw biometric
study data (eye-tracking, GSR, heart-rate CSVs) and generate clean stats,
charts, and exportable PDF reports.
Visual design ported from a Google Stitch export — see STITCH_SOURCE.md
for the screen → component mapping.
• Frontend: React + Vite, Tailwind CSS v4
• Backend/Auth/DB: Firebase (Auth, Firestore) — Spark (free) plan
• CSV parsing: Papaparse (client-side)
• Charts: Recharts
• PDF export: jsPDF + html2canvas
• Hosting: VercelREADME 전문 보기 ↗A web app for UX researchers and academic labs to upload raw biometric study data (eye-tracking, GSR, heart-rate CSVs) and generate clean stats, charts, and exportable PDF reports.
Visual design ported from a Google Stitch export — see STITCH_SOURCE.md
for the screen → component mapping.
All data processing happens client-side — no Cloud Functions are required, so the app stays on Firebase's free Spark plan.
src/
components/ Dashboard, NewStudy, UploadZone, StudyResults, ReportExport, Sidebar, AppHeader, PageLayout
context/ AuthContext.jsx (Firebase Auth state + user profile doc)
hooks/ useStudies.js, useStudy.js (Firestore realtime listeners)
lib/ firebase.js, csvParser.js, statsEngine.js, planLimits.js
pages/ Login.jsx, Dashboard.jsx, NewStudyPage.jsx, Study.jsx, Account.jsx
App.jsx, main.jsx
firebase.json, firestore.rules, firestore.indexes.json
.env.example (copy to .env.local and fill in your Firebase config)
users/{uid}
email, plan ("free" | "researcher" | "lab"), createdAt
studies/{studyId}
ownerId, name, conditions: [{ label, color }], uploadCount, status, createdAt
studies/{studyId}/uploads/{uploadId}
fileName, participantLabel, columnMapping,
parsedStats: { hr, gsr, pupil, durationSeconds, sampleCount },
series: [...] (downsampled, ≤200 points, for charting), sizeBytes, uploadedAt
The raw CSV is parsed entirely client-side and then discarded — only the derived stats and a downsampled series (for charting) are written to Firestore. No file storage is used or required.
.env.local (see .env.example for the variable names).npm install -g firebase-tools
firebase login
firebase use --add # pick your project
firebase deploy --only firestore:rules,firestore:indexes
The composite index in firestore.indexes.json is required for the
studies-by-owner query (where ownerId == ... orderBy createdAt desc) —
without it, the dashboard's Firestore listener will fail with a
"requires an index" error until the index finishes building.npm install
npm run dev
Try the end-to-end flow: sign up → New Study → upload a CSV with
timestamp, hr/heart rate, and gsr/eda columns (headers are matched
case-insensitively; if auto-detect misses a column, the upload screen lets
you map it manually) → Results tab shows the chart and stats → Export tab
generates a PDF.
users/{uid}.plan defaults to "free" on first sign-in:
There's no billing integration yet — to test a higher tier locally, edit
the plan field on your user doc directly in the Firestore console.
npm run build
Deploy the dist/ output to Vercel (a vercel.json SPA rewrite is
included) and set the VITE_FIREBASE_* environment variables in the
Vercel project settings. Firestore security rules are deployed separately
via the Firebase CLI (see above) — Vercel only hosts the static frontend.