The Open-Source Alternative to Calendly
Enterprise-grade meeting scheduling platform built with Elixir & Phoenix LiveView
π Try Cloud Version Β· π Documentation Β· π Report Bug
Fork, audit, contribute β or just use it. No vendor lock-in, ever.
Self-host on Docker/Cloudron or use our managed cloud.
Everything you need to get started. Forever. No credit card required.
No tracking pixels, no data mining, no selling your data.
Responsive email designs with calendar attachments.
Real-time updates with Phoenix LiveView. Blazing fast.
Google Calendar Β· Outlook Β· CalDAV Β· Nextcloud Β· Radicale Β· Zimbra
Google Meet Β· Microsoft Teams Β· MiroTalk P2P Β· In-Person / Phone Β· Custom Links
- β Unlimited bookings & meeting types
- β All 6 calendar providers
- β All 5 video platforms
- β Multi-language (EN, DE, UK)
- β Webhooks & embedding
- β Advanced reminders
- β Community support
Perfect for: Individuals, small teams, self-hosters
- β Everything in Free
- β Priority support
- β Support open-source development
- β Early access to new features
Perfect for: Professional businesses, agencies
Self-Hosting: Always free. Deploy on Docker, Cloudron, or bare metal β no licensing fees, ever.
- Multi-provider OAuth (Google, GitHub)
- Generic OAuth/OIDC SSO (Keycloak, Authentik, Okta, Azure AD, etc.)
- Email/password with verification
- Customizable profiles & avatars
- 4-step onboarding flow
- 90+ timezone-aware cities
- Custom business hours & breaks
- Real-time conflict detection
- Configurable meeting types
- 6 calendar providers
- Full CRUD operations
- Auto token refresh
- Calendar discovery
- 5 video providers
- Auto room creation
- Role-based access
- OAuth integration
- Professional templates (MJML)
- 5 notification types
- Calendar attachments
- Delivery tracking
- Rate limiting
- AES encryption
- XSS protection
- Circuit breakers
- 3 languages (EN, DE, UK)
- Auto browser detection
- Localized booking pages
- DST handling
- Secure iframe widgets
- Domain restrictions
- Webhook notifications
- Customizable pages
- Unlimited per meeting
- Flexible timing
- Email notifications
- Automatic retry
Dashboard & Management
Availability & Scheduling
Embedded Booking Widget
| Feature | Tymeslot | Calendly |
|---|---|---|
| Open Source | β Yes | β No |
| Self-Hosting | β Free Forever | β Not Available |
| Data Privacy | β Your Infrastructure | β Their Servers |
| Unlimited Bookings | β Free Tier | β Paid Only |
| Calendar Providers | 6 Providers | 3 Providers |
| Video Providers | 5 Providers | 3 Providers |
| Multi-Language | β 3 Languages | β Multiple |
| Webhooks | β Free Tier | β Paid Only |
| Embedding | β Free Tier | β Available |
Replace endless email chains with professional booking pages.
Coordinate team availability without enterprise pricing.
Keep scheduling data on your own infrastructure.
Multi-language support for global customer bases.
Extensible platform with webhook integrations.
Embed booking widgets in your documentation.
Backend: Elixir 1.19 Β· Phoenix 1.8 Β· Phoenix LiveView 1.1 Β· Oban Database: PostgreSQL 14+ Β· Ecto SQL Frontend: Tailwind CSS Β· ESBuild Β· Alpine.js Email: Swoosh Β· MJML Templates Infrastructure: Docker Β· Cloudron Ready
Try Now β β Zero setup Β· Start in 60 seconds
Guide β β Self-hosting Β· Full control
Guide β β One-click install Β· Managed platform
Deploy β β One-click cloud deploy Β· No server management
If you already have Docker installed, you can pull and run the image in one step:
docker run --name tymeslot \
-p 4000:4000 \
-e SECRET_KEY_BASE="$(openssl rand -base64 64 | tr -d '\n')" \
-e PHX_HOST=localhost \
-v tymeslot_data:/app/data \
-v tymeslot_pg:/var/lib/postgresql/data \
youruser/tymeslot:latestThis command pulls the image automatically if it is not present locally. For a full Docker guide, see README-Docker.md.
Star β β Help others discover Tymeslot.
Subscribe β β Fund open-source development.
Open Issue β β Bugs & feature requests.
Guidelines β β Local setup, development workflow & PR process.
Built-in Protection
- β Input sanitization & XSS protection
- β AES encryption for credentials
- β Rate limiting & IP protection
- β Security headers (CSP, HSTS, CSRF)
- β Spam protection (honeypot + reCAPTCHA v3)
- β Regular dependency updates
Spam Protection
Protect signup and booking forms from bots:
- Honeypot: Invisible field catches automated bots
- reCAPTCHA v3: Google's invisible bot detection (optional)
Enable in your environment:
export RECAPTCHA_SITE_KEY="your_key"
export RECAPTCHA_SECRET_KEY="your_secret"
export RECAPTCHA_SIGNUP_ENABLED="true"
export RECAPTCHA_BOOKING_ENABLED="true"Get keys at Google reCAPTCHA
Registration Control
Disable new user sign-ups without taking down the app β useful for invite-only or closed deployments. Defaults to true (registration open) when the variable is unset.
When disabled:
- The sign-up page and "Sign up" link are hidden
- Email and OAuth registration attempts are rejected with an informative message
- Existing users can still log in normally
How to set REGISTRATION_ENABLED=false depends on your deployment:
| Deployment | How to set it |
|---|---|
| Local dev | Add REGISTRATION_ENABLED=false to your .env file and export it before starting the server, or run export REGISTRATION_ENABLED=false directly |
| Docker Compose | Add REGISTRATION_ENABLED=false to your .env file β it is forwarded to the container automatically |
docker run |
Pass -e REGISTRATION_ENABLED=false, or use --env-file .env to load your .env file |
| Railway | Set REGISTRATION_ENABLED to false in the Railway dashboard under Variables |
| Cloudron | Set REGISTRATION_ENABLED to false in the Cloudron app settings |
Password Authentication Control
Disable email/password login entirely and require OAuth β useful for SSO-only deployments (Keycloak, Authentik, Google Workspace, etc.) where you want to enforce identity-provider authentication. Defaults to true (password auth enabled) when the variable is unset.
When disabled:
- The login form, sign-up page, and password reset flow are hidden
- Direct
POST /auth/sessionrequests are rejected with an error redirect - Password-based registration and reset attempts return an informative error
- OAuth login and registration continue to work normally
- Existing users with passwords can still sign in via OAuth if configured
How to set PASSWORD_AUTH_ENABLED=false depends on your deployment:
| Deployment | How to set it |
|---|---|
| Local dev | Add PASSWORD_AUTH_ENABLED=false to your .env file and export it before starting the server, or run export PASSWORD_AUTH_ENABLED=false directly |
| Docker Compose | Add PASSWORD_AUTH_ENABLED=false to your .env file β it is forwarded to the container automatically |
docker run |
Pass -e PASSWORD_AUTH_ENABLED=false, or use --env-file .env to load your .env file |
| Railway | Set PASSWORD_AUTH_ENABLED to false in the Railway dashboard under Variables |
| Cloudron | Set PASSWORD_AUTH_ENABLED to false in the Cloudron app settings |
Report Vulnerabilities
Use our contact page for security issues.
This project is licensed under the Elastic License 2.0 - see the LICENSE file for details.
Tymeslot is developed by:
- Luka Karsten Breitig
- Diletta Luna OΓ
- Sepapaja 6, 15551 Tallinn, Estonia
- π¬ Join Discussions β Get help from the community
- π Report Bugs β Help us improve
- π‘ Request Features β Share your ideas
- π§ Contact Us β Business inquiries
- β Star on GitHub β Show your support
Built with β€οΈ using Elixir, Phoenix, and LiveView
Made by Luka Karsten Breitig Β· Diletta Luna OΓ Β· Tallinn, Estonia


