Orbit Calendar is a native macOS calendar workspace with an action-oriented AI layer on top of scheduling, booking, and time management.
Instead of behaving like a passive calendar viewer, Orbit is designed to help a user:
- authenticate into the app
- inspect upcoming work
- ask for scheduling help in natural language
- confirm agent-driven calendar actions
- publish a booking page for inbound meetings
The current build ships as a local-auth MVP with a native SwiftUI macOS client, a FastAPI backend, PostgreSQL persistence, an agent/action layer, and an unsigned local .dmg packaging flow.
North star:
- reduce time wasted in scheduling, context-switching, and meeting setup
Current product shape:
- native macOS client
- local email/password auth
- protected calendar workspace
- agent panel for read and write calendar actions
- booking page configuration
- public booking flow
- local packaging into a
.appand.dmg
- built with SwiftUI
- blue glass, calendar-oriented desktop theme
- dedicated sections for calendar, booking, and settings
- local sign up / login before entering the app
- sign up with email, password, display name, and timezone
- login with persistent bearer session
- logout from settings
- protected backend routes for user-specific data
- loads upcoming events for the authenticated user
- seeds local sample events in the current provider mode
- supports event refresh and visual event browsing
- designed around a calendar-first layout instead of generic chat UI
- natural-language query input
- intent routing for:
show_schedulefind_free_timecreate_eventmove_eventopen_booking_settings
- confirmation modal for write actions
- event creation and move execution through backend tools
- per-user booking page settings
- unique default slug generation
- timezone-aware public availability lookup
- public booking creation into the user calendar
- overlap protection when a slot is no longer available
- local build of the native executable
- unsigned
.appwrapper generation - unsigned
.dmggeneration for local installation/testing
Implemented now:
- local auth
- native macOS flow
- protected backend APIs
- local calendar provider
- booking page and public booking route
- unsigned
.dmg
Deferred for later:
- Google OAuth
- Google Calendar provider implementation
- signed Apple distribution
- notarization
- production deployment
The app currently uses local auth and a local calendar provider behind a provider seam. That means the desktop client already talks to stable backend contracts while the provider implementation can later switch from local to google.
graph TD
A[macOS SwiftUI App] --> B[Local Auth Screen]
B --> C[FastAPI Auth Routes]
A --> D[Protected App Shell]
D --> E[Calendar Workspace]
D --> F[Booking Settings]
D --> G[Settings]
E --> H[Agent Query / Execute]
E --> I[Calendar Events API]
F --> J[Booking Page API]
J --> K[Public Booking Routes]
C --> L[PostgreSQL]
H --> L
I --> M[Calendar Provider Seam]
J --> L
K --> L
M --> N[Local Calendar Provider]
M -. later .-> O[Google Calendar Provider]
sequenceDiagram
participant U as User
participant M as macOS App
participant A as FastAPI
participant D as PostgreSQL
U->>M: Sign up / Log in
M->>A: /api/auth/signup or /api/auth/login
A->>D: Create user / session
A-->>M: Bearer token + user profile
M->>A: Protected requests with token
A->>D: Read/write user data
A-->>M: Events, booking settings, agent responses
U->>M: Ask Orbit to create or move something
M->>A: /api/agent/query
A-->>M: Proposed action
U->>M: Confirm action
M->>A: /api/agent/execute
A->>D: Persist calendar update
A-->>M: Success response
apps/
api/ FastAPI backend, Alembic migrations, auth, agent, booking, data model
macos/ SwiftUI macOS client, app theme, auth screen, calendar UI, packaging output
docs/ product, architecture, and build planning docs
scripts/ packaging helpers
- SwiftUI
- Swift Package-based macOS app target
- Observation-based local app state
- FastAPI
- SQLAlchemy
- Alembic
- PostgreSQL
- Swift build output
- custom
.appwrapper script hdiutilfor unsigned.dmggeneration
- macOS
- Python 3.11+
- PostgreSQL running locally
- full Xcode installed and selected:
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcodebuild -versioncd apps/api
python3 -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
createdb orbit_calendar
alembic upgrade head
uvicorn app.main:app --host 127.0.0.1 --port 8000Terminal:
cd /Users/RISHAV/Developer/Orbit
swift run --package-path apps/macos OrbitCalendarMacXcode:
open /Users/RISHAV/Developer/Orbit/apps/macos/Package.swiftThen select the OrbitCalendarMac scheme and press Run.
To build an unsigned local .dmg:
cd /Users/RISHAV/Developer/Orbit
./scripts/package_macos_app.shGenerated artifacts:
apps/macos/dist/Orbit Calendar.appapps/macos/dist/Orbit-Calendar.dmg
Current release format:
- unsigned local
.dmg
Install flow:
- Build the DMG with
./scripts/package_macos_app.sh - Open
apps/macos/dist/Orbit-Calendar.dmg - Drag
Orbit Calendar.appintoApplicationsor launch it directly for local testing - Start the backend locally before using the app
First-run note:
- because the current package is unsigned and not notarized, macOS may require an explicit approval path through
System Settings -> Privacy & Security
Recommended release checklist:
- build the backend and native app from a clean git state
- generate the unsigned
.dmg - attach the
.dmgto a GitHub Release - include version notes covering auth, provider mode, and local setup requirements
POST /api/auth/signupPOST /api/auth/loginPOST /api/auth/logoutGET /api/me
GET /api/calendar/eventsPOST /api/calendar/sync
POST /api/agent/queryPOST /api/agent/execute
GET /api/booking-pagePUT /api/booking-pageGET /api/public/booking-pages/{slug}GET /api/public/booking-pages/{slug}/availabilityPOST /api/public/booking-pages/{slug}/book
- auth is local email/password, not OAuth
- the calendar provider seam already exists
localprovider is active nowgoogleprovider is intentionally deferred but can be slotted in later without redesigning the client contract
This project is available under the MIT License.
Supporting product and architecture docs live here: