@titas_mallick/wedding-site-gen 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -60
- package/app/invitation/[slug]/layout.tsx +9 -9
- package/app/layout.tsx +11 -13
- package/cli.mjs +6 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,70 +1,137 @@
|
|
|
1
|
-
# 💍 Wedding Website Generator v2.0
|
|
1
|
+
# 💍 Wedding Website Generator v2.0 (AI-Powered)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Transform your wedding journey with a sophisticated, AI-driven digital experience. This generator scaffolds a production-ready Next.js application featuring an AI concierge, digital guestbook, real-time song requests, and automated guest reminders.
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
## 🚀 The A-B-C
|
|
7
|
+
## 🚀 Phase 1: Generation (The A-B-C Guide)
|
|
8
8
|
|
|
9
|
-
### Step A:
|
|
10
|
-
|
|
9
|
+
### Step A: Initialize Your Project
|
|
10
|
+
Run the following command in your terminal to start the interactive setup:
|
|
11
11
|
```bash
|
|
12
12
|
npx @titas_mallick/wedding-site-gen
|
|
13
13
|
```
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
14
|
+
|
|
15
|
+
### Step B: CLI Prompt Reference
|
|
16
|
+
The generator will ask you several questions. Here is how to answer them:
|
|
17
|
+
|
|
18
|
+
| Prompt | Example Input | Purpose |
|
|
19
|
+
| :--- | :--- | :--- |
|
|
20
|
+
| **Groom's First Name** | `Titas` | Used for URLs and short mentions. |
|
|
21
|
+
| **Groom's Full Name** | `Titas Mallick` | Used in official bio and certificate pages. |
|
|
22
|
+
| **Bride's First Name** | `Sukanya` | Used for URLs and short mentions. |
|
|
23
|
+
| **Bride's Full Name** | `Sukanya Saha` | Used in official bio and certificate pages. |
|
|
24
|
+
| **Wedding Date** | `January 23, 2026` | Displayed text on the countdown and hero. |
|
|
25
|
+
| **Wedding Date ISO** | `2026-01-23` | Powers the technical countdown logic. |
|
|
26
|
+
| **Admin Email** | `admin@wedding.com` | **CRITICAL**: Log in with this email to manage content. |
|
|
27
|
+
| **UPI ID** | `wedding@okaxis` | Used for the "Sagun" (Gift) QR code generator. |
|
|
28
|
+
| **Website URL** | `https://our-wedding.com` | Used for email links and SEO. |
|
|
29
|
+
| **Wedding Hashtag** | `#TitasWedsSukanya` | Displayed across the site. |
|
|
30
|
+
| **Visual Theme** | `1` (Pink & Gold) | Sets the primary color palette (Pink, Blue, Green, or Red). |
|
|
31
|
+
| **Target Directory** | `my-wedding` | The name of the folder where code will be saved. |
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 🛠️ Phase 2: Infrastructure Setup
|
|
36
|
+
|
|
37
|
+
### 1. Firebase (Database & Auth)
|
|
38
|
+
1. Go to the [Firebase Console](https://console.firebase.google.com/).
|
|
39
|
+
2. **Create a Project**: Give it a name (e.g., `wedding-project`).
|
|
40
|
+
3. **Authentication**: Enable "Email/Password" provider in the Auth tab.
|
|
41
|
+
4. **Firestore**: Create a Database in "Production Mode".
|
|
42
|
+
5. **Project Settings**:
|
|
43
|
+
- Click the **Web Icon (</>)** to register a web app. Copy the `firebaseConfig` keys for your `.env.local`.
|
|
44
|
+
- Go to **Service Accounts** > **Generate New Private Key**. This downloads a JSON file. Use these values for the `FIREBASE_ADMIN` variables.
|
|
45
|
+
|
|
46
|
+
### 2. Firestore Security Rules
|
|
47
|
+
Copy the following into the **Rules** tab of your Firestore console to allow guests to post wishes/songs while keeping admin functions secure:
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
rules_version = '2';
|
|
51
|
+
service cloud.firestore {
|
|
52
|
+
match /databases/{database}/documents {
|
|
53
|
+
match /wishes/{wishId} { allow read, write: if true; }
|
|
54
|
+
match /song_requests/{requestId} { allow read, write: if true; }
|
|
55
|
+
match /guestbook/{entryId} { allow read, write: if true; }
|
|
56
|
+
match /rsvps/{rsvpId} { allow read, write: if true; }
|
|
57
|
+
match /email-reminders/{reminderId} {
|
|
58
|
+
allow read: if true;
|
|
59
|
+
allow write: if request.auth != null;
|
|
60
|
+
}
|
|
61
|
+
match /{document=**} {
|
|
62
|
+
allow read: if true;
|
|
63
|
+
allow write: if request.auth != null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Cloudinary (Guestbook Uploads)
|
|
70
|
+
1. Sign up at [Cloudinary](https://cloudinary.com/).
|
|
71
|
+
2. In the **Dashboard**, copy your `Cloud Name`.
|
|
72
|
+
3. Go to **Settings** > **Upload** > **Upload Presets** and create a new preset named `wedding` with "Unsigned" signing mode.
|
|
73
|
+
|
|
74
|
+
### 4. Resend (Email Automation)
|
|
75
|
+
1. Sign up at [Resend.com](https://resend.com/).
|
|
76
|
+
2. Generate an **API Key** and add it to `.env.local`.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## 🔐 Phase 3: Environment Configuration
|
|
81
|
+
|
|
82
|
+
Create a `.env.local` file in your generated project root and populate it:
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# --- Firebase Client ---
|
|
86
|
+
NEXT_PUBLIC_APIKEY=AIza...
|
|
87
|
+
NEXT_PUBLIC_AUTHDOMAIN=your-project.firebaseapp.com
|
|
88
|
+
NEXT_PUBLIC_PROJECTID=your-project
|
|
89
|
+
NEXT_PUBLIC_STORAGEBUCKET=your-project.firebasestorage.app
|
|
90
|
+
NEXT_PUBLIC_SENDERID=...
|
|
91
|
+
NEXT_PUBLIC_APPID=...
|
|
92
|
+
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=...
|
|
93
|
+
|
|
94
|
+
# --- Firebase Admin (Secrets) ---
|
|
95
|
+
FIREBASE_ADMIN_PROJECT_ID=your-project
|
|
96
|
+
FIREBASE_ADMIN_PRIVATE_KEY_ID=...
|
|
97
|
+
FIREBASE_ADMIN_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
|
|
98
|
+
FIREBASE_ADMIN_CLIENT_EMAIL=firebase-adminsdk-...
|
|
99
|
+
FIREBASE_ADMIN_CLIENT_ID=...
|
|
100
|
+
|
|
101
|
+
# --- AI & Content ---
|
|
102
|
+
NEXT_PUBLIC_GEMINI_API_KEY=AIza... # Get from Google AI Studio
|
|
103
|
+
NEXT_PUBLIC_ADMIN_EMAIL=your-email@gmail.com # Must match login for admin powers
|
|
104
|
+
|
|
105
|
+
# --- Media & Email ---
|
|
106
|
+
NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME=...
|
|
107
|
+
NEXT_PUBLIC_CLOUDINARY_UPLOAD_PRESET=wedding
|
|
108
|
+
RESEND_API_KEY=re_...
|
|
109
|
+
CRON_SECRET=a-secure-random-string
|
|
110
|
+
```
|
|
32
111
|
|
|
33
112
|
---
|
|
34
113
|
|
|
35
|
-
## 🎨
|
|
114
|
+
## 🎨 Phase 4: Asset Personalization
|
|
36
115
|
|
|
37
|
-
|
|
116
|
+
Replace the files in `/public/` keeping the exact filenames:
|
|
38
117
|
|
|
39
|
-
|
|
40
|
-
| Filename | Purpose | Recommended Aspect Ratio |
|
|
118
|
+
| Location | Filename | Purpose |
|
|
41
119
|
| :--- | :--- | :--- |
|
|
42
|
-
| `bride.jpg` | Main
|
|
43
|
-
| `groom.jpg` | Main
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
These images appear on the **"Mark the Dates"** timeline.
|
|
49
|
-
- `19.jpg`: The Proposal Milestone.
|
|
50
|
-
- `Patipatra.jpeg`: The Date-Fixing/Traditional Ceremony.
|
|
51
|
-
- `22.jpg`: The Engagement Milestone.
|
|
52
|
-
- `21.jpg`: The Wedding Day Milestone.
|
|
53
|
-
- `20.jpg`: The Reception Milestone.
|
|
54
|
-
|
|
55
|
-
### 🏔️ Pre-Wedding & Memories Gallery
|
|
56
|
-
The **"Memories"** page is designed to showcase your journey.
|
|
57
|
-
- **Bulk Uploads**: Place all your pre-wedding shoot photos in `/public/Images/`.
|
|
58
|
-
- **Naming**: Use descriptive names or simply number them. The gallery will automatically generate a beautiful masonry layout for all images found in this directory.
|
|
120
|
+
| `/public/` | `bride.jpg` | Main portrait of the Bride (3:4 ratio). |
|
|
121
|
+
| `/public/` | `groom.jpg` | Main portrait of the Groom (3:4 ratio). |
|
|
122
|
+
| `/public/` | `qr.png` | Your UPI QR code for the Sagun page. |
|
|
123
|
+
| `/public/Images/` | `19.jpg` - `22.jpg` | Milestone images for the "Mark the Dates" timeline. |
|
|
124
|
+
| `/public/Images/` | `Patipatra.jpeg` | Image for the traditional date-fixing milestone. |
|
|
125
|
+
| `/public/Images/` | `* (any name)` | All other images in this folder automatically populate the **Memories** gallery. |
|
|
59
126
|
|
|
60
127
|
---
|
|
61
128
|
|
|
62
|
-
## 🤖 Advanced AI Features
|
|
129
|
+
## 🤖 Phase 5: Advanced AI Features
|
|
63
130
|
|
|
64
131
|
### 1. The Wedding Concierge (Gemini 2.5)
|
|
65
132
|
Guests can chat with an AI assistant trained on your wedding data.
|
|
66
133
|
- **Setup**: Provide your `NEXT_PUBLIC_GEMINI_API_KEY` in `.env.local`.
|
|
67
|
-
- **Knowledge**: The bot automatically knows your venues, dates, and story based on the info you provided during
|
|
134
|
+
- **Knowledge**: The bot automatically knows your venues, dates, and story based on the info you provided during Phase 1.
|
|
68
135
|
|
|
69
136
|
### 2. Automated Email Reminders
|
|
70
137
|
Send beautiful, automated reminders to your guest list.
|
|
@@ -74,25 +141,50 @@ Send beautiful, automated reminders to your guest list.
|
|
|
74
141
|
|
|
75
142
|
---
|
|
76
143
|
|
|
77
|
-
##
|
|
144
|
+
## 🎮 Phase 6: Management & Broadcast
|
|
145
|
+
|
|
146
|
+
### 1. Guest Management Dashboard (`/invitation/maker`)
|
|
147
|
+
Log in with your **Admin Email** to access the ultimate control center:
|
|
148
|
+
- **Add/Edit Guests**: Create personalized links for every family.
|
|
149
|
+
- **RSVP Tracking**: See who is attending and their food preferences in real-time.
|
|
150
|
+
- **Bulk WhatsApp**: Generate pre-filled invitation messages for easy sharing.
|
|
151
|
+
|
|
152
|
+
### 2. Moderation (Guestbook & Songs)
|
|
153
|
+
- **Moderation**: Admins logged into the site can delete any guest-uploaded photo or song request directly from the live feed.
|
|
154
|
+
- **Song Queue**: Mark songs as "Played" or delete them as the night progresses at `/song-requests`.
|
|
155
|
+
|
|
156
|
+
### 3. OBS Broadcast Overlay (`/updates/overlay`)
|
|
157
|
+
Perfect for venue video walls or live streams:
|
|
158
|
+
- **Real-time News**: Display the latest announcements scrolling at the bottom.
|
|
159
|
+
- **Live Clock**: Shows current event time.
|
|
160
|
+
- **Chroma Key**: Uses a standard green background for easy transparency in OBS.
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## ✉️ Guest Personalization (How it works)
|
|
78
165
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
| `RESEND_API_KEY` | Used to send the actual emails for reminders. |
|
|
84
|
-
| `NEXT_PUBLIC_CLOUDINARY_URL` | Enables guests to upload photos to your live guestbook. |
|
|
166
|
+
When you add a guest in the dashboard, they get a unique ID. Their link becomes: `your-site.com/invitation/[guest-id]`.
|
|
167
|
+
- **Custom Welcome**: The site greets them by name.
|
|
168
|
+
- **Smart Filters**: They only see the events they are specifically invited to (e.g., just Reception, or all events).
|
|
169
|
+
- **One-Click RSVP**: Their identity is linked, making RSVP a single-click process.
|
|
85
170
|
|
|
86
171
|
---
|
|
87
172
|
|
|
88
|
-
##
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
173
|
+
## 🚀 Phase 7: Deployment & Automation
|
|
174
|
+
|
|
175
|
+
### Vercel Deployment
|
|
176
|
+
1. Push your code to **GitHub**.
|
|
177
|
+
2. Connect your repository to [Vercel](https://vercel.com/).
|
|
178
|
+
3. **Important**: Add all your `.env.local` variables into the Vercel **Environment Variables** settings.
|
|
179
|
+
|
|
180
|
+
### Automated Reminders (Cron Job)
|
|
181
|
+
To send daily reminders to guests (e.g., from Jan 10th to Jan 26th):
|
|
182
|
+
1. In Vercel, go to the **Cron** tab (or use GitHub Actions).
|
|
183
|
+
2. Set up a job to call: `GET /api/email-reminders`
|
|
184
|
+
3. Header: `Authorization: Bearer YOUR_CRON_SECRET`
|
|
185
|
+
4. Schedule: `0 10 10-26 1 *` (10 AM daily).
|
|
94
186
|
|
|
95
187
|
---
|
|
96
188
|
|
|
97
189
|
## 📜 License
|
|
98
|
-
MIT License.
|
|
190
|
+
MIT License. Created with ❤️ for your special day.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { Metadata } from "next";
|
|
2
2
|
|
|
3
3
|
export const metadata: Metadata = {
|
|
4
|
-
title: "Wedding Invitation |
|
|
4
|
+
title: "Wedding Invitation | Groom & Bride",
|
|
5
5
|
description:
|
|
6
|
-
"We cordially invite you to celebrate the wedding of
|
|
6
|
+
"We cordially invite you to celebrate the wedding of the couple. Click to view your personalized invitation and event details.",
|
|
7
7
|
openGraph: {
|
|
8
|
-
title: "You're Invited! |
|
|
8
|
+
title: "You're Invited! | Wedding",
|
|
9
9
|
description:
|
|
10
10
|
"We would be honored to have you join us as we celebrate our wedding. View details for the ceremony and reception.",
|
|
11
|
-
url: "
|
|
12
|
-
siteName: "
|
|
11
|
+
url: "your-wedding-site.com/invitation",
|
|
12
|
+
siteName: "Groom & Bride",
|
|
13
13
|
locale: "en_US",
|
|
14
14
|
type: "website",
|
|
15
15
|
images: [
|
|
16
16
|
{
|
|
17
|
-
url: "
|
|
17
|
+
url: "your-wedding-site.com/invite.jpeg", // Updated to use absolute URL for WhatsApp
|
|
18
18
|
width: 1200,
|
|
19
19
|
height: 630,
|
|
20
|
-
alt: "
|
|
20
|
+
alt: "Wedding Invitation",
|
|
21
21
|
},
|
|
22
22
|
],
|
|
23
23
|
},
|
|
24
24
|
twitter: {
|
|
25
25
|
card: "summary_large_image",
|
|
26
|
-
title: "Wedding Invitation |
|
|
26
|
+
title: "Wedding Invitation | Groom & Bride",
|
|
27
27
|
description: "Join us in celebrating our special day.",
|
|
28
|
-
images: ["
|
|
28
|
+
images: ["your-wedding-site.com/invite.jpeg"], // Updated to use absolute URL for WhatsApp
|
|
29
29
|
},
|
|
30
30
|
};
|
|
31
31
|
|
package/app/layout.tsx
CHANGED
|
@@ -13,7 +13,7 @@ import ConciergeBot from "@/components/ConciergeBot";
|
|
|
13
13
|
import { SchemaMarkup } from "@/components/SchemaMarkup";
|
|
14
14
|
|
|
15
15
|
export const metadata: Metadata = {
|
|
16
|
-
metadataBase: new URL("
|
|
16
|
+
metadataBase: new URL("your-wedding-site.com"),
|
|
17
17
|
|
|
18
18
|
title: {
|
|
19
19
|
default: siteConfig.name,
|
|
@@ -22,21 +22,19 @@ export const metadata: Metadata = {
|
|
|
22
22
|
description: siteConfig.description,
|
|
23
23
|
keywords: [
|
|
24
24
|
"Wedding",
|
|
25
|
-
"
|
|
26
|
-
"
|
|
25
|
+
"Groom",
|
|
26
|
+
"Bride",
|
|
27
27
|
"Marriage",
|
|
28
28
|
"Celebration",
|
|
29
29
|
"Event",
|
|
30
|
-
"Serampore Wedding",
|
|
31
|
-
"Titas and Sukanya Wedding",
|
|
32
30
|
],
|
|
33
31
|
authors: [
|
|
34
32
|
{
|
|
35
|
-
name: "
|
|
36
|
-
url: "
|
|
33
|
+
name: "Groom Name",
|
|
34
|
+
url: "your-wedding-site.com",
|
|
37
35
|
},
|
|
38
36
|
],
|
|
39
|
-
creator: "
|
|
37
|
+
creator: "Groom Name",
|
|
40
38
|
icons: {
|
|
41
39
|
icon: "/love-birds.png",
|
|
42
40
|
shortcut: "/love-birds.png",
|
|
@@ -48,16 +46,16 @@ export const metadata: Metadata = {
|
|
|
48
46
|
openGraph: {
|
|
49
47
|
type: "website",
|
|
50
48
|
locale: "en_US",
|
|
51
|
-
url: "
|
|
49
|
+
url: "your-wedding-site.com",
|
|
52
50
|
title: siteConfig.name,
|
|
53
51
|
description: siteConfig.description,
|
|
54
52
|
siteName: siteConfig.name,
|
|
55
53
|
images: [
|
|
56
54
|
{
|
|
57
|
-
url: "
|
|
55
|
+
url: "your-wedding-site.com/invite.jpeg",
|
|
58
56
|
width: 1200,
|
|
59
57
|
height: 630,
|
|
60
|
-
alt: "
|
|
58
|
+
alt: "Wedding Invitation",
|
|
61
59
|
},
|
|
62
60
|
],
|
|
63
61
|
},
|
|
@@ -65,8 +63,8 @@ export const metadata: Metadata = {
|
|
|
65
63
|
card: "summary_large_image",
|
|
66
64
|
title: siteConfig.name,
|
|
67
65
|
description: siteConfig.description,
|
|
68
|
-
images: ["
|
|
69
|
-
creator: "@
|
|
66
|
+
images: ["your-wedding-site.com/invite.jpeg"],
|
|
67
|
+
creator: "@wedding",
|
|
70
68
|
},
|
|
71
69
|
robots: {
|
|
72
70
|
index: true,
|
package/cli.mjs
CHANGED
|
@@ -98,6 +98,12 @@ async function main() {
|
|
|
98
98
|
{ search: /2026-01-23/g, replace: config.weddingDateISO },
|
|
99
99
|
{ search: /admin@example.com/g, replace: config.adminEmail },
|
|
100
100
|
{ search: /your-upi-id@upi/g, replace: config.upiId },
|
|
101
|
+
{ search: /https:\/\/www.titas-sukanya-for.life/g, replace: config.siteUrl },
|
|
102
|
+
{ search: /your-wedding-site.com/g, replace: config.siteUrl.replace(/^https?:\/\//, '') },
|
|
103
|
+
{ search: /Wedding Invitation \| Groom & Bride/g, replace: `Wedding Invitation | ${config.groomName} & ${config.brideName}` },
|
|
104
|
+
{ search: /celebrate the wedding of the couple/g, replace: `celebrate the wedding of ${config.groomName} and ${config.brideName}` },
|
|
105
|
+
{ search: /Titas and Sukanya Wedding/g, replace: `${config.groomName} and ${config.brideName} Wedding` },
|
|
106
|
+
{ search: /Titas & Sukanya Wedding/g, replace: `${config.groomName} & ${config.brideName} Wedding` },
|
|
101
107
|
// Code-level replacements for exported components/functions
|
|
102
108
|
{ search: /TitasLayout/g, replace: `${config.groomName}Layout` },
|
|
103
109
|
{ search: /SukanyaLayout/g, replace: `${config.brideName}Layout` },
|