Add solution-landscape page and "Where we fit" section

New /landscape page maps the competitive field by category (with named
examples and the gap each leaves), an AlignCare callout, and the combined
job no incumbent owns. Add a compact, competitor-free "Where we fit"
section to the executive summary linking to it, and a Landscape nav item.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 17:14:34 -04:00
co-authored by Claude Opus 4.8
parent a7a5174c7f
commit 03cf4f9a86
3 changed files with 209 additions and 1 deletions
@@ -2,13 +2,17 @@ import type { CSSProperties } from "react";
import type { Metadata } from "next"; import type { Metadata } from "next";
import Image from "next/image"; import Image from "next/image";
import Link from "next/link";
import { ArrowRight } from "lucide-react";
import { MedscribeLogo } from "~/components/medscribe-logo"; import { MedscribeLogo } from "~/components/medscribe-logo";
import { PhoneMockup } from "~/components/phone-mockup"; import { PhoneMockup } from "~/components/phone-mockup";
import { PrintButton } from "~/components/print-button"; import { PrintButton } from "~/components/print-button";
import { SectionLabel } from "~/components/section-label"; import { SectionLabel } from "~/components/section-label";
import { Badge } from "~/components/ui/badge";
import { import {
Card, Card,
CardContent,
CardDescription, CardDescription,
CardHeader, CardHeader,
CardTitle, CardTitle,
@@ -190,6 +194,49 @@ export default function ExecutiveSummaryPage() {
</div> </div>
</section> </section>
{/* Where we fit */}
<section className="space-y-5">
<SectionLabel>Where we fit</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
The field is full of slices.
</h2>
<p className="max-w-3xl leading-relaxed text-muted-foreground">
Visit recorders, medication apps, record vaults, emergency IDs, and
caregiver tools each solve one part of the problem. None keeps a
private, patient-owned record current day to day and ready to hand
over in a crisis.
</p>
<div className="flex flex-wrap gap-2">
{[
"Visit recorders",
"Medication apps",
"Record vaults",
"Emergency IDs",
"Caregiver tools",
].map((slice) => (
<Badge key={slice} variant="outline">
{slice}
</Badge>
))}
</div>
<Card className="border-primary-button/20 bg-primary-button text-white">
<CardContent className="pt-5">
<p className="leading-relaxed">
Medscribe connects the daily loop to the emergency handoff: one
private record that stays current through normal use and is ready
when the system does not know the patient.
</p>
</CardContent>
</Card>
<Link
href="/landscape"
className="inline-flex items-center gap-1.5 text-sm font-medium text-primary underline-offset-4 hover:underline"
>
See the full landscape
<ArrowRight className="size-4" />
</Link>
</section>
{/* Under the hood */} {/* Under the hood */}
<section className="space-y-6"> <section className="space-y-6">
<SectionLabel>Under the hood</SectionLabel> <SectionLabel>Under the hood</SectionLabel>
+160
View File
@@ -0,0 +1,160 @@
import type { Metadata } from "next";
import { SectionLabel } from "~/components/section-label";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "~/components/ui/card";
export const metadata: Metadata = {
title: "Solution Landscape",
description:
"How the medical-context space is divided today, and the combined job no existing product owns.",
};
const INTRO =
"The space is crowded. Visit recorders, medication apps, health-record vaults, emergency IDs, and caregiver tools all exist and are improving. But each owns one slice. None owns the whole job: a private, patient-owned medical context that stays current through daily use and is ready to hand over in a crisis.";
const categories = [
{
category: "Patient AI visit notetakers",
examples: "Kin, AlignCare, Emilia, PatientScribe, Medcorder",
gap: "Capture and summarize the visit, but the summary is the product. It is not turned into an emergency-ready record a family can hand over.",
},
{
category: "Medication trackers",
examples: "Medisafe, MyTherapy, Dosecast",
gap: "Know the pill list and reminders, but never heard the visit. No grounded understanding of why a medication is on the list or what changed.",
},
{
category: "Personal health records",
examples: "KeepMD, Available Health, Replicoo, Guava, DrOwl",
gap: "Store and aggregate documents, but are passive. Nothing keeps them current, and a broad PHR is undifferentiated.",
},
{
category: "Emergency IDs and QR cards",
examples: "Apple Medical ID, MedicAlert, tenderID, Epic Share Everywhere",
gap: "A static snapshot with no daily maintenance loop, so the card is only as accurate as the last manual edit.",
},
{
category: "Caregiver coordination",
examples: "Innerhive, Alula, Connected Caregiver, Caring Village",
gap: "Tend toward tasks, calendars, and messaging. They coordinate people, not the integrity of the medical context itself.",
},
{
category: "Provider-side scribes",
examples: "Abridge, Nuance DAX, Suki",
gap: "Built for the clinician's chart and billing, in clinical language. Not for the patient or the family carrying context across systems.",
},
];
const bundle = [
"Patient- and caregiver-owned mobile app",
"On-device visit transcription",
"Medication OCR and intake tracking",
"Facts-first medication Q&A grounded in trusted drug data",
"Current medications and visit context fused into one local record",
"An emergency “know me” handoff",
"Caregiver sharing designed for complex-care families",
"End-to-end encrypted, peer-to-peer sharing as a core architecture",
];
export default function LandscapePage() {
return (
<div className="mx-auto max-w-6xl space-y-14 px-4 py-10 sm:px-6 lg:space-y-20 lg:py-14">
{/* Hero */}
<section className="space-y-5">
<SectionLabel>Solution landscape</SectionLabel>
<h1 className="max-w-3xl font-serif text-4xl leading-[1.05] font-semibold tracking-tight text-foreground sm:text-5xl">
The field, and the gap
</h1>
<p className="max-w-3xl text-base leading-relaxed text-muted-foreground sm:text-lg">
{INTRO}
</p>
</section>
{/* Category map */}
<section className="space-y-6">
<div className="space-y-2">
<SectionLabel>Who owns which slice</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
Six categories, each solving part of it
</h2>
</div>
<div className="grid gap-4 md:grid-cols-2">
{categories.map((item) => (
<Card key={item.category} className="card-hover">
<CardHeader className="gap-1.5">
<CardTitle className="text-lg">{item.category}</CardTitle>
<p className="text-xs font-medium tracking-wide text-primary">
{item.examples}
</p>
<CardDescription className="pt-1">{item.gap}</CardDescription>
</CardHeader>
</Card>
))}
</div>
</section>
{/* Closest competitor */}
<section className="space-y-4">
<SectionLabel>The closest direct competitor</SectionLabel>
<Card className="border-primary/15 bg-primary-light/40">
<CardContent className="space-y-3 pt-5 text-sm leading-relaxed text-foreground">
<p>
AlignCare matches the consumer bundle on paper: visit recording,
summaries, an AI assistant, medication reminders and logging,
documents, and caregiver sharing. It is real competition, not a
strawman.
</p>
<p>
The openings it leaves: its app-store disclosures indicate cloud
collection and tracking rather than on-device processing; it has no
first-class emergency handoff for a patient who cannot explain
themselves; and its medication answers are not described as
deterministic, on-device, facts-first rendering. Those are
Medscribe&apos;s wedges.
</p>
</CardContent>
</Card>
</section>
{/* The unowned bundle */}
<section className="space-y-6">
<div className="space-y-2">
<SectionLabel>What no one owns as one bundle</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
The combined job is the opening
</h2>
<p className="max-w-3xl text-muted-foreground">
Each box above has partial substitutes. No single incumbent unites
all of this into one private, patient-owned record:
</p>
</div>
<Card>
<CardContent className="pt-5">
<ul className="grid gap-x-8 gap-y-3 sm:grid-cols-2">
{bundle.map((point) => (
<li
key={point}
className="flex items-start gap-3 text-sm leading-snug text-foreground"
>
<span className="mt-1.5 size-1.5 shrink-0 rounded-full bg-primary" />
<span>{point}</span>
</li>
))}
</ul>
</CardContent>
</Card>
<p className="max-w-3xl leading-relaxed text-muted-foreground">
That intersection, the daily maintenance loop that keeps an
emergency-ready record current and private by architecture, is the lane
Medscribe is built to own.
</p>
</section>
</div>
);
}
+2 -1
View File
@@ -1,7 +1,7 @@
"use client"; "use client";
import { useState } from "react"; import { useState } from "react";
import { FileText, Home, Menu, X } from "lucide-react"; import { FileText, Home, Layers, Menu, X } from "lucide-react";
import Link from "next/link"; import Link from "next/link";
import { usePathname } from "next/navigation"; import { usePathname } from "next/navigation";
@@ -11,6 +11,7 @@ import { cn } from "~/lib/utils";
const navLinks = [ const navLinks = [
{ href: "/", label: "About", icon: Home }, { href: "/", label: "About", icon: Home },
{ href: "/executive-summary", label: "Summary", icon: FileText }, { href: "/executive-summary", label: "Summary", icon: FileText },
{ href: "/landscape", label: "Landscape", icon: Layers },
]; ];
export function SiteHeader() { export function SiteHeader() {