# Spanglish — Language Exchange Event Platform A full-stack web app for organizing and managing language exchange events (Asunción, Paraguay). ## Features - **Public site**: events, booking, contact, community, legal pages, bilingual (EN/ES) - **User dashboard**: profile, tickets, payments, sessions/security - **Admin** (`/admin`): events, tickets/check-in, users/roles, payments, email templates, media uploads - **API**: Swagger UI at `/api-docs`, OpenAPI JSON at `/openapi.json`, health check at `/health` ## Tech stack - **Backend**: Node.js + TypeScript, Hono, Drizzle ORM, SQLite (default) or PostgreSQL - **Auth**: JWT (via `jose`), **Argon2id** password hashing (with legacy bcrypt verification for older hashes) - **Email**: `nodemailer` (SMTP) with optional provider config - **Frontend**: Next.js 14 (App Router), Tailwind CSS, SWR, Heroicons ## Local development ### Prerequisites - Node.js 18+ - npm ### Setup ```bash npm install cp backend/.env.example backend/.env cp frontend/.env.example frontend/.env ``` ### Initialize database (SQLite by default) ```bash npm run db:migrate ``` ### Run ```bash npm run dev ``` Default URLs: - Frontend: `http://localhost:3002` - Backend API: `http://localhost:3001` - API docs: `http://localhost:3001/api-docs` ### First user becomes admin The first user to register becomes the **admin**. Register at `/register`. ## Useful scripts (workspace) Run these from the repo root: ```bash npm run dev npm run build npm run start npm run db:generate npm run db:migrate npm run db:studio ``` You can also run per workspace: ```bash npm run dev --workspace=backend npm run dev --workspace=frontend ``` ## Environment variables ### Backend (`backend/.env`) Key settings (see `backend/.env.example` for the full list): - **DB**: `DB_TYPE=sqlite|postgres`, `DATABASE_URL=./data/spanglish.db` (or Postgres URL) - **Auth**: `JWT_SECRET` (change in production) - **URLs/ports**: `PORT`, `API_URL`, `FRONTEND_URL` - **Email**: `EMAIL_PROVIDER` (`console|smtp|resend`) and corresponding credentials - **Payments (optional)**: Stripe/MercadoPago/LNbits configuration ### Frontend (`frontend/.env`) Key settings (see `frontend/.env.example`): - **Server port**: `PORT=3002` - **API base URL**: `NEXT_PUBLIC_API_URL` (optional) - Leave empty to use same-origin `/api` (recommended when running behind nginx) - In local dev, Next.js rewrites `/api/*` and `/uploads/*` to the backend - **Social links (optional)**: `NEXT_PUBLIC_WHATSAPP`, `NEXT_PUBLIC_INSTAGRAM`, etc. ## Database ### SQLite (default) - DB file defaults to `backend/data/spanglish.db` (via `DATABASE_URL=./data/spanglish.db`) - Run migrations with `npm run db:migrate` ### PostgreSQL Set in `backend/.env`: ```env DB_TYPE=postgres DATABASE_URL=postgresql://user:password@localhost:5432/spanglish ``` Then run: ```bash npm run db:migrate ``` ## Production deployment (nginx + systemd) This repo includes example configs in `deploy/`: - **systemd**: `deploy/spanglish-backend.service`, `deploy/spanglish-frontend.service` - Backend runs on **3018**, frontend on **3019** by default (see the unit files) - Backend needs write access to `backend/data` and `backend/uploads` - **nginx**: - `deploy/spanglish_upstreams.conf` defines upstreams for ports 3018/3019 - `deploy/front-end_nginx.conf` proxies `/api` and `/uploads` to the backend and everything else to the frontend - `deploy/back-end_nginx.conf` is a dedicated API vhost example with CORS handling Typical production flow: ```bash npm ci npm run build npm run db:migrate ``` Then install/enable the systemd services and nginx configs for your server. ## Documentation - **Specs / notes**: `about/` - **Legal docs**: `frontend/legal/` ## License MIT