dkast/biztro
dkast/biztro has 29 GitHub stars and 13 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-15 03:53 UTC. Last push 2026-11-13.
What you can do
- Digital menu builder — create menu items, categories, variants, prices, images, allergens and one active public menu per organization.
- Visual menu editor — compose and preview mobile-first public menus with editable font and color themes.
- AI menu import — upload a PDF or image menu, extract products with confidence/review metadata, edit the generated rows, then save products or generate a complete draft menu with AI-selected design settings.
- CSV import/export — import products with Spanish or English column aliases and export catalog rows by product variant.
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
About
Biztro (QR Menu Micro-SaaS)
Web & AppsREADME.md
OriginalBiztro
[!NOTE] This project is in beta and under active development.
Biztro is a mobile-first, server-first Next.js application for restaurants that need to build, publish, translate and operate digital menus. It combines a visual menu editor, QR/public menu publishing, AI-assisted imports, multilingual menu content, media management, subscriptions and a lightweight sales module.
Product capabilities
- Digital menu builder — create menu items, categories, variants, prices, images, allergens and one active public menu per organization.
- Visual menu editor — compose and preview mobile-first public menus with editable font and color themes.
- AI menu import — upload a PDF or image menu, extract products with confidence/review metadata, edit the generated rows, then save products or generate a complete draft menu with AI-selected design settings.
- CSV import/export — import products with Spanish or English column aliases and export catalog rows by product variant.
- AI translations — translate active menu items, variants and categories to supported locales: English, French, German, Portuguese, Italian, Japanese and Chinese.
- Sales module — register quick sales from the active catalog, support dine-in/takeout/delivery order types, void sales with reasons, inspect sale details, filter and export transaction history to CSV, view revenue dashboards, best sellers and recent activity, and export daily closing reports to CSV.
- Organization operations — manage locations, opening hours, services, member settings, billing and Cloudflare R2-backed media assets.
- Public publishing — serve public menus from organization slugs/subdomains with host-based routing support.
Core stack
- Next.js 16 App Router + TypeScript
- React 19 with React Server Components preferred
- Tailwind CSS 4 + Shadcn UI + Radix UI primitives
- Prisma 7 with the LibSQL adapter; Turso for local/dev database access
- Better Auth for authentication and organization membership
- next-safe-action for server mutations
- Zod for schemas and validation
- nuqs for URL query state
- TanStack Query/Table/Virtual for client data workflows
- Vercel AI SDK through AI Gateway for AI extraction, visual analysis and translations
- Cloudflare R2/S3-compatible storage for uploads
- Stripe + better-auth Stripe plugin for subscriptions
- PostHog, Sentry and next-axiom for analytics, monitoring and logging
Useful files
package.json— scripts and dependency listsrc/env.mjs— environment schema and required variablessrc/app/config.ts— product limits and defaultssrc/flags.ts— feature flags, including simulated PDF AI importsprisma.config.ts— Prisma adapter configprisma/schema.prisma— application data model, including sales and translationsprisma/models/auth.prisma— Better Auth data modeldocs/deployment/subdomain-routing.md— Cloudflare + Vercel host-based subdomain deployment guideAGENTS.md— contributor and agent conventions
Quick start
Use Bun for local development unless you are intentionally testing another runtime.
- Install dependencies
bun install
- Configure environment variables
Create a .env file at the project root, or export variables in your shell.
Required variables are validated in src/env.mjs.
Common local requirements:
- Turso/LibSQL:
TURSO_DATABASE_URL,TURSO_AUTH_TOKEN - Better Auth/Google OAuth:
BETTER_AUTH_URL,BETTER_AUTH_SECRET,AUTH_GOOGLE_ID,AUTH_GOOGLE_SECRET - Cloudflare R2:
R2_ACCOUNT_ID,R2_ACCESS_KEY_ID,R2_SECRET_KEY_ID,R2_BUCKET_NAME,R2_CUSTOM_DOMAIN - Email:
RESEND_API_KEY - Stripe:
STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,NEXT_PUBLIC_STRIPE_PRICE_PRO_MONTHLY,NEXT_PUBLIC_STRIPE_PRICE_PRO_YEARLY - Analytics:
NEXT_PUBLIC_POSTHOG_KEY; optionalPOSTHOG_HOSTandPOSTHOG_API_KEY - AI features: optional
AI_GATEWAY_API_KEY; required for real AI imports and translations when not using simulation
- Generate Prisma client
Lifecycle scripts run prisma generate automatically, but you can run it
manually when needed:
bun run predev
# or
bunx prisma generate
- Start the local database
bun run db:dev
This starts a local Turso development database backed by local.db.
- Start the development server
bun run dev
Common scripts
bun run dev— start the Next.js dev serverbun run build— build for productionbun run start— start the production serverbun run lint— run Oxlintbun run lint:fix— run Oxlint fixesbun run typecheck— run TypeScript type checkingbun run format— format source files with Prettierbun run prisma:migrate— apply deployed Prisma migrationsbun run db:dev— start the local Turso databasebun run email— run React Email dev toolingbun run build:content— build Contentlayer contentbun run stripe:listen— forward Stripe webhooks to the local auth webhook
Closing report performance
Development builds enable Next.js Request Insights. After loading
/dashboard/sales/closing, use the dev server's /_next/mcp
get_request_insights tool to inspect request durations, server fetches and
cache behavior. Compare an initial load, a date change and a repeat client
navigation with DevTools Disable cache off. Hard reloads with
Cache-Control: no-cache bypass development caches.
Run the isolated, in-memory database regression benchmark with:
bun run test src/server/actions/sales/__tests__/closing-queries.test.ts --reporter=verbose --silent=false
It reports elapsed report time, SQL statement count and individual statement durations through Prisma query events, plus per-operation timings and top-level result row counts, without logging SQL parameters or using the application database. Summed statement durations are not wall-clock latency because operations can overlap. Local SQLite timings do not predict remote Turso latency.
The populated fixture went from 19 to 13 SQL statements (10 to 8 top-level database operations). Complete report snapshots verify identical financial output. Counts vary with relation data; they exclude page authentication and layout queries. Selected and previous-day financial rows share two range reads. Credit history uses a parameterized existence query instead of transferring historical sales/allocations, and still includes credit later settled through receivable payments.
Private report caching is unchanged: client router reuse follows stale: 30;
it is not a persistent cross-request production server cache. Request Insights
is development-only.
Feature flags
FLAGS_ENABLE_SUBSCRIPTIONS=1enables subscription-related UI and flows.FLAGS_SIMULATE_PDF_AI=1uses AI SDK mock responses for menu import during development/testing. The flag defaults to simulated imports when unset.
When simulated imports are disabled, AI menu import, full-menu visual generation
and menu translations require AI_GATEWAY_API_KEY.
Conventions and notes
- Prefer React Server Components and keep
use clientscopes small. - Use
next-safe-actionfor server mutations and callreset()in client action handlers after success or handled errors. - Use React Hook Form + Zod for forms and validation.
- Manage URL search state with
nuqs. - Keep authentication and route protection centralized in
src/proxy.ts. - Treat
src/env.mjsas the source of truth for environment variables. - Gate Pro-only creation/generation flows on the server. Client plan state is UX only.
- Prisma migrations live under
prisma/migrations; runbunx prisma generateafter schema changes.
Deployment notes
- Host-based public menu URLs such as
https://slug.biztro.coare documented indocs/deployment/subdomain-routing.md. - The current production approach uses Cloudflare wildcard DNS + TLS and a Cloudflare Worker proxying to Vercel.
For detailed contributor guidance and repository guardrails, see AGENTS.md.