A polished shared contact website for the Continental project ecosystem. The frontend posts contact submissions to /api/contact; the Express backend validates the request and forwards it to a private Discord channel through an incoming webhook.
The Discord webhook URL is never used in frontend code. It must stay in backend environment variables only.
- Install dependencies:
npm install- Create a local environment file:
cp .env.example .env- Add your webhook URL to
.env:
DISCORD_CONTACT_WEBHOOK_URL=your_discord_webhook_url_here
PORT=3000
- Start the site:
npm run dev- Open:
http://localhost:3000
- Open Discord and go to the private channel that should receive contact messages.
- Open channel settings.
- Go to Integrations.
- Choose Webhooks.
- Create a new webhook, name it something like
Continental Contact, and copy the webhook URL. - Paste that URL into
.envasDISCORD_CONTACT_WEBHOOK_URL.
Keep .env private. Do not commit it and do not paste the real webhook URL into README files, frontend JavaScript, HTML, screenshots, or public hosting settings.
The contact form sends JSON to:
POST /api/contact
The backend validates:
- project, reason, and message are present
- message is no longer than 3000 characters
- optional email is valid when provided
- hidden honeypot field
websiteis empty - no more than 3 submissions per IP every 10 minutes
After validation, the backend sends a Discord embed through process.env.DISCORD_CONTACT_WEBHOOK_URL. The payload includes project, reason, email or Not provided, message, timestamp, and a Continental Contact footer.
The dropdown includes the required core options plus discovered Continental projects from the local GitHub workspace:
- General
- Continental ID
- Vanguard
- Aegis
- Blueprint
- Continental Studios
- Grimoire
- StepCast
- The Echo Archives
- Minesweeper
- Terra Tread
- Sovereign
- Other
For a future host such as contact.continental-hub.com, configure the hosting provider with:
DISCORD_CONTACT_WEBHOOK_URL=<secret webhook URL>
PORT=<provider port, if required>
The frontend should keep using /api/contact so it works on the same origin in local development and production.
This repo now includes the common public site files expected for deployment:
public/index.htmlpublic/robots.txtpublic/sitemap.xmlpublic/manifest.jsonpublic/404.htmlpublic/favicon.pngpublic/favicon.svgpublic/privacy.htmlpublic/terms.htmlpublic/data.json
Items from the checklist that are intentionally not in this repo:
index.phpor other PHP entrypoints are not needed because the site runs on Express/Node..htaccessis not needed unless you deploy behind Apache.- SSL/TLS certificates are not stored in the repo; they must be configured on the hosting platform or reverse proxy.
/privacynow serves a dedicated privacy page instead of falling through to the contact page- the form shows field-level validation errors and accessible error states
- priority actions prefill the form for
Security issueandAbuse report - API responses now include a request ID for support/debugging
- webhook misconfiguration is logged server-side without exposing internal details to end users