Skip to content

Board meeting recipe

Rendered

matter
board · 2026-05-12 · 14:00 PT⌘K

Quarterly Board Meeting

Agenda8 items · 75 min total
1Approve Q1 minutes5 min
2Series A close authorization20 min
32026 equity plan adoption15 min
4Compensation committee report10 min
Action items9 tracked from this meeting
Distribute Series A SPA to LRP for reviewAlex
Finalize 409A valuation memoJordan
Update BOI filing post-closeSam
Attendance5 of 5 directors present
Alex KimFounder, CEO
Signed
Jordan PatelFounder, CTO
Signed
Sam LeeLead Investor
Signed
Riley ChoIndependent
Signed
Avery VuIndependent
Pending
Materials5 documents

Goal

When a board secretary or company counsel opens an entity's board meeting page, they need to see (1) what's on the agenda, (2) who's attending, (3) what consents are pending signature, and (4) what materials are attached — all in one screen, with clear paths to act on each. The board recipe consolidates these into a two-column layout that follows the user's reading order: agenda first, materials and consents alongside.

Layout breakdown

Two-column body inside the authenticated dashboard shell. Region map:

┌─ AppBreadcrumb (sticky) ─────────────────────────────────────────┐
│  Entities › Waypoint Holdings › Board › Q3 2026 Meeting           │
├─ Section: Hero ───────────────────────────────────────────────────┤
│  Eyebrow: BOARD MEETING                                            │
│  DisplayHeading: Q3 2026 board meeting                             │
│  StatusPill: 4 of 7 attendees confirmed                            │
├─ Section: Body (two columns at ≥ 1024px) ─────────────────────────┤
│  ┌── Agenda column (8/12) ──┐  ┌── Side column (4/12) ──┐         │
│  │  Card: Agenda             │  │  Card: Attendance      │         │
│  │   1. Approve minutes      │  │   ● Founder · CEO      │         │
│  │   2. Approve grants       │  │   ● Founder · CTO      │         │
│  │   3. New business         │  │   ◌ Series Seed lead   │         │
│  │  Card: Action items       │  │  Card: Materials       │         │
│  │   ☑ Send pre-read         │  │   📄 Deck (47p, 2.1MB) │         │
│  │   ☐ Confirm conflicts     │  │   📄 Resolutions (4)   │         │
│  │  BoardConsentCard         │  │  Timeline.* feed       │         │
│  │   Q3 SAFE authorisation   │  │   recent board events  │         │
│  └───────────────────────────┘  └─────────────────────────┘         │
└────────────────────────────────────────────────────────────────────┘

Top section padding uses --section-y-tight (clamp(72px, 8vw, 120px)); inner gap uses --gap-card (16px).

Component manifest

RegionComponentWhy over alternatives
BreadcrumbAppBreadcrumbCarries the entity → board → meeting hierarchy with current-page semantics
Hero eyebrowEyebrowSection anchor — "BOARD MEETING"
Hero headingDisplayHeading as="h1" size="hero"Top of the page outline
Attendee statusStatusPillLive "4 of 7 confirmed" indicator with shimmer
Agenda + Action itemsCardGeneric elevated containers — no domain-card primitive needed
Attendance + MaterialsCardSame as above
Pending consentBoardConsentCardThe canonical pending-signature surface — drops in inline
Activity feedTimeline.* namespace (Timeline)Composable event-feed atoms
External-link iconLucide ArrowUpRight1.5px stroke, 16px size

Responsive behaviour

BreakpointBody columnsCard stacking
< 768pxSingle columnCards stack: Agenda → Action items → BoardConsent → Attendance → Materials → Feed
768–1023pxSingle column with wider cardsSame stacking
≥ 1024pxTwo columns (8/12 + 4/12)Agenda + Action items + BoardConsent left; Attendance + Materials + Feed right

States

StateTriggerBehaviour
LoadingInitial nav into routeCardSkeleton placeholders in each region; AppBreadcrumb hydrates first
Empty (no pending consents)No Resolution rows in partially_signedBoardConsentCard region hidden entirely (no empty card)
Active board meetingBoardMeeting.state = "in_progress"StatusPill shimmer brightens; "Join" CTA appears in hero
Past meetingBoardMeeting.state = "completed"StatusPill replaced with a static <Pill tone="neutral">Completed</Pill>; action items become read-only

Implementation

Source: apps/app/app/(authenticated)/entities/[id]/board/page.tsx. The page is a server component — board data is fetched server-side via @repo/database + @matter/api-client. Domain cards (BoardConsentCard) hydrate the per-row signer state from the meeting's agenda_items[] and pending_resolutions[] arrays.

The Timeline feed reads from auditLog.query({ entity_id, scope: "board" }) and streams updates via Server-Sent Events for in-progress meetings.

Source

apps/app/app/(authenticated)/entities/[id]/board/page.tsx
Do — reach for the documented atoms — Section, Card, StatusPill, BoardConsentCard, Timeline atoms.
Don't — fork the recipe for a one-off. Propose an extension instead.

On this page