feat: add initial project structure and documentation
- Add .gitignore with comprehensive file patterns - Create README.md with project overview and setup instructions - Add detailed wedding RSVP architecture plan with technical specifications This commit establishes the foundation for the wedding RSVP project with proper configuration files and comprehensive documentation covering the system architecture, technology stack, and implementation details.
This commit is contained in:
73
.gitignore
vendored
Normal file
73
.gitignore
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
# Dependencies
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
|
||||
# Build outputs
|
||||
dist/
|
||||
build/
|
||||
|
||||
# Environment variables
|
||||
.env
|
||||
.env.local
|
||||
.env.development.local
|
||||
.env.test.local
|
||||
.env.production.local
|
||||
|
||||
# IDE files
|
||||
.vscode/
|
||||
.idea/
|
||||
*.swp
|
||||
*.swo
|
||||
|
||||
|
||||
# OS files
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# Logs
|
||||
logs/
|
||||
*.log
|
||||
|
||||
# Runtime data
|
||||
pids/
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage/
|
||||
*.lcov
|
||||
|
||||
# Temporary folders
|
||||
tmp/
|
||||
temp/
|
||||
|
||||
# Documentation outputs
|
||||
|
||||
|
||||
# Git
|
||||
.git/
|
||||
|
||||
|
||||
# Project specific
|
||||
*.pdf
|
||||
*.docx
|
||||
*.xlsx
|
||||
*.pptx
|
||||
|
||||
# Backup files
|
||||
*.bak
|
||||
*.backup
|
||||
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
33
README.md
Normal file
33
README.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Wedding Project
|
||||
|
||||
A comprehensive wedding planning and RSVP management system.
|
||||
|
||||
## Project Structure
|
||||
|
||||
- `plans/` - Project planning and architecture documents
|
||||
- `src/` - Source code (to be created)
|
||||
- `docs/` - Documentation (to be created)
|
||||
- `tests/` - Test files (to be created)
|
||||
|
||||
## Getting Started
|
||||
|
||||
1. Clone the repository
|
||||
2. Install dependencies
|
||||
3. Configure environment variables
|
||||
4. Run the development server
|
||||
|
||||
## Features
|
||||
|
||||
- RSVP management
|
||||
- Guest list tracking
|
||||
- Seating arrangements
|
||||
- Budget tracking
|
||||
- Timeline management
|
||||
|
||||
## Contributing
|
||||
|
||||
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for details on our code of conduct and the process for submitting pull requests.
|
||||
|
||||
## License
|
||||
|
||||
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||
608
plans/wedding-rsvp-architecture.md
Normal file
608
plans/wedding-rsvp-architecture.md
Normal file
@@ -0,0 +1,608 @@
|
||||
# Wedding RSVP Website - Architecture Plan
|
||||
|
||||
## Overview
|
||||
|
||||
A modern minimalist wedding RSVP website with individual guest authentication, policy-based permissions, email notifications, Google Sheets integration, gallery, countdown timer, packaged as a Docker image with Nginx reverse proxy.
|
||||
|
||||
## Technology Stack
|
||||
|
||||
### Frontend
|
||||
- **Framework**: React with Vite (fast, modern, easy to edit)
|
||||
- **Styling**: Tailwind CSS (modern minimalist, easy to customize)
|
||||
- **State Management**: React Context for auth state
|
||||
|
||||
### Backend
|
||||
- **Runtime**: Node.js with Express
|
||||
- **Authentication**: JWT tokens with individual guest codes
|
||||
- **Database**: SQLite (simple, file-based, easy backup)
|
||||
- **Email**: Nodemailer with SMTP (for RSVP notifications)
|
||||
|
||||
### Integration
|
||||
- **Google Sheets**: Google Apps Script Web App (simplest approach, no API credentials needed)
|
||||
|
||||
### Deployment
|
||||
- **Container**: Docker with multi-stage build
|
||||
- **Reverse Proxy**: Nginx (HTTP internally between containers)
|
||||
- **Orchestration**: docker-compose for easy deployment
|
||||
|
||||
---
|
||||
|
||||
## System Architecture
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph Client [Browser]
|
||||
LP[Landing Page with Countdown]
|
||||
RSVP[RSVP Page]
|
||||
GALLERY[Gallery Page]
|
||||
ADMIN[Admin Panel]
|
||||
end
|
||||
|
||||
subgraph Nginx [Nginx Reverse Proxy]
|
||||
NGINX[Nginx :80 → :3000]
|
||||
end
|
||||
|
||||
subgraph Server [Docker Container]
|
||||
API[Express API Server]
|
||||
AUTH[Auth Middleware]
|
||||
DB[(SQLite Database)]
|
||||
EMAIL[Email Service]
|
||||
end
|
||||
|
||||
subgraph External [External Services]
|
||||
GS[Google Sheets via Apps Script]
|
||||
SMTP[Email Provider via SMTP]
|
||||
end
|
||||
|
||||
LP --> NGINX
|
||||
RSVP --> NGINX
|
||||
GALLERY --> NGINX
|
||||
ADMIN --> NGINX
|
||||
NGINX --> API
|
||||
API --> DB
|
||||
API --> EMAIL
|
||||
EMAIL --> SMTP
|
||||
API --> GS
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Database Schema
|
||||
|
||||
### Tables
|
||||
|
||||
#### guests
|
||||
| Column | Type | Description |
|
||||
|--------|------|-------------|
|
||||
| id | INTEGER PRIMARY KEY | Auto-increment ID |
|
||||
| code | TEXT UNIQUE | Unique guest access code |
|
||||
| name | TEXT | Guest name |
|
||||
| email | TEXT | Guest email |
|
||||
| phone | TEXT | Guest phone |
|
||||
| group_id | INTEGER | Foreign key to groups table |
|
||||
| is_attending | BOOLEAN | RSVP response |
|
||||
| dietary_restrictions | TEXT | Dietary requirements |
|
||||
| created_at | DATETIME | Record creation time |
|
||||
| updated_at | DATETIME | Last update time |
|
||||
|
||||
#### groups
|
||||
| Column | Type | Description |
|
||||
|--------|------|-------------|
|
||||
| id | INTEGER PRIMARY KEY | Auto-increment ID |
|
||||
| name | TEXT | Group name e.g. Family, Friends, VIP |
|
||||
| plus_one_limit | INTEGER | Max plus-ones allowed: 0, 1, or 2 |
|
||||
| custom_info | TEXT | Group-specific information to display |
|
||||
| created_at | DATETIME | Record creation time |
|
||||
|
||||
#### plus_ones
|
||||
| Column | Type | Description |
|
||||
|--------|------|-------------|
|
||||
| id | INTEGER PRIMARY KEY | Auto-increment ID |
|
||||
| guest_id | INTEGER | Foreign key to guests table |
|
||||
| name | TEXT | Plus-one name |
|
||||
| dietary_restrictions | TEXT | Dietary requirements |
|
||||
| created_at | DATETIME | Record creation time |
|
||||
|
||||
#### admin_users
|
||||
| Column | Type | Description |
|
||||
|--------|------|-------------|
|
||||
| id | INTEGER PRIMARY KEY | Auto-increment ID |
|
||||
| username | TEXT UNIQUE | Admin username |
|
||||
| password_hash | TEXT | Bcrypt hashed password |
|
||||
| created_at | DATETIME | Record creation time |
|
||||
|
||||
---
|
||||
|
||||
## Page Structure
|
||||
|
||||
### 1. Landing Page - /
|
||||
- Hero section with couple names and wedding date
|
||||
- **Countdown timer** to wedding date
|
||||
- Wedding location and time
|
||||
- Beautiful background image
|
||||
- Call-to-action button: "RSVP Now"
|
||||
- Navigation to RSVP, Gallery, and Accommodation pages
|
||||
|
||||
### 2. RSVP Page - /rsvp
|
||||
- Guest code input field
|
||||
- Login button
|
||||
- After authentication:
|
||||
- Welcome message with guest name
|
||||
- Group-specific information display
|
||||
- RSVP form:
|
||||
- Attendance selection: Yes/No
|
||||
- Dietary restrictions
|
||||
- Plus-one details based on group policy
|
||||
- Submit button
|
||||
- Confirmation message
|
||||
|
||||
### 3. Gallery Page - /gallery
|
||||
- **Masonry/pinterest-style layout** for photos
|
||||
- Responsive grid that adapts to screen size
|
||||
- Lightbox modal for viewing full-size images
|
||||
- Categories or albums (optional): Pre-wedding, Ceremony, Reception, etc.
|
||||
- Photo credits (if applicable)
|
||||
- Upload interface for admin to add new photos
|
||||
|
||||
### 4. Accommodation Page - /accommodation
|
||||
- Venue location with embedded map
|
||||
- Recommended hotels near the venue
|
||||
- Recommended Airbnbs near the venue
|
||||
- Links to book
|
||||
- Distance from venue
|
||||
- Price range indicators
|
||||
- Contact information for questions
|
||||
|
||||
### 4. Admin Panel - /admin
|
||||
- Admin login
|
||||
- Dashboard with RSVP statistics
|
||||
- Guest management:
|
||||
- Add/edit/delete guests
|
||||
- Generate guest codes
|
||||
- Assign to groups
|
||||
- Group management:
|
||||
- Create groups
|
||||
- Set plus-one limits
|
||||
- Add custom info per group
|
||||
- Export to Google Sheets button
|
||||
- View all RSVPs
|
||||
|
||||
---
|
||||
|
||||
## API Endpoints
|
||||
|
||||
### Public Endpoints
|
||||
|
||||
```
|
||||
POST /api/auth/login
|
||||
Body: { code: string }
|
||||
Response: { token: string, guest: GuestInfo }
|
||||
|
||||
POST /api/rsvp
|
||||
Headers: Authorization: Bearer <token>
|
||||
Body: { isAttending: boolean, dietaryRestrictions: string, plusOnes: PlusOne[] }
|
||||
Response: { success: boolean }
|
||||
Note: Triggers email notification to admin on submission
|
||||
```
|
||||
|
||||
### Admin Endpoints
|
||||
|
||||
```
|
||||
POST /api/admin/auth
|
||||
Body: { username: string, password: string }
|
||||
Response: { token: string }
|
||||
|
||||
GET /api/admin/guests
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Response: Guest[]
|
||||
|
||||
POST /api/admin/guests
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Body: { name, email, phone, groupId }
|
||||
Response: { success: boolean, code: string }
|
||||
Note: **Triggers automatic email to guest with access code**
|
||||
|
||||
PUT /api/admin/guests/:id
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Body: { name, email, phone, groupId }
|
||||
Response: { success: boolean }
|
||||
|
||||
DELETE /api/admin/guests/:id
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Response: { success: boolean }
|
||||
|
||||
GET /api/admin/groups
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Response: Group[]
|
||||
|
||||
POST /api/admin/groups
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Body: { name, plusOneLimit, customInfo }
|
||||
Response: { success: boolean }
|
||||
|
||||
POST /api/admin/export
|
||||
Headers: Authorization: Bearer <admin-token>
|
||||
Response: { success: boolean }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Google Sheets Integration
|
||||
|
||||
### Approach: Google Apps Script Web App
|
||||
|
||||
This is the simplest approach that requires no API credentials:
|
||||
|
||||
1. Create a Google Sheet
|
||||
2. Add an Apps Script that exposes a web app endpoint
|
||||
3. The backend sends RSVP data to this endpoint
|
||||
4. The script appends data to the sheet
|
||||
|
||||
### Apps Script Code Example
|
||||
|
||||
```javascript
|
||||
// In Google Sheets: Extensions > Apps Script
|
||||
function doPost(e) {
|
||||
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
|
||||
const data = JSON.parse(e.postData.contents);
|
||||
|
||||
sheet.appendRow([
|
||||
new Date(),
|
||||
data.guestName,
|
||||
data.groupName,
|
||||
data.isAttending ? 'Yes' : 'No',
|
||||
data.dietaryRestrictions,
|
||||
data.plusOnes.map(p => p.name).join(', '),
|
||||
data.plusOnes.map(p => p.dietaryRestrictions).join(', ')
|
||||
]);
|
||||
|
||||
return ContentService.createTextOutput(JSON.stringify({success: true}))
|
||||
.setMimeType(ContentService.MimeType.JSON);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
wedding-rsvp/
|
||||
├── Dockerfile
|
||||
├── docker-compose.yml
|
||||
├── nginx.conf # Nginx configuration
|
||||
├── package.json
|
||||
├── server/
|
||||
│ ├── index.js # Express server entry point
|
||||
│ ├── database/
|
||||
│ │ ├── init.js # Database initialization
|
||||
│ │ └── schema.sql # SQL schema
|
||||
│ ├── routes/
|
||||
│ │ ├── auth.js # Authentication routes
|
||||
│ │ ├── rsvp.js # RSVP routes
|
||||
│ │ └── admin.js # Admin routes
|
||||
│ ├── middleware/
|
||||
│ │ ├── auth.js # JWT verification
|
||||
│ │ └── adminAuth.js # Admin JWT verification
|
||||
│ └── services/
|
||||
│ ├── googleSheets.js # Google Sheets integration
|
||||
│ └── email.js # Email notification service
|
||||
├── client/
|
||||
│ ├── index.html
|
||||
│ ├── src/
|
||||
│ │ ├── main.jsx # React entry point
|
||||
│ │ ├── App.jsx # Main app component
|
||||
│ │ ├── pages/
|
||||
│ │ │ ├── Landing.jsx # Landing page with Countdown
|
||||
│ │ │ ├── Rsvp.jsx # RSVP page
|
||||
│ │ │ ├── Gallery.jsx # Masonry gallery page
|
||||
│ │ │ ├── Accommodation.jsx # Accommodation recommendations
|
||||
│ │ │ └── Admin.jsx # Admin panel
|
||||
│ │ ├── components/
|
||||
│ │ │ ├── LoginForm.jsx
|
||||
│ │ │ ├── RsvpForm.jsx
|
||||
│ │ │ ├── GuestManager.jsx
|
||||
│ │ │ ├── AccommodationCard.jsx
|
||||
│ │ │ ├── Countdown.jsx # Countdown timer component
|
||||
│ │ │ ├── GalleryGrid.jsx # Masonry gallery grid
|
||||
│ │ │ └── Lightbox.jsx # Lightbox modal
|
||||
│ │ ├── context/
|
||||
│ │ │ └── AuthContext.jsx
|
||||
│ │ ├── config/
|
||||
│ │ │ └── content.js # Editable content configuration
|
||||
│ │ └── styles/
|
||||
│ │ └── index.css # Tailwind imports
|
||||
│ └── public/
|
||||
│ └── images/ # Wedding images and gallery photos
|
||||
└── data/
|
||||
└── wedding.db # SQLite database file
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
```env
|
||||
# Server
|
||||
PORT=3000
|
||||
NODE_ENV=production
|
||||
|
||||
# JWT
|
||||
JWT_SECRET=your-super-secret-jwt-key
|
||||
JWT_EXPIRES_IN=7d
|
||||
|
||||
# Admin
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=hashed-password-here
|
||||
ADMIN_EMAIL=admin@example.com
|
||||
|
||||
# Google Sheets
|
||||
GOOGLE_SHEETS_WEBHOOK_URL=https://script.google.com/macros/s/xxx/exec
|
||||
|
||||
# Email SMTP
|
||||
SMTP_HOST=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USER=your-email@gmail.com
|
||||
SMTP_PASS=your-app-password
|
||||
NOTIFICATION_EMAIL=admin@example.com
|
||||
|
||||
# Frontend
|
||||
VITE_API_URL=http://localhost:3000/api
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Considerations
|
||||
|
||||
1. **Guest Codes**: Generate random 6-character alphanumeric codes
|
||||
2. **JWT Tokens**: Short expiry with refresh capability
|
||||
3. **Admin Password**: Bcrypt hashing with salt rounds
|
||||
4. **Rate Limiting**: Prevent brute force on login endpoints
|
||||
5. **HTTPS**: Required for production deployment
|
||||
|
||||
---
|
||||
|
||||
## Easy Customization Guide
|
||||
|
||||
### Changing Colors and Fonts
|
||||
Edit `client/tailwind.config.js`:
|
||||
```javascript
|
||||
module.exports = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
primary: '#your-color',
|
||||
secondary: '#your-color',
|
||||
},
|
||||
fontFamily: {
|
||||
sans: ['Your Font', 'sans-serif'],
|
||||
serif: ['Your Font', 'serif'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Changing Images
|
||||
Replace files in `client/public/images/`:
|
||||
- `hero-bg.jpg` - Landing page background
|
||||
- `couple.jpg` - Couple photo
|
||||
- `venue.jpg` - Venue photo
|
||||
|
||||
### Changing Content
|
||||
Edit `client/src/config/content.js`:
|
||||
```javascript
|
||||
export const weddingInfo = {
|
||||
coupleNames: 'Jane & John',
|
||||
date: 'December 31, 2025',
|
||||
venue: 'Beautiful Venue Name',
|
||||
venueAddress: '123 Wedding Lane, City',
|
||||
venueMapUrl: 'https://maps.google.com/...',
|
||||
// ... more configurable content
|
||||
};
|
||||
|
||||
export const accommodations = [
|
||||
{
|
||||
name: 'Hotel ABC',
|
||||
type: 'hotel', // or 'airbnb'
|
||||
address: '456 Main St',
|
||||
distance: '0.5 miles from venue',
|
||||
priceRange: '$$',
|
||||
link: 'https://booking-link.com',
|
||||
image: '/images/hotel-abc.jpg',
|
||||
},
|
||||
// ... more accommodations
|
||||
];
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Docker Deployment
|
||||
|
||||
### Build and Run
|
||||
|
||||
```bash
|
||||
# Build the image
|
||||
docker build -t wedding-rsvp .
|
||||
|
||||
# Run with docker-compose
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### docker-compose.yml
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
services:
|
||||
nginx:
|
||||
image: nginx:alpine
|
||||
ports:
|
||||
- '80:80'
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf:ro
|
||||
depends_on:
|
||||
- wedding-rsvp
|
||||
restart: unless-stopped
|
||||
|
||||
wedding-rsvp:
|
||||
build: .
|
||||
expose:
|
||||
- '3000'
|
||||
volumes:
|
||||
- ./data:/app/data
|
||||
environment:
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
- GOOGLE_SHEETS_WEBHOOK_URL=${GOOGLE_SHEETS_WEBHOOK_URL}
|
||||
- SMTP_HOST=${SMTP_HOST}
|
||||
- SMTP_PORT=${SMTP_PORT}
|
||||
- SMTP_USER=${SMTP_USER}
|
||||
- SMTP_PASS=${SMTP_PASS}
|
||||
- NOTIFICATION_EMAIL=${NOTIFICATION_EMAIL}
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Nginx Configuration
|
||||
|
||||
### nginx.conf
|
||||
|
||||
```nginx
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
upstream wedding-rsvp {
|
||||
server wedding-rsvp:3000;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
proxy_pass http://wedding-rsvp;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Note**: HTTP is used internally between Nginx and the app container. HTTPS termination should be handled at the edge (load balancer, CDN, or reverse proxy).
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. Set up the project structure
|
||||
2. Implement the database schema
|
||||
3. Build the backend API
|
||||
4. Create the frontend pages
|
||||
5. Integrate Google Sheets
|
||||
6. Test the complete flow
|
||||
7. Deploy with Docker
|
||||
|
||||
---
|
||||
|
||||
## Email Notification Template
|
||||
|
||||
When a guest submits their RSVP, an email is sent to the admin:
|
||||
|
||||
```
|
||||
Subject: New RSVP Received - {Guest Name}
|
||||
|
||||
Guest: {Guest Name}
|
||||
Group: {Group Name}
|
||||
Attending: Yes/No
|
||||
Dietary Restrictions: {restrictions}
|
||||
Plus-Ones: {list of plus-one names}
|
||||
|
||||
Submitted at: {timestamp}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Guest Access Code Email Template
|
||||
|
||||
When a guest is created by the admin, an email is automatically sent with their access code:
|
||||
|
||||
```
|
||||
Subject: You're Invited! - {Event Name}
|
||||
|
||||
Hello {Guest Name},
|
||||
|
||||
You have been invited to our wedding celebration!
|
||||
|
||||
Event: {Event Name}
|
||||
Date: {Event Date}
|
||||
Venue: {Venue Name}
|
||||
|
||||
To view details and RSVP, please visit:
|
||||
{RSVP Portal URL}
|
||||
|
||||
Your unique access code: **{Guest Code}**
|
||||
|
||||
Please use this code to log in to the RSVP portal.
|
||||
|
||||
We hope to see you there!
|
||||
|
||||
Best regards,
|
||||
{Couple Name}
|
||||
```
|
||||
|
||||
**Note**: This email is triggered automatically when a guest is added via the Admin panel.
|
||||
|
||||
---
|
||||
|
||||
## Guest RSVP Confirmation Email Template
|
||||
|
||||
After a successful RSVP, the guest receives a confirmation email containing:
|
||||
|
||||
```
|
||||
Subject: Your RSVP Confirmation - {Event Name}
|
||||
|
||||
Hello {Guest Name},
|
||||
|
||||
Thank you for your response.
|
||||
|
||||
Event: {Event Name}
|
||||
Date: {Event Date}
|
||||
Venue: {Venue Name}
|
||||
|
||||
Your RSVP status: {Attending}
|
||||
Plus-ones: {list of plus-one names}
|
||||
|
||||
If you need to update your response, use your unique code: {Guest Code}
|
||||
|
||||
We look forward to seeing you!
|
||||
|
||||
Best regards,
|
||||
{Couple Name}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
This architecture provides:
|
||||
- **Modern minimalist design** with easy customization
|
||||
- **Individual guest codes** for secure RSVP access
|
||||
- **Policy-based permissions** (different plus-one limits per group)
|
||||
- **Group-specific information** display
|
||||
- **Email notifications** for admin and guests
|
||||
- **Automatic guest emails** with access codes on guest creation
|
||||
- **Google Sheets integration** for data collection
|
||||
- **Admin panel** for guest and group management
|
||||
- **Accommodation recommendations** page
|
||||
- **Masonry gallery** with lightbox viewer
|
||||
- **Countdown timer** to wedding date
|
||||
- **Docker deployment** with Nginx reverse proxy (HTTP internally)
|
||||
Reference in New Issue
Block a user