Files
fete/README.md
nitrix a55174b323 T-1: initialize monorepo structure with backend and frontend scaffolds
Backend: Spring Boot 3.5.11 on Java 25, Maven with wrapper, hexagonal
architecture package layout (domain/application/adapter/config), health
endpoint with integration test. Originally planned for Spring Boot 4.0
but pivoted due to massive package reorganization in 4.0 (see addenda
in research and plan docs).

Frontend: Vue 3 scaffolded via create-vue with TypeScript, Vue Router,
Vitest, ESLint, Prettier. Pivoted from Svelte due to ecosystem maturity
concerns (broken router ecosystem for Svelte 5).

Also: extended .gitignore for Java/Maven and Node/Vue artifacts, updated
CLAUDE.md with tech stack, build commands, agent documentation sections,
and document integrity rule.

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

144 lines
4.5 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 |
## Self-hosting
### Prerequisites
- Docker and Docker Compose
- A PostgreSQL instance (self-hosted or managed)
### Quick start
```yaml
# docker-compose.yml
services:
fete:
image: fete:latest
ports:
- "8080:8080"
environment:
DATABASE_URL: "jdbc:postgresql://db:5432/fete"
# Optional: limit simultaneous active events
# MAX_ACTIVE_EVENTS: 100
# Optional: enable Unsplash image search for event headers
# UNSPLASH_API_KEY: your-api-key
depends_on:
- db
db:
image: postgres:17
environment:
POSTGRES_DB: fete
POSTGRES_USER: fete
POSTGRES_PASSWORD: changeme
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
```
```bash
docker compose up -d
```
The app runs at `http://localhost:8080`. Database migrations run automatically on startup.
### Configuration
All configuration is done via environment variables:
| Variable | Required | Description |
|----------------------|----------|---------------------------------------------------------------------------------------------------------------------------------------|
| `DATABASE_URL` | Yes | JDBC connection string for PostgreSQL |
| `MAX_ACTIVE_EVENTS` | No | Maximum number of non-expired events. Unset = unlimited |
| `UNSPLASH_API_KEY` | No | Enables header image search via Unsplash. Images are fetched server-side and stored locally — guests never contact Unsplash |
### Image storage
If you use the Unsplash header image feature, mount a persistent volume for stored images so they survive container restarts. The exact path will be documented once the feature is implemented.
## Development
### Prerequisites
- Java (latest LTS) + Maven
- Node.js (latest LTS) + npm
- PostgreSQL (or Docker for Testcontainers)
### Project structure
```
fete/
├── backend/ # Spring Boot application (Maven)
├── frontend/ # Vue 3 SPA (Vite, TypeScript)
├── spec/ # User stories, personas, implementation phases
├── Dockerfile # Multi-stage build for production
└── CLAUDE.md # Project statutes and AI agent instructions
```
### Running tests
```bash
# Backend (uses Testcontainers — needs Docker running)
cd backend && mvn test
# Frontend
cd frontend && npm test
```
### Building
```bash
# Backend
cd backend && mvn package
# Frontend
cd frontend && npm run build
```
## License
GPL — see [LICENSE](LICENSE) for details.