Michilis 1b2463f4bc Add human-readable event URL slugs with legacy redirect support.
Store unique slugs on events, backfill existing records, redirect old UUID and alias URLs to canonical slug pages, and expose slug editing plus alias management in the admin event modal.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-05 04:09:05 +00:00
2026-01-29 14:13:11 -03:00

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

npm install
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env

Initialize database (SQLite by default)

npm run db:migrate

Run

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:

npm run dev
npm run build
npm run start
npm run db:generate
npm run db:migrate
npm run db:studio
npm run db:export   # Backup database
npm run db:import   # Restore from backup

You can also run per workspace:

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:

DB_TYPE=postgres
DATABASE_URL=postgresql://user:password@localhost:5432/spanglish

Then run:

npm run db:migrate

Backups (export / import)

Create backups and restore if needed:

# Export (creates timestamped file in backend/data/backups/)
npm run db:export

# Export to custom path
npm run db:export -- -o ./my-backup.db    # SQLite
npm run db:export -- -o ./my-backup.sql   # PostgreSQL

# Import (stop the backend server first)
npm run db:import -- ./data/backups/spanglish-2025-03-07-143022.db
npm run db:import -- --yes ./data/backups/spanglish-2025-03-07.sql   # Skip confirmation

Note: Stop the backend before importing so the database file is not locked.

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:

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

Description
No description provided
Readme 8.1 MiB
2026-06-05 04:18:31 +00:00
Languages
TypeScript 99.7%
CSS 0.2%
JavaScript 0.1%