Family Calendar

The problem

Family plans are spread across individual calendars, school feeds and conversations. It’s hard to see the whole week in one place, and a shared display stops being useful if events are missing, duplicated or out of date.

The solution

I built a shared calendar for our kitchen iPad, with a quick way to add events from a phone. The app imports iCal feeds and matches updates to the events already saved.

Events added from a phone go into the same database. Agenda, week and month views show who each event belongs to, whether it came from a feed or was added locally.

How it works

The architecture, at a glance.

  1. Calendar feeds

    Subscribed iCal sources and school events

  2. Sync & reconcile

    Recurrence, exceptions, timezones and duplicates

  3. Shared event store

    Neon Postgres plus local events and hidden items

  4. Family views

    Kitchen iPad display and mobile event entry

Phone edits update the shared calendar. Subscribed calendars are read-only imports that refresh separately.

Calendar feed credentials stay on the server. Feed URLs are encrypted, and devices use signed sessions.

Technology

Application
Next.js, React and TypeScript with responsive agenda, week and month views.
Data & hosting
Neon Postgres and Vercel, with server-side calendar sync and shared event storage.
Calendar integrity
iCal parsing, recurring-event reconciliation, encrypted feed URLs and signed device sessions.

Worth mentioning

Keeping up with calendar changes

An imported event can repeat, move, change time zone or be canceled. I keep track of event identity and exceptions to recurring events, so a refresh updates the right occurrence without adding duplicates.

Keeping hidden events hidden

If someone removes an imported event from the family view, it shouldn’t come back on the next sync. I store that choice separately from the source event so refreshes respect it.

Making it work in the kitchen and on a phone

The kitchen display needs to be easy to read at a glance. On a phone, adding an event needs to be quick. Both use the same event store, with an interface suited to each screen.

Worth walking past

I added a photo carousel that cycles through family photos on the kitchen display. It’s a small thing, but seeing a familiar moment as you walk past brings a smile to an otherwise busy day.