# Project export: Sunday

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2026
- Tagline: Sunday is the friend in the group chat who actually makes things happen — plans the dinner, orders the groceries, books the restaurant, and remembers to send out the Partiful.
- Devpost: https://devpost.com/software/sunday-94odas
- GitHub: https://github.com/priyanshbhatter24/sunday
- Result: winner ([Anthropic] Best Use of Claude Agent SDK ($2,500 in Claude Developer Platform credits))
- Team: 4 GitHub contributor(s) — Thor Christoffersen Hochman (39 commits), Priyansh Bhatter (33 commits), Cursor Agent (3 commits), Claude Opus 4.6 (1 commits)

## Devpost submission (written by the team)

### Inspiration

People are lonelier than ever — the Surgeon General called it an epidemic. It's not that people don't want to hang out. It's that planning is exhausting. Juggling DoorDash, OpenTable, Venmo, and a group chat that can't agree on anything. Most plans die right there — not from lack of desire, but from logistics. Every friend group has one person who does the work: makes the reservation, remembers the allergies, sends the address. That person burns out. Exec (YC W12) tried solving this with human assistants — didn't scale. Instacart (YC S12) solved grocery delivery but created another app silo. Neither made it easier for people to actually come together. We asked: what if you rebuilt the concierge from scratch in 2026, with AI at the core? Not as another app to download, but as a friend who lives in your existing group chats, one who remembers everyone's allergies, knows the best spots, and has already book the venues? That's Sunday. An AI concierge and social connector that lives natively in iMessage. You text it like a friend, and it actually makes things happen.

### What it does

Out agent resides inside your existing group chats, understands everyone like a best friend. From Thor's favorite cuisine to Grace's go to hangout spot. It remembers the small and big details and stores it in a graph database, connecting the dots together. It plans. Tell Sunday "dinner Saturday for 8, half vegetarian, $150 budget" and it researches real restaurants with real prices, remembers that Sarah is gluten-free from three weeks ago, proposes a specific plan (not a list of 10 options), and adapts on the fly when constraints change. It orders. Sunday opens a real cloud browser, navigates DoorDash, searches for items, adds them to your cart, and walks you through checkout — all from a text message. You get a screenshot of your cart to review before confirming. It creates events. Say "make a Partiful for Friday night at Rock & Reilly's" and Sunday generates a custom invite poster, creates the event on Partiful with the RSVP link, and shares it in the chat. One text, done. It calls restaurants. Need a reservation? Sunday's AI voice agent calls the restaurant, handles the back-and-forth ("7pm is full, we have 7:30"), and texts you the confirmation. It remembers everyone. Sunday builds a persistent social graph across conversations. It knows Thor's birthday is March 15, that Jake is into vinyl and City Pop, and that Emma and Jake are both single and both into hiking. When you're planning an event, it proactively suggests who else might want to come. It connects people. This is the part we're most proud of. Sunday isn't just a logistics bot, it's a social connector. It notices when two friends share interests, nudges when a group hasn't hung out in a while, and plays matchmaker when the moment is right. Every plan is a chance to bring people together.

### How we built it

Sunday is a TypeScript pnpm monorepo with two services communicating over a local HTTP API: The Bridge handles the iMessage pipeline. It connects to iMessage via the Photon SDK, debounces rapid-fire texts into single requests, classifies messages as new tasks or follow-ups, and delivers responses back as native blue-bubble iMessages. The Agent runs an HTTP server powered by the Claude Agent SDK with 17 custom MCP tools: Perplexity Sonar real-time web search for restaurants, products, prices. All recommendations are grounded in real data with source URLs. Browserbase + Stagehand is an AI-controlled cloud browsers that navigate real websites. Stagehand's hybrid mode uses both DOM analysis and screenshot-based coordination to interact with Partiful and DoorDash. Handles login flows, OTP verification, and multi-step checkout. Partiful creates real event pages with RSVP links via browser automation. Two-phase OTP flow that fills the form, requests verification, waits for the user to text back the code, then resumes the browser session to finish. Vapi is an AI voice agent that places real outbound calls to restaurants for reservations. Supermemory persistent cross-conversation memory. Stores facts about people as natural language, retrieves them contextually. Every conversation enriches the social graph. AI Gateway generates custom event invite posters and photo collage recap cards. Social graph tools searches across known people to find who'd enjoy an event or what two people have in common. Lists manage shopping lists, guest lists, planning checklists that persist across conversations. The personality is carefully crafted. Sunday texts like a real friend — lowercase, emoji when it fits, opinions, gentle roasting. It matches the energy of the conversation and never sounds like a bot. The system prompt has a banned-words list (no "Furthermore," no "I'd be happy to help!") and explicit examples of how to talk. Tech stack: Claude Agent SDK, Vercel AI SDK for streaming Photon Advanced iMessage Kit, Stagehand/Browserbase for browser automation, Perplexity Sonar for search, Supermemory for persistent memory, Vapi for voice calls, Next.js dashboard deployed on Vercel.

### Challenges we ran into

Browser automation is hard. Getting Stagehand to reliably fill out forms on Partiful and DoorDash took serious iteration. The AI agent would click the wrong elements, date pickers were tricky, and we hit Browserbase rate limits from rapid testing. We switched between DOM mode and hybrid mode multiple times, debugged $PARAMETER_NAME schema validation errors in Stagehand's AI SDK layer, and eventually got it working reliably by setting experimental: true to force local agent execution with hybrid tools. OTP flows across sessions. Partiful and DoorDash both require phone verification. We needed the browser to fill a form, trigger an OTP, pause, wait for the user to text us the code via iMessage, then resume the exact same browser session to enter it. We built persistent Browserbase contexts and session keepalive to make cookies survive across separate browser sessions. Zombie processes. During development, background agent processes would pile up without being killed properly. At one point we had 5 duplicate agent instances all processing the same iMessage, causing the user to get 2-3 copies of every response. We added EPIPE error handling and global uncaughtException handlers to prevent crashes from dead SSE client connections. Bridge timeouts. Browser automation takes 2-5 minutes. The bridge's HTTP timeout was set to 2 minutes, so it would abort the request and send a fallback "agent unavailable" message — even though the agent successfully created the event. We bumped the timeout to 6 minutes for tool-heavy flows. The personality balance. Getting an AI to text like a real friend — not too formal, not too chaotic — took dozens of prompt iterations. The banned-words list alone went through 5 revisions. Getting it to use "yo" occasionally but not every message. Getting it to have opinions without being annoying. Getting it to react to good news with genuine excitement, not corporate enthusiasm.

### Accomplishments we're proud of

It actually works end-to-end in iMessage. We kept the user experience first by not needing users to install another app. It resides in an app they interact with daily. Just text Sunday to create your Sunday plans! Parallel voice calls. The conversational agent takes numbers and context from perplexity and calls up to 10 venues parallelly, asking for availability, price and finally reserving the booking. This flow saves 1-2 hours per event. Partiful. "Make a Partiful for Friday night" → Sunday generates a custom poster, creates the event on Partiful via browser automation, and shares the RSVP link, all from one text. The event is real and people can RSVP! The social connector instinct. Sunday doesn't just handle logistics. It notices that Jake and Emma are both into hiking and Japanese food, and suggests adding Emma to the dinner party. It remembers that a friend group hasn't hung out in a while and nudges. The voice. Sunday texts like a friend. "what's good" not "Hello! How can I help you today?" People who test it genuinely enjoy the conversation, not just the utility.

### What we learned

Important of UX in integrating AI agents. The need to not download an app, not create an account and get started by just adding a number to your group chat is frictionless. Great for distribution. Browser automation is the new API. Most services don't have public APIs for consumers. DoorDash, Partiful and most restaurants don't let you programmatically place orders or create events. But with Stagehand and Browserbase, any website becomes an API. This is a paradigm shift. Memory changes everything. The difference between a chatbot and a concierge that one notices and remembers. When Sunday remembers that Sarah is gluten-free from a conversation three weeks ago and automatically factors that into tonight's dinner plan, that's the moment it stops feeling like a tool and starts feeling like a friend. Personality > capability. We could have shipped more features. Instead, we spent hours on the system prompt, the banned-words list, the emotional range. That investment paid off. People remember how Sunday talks, not just what it does. AI agents should bring people together, not replace human interaction. The last decade of consumer tech optimized for convenience at the cost of connection. Sunday uses AI but points towards more human interaction.

### What's next

Visa virtual card payments. We're exploring Visa's B2B Virtual Account Payment Method API to generate single-use virtual Visa cards for each order. Sunday would create a $50-limit virtual card, enter it at DoorDash checkout via Stagehand, and the card auto-expires after the transaction. Real payments, real spending controls, no saved card data. Group chat intelligence. Sunday already works in group chats, but we want it to understand group dynamics better — who usually organizes, who needs more lead time, which subgroups hang out most. The social graph gets richer with every conversation. Multi-platform messaging. iMessage is home, but Sunday's architecture (bridge → agent) is platform-agnostic. WhatsApp, Telegram, and Discord bridges are natural extensions. Proactive outreach. Sunday shouldn't just respond, it should initiate. "Hey, it's been 3 weeks since the crew got together. Want me to put something together for this weekend?" The memory and social graph make this possible. More commerce integrations. Every website is an API through browser automation. Uber, OpenTable, Amazon, flower delivery, concert tickets — Sunday should be able to handle any "get me X" request through a real browser.

## README (from the GitHub repository)

# Sunday

Photon-first scaffold for Sunday's iMessage bridge, following the Manus-style message pipeline:

`watcher -> debouncer -> classifier -> agent -> sender`

## Repo layout

```text
sunday/
├── services/
│   └── bridge/        # Photon intake + routing pipeline
├── packages/
│   └── shared/        # Shared types and env config
├── sunday-prd.md
```

## Quick start

1. Copy `.env.example` to `.env` and set at least:
   - `IMESSAGE_MODE` (`base` for free local testing, `advanced` for Photon server mode)
   - `IMESSAGE_INCLUDE_OWN_MESSAGES` (`true` to include your own messages while testing)
   - `IMESSAGE_TEST_RECIPIENT` (optional forced reply target for solo tests)
   - `IMESSAGE_SERVER_URL`
   - `AGENT_URL`
   - `PHOTON_API_KEY` only if `IMESSAGE_MODE=advanced`
2. Install dependencies:
   - `pnpm install`
3. Start the bridge:
   - `pnpm dev:bridge`

Note:
- `services/bridge` loads `.env` automatically via `dotenv`.

Optional reliability envs:
- `AGENT_TIMEOUT_MS` (default `45000`)
- `AGENT_MAX_RETRIES` (default `2`)
- `AGENT_RETRY_BASE_MS` (default `600`)
- `DEDUPE_WINDOW_MS` (default `300000`)
- `PROGRESS_UPDATE_INTERVAL_MS` (default `10000`)
- `WATCHER_POLL_INTERVAL_MS` (default `2000`, used by `IMESSAGE_MODE=base`)
- `IMESSAGE_INCLUDE_OWN_MESSAGES` (default `false`, useful for solo testing)
- `IMESSAGE_TEST_RECIPIENT` (optional, forces replies to one handle)

## What is implemented now

- Photon connection and `new-message` watcher
- Runtime switchable iMessage backend:
  - `IMESSAGE_MODE=base` -> `@photon-ai/imessage-kit` (free local mode)
  - `IMESSAGE_MODE=advanced` -> `@photon-ai/advanced-imessage-kit`
- 2-second per-chat debouncing for rapid-fire messages
- Inline `NEW_TASK` vs `FOLLOW_UP` classification heuristic
- Duplicate message dedupe by `messageGuid`
- Per-chat request serialization to avoid race conditions
- Agent timeout + retry/backoff for transient failures
- Throttled progress updates for slow requests
- Typing indicator helper with fallback behavior
- Response sender for text + attachments
- Memory abstraction (in-memory for now) to be replaced by Supermemory
- HTTP handoff to agent endpoint: `POST {AGENT_URL}/chat`

## Next steps

1. Build `services/agent` with `POST /chat`.
2. Replace in-memory memory store with Supermemory.
3. Add progress/status updates for long-running tools.
4. Add durable conversation state and retry/backoff strategy.


## Detected evidence (automated analysis)

Indexed codebase: 97 recognized source files, 812 KB.
- Anthropic (technology) — detected in the code
- CSS (language) — detected in the code
- Next.js (technology) — detected in the code
- React (technology) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Vercel AI SDK (technology) — detected in the code
- Node.js (technology) — claimed on Devpost, not found in the code
- Vercel (technology) — claimed on Devpost, not found in the code
- AI coding agent: Claude Code — evidence: config files committed to the repository; commit authorship or trailers

## Codebase structure (from repository index)

### Files (112 of 112)

```
.env.example
.gitignore
CLAUDE.md
DEMO-SCRIPT.md
DEVPOST.md
package.json
packages/shared/package.json
packages/shared/src/config.ts
packages/shared/src/index.ts
packages/shared/src/types.ts
packages/shared/tsconfig.json
pnpm-workspace.yaml
README.md
scripts/prefill-demo-memories.ts
services/agent/package.json
services/agent/src/agent.ts
services/agent/src/attachments.ts
services/agent/src/events.ts
services/agent/src/index.ts
services/agent/src/memory.ts
services/agent/src/prompts/system.ts
services/agent/src/stagehand-client.ts
services/agent/src/tools/add-calendar-event.ts
services/agent/src/tools/browse-website.ts
services/agent/src/tools/create-event-partiful.ts
services/agent/src/tools/create-event.ts
services/agent/src/tools/find-connections.ts
services/agent/src/tools/forget-memory.ts
services/agent/src/tools/generate-collage.ts
services/agent/src/tools/generate-poster.ts
services/agent/src/tools/index.ts
services/agent/src/tools/make-call.ts
services/agent/src/tools/manage-list.ts
services/agent/src/tools/process-payment.ts
services/agent/src/tools/resolve-link.ts
services/agent/src/tools/save-memory.ts
services/agent/src/tools/save-plan.ts
services/agent/src/tools/search-memory.ts
services/agent/src/tools/search-products.ts
services/agent/src/tools/suggest-invites.ts
services/agent/src/tools/update-memory.ts
services/agent/src/vapi-client.ts
services/agent/tsconfig.json
services/bridge/package.json
services/bridge/src/attachments.ts
services/bridge/src/classifier.test.ts
services/bridge/src/classifier.ts
services/bridge/src/debouncer.test.ts
services/bridge/src/debouncer.ts
services/bridge/src/index.ts
services/bridge/src/logger.ts
services/bridge/src/pipeline-utils.test.ts
services/bridge/src/pipeline-utils.ts
services/bridge/src/retry.test.ts
services/bridge/src/retry.ts
services/bridge/src/sdk-helpers.ts
services/bridge/src/sender.ts
services/bridge/src/typing.ts
services/bridge/src/watcher.ts
services/bridge/tsconfig.json
services/dashboard/.gitignore
services/dashboard/app/api/agent/events/route.ts
services/dashboard/app/dashboard/console/page.tsx
services/dashboard/app/dashboard/layout.tsx
services/dashboard/app/dashboard/memory/loading.tsx
services/dashboard/app/dashboard/memory/page.tsx
services/dashboard/app/dashboard/orders/page.tsx
services/dashboard/app/dashboard/page.tsx
services/dashboard/app/dashboard/plans/page.tsx
services/dashboard/app/globals.css
services/dashboard/app/layout.tsx
services/dashboard/app/page.tsx
services/dashboard/components.json
services/dashboard/components/landing/cta-section.tsx
services/dashboard/components/landing/feature-section.tsx
services/dashboard/components/landing/grain-overlay.tsx
services/dashboard/components/landing/hero.tsx
services/dashboard/components/landing/imessage-mockup.tsx
services/dashboard/components/landing/landing-footer.tsx
services/dashboard/components/landing/landing-nav.tsx
services/dashboard/components/landing/landing-page.tsx
services/dashboard/components/landing/moment-section.tsx
services/dashboard/components/landing/scroll-text-reveal.tsx
services/dashboard/components/landing/smooth-scroll-provider.tsx
services/dashboard/components/landing/testimonial-strip.tsx
services/dashboard/components/landing/thesis-section.tsx
services/dashboard/components/landing/visual-break.tsx
services/dashboard/components/memory-dashboard.tsx
services/dashboard/components/memory-graph.tsx
services/dashboard/components/people-dashboard.tsx
services/dashboard/components/plans-dashboard.tsx
services/dashboard/components/sidebar.tsx
services/dashboard/components/ui/badge.tsx
services/dashboard/components/ui/card.tsx
services/dashboard/components/ui/input.tsx
services/dashboard/components/ui/separator.tsx
services/dashboard/components/ui/table.tsx
services/dashboard/components/ui/tabs.tsx
services/dashboard/eslint.config.mjs
services/dashboard/lib/avatar.ts
services/dashboard/lib/mock-data.ts
services/dashboard/lib/supermemory.ts
services/dashboard/lib/utils.ts
services/dashboard/next.config.ts
services/dashboard/package.json
services/dashboard/pnpm-workspace.yaml
services/dashboard/postcss.config.mjs
services/dashboard/README.md
services/dashboard/tsconfig.json
STAGEHAND_IMPLEMENTATION_PLAN.md
sunday-prd.md
tsconfig.base.json
```

### Dependencies

- packages/shared/package.json: @types/node@^22.13.1, typescript@^5.7.3, zod@^3.24.1
- services/agent/package.json: @anthropic-ai/claude-agent-sdk@^0.2.42, @anthropic-ai/sdk@^0.74.0, @browserbasehq/stagehand@^3.0.8, @sunday/shared@workspace:*, @types/node@^22.13.1, ai@^6.0.86, dotenv@^16.4.7, groq-sdk@^0.37.0, supermemory@latest, tsx@^4.19.2, typescript@^5.7.3, zod@^3.24.1
- services/bridge/package.json: @photon-ai/advanced-imessage-kit@^1.11.1, @photon-ai/imessage-kit@^2.1.2, @sunday/shared@workspace:*, @types/node@^22.13.1, dotenv@^16.4.7, tsx@^4.19.2, typescript@^5.7.3, vitest@^2.1.8
- services/dashboard/package.json: @tailwindcss/postcss@^4, @types/node@^20, @types/react@^19, @types/react-dom@^19, ai@^6.0.86, class-variance-authority@^0.7.1, clsx@^2.1.1, eslint@^9, eslint-config-next@16.1.6, framer-motion@^12.34.0, lenis@^1.3.17, lucide-react@^0.564.0, next@16.1.6, radix-ui@^1.4.3, react@19.2.3, react-dom@19.2.3, shadcn@^3.8.4, tailwind-merge@^3.4.0, tailwindcss@^4, tw-animate-css@^1.4.0, typescript@^5

### Recent commits (newest first)

- improve personaliztion  + script devpost
- Merge branch 'main' of https://github.com/priyanshbhatter24/sunday
- improve personality + invites
- Enhance event creation process by adding sender name handling for Partiful events and improving OTP verification instructions. Ensure accurate reporting of OTP requirements during user interactions.
- Add file upload functionality via Stagehand for event cover images and update event creation process to support poster uploads. Enhance instructions for generating posters and creating events on Partiful.
- improve instruction for doordash otp code
- resume works now.
- Merge pull request #6 from priyanshbhatter24/vapi-tool
- vapi client updated
- added debouncer to ensure call summaries reach user
- main tool for calling
- updated system prompt for calling up using vapi
- updated agent to use sonnet instead of haiku
- added packages for vapi
- haiku
- browser base partiful almost works
- Merge pull request #5 from priyanshbhatter24/cursor/stagehand-implementation-plan-05c1
- browser updated and bridge integration updated
- stagehand got context
- main agent and its system prompt updated

## Key source files (fetched from GitHub, selected and truncated for size)

### CLAUDE.md

```markdown
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Project Overview

Sunday is an AI concierge that lives in iMessage. It watches for incoming messages via the Photon SDK, processes them through an AI agent with specialized tools (browser automation, memory, search), and sends responses back. Built as a pnpm monorepo with TypeScript.

## Commands

```bash
pnpm install                # Install all dependencies
pnpm dev:bridge             # Start bridge service (tsx watch)
pnpm dev:agent              # Start agent service (tsx watch, port 3000)
pnpm dev:dashboard          # Start Next.js dashboard
pnpm build                  # Build all services (tsc)
pnpm typecheck              # Type-check all services
pnpm test:bridge            # Run bridge tests (vitest)
```

Run bridge and agent in separate terminals for local development. Copy `.env.example` to `.env` and fill in API keys before starting.

## Architecture

### Services

- **`services/bridge`** — iMessage intake pipeline. Connects to Photon SDK, debounces messages per-chat (2s window), classifies intent (NEW_TASK vs FOLLOW_UP), sends requests to agent service, delivers responses back to iMessage. Key flow: `watcher → debouncer → classifier → agent request → sender`
- **`services/agent`** — HTTP server (POST /chat) powered by Claude Agent SDK. Runs an agentic loop with MCP tools: `browse_and_checkout` (Stagehand/Browserbase), `search_products` (Perplexity), `save_memory`/`search_memory` (Supermemory), `make_call`, `process_payment`, `generate_poster`. System prompt lives in `prompts/system.ts`.
- **`services/dashboard`** — Next.js 16 + React 19 monitoring UI. Uses Tailwind CSS 4, Radix UI, shadcn components.

### Shared Package

- **`packages/shared`** — Core types (`AgentChatRequest`, `AgentChatResponse`, `ConversationTurn`, `TaskType`) and Zod-validated config loader (`BridgeConfig`).

### Key Patterns

- **Per-chat serialization**: `enqueueByChat()` in `pipeline-utils.ts` prevents race conditions by queuing requests per chatGuid.
- **SDK abstraction**: `sdk-helpers.ts` supports both Photon "advanced" (server) and "base" (local) iMessage modes at runtime.
- **Stagehand sessions**: `stagehand-client.ts` creates fresh cloud browser sessions per tool invocation, captures screenshots to `/tmp/sunday-screenshots`, and queues them as attachments.
- **MCP tool server**: Tools are registered via `createSdkMcpServer()` from Claude Agent SDK in `tools/index.ts`.

## TypeScript Configuration

Strict mode enabled with `noUncheckedIndexedAccess` and `exactOptionalPropertyTypes`. Target ES2022, module NodeNext. Base config in `tsconfig.base.json`, each service extends it.

## Testing

Only the bridge service has tests (vitest). Test files: `debouncer.test.ts`, `classifier.test.ts`, `retry.test.ts`, `progress.test.ts`, `pipeline-utils.test.ts`. Run a single test with:

```bash
pnpm --filter @sunday/bridge exec vitest run src/<test-file>.t
[truncated — 11 more characters]
```

### DEMO-SCRIPT.md

```markdown
# Sunday Demo Script — TreeHacks 2026

## Setup Checklist (before demo)

- [ ] Run `npx tsx scripts/prefill-demo-memories.ts` to pre-fill all persona memories
- [ ] Start agent service: `pnpm dev:agent`
- [ ] Start bridge service: `pnpm dev:bridge`
- [ ] Kill any stale agent/bridge processes (check with `ps aux | grep tsx`)
- [ ] Verify `.env` has `AGENT_TIMEOUT_MS=360000`
- [ ] Open the iMessage group chat on screen (iPhone mirrored or Mac iMessage)
- [ ] Have dashboard open in a browser tab (for showing the agent thinking in real-time)
- [ ] Test Sunday with a quick "hey sunday" to make sure it's responsive

## Group Chat Setup

**Group chat name:** "the crew" or "saturday plans" — something casual

**People in the chat (6 total):**

| Name | Key traits Sunday knows | Demo role |
|------|------------------------|-----------|
| **Thor** | Lactose intolerant, loves Japanese food & natural wine, SF, designer | You — sends the messages |
| **Priyansh** | Vegetarian, USC, LA, basketball, hip hop | Co-founder — can respond live |
| **Sarah** | Gluten-free, hiking, natural wine, single, golden retriever Mochi | Adds dietary complexity |
| **Jake** | Vinyl/City Pop, single, hiking, ramen, bouldering | Social connector target (with Sarah/Emma) |
| **Emma** | Vegan, yoga, photography, hiking, film camera | Social connector target |
| **Marcus** | Craft cocktails, jazz, "the usual organizer", no restrictions | Shows Sunday knows group dynamics |

## Demo Flow (3 minutes)

### Beat 1 — The Natural Entry (20 sec)

**Thor sends:** `yo sunday, we should do a dinner this saturday. the whole crew hasn't hung out in a minute`

**Expected Sunday response (split into bubbles):**
> fr it's been a while
> ---
> let me see what's good for the crew. I know Sarah's gluten-free and Emma's vegan so that narrows it a bit... lemme find somewhere that works for everyone
> ---
> (immediately calls search_products and search_memory)

**What this shows:** Memory recall, dietary awareness, personality, message splitting, bias to action (no questions asked — just goes and searches)

### Beat 2 — The Recommendation (30 sec)

**Sunday comes back with a specific recommendation** (after search):
> okay so I'm thinking Nari on Divisadero — it's Thai-influenced, they have a ton of gluten-free and vegan options, and Thor you've literally been wanting to try it
> ---
> saturday at 7:30 for 6, looks like they take reservations
> ---
> want me to call and grab it?

**What this shows:** Specific recommendation (not a list of 10), references Thor's saved memory about wanting to try Nari, considers everyone's dietary needs, offers to act

### Beat 3 — Social Connector (20 sec)

**Thor sends:** `yeah do it`

**Sunday responds:**
> on it, calling them now
> ---
> oh wait — have Jake and Sarah met? they're both super into hiking and Japanese stuff. could be a vibe 👀

**What this shows:** The social connector instinct — Sunday notices shared interests between people and plays matchmaker. This i
[truncated — 3440 more characters]
```

### package.json

```
{
  "name": "sunday",
  "version": "0.1.0",
  "private": true,
  "description": "Sunday: AI concierge that lives in iMessage.",
  "packageManager": "pnpm@10.4.1",
  "scripts": {
    "dev:bridge": "pnpm --filter @sunday/bridge dev",
    "build": "pnpm -r build",
    "typecheck": "pnpm -r typecheck",
    "test:bridge": "pnpm --filter @sunday/bridge test",
    "dev:dashboard": "pnpm --filter @sunday/dashboard dev",
    "dev:agent": "pnpm --filter @sunday/agent dev"
  },
  "pnpm": {
    "onlyBuiltDependencies": [
      "better-sqlite3"
    ]
  }
}

```

### packages/shared/package.json

```
{
  "name": "@sunday/shared",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "exports": {
    ".": {
      "types": "./dist/index.d.ts",
      "import": "./dist/index.js"
    }
  },
  "scripts": {
    "build": "tsc -p tsconfig.json",
    "typecheck": "tsc -p tsconfig.json --noEmit"
  },
  "dependencies": {
    "zod": "^3.24.1"
  },
  "devDependencies": {
    "@types/node": "^22.13.1",
    "typescript": "^5.7.3"
  }
}

```

### services/bridge/package.json

```
{
  "name": "@sunday/bridge",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc -p tsconfig.json",
    "typecheck": "tsc -p tsconfig.json --noEmit",
    "test": "vitest run"
  },
  "dependencies": {
    "@photon-ai/advanced-imessage-kit": "^1.11.1",
    "@photon-ai/imessage-kit": "^2.1.2",
    "@sunday/shared": "workspace:*",
    "dotenv": "^16.4.7"
  },
  "devDependencies": {
    "@types/node": "^22.13.1",
    "tsx": "^4.19.2",
    "typescript": "^5.7.3",
    "vitest": "^2.1.8"
  }
}

```

### services/agent/package.json

```
{
  "name": "@sunday/agent",
  "version": "0.1.0",
  "private": true,
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "build": "tsc -p tsconfig.json",
    "typecheck": "tsc -p tsconfig.json --noEmit"
  },
  "dependencies": {
    "@anthropic-ai/claude-agent-sdk": "^0.2.42",
    "@anthropic-ai/sdk": "^0.74.0",
    "@browserbasehq/stagehand": "^3.0.8",
    "@sunday/shared": "workspace:*",
    "ai": "^6.0.86",
    "dotenv": "^16.4.7",
    "groq-sdk": "^0.37.0",
    "supermemory": "latest",
    "zod": "^3.24.1"
  },
  "devDependencies": {
    "@types/node": "^22.13.1",
    "tsx": "^4.19.2",
    "typescript": "^5.7.3"
  }
}

```

### services/dashboard/package.json

```
{
  "name": "@sunday/dashboard",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "eslint"
  },
  "dependencies": {
    "ai": "^6.0.86",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "framer-motion": "^12.34.0",
    "lenis": "^1.3.17",
    "lucide-react": "^0.564.0",
    "next": "16.1.6",
    "radix-ui": "^1.4.3",
    "react": "19.2.3",
    "react-dom": "19.2.3",
    "tailwind-merge": "^3.4.0"
  },
  "devDependencies": {
    "@tailwindcss/postcss": "^4",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "eslint": "^9",
    "eslint-config-next": "16.1.6",
    "shadcn": "^3.8.4",
    "tailwindcss": "^4",
    "tw-animate-css": "^1.4.0",
    "typescript": "^5"
  }
}

```

### packages/shared/src/index.ts

```typescript
export * from "./config.js";
export * from "./types.js";

```

### services/dashboard/app/page.tsx

```typescript
import { LandingPage } from "@/components/landing/landing-page";

export default function Home() {
  return <LandingPage />;
}

```

### services/dashboard/app/layout.tsx

```typescript
import type { Metadata } from "next";
import "./globals.css";

export const metadata: Metadata = {
  title: "Sunday",
  description: "The AI concierge that brings people together",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className="font-sans antialiased">{children}</body>
    </html>
  );
}

```

[88 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]