π New here? Check out the Quick Start Guide to get up and running in 5 minutes!
| Feature | Description |
|---|---|
| π Calendar Grid | Visual month-by-month absence grid per user & team |
| π₯ Team Management | Organize users into teams with availability tracking |
| ποΈ Absence Types | Full day, morning only, afternoon only |
| π Public Holidays | Per-country holiday management |
| π Quick Search | Instant search across users and teams |
| π Dark Mode | Full light/dark theme support |
| π Presence View | Real-time daily attendance overview |
| π€ Export | CSV and PDF export of absence reports |
| π SSO / OIDC | Optional SSO authentication via Dex (PKCE flow) |
| π‘οΈ RBAC | Role-based access control (admin / user) |
| π Self-hosted | Single Docker image β no external services required |
| Calendar View | Teams |
|---|---|
![]() |
![]() |
| Users | Holidays |
|---|---|
![]() |
![]() |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser (React) β
β TypeScript Β· Tailwind CSS Β· Vite 8 β
βββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββ
β HTTP / REST
βββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ
β Go Backend β
β gRPC Β· gRPC-Gateway Β· Protocol Buffers β
βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββ€
β SQLite (default) β MongoDB (optional) β
βββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββ
The single Docker image embeds both the Go binary and the compiled React SPA. The backend serves the frontend static files and provides the REST/gRPC API.
| Layer | Technology |
|---|---|
| Backend | Go 1.26, gRPC, gRPC-Gateway, Protocol Buffers |
| Frontend | React 18, TypeScript 5, Tailwind CSS 3, Vite 8 |
| Database | SQLite (default) Β· MongoDB (optional) |
| Auth | Dex (OIDC/PKCE), JWT, JWKS |
| Container | Docker (multi-stage, Alpine) |
| Orchestration | Kubernetes Β· Helm Β· Skaffold |
| CI/CD | GitHub Actions (SHA-pinned) |
| Tool | Version | Purpose |
|---|---|---|
| Go | 1.26+ | Backend |
| Node.js | 24+ | Frontend |
| Task | latest | Task runner |
| Buf | latest | Protobuf tooling |
| Docker | latest | Containers |
docker-compose up -dThe application is available at http://localhost:8080
# Clone
git clone https://github.com/BananaOps/offly.git && cd offly
# Install all dependencies and generate protobuf code
task setup
# Start the app (backend + frontend with hot reload)
task dev| Service | URL |
|---|---|
| Web UI | http://localhost:3000 |
| REST API | http://localhost:8080/api/v1 |
| Swagger UI | http://localhost:8080/docs |
| gRPC | localhost:50051 |
# Requires k6 β see k6-README.md
k6 run k6-seed-data.jsCreates 5 departments, 10 teams, 12 users, 29 public holidays, and random absences.
# Pull & run (in-memory storage β no DB required)
docker run -p 8080:8080 bananaops/offly:latest
# With persistent SQLite
docker run -p 8080:8080 \
-v $(pwd)/data:/app/data \
bananaops/offly:latest
# With MongoDB
docker run -p 8080:8080 \
-e STORAGE_TYPE=mongodb \
-e MONGO_URI=mongodb://host.docker.internal:27017 \
bananaops/offly:latestSee DOCKER.md for the full deployment guide.
# Add the chart repository
helm repo add offly https://bananaops.github.io/offly
helm repo update
# Install
helm install offly offly/offly
# Install a specific version
helm install offly offly/offly --version 0.1.0
# Upgrade
helm upgrade offly offly/offly| Variable | Description | Default |
|---|---|---|
STORAGE_TYPE |
sqlite or mongodb |
sqlite |
SQLITE_DB_PATH |
SQLite database path | /app/data/offly.db |
MONGO_URI |
MongoDB connection string | mongodb://localhost:27017 |
HTTP_PORT |
HTTP server port | 8080 |
GRPC_PORT |
gRPC server port | 50051 |
AUTH_ENABLED |
Enable SSO authentication | false |
AUTH_ISSUER_URL |
OIDC issuer URL | β |
AUTH_CLIENT_ID |
OIDC client ID | β |
Offly supports optional SSO via Dex (OIDC/PKCE flow).
Browser ββPKCEβββΆ Dex ββID TokenβββΆ Backend ββJWT verifyβββΆ SQLite
| Role | Permissions |
|---|---|
admin |
Full access β users, teams, holidays, absences |
user |
Read all Β· Edit own profile & absences only |
See SSO-README.md for the full configuration guide.
Interactive documentation available at http://localhost:8080/docs
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/health |
Health check |
GET/POST |
/api/v1/users |
List / create users |
GET/PUT/DELETE |
/api/v1/users/{id} |
Get / update / delete user |
GET/POST |
/api/v1/teams |
List / create teams |
GET/POST |
/api/v1/absences |
List / create absences |
PUT/DELETE |
/api/v1/absences/{id} |
Update / delete absence |
GET/POST |
/api/v1/holidays |
List / create public holidays |
GET |
/api/v1/auth/config |
SSO configuration |
POST |
/api/v1/auth/ensure-user |
Auto-provision SSO user |
Services: AbsenceService Β· UserService Β· OrganizationService Β· HolidayService
task setup # Install deps + generate protobuf code
task dev # Start backend + frontend (hot reload)
task build # Build the full application
task test # Run all tests
task lint # Lint backend + frontend
task format # Format backend + frontend
task proto # Regenerate protobuf code
task proto:lint # Lint protobuf definitions
task mongo:start # Start MongoDB in Docker
task mongo:stop # Stop MongoDB
task pre-commit # Format + lint + test (run before committing)
task clean # Remove generated filesoffly/
βββ backend/
β βββ cmd/server/ # Server entry point
β βββ internal/
β β βββ auth/ # OIDC, JWT, RBAC middleware
β β βββ service/ # gRPC service implementations
β β βββ storage/ # SQLite + MongoDB adapters
β βββ proto/ # Protocol Buffer definitions
βββ frontend/
β βββ src/
β βββ components/ # React components
β β βββ AbsenceGrid # Main calendar grid
β β βββ PresenceView # Daily attendance view
β β βββ UserManagement
β β βββ TeamManagement
β β βββ HolidayManagement
β βββ api.ts # REST API client
β βββ auth.ts # PKCE / JWT helpers
β βββ types.ts # TypeScript types
βββ helm/offly/ # Helm chart for Kubernetes
βββ dex/ # Dex OIDC provider (dev/test)
βββ Dockerfile # Multi-stage build (frontend + backend)
βββ docker-compose.yml # Local stack
βββ Taskfile.yml # Task automation
βββ k6-seed-data.js # Test data generator
Contributions are welcome! We follow Conventional Commits:
git commit -m "feat: add new absence type filter"
git commit -m "fix: correct date calculation in calendar"
git commit -m "docs: update API reference"Types: feat Β· fix Β· docs Β· chore Β· ci Β· refactor Β· perf Β· test
Releases are automated via Release Please.
MongoDB won't start
task mongo:stop && task mongo:startProtobuf compilation errors
task install:backend
task proto:lint # Check for syntax errors
task proto # RegenerateFrontend dependency issues
cd frontend && rm -rf node_modules package-lock.json && npm installSSO / Dex issues
See SSO-README.md for detailed troubleshooting steps.
Released under the MIT License β Β© BananaOps
Documentation Β· Issues Β· Discussions Β· Docker Hub
Made with β€οΈ by BananaOps



