- Fix venue header detection ('Occupancy Commons Hub' not just 'Commons Hub')
- Dynamically find room # and bed type columns (not hardcoded positions)
- Carry room numbers down for multi-bed rooms
- Expand range from A:G to A:L to capture all 4 week columns
- Change default tab name to 'VotC26 Occupancy'
- Add BOOKING_SHEET_ID to docker-compose.yml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add checkAvailability() with 2-min cache to booking-sheet.js
- Add GET /api/accommodation-availability endpoint (weeks-based)
- Fetch availability on accommodation toggle/week change, disable sold-out rooms
- Redirect booking notifications to jeff@jeffemmett.com for testing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Button defaults to green "Start Application" and only switches to
white "Restart Application" when localStorage has saved progress.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep submitted data in localStorage so "Resume" works on return visits.
Stop overwriting local edits with older server data during resume —
email lookup now only sets the update flag, preserving local changes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>