A modern, full-stack wedding management platform built with Next.js 16, TypeScript, and PostgreSQL. Couples can create personalized wedding pages, manage guest lists with RSVP functionality, and receive monetary contributions via Mercado Pago.
Repository: github.com/Alejandrehl/novios-app
Status: 🚧 Initial Setup - MVP in Development
Reference: Similar to milistadenovios.cl
- ✅ User authentication (email/password)
- ✅ Wedding creation and management
- ✅ Guest list management with RSVP system
- ✅ Monetary contribution system (Mercado Pago)
- ✅ Public wedding pages (
/[lang]/boda/[slug]) - ✅ Private dashboard for couples
- ✅ Payment webhook handling
- ✅ Responsive design (mobile-first)
- ✅ Internationalization (English/Spanish)
- Framework: Next.js 16 (App Router)
- Language: TypeScript (strict mode)
- Styling: Tailwind CSS
- UI Components: shadcn/ui
- Forms: React Hook Form + Zod
- Database: PostgreSQL 14+
- ORM: Prisma 5+
- Hosting: Neon / Railway / Supabase
- Auth: Auth.js (NextAuth.js v5)
- Payments: Mercado Pago
- Package Manager: pnpm
- Testing: Vitest (unit/integration) + Playwright (E2E)
- Linting: ESLint + Prettier
- Git Hooks: Husky + lint-staged
- Commits: Commitlint (Conventional Commits)
- Approach: Next.js dictionary-based i18n
- Locales: English (default), Spanish
- Packages: @formatjs/intl-localematcher, negotiator
- Node.js 20+
- pnpm 8+
- PostgreSQL 14+ (or Neon/Railway/Supabase account)
- Mercado Pago account (for payments)
# Clone repository
git clone https://github.com/Alejandrehl/novios-app.git
cd novios-app
# Install dependencies
pnpm installCreate .env.local file in the root directory:
# Database
DATABASE_URL="postgresql://user:pass@host:5432/db?pgbouncer=true"
DIRECT_URL="postgresql://user:pass@host:5432/db"
# Auth
NEXTAUTH_SECRET="generate-with-openssl-rand-base64-32"
NEXTAUTH_URL="http://localhost:3000"
# Mercado Pago
MERCADOPAGO_ACCESS_TOKEN="TEST-xxx-xxx"
MERCADOPAGO_PUBLIC_KEY="TEST-xxx-xxx"
MERCADOPAGO_WEBHOOK_SECRET="your-webhook-secret"
# App
NEXT_PUBLIC_APP_URL="http://localhost:3000"Generate NEXTAUTH_SECRET:
openssl rand -base64 32# Generate Prisma Client
pnpm prisma generate
# Run migrations
pnpm prisma migrate dev
# (Optional) Seed database
pnpm db:seedpnpm devOpen http://localhost:3000 in your browser.
novios-app/
├── app/
│ ├── [lang]/ # Internationalized routes
│ │ ├── dictionaries/ # Translation files (en.json, es.json)
│ │ ├── dictionaries.ts # Dictionary loader
│ │ ├── (auth)/ # Auth route group
│ │ │ ├── login/
│ │ │ └── register/
│ │ ├── (dashboard)/ # Protected dashboard
│ │ │ ├── layout.tsx # Dashboard layout with auth
│ │ │ └── weddings/ # Wedding management
│ │ └── boda/ # Public wedding pages
│ │ └── [slug]/
│ ├── api/ # API routes (Route Handlers)
│ │ ├── auth/ # Auth endpoints
│ │ └── payments/ # Payment endpoints
│ └── globals.css
│
├── components/
│ ├── ui/ # shadcn/ui components
│ ├── forms/ # Form components
│ ├── features/ # Feature-specific components
│ └── layout/ # Layout components
│
├── lib/
│ ├── services/ # Business logic layer
│ ├── repositories/ # Data access layer (Prisma)
│ ├── schemas/ # Zod validation schemas
│ ├── actions/ # Server Actions
│ ├── auth/ # Auth.js configuration
│ ├── utils/ # Utility functions
│ ├── types/ # TypeScript types
│ ├── prisma.ts # Prisma client
│ └── env.ts # Environment validation
│
├── prisma/
│ ├── schema.prisma # Database schema
│ ├── migrations/ # Database migrations
│ └── seed.ts # Seed data
│
├── public/ # Static assets
├── .cursor/rules/ # Cursor AI rules
└── README.md
# Unit/Integration tests
pnpm test
# Watch mode
pnpm test:watch
# Coverage report (must be >80%)
pnpm test:coverage
# UI for debugging
pnpm test:ui
# E2E tests
pnpm test:e2e
# E2E UI
pnpm test:e2e:uiMANDATORY: All features must follow TDD (Red-Green-Refactor).
- Red: Write failing test
- Green: Implement minimal code to pass
- Refactor: Improve code while keeping tests green
Coverage Requirements:
- Services: >90%
- Repositories: >85%
- Utilities: >80%
- Complex business logic: 100%
# Run ESLint (must pass with zero warnings)
pnpm lint
# Fix ESLint errors
pnpm lint:fix
# Format with Prettier
pnpm format
# Type check
pnpm type-checkHusky enforces quality gates before every commit:
- ✅ ESLint (zero errors/warnings)
- ✅ Prettier formatting
- ✅ TypeScript type checking
- ✅ Tests for changed files
- ✅ Coverage >80%
- ✅ Conventional Commits format
DO NOT skip hooks with --no-verify.
Follow Conventional Commits:
# Feature
feat(wedding): add public wedding page with RSVP form
# Bug fix
fix(dashboard): correct guest count calculation
# Refactor
refactor(services): extract payment logic to separate service
# Documentation
docs: update README with installation instructions
# Tests
test(wedding): add unit tests for WeddingService
# Chore
chore(deps): upgrade Next.js to 15.1.0MANDATORY: All user-facing text must use i18n dictionaries.
Add keys to both app/[lang]/dictionaries/en.json and es.json:
{
"common": {
"save": "Save" // en.json
"save": "Guardar" // es.json
}
}Use in Server Components:
import { getDictionary } from "@/app/[lang]/dictionaries";
export default async function Page({ params }) {
const { lang } = await params;
const dict = await getDictionary(lang);
return <button>{dict.common.save}</button>;
}Pass to Client Components:
"use client";
interface Props {
dict: Dictionary["common"];
}
export function MyComponent({ dict }: Props) {
return <button>{dict.save}</button>;
}❌ NEVER hardcode user-facing text in components
# Generate Prisma Client
pnpm prisma generate
# Create migration
pnpm prisma migrate dev --name add_wedding_table
# Apply migrations
pnpm prisma migrate dev
# Deploy migrations (production)
pnpm prisma migrate deploy
# Open Prisma Studio
pnpm prisma studio
# Reset database (development only)
pnpm prisma migrate reset- User: Wedding organizers (couples)
- Wedding: Wedding event with details and slug
- Guest: Invited people with RSVP status
- Contribution: Monetary contributions with payment status
- PaymentConfig: Payment provider configuration
- Connect repository to Vercel
- Set environment variables in Vercel dashboard
- Deploy automatically on push to
main
DATABASE_URL="postgresql://..."
DIRECT_URL="postgresql://..."
NEXTAUTH_SECRET="strong-secret-for-production"
NEXTAUTH_URL="https://yourdomain.com"
MERCADOPAGO_ACCESS_TOKEN="APP-xxx-xxx"
MERCADOPAGO_PUBLIC_KEY="APP-xxx-xxx"
NEXT_PUBLIC_APP_URL="https://yourdomain.com"- All tests passing
- Coverage >80%
- Zero linting errors
- Environment variables set
- Database migrations applied
- NEXTAUTH_SECRET is strong and unique
- Mercado Pago uses production credentials
This project uses Cursor AI rules for consistent development. See .cursor/rules/README.md for details.
Rule Files:
behavior.mdc- Agent methodology and workflowstack.mdc- Technology stack and toolsarchitecture.mdc- Code structure and patternsproject.mdc- Business requirements and featuresinfrastructure.mdc- Deployment and configurationteam.mdc- Team composition and processes
- Alejandro Exequiel Hernández Lara - Full-Stack Developer & Product Owner - LinkedIn
- Rodrigo Eduardo Guerrero Godoy - Full-Stack Developer & Tech Lead - LinkedIn
- Diego Emilio Fuentes Gómez - Full-Stack Developer & UI/UX Specialist - LinkedIn
MIT License - see LICENSE file for details.
Copyright (c) 2025 Alejandro Hernández, Rodrigo Guerrero, Diego Fuentes
- Follow all rules in
.cursor/rules/ - Write tests first (TDD)
- Ensure zero linting errors
- Use Conventional Commits
- Request review from relevant specialist
Last Updated: November 26, 2025 Version: 0.1.0 (Initial Setup) Status: 🚧 MVP in Development