Marketing site and content admin for X-Ample Development — a Discord bot and web development studio.
- Marketing pages (home, services, portfolio, about, team, contact, support)
- Blog (MDX from repo via Decap CMS)
- Content admin (vacancies, portfolio, team, newsletter — Supabase-backed)
- Contact form and newsletter signup (Resend + Supabase)
- Deploy-ready for Netlify
npm install
cp env.example .env.local # fill in values
npm run devSee env.example. Key values:
| Variable | Purpose |
|---|---|
SUPABASE_URL / SUPABASE_SERVICE_ROLE_KEY |
Vacancies, team, portfolio, newsletter |
RESEND_API_KEY |
Contact form + newsletter emails |
CONTACT_EMAIL |
Inbox for form submissions |
CONTENT_ADMIN_SECRET |
Password for /admin/* content tools |
NEXT_PUBLIC_CALENDLY_URL |
Optional “Book a call” button |
NEXT_PUBLIC_DISCORD_GUILD_ID |
Optional Discord embed widget on Support |
Set CONTENT_ADMIN_SECRET (min 8 characters), then sign in at /admin/login.
| Route | Manages |
|---|---|
/admin/vacancies |
Job listings (Supabase) |
/admin/portfolio |
Portfolio intro + projects (Supabase) |
/admin/team |
Team page intro + members (Supabase) |
/admin/newsletter |
Newsletter subscribers (Supabase waitlist table) |
/cms (Decap) |
Blog posts + JSON page content in git |
Apply schema from supabase/schema.sql in the Supabase SQL editor before using admin features.
- Admin UI:
/cms(served frompublic/cms/) - Posts:
content/blog/*.mdx - GitHub login uses
base_url+/auth→ Netlify functionoauth-begin(seenetlify.toml) - Do not put a full URL in
auth_endpointinconfig.yml— useauth_endpoint: authonly - Netlify env required:
OAUTH_CLIENT_ID,OAUTH_CLIENT_SECRET,COMPLETE_URL,ORIGIN,ADMIN_PANEL_URL=/cms - GitHub OAuth app callback URL must be:
https://x-ampledevelopment.co.uk/.netlify/functions/oauth-complete
/, /services, /portfolio, /about, /team, /blog, /contact, /support, /vacancies, /privacy, /terms