Krowz
Real discounts at local restaurants, cafés and dessert spots. Show the QR at the counter, staff scan it, done.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A mobile-first directory of specialty coffee shops and roasters in Bali, then the rest of Indonesia. Phase 1 is a curated directory entered by an admin, plus a light community layer: anonymous thumbs up/down and shop submissions that an admin reviews.
"Coffee App" is a working name. Every brand string lives in src/lib/brand.ts.
You need Node 24 and Docker Desktop (running).
npm install
cp .env.example .env.local
cp supabase/functions/.env.example supabase/functions/.env
npm run db:start # local Supabase, with migrations and sample data
npm run admin:add -- [email protected] # invite yourself as an admin
npm run dev # http://localhost:3000
Sign in at http://localhost:3000/admin. Locally, sign-in emails go to Mailpit at http://127.0.0.1:54324, where you'll find the 6-digit code. Supabase Studio is at http://127.0.0.1:54323.
| Command | What it does |
|---|---|
npm run dev | Dev server |
npm run build | Production build (needs the database running: some pages prerender) |
npm run typecheck | Generates route types, then runs TypeScript |
npm run lint | ESLint |
npm test | Unit tests (Vitest) |
npm run db:test | Database tests (pgTAP): RLS, change history, votes, search |
npx playwright test | End-to-end tests against the dev server and local Supabase |
npm run db:reset | Rebuild the local database from migrations and seed. Clears test data |
npm run db:types | Regenerate database.types.ts after a schema change |
npm run admin:add -- email | Invite an admin |
npx supabase migration new <name>), applied with npx supabase db push./admin/options. The seed fills them locally only. Two values have meaning in code: the roast slugs light, medium and dark draw the roast scale, and the bean origin slug both matches either single origin in the filters. A slug comes from the label when an option is added and never changes, so rename labels freely.public.admins, invited with npm run admin:add. Sign-up is off. Admin writes go through Server Actions acting as the signed-in admin, so RLS applies to them too.shops, one revision per save, so no code path can edit a shop without leaving a record.The app is deployed to Vercel at https://coffee-app-five-gray.vercel.app/, with its own hosted Supabase project.
Local, staging and production each have their own Supabase project. To set up a hosted one:
npx supabase link --project-ref <ref> then npx supabase db push.{{ .Token }} (see supabase/templates/sign-in-code.html), and set up SMTP for real email delivery.npx supabase functions deploy vote --no-verify-jwt and the same for submit-shop. Set their secrets: npx supabase secrets set IP_HASH_SALT=<random> TURNSTILE_SECRET_KEY=<from Cloudflare>.pg_cron (the nightly vote refresh is scheduled by the migrations) and point-in-time recovery once the data matters.NEXT_PUBLIC_SITE_URL, NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY and NEXT_PUBLIC_TURNSTILE_SITE_KEY. The app never needs the secret key.npm run admin:add.CI (.github/workflows/ci.yml) runs every check above on each push once the repository is on GitHub.