You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Replace link.source + link.relatedSource (single text fields) with link.sources: string[]. Two links whose sources arrays overlap share a thread (sources && new.sources). Lets any connector bundle into an existing thread via a canonical alias rather than depending on another connector's exact source format.
Calendar connectors (Google, Outlook, Apple) now emit canonical aliases on every event link — most importantly icaluid:<iCalUID> — alongside their existing connector-native sources.
Fellow migrated from the deprecated relatedSource to the new sources shape.
New Granola connector that uses these canonical aliases to attach AI meeting notes onto the existing calendar event thread. Works for Google/Outlook/Apple events, including recurring meetings (all instances share the iCalUID and collapse onto the master thread). Standalone Granola thread is created when no calendar match exists.
NewLink.source and NewLink.relatedSource remain as @deprecated fields — the runtime normalizes legacy values into sources so existing connectors keep compiling unchanged.
Pairs with the runtime/schema change in plot.git (private monorepo) which adds the link.sources text[] column + GIN index, rewrites the link.ts upsert to use array overlap, migrates the note.ts source lookup, and updates the privacy redaction filters.
Sync a Google Calendar with a recurring meeting; confirm link.sources contains icaluid:<UID>
Connect Granola with an API key, sync; confirm Granola notes attach onto the matching calendar event thread (not a sibling) and use the granola-summary note key so re-syncs replace in place
Confirm a Granola note with no matching calendar event creates a standalone thread
Outlook + Apple equivalents work via the same icaluid: alias
Replace the single `link.source` + `link.relatedSource` bundling key
with a `sources: string[]` array. Two links whose `sources` arrays
overlap share a thread (`sources && new.sources`). Each connector can
emit multiple canonical aliases so any other connector that knows one
of them — most importantly `icaluid:<iCalUID>` — bundles in without
having to know the original connector's exact source format.
Calendar connectors now emit:
- google-calendar: `google-calendar:<iCalUID??id>`, `icaluid:<iCalUID>`,
`google-event:<id>`
- outlook-calendar: `outlook-calendar:<calendarId>:<eventId>`,
`icaluid:<iCalUId>`, `outlook-event:<eventId>`
- apple-calendar: `apple-calendar:<UID>`, `icaluid:<UID>`
Fellow migrated from `relatedSource` to the same `sources` shape.
New Granola connector (`@plotday/connector-granola`): syncs AI meeting
notes via Granola's public API (Bearer API key), emits canonical
calendar aliases so notes attach onto the existing calendar event
thread regardless of which calendar connector created it. Recurring
meetings collapse onto the master thread for free (all instances share
the iCalUID). When no calendar event matches, a standalone Granola
thread is created.
`NewLink.source` and `NewLink.relatedSource` remain as deprecated
fields — the runtime normalizes them into `sources` so existing
connectors keep compiling unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
link.source+link.relatedSource(single text fields) withlink.sources: string[]. Two links whosesourcesarrays overlap share a thread (sources && new.sources). Lets any connector bundle into an existing thread via a canonical alias rather than depending on another connector's exact source format.icaluid:<iCalUID>— alongside their existing connector-native sources.relatedSourceto the newsourcesshape.NewLink.sourceandNewLink.relatedSourceremain as@deprecatedfields — the runtime normalizes legacy values intosourcesso existing connectors keep compiling unchanged.Pairs with the runtime/schema change in plot.git (private monorepo) which adds the
link.sources text[]column + GIN index, rewrites thelink.tsupsert to use array overlap, migrates thenote.tssource lookup, and updates the privacy redaction filters.What's new
google-calendar:<iCalUID??id>,icaluid:<iCalUID>,google-event:<id>outlook-calendar:<calendarId>:<eventId>,icaluid:<iCalUId>,outlook-event:<eventId>apple-calendar:<UID>,icaluid:<UID>granola:note:<id>+ canonical aliases derived fromcalendar_event.calendar_event_idTest plan
pnpm buildintwister/,connectors/granola/,connectors/{google,outlook,apple}-calendar/,connectors/fellow/pnpm validate-changesetspasses (already verified locally —link-sources-arrayvalid)link.sourcescontainsicaluid:<UID>granola-summarynote key so re-syncs replace in placeicaluid:alias🤖 Generated with Claude Code