Inspiration

Most people don't lose access to care because they can't find a doctor. They lose it to small timing gaps nobody warns them about. A prescription runs out on one date, expires on another, and the refill window closes on a third. Those dates rarely line up, and the first time you notice is often at the pharmacy counter. For someone on a mental health medication, a gap in treatment isn't an inconvenience. It can be a setback.

We wanted care to behave like a good assistant: one that knows your timeline, sees the deadline coming, and says "you need to book by Thursday, and here are three times that work." Then you say yes and it's done. We chose a FaceTime call as the interface because calling someone is the most natural way to ask, "What do I need to do?"

What it does

Continuity is healthcare that stays ahead of you.

  • A care timeline with three separate dates: supply end, Rx expiry, and refill deadline, combined into one "book appointment by" date.
  • Provider search for therapists and psychiatrists who take your plan, have an opening before the deadline, and don't clash with your calendar.
  • A FaceTime conversation (via Chert): ask "What do I need to do?" and it explains where you stand and offers 2 to 3 slots.
  • Say yes to book. The care chain updates: appointment → renewal → pharmacy → pickup.
  • A dashboard tracking time from "needs appointment" to booked, plus optional iMessage reminders.

Transparency: Providers are real, from the NPPES NPI Registry. Insurance acceptance and open slots are sample data, and booking is simulated. We store the insurance plan name only, never member IDs.

How we built it

Stack: Next.js (App Router) + TypeScript + Tailwind on Vercel; Tiger Data (Postgres + TimescaleDB); Typesense Cloud; Chert FaceTime with a LiveKit agent; GoDaddy domain.

The urgency model. Let $t_{\text{supply}}$, $t_{\text{exp}}$, and $t_{\text{refill}}$ be the supply-end, Rx-expiry, and refill-deadline dates. The date to book by is the earliest hard constraint, minus the time a visit and renewal take:

$$ t_{\text{book}} = \min\left(t_{\text{supply}},\ t_{\text{exp}},\ t_{\text{refill}}\right) - \delta $$

where $\delta$ is a buffer covering the appointment lead time and pharmacy turnaround. With $r$ refills remaining, we apply an override:

$$ \text{urgent} = \begin{cases} \text{true} & \text{if } r = 0 \ \text{true} & \text{if } t_{\text{book}} - t_{\text{today}} \le \delta_{\text{warn}} \ \text{false} & \text{otherwise} \end{cases} $$

The $r = 0$ case is the key insight: with no refills left, you can have plenty of pills in the bottle and still be urgent, because only an appointment unlocks the renewal.

Data layer. Tiger Data stores the care chain. booking_events and message_log are hypertables, and continuous aggregates precompute the dashboard's time-to-booking metric:

$$ T_{\text{book}} = t_{\text{booked}} - t_{\text{needs appointment}} $$

so the dashboard stays fast without heavy queries over raw events.

Search. Typesense Cloud handles filters on plan, provider type, and "opening before date," along with geo sorting and typo tolerance, so "psychiatrst near me" still works. The calendar-clash check runs against the user's sample calendar after the index narrows the candidates.

Voice. Chert provides the FaceTime front end. A LiveKit agent runs on Savannah's laptop via chert dev, with an LLM/voice provider behind it. The agent's tools call the same app API the web UI uses, so voice and web share one source of truth. Optional Chert iMessage reminders sit on the same event log.

Data. Real provider records from the NPI Registry, joined with Ivy's sample insurance, slot, and calendar sheets. Stretch goals: a Solana devnet badge and .ics export.

Challenges we ran into

  • Three dates, one answer. Modeling the dates separately and deriving a single deadline with correct urgency logic, especially the zero-refills case.
  • Mixing real and simulated data. NPI data has no insurance or availability. Joining it cleanly with sample sheets, while staying honest about what's simulated, took deliberate design.
  • Search under three constraints at once. In-network, open before the deadline, no calendar clash. The calendar check doesn't fit neatly into a search index.
  • Voice on a live setup. Running the agent on a laptop meant tuning for latency, reliability, and short, clear spoken replies.
  • Privacy by design. Storing only the plan name meant building a flow that never needs anything sensitive.

What we learned

  • Timing is the product. The value isn't finding a provider; it's knowing when to act.
  • Voice works best when the agent says less: explain the situation, offer 2 to 3 options, wait for a yes.
  • Separate real from simulated early. It made the architecture cleaner and the pitch more honest.
  • Continuous aggregates are a great fit for event-driven dashboards like ours.

What's next for Continuity

  • Live insurance eligibility and real scheduling APIs in place of simulated booking
  • Pharmacy integrations so refill and pickup status are tracked, not assumed
  • Calendar sync and .ics export
  • Proactive iMessage outreach that starts the conversation before the deadline
  • A Solana devnet badge as an experiment in portable proof of continuous care
  • Broader scope: primary care, chronic conditions, and caregivers managing someone else's timeline

Built With

Share this project:

Updates

Submission history