55 lines
3.2 KiB
Markdown
55 lines
3.2 KiB
Markdown
# Zoé & Shaldon — Wedding Site
|
|
|
|
Save-the-date / RSVP / guest photo-upload site. Wedding: **7 November 2026**. Accessed via QR code from the printed save-the-date. Hosted at `https://zoeshaldon.warky.info`.
|
|
|
|
See [PLAN.md](PLAN.md) for full design.
|
|
|
|
## Stack
|
|
- `ui/` — SvelteKit (static adapter), Tailwind + Skeleton theming
|
|
- `server/` — Go, single binary, embeds the built frontend
|
|
- `data/` — runtime SQLite DB + guest-uploaded photos (gitignored, not yet created)
|
|
|
|
## Status
|
|
Working prototype. `ui/` builds and `server/` serves it + the API, verified locally (RSVP, gated photo upload, countdown). Not yet run via Docker end-to-end; SMTP not yet configured. See PLAN.md "Prototype status" for the current gap list.
|
|
|
|
## Develop locally
|
|
```
|
|
cd ui && npm install && npm run build # outputs ui/build
|
|
rm -rf server/web/dist && cp -r ui/build server/web/dist
|
|
cd ../server && go build -o wedding-server .
|
|
cp ../config.example.yaml ../config.yaml # edit the wedding date/SMTP/etc.
|
|
CONFIG_PATH=../config.yaml ./wedding-server # serves on :8080
|
|
```
|
|
|
|
## Requirements
|
|
- Countdown to the wedding date, with day/date/time and venue, on the landing page.
|
|
- Landing page background: photos from `ui/assets/photos` slide in/out continuously behind the hero content.
|
|
- RSVP form: one or more guest names (add/remove rows, at least one required), message (optional) — no email/phone captured → saved + emailed to couple. Shows the RSVP deadline and its own countdown.
|
|
- Photo upload: name (required), message (optional), email/phone (optional) + photo files → saved to `data/photos/`, links emailed to couple.
|
|
- Photo upload only opens **7 November 2026** (same date drives the countdown) — enforced server-side, not just hidden in the UI.
|
|
- Venue, RSVP deadline, and RSVP phone number sourced from the formal invitation (`concept/IMG-20260811-WA0020.jpg`).
|
|
|
|
## Repo layout
|
|
```
|
|
ui/ SvelteKit frontend (assets/photos/ = curated background photos, checked in)
|
|
server/ Go backend (API + static file serving)
|
|
data/ runtime data (gitignored)
|
|
concept/ source assets (save-the-date image)
|
|
config.example.yaml config template (checked in)
|
|
config.yaml real config: date, SMTP, storage path (gitignored)
|
|
Dockerfile multi-stage: build ui -> build server -> runtime image
|
|
docker-compose.yml wedding app, published to 127.0.0.1:8080 only
|
|
```
|
|
|
|
## Config
|
|
Copy `config.example.yaml` to `config.yaml` and fill in the wedding date, SMTP settings, storage path, and (if enabled) the Origin service key. Path is resolved from `CONFIG_PATH` (default `./config.yaml`) — that's the only env var; everything else lives in the file.
|
|
|
|
When `origin.service_key` is configured, the server registers itself with Origin as the `CronoCraft App` named `ZoeShaldon` immediately at startup and repeats the check-in every 24 hours. Registration failures are logged without taking down the wedding site. Leave the key empty to disable registration.
|
|
|
|
## Run with Docker
|
|
Runs behind an existing Apache reverse proxy on the host (Apache owns TLS for `zoeshaldon.warky.info`) — see `PLAN.md` for the Apache vhost config. Not yet verified end-to-end.
|
|
```
|
|
cp config.example.yaml config.yaml # edit it first
|
|
docker compose up --build
|
|
```
|