Inspiration

Getting diagnosed with cancer is very scary, and there are a lot of unknowns, and things are moving very fast at first. Having an agentic companion that's able to help navigate you through this process makes everything so much easier during a very difficult time.

What it does

This product allows someone that was recently diagnosed to upload their pathology report (aka something that the doctors give you that describes what type of cancer you have) that is often filled with a lot of medical jargon. It takes that information and it's able to find clinical trials near you, break it down to you, and explain it to you more easily, and help you manage your symptoms and track them.

We also use Click House to aggregate all our user data and find trends across medication and how it impacts symptoms.

How we built it Two-engineer build with a hard line: a Next.js 16 + Tailwind v4 frontend that holds zero secrets, talking to a Python FastAPI backend that owns every sponsor call. Anthropic Claude Sonnet 4, ClickHouse Cloud, Nimble (CT.gov), and Datadog APM + LLM Observability each live behind one wrapper. Patient identity is a UUID cookie forwarded as X-Patient-Id. We wrote CLAUDE.md and API.md first, pinned Pydantic and TypeScript shapes in the same commits, and gated all feature work behind sponsor health checks visually confirmed in each dashboard.

Challenges we ran into

Our practice run had lost hours to sponsor SDKs returning 200s while data went nowhere — most painfully a DD_SITE region mismatch that swallowed every Datadog trace. We fixed it with mandatory dashboard-verified health checks before any feature code. Next.js 16's App Router had moved out from under our training data, so we read the bundled docs instead of trusting muscle memory. FastAPI hit concurrency crashes once we shared a ClickHouse client across requests, and keeping API.md, Pydantic, and TypeScript shapes in lockstep across two engineers took real discipline.

Accomplishments that we're proud of

Cost-by-feature in Datadog LLM Observability actually works — every Claude call carries a feature_tag, and the dashboard sums spend per feature live during the demo. The frontend genuinely cannot reach Anthropic, ClickHouse, or Nimble; the architectural line held to ship. The "Questions for the doctors" page merges pathology questions, symptom-trend alerts, and patient self-typed notes into one deduped, themed prep sheet — the moment the product feels like a companion. A /analytics route surfaces real population-level medication-impact deltas from ClickHouse on a seeded 1,000-patient cohort.

What we learned

Visual verification beats unit tests for sponsor integrations — a green 200 told us nothing; a row in the ClickHouse console and a span in LLMObs told us everything. Tag your LLM calls from day one: the feature_tag argument felt like overkill in hour one and was our most valuable instrumentation by hour six. EAV schemas pay off the minute a real user types a symptom you didn't predict. And constrained UIs — no free-form chat, structured inputs only — are demo-resilient when latency spikes on stage.

What's next for TC-Pilot

Real auth to replace the UUID cookie, plus a caregiver read-only invite so a partner sees the same prep sheet and trends. One-click provider export — PDF of the prep sheet and 14-day chart — to make the appointment binder one tap. Opt-in alerts when a symptom climbs ≥2 points week-over-week, with a draft message to the care team. Extending beyond testicular cancer is mostly a prompt and CT.gov-query swap. Finally, eval gates in LLMObs on every deploy, and a privacy-preserving clinician view of the population analytics already hinted at by /analytics.

Built With

Share this project:

Updates