# fete A privacy-focused, self-hostable web app for event announcements and RSVPs. An alternative to Facebook Events or Telegram groups — reduced to the essentials. ## What it does - **Create events** with title, description, date, time, location, and an expiry date - **Share a single link** — guests open it, see all details, and RSVP - **No accounts, no login** — the organizer gets a secret token stored in the browser; guests just enter a name - **Automatic cleanup** — all event data is permanently deleted after the expiry date - **Works offline-first** — installable as a PWA, local event list stored entirely in the browser ### For organizers - Edit event details, post update messages, manage the guest list - Cancel or delete events at any time - Generate a QR code for posters and flyers - Optionally pick a color theme or header image (via self-hosted Unsplash proxy) ### For guests - RSVP with just a name — no personal data required - Bookmark events locally across devices - Download `.ics` or subscribe via `webcal://` for calendar integration - See highlighted changes and new update indicators on revisit ### Privacy by design - No analytics, no telemetry, no external requests from the client - No CDNs, no Google Fonts, no tracking-capable dependencies - Server never logs PII or IP addresses - Data retention is bounded by a mandatory expiry date ## Tech stack | Layer | Technology | |--------------|--------------------------------------------| | Backend | Java (latest LTS), Spring Boot, Maven | | Frontend | Vue 3, Vite, TypeScript | | Database | PostgreSQL (external, not bundled) | | Architecture | SPA + RESTful API, hexagonal/onion backend | | Deployment | Single Docker container | ## Development ### Prerequisites - Java (latest LTS) + Maven wrapper (`./mvnw`, included) - Node.js (latest LTS) + npm ### Project structure ``` fete/ ├── backend/ # Spring Boot application (Maven) ├── frontend/ # Vue 3 SPA (Vite, TypeScript) ├── spec/ # User stories, personas, implementation phases └── CLAUDE.md # Project statutes and AI agent instructions ``` ### Running tests ```bash # Backend cd backend && ./mvnw test # Frontend cd frontend && npm run test:unit ``` ### Building ```bash # Backend cd backend && ./mvnw package # Frontend cd frontend && npm run build ``` ## Code quality Automated quality gates run as Claude Code hooks during AI-assisted development. They provide immediate feedback after every file edit and block the agent from finishing when tests fail. ### Backend (Java / Maven) **After editing a `*.java` file** (PostToolUse hook): | What | Command | Fails on | |---------------------|------------------|----------------------------------| | Checkstyle | `./mvnw compile` | Style violations (Google Style) | | Java compiler | `./mvnw compile` | Compile errors | Checkstyle enforces Google Style (2-space indent, import order, Javadoc on public types) and is bound to the `validate` phase, so it runs automatically as part of every `compile`. Covers both `src/main` and `src/test`. **When the agent finishes** (Stop hook — only if `backend/src/` has uncommitted changes): | What | Command | Fails on | |---------------------|----------------|---------------------------------------| | JUnit 5 | `./mvnw test` | Test failures (fail-fast, stops at 1) | | ArchUnit (9 rules) | `./mvnw test` | Hexagonal architecture violations | ArchUnit enforces hexagonal boundaries: domain must not depend on adapters, application, config, or Spring; ports must be interfaces; web and persistence adapters must not cross-depend. **Not hooked** (run manually): | What | Command | Fails on | |---------------------|------------------|----------------------------------------------------| | SpotBugs | `./mvnw verify` | Potential bugs, null dereferences, resource leaks | ### Frontend (TypeScript / Vue) **After editing a `*.ts` or `*.vue` file** (PostToolUse hook): | What | Command | Fails on | |---------------------|--------------------|-----------------| | TypeScript (strict) | `vue-tsc --noEmit` | Type errors | | oxlint + ESLint | `oxlint`, `eslint` | Lint violations | **When the agent finishes** (Stop hook — only if `frontend/src/` has uncommitted changes): | What | Command | Fails on | |---------------------|------------------------------|---------------------------------------| | Vitest | `npm run test:unit -- --run` | Test failures (fail-fast, stops at 1) | **Not hooked** (run manually or via editor): | What | Command | Fails on | |---------------------|------------------|-------------------| | Prettier | `npm run format` | Formatting issues | ## License GPL — see [LICENSE](LICENSE) for details.