FloCafe
FloCafe is the free, local-first restaurant POS in the FloPOS ecosystem. Run orders, tables, kitchen display, and local data without a software subscription.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
e-commerce-african essentials
翻訳待ち
Loading the full README.
Read the full README ↗A subscription-first African grocery platform for the UK diaspora: browse authentic staples, subscribe for member savings, cook with in-app recipes, refer friends for credit, and check out securely with Stripe. Built as a PWA-ready Next.js web app with a mobile-first design: phones get an app-style layout with a bottom tab bar, wider screens get a top menu.
app/globals.css@prisma/adapter-pg driver adapter)| Feature | Where |
|---|---|
| Catalogue: 28 African SKUs (7 baskt private-label), pack sizes, badges, search, category tiles | app/page.tsx, lib/data.ts |
| Product pages: quantity picker, "Use in these recipes" links | app/product/[slug]/page.tsx |
| Accounts: register / sign in / sign out, settings (name, password), forgot password | app/login, app/register, app/account/settings, app/forgot-password, lib/auth.ts |
| Emails (Resend): order confirmation, "on its way" with tracking, password reset | lib/email.ts, lib/email-templates.ts, lib/order-emails.ts |
| Basket: add / update qty / remove, GBP, member pricing, free-delivery progress bar | app/cart, lib/actions/cart.ts |
| Wishlist | app/wishlist, lib/actions/wishlist.ts |
| Membership tiers (Pay As You Go / baskt Basic £4.99-mo / baskt Plus £39.99-yr) via Stripe Billing | app/membership, lib/billing.ts, lib/subscription.ts |
| Member benefits: 5%/10% off, baskt Plus free delivery, premium recipes | lib/pricing.ts |
| Fresh Produce Box: monthly subscription, 3 sizes, Mon–Wed delivery day | app/fresh, lib/freshbox.ts, app/api/fresh/checkout |
| Recipe library with amounts, difficulty, tappable ingredients → basket (premium gated to baskt Plus) | app/recipes, lib/actions/cart.ts |
| Referral engine: per-user code, £5 credit each way on first order | lib/referral.ts, lib/orders.ts, app/account |
| Free delivery over £70 (always for Plus) | lib/pricing.ts |
| Secure checkout with UK delivery address + phone, order records (discount/delivery/credit/address snapshot) | app/api/checkout, app/api/webhooks/stripe |
| Order history with delivery tracking (received → packed → on its way → delivered) | app/orders/page.tsx, components/OrderTracker.tsx |
| Stock control: baskets capped at stock, checkout re-checks, paid orders reduce stock | lib/stock.ts, lib/actions/cart.ts, lib/orders.ts |
| Admin product management (add, edit, archive/restore, delete if never ordered, stock warnings) | app/admin, lib/actions/admin.ts |
| Admin orders: to fulfil / on the way / delivered / unpaid, address and phone, mark packed → shipped (carrier + tracking) → delivered | app/admin/orders, lib/fulfilment.ts |
| Profile (plan, stats, Fresh Box, referrals, credit) | app/account/page.tsx |
One command builds the app, starts Postgres, applies the schema, seeds the catalogue, and serves the app at http://localhost:3000:
docker compose up --build
app waits for the db healthcheck, applies any pending migrations
(prisma migrate deploy), loads the sample catalogue if the shop is empty
(SEED_SAMPLE_DATA=true in docker-compose.yml), then starts Next. If migrations
can't be applied, the app doesn't start..env (AUTH_SECRET, STRIPE_*); compose overrides
DATABASE_URL so the app reaches the db service.docker compose down (add -v to also wipe the database volume).For active development, the local workflow below (host npm run dev + Dockerised
Postgres) gives faster hot-reload. The image keeps full dependencies for a reliable
first run; slimming it with Next output: "standalone" is a future optimization.
DATABASE_URL (pooled, used by the app) and DATABASE_URL_UNPOOLED
(direct, used for migrations).AUTH_SECRET (a new one, e.g.
openssl rand -base64 32), AUTH_TRUST_HOST=true, the STRIPE_* keys and prices,
RESEND_API_KEY, EMAIL_FROM, REQUIRE_EMAIL_CONFIRMATION=false until your Resend
domain is verified, and SEED_SAMPLE_DATA=true if you want the sample catalogue in an
empty shop. Don't set NEXT_PUBLIC_APP_URL or NEXTAUTH_URL: the app
uses the Vercel production domain automatically (set NEXT_PUBLIC_APP_URL only for a
custom domain).https://<your-domain>/api/webhooks/stripe with
the seven events listed under Testing payments, and set its signing secret as
STRIPE_WEBHOOK_SECRET.BLOB_READ_WRITE_TOKEN).scripts/vercel-build.sh) generates the Prisma client,
applies pending migrations, seeds an empty shop if SEED_SAMPLE_DATA=true, then builds.
Preview builds of other branches never touch the database.Functions run in London (vercel.json), next to the database and UK customers. Make
yourself an admin by running npm run make-admin -- [email protected] with DATABASE_URL
set to the production database (e.g. after npx vercel env pull .env.vercel.local).
docker compose up -d db
This is the beginning of the README. Read the rest at the original. Read the full README ↗