Files
fete/README.md
nitrix 23a6d7d6ad Fix outdated README and defer self-hosting docs to implementation
- Remove aspirational self-hosting section (docker-compose, config table,
  image storage) — will be written when features are actually implemented
- Fix build commands: mvn → ./mvnw, npm test → npm run test:unit
- Remove nonexistent Dockerfile from project structure tree
- Remove Testcontainers from prerequisites (not yet a dependency)
- Add README documentation ACs to US-13 (MAX_ACTIVE_EVENTS) and US-16
  (UNSPLASH_API_KEY + volume mount)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 03:01:56 +01:00

135 lines
5.1 KiB
Markdown

# 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.