Meeting summary

Pro

An AI meeting notes card: the header shows the Google Meet or Zoom mark, the attendees and the duration. Summary, Decisions and Action items stream in after a short summarizing pass. Hover any line to see the transcript quote it came from, then check off action items or send them to Linear or Notion.

Live · keyboard ready

Annual billing launch review

Google Meet, Tue, Oct 2710:00 to 10:4242 min

Summarizing transcript

Claude Sonnet 5.56,214 words

Summarizing transcript

  • Showing AI notes after a call in a CRM, a recruiting tool, a meeting recorder or a team workspace.
  • Turning a transcript into decisions and owned tasks that people can push to their tracker.
  • Any summary where readers should be able to check a point against what was actually said.
  • Live captions or a running transcript during the call; use text-stream or a transcript view.
  • A general task list with no meeting behind it; use checkbox rows in your own list.
  • Long documents with many sections; render them as a document page instead of a card.

Installation

Pro source and install commands unlock with a Pro plan.

example.tsx
import { MeetingSummary } from "@/components/arc/meeting-summary/meeting-summary"; export function CallNotes({ meeting, status, createIssue }) {  return (    <MeetingSummary      meeting={meeting}      status={status}      onSend={(item, target, signal) => createIssue({ title: item.text, target, signal })}      onActionItemChange={(item, done) => console.log(item.id, done)}    />  );}

MeetingSummary

AI notes for one call: a meeting header, then Summary, Decisions and Action items that stream in after a short summarizing pass. Each point links to its transcript quote, and each action item can be checked off or sent to Linear or Notion. With no props it plays a sample and simulates every send.

PropTypeDefaultDescription
meetingMeetingSummaryDatameetingSummarySampleTitle, platform (google-meet, zoom or other), startsAt, durationMinutes, transcriptWords, attendees, and the summary, decisions and actionItems lists. Points carry an optional quote { speakerId, at (seconds), text }; action items add ownerId, due (ISO date) and done.
status"summarizing" | "ready" | "error"–Controlled status. Leave it out and the card plays its own summarizing pass when it scrolls into view. Ready with empty lists shows the no transcript state.
errorstring–Message shown under the error title when status is error.
autoPlaybooleantrueUncontrolled only: start summarizing and play the pass. False starts on the finished notes.
streamInbooleantrueStream the notes in, a few words at a time, when status moves from summarizing to ready.
model{ name: string; icon?: ReactNode } | nullClaude Sonnet 5.5The model credited in the footer. Pass null to hide it.
sendTargets("linear" | "notion")[]["linear", "notion"]Where action items can be sent. Pass [] to hide the send buttons.
onSend(item, target, signal: AbortSignal) => Promise<{ reference?: string; url?: string } | void>–Creates the issue or page. Resolve with a reference ("PRC-142") and optional url to show a sent chip; reject to show a retry. The signal aborts on unmount and on regenerate. Without it, sending is simulated.
onActionItemChange(item: MeetingActionItem, done: boolean) => void–An action item was checked or unchecked. The card keeps the checked state itself.
onRegenerate() => void–Regenerate in the footer and Try again in the error state. Uncontrolled cards also replay their own pass.
classNamestring–Class on the root article.
Tab
Moves through the attendees, each timestamp, checkbox and send button, then copy and regenerate.
Focus on a timestamp
Shows the transcript quote for that line.
EnterorSpace
On a timestamp, pins or closes its quote. On a checkbox, toggles it. On Linear or Notion, sends the item.
Escape
Closes an open quote.
  • The card is an article named after the meeting, with h2 for the title and h3 for each section.
  • Timestamps are buttons with aria-expanded; the open quote is a role="tooltip" referenced by aria-describedby.
  • Each checkbox is a native button with role="checkbox" and aria-checked, and each checkbox and send button is labeled with the action item text, so a list of them still reads clearly.
  • The 16px checkbox has a 32px hit area, and the keyboard focus ring hugs the square itself.
  • A polite live region announces summarizing, the finished summary, checked items and sends, and says "Simulated, nothing was sent" when no onSend is wired.
  • Status never relies on color: a failed send shows an alert icon with a retry label, a sent item shows the target mark, its reference and a check.
  • The platform name is read before the date, and owners shown by first name on narrow cards keep their full name for screen readers.
  • Summarizing lasts about one second with a shimmer on the label, then notes stream 3 to 8 words every 34ms; each chunk only fades in.
  • The body springs to its new height between loading, notes, error and empty (0.24s, no bounce). Owner, date and send controls reserve their space while text streams, so nothing shifts when they fade in.
  • Checking an item grows the accent fill in (160ms) and draws the check on (200ms ease-out), while a 1px strikethrough sweeps left to right across every wrapped line and the text eases to muted. Unchecking reverses it faster. A press scales the square to 0.9, never the row.
  • Send buttons crossfade mark to spinner to a sent chip while their slot springs to the new width.
  • Quotes fade in over 160ms with a 3px offset after a short hover intent, then switch instantly between lines.
  • Reduced motion skips the stream, size springs, check drawing and strikethrough sweep and keeps every end state and announcement. The pass waits until the card is on screen. The sample sends one item to Linear and ticks off another once, unless someone has already used the card.
  • Holds from 360px to its 640px max width. Below 460px the attendee stack moves under the date; below 520px owners show their first name so meta stays on one line.
  • Quotes open below their line and flip above when the viewport runs out of room.
  • Hover quotes need a fine pointer; on touch, tapping a timestamp pins the quote and tapping elsewhere closes it.
  • Streaming re-renders only the card for about 1.5 seconds, using one interval. Chunk animations are CSS keyframes.
  • One ResizeObserver for the body height and one per send slot; all are released on unmount and in-flight sends abort.
  • Marks are inline SVG, no network requests besides attendee portraits.

Notes for AI

Give your coding assistant the Markdown reference instead of screenshots.

  • Use for post-meeting notes from a recorder or transcript pipeline. Map your model output to MeetingSummaryData; keep quote.at in seconds from the start of the recording.
  • Drive status yourself when the summary comes from a server: summarizing while the request runs, ready when it resolves, error with a message on failure.
  • Wire onSend to the Linear issueCreate mutation or a Notion pages.create call and resolve with the issue key or page title; pass the AbortSignal through to fetch.
  • Dates are naive local strings printed the same on server and client. Format time zones before passing them in.

The full library index for assistants is at /llms.txt.