No description
Find a file
2026-06-09 23:08:36 +02:00
app Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
components Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
lib Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
.env.example Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
.gitignore Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
next.config.mjs Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
package-lock.json Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
package.json Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
postcss.config.mjs Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
README.md Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
tailwind.config.ts Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00
tsconfig.json Conference contact form for contact.neireva.com 2026-06-09 23:08:36 +02:00

neireva-contact

Temporary conference lead-capture form for contact.neireva.com. Writes to the marketing_leads table in the Neireva dev Supabase project. Decommission after the conference; keep the table + data.

Run locally

npm install
cp .env.example .env.local   # fill in SUPABASE_SERVICE_ROLE_KEY
npm run dev                   # http://localhost:3000

Submit a test entry, then confirm a row appears: select * from marketing_leads order by created_at desc limit 1;

Environment variables (set in Coolify, never committed)

Var Notes
SUPABASE_URL https://jgyibweqcygoirfwofyp.supabase.co (dev)
SUPABASE_SERVICE_ROLE_KEY Server-side only. Do not prefix NEXT_PUBLIC_.

Notes

  • Consent wording lives in lib/consent.ts and is stored server-side on insert, so the saved consent_text always matches what was displayed. Bump CONSENT_VERSION if you change the wording.
  • Honeypot + in-memory rate limit (5/IP/hour). The limiter is per-instance — fine for a single Coolify container; would need Redis if scaled out.
  • The page is set to noindex (temporary). To switch the UI to French, translate the labels in components/ContactForm.tsx and the copy in app/page.tsx; the consent text in lib/consent.ts is intentionally left as supplied.