Horvatti Drywall
Flores de Bragança 아파트의 석고·드라이월 예산을 짜고 WhatsApp으로 계약을 마무리한다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗SproutBox is a vertical farm management and marketplace web application built with Next.js (App Router), TypeScript, and Prisma (Postgres). It provides user roles for growers and restaurants, production planning, task allocation, QC flows, payouts, and Stripe-based payments.
This README gives contributors and maintainers a clear, runnable development workflow, architecture overview, required environment variables, security guidance, and contribution notes.
The app uses the Next.js App Router with server and client components. Prisma (with PostgreSQL) is used for data modelling and migrations. Authentication uses NextAuth-compatible patterns and a credentials provider alongside OAuth providers (optional).
Architecture highlights
src/app/src/app/api/src/components/src/lib/src/types/prisma/schema.prismagit clone <repo-url>
cd SproutBox
npm install
Create a .env.local file and set the required environment variables (see below).
Generate Prisma client and run migrations:
npx prisma generate
npx prisma migrate dev --name init
npx prisma db seed
npm run dev
Provide these values in .env.local (do not commit this file):
DATABASE_URL — Postgres connection string (example: postgresql://user:pass@host:5432/dbname)AUTH_SECRET or NEXTAUTH_SECRET — session/auth secretSTRIPE_SECRET_KEY — server-side Stripe secret keyNEXT_PUBLIC_STRIPE_PUBLIC_KEY — client-side Stripe publishable key (must be NEXT_PUBLIC_-prefixed to reach the browser; required for the restaurant checkout UI to render)STRIPE_WEBHOOK_SECRET — stripe webhook signing secretUPLOADTHING_TOKEN — UploadThing v7 API token (required for grower check-in/QC photo uploads)NEXT_PUBLIC_GA_MEASUREMENT_ID — GA4 Measurement ID (G-XXXXXXXXXX) for Google Analytics; see "Analytics" belowGOOGLE_CLIENT_ID & GOOGLE_CLIENT_SECRET — for Google OAuth (optional)Tip: Use your cloud provider or GitHub Actions / Vercel secrets to store production values.
prisma/schema.prisma.prisma/seed.ts. By default the seed script creates demo users; avoid running this in production or change seeded passwords via env overrides.npx prisma migrate reset --force
npx prisma db seed
npm run lint
The app loads Google Analytics 4 (src/components/shared/GoogleAnalytics.tsx, ID from
NEXT_PUBLIC_GA_MEASUREMENT_ID) and tracks pageviews across client-side App Router
navigation (src/components/shared/GoogleAnalyticsPageview.tsx — the base gtag config
only covers the first load, so this listens for pathname/searchParams changes and
fires the rest).
Custom events (src/lib/gtag.ts) map to the product's Acquisition / Conversion /
Engagement KPI categories:
| Event | Fired from | Maps to |
|---|---|---|
sign_up (method: grower) | GrowerOnboardingForm | Active Certified Growers (Acquisition) |
sign_up (method: restaurant) | RestaurantOnboardingForm | Restaurant partner count (Acquisition) |
purchase | NewOrderClient (no-Stripe path) / NewOrderClient on CheckoutModal completion (Stripe path) | MRR / Revenue |
checkin_submitted | CheckinModal | Grower engagement (proxy — see note below) |
pickup_requested | RequestPickupButton | Grower engagement |
Note: GA4 tracks the acquisition/engagement/conversion funnel (who signs up, who
orders, who stays active) — it does not compute operational KPIs like QC Pass Rate,
Kg Delivered/Week, or On-Time Delivery Rate, which live in the product database and
are already surfaced in /admin/analytics. There is also no explicit grower
task-accept/reject step in the product yet, so checkin_submitted is used as an
engagement proxy rather than a literal "Grower Acceptance Rate" event.
The project is deployed on Vercel, deploying automatically from main.
Vercel project settings:
DATABASE_URL, AUTH_SECRET/NEXTAUTH_SECRET, STRIPE_SECRET_KEY, NEXT_PUBLIC_STRIPE_PUBLIC_KEY, STRIPE_WEBHOOK_SECRET, and UPLOADTHING_TOKEN in the Vercel project's environment variables.npm run build as the build command..env files or secrets. Rotate any secrets that were committed accidentally.prisma/seed.ts contains default demo credentials — update or gate this behind a dev-only flag..next) from the repository and add to .gitignore.STRIPE_WEBHOOK_SECRET strictly in your secrets store; do not expose in client code.We welcome contributions — open issues and PRs.
Guidelines:
This project is released under the MIT License. See the LICENSE file for details.
If you'd like, I can now:
.env and .next to .gitignore and open a PR,prisma/seed.ts to require an env override for seeded credentials,