Skip to content

Calendar editing: create, change and delete your Google events from PM #884

Open

Description

@BBYU26

What this is

Edit your calendars from PM instead of switching to Google Calendar: create, change, move and delete events, including repeating events and events with guests, on any Google calendar you can write to. Decided 2026-10-09; this replaces the card's earlier scope of "PM-owned projected events only".

Decisions (Bobby, 2026-10-09)

  • Google is the source of truth. PM writes through to Google and trusts its reply. PM never keeps its own copy of an edit.
  • Online only for now. Editing offline and resolving conflicting changes are a separate, later card. Until then PM still detects a conflicting change and never overwrites it.
  • Full functionality. Choose the calendar, repeating events (this event / this and following / all events), guests, drag to move, click-and-drag to create: what Google Calendar's own editor does. Each deliberate cut gets written down.
  • Permission: calendar.events, turned on per Google account ("Enable editing"). Calendars shared with you are editable where you have write access. Subscribed and ICS calendars stay read-only.
  • No "Edit in Google" link as a stopgap.
  • AI editing your calendar is its own later Stage-4 card; nothing in this epic lets a model reach the write path.

Safety rules every layer keeps

  1. Every edit is a diff against a fresh copy from Google, and PM checks the event's version before sending only the fields you changed (and sends that version with the write). If the event changed elsewhere, that's a conflict and PM never silently overwrites it.
  2. PM's local mirror is shortened on purpose and is never used to build a write.
  3. A background sync can't undo a save you just made.
  4. Only PM's main window can call the write commands.

Prerequisite fixes (merged 2026-10-09)

Build plan after the fixes

About 23 layers. In order: Enable editing per account (C1), the mirror and pure write core (C2–C3), write commands and fences (C4), the single-event editor (C5–C6), repeating events including "this and following" (C7–C9), create (C10), repeat rules (C11), guests with Send / Don't send (C12), notifications, colours and labels (C13; labels were cut from it on 2026-10-19 and have their own Backlog card), invitations and RSVP (C14), drag to move and resize (C15–C16), click-and-drag to create (C17), Meet, Duplicate and change calendar (C18), rich-text descriptions (C19), and birthday and Gmail events (C20). Each layer is live-tested on a dev build against a copy of the data folder and a dedicated test calendar.

Delivery

A stacked series of PRs. They merge into main in reviewed batches (the first, the prerequisite fixes, on 2026-10-09); no release is cut until the whole stack is done and has been tested on a dev build. As of 22-10-2026 the last release is still v3.130.10-alpha (2026-08-29).

Decided 2026-10-09 (Bobby took every recommendation on the plan's open questions): Outlook editing is its own card, "Outlook calendar editing (phase 2)", because there is no Outlook account to test against. Focus time, out of office and Find a time are a card until a Workspace account turns up. Touch dragging stays off in v1. Calendar settings and sharing, attachments, search beyond the mirror and .ics import, and dragging milestones each have their own Backlog card.

Cards added since: "Check repeating events against Google Calendar, then match it" (17-10), "Google Calendar event labels: show and change them" (cut from C13, 19-10), "Declined events still nudge" (found while specifying C14, 20-10), "Adding guests to someone else's event" (C14, question 4) and "Check creating events against Google Calendar, then match it" (C10's Google checks, G1 to G6). The specs for C to F name a few more, each made with its PR.

Layers

C9 (edit, delete and split repeating events) is six PRs (decided 2026-10-17, C9a-3 split in two the same day; design in the local docs):

C10 (creating events) is three PRs (decided 2026-10-18; spec in the local docs):

C11 (repeat rules: new events can repeat, and changing how an event repeats) is four PRs (decided 2026-10-18; spec in the local docs):

C12 (guests, and Send / Don't send) is four PRs (decided 2026-10-19; spec in the local docs):

#968 (that week's dependency security advisories: Pillow 13, certifi and the certificate crates, with Python 3.11 or newer) merged first, and everything through C12c merged on 2026-10-22 (3.155.0-alpha).

The rest, regrouped (decided 2026-10-22)

Bobby asked for fewer PRs to save time and tokens, so the 24 PRs the C12-C20 specs planned become 7, one per feature a user would name. The specs are unchanged; each PR still builds layer by layer, then gets one version bump, one review loop and one full check.

A to C are stacked on #998 (that week's Dependabot batch, 3.155.1-alpha; it also builds the Linux rpm in its own step, labelled 3.155.1+alpha, because the newer Tauri CLI refuses the - in -alpha there). Merge order: #998, #976, #977, #999. D starts from main after that.

Decided 2026-10-17 (Bobby took every recommendation): a change to who can see a repeating event pre-selects nothing and keeps Save off until you pick "This and following" or "All events"; a linked milestone dated on or after a split is offered a move to the new part each time; the new part gets no Meet link, and the dialog says so; no Undo after saving a repeating event in C9 (it comes with drag's Undo, C16); and the Google checks for C9a join the Backlog card "Check repeating events against Google Calendar, then match it".

Fixes from the first live test (2026-10-10), before C8

Bobby's live test of C1–C7 on a dev build found these. Decided the same day: event colours fill the card the way Google does, a "prepare ahead" you've cleared stays cleared when the event moves, and PM checks Google about every 30 seconds while its window is on screen.

Live tests owed (22-10-2026)

No live-test results are recorded since the second live test (2026-10-15). The steps are in the local docs/calendar-live-tests-2026-10-10.md: sections 1 to 3, which now hold a part for each merged layer (C9b-1b, C10a to C10c, C9b-2, C11a, C11b, C11d, C12a, C12c). Two matter most:

  • P-R2: until it's recorded, release builds refuse "Does not repeat" on a repeating event.
  • P-R1 (an all-day repeating event with no time zone): it was C11b's merge blocker, and C11b merged on 22-10 with no result recorded, so release builds already create these.

PR A's, PR B's and PR C's parts are written and wait for those PRs. For PR C, LD1 matters most: it checks that WebKitGTK keeps the pointer on the calendar while dragging, and if it doesn't, every drag is put back. #998 adds one: install the release rpm over your current one on Fedora (rpm -q pm should show the +alpha label).

The Google Calendar checks live on Backlog cards: repeating events (L-R11, the C9a probes, P-R1 to P-R6) on "Check repeating events against Google Calendar, then match it", and creating events (the create spec's G1 to G6, not the guest probes of the same names in the live-tests doc) on "Check creating events against Google Calendar, then match it". The four prerequisite fixes' live tests are in the descriptions of #885, #889, #890 and #891, still unticked.

Out of scope

  • Apple calendars stay read-only (CalDAV/EventKit is its own card, "Apple Calendar / Contacts (CalDAV / EventKit)", Stage 4 since the 2026-07-15 reorg).
  • No offline queue and no push relay in this epic.

The earlier prerequisite list here (a durable write queue, an incremental mirror first, keeping recurring series locally) isn't needed for an online write-through, so it moves to the offline card. "Calendar — PM correspondence" (deadline projection) now comes after this and reuses its write core.

Activity

  1. added
    enhancementNew feature or request
    rustPull requests that update rust code
    javascriptPull requests that update javascript code
    on Oct 9, 2026
  2. self-assigned this
    on Oct 9, 2026
  3. 101 remaining items

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestjavascriptPull requests that update javascript coderustPull requests that update rust code

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions