# SlotFinder A web-based meeting time finding tool with calendar-based availability selection. ## Features - Calendar-based day/range selection - Hour slot selection for availability - Real-time ranking of best meeting times - OIDC authentication (Keycloak) - Support for guest responses (no login required) - Profile picture sync from OAuth provider ## Quick Start (Development) ```bash # Start PostgreSQL and Keycloak (preconfigured) docker compose up -d # Copy env and run app cp .env.example .env uv run python app.py ``` Open http://localhost:5000 and login with: - **Username:** `admin` - **Password:** `admin` ## Docker Compose Setup | File | Purpose | |------|---------| | `docker-compose.yml` | Full stack (app + postgres + keycloak) | | `docker-compose.dev.yml` | Dev override - disables app container | | `docker-compose.override.yml` | Symlink to dev.yml for local debugging | **Dev mode** (default): Only runs postgres & keycloak, you run the app locally: ```bash ln -sf docker-compose.dev.yml docker-compose.override.yml docker compose up -d uv run python app.py ``` **Production mode**: Runs everything in containers: ```bash rm -f docker-compose.override.yml docker compose up -d ``` ## Keycloak Admin - URL: http://localhost:8080 - Admin: `admin` / `admin` - Preconfigured realm: `slotfinder` ## Environment Variables | Variable | Default | Description | |----------|---------|-------------| | `SECRET_KEY` | `dev-secret-key` | Flask secret key | | `DATABASE_URL` | `postgresql://slotfinder:slotfinder@localhost/slotfinder` | PostgreSQL connection | | `SESSION_COOKIE_SECURE` | `false` | Require HTTPS for session cookies (set to `true` in production) | | `OIDC_CLIENT_ID` | `slotfinder` | Keycloak client ID | | `OIDC_CLIENT_SECRET` | `slotfinder-dev-secret` | Keycloak client secret | | `OIDC_DISCOVERY_URL` | `http://localhost:8080/realms/slotfinder/.well-known/openid-configuration` | OIDC discovery endpoint | | `OIDC_USE_GIVEN_NAME` | `false` | Store first/last name from OAuth provider | ## Usage 1. Login via SSO to create polls 2. Share poll link with participants 3. Select available days on the calendar (click or drag) 4. Select available hours 5. Submit your availability 6. View ranked time slots showing who is available