Name inspired by The Social Animal by Elliot Aronson - no real psychological correlation, just a fitting name.
SocialAnimal is a self-hosted social calendar platform that lets you share your calendar with friends. This is not a self-hosted calendar server - tools like Radicale do that job well. SocialAnimal sits on top: you and your friends log in, import your existing calendars, and share them with each other - with full control over what they can see.
Friends can view shared calendars directly inside the app, or export them as an ICS link into their own calendar client.
A public instance is available at:
| Day | Week | Month |
|---|---|---|
![]() |
![]() |
![]() |
| Friend Request | Share Menu |
|---|---|
![]() |
![]() |
Many proprietary apps act as a social calendar, but usually require everyone to use their platform as a calendar provider.
But what if you want to keep using your existing calendar provider and simply share it with others?
SocialAnimal takes a different approach: it connects to your existing calendars and lets you share them with friends, family, or partners.
- View shared events directly in the app or export them back to your own calendar (planned feature - see Roadmap)
- Fine-grained permissions let you control exactly what you share, with whom, under which conditions (planned feature - see Roadmap)
Accounts & Social
- User authentication and profile settings
- Friend system (requests, accept/decline)
Calendar Integration
- Google Calendar import
- CalDAV / iCloud support
- ICS / iCal feed import
- ICS export for external calendar clients
Calendar Experience
- Day, week, and month views
- Side-by-side view of your events and friends' calendars
- Toggle individual calendars in the sidebar
Sharing & Permissions
- Share calendars with friends
- Per-calendar visibility controls:
- Busy only
- Titles only
- Full event details
Automation
- Automatic calendar sync on configurable intervals
This project is not in a stable version as of yet. Stable release is planned for version v1.0.0.
Major architectural changes, severe bugs, or data loss are to be expected.
What is still planned:
- Easy integration for Proton, Outlook, Fastmail and possibly more
- Admin dashboard with user management
- Improved permission system (intuitive and advanced mode, possibly ABAC)
- More export types with direct push to calendars
- Better invite system (multiple codes, shareable invite links)
- Managing Events directly within the app (Own calendar provider type, would allow shared calendars multiple people can manage)
- Determine Shared Free Time
- Calendar color customization
- Email verification, two-factor authentication, and password reset
- Internal things like incremental sync, rate limiting...
- Many more small improvements...
Pull the compose file and example environment:
curl -O https://raw.githubusercontent.com/NLion74/SocialAnimal/refs/heads/main/docker-compose.yml
curl -O https://raw.githubusercontent.com/NLion74/SocialAnimal/refs/heads/main/example.env
cp example.env .envEdit .env with your configuration:
# See Google Calendar Setup below
GOOGLE_CLIENT_ID=clientid
GOOGLE_CLIENT_SECRET=clientsecret
GOOGLE_REDIRECT_URI=http://localhost:3000/api/providers/google/callback
DATABASE_URL="postgresql://postgres:postgres@db:5432/socialanimal"
JWT_SECRET="supersecretkey"
NODE_ENV=production
FRONTEND_PORT=3000
PUBLIC_URL=http://localhost:3000
BACKEND_PORT=4000Start the services:
docker compose up -dThe service will be available at http://localhost:3000
To enable Google Calendar integration:
- Go to Google Cloud Console
- Create a new project or select an existing one
- Enable the Google Calendar API
- APIs and services โ OAuth Consent Screen
- Under Data access, add scope .../auth/calendar.readonly, then save
- Go to Clients and create a Client ID of type Web Application
- Add authorized redirect URI:
https://your-public-url/api/providers/google/callback - Copy the Client ID and Client Secret to your .env file
Without Google credentials, users can still import calendars via ICS/iCal URL.
This project is in early development and contributions are very much appreciated! For larger architectural changes or if you're unsure feel free to open an issue. Otherwise you may open a PR directly for smaller fixes, or even something larger but don't be disappointed if without further discussion in an issue your changes may not be merged
- Frontend: Next JS, React, TypeScript
- Backend: Node JS, Fastify, TypeScript
- Database: PostgreSQL
- ORM: Prisma
- Testing: Vitest
- Containerization: Docker, Docker Compose
The backend API structure shown below may be out of date - check the latest snapshot here.
Base routes:
GET /health
Users (/api/users):
POST /registerPOST /loginGET /public-settingsGET /mePUT /meDELETE /meGET /app-settings(admin)PUT /app-settings(admin)POST /invite(admin)
Calendars (/api/calendars):
GET /PUT /:idDELETE /:idPOST /:id/syncGET /:id/test
Events (/api/events):
GET /GET /friends
Friends (/api/friends):
GET /POST /requestPOST /:id/acceptDELETE /:idPOST /share-calendar
Providers:
POST /api/providers/:type/importGET /api/providers/:type/export/:calendarIdPOST /api/providers/:type/testGET /api/providers/:type/discoverPOST /api/providers/:type/discoverGET /api/providers/google/auth-urlGET /api/providers/google/callback
The backend follows a route - service - data/utils structure.
Core backend areas:
- Calendar providers
- User auth and settings management
- Calendars and events
- Friends
Providers use a capability based handler. They implement traits like:
- importable
- syncable
- discoverable
- testable
- exportable
This allows providers to implement only features they allow.
Layer separation:
- Routes - HTTP layer
- Services - business logic
- Data & utilities - DB persistence, auth, permission and helper logic
Frontend architecture:
- Provides a main layout and authentication routes
- Once authenticated, users interact with the protected layout and app pages
- Handles rendering of calendars, events, and friend-sharing controls from backend
To start a development instance use:
git clone https://github.com/NLion74/SocialAnimal.git
cd SocialAnimal
# Adjust .env as needed
cp example.env .env
docker compose -f dev-docker-compose.yml upgit clone https://github.com/NLion74/SocialAnimal.git
cd SocialAnimal
# Adjust .env as needed
cp example.env .env.build
docker compose -f build-docker-compose.yml build --no-cache
docker compose -f build-docker-compose.yml --env-file .env.build upcd backend
npm test
cd ../frontend
npm test






