Skip to content

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.


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.


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”.


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.


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

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

  • 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.


Planned features, current priorities, and what’s in progress live on the public Musubi roadmap on GitHub.