Krowz
Real discounts at local restaurants, cafés and dessert spots. Show the QR at the counter, staff scan it, done.
Translation pending
Sales & menu item recap for Charred by Porcafe
Translation pending
CommerceTypeScript · CSSGitHub @gregorykurniaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Daily close, sales reports, stock, and supplier ordering for the Porcafe team. It runs as a Next.js app (App Router, React 19) on Firebase Firestore, and staff use it on phones as an installable web app. For how the team uses it day to day, see docs/STAFF_GUIDE.md.
You need Node.js 20.9 or later (the minimum for Next.js 16).
npm install.env.local with the values below. Ask the project owner for them, and never commit this file.| Variable | Used for |
|---|---|
NEXT_PUBLIC_FIREBASE_API_KEY, _AUTH_DOMAIN, _PROJECT_ID, _STORAGE_BUCKET, _MESSAGING_SENDER_ID, _APP_ID | Firebase web config (browser) |
NEXT_PUBLIC_INVENTORY_USAGE_GO_LIVE_DATE | Optional. The first day that counts toward usage |
ANTHROPIC_API_KEY | Reading the daily ticket sheet photo (/api/scan-ticket) |
FIREBASE_PROJECT_ID, FIREBASE_SERVICE_ACCOUNT_JSON | Server-side Firestore access for push and cron jobs |
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT | Web push keys |
CRON_SECRET, APP_ORIGIN | Protects the cron routes and builds links in push messages |
If you use the Vercel CLI, vercel env pull writes these, along with VERCEL_OIDC_TOKEN.
npm run dev, then open http://localhost:3000.npm run dev: development servernpm run build: production build (also type-checks)npm start: serve the production buildnpm test: unit tests for the pure logic in src/**/*.test.ts (Node's test runner through tsx). These need no browser and no database.npm run lint: ESLintsrc/app: routes. / Home, /items Daily close and History, /reports, /inventory Stock, /setup. next.config.ts holds the redirects for moved pages.src/lib: the pure logic (reporting, dates, usage, supplier ordering) and data.ts, the Firestore layer. Every write in data.ts calls assertOnline(), so writes are refused while the device is offline and nothing is queued.src/components: UI. setup/ holds the Setup sections. inventory/ holds the Stock components.docs/: the UX audit and plan, plus deployment notes for push alerts and supplier ordering.vercel.json schedules /api/cron/reorder-push-reminders daily at 00:00 UTC (07:00 WIB) and /api/cron/inventory-supplier-deliveries daily at 01:00 UTC (08:00 WIB). Both need CRON_SECRET set in Vercel.firebase deploy --only firestore publishes firestore.rules and firestore.indexes.json./api/cron/inventory-supplier-deliveries at 08:00 WIB daily, and also when a device opens Stock. The cron only creates deliveries whose time has passed, so a delivery time later than 08:00 is created only if someone opens Stock after that time. Keep delivery times at 08:00 or earlier.