Skip to content

[Proposal] replace TOAST UI Calendar with FullCalendar in the calendar app #757

Description

@arisoik

Greetings Peergos team,
Since Calendar app is by default in the main GUI of WebUI and looks
a bit outdated and it is not properly rendered in Android app, I decided
to invest time on refining and extending it but I wanted to check the direction
with you before investing the time needed. I made a plan with Claude Code
about the new library that can be used and also the extra features that can be
implemented to make the app more attractive to users.
What do you think?

Problem

The calendar app (assets/apps/calendar/) is built on TOAST UI Calendar
(tui-calendar.js, vendored). Both tui-calendar/@toast-ui/calendar npm
packages haven't had a release in ~4 years and appear to be unmaintained. In
practice this has made the calendar's layout fragile to work on - fixing
bugs has meant hand-patching the minified vendored bundle directly rather
than working with a maintained upstream.

The bigger motivation, though, is cross-platform usability rather than just
the maintenance status: the calendar needs to work well on mobile (the
Android app embeds this exact repo in a WebView; there's no native iOS app
yet, so iOS means mobile Safari for now) as well as desktop browsers, and
TUI Calendar's rigid, pixel-width-based layout is a poor fit for that.

Proposal

Replace it with FullCalendar (Standard bundle +
the RRule plugin):

  • Actively maintained (10+ years, 100+ contributors).
  • Both the Standard bundle and the RRule plugin are MIT licensed -
    confirmed via FullCalendar's own license page and RRule plugin docs. No
    Premium/commercial features needed for anything this calendar currently
    does.
  • Ships a self-contained index.global.min.js UMD build usable via a plain
    <script> tag, so it can be vendored into assets/apps/calendar/ exactly
    the way the current libraries already are - no npm/webpack dependency
    introduced
    , consistent with the project's build philosophy.

Architecture stays the same. This would not change how the calendar is
wired into the rest of the app: same iframe-on-its-own-subdomain pattern used
by the calendar/code-editor/pdf/markdown-viewer sub-apps today, same
postMessage contract between Calendar.vue and the iframe, same .ics
file storage model owned by Calendar.vue (untouched). This is purely a
swap of the rendering library inside assets/apps/calendar/init.js - not a
rewrite of how the calendar talks to Peergos.

No drag-and-drop. Moving an event to a different day would go through the
existing edit popup's date field, not a drag gesture across the grid. This is
deliberate: FullCalendar has an open, closed-without-a-documented-fix issue
about event dragging not working inside an embedded Android WebView (works
fine in a regular mobile browser tab) - avoiding that interaction pattern
sidesteps the risk entirely rather than relying on it working.

Non-negotiable for this migration

  • Full feature parity with the current implementation: recurring events
    (all RRULE options currently supported, plus per-occurrence exceptions and
    "this and future" edits), multiple calendars, sharing, ICS import/export,
    read-only/guest access, dark mode, timezone handling.
  • .ics stays a standard, portable format. Export from Peergos must
    import cleanly into Google Calendar/Outlook/Apple Calendar and vice versa -
    this is already true today (plain RFC5545, standard PRODID tag) and must
    stay true after the swap.

Also proposing as new scope

  • A basic event search box (search loaded events by title/location/
    description) - the current calendar has no search at all, and this seemed
    like a reasonable small addition while already touching this code.
  • A "Duplicate" action on an event (creates a copy on a new date, pre-filled
    from the original, instead of a blank form) - also doesn't exist today.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions