Davvy is a Laravel + React app that combines a web admin/dashboard experience with a built-in SabreDAV CalDAV/CardDAV server.
It is designed for:
- Multi-user calendar and address-book hosting
- Share-based collaboration (
read_only,editor,admin) - Browser-based administration and operational controls
- DAV client interoperability with strict validation plus compatibility mode when needed
- Automated rotating backups (local + optional S3) with restore tooling
Dashboard |
Admin Control Center |
Contacts |
Profile |
- Session-based web auth (
/api/auth/*) - Optional TOTP two-factor auth with backup codes
- Optional org-wide 2FA enforcement with grace period
- Localization support with per-user language preference and request-level locale negotiation
- DAV basic auth at
/dav - DAV app passwords for CalDAV/CardDAV clients when 2FA is enabled
- Roles:
admin,regular - Feature flags controlled by admins (public registration, owner sharing, contact management, review queue moderation, DAV compatibility mode)
- Admin user lifecycle controls, including typed-confirm account deletion with optional ownership transfer
- Admin backup controls for schedule, destinations, retention strategy, and ZIP restore import
- Default
Personal CalendarandContactsresources provisioned for each new user - Owned + shared resource visibility in web dashboard
- Create, rename, mark sharable, and export resources
- Per-resource permission enforcement for web and DAV access
- Share permissions:
read_only: view onlyeditor: write/update, no collection deleteadmin: full write + collection delete
- Owner-managed sharing can be globally disabled by admin
- Admin global sharing controls across all users/resources
- Managed contact UI (feature-gated)
- Contact writes synchronized to vCards in assigned address books
- CardDAV writes synchronized back into managed contacts
- Bidirectional related-name sync with inverse family mapping, pronoun-aware gendered labels, and neutral fallbacks when pronouns are not inferable
- Optional contact change moderation queue for cross-owner edits (opt-in, default off for personal deployments)
- Birthday/anniversary generated milestone calendars per address book, including combined couple anniversaries when relationships are mutually linked
- Apple compatibility mirror mode (selected sources mirrored into user's default
contactsbook)
- CalDAV/CardDAV endpoint:
/dav - Autodiscovery redirects:
/.well-known/caldav/.well-known/carddav
- Sync-token incremental change tracking (
added,modified,deleted) - Strict payload validation by default (toggle compatibility mode for legacy clients)
- Docker-first runtime with preflight checks (
php artisan app:preflight) - Built-in scheduler worker support (
RUN_SCHEDULER=true) for periodic jobs (automated backups + milestone horizon roll-forward sync) - Automated backup tiers with rotating retention (
daily,weekly,monthly,yearly) - Restore snapshots via CLI (
app:backup:restore) or Admin Control Center import flow - Railway and Coolify deployment support
- PostgreSQL advisory-lock startup bootstrap for multi-replica safety
- Documentation Index
- User Guide
- API Reference
- DAV Client Setup
- Architecture
- Configuration Reference
- Localization Guide
- Deployment Guide
- Release Checklist (Core)
- Troubleshooting
- Mobile Sync + Review Queue Test Script
- Release Checklist (Railway)
- Release Checklist (Coolify)
The repository compose.yml is tuned for production-style deployment (including Coolify magic variables).
For local development, prefer the DDEV flow below. If you still want local Docker Compose:
- Provide required environment values (for example in
.env):APP_KEY=base64:<generated-key>SERVICE_URL_APP=http://localhost:8080SERVICE_USER_POSTGRES=<db-user>SERVICE_PASSWORD_POSTGRES=<db-password>
- Optionally enable bootstrap admin creation:
RUN_DB_SEED=trueDEFAULT_ADMIN_EMAIL=<admin email>DEFAULT_ADMIN_PASSWORD=<strong password>
- Start app + database:
docker compose up --buildIf you need host-accessible ports locally, uncomment the ports mappings in compose.yml.
ddev start
ddev composer install
ddev npm install
cp .env.ddev.example .env
ddev artisan key:generate
ddev artisan migrate --seedCreate a local admin if needed:
ddev exec sh -lc "DEFAULT_ADMIN_EMAIL='admin@davvy.local' DEFAULT_ADMIN_PASSWORD='ChangeMe123!' php artisan db:seed --force --no-interaction"Run assets:
ddev viteAccess π:
- App:
https://davvy.ddev.site - DAV:
https://davvy.ddev.site/dav
Run test suite:
ddev artisan testOr via Docker:
docker build --target ci-test -t davvy-ci-test .
docker run --rm davvy-ci-testDavvy is deployed as a Docker image. See:
Davvy Source-Available License 1.0 (DSAL-1.0) (LICENSE)
Commercial internal use is allowed. Selling the software, or offering a competing hosted service, requires a separate written commercial agreement from the maintainer.
Contributions are accepted under CLA.md. See CONTRIBUTING.md. Commercial terms can be requested via COMMERCIAL-LICENSE.md.



