Commit Graph

59 Commits

Author SHA1 Message Date
Jeff Emmett f4dca61631 fix: single resume prompt, silent email lookup, rename Begin to Restart
Remove welcome-back modal entirely. Email lookup now silently loads
server data without prompting. Only resume prompt is "Resume where you
left off" on the landing page. Rename "Begin Application" to
"Restart Application" with white/secondary button style.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 11:41:28 -04:00
Jeff Emmett a2341dfa38 fix: show resume prompt on landing page, keep step 1 check as fallback
Restore "Resume where you left off" on the landing page. When clicked,
restores localStorage data and does an email lookup to show the
welcome-back modal. Fresh starts still get the email check on step 1
as a fallback for existing applications.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 11:36:08 -04:00
Jeff Emmett 8c13a80843 fix: single resume flow — remove landing screen notice, auto-restore localStorage
Remove the duplicate "Resume where you left off" notice on the landing
screen. Now localStorage data is silently restored on form start, and
the email-based welcome-back modal on step 1 is the only resume prompt.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 10:45:07 -04:00
Jeff Emmett e42cccaf6d feat: move About You to step 1 for immediate email resume, make how-heard optional
Swap steps 1 and 2 so email is collected first, enabling returning
user detection right away. Make "How did you hear about VotC" optional.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 10:31:47 -04:00
Jeff Emmett 83caf44a16 fix: lookup/update uses latest application per email
Add ORDER BY submitted_at DESC LIMIT 1 to all email-based queries
so returning users always get their most recent application data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 10:26:58 -04:00
Jeff Emmett b8823e32ec feat: resume existing application by email lookup
Add GET /api/application/lookup endpoint for public email-based lookups,
PUT /api/application handler for updating existing applications, and
frontend flow that detects returning users after step 2 with a
welcome-back modal to pre-fill and update their application.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 13:50:24 -04:00
Jeff Emmett 0eafbb35a0 copy: clarify flexible weekly attendance on apply form
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 13:35:36 -04:00
Jeff Emmett 8c06e2e9eb ci: retrigger pipeline 2026-04-02 15:06:30 -07:00
Jeff Emmett 79141b7142 feat: restructure application form (10 steps), add sponsorship tiers, consolidate CTAs
- Restructure apply form: landing screen, pricing at step 1, theme picker,
  belief update, review & pay step, localStorage autosave, warm success state
- Add 7 new DB columns (migration-004): selected_weeks, top_themes,
  belief_update, volunteer_interest, coupon_code, food_preference, accessibility_needs
- Update confirmation emails: 1-week review timeline, warmer tone
- Add sponsorship tiers page (Friend/Symbiont/Spore/Mycelium)
- Consolidate all "Apply Now" → "Register Now", remove duplicate CTAs
- Add new fields to admin panel display

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-31 09:58:46 -07:00
Jeff Emmett 707bdc3d53 fix: add DATABASE_URL to docker-compose environment
The application container was missing the DATABASE_URL env var, causing
pg Pool to default to localhost:5432 instead of the votc-db container.
This caused all application submissions to fail with ECONNREFUSED.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 10:51:13 -07:00
Jeff Emmett 67bc668961 chore: merge main into dev (resolve pricing conflicts)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:20:32 -07:00
Jeff Emmett 7ff378e57d feat: streamline signup form, add couple disclaimer, and payment resume link
Remove Q8-10 (theme ranking, familiarity, belief update) from application
form — to be asked later. Remove pricing text from week selection hint.
Add partner booking disclaimer to couple room option. Add /api/mollie/resume
endpoint so applicants can re-open payment from confirmation email link.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:20:15 -07:00
Jeff Emmett 2a81e4543e feat: streamline signup form, add couple disclaimer, and payment resume link
Remove Q8-10 (theme ranking, familiarity, belief update) from application
form — to be asked later. Remove pricing text from week selection hint.
Add partner booking disclaimer to couple room option. Add /api/mollie/resume
endpoint so applicants can re-open payment from confirmation email link.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-19 15:15:03 -07:00
Jeff Emmett 67c9fc0fb9 Update all pricing to new tiered structure
Registration: Early Bird €120/wk (before May 15), Standard €200/wk
(before Jul 15), Last Minute €240/wk. Full month rates: €300/€500/€600.

Accommodation: flat rates — Commons Hub multi €275/wk, double €350/wk;
Herrnhof living €315/wk, triple €350/wk, single-in-double €420/wk,
single €665/wk, couple €700/wk.

Sponsorship pass values updated to match (based on last-minute rate).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 19:39:35 +00:00
Jeff Emmett 618de35793 feat: update accommodation pricing with tiered rates and new room types
Replace flat per-week accommodation prices with tiered pricing (early/standard/last-min)
and duration-based rates (1-week vs 4-week). Rename room types: double-separate → twin,
double-shared → couple. Add living room option, remove daybed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:20:16 -07:00
Jeff Emmett 2d0bdc7dd1 feat: CCG-style accommodation selection with upfront payment and booking sheet
Replace simple accommodation dropdown with full venue/room-type selector
(Commons Hub + Herrnhof Villa) matching CCG registration flow. Accommodation
is now paid upfront with registration via Mollie instead of invoiced separately.

- Add 7 accommodation types with per-week pricing (€279-665/wk)
- Add 2% payment processing fee on registration + accommodation subtotal
- Create booking-sheet.js for automatic bed assignment on payment confirmation
- Update Mollie webhook to assign beds and send internal booking notifications
- Add accommodation_type column to DB schema + migration
- Update confirmation/admin emails with full price breakdown
- Add food interest checkbox with co-producing meals messaging
- Track accommodation type, venue, and food interest in Google Sheets
- Add startup migration for accommodation_type column in server.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 13:42:04 -07:00
Jeff Emmett 5963d64da6 chore: add backlog-notify onStatusChange hook
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 15:30:34 -07:00
Jeff Emmett a0500457fd feat: replace sponsorships page with placeholder, move content to staging
Move full sponsorship tiers/packages to votc-sponsorship-staging.jeffemmett.com
while showing "details coming soon" on the public /sponsorships page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 15:29:21 -07:00
Jeff Emmett 18cd1cc1d3 fix: remove price/wk from footer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:35:50 -07:00
Jeff Emmett 3f20e2d9c3 feat: replace CTA with registration focus, expand footer, add newsletter & sponsorships
- Replace bottom-of-page waitlist form with registration CTA linking to /apply.html
- Add newsletter signup bar (email-only, subscribes to Listmonk) for visitors not ready to register
- Expand footer to 3-column grid (Event, Navigate, Community) with sponsorships link
- Create sponsorship package (VOTC26-Sponsorship-Package.md) and web page (sponsorships.html)
- Add /api/newsletter endpoint for lightweight mailing list signup
- Update nav link from "Get involved" to "Register", community partners link updated
- Fix listmonk.js to not overwrite existing subscriber names with empty strings
- Update apply.html and payment-return.html footers for consistency

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 14:29:25 -07:00
Jeff Emmett 9fdfb29893 feat: BCC team@valleyofthecommons.com on all registration/signup emails
Adds BCC to application confirmation, payment confirmation, and
waitlist welcome emails for team visibility over signups.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 11:30:07 -07:00
Jeff Emmett aaa11acefa feat: add team@valleyofthecommons.com mailto link to all page footers
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 10:38:01 -07:00
Jeff Emmett 044566ac7c fix: use contact@valleyofthecommons.com SMTP via Mailcow for VOTC emails
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 16:57:52 -08:00
Jeff Emmett 18007d3f61 update: welcome email CTAs (explore vision, share, Telegram), backlog tasks
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 16:41:44 -08:00
Jeff Emmett d7cfb6ded5 feat: pass Mollie API key via docker-compose, prioritize env vars over Infisical
Docker-compose env vars now take precedence over Infisical secrets,
allowing production keys to be set directly in .env without needing
Infisical write access.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 15:41:13 -08:00
Jeff Emmett a397e4abe9 feat: restructure registration to per-week toggles with accommodation/food add-ons
Replace the old ticket picker (dorm/shared/single × full/weekly) with a
simpler model: €300/week base registration with opt-in toggles for
accommodation and food, which are invoiced separately after acceptance.

- Merge form steps 11+12 into single "Weeks & Options" step (13→12 total)
- Add "Select all 4 weeks" toggle, accommodation yes/no + preference, food toggle
- Live price summary (€300 × weeks)
- Simplify Mollie pricing to flat per-week rate
- Add need_accommodation and want_food DB columns with auto-migration
- Update confirmation/admin emails and Google Sheets sync

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:47:10 -08:00
Jeff Emmett 42062a2467 feat: add Listmonk newsletter integration for VotC
Add direct PostgreSQL Listmonk integration to sync waitlist signups
and applications to the Valley of the Commons list (ID 24).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:23:17 -08:00
Jeff Emmett 59b37fb018 fix: switch SMTP from noreply@jeffemmett.com to newsletter@valleyofthecommons.com
Update default SMTP_USER and EMAIL_FROM across all three API handlers
(mollie, application, waitlist-db) to use the domain-specific newsletter
mailbox. Infisical secrets also updated to match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:58:47 -08:00
Jeff Emmett f1a4da7787 feat: migrate secrets to Infisical and add wiki subdomain DNS
- Replace hardcoded secrets in docker-compose.yml with Infisical injection
- Add entrypoint.sh for runtime secret fetching from Infisical
- Update Dockerfile with Infisical entrypoint wrapper
- Externalize POSTGRES_PASSWORD to .env
- Configure CNAME: wiki.valleyofthecommons.com → wikivotc2026.netlify.app

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 10:43:19 -08:00
Jeff Emmett 589a48324d chore: add backlog task for completed Mollie integration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:22:40 -08:00
Jeff Emmett 84b6d505bf fix: rename Google Sheets tab from "Applications" to "Registrations"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:16:11 -08:00
Jeff Emmett f3144d10c5 fix: rename email_log.resend_id → message_id in auto-migration
The live DB has the legacy column name 'resend_id' but the code references
'message_id'. Adds a migration that detects and renames the column on startup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:10:01 -08:00
Jeff Emmett 4cea84ebab fix: cast webhook SQL params to varchar for PostgreSQL type resolution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:06:25 -08:00
Jeff Emmett df238864f2 fix: switch SMTP host to mail.rmail.online
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:02:19 -08:00
Jeff Emmett 6ab2a8ff3b feat: add booking details (ticket, weeks, price) to confirmation email
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:58:48 -08:00
Jeff Emmett 8b1d45485c feat: switch domain from votc.jeffemmett.com to valleyofthecommons.com
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:43:28 -08:00
Jeff Emmett 685bb535f8 fix: add missing google-sheets.js to repo
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:41:44 -08:00
Jeff Emmett b44b4bb9e6 fix: auto-run Mollie DB migration on app startup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:41:01 -08:00
Jeff Emmett 87f3fb95c2 feat: complete Mollie payment integration
Add payment routes, checkout redirect, return page, DB schema updates,
and environment configuration for Mollie payment processing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 20:36:41 -08:00
Jeff Emmett 2463980838 fix: use DATABASE_SSL env var instead of NODE_ENV for pg SSL 2026-02-23 20:35:35 -08:00
Jeff Emmett 08a757e12c Add Docker healthcheck to docker-compose.yml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 18:00:42 -07:00
Jeff Emmett 4e69492bd0 chore: migrate SMTP from mx.jeffemmett.com to mail.rmail.online
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 20:15:25 +00:00
Jeff Emmett c1794752f3 security: remove real SMTP host/user from .env.example
Replace mx.jeffemmett.com and noreply@jeffemmett.com with generic
placeholders to avoid GitGuardian SMTP credential alerts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 12:11:09 -07:00
Jeff Emmett 5c30d2dfcc fix: add TLS rejectUnauthorized:false for Mailcow self-signed cert
Nodemailer rejects self-signed certificates by default, causing
STARTTLS handshake failures with Mailcow Postfix. Added tls option
to both waitlist and application SMTP transports.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 03:36:28 -07:00
Jeff Emmett 670341a26a fix: update package-lock.json for nodemailer dependency
Lock file was missing the resolved nodemailer@6.10.1 entry,
causing Docker build to fail with `npm ci`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 16:31:22 -07:00
Jeff Emmett 195b3ad00a fix: disable SSL for local PostgreSQL connection
The votc-db container doesn't support SSL connections, causing
"The server does not support SSL connections" errors on the
waitlist signup endpoint in production.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 16:12:36 -07:00
Jeff Emmett 70349c2443 Replace Resend references with Mailcow SMTP config
- docker-compose: RESEND_API_KEY → SMTP_* env vars
- .env.example: Resend section → SMTP section
- application.js + waitlist-db.js: rename resend_id → message_id
- schema.sql: rename resend_id column → message_id

App already used nodemailer/SMTP — this just cleans up legacy naming.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 16:13:09 -07:00
Jeff Emmett 620bc229ed feat: replace Resend SDK with Mailcow SMTP (nodemailer)
Swap email sending from Resend API to self-hosted Mailcow at
mx.jeffemmett.com. Uses SMTP_PASS env var instead of RESEND_API_KEY.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 09:48:53 -07:00
Jeff Emmett be4e3788be Update site font to Urbanist and enlarge header logo
- Replace Playfair Display/Cormorant Garamond with Urbanist font
- Increase logo size from 24-40px to 36-60px (desktop)
- Increase mobile logo size from 18-28px to 28-40px
- Slightly increase header padding

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 16:52:38 +00:00
Jeff Emmett 0debf5b456 Add separate first name and last name fields to application form
Fixes validation error when last name was missing because single
name field was being split.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 14:16:52 +00:00