Skip to content
back to the quest log
rare◆ productlive

MGM Calendar

Recurrence, done properly

A public event calendar and admin panel — Go and Postgres behind it, real iCal recurrence rules, Indonesian public holidays seeded on first boot.

role
Full-stack
org
MGM Laboratory
when
2025

What it is

A Go (chi) API on PostgreSQL with golang-migrate, S3 attachments and HS256 sessions, plus a Next.js front end with a TipTap editor that speaks images, audio, YouTube and file attachments.

Recurrence is the part everyone gets wrong. Events carry iCal RRULE strings, expanded server-side up to two years out, with children regenerated whenever the parent rule changes. On first boot it fetches this year's and next year's Indonesian public holidays in the background.

where the effort went

  • Correctness88
  • Craft74
  • Scale45
  • Automation60

the numbers

API
Go + chi
Recurrence
iCal RRULE

expanded 2 years out

Editor
TipTap
Seeded
ID holidays

built with

  • Go
  • PostgreSQL
  • Next.js
  • TypeScript
  • TipTap
  • AWS S3
  • Docker

delivery record

What I made

The organization needed a public schedule that staff could maintain without manually copying recurring events or Indonesian public holidays.

  • 01

    Public month and event views backed by a Go API

  • 02

    Administrative event workflow with rich TipTap media

  • 03

    RFC 5545 recurrence stored as RRULE strings

  • 04

    Two-year server-side recurrence expansion and regeneration

  • 05

    Indonesian holiday seeding on first boot

  • 06

    S3 attachments, PostgreSQL migrations, Docker, and release workflows

Hard problems

The constraints mattered as much as the finished interface.

01field note

Recurrence that remains editable

problem
Materialized occurrences drift when a parent event changes unless regeneration and deletion happen as one lifecycle.
response
The API keeps the RRULE on the parent, expands a bounded two-year horizon, and replaces child occurrences when the rule changes.
02field note

Local calendar semantics

problem
UTC storage alone does not explain how an all-day Indonesian event should appear or recur in WIB.
response
The API documents timezone behavior and seeds local public holidays as calendar data rather than client decoration.

after shipping

What stayed with me

  • Recurring events are generated state and need a clear parent, horizon, and regeneration rule.

  • Calendar correctness lives in timezone and exception semantics more than in the month grid.