smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A shared, real-time baby-tracking app (feeds, pees, poops) built with Next.js, TypeScript, Tailwind CSS, and Supabase.
2. Create a Supabase project at supabase.com, then copy .env.local.example to .env.local and fill in your project's URL and anon key (found under Project Settings → API):
3. Apply the database schema: open your Supabase project's SQL Editor and run each file in supabase/migrations/ in filename order (they're timestamped). (If you have the Supabase CLI linked to this project, supabase db push works too.)README 전문 보기 ↗A shared, real-time baby-tracking app (feeds, pees, poops) built with Next.js, TypeScript, Tailwind CSS, and Supabase.
Install dependencies:
npm install
Create a Supabase project at supabase.com, then copy .env.local.example to .env.local and fill in your project's URL and anon key (found under Project Settings → API):
cp .env.local.example .env.local
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
Apply the database schema: open your Supabase project's SQL Editor and run each file in supabase/migrations/ in filename order (they're timestamped). (If you have the Supabase CLI linked to this project, supabase db push works too.)
Optional but recommended for a two-person household: under Authentication → Providers → Email in the Supabase dashboard, turn off "Confirm email" so signup doesn't require clicking an email link first.
Optional — enable "Continue with Google":
https://<your-project-ref>.supabase.co/auth/v1/callback.http://localhost:3000/auth/callback (and your production URL + /auth/callback once deployed) to the Redirect URLs allowlist./onboarding to finish household setup, with the name field prefilled from the Google profile when available.Run the dev server:
npm run dev
Open http://localhost:3000. Signup collects your name, email, password, and household choice (create or join, via invite code) all on one screen; on success you land straight on the Log tab. (If your Supabase project has email confirmation on, you'll finish household setup at /onboarding after confirming instead.) Then add your baby.
src/app — Next.js App Router pages: /login, /signup, /onboarding (fallback household setup for the email-confirmation case), / (Log), /timeline, /reportssrc/components — React components, grouped by feature (auth, onboarding, baby, log, timeline, reports, layout)src/lib/supabase — Supabase client helpers (browser, server, and proxy clients, using @supabase/ssr) and generated Database typessrc/lib/entries.ts — grouping/sorting/formatting helpers shared by the Log and Timeline screenssrc/lib/reports.ts — client-side stat/daily-aggregate computation for the Reports screenproxy.ts — refreshes the Supabase auth session on each request (this Next.js version renamed middleware.ts to proxy.ts)supabase/migrations — SQL schema migrations, applied in orderFour tables, matching the paper log this app replaces:
households — a household using the app, with a unique invite_code for onboardingusers — one row per household member, mirrors auth.usersbabies — one row per baby, belongs to a householdentries — one row per logged event: type (feed / pee / poop), timestamp, notes, amount_ml (feed only), logged_byRow Level Security is enabled on all four tables, scoped so a signed-in user can only see/edit their own household's data (via a current_household_id() helper function). New users attach to a household through the create_household/join_household Postgres functions (called from the onboarding screen), not by inserting rows directly.
The matrix UI clusters same-instant entries (e.g. a feed logged alongside a pee) back into a single row for display, since the paper log this replaces often has multiple things happening at once — see groupEntriesIntoMoments in src/lib/entries.ts.
Realtime is enabled on entries (see the enable_realtime migration), so when one household member logs something, the other sees it appear live without refreshing — this is delivered subject to the same RLS policies, so only household members receive it.
Both Home and Timeline sort moments chronologically by timestamp (the event's actual time), most recent first — groupEntriesIntoMoments in src/lib/entries.ts handles both the clustering and the sort.
Reports (/reports) computes stat cards (total entries/feeds, avg mL per feed, avg gap between feeds), two per-day bar charts, and a daily summary table — all client-side from the fetched entries, no SQL aggregation views. Fine at household scale; revisit if this becomes commercial and datasets grow.
The "paper" visual language (warm off-white surfaces, ruled-line table dividers, amber/sage/terracotta/brand-blue accents) is defined as Tailwind v4 theme tokens directly in src/app/globals.css via @theme — this Tailwind version doesn't use a tailwind.config.js, so tokens like --color-sage live in CSS and generate bg-sage/text-sage/etc utilities automatically. Shared primitives live in src/components/ui (Field, TextInput, PrimaryButton) and src/components/brand (BrandMark). Per-person identity colors (avatars, "logged by" pills) cycle through a fixed sage/terracotta/brand-blue palette by household join order — see src/lib/person-colors.ts. There is no dark mode; the design spec is light-only by intent.
Login/signup succeeds but bounces back to /login, or server-side Supabase calls fail with UNABLE_TO_GET_ISSUER_CERT_LOCALLY: some local setups (antivirus/VPN software doing HTTPS inspection) install a certificate your browser trusts but Node.js doesn't, so the server can't verify your session with Supabase even though the browser signed in fine. Workaround for local dev only — never for production:
NODE_TLS_REJECT_UNAUTHORIZED=0 npm run dev