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.frgtn.dev 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 live inside calendars. An event can belong to more than one calendar at the same time — if you share an event across a work calendar and a personal one, all members of both calendars can see 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.

Once someone is a member of a calendar, they can create and edit events in it. Only the calendar creator can delete the calendar itself.


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 in your calendar creates or updates an event, everyone else sees it immediately. The server pushes updates over a persistent Server-Sent Events (SSE) connection — no polling, no refresh needed.


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

LayerTechnology
Mobile clientReact Native (Expo SDK 56)
RoutingExpo Router — file-based navigation
StateZustand
Calendar component@musubi/calendar — forked and extended in-repo
AnimationsReanimated v4
ServerExpress.js (Node.js)
AuthBetter Auth — email/password
ORMDrizzle ORM
DatabasePostgreSQL
Real-timeServer-Sent Events (SSE)
Monorepopnpm workspaces + Turborepo

Musubi/
├── apps/
│ ├── client/ # Expo / React Native mobile app
│ └── api/ # Express.js REST API server
└── packages/
├── calendar/ # Forked calendar component with recurrence support
├── docs/ # This documentation site (Astro + Starlight)
├── db/ # Drizzle ORM schema, migrations, and query helpers
├── auth/ # Better Auth server configuration
├── types/ # Shared TypeScript types (client + server)
└── config/ # Environment variable loading and validation