34 lines
1.3 KiB
Markdown
34 lines
1.3 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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.
|