Introduction
Musubi is a privacy-first shared calendar app for mobile. The name comes from the Japanese word 結び (musubi) — knot, bond, or connection. The idea: one place to connect your schedule with the people around you, without giving your calendar data to a third party.
You can use the hosted version at musubi.pro or run it yourself.
How it works
Section titled “How it works”Musubi is built around three core concepts: calendars, events, and invites.
Calendars are the main organisational unit. You create a calendar, give it a name and colour, and it becomes a shared space for events. You can own multiple calendars — one for family, one for a project, one for a sports team.
Events are linked into calendars rather than nested inside one. The same event can be linked to a work calendar and a personal calendar, edited once, and seen by members of both. Its home calendar controls who may edit it. Events support titles, start/end times, optional notes, location, a link, and recurrence rules (see Recurring events below).
Invites are how other people join your calendar. You generate a shareable invite link from within the app; anyone who opens it and has an account can accept and become a member.
A member’s abilities depend on their role: viewers can see events, editors can also create and edit them, and owners can additionally rename the calendar, manage members, and delete it. Ownership can be transferred to another member.
Recurring events
Section titled “Recurring events”Musubi supports recurring events using RFC 5545 RRULE strings. The app ships with presets (daily, weekly, weekdays, monthly, yearly) and a custom editor for more specific patterns — for example, “every Tuesday and Thursday” or “every other week on Monday, Wednesday, Friday, 10 times”.
Real-time sync
Section titled “Real-time sync”When someone creates or updates an event, the server nudges connected members over Server-Sent Events (SSE). SSE is best-effort; reconnect and delta sync are the durable recovery path. External providers are polled on a schedule and send the same kind of refresh nudge when their mirror changes.
Settings
Section titled “Settings”A few settings worth knowing about:
- Default calendar view — choose between day, week, or month as your opening view
- Week starts on — Sunday or Monday
- Theme — system, dark, or light
- Time format — 12-hour (AM/PM) or 24-hour
- Date format — the order dates are written (D/M/Y, M/D/Y, or Y-M-D)
- Show Kanji — toggles Japanese month and day characters in the calendar header. This is purely an aesthetic touch reflecting the Japanese name and philosophy behind the app; it is not a localisation feature
Tech stack
Section titled “Tech stack”| Layer | Technology |
|---|---|
| Mobile client | React Native (Expo SDK 56) |
| Routing | Expo Router — file-based navigation |
| State | Zustand |
| Calendar UI | Custom, in-app (components/cal/) — month/day/week, pinch-zoom, drag |
| Recurrence / dates | @musubi/calendar — logic-only package (RRULE + date helpers) |
| Animations | Reanimated v4 + Gesture Handler |
| Server | Express.js (Node.js) |
| Auth | Better Auth — email/password + Google/Apple |
| ORM | Drizzle ORM |
| Database | PostgreSQL |
| Real-time | Server-Sent Events (SSE) |
| Monorepo | pnpm workspaces + Turborepo |
Project structure
Section titled “Project structure”Directoryapps/
Directoryapi/ Express API server (the backend)
- …
Directoryclient/ Expo / React Native app (the frontend)
- …
Directorypackages/
Directorydb/ Drizzle schema, query modules, PostgreSQL migrations
- …
Directorytypes/ Zod schemas + inferred types — the client/server contract
- …
Directorycalendar/ Recurrence (RRULE) expansion + date helpers — logic only
- …
Directoryauth/ Better Auth configuration
- …
Directoryconfig/ Environment loading
- …
Directorydocs/ This documentation site (Astro Starlight)
- …
- turbo.json Task graph (dev/build)
- docker-compose*.yml
For a deeper, layer-by-layer tour of each workspace, see the Architecture Overview.
Roadmap
Section titled “Roadmap”Planned features, current priorities, and what’s in progress live on the public Musubi roadmap on GitHub.