Opportunity Surface Pattern

AI-driven dashboard that shows contextually relevant opportunities instead of static widgets. Same user, different context = different dashboard.

The Problem with Traditional Dashboards

Traditional dashboards show the same widgets to everyone, all the time:

❌ Traditional Dashboard (Static)

Weather Widget
Always visible, even when irrelevant
Calendar Widget
Shows full month, not today's urgency
Finance Widget
Generic totals, no actionable insights
💡 Same layout at 7 AM (rushing to work) and 8 PM (planning tomorrow)

Opportunity Surface: Context-Adaptive Dashboard

The Opportunity Surface shows only what's relevant right now. The LLM evaluates:

🕐 Time Context

  • • Morning (7 AM): Today's schedule + commute traffic
  • • Afternoon (2 PM): Pending tasks + emails
  • • Evening (8 PM): Tomorrow's prep

📊 User Situation

  • • Budget overspent: Financial guidance cards
  • • Traveling tomorrow: Flight check-in, weather, packing
  • • Normal day: Calendar + relevant tasks

Interactive Context Demo

Change the time and user situation to see how the Opportunity Surface adapts dynamically.

🕐 Time of Day

👤 User Situation

Current Context:🌅 7:00 AM📅 Normal

Your Day at a Glance

Heavy Traffic on Your Route

Real-World Example: Same User, 3 Different Times

🌅

Morning (7:00 AM) - Rushing to Work

Context: User is about to leave for work
Today's Schedule - First meeting in 2 hours
Traffic Alert - Route has 15 min delay
❌ Tomorrow's calendar (not urgent)
❌ Weekly spending report (not time-sensitive)
☀️

Afternoon (2:00 PM) - Work Mode

Context: User is at work, focused on tasks
3 Emails Need Response - Pending actions
Meeting Prep - Tomorrow's client call
❌ Traffic alerts (already at work)
❌ Morning schedule (past)
🌆

Evening (8:00 PM) - Planning Mode

Context: User is home, planning tomorrow
Tomorrow Preview - 2 meetings, 1 deadline
Flight Check-in - If traveling tomorrow
❌ Today's schedule (past)
❌ Current traffic (not relevant)

How It Works

1

Domains Emit Triggers

Finance domain detects: BUDGET_EXCEEDED
Calendar domain detects: MEETING_IN_30MIN
Travel domain detects: FLIGHT_CHECKIN_OPEN

2

LLM Scores Relevance

Context: 7:00 AM, user at home, normal day
MEETING_IN_30MIN → Score: 95 (high urgency + time-sensitive)
BUDGET_EXCEEDED → Score: 40 (important but not urgent now)
WEEKLY_REPORT → Score: 10 (not time-sensitive)

3

Top Opportunities Rendered

Only opportunities with score > 70 are shown as OpportunityCards on the dashboard. User controls dismissal (no auto-hide).

Usage Guidelines

When to use

  • As the main dashboard/home screen in AI-driven applications
  • When user context significantly affects what's relevant (time, location, situation)
  • When you want to surface proactive insights, not just reactive responses
  • When different users (or same user at different times) need different content

Best practices

  • Let LLM decide relevance based on context - don't hardcode "if morning, show X"
  • User controls dismissal (X button, swipe) - NEVER auto-hide based on timers
  • Show 2-5 opportunities max - prioritize quality over quantity
  • Re-evaluate opportunities when context changes (time passes, location changes)
  • Include actionable CTAs in OpportunityCards (not just passive info)

Accessibility

  • Announce new opportunities with aria-live="polite"
  • Dismissal buttons must have clear aria-labels ("Dismiss budget alert")
  • Ensure keyboard navigation between opportunities and actions
  • High-priority opportunities should have higher contrast/visual weight

Do's and Don'ts

Do

  • Let LLM evaluate relevance based on full context
  • Give user full control over dismissal (X button, swipe)
  • Re-evaluate opportunities as context changes
  • Include clear CTAs in opportunity cards
  • Show empty state when no relevant opportunities exist
  • Prioritize time-sensitive opportunities in the morning

Don't

  • Hardcode "if morning, show calendar widget" logic
  • Auto-hide opportunities after timeout (user controls dismissal)
  • Show static widgets that never change
  • Overwhelm with 10+ opportunities at once
  • Ignore context changes (time, location, user state)
  • Mix Opportunity Surface with traditional fixed navigation

Related Components & Patterns

Resources