Inspiration

Life admin—scheduling, reminders, organizing—often feels overwhelming. I struggle to keep track of appointments, forget to post parcels and juggle work and personal calendars. I wanted an assistant that feels like a helpful teammate: you talk naturally, and it handles the details. Amazon Nova’s reasoning and tool use made it possible to build that kind of agent.

What I Learned

  • Bedrock Converse API — How to use tool use (function calling) with Nova 2 Lite, including multi-turn tool loops and structured tool results
  • iCloud CalDAV — How to integrate with Apple Calendar via CalDAV (tsdav) so reminders sync to iPhone with notifications
  • Multi-agent design — How to frame a single model as coordinating multiple “agents” (Scheduler vs Organizer) through prompts and tool routing
  • Proactive AI — How to make an agent proactive (e.g., fetching today’s schedule when the user says “what’s up?”) instead of only reacting to commands

How I Built It

Navi is a Next.js 14 app that talks to Amazon Nova 2 Lite through the Bedrock Converse API. The flow is:

  1. Chat UI — User sends a message; the API forwards it to Bedrock with a system prompt and tool config
  2. Tool use loop — Nova decides when to call tools (create_reminder, get_today_schedule, list_upcoming_events, list_reminders). The server runs the tools (e.g., CalDAV for Apple Calendar) and sends results back to Nova
  3. Apple Calendar — Reminders are created as iCloud events with VALARM for iPhone notifications. Calendar reads use fetchCalendarObjects with a time range to show today’s or upcoming events
  4. Accessibility — ARIA labels, roles, and keyboard support so the chat works well with screen readers

The system prompt describes Navi as coordinating a Scheduler Agent and Organizer Agent, so Nova routes requests to the right tools.

Challenges

  • Converse API format — The Converse message format differs from simple chat; handling tool-use blocks and tool-result messages required careful mapping
  • iCal parsing — Reading events from CalDAV meant parsing iCal (VEVENT, DTSTART, DTEND) and handling different date formats
  • Proactive behavior — Getting Nova to call get_today_schedule on greetings like “what’s up?” needed clear tool descriptions and prompt instructions

Built With

Share this project:

Updates