Machine-readable type identifier (e.g., "issue", "pull_request")
Human-readable label (e.g., "Issue", "Pull Request")
OptionalnoteConnector's word for a note on a linked item of this type — used by the Flutter app to adapt note/composer copy ("Add a comment" on Linear, "Add a message" on Slack, "Add a reply" on Gmail). Defaults to "note" when omitted. Use the singular noun in title case (e.g. "Comment").
OptionalcomposePlaceholder shown in the editor when this link type is the target of a new thread (NewThreadPage). Example: "Send a Gmail email". If unset, Plot derives "Create a new {connector} {label.toLowerCase()}".
OptionalcomposeLabel for the Send button on NewThreadPage when this link type is the target. Example: "Send". If unset, defaults to "Create".
OptionalreplyPlaceholder shown in the in-thread editor for the default reply mode. Example: "Reply" (Gmail), "Add a comment" (Linear). If unset, Plot derives "Add a {noteLabel.toLowerCase()}" or "Add a note".
OptionalreplyLabel for the Send button in the in-thread editor. Example: "Send" (Gmail), "Comment" (Linear). If unset, defaults to "Send".
OptionallogoURL to an icon for this link type (light mode). Prefer Iconify logos/* URLs.
OptionallogoURL to an icon for dark mode. Use when the default logo is invisible on dark backgrounds (e.g., Iconify simple-icons/* with ?color=).
OptionallogoURL to a monochrome icon (uses currentColor). Prefer Iconify simple-icons/* URLs without a ?color= param.
OptionalstatusesPossible status values for this type
Machine-readable status (e.g., "open", "done")
Human-readable label (e.g., "Open", "Done")
Optionaldone?: booleanWhether this status represents completion (done, closed, merged, cancelled, etc.)
Optionalactive?: booleanMark the thread active=true in Plot when a link enters this status.
Use for messaging-style flags where the user has indicated they want
to act on the thread now — Gmail's "starred", Slack's "later", etc.
The Plot user can later un-flag the thread without breaking the
connector relationship.
Optionaltodo?: booleanMarks this status as the connector's "to-do" / active state. When a
user brings a done thread back into Plot's agenda, done-status links
are flipped to the status marked todo: true (e.g. Gmail's "starred",
Linear's "unstarted"); connectors that don't mark one fall back to the
first non-done status.
OptionalsupportsWhether this link type supports displaying and changing the assignee
OptionalincludesWhether this link type produces time-anchored schedule/agenda items
(i.e. calendar events). The Plot app shows the agenda (the bottom-nav
tab on mobile and the left-sidebar agenda on desktop) only when the
user has at least one active connection whose link types include one
with includesSchedules: true. Calendar connectors (Google / Apple /
Outlook Calendar) set this on their event link type. Defaults to
false — non-calendar link types (messages, issues, tasks, docs) omit it.
OptionaldefaultDefault thread creation mode for this link type: 'all' | 'actionable' | 'manual'
OptionalcomposeOpt-in: declares this link type is composable from Plot via
Connector.onCreateLink. Omit to make the link type sync-only (no
"Create new …" picker entry).
Connectors that need multiple compose modes for what users perceive as the same kind of thing (e.g. Slack channel post vs DM) should declare separate linkTypes, one per user-facing thread type. That keeps each linkType isomorphic to one filter chip.
OptionalcontactPer-connector contact roles. Examples: email → [{id:"to",label:"To",default:true},{id:"cc",label:"CC"},{id:"bcc",label:"BCC",hidden:true}] calendar → [{id:"required",label:"Required",default:true},{id:"optional",label:"Optional"}]
Plot uses this list to render a role picker on each contact chip in the
composer and to label non-default roles on existing threads. Exactly one
role should be marked default: true. Connectors that don't distinguish
roles (Slack, Linear) omit this field entirely.
OptionalsupportsWhether contacts on an existing thread can be added, removed, or have their role changed (email-style mid-thread recipient changes). When false, the thread's contact list is fixed after creation. Defaults to false when omitted.
OptionalsupportsWhether a note/reply on this link type can carry a link (a pasted URL or connector-created item) that Plot forwards to the source. When false (the default), the "Add link" button is hidden for threads of this link type. Only set true if the connector's reply path actually forwards the link action to the source. Private Plot notes (no link type) always allow links.
OptionalsupportsWhether a note/reply on this link type can carry an uploaded file that Plot forwards to the source as an attachment. When false (the default), the "Attach file" button is hidden for threads of this link type. Only set true if the connector's reply path actually uploads file actions to the source. Private Plot notes (no link type) always allow attachments.
OptionalsharingDeclares how sharing on threads of this link type is scoped:
"thread" (default): one roster shared across all notes in the
thread. Native Plot threads, Slack DMs, calendar events."channel": visibility is the external channel's membership;
the per-thread contacts array is ignored for sharing UI.
Slack channels, Linear projects."message": each note carries its own recipient set via
note.access_contacts; the thread roster is the union across
all messages. Email."none": the link type has no recipient roster at all. No
contacts/sharing UI is shown for these threads. Use for purely
personal destinations with no sharing concept (e.g. Google
Tasks). The per-thread contacts array is ignored for sharing UI.Omit to default to "thread". When set to "message", every
note this connector ingests must populate access_contacts
explicitly (never NULL).
Describes a link type that a connector creates. Used for display in the UI (icons, labels).