Premium cinematic wedding photography & filmmaking platform for India. Marketing site + booking engine + admin dashboard, built to grow into a full studio OS (client portal, CRM, blog, payments, e-sign, WhatsApp).
| Concern | Choice |
|---|---|
| Framework | Next.js 14 (App Router) + TypeScript |
| Styling | Tailwind CSS + custom design tokens (dark/light) |
| Animation | Framer Motion |
| Database | PostgreSQL via Supabase |
| ORM | Prisma |
| Auth | Supabase Auth (email/password, role in profiles) |
| Storage | Supabase Storage (gallery, avatars buckets) |
| Resend (transactional) | |
| Hosting | Vercel |
| Domain | GoDaddy → Vercel |
| Email domain | Google Workspace (MX on weddingfilma.in) |
Each feature lives in its own folder so it can grow independently:
src/
├── app/
│ ├── (marketing)/ → home, portfolio, about, contact
│ ├── booking/ → public booking flow
│ ├── admin/ → studio console (guarded)
│ ├── api/ → route handlers (bookings, contact, gallery…)
│ ├── sitemap.ts / robots.ts
│ └── globals.css
├── components/
│ ├── home/ → hero, films, portfolio, stats, faq…
│ ├── booking/ → BookingForm
│ ├── portfolio/ → gallery + lightbox
│ ├── admin/ → sidebar, tables
│ ├── layout/ → Navbar, Footer
│ ├── theme/ → ThemeProvider, ThemeToggle
│ └── ui/ → primitives (accordion, form)
├── lib/
│ ├── prisma.ts → singleton Prisma client
│ ├── supabase/{client,server}.ts
│ ├── resend.ts → email templates + sender
│ └── utils.ts
└── middleware.ts → admin route protection
git clone <your-repo-url> weddingfilma && cd weddingfilma
cp .env.example .env.local # then fill in real values (see below)
yarn install
yarn db:migrate # applies prisma migrations
yarn db:seed # sample packages, testimonials, gallery
yarn devOpen http://localhost:3000.
- Go to supabase.com → New Project.
- Pick a strong DB password. Region: closest to your traffic (e.g.
ap-south-1). - In Project Settings → API, copy:
Project URL→NEXT_PUBLIC_SUPABASE_URLanon publickey →NEXT_PUBLIC_SUPABASE_ANON_KEYservice_rolekey →SUPABASE_SERVICE_ROLE_KEY(server only, never expose!)
- In Project Settings → Database → Connection string:
Transaction / Pooler(port6543) →DATABASE_URLSession / Direct(port5432) →DIRECT_URL
You have two ways to apply the schema — pick one.
- In Supabase dashboard → SQL Editor.
- Paste and run
supabase/migrations/001_initial.sql. - Then run
supabase/migrations/002_rls_policies.sql.
yarn db:migrate # or: npx prisma migrate deployThen run the RLS policies from 002_rls_policies.sql in the SQL editor (Prisma
doesn't manage RLS).
Seed sample data:
yarn db:seed- Authentication → Providers → enable Email.
- Authentication → Users → Add user — create the studio admin, e.g.
- email:
admin@weddingfilma.in - password: strong random
- email:
- Elevate role in SQL Editor:
update public.profiles set role = 'ADMIN' where email = 'admin@weddingfilma.in';
- Optional: enable Google OAuth for staff (add allowed redirect URL:
https://weddingfilma.in/auth/callback).
- Storage → New bucket →
gallery(public) andavatars(public). - Uncomment & run the storage policies at the bottom of
supabase/migrations/002_rls_policies.sql. - From the admin console, uploads write to the
gallerybucket and the URL is stored ingallery_items.url.
- Go to resend.com → API Keys → Create →
RESEND_API_KEY. - Domains → Add
weddingfilma.in, verify DKIM/SPF from your DNS. - Set
EMAIL_FROM="WeddingFilma <bookings@weddingfilma.in>".
Fill in .env.local (dev) and Vercel (prod):
| Variable | Where |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase → API |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase → API |
SUPABASE_SERVICE_ROLE_KEY |
Supabase → API |
DATABASE_URL |
Supabase → DB pooler (6543) |
DIRECT_URL |
Supabase → DB direct (5432) |
RESEND_API_KEY |
Resend |
EMAIL_FROM |
WeddingFilma <bookings@weddingfilma.in> |
EMAIL_ADMIN |
info@weddingfilma.in |
NEXT_PUBLIC_SITE_URL |
https://weddingfilma.in |
NEXT_PUBLIC_SITE_NAME |
WeddingFilma |
- Push to GitHub.
- vercel.com → New Project → import the repo.
- Framework preset: Next.js. Root:
/. - Paste every env var from step 7 into Environment Variables.
- Deploy.
- Vercel → Settings → Domains → Add
weddingfilma.inandwww.weddingfilma.in. - GoDaddy → DNS Management:
Arecord@→76.76.21.21(Vercel)CNAMEwww→cname.vercel-dns.com
- SSL is issued automatically.
- Buy Google Workspace on your
weddingfilma.indomain. - Google will give you 5 MX records — paste them into GoDaddy DNS.
- Add SPF:
v=spf1 include:_spf.google.com include:amazonses.com ~all(theamazonses.cominclude is for Resend delivery). - Add DKIM keys from both Google Admin → Apps → Gmail → Authenticate email and Resend → Domains.
- Booking form submits successfully → check DB row + email received.
- Admin login works and redirects to
/admin. - Gallery upload writes to Supabase Storage bucket.
-
sitemap.xmlandrobots.txtresolve. - Lighthouse ≥ 90 on mobile.
- Add favicon +
og.jpgat/public/.
Modules already scaffolded to grow into:
- Client portal (
/portal) — private galleries, invoices, favourites, chat. - Blog CMS —
blog_poststable already migrated. - Payments — Stripe/Razorpay on
Package. - E-signatures — DocuSign/HelloSign hooked to
Booking.status. - WhatsApp notifications — Twilio/Interakt on booking events.
- AI photo selection — CLIP embeddings per gallery item.
yarn dev # local dev
yarn build # production build
yarn start # production server
yarn lint # eslint
yarn db:push # push schema without migration files
yarn db:migrate # deploy migrations
yarn db:seed # sample data
yarn db:studio # prisma studio at localhost:5555Proprietary © WeddingFilma. All rights reserved.