Beach vendor e-commerce platform for Diani/Kenya — AI-designed micro-shops with cross-selling and Boda-Boda delivery
# MaybeTomorrow.store
Multi-tenant e-commerce platform for Kenyan micro-entrepreneurs. Each tenant
gets their own subdomain (`shoezaa.maybetomorrow.store`,
`bakery.maybetomorrow.store`, ...) with storefront, checkout, WhatsApp
click-to-chat, and KES-denominated pricing that auto-converts to USD / EUR /
CHF for international buyers. Full concept document: see
`CONCEPT.md`.
## Tech stack
- **Framework:** Next.js 16 (App Router, RSC, Server Actions, standalone output)
- **Runtime:** Node.js 22
- **UI:** React 19, Tailwind CSS v4, lucide-react icons
- **Database:** PostgreSQL 16 (Docker) via Drizzle ORM + `postgres.js` driver
- **Auth:** NextAuth v5 (beta) with credentials provider
- **AI:** Anthropic Claude (via `@anthropic-ai/sdk`)
- **Process manager:** PM2 (`mt-store` app on port 3003)
- **Reverse proxy:** Nginx with Let's Encrypt wildcard cert
- **Deployment target:** IONOS VPS `mahelya` (87.106.127.232)
## Quickstart (local development)
```bash
# 1. Install dependencies.
npm install
# 2. Copy the env template and fill in secrets.
cp .env.example .env
# Regenerate NEXTAUTH_SECRET / AUTH_SECRET: openssl rand -hex 32
# Set ANTHROPIC_API_KEY if you want AI features to work locally.
# 3. Make sure Postgres is reachable (DATABASE_URL in .env).
# On mahelya this is the existing Docker Postgres on :5432.
# Locally, spin up your own or point at a dev DB.
# 4. Push the Drizzle schema.
npm run db:push
# 5. (Optional) seed demo tenants, products, and currency rates.
npm run db:seed
# 6. Run the dev server on port 3003.
npm run dev
```
Open to see the marketing site. For subdomain testing,
see `deploy/README.md` section 10.
## npm scripts
| Script | What it does |
|---|---|
| `npm run dev` | Next.js dev server on port 3003 (Turbopack in Next 16). |
| `npm run build` | Production build (standalone output). |
| `npm run start` | Start the built bundle on port 3003. |
| `npm run typecheck` | `tsc --noEmit` — type-check without emitting. |
| `npm run db:genera …