143
README.md
Normal file
143
README.md
Normal file
@@ -0,0 +1,143 @@
|
||||
# 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 | Svelte, Vite |
|
||||
| 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 + npm
|
||||
- PostgreSQL (or Docker for Testcontainers)
|
||||
|
||||
### Project structure
|
||||
|
||||
```
|
||||
fete/
|
||||
├── backend/ # Spring Boot application (Maven)
|
||||
├── frontend/ # Svelte SPA (Vite)
|
||||
├── 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.
|
||||
Reference in New Issue
Block a user