fix: simplify public product messaging
This commit is contained in:
@@ -1,10 +1,10 @@
|
|||||||
# Medscribe Web
|
# Medscribe Web
|
||||||
|
|
||||||
Public product website for [Medscribe](../README.md) — a privacy-first,
|
Public product website for [Medscribe](../README.md) — a private,
|
||||||
on-device medical companion in internal beta on iOS and Android.
|
patient-controlled care companion for iOS and Android.
|
||||||
|
|
||||||
Built with [create-t3-app](https://create.t3.gg/) (Next.js + TypeScript +
|
Built with [create-t3-app](https://create.t3.gg/) (Next.js + TypeScript +
|
||||||
Tailwind). There is no product database or beta-form backend.
|
Tailwind).
|
||||||
|
|
||||||
Uses **bun** exclusively (`bun.lock`).
|
Uses **bun** exclusively (`bun.lock`).
|
||||||
|
|
||||||
@@ -19,12 +19,12 @@ Open [http://localhost:3000](http://localhost:3000).
|
|||||||
|
|
||||||
## Routes
|
## Routes
|
||||||
|
|
||||||
The first public product slice includes:
|
Public routes include:
|
||||||
|
|
||||||
- `/` — consumer-first portable-context story
|
- `/` — consumer-first portable-context story
|
||||||
- `/how-it-works` — inputs, review loop, medication maintenance, and handoff
|
- `/how-it-works` — inputs, review loop, medication maintenance, and handoff
|
||||||
- `/privacy` — data map, sharing limitations, and evidence boundaries
|
- `/privacy` — plain-language privacy and patient-control commitments
|
||||||
- `/beta` — expectations and a health-data-free email request
|
- `/access` — health-data-free access request
|
||||||
|
|
||||||
Named partner print material remains isolated and excluded from search:
|
Named partner print material remains isolated and excluded from search:
|
||||||
|
|
||||||
@@ -32,10 +32,8 @@ Named partner print material remains isolated and excluded from search:
|
|||||||
- `/cvs`
|
- `/cvs`
|
||||||
- `/walgreens`
|
- `/walgreens`
|
||||||
|
|
||||||
`/executive-summary` and `/landscape` remain retired/internal and are also
|
Legacy routes redirect to the current public experience and are excluded from
|
||||||
excluded from search. `SITE_PASSWORD` still gates the entire site when set; a
|
search.
|
||||||
future pass should make protection route-specific before the public site is
|
|
||||||
deployed alongside private briefs.
|
|
||||||
|
|
||||||
### Analytics (optional)
|
### Analytics (optional)
|
||||||
|
|
||||||
@@ -58,7 +56,8 @@ precomposited iPhone product-bezel assets in
|
|||||||
`public/screenshots/product-bezel-2026-08-20/`; there are no raw or CSS-framed
|
`public/screenshots/product-bezel-2026-08-20/`; there are no raw or CSS-framed
|
||||||
product captures in the rendered site. The versioned path keeps newly captured
|
product captures in the rendered site. The versioned path keeps newly captured
|
||||||
UI from being hidden by stale browser or image-optimizer caches.
|
UI from being hidden by stale browser or image-optimizer caches.
|
||||||
Public pages label product imagery as synthetic demo data and beta UI.
|
Public pages label product imagery as an illustrative profile and Medscribe
|
||||||
|
interface.
|
||||||
|
|
||||||
### Capturing raw screenshots for the site
|
### Capturing raw screenshots for the site
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,177 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import {
|
||||||
|
ArrowRight,
|
||||||
|
CalendarDays,
|
||||||
|
Check,
|
||||||
|
ContactRound,
|
||||||
|
Mail,
|
||||||
|
Pill,
|
||||||
|
Smartphone,
|
||||||
|
Users,
|
||||||
|
} from "lucide-react";
|
||||||
|
|
||||||
|
import { SectionLabel } from "~/components/section-label";
|
||||||
|
import { Badge } from "~/components/ui/badge";
|
||||||
|
import { Button } from "~/components/ui/button";
|
||||||
|
import { productRelease } from "~/content/product";
|
||||||
|
import { ACCESS_INVITE_MAILTO } from "~/lib/access";
|
||||||
|
|
||||||
|
export const metadata: Metadata = {
|
||||||
|
title: "Request access",
|
||||||
|
description:
|
||||||
|
"Request access to Medscribe without including personal health information.",
|
||||||
|
};
|
||||||
|
|
||||||
|
const fitCards = [
|
||||||
|
{
|
||||||
|
icon: Smartphone,
|
||||||
|
title: "Several moving pieces",
|
||||||
|
body: "You coordinate visits, medications, reminders, or follow-ups across everyday life.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Users,
|
||||||
|
title: "A trusted care circle",
|
||||||
|
body: "You want an easier way to keep a family caregiver informed when you choose.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Check,
|
||||||
|
title: "Clear, reviewable context",
|
||||||
|
body: "You value a record you can read, check, and bring into the next conversation.",
|
||||||
|
},
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
const productCards = [
|
||||||
|
{
|
||||||
|
icon: CalendarDays,
|
||||||
|
title: "Visits that stay useful",
|
||||||
|
body: "Keep notes, transcripts, summaries, and follow-ups together so the details remain easy to revisit.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: Pill,
|
||||||
|
title: "Medication routines at a glance",
|
||||||
|
body: "See medications, schedules, reminders, and refill details in one calm, readable place.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
icon: ContactRound,
|
||||||
|
title: "A ready-to-share picture",
|
||||||
|
body: "Bring selected medications, allergies, conditions, contacts, and preferences together in Know Me.",
|
||||||
|
},
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
export default function AccessPage() {
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<section className="px-4 pt-16 pb-18 sm:px-6 sm:pt-22">
|
||||||
|
<div className="mx-auto grid max-w-6xl gap-12 lg:grid-cols-[1fr_0.8fr] lg:items-center">
|
||||||
|
<div>
|
||||||
|
<div className="flex flex-wrap gap-2">
|
||||||
|
<Badge variant="success">{productRelease.stage}</Badge>
|
||||||
|
<Badge variant="outline">{productRelease.platforms}</Badge>
|
||||||
|
</div>
|
||||||
|
<h1 className="text-foreground mt-6 max-w-3xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.03em] sm:text-6xl">
|
||||||
|
Bring your care context together.
|
||||||
|
</h1>
|
||||||
|
<p className="text-muted-foreground mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
||||||
|
Medscribe is made for people managing repeated visits, several
|
||||||
|
medications, and the trusted family members who help them stay
|
||||||
|
organized.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="border-border-soft bg-surface rounded-[2rem] border p-7 shadow-[0_24px_70px_rgba(15,23,42,0.08)] sm:p-9">
|
||||||
|
<div className="bg-primary-light text-primary flex size-12 items-center justify-center rounded-xl">
|
||||||
|
<Mail className="size-6" aria-hidden="true" />
|
||||||
|
</div>
|
||||||
|
<h2 className="text-foreground mt-5 font-serif text-3xl font-semibold">
|
||||||
|
Request Medscribe access
|
||||||
|
</h2>
|
||||||
|
<p className="text-muted-foreground mt-4 text-sm leading-relaxed">
|
||||||
|
Tell us your platform and whether you are interested as a patient,
|
||||||
|
caregiver, or both.
|
||||||
|
</p>
|
||||||
|
<Button asChild size="lg" className="mt-7 w-full sm:w-auto">
|
||||||
|
<a href={ACCESS_INVITE_MAILTO}>
|
||||||
|
Draft access request
|
||||||
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
|
</a>
|
||||||
|
</Button>
|
||||||
|
<p className="bg-surface-soft text-muted-foreground mt-5 rounded-xl p-4 text-xs leading-relaxed">
|
||||||
|
Please do not send diagnoses, medication names, visit notes, or
|
||||||
|
other health details. Email is not a medical-support or emergency
|
||||||
|
channel.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section className="border-border-soft border-y bg-[#f4f0e8]/75 px-4 py-20 sm:px-6 lg:py-24 dark:bg-[#151b25]">
|
||||||
|
<div className="mx-auto max-w-6xl">
|
||||||
|
<SectionLabel>Made for real life</SectionLabel>
|
||||||
|
<h2 className="text-foreground mt-4 max-w-3xl font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
|
Keep the details close without carrying the whole burden in your
|
||||||
|
head.
|
||||||
|
</h2>
|
||||||
|
<div className="mt-10 grid gap-4 md:grid-cols-3">
|
||||||
|
{fitCards.map((item) => {
|
||||||
|
const Icon = item.icon;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<article
|
||||||
|
key={item.title}
|
||||||
|
className="border-border-soft bg-surface rounded-2xl border p-6"
|
||||||
|
>
|
||||||
|
<Icon className="text-primary size-6" aria-hidden="true" />
|
||||||
|
<h3 className="text-foreground mt-5 font-serif text-2xl font-semibold">
|
||||||
|
{item.title}
|
||||||
|
</h3>
|
||||||
|
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
||||||
|
{item.body}
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section className="px-4 py-20 sm:px-6 lg:py-28">
|
||||||
|
<div className="mx-auto max-w-6xl">
|
||||||
|
<SectionLabel>One connected picture</SectionLabel>
|
||||||
|
<h2 className="text-foreground mt-4 max-w-3xl font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
|
Visits, medications, and the people who matter—together.
|
||||||
|
</h2>
|
||||||
|
<div className="mt-10 grid gap-4 md:grid-cols-3">
|
||||||
|
{productCards.map((item) => {
|
||||||
|
const Icon = item.icon;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<article
|
||||||
|
key={item.title}
|
||||||
|
className="border-border-soft bg-surface rounded-2xl border p-6"
|
||||||
|
>
|
||||||
|
<Icon className="text-primary size-6" aria-hidden="true" />
|
||||||
|
<h3 className="text-foreground mt-5 font-serif text-2xl font-semibold">
|
||||||
|
{item.title}
|
||||||
|
</h3>
|
||||||
|
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
||||||
|
{item.body}
|
||||||
|
</p>
|
||||||
|
</article>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="mt-14 rounded-[2rem] bg-[#0f4f4b] p-7 text-white sm:p-10">
|
||||||
|
<p className="text-xs font-bold tracking-[0.14em] text-teal-100 uppercase">
|
||||||
|
Keep your care team in the loop
|
||||||
|
</p>
|
||||||
|
<h2 className="mt-4 max-w-3xl font-serif text-3xl font-semibold sm:text-4xl">
|
||||||
|
Medscribe helps you prepare for better conversations. Medical
|
||||||
|
decisions remain with you and your qualified care team.
|
||||||
|
</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -1,226 +1,5 @@
|
|||||||
import type { Metadata } from "next";
|
import { redirect } from "next/navigation";
|
||||||
import {
|
|
||||||
ArrowRight,
|
|
||||||
Check,
|
|
||||||
ClipboardCheck,
|
|
||||||
Mail,
|
|
||||||
MessageSquareText,
|
|
||||||
RotateCcw,
|
|
||||||
Smartphone,
|
|
||||||
Users,
|
|
||||||
} from "lucide-react";
|
|
||||||
import Link from "next/link";
|
|
||||||
|
|
||||||
import { SectionLabel } from "~/components/section-label";
|
export default function LegacyAccessPage() {
|
||||||
import { Badge } from "~/components/ui/badge";
|
redirect("/access");
|
||||||
import { Button } from "~/components/ui/button";
|
|
||||||
import { productRelease } from "~/content/product";
|
|
||||||
import { BETA_INVITE_MAILTO } from "~/lib/beta";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
|
||||||
title: "Request beta access",
|
|
||||||
description:
|
|
||||||
"Learn who the Medscribe internal beta is for, what participants should expect, and how to request access without submitting health information.",
|
|
||||||
};
|
|
||||||
|
|
||||||
const expectations = [
|
|
||||||
{
|
|
||||||
icon: ClipboardCheck,
|
|
||||||
title: "Review is part of testing",
|
|
||||||
body: "Check generated summaries, extracted medication fields, and the Know Me view before relying on them.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: MessageSquareText,
|
|
||||||
title: "Direct feedback",
|
|
||||||
body: "Report confusing language, incorrect extraction, notification behavior, and sharing friction.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: RotateCcw,
|
|
||||||
title: "Possible resets",
|
|
||||||
body: "This is an internal beta. Builds, local data, and setup may need to be reset as the product changes.",
|
|
||||||
},
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
const testFocus = [
|
|
||||||
"Whether the record still feels current after several weeks",
|
|
||||||
"Medication-label edge cases and correction flow",
|
|
||||||
"Reminder permissions, timing, travel, and daylight-saving behavior",
|
|
||||||
"Caregiver pairing, encrypted export, and import comprehension",
|
|
||||||
"Whether the Know Me handoff is readable and appropriately cautious",
|
|
||||||
"Physical-device model performance and battery or thermal behavior",
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
export default function BetaPage() {
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<section className="px-4 pt-16 pb-18 sm:px-6 sm:pt-22">
|
|
||||||
<div className="mx-auto grid max-w-6xl gap-12 lg:grid-cols-[1fr_0.8fr] lg:items-center">
|
|
||||||
<div>
|
|
||||||
<div className="flex flex-wrap gap-2">
|
|
||||||
<Badge variant="success">{productRelease.stage}</Badge>
|
|
||||||
<Badge variant="outline">{productRelease.platforms}</Badge>
|
|
||||||
</div>
|
|
||||||
<h1 className="text-foreground mt-6 max-w-3xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.03em] sm:text-6xl">
|
|
||||||
Test the care context, not just the demo.
|
|
||||||
</h1>
|
|
||||||
<p className="text-muted-foreground mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
|
||||||
We are looking for people managing repeated visits or several
|
|
||||||
medications, especially family caregiver pairs willing to review
|
|
||||||
the record over time and tell us where it fails.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="border-border-soft bg-surface rounded-[2rem] border p-7 shadow-[0_24px_70px_rgba(15,23,42,0.08)] sm:p-9">
|
|
||||||
<div className="bg-primary-light text-primary flex size-12 items-center justify-center rounded-xl">
|
|
||||||
<Mail className="size-6" aria-hidden="true" />
|
|
||||||
</div>
|
|
||||||
<h2 className="text-foreground mt-5 font-serif text-3xl font-semibold">
|
|
||||||
Request access by email
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground mt-4 text-sm leading-relaxed">
|
|
||||||
The draft asks only for your platform, whether you are testing as
|
|
||||||
a patient, caregiver, or both, and whether you can test with
|
|
||||||
another person.
|
|
||||||
</p>
|
|
||||||
<Button asChild size="lg" className="mt-7 w-full sm:w-auto">
|
|
||||||
<a href={BETA_INVITE_MAILTO}>
|
|
||||||
Draft beta request
|
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
|
||||||
</a>
|
|
||||||
</Button>
|
|
||||||
<p className="bg-surface-soft text-muted-foreground mt-5 rounded-xl p-4 text-xs leading-relaxed">
|
|
||||||
Do not send diagnoses, medication names, visit notes, transcripts,
|
|
||||||
or other health details. Email is not a medical-support or
|
|
||||||
emergency channel.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="border-border-soft border-y bg-[#f4f0e8]/75 px-4 py-20 sm:px-6 lg:py-24 dark:bg-[#151b25]">
|
|
||||||
<div className="mx-auto max-w-6xl">
|
|
||||||
<SectionLabel>A good fit</SectionLabel>
|
|
||||||
<h2 className="text-foreground mt-4 max-w-3xl font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
|
||||||
The beta needs real maintenance and handoff situations.
|
|
||||||
</h2>
|
|
||||||
<div className="mt-10 grid gap-4 md:grid-cols-3">
|
|
||||||
{[
|
|
||||||
{
|
|
||||||
icon: Smartphone,
|
|
||||||
title: "Several moving pieces",
|
|
||||||
body: "You regularly coordinate visits, medication reminders, or follow-ups.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: Users,
|
|
||||||
title: "A caregiver relationship",
|
|
||||||
body: "You can test a deliberate handoff with a trusted family caregiver.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: Check,
|
|
||||||
title: "Comfort reviewing",
|
|
||||||
body: "You understand generated information can be wrong and will check it.",
|
|
||||||
},
|
|
||||||
].map((item) => {
|
|
||||||
const Icon = item.icon;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<article
|
|
||||||
key={item.title}
|
|
||||||
className="border-border-soft bg-surface rounded-2xl border p-6"
|
|
||||||
>
|
|
||||||
<Icon className="text-primary size-6" aria-hidden="true" />
|
|
||||||
<h3 className="text-foreground mt-5 font-serif text-2xl font-semibold">
|
|
||||||
{item.title}
|
|
||||||
</h3>
|
|
||||||
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
|
||||||
{item.body}
|
|
||||||
</p>
|
|
||||||
</article>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="px-4 py-20 sm:px-6 lg:py-28">
|
|
||||||
<div className="mx-auto max-w-6xl">
|
|
||||||
<div className="grid gap-12 lg:grid-cols-[0.8fr_1.2fr]">
|
|
||||||
<div>
|
|
||||||
<SectionLabel>What to expect</SectionLabel>
|
|
||||||
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight">
|
|
||||||
This is collaborative product testing.
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground mt-5 leading-relaxed">
|
|
||||||
Availability is controlled and continuity is not guaranteed.
|
|
||||||
Medscribe is not emergency care, diagnosis, dosing guidance, or
|
|
||||||
a replacement for your care team.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="grid gap-4 sm:grid-cols-3">
|
|
||||||
{expectations.map((item) => {
|
|
||||||
const Icon = item.icon;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<article
|
|
||||||
key={item.title}
|
|
||||||
className="border-border-soft bg-surface rounded-2xl border p-5"
|
|
||||||
>
|
|
||||||
<Icon className="text-primary size-5" aria-hidden="true" />
|
|
||||||
<h3 className="text-foreground mt-4 font-serif text-xl font-semibold">
|
|
||||||
{item.title}
|
|
||||||
</h3>
|
|
||||||
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
|
||||||
{item.body}
|
|
||||||
</p>
|
|
||||||
</article>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="mt-16 rounded-[2rem] bg-[#0f4f4b] p-7 text-white sm:p-10">
|
|
||||||
<div className="grid gap-10 lg:grid-cols-[0.7fr_1.3fr]">
|
|
||||||
<div>
|
|
||||||
<p className="text-xs font-bold tracking-[0.14em] text-teal-100 uppercase">
|
|
||||||
Current test focus
|
|
||||||
</p>
|
|
||||||
<h2 className="mt-4 font-serif text-3xl font-semibold">
|
|
||||||
The questions we are trying to answer
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<ul className="grid gap-3 sm:grid-cols-2">
|
|
||||||
{testFocus.map((item) => (
|
|
||||||
<li
|
|
||||||
key={item}
|
|
||||||
className="flex gap-3 rounded-xl border border-white/15 bg-white/8 p-4 text-sm leading-relaxed text-teal-50/85"
|
|
||||||
>
|
|
||||||
<Check
|
|
||||||
className="mt-0.5 size-4 shrink-0 text-teal-100"
|
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
{item}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="border-border-soft mt-12 flex flex-col items-start justify-between gap-5 border-t pt-10 sm:flex-row sm:items-center">
|
|
||||||
<div>
|
|
||||||
<h2 className="text-foreground font-serif text-2xl font-semibold">
|
|
||||||
Want the technical boundaries first?
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground mt-2 text-sm">
|
|
||||||
See what stays local, how sharing works, and the current
|
|
||||||
evidence.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<Button asChild variant="outline">
|
|
||||||
<Link href="/privacy">Read privacy & evidence</Link>
|
|
||||||
</Button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,9 +19,8 @@ export default function NorthwellBriefPage() {
|
|||||||
The health-system executive summary
|
The health-system executive summary
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-muted-foreground mx-auto mt-5 max-w-xl leading-relaxed">
|
<p className="text-muted-foreground mx-auto mt-5 max-w-xl leading-relaxed">
|
||||||
This private, search-excluded route preserves the existing three-page
|
This page is formatted as a three-page print document. Use Print PDF
|
||||||
print document. Use Print PDF (or Cmd+P, then Save as PDF) to export
|
(or Cmd+P, then Save as PDF) to export it.
|
||||||
it.
|
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-8 flex justify-center">
|
<div className="mt-8 flex justify-center">
|
||||||
<PrintButton size="lg" />
|
<PrintButton size="lg" />
|
||||||
|
|||||||
@@ -1,437 +1,11 @@
|
|||||||
import type { CSSProperties } from "react";
|
|
||||||
|
|
||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import Image from "next/image";
|
|
||||||
|
|
||||||
import { MedscribeLogo } from "~/components/medscribe-logo";
|
|
||||||
import { PhoneMockup } from "~/components/phone-mockup";
|
|
||||||
import { PrintButton } from "~/components/print-button";
|
|
||||||
import { SectionLabel } from "~/components/section-label";
|
|
||||||
import { BETA_FOOTER_NOTE, BETA_SUMMARY } from "~/lib/beta";
|
|
||||||
import {
|
|
||||||
Card,
|
|
||||||
CardContent,
|
|
||||||
CardDescription,
|
|
||||||
CardHeader,
|
|
||||||
CardTitle,
|
|
||||||
} from "~/components/ui/card";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Executive Summary",
|
title: "Medscribe",
|
||||||
description:
|
|
||||||
"One-page executive summary for Medscribe, a private medical context app for families managing complex care.",
|
|
||||||
robots: { index: false, follow: false, nocache: true },
|
robots: { index: false, follow: false, nocache: true },
|
||||||
};
|
};
|
||||||
|
|
||||||
const TAGLINE =
|
|
||||||
"Your medical truth, in your pocket, and only where you say it goes.";
|
|
||||||
|
|
||||||
const SNAPSHOT =
|
|
||||||
"Medscribe is a private, patient-owned medical record and companion for people managing ongoing care and the families beside them. It captures visits, makes medications and instructions easy to understand and keep current day to day, and stays ready to hand to a caregiver, a new specialist, or an ER. Everything runs on the device; nothing is uploaded.";
|
|
||||||
|
|
||||||
const PROBLEM =
|
|
||||||
"Care is fragmented and hard to carry. Patients forget most of what they're told in a visit, juggle medications with no clear picture of what each is for, and lose track of what changed and why. Then they end up somewhere new: a covering doctor, a specialist, an ER outside their network, and none of it travels with them. The family knows, but can't produce a clear, current record under pressure.";
|
|
||||||
|
|
||||||
const PROBLEM_BROADER =
|
|
||||||
"This is not a rare edge case. It happens every day, to patients with Parkinson's, diabetes, heart disease, dementia, and a hundred other conditions that require precise, continuous management across a fragmented system. The failure is not that families don't care. The failure is that the patient's context does not travel with them.";
|
|
||||||
|
|
||||||
const WHO_ITS_FOR =
|
|
||||||
"Anyone managing serious, ongoing care across a fragmented health system, and the families who coordinate it. It spans conditions and ages, and eventually touches almost everyone. The failure is simple: the patient's context does not travel with them.";
|
|
||||||
|
|
||||||
const DIFFERENTIATION =
|
|
||||||
"The market is full of AI visit recorders, medication trackers, health-record apps, and emergency QR cards, each owning one slice. None owns the whole job. In Medscribe, the daily tools are the maintenance system for one emergency-ready record.";
|
|
||||||
|
|
||||||
const differentiators = [
|
|
||||||
{
|
|
||||||
title: "The record is the product",
|
|
||||||
body: "Recording, scanning, reminders, and Q&A all feed one private record you actually keep current, useful every day and ready to hand over when it counts. Competitors ship visit summaries; we ship the record you own and carry.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Private by architecture",
|
|
||||||
body: 'AI runs on-device: no cloud processing, no health-data upload, no tracking, no account. Others say "encrypted" while their store disclosures admit cloud collection.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Facts-first, not a guess",
|
|
||||||
body: "Medication answers render trusted drug facts deterministically, deferring dosing and diagnosis to a clinician or pharmacist. Built for complex-care families, not a general health bot.",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const MOAT =
|
|
||||||
"The privacy promise is easy to claim. The execution is not. Medscribe runs a fine-tuned medical model entirely on the phone, built and measured rather than bolted on.";
|
|
||||||
|
|
||||||
const moat = [
|
|
||||||
{
|
|
||||||
title: "A model tuned for this job",
|
|
||||||
body: "A compact, multi-task model handles label scanning, structured extraction, and safe medication Q&A on the device. Fine-tuning lifted prescription-label field extraction from 0% to 97% in evaluation.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Safety you can measure",
|
|
||||||
body: "Each release is scored against a held-out set for grounding and safe refusals. Unsafe-prompt refusals reached 100% after tuning, so “defers to a clinician” is a tested behavior, not a hope.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Context that compounds",
|
|
||||||
body: "Real visit transcripts, a real medication list, and bundled drug facts fuse into one local record, value that grows with use and is hard to replicate without the same on-device capture.",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const scenarios = [
|
|
||||||
{
|
|
||||||
title: "The ER that doesn't know you",
|
|
||||||
body: "A patient on time-critical medication ends up at a hospital outside their network. Missing a dose by hours isn't an inconvenience; it's a medical event. Nobody has the schedule, and the family can't produce it under pressure.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "The caregiver handoff",
|
|
||||||
body: "An adult child manages a parent's medications, appointments, and history. When they're not there, the context disappears: a sibling visits, a home aide covers, a shift changes. Critical details live in one person's memory.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "The newly diagnosed, overwhelmed",
|
|
||||||
body: "After a new diagnosis, a patient leaves with a changed medication schedule, lifestyle instructions, and follow-ups they half-remember. By the next visit, the provider can't tell what was understood, tried, or missed.",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const impact = [
|
|
||||||
{
|
|
||||||
title: "Fewer blank handoffs",
|
|
||||||
body: "When a caregiver or clinician takes over, the facts are already assembled: conditions, medications, allergies, baseline, contacts, and recent changes.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Safer medication moments",
|
|
||||||
body: "Time-critical schedules and dose history stay visible, so a missed or delayed medication is easier to catch before it becomes a crisis.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Patients and providers aligned",
|
|
||||||
body: "Families see what changed and why; providers get a current snapshot instead of reconstructing it from a stressed family's memory.",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const FOR_HEALTH_SYSTEMS =
|
|
||||||
"Epic is the definitive record of care inside the network. What no institutional EHR is built to be is the record the patient owns and carries everywhere else: the out-of-network ER, the specialist on another Epic instance, the months between visits at home. That out-of-hospital stretch is a structural blind spot, not a flaw in any one system. Medscribe fills it on the patient's own device, and — only with the patient's consent — hands that context back, so the gap becomes an ongoing connection instead of a black box.";
|
|
||||||
|
|
||||||
const forHealthSystems = [
|
|
||||||
{
|
|
||||||
title: "Reaches where the EHR can't",
|
|
||||||
body: "The record lives on the patient's device and travels with them: the out-of-network ER, the covering specialist, the weeks at home between visits. It stays current exactly where an institutional system loses sight of the patient.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Feeds context back into Epic",
|
|
||||||
body: "With the patient's consent, the out-of-network and between-visit context Medscribe captures returns into the workflows you already run. It raises the value of the EHR investment rather than competing for budget or attention.",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: "Patient-owned, so it persists",
|
|
||||||
body: "A branded, patient-facing surface that works the levers systems are measured on — in-network retention, medication adherence, avoidable readmissions. Because the record belongs to the patient, it holds even if the system changes EHRs.",
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const printLightTokens = {
|
|
||||||
"--color-foreground": "#0f172a",
|
|
||||||
"--color-primary": "#0f766e",
|
|
||||||
"--color-surface": "#ffffff",
|
|
||||||
"--color-border-soft": "#e2e8f0",
|
|
||||||
"--color-muted-foreground": "#475569",
|
|
||||||
color: "#0f172a",
|
|
||||||
} as CSSProperties;
|
|
||||||
|
|
||||||
export default function ExecutiveSummaryPage() {
|
export default function ExecutiveSummaryPage() {
|
||||||
// The home page is now the executive summary (single-page site). This deep
|
|
||||||
// page is retired but kept in place — its content (incl. the print one-pager)
|
|
||||||
// is a one-line revert away if we want a longer version back.
|
|
||||||
redirect("/");
|
redirect("/");
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{/* ===================== SCREEN ===================== */}
|
|
||||||
<div className="print-hidden 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="grid items-start gap-8 lg:grid-cols-[minmax(0,1fr)_minmax(220px,280px)] lg:gap-14">
|
|
||||||
<div className="space-y-5">
|
|
||||||
<SectionLabel>Executive Summary · June 2026</SectionLabel>
|
|
||||||
<div className="space-y-3">
|
|
||||||
<h1 className="text-foreground font-serif text-5xl font-semibold tracking-tight sm:text-6xl">
|
|
||||||
Medscribe
|
|
||||||
</h1>
|
|
||||||
<p className="text-foreground font-serif text-xl font-semibold tracking-tight sm:text-2xl">
|
|
||||||
{TAGLINE}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<p className="text-muted-foreground text-base leading-relaxed sm:text-lg">
|
|
||||||
{SNAPSHOT}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className="justify-self-center lg:justify-self-end">
|
|
||||||
<PhoneMockup
|
|
||||||
src="/screenshots/product-bezel-2026-08-20/home-black.webp"
|
|
||||||
darkSrc="/screenshots/product-bezel-2026-08-20/home-black-dark.webp"
|
|
||||||
alt="Medscribe home screen"
|
|
||||||
width={200}
|
|
||||||
priority
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* The Problem */}
|
|
||||||
<section className="space-y-5">
|
|
||||||
<SectionLabel>The problem</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
The patient's context does not travel with them.
|
|
||||||
</h2>
|
|
||||||
<div className="text-muted-foreground grid gap-6 leading-relaxed lg:grid-cols-2 lg:gap-10">
|
|
||||||
<p>{PROBLEM}</p>
|
|
||||||
<p className="text-foreground font-medium">{PROBLEM_BROADER}</p>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Scenarios */}
|
|
||||||
<section className="space-y-6">
|
|
||||||
<SectionLabel>Who this is for</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
The moments where context is everything.
|
|
||||||
</h2>
|
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
|
||||||
{scenarios.map((scenario) => (
|
|
||||||
<Card key={scenario.title} className="card-hover">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle className="text-lg">{scenario.title}</CardTitle>
|
|
||||||
<CardDescription>{scenario.body}</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Differentiation */}
|
|
||||||
<section className="space-y-6">
|
|
||||||
<SectionLabel>Why this is different</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
Everyone owns a slice. We own the whole job.
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground max-w-4xl leading-relaxed">
|
|
||||||
{DIFFERENTIATION}
|
|
||||||
</p>
|
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
|
||||||
{differentiators.map((item) => (
|
|
||||||
<Card key={item.title} className="card-hover">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle className="text-lg">{item.title}</CardTitle>
|
|
||||||
<CardDescription>{item.body}</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</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>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Under the hood */}
|
|
||||||
<section className="space-y-6">
|
|
||||||
<SectionLabel>Under the hood</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
Easy to claim. Hard to copy.
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground max-w-4xl leading-relaxed">
|
|
||||||
{MOAT}
|
|
||||||
</p>
|
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
|
||||||
{moat.map((item) => (
|
|
||||||
<Card key={item.title} className="card-hover">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle className="text-lg">{item.title}</CardTitle>
|
|
||||||
<CardDescription>{item.body}</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Impact */}
|
|
||||||
<section className="space-y-6">
|
|
||||||
<SectionLabel>Potential impact</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
Less panic, more context, better handoffs.
|
|
||||||
</h2>
|
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
|
||||||
{impact.map((item) => (
|
|
||||||
<Card
|
|
||||||
key={item.title}
|
|
||||||
className="card-hover border-primary-button/20 bg-primary-button text-white"
|
|
||||||
>
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle className="text-white">{item.title}</CardTitle>
|
|
||||||
<CardDescription className="text-white/75">
|
|
||||||
{item.body}
|
|
||||||
</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* For health systems */}
|
|
||||||
<section className="space-y-6">
|
|
||||||
<SectionLabel>For health systems</SectionLabel>
|
|
||||||
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
|
||||||
An ongoing touchstone, not another portal.
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground max-w-4xl leading-relaxed">
|
|
||||||
{FOR_HEALTH_SYSTEMS}
|
|
||||||
</p>
|
|
||||||
<div className="grid gap-4 md:grid-cols-3">
|
|
||||||
{forHealthSystems.map((item) => (
|
|
||||||
<Card key={item.title} className="card-hover">
|
|
||||||
<CardHeader>
|
|
||||||
<CardTitle className="text-lg">{item.title}</CardTitle>
|
|
||||||
<CardDescription>{item.body}</CardDescription>
|
|
||||||
</CardHeader>
|
|
||||||
</Card>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Beta */}
|
|
||||||
<section className="border-border-soft bg-surface flex flex-col gap-5 rounded-xl border p-6 sm:flex-row sm:items-center sm:justify-between sm:p-8">
|
|
||||||
<p className="text-muted-foreground max-w-xl text-sm leading-relaxed">
|
|
||||||
{BETA_SUMMARY} If you'd like to try it, reach out.
|
|
||||||
</p>
|
|
||||||
<PrintButton size="lg" className="shrink-0" />
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<p className="border-border-soft text-muted-foreground border-t pt-6 text-sm">
|
|
||||||
Sean O'Connor
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* ===================== PRINT: dense one-page PDF ===================== */}
|
|
||||||
<article
|
|
||||||
style={printLightTokens}
|
|
||||||
className="print-sheet hidden print:flex print:h-[10.5in] print:flex-col print:px-[0.4in] print:pt-[0.22in] print:pb-[0.1in] print:text-[11pt] print:leading-[1.2]"
|
|
||||||
>
|
|
||||||
{/* Header */}
|
|
||||||
<header className="grid grid-cols-[minmax(0,1fr)_0.94in] items-stretch gap-4 border-b border-teal-900/10 pb-1.5">
|
|
||||||
<div className="flex flex-col justify-between py-0.5">
|
|
||||||
<p className="text-primary text-[10pt] font-semibold tracking-[0.18em] uppercase">
|
|
||||||
Executive Summary · June 2026
|
|
||||||
</p>
|
|
||||||
<div className="mt-1.5 flex items-center gap-2.5">
|
|
||||||
<MedscribeLogo className="text-foreground h-[20pt] w-auto" />
|
|
||||||
<h1 className="text-foreground font-serif text-[22pt] leading-none font-semibold tracking-tight">
|
|
||||||
Medscribe
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
<p className="text-foreground mt-1.5 font-serif text-[12pt] leading-snug font-medium tracking-tight italic">
|
|
||||||
{TAGLINE}
|
|
||||||
</p>
|
|
||||||
<p className="mt-2 text-[11pt] leading-[1.2] text-slate-700">
|
|
||||||
{SNAPSHOT}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="flex justify-end">
|
|
||||||
<div className="w-[0.96in]">
|
|
||||||
<Image
|
|
||||||
src="/screenshots/product-bezel-2026-08-20/home-black.webp"
|
|
||||||
alt="Medscribe home screen"
|
|
||||||
width={1350}
|
|
||||||
height={2760}
|
|
||||||
priority
|
|
||||||
unoptimized
|
|
||||||
className="h-auto w-full"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{/* The Problem */}
|
|
||||||
<section className="border-b border-teal-900/10 pt-1 pb-1">
|
|
||||||
<h2 className="text-foreground font-serif text-[12.5pt] font-semibold tracking-tight">
|
|
||||||
The Problem
|
|
||||||
</h2>
|
|
||||||
<p className="mt-1 text-[11pt] leading-[1.2] text-slate-700">
|
|
||||||
{PROBLEM}
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Who It's For */}
|
|
||||||
<section className="border-b border-teal-900/10 pt-1 pb-1">
|
|
||||||
<h2 className="text-foreground font-serif text-[12.5pt] font-semibold tracking-tight">
|
|
||||||
Who It's For
|
|
||||||
</h2>
|
|
||||||
<p className="mt-1 text-[11pt] leading-[1.2] text-slate-700">
|
|
||||||
{WHO_ITS_FOR}
|
|
||||||
</p>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Why This Is Different */}
|
|
||||||
<section className="border-b border-teal-900/10 pt-1 pb-1">
|
|
||||||
<h2 className="text-foreground font-serif text-[12.5pt] font-semibold tracking-tight">
|
|
||||||
Why This Is Different
|
|
||||||
</h2>
|
|
||||||
<div className="mt-1.5 grid grid-cols-3 gap-x-6">
|
|
||||||
{differentiators.map((item) => (
|
|
||||||
<p
|
|
||||||
key={item.title}
|
|
||||||
className="text-[11pt] leading-[1.2] text-slate-700"
|
|
||||||
>
|
|
||||||
<span className="text-foreground font-semibold">
|
|
||||||
{item.title}.
|
|
||||||
</span>{" "}
|
|
||||||
{item.body}
|
|
||||||
</p>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* Under The Hood */}
|
|
||||||
<section className="border-b border-teal-900/10 pt-1 pb-1">
|
|
||||||
<h2 className="text-foreground font-serif text-[12.5pt] font-semibold tracking-tight">
|
|
||||||
Under The Hood
|
|
||||||
</h2>
|
|
||||||
<div className="mt-1 grid grid-cols-3 gap-x-6">
|
|
||||||
{moat.map((item) => (
|
|
||||||
<p
|
|
||||||
key={item.title}
|
|
||||||
className="text-[11pt] leading-[1.2] text-slate-700"
|
|
||||||
>
|
|
||||||
<span className="text-foreground font-semibold">
|
|
||||||
{item.title}.
|
|
||||||
</span>{" "}
|
|
||||||
{item.body}
|
|
||||||
</p>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
{/* For Health Systems */}
|
|
||||||
<section className="pt-1">
|
|
||||||
<h2 className="text-foreground font-serif text-[12.5pt] font-semibold tracking-tight">
|
|
||||||
For Health Systems
|
|
||||||
</h2>
|
|
||||||
<div className="mt-1 grid grid-cols-3 gap-x-6">
|
|
||||||
{forHealthSystems.map((item) => (
|
|
||||||
<p
|
|
||||||
key={item.title}
|
|
||||||
className="text-[11pt] leading-[1.2] text-slate-700"
|
|
||||||
>
|
|
||||||
<span className="text-foreground font-semibold">
|
|
||||||
{item.title}.
|
|
||||||
</span>{" "}
|
|
||||||
{item.body}
|
|
||||||
</p>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<footer className="mt-auto flex items-center justify-between border-t border-teal-900/10 pt-1.5 text-[10pt] text-slate-500">
|
|
||||||
<p>Sean O'Connor</p>
|
|
||||||
<p className="text-slate-400">{BETA_FOOTER_NOTE}</p>
|
|
||||||
</footer>
|
|
||||||
</article>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,19 +14,18 @@ import { PhoneMockup } from "~/components/phone-mockup";
|
|||||||
import { SectionLabel } from "~/components/section-label";
|
import { SectionLabel } from "~/components/section-label";
|
||||||
import { Badge } from "~/components/ui/badge";
|
import { Badge } from "~/components/ui/badge";
|
||||||
import { Button } from "~/components/ui/button";
|
import { Button } from "~/components/ui/button";
|
||||||
import { productClaims } from "~/content/product";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "How it works",
|
title: "How it works",
|
||||||
description:
|
description:
|
||||||
"See how Medscribe turns visits and medication routines into one local record a person can review and carry.",
|
"See how Medscribe brings visits, medication routines, and important context into one reviewable record.",
|
||||||
};
|
};
|
||||||
|
|
||||||
const inputs = [
|
const inputs = [
|
||||||
{
|
{
|
||||||
icon: Keyboard,
|
icon: Keyboard,
|
||||||
title: "Type or paste",
|
title: "Type or paste",
|
||||||
body: "Start from notes you already have and keep the source close to the result.",
|
body: "Start from notes you already have and keep the original details easy to revisit.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: Camera,
|
icon: Camera,
|
||||||
@@ -36,12 +35,12 @@ const inputs = [
|
|||||||
{
|
{
|
||||||
icon: FileText,
|
icon: FileText,
|
||||||
title: "Attach a document",
|
title: "Attach a document",
|
||||||
body: "Use a photo or document as the input to a local review workflow.",
|
body: "Bring a photo or document into a guided review workflow.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: Mic,
|
icon: Mic,
|
||||||
title: "Record with consent",
|
title: "Record with consent",
|
||||||
body: "Optional visit audio requires consent and is transcribed on the device.",
|
body: "With permission, turn optional visit audio into notes you can review.",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ const boundaries = [
|
|||||||
"It does not diagnose or recommend treatment.",
|
"It does not diagnose or recommend treatment.",
|
||||||
"It does not calculate, shift, or supply medication timing.",
|
"It does not calculate, shift, or supply medication timing.",
|
||||||
"It does not replace a pharmacist, prescribing team, or emergency service.",
|
"It does not replace a pharmacist, prescribing team, or emergency service.",
|
||||||
"It does not automatically synchronize a household in the background.",
|
"It does not decide what you should share or who should receive it.",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export default function HowItWorksPage() {
|
export default function HowItWorksPage() {
|
||||||
@@ -57,14 +56,14 @@ export default function HowItWorksPage() {
|
|||||||
<>
|
<>
|
||||||
<section className="px-4 pt-16 pb-18 sm:px-6 sm:pt-22">
|
<section className="px-4 pt-16 pb-18 sm:px-6 sm:pt-22">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto max-w-6xl">
|
||||||
<Badge variant="success">Current beta workflow</Badge>
|
<Badge variant="success">A day with Medscribe</Badge>
|
||||||
<h1 className="text-foreground mt-6 max-w-4xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.03em] sm:text-6xl">
|
<h1 className="text-foreground mt-6 max-w-4xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.03em] sm:text-6xl">
|
||||||
One record, built through everyday use.
|
One record, built through everyday use.
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-muted-foreground mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
<p className="text-muted-foreground mt-6 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
||||||
Medscribe is useful at a handoff only if ordinary moments keep the
|
Medscribe is useful at a handoff only if ordinary moments keep the
|
||||||
picture current. Every generated result has a person in the review
|
picture clear. You stay in the review loop from the first note to
|
||||||
loop.
|
the next conversation.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -73,7 +72,7 @@ export default function HowItWorksPage() {
|
|||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto max-w-6xl">
|
||||||
<SectionLabel>Start where the information is</SectionLabel>
|
<SectionLabel>Start where the information is</SectionLabel>
|
||||||
<h2 className="text-foreground mt-4 max-w-3xl font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
<h2 className="text-foreground mt-4 max-w-3xl font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
Four ways in. One review checkpoint.
|
Four ways in. One clear place to review.
|
||||||
</h2>
|
</h2>
|
||||||
<div className="mt-10 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
<div className="mt-10 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
||||||
{inputs.map((item, index) => {
|
{inputs.map((item, index) => {
|
||||||
@@ -108,9 +107,8 @@ export default function HowItWorksPage() {
|
|||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<p className="text-foreground text-sm leading-relaxed">
|
<p className="text-foreground text-sm leading-relaxed">
|
||||||
The person reviews summaries and extracted medication fields.
|
You review summaries and medication details before they become
|
||||||
Medscribe does not silently turn model output into an
|
part of the record you carry.
|
||||||
authoritative medical record.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -122,28 +120,27 @@ export default function HowItWorksPage() {
|
|||||||
<div>
|
<div>
|
||||||
<SectionLabel>Review what changed</SectionLabel>
|
<SectionLabel>Review what changed</SectionLabel>
|
||||||
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
A summary is a draft, not a verdict.
|
Keep the visit and the takeaway together.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-5 leading-relaxed">
|
<p className="text-muted-foreground mt-5 leading-relaxed">
|
||||||
Supported transcription and summarization run locally. The visit
|
The visit remains available beside the summary so you can check
|
||||||
remains available beside the summary so a person can check
|
wording, follow-ups, and the details you want to remember.
|
||||||
follow-ups and wording.
|
|
||||||
</p>
|
</p>
|
||||||
<p className="border-border-soft bg-surface text-muted-foreground mt-5 rounded-2xl border p-5 text-sm leading-relaxed">
|
<p className="border-border-soft bg-surface text-muted-foreground mt-5 rounded-2xl border p-5 text-sm leading-relaxed">
|
||||||
<strong className="text-foreground">What comes next:</strong> a
|
<strong className="text-foreground">Stay oriented:</strong> move
|
||||||
structured review inbox for accepting, correcting, or dismissing
|
between the transcript and summary whenever you want the fuller
|
||||||
changes inferred from a visit.
|
context.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-primary-light/45 justify-self-center rounded-[2.5rem] p-7">
|
<div className="bg-primary-light/45 justify-self-center rounded-[2.5rem] p-7">
|
||||||
<PhoneMockup
|
<PhoneMockup
|
||||||
src="/screenshots/product-bezel-2026-08-20/summary-natural.webp"
|
src="/screenshots/product-bezel-2026-08-20/summary-natural.webp"
|
||||||
darkSrc="/screenshots/product-bezel-2026-08-20/summary-natural-dark.webp"
|
darkSrc="/screenshots/product-bezel-2026-08-20/summary-natural-dark.webp"
|
||||||
alt="Synthetic Medscribe beta visit summary"
|
alt="Illustrative Medscribe visit summary"
|
||||||
width={235}
|
width={235}
|
||||||
/>
|
/>
|
||||||
<p className="text-muted-foreground mt-4 text-center text-xs">
|
<p className="text-muted-foreground mt-4 text-center text-xs">
|
||||||
Synthetic demo data · beta interface
|
Illustrative profile · Medscribe interface
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -153,22 +150,21 @@ export default function HowItWorksPage() {
|
|||||||
<PhoneMockup
|
<PhoneMockup
|
||||||
src="/screenshots/product-bezel-2026-08-20/medication-detail-natural.webp"
|
src="/screenshots/product-bezel-2026-08-20/medication-detail-natural.webp"
|
||||||
darkSrc="/screenshots/product-bezel-2026-08-20/medication-detail-natural-dark.webp"
|
darkSrc="/screenshots/product-bezel-2026-08-20/medication-detail-natural-dark.webp"
|
||||||
alt="Synthetic Medscribe beta medication detail"
|
alt="Illustrative Medscribe medication detail"
|
||||||
width={235}
|
width={235}
|
||||||
/>
|
/>
|
||||||
<p className="text-muted-foreground mt-4 text-center text-xs">
|
<p className="text-muted-foreground mt-4 text-center text-xs">
|
||||||
Synthetic demo data · beta interface
|
Illustrative profile · Medscribe interface
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="lg:order-2">
|
<div className="lg:order-2">
|
||||||
<SectionLabel>Maintain the medication picture</SectionLabel>
|
<SectionLabel>Maintain the medication picture</SectionLabel>
|
||||||
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
Facts and schedules carry their boundary with them.
|
Keep the daily routine easy to read.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-5 leading-relaxed">
|
<p className="text-muted-foreground mt-5 leading-relaxed">
|
||||||
{productClaims.medicationFacts.publicCopy} Schedules can record
|
See medication details, schedules, reminders, and refill
|
||||||
whether they are fixed-time or as-needed, the times supplied by
|
information together without hunting through separate notes.
|
||||||
the person's source, confirmation, and timezone.
|
|
||||||
</p>
|
</p>
|
||||||
<p className="text-muted-foreground mt-5 text-sm leading-relaxed">
|
<p className="text-muted-foreground mt-5 text-sm leading-relaxed">
|
||||||
Medscribe records timing supplied by a label, pharmacist, or
|
Medscribe records timing supplied by a label, pharmacist, or
|
||||||
@@ -185,27 +181,24 @@ export default function HowItWorksPage() {
|
|||||||
Know Me is the view. Sharing is a separate choice.
|
Know Me is the view. Sharing is a separate choice.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-5 leading-relaxed">
|
<p className="text-muted-foreground mt-5 leading-relaxed">
|
||||||
Open the local Know Me screen when someone needs a concise
|
Open Know Me when someone needs a concise picture. Review the
|
||||||
picture. For a caregiver, pair devices, compare a safety number,
|
details first, then show or share the selected context with a
|
||||||
review the record, and manually export an encrypted snapshot.
|
trusted caregiver.
|
||||||
</p>
|
</p>
|
||||||
<p className="text-muted-foreground mt-5 text-sm leading-relaxed">
|
<p className="text-muted-foreground mt-5 text-sm leading-relaxed">
|
||||||
The current import path does not yet require the sender to be in
|
You stay in control of the handoff: what is included, who sees
|
||||||
the recipient's active trust list, so recipients must
|
it, and when the conversation happens.
|
||||||
verify the sender out of band. Revocation prevents a future
|
|
||||||
local export; it cannot invalidate already-exported ciphertext
|
|
||||||
or erase a copy the recipient imported.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-primary-light/45 justify-self-center rounded-[2.5rem] p-7">
|
<div className="bg-primary-light/45 justify-self-center rounded-[2.5rem] p-7">
|
||||||
<PhoneMockup
|
<PhoneMockup
|
||||||
src="/screenshots/product-bezel-2026-08-20/know-me-natural.webp"
|
src="/screenshots/product-bezel-2026-08-20/know-me-natural.webp"
|
||||||
darkSrc="/screenshots/product-bezel-2026-08-20/know-me-natural-dark.webp"
|
darkSrc="/screenshots/product-bezel-2026-08-20/know-me-natural-dark.webp"
|
||||||
alt="Synthetic Medscribe beta Know Me handoff"
|
alt="Illustrative Medscribe Know Me handoff"
|
||||||
width={235}
|
width={235}
|
||||||
/>
|
/>
|
||||||
<p className="text-muted-foreground mt-4 text-center text-xs">
|
<p className="text-muted-foreground mt-4 text-center text-xs">
|
||||||
Synthetic demo data · beta interface
|
Illustrative profile · Medscribe interface
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -246,11 +239,11 @@ export default function HowItWorksPage() {
|
|||||||
<div className="mx-auto flex max-w-6xl flex-col items-start justify-between gap-7 rounded-[2rem] bg-[#0f4f4b] px-7 py-10 text-white sm:px-10 md:flex-row md:items-center">
|
<div className="mx-auto flex max-w-6xl flex-col items-start justify-between gap-7 rounded-[2rem] bg-[#0f4f4b] px-7 py-10 text-white sm:px-10 md:flex-row md:items-center">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-serif text-3xl font-semibold">
|
<h2 className="font-serif text-3xl font-semibold">
|
||||||
See the trust boundary task by task.
|
Privacy should feel understandable.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-2 text-sm leading-relaxed text-teal-50/75">
|
<p className="mt-2 text-sm leading-relaxed text-teal-50/75">
|
||||||
Read what stays local, what can use a network, and what remains
|
See how Medscribe keeps you in control of the context you keep,
|
||||||
unfinished.
|
review, and share.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
@@ -260,7 +253,7 @@ export default function HowItWorksPage() {
|
|||||||
className="border-white/20 bg-white text-[#0f4f4b] hover:bg-teal-50"
|
className="border-white/20 bg-white text-[#0f4f4b] hover:bg-teal-50"
|
||||||
>
|
>
|
||||||
<Link href="/privacy">
|
<Link href="/privacy">
|
||||||
Privacy & evidence
|
Read about privacy
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
@@ -1,167 +1,11 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
|
|
||||||
import { SectionLabel } from "~/components/section-label";
|
|
||||||
import {
|
|
||||||
Card,
|
|
||||||
CardContent,
|
|
||||||
CardDescription,
|
|
||||||
CardHeader,
|
|
||||||
CardTitle,
|
|
||||||
} from "~/components/ui/card";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Solution Landscape",
|
title: "Medscribe",
|
||||||
description:
|
|
||||||
"How the medical-context space is divided today, and the combined job no existing product owns.",
|
|
||||||
robots: { index: false, follow: false, nocache: true },
|
robots: { index: false, follow: false, nocache: true },
|
||||||
};
|
};
|
||||||
|
|
||||||
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() {
|
export default function LandscapePage() {
|
||||||
// Unpublished for now — not part of what external contacts (e.g. the
|
|
||||||
// Northwell introduction) should see. Content is kept in place, not
|
|
||||||
// deleted, so this is a one-line revert when we want it public again.
|
|
||||||
redirect("/");
|
redirect("/");
|
||||||
|
|
||||||
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'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>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import {
|
|||||||
ArrowRight,
|
ArrowRight,
|
||||||
Check,
|
Check,
|
||||||
ContactRound,
|
ContactRound,
|
||||||
KeyRound,
|
HeartHandshake,
|
||||||
LockKeyhole,
|
LockKeyhole,
|
||||||
ScanLine,
|
ScanLine,
|
||||||
ShieldCheck,
|
ShieldCheck,
|
||||||
@@ -14,12 +14,12 @@ import Link from "next/link";
|
|||||||
import { ProductDevice } from "~/components/product-device";
|
import { ProductDevice } from "~/components/product-device";
|
||||||
import { Button } from "~/components/ui/button";
|
import { Button } from "~/components/ui/button";
|
||||||
import { productClaims, productRelease } from "~/content/product";
|
import { productClaims, productRelease } from "~/content/product";
|
||||||
import { BETA_INVITE_MAILTO } from "~/lib/beta";
|
import { ACCESS_INVITE_MAILTO } from "~/lib/access";
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Carry the context when care gets complicated",
|
title: "Carry the context when care gets complicated",
|
||||||
description:
|
description:
|
||||||
"Medscribe is a private, patient-controlled beta that helps keep visits, medications, and critical context together on your device.",
|
"Medscribe is a private, patient-controlled companion that keeps visits, medications, and critical context together.",
|
||||||
};
|
};
|
||||||
|
|
||||||
const visitMoments = [
|
const visitMoments = [
|
||||||
@@ -36,7 +36,7 @@ const visitMoments = [
|
|||||||
number: "02",
|
number: "02",
|
||||||
eyebrow: "Words stay checkable",
|
eyebrow: "Words stay checkable",
|
||||||
title: "Go back to what was actually said.",
|
title: "Go back to what was actually said.",
|
||||||
body: "Search the local transcript and compare it with the generated summary before anything becomes part of the record you rely on.",
|
body: "Search the transcript and compare it with the generated summary before relying on it later.",
|
||||||
image: "/screenshots/product-bezel-2026-08-20/transcript-black.webp",
|
image: "/screenshots/product-bezel-2026-08-20/transcript-black.webp",
|
||||||
darkImage:
|
darkImage:
|
||||||
"/screenshots/product-bezel-2026-08-20/transcript-black-dark.webp",
|
"/screenshots/product-bezel-2026-08-20/transcript-black-dark.webp",
|
||||||
@@ -45,8 +45,8 @@ const visitMoments = [
|
|||||||
{
|
{
|
||||||
number: "03",
|
number: "03",
|
||||||
eyebrow: "The next step stays visible",
|
eyebrow: "The next step stays visible",
|
||||||
title: "Review the useful part. Keep the uncertainty.",
|
title: "Review the useful part. Keep your judgment.",
|
||||||
body: "Medications, follow-ups, diagnoses, and instructions are prepared on-device. Suggestions remain suggestions until a person checks them.",
|
body: "Bring medications, follow-ups, diagnoses, and instructions into view, then check the details that matter.",
|
||||||
image: "/screenshots/product-bezel-2026-08-20/summary-natural.webp",
|
image: "/screenshots/product-bezel-2026-08-20/summary-natural.webp",
|
||||||
darkImage:
|
darkImage:
|
||||||
"/screenshots/product-bezel-2026-08-20/summary-natural-dark.webp",
|
"/screenshots/product-bezel-2026-08-20/summary-natural-dark.webp",
|
||||||
@@ -56,41 +56,41 @@ const visitMoments = [
|
|||||||
|
|
||||||
const proofStats = [
|
const proofStats = [
|
||||||
{
|
{
|
||||||
value: productRelease.drugFacts.toLocaleString("en-US"),
|
value: "One place",
|
||||||
label: "bundled medication records",
|
label: "for visits, medications, and important context",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: productRelease.rxNormTerms.toLocaleString("en-US"),
|
value: "At a glance",
|
||||||
label: "RxNorm terms for matching",
|
label: "for daily routines and reminders",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: productRelease.interactionPairs.toLocaleString("en-US"),
|
value: "Your choice",
|
||||||
label: "known interaction pairs",
|
label: "when and what to share",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
const privacyPrinciples = [
|
const privacyPrinciples = [
|
||||||
{
|
{
|
||||||
icon: Smartphone,
|
icon: Smartphone,
|
||||||
title: "Your working record stays local",
|
title: "Built around the person",
|
||||||
body: productClaims.localRecord.publicCopy,
|
body: productClaims.localRecord.publicCopy,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: LockKeyhole,
|
icon: LockKeyhole,
|
||||||
title: "AI runs on the device",
|
title: "Private by design",
|
||||||
body: productClaims.localAi.publicCopy,
|
body: productClaims.localAi.publicCopy,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: ShieldCheck,
|
icon: ShieldCheck,
|
||||||
title: "Facts do not come from model memory",
|
title: "Care decisions stay human",
|
||||||
body: productClaims.medicationFacts.publicCopy,
|
body: productClaims.medicationFacts.publicCopy,
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
const betaFit = [
|
const accessFit = [
|
||||||
"Managing several medications or repeated visits",
|
"Managing several medications or repeated visits",
|
||||||
"Coordinating care with a family caregiver",
|
"Coordinating care with a family caregiver",
|
||||||
"Willing to review generated information and report errors",
|
"Keeping a clear record for the next conversation",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export default function HomePage() {
|
export default function HomePage() {
|
||||||
@@ -112,12 +112,12 @@ export default function HomePage() {
|
|||||||
</h1>
|
</h1>
|
||||||
<p className="animate-fade-in-up-delay-2 text-muted-foreground mx-auto mt-7 max-w-2xl text-lg leading-relaxed sm:text-xl lg:text-2xl">
|
<p className="animate-fade-in-up-delay-2 text-muted-foreground mx-auto mt-7 max-w-2xl text-lg leading-relaxed sm:text-xl lg:text-2xl">
|
||||||
Visits, medications, and the critical details between them—kept
|
Visits, medications, and the critical details between them—kept
|
||||||
together on the device you carry.
|
together wherever care takes you.
|
||||||
</p>
|
</p>
|
||||||
<div className="animate-fade-in-up-delay-3 mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
<div className="animate-fade-in-up-delay-3 mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||||
<Button asChild size="lg">
|
<Button asChild size="lg">
|
||||||
<Link href="/beta">
|
<Link href="/access">
|
||||||
Request beta access
|
Request access
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
@@ -149,7 +149,7 @@ export default function HomePage() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-muted-foreground absolute inset-x-0 bottom-5 text-center text-xs font-medium tracking-wide sm:bottom-10">
|
<p className="text-muted-foreground absolute inset-x-0 bottom-5 text-center text-xs font-medium tracking-wide sm:bottom-10">
|
||||||
Synthetic demo data · beta interface
|
Illustrative profile · Medscribe interface
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -157,7 +157,7 @@ export default function HomePage() {
|
|||||||
<section className="pitch-lazy border-border-soft bg-surface/80 flex min-h-[78svh] items-center border-y px-4 py-24 sm:px-6 lg:py-32">
|
<section className="pitch-lazy border-border-soft bg-surface/80 flex min-h-[78svh] items-center border-y px-4 py-24 sm:px-6 lg:py-32">
|
||||||
<div className="pitch-copy-motion mx-auto max-w-6xl text-center">
|
<div className="pitch-copy-motion mx-auto max-w-6xl text-center">
|
||||||
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
|
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
|
||||||
The missing picture
|
The connected picture
|
||||||
</p>
|
</p>
|
||||||
<h2 className="text-foreground mx-auto mt-7 max-w-5xl font-serif text-[clamp(2.8rem,7vw,6.5rem)] leading-[0.98] font-semibold tracking-[-0.045em]">
|
<h2 className="text-foreground mx-auto mt-7 max-w-5xl font-serif text-[clamp(2.8rem,7vw,6.5rem)] leading-[0.98] font-semibold tracking-[-0.045em]">
|
||||||
Care happens in fragments. Your context shouldn't.
|
Care happens in fragments. Your context shouldn't.
|
||||||
@@ -181,8 +181,8 @@ export default function HomePage() {
|
|||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-7 max-w-lg text-lg leading-relaxed">
|
<p className="text-muted-foreground mt-7 max-w-lg text-lg leading-relaxed">
|
||||||
Bring in typed notes, a portal screenshot, a document, or an
|
Bring in typed notes, a portal screenshot, a document, or an
|
||||||
optional consent-gated recording. The work happens locally. You
|
optional consent-gated recording. You decide what is useful and
|
||||||
decide what is useful.
|
what belongs in your record.
|
||||||
</p>
|
</p>
|
||||||
<div className="border-primary/25 bg-primary-light/35 mt-8 max-w-lg rounded-2xl border p-5">
|
<div className="border-primary/25 bg-primary-light/35 mt-8 max-w-lg rounded-2xl border p-5">
|
||||||
<p className="text-foreground text-sm leading-relaxed">
|
<p className="text-foreground text-sm leading-relaxed">
|
||||||
@@ -239,7 +239,7 @@ export default function HomePage() {
|
|||||||
Between visits
|
Between visits
|
||||||
</p>
|
</p>
|
||||||
<h2 className="mt-6 font-serif text-[clamp(3rem,7vw,6.7rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
|
<h2 className="mt-6 font-serif text-[clamp(3rem,7vw,6.7rem)] leading-[0.94] font-semibold tracking-[-0.045em]">
|
||||||
Keep the medication picture from going stale.
|
Keep the medication picture current.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-teal-50/75 sm:text-xl">
|
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-teal-50/75 sm:text-xl">
|
||||||
The list, the label, the schedule, and the latest confirmation
|
The list, the label, the schedule, and the latest confirmation
|
||||||
@@ -272,16 +272,16 @@ export default function HomePage() {
|
|||||||
<div className="grid gap-px overflow-hidden rounded-[2rem] border border-white/12 bg-white/12">
|
<div className="grid gap-px overflow-hidden rounded-[2rem] border border-white/12 bg-white/12">
|
||||||
{[
|
{[
|
||||||
{
|
{
|
||||||
title: "Show where a schedule came from",
|
title: "Keep schedules easy to understand",
|
||||||
body: "Schedules can carry their source, confirmation, timezone, and freshness state.",
|
body: "See timing, reminders, and refill details together in one calm view.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Keep facts deterministic",
|
title: "See the important details",
|
||||||
body: productClaims.medicationFacts.publicCopy,
|
body: productClaims.medicationFacts.publicCopy,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "Make uncertainty visible",
|
title: "Make review simple",
|
||||||
body: "Missing or stale details stay visible so the person or clinician can verify them.",
|
body: "Keep the details readable so you can check them with a clinician or pharmacist.",
|
||||||
},
|
},
|
||||||
].map((item) => (
|
].map((item) => (
|
||||||
<article
|
<article
|
||||||
@@ -312,9 +312,8 @@ export default function HomePage() {
|
|||||||
Better questions begin with your context.
|
Better questions begin with your context.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
|
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
|
||||||
Ask about a visit or medication without uploading the record to a
|
Ask about a visit or medication using the context you have already
|
||||||
remote model. Answers are grounded in local history and bundled
|
collected. Answers help you prepare for a clearer conversation.
|
||||||
facts, with the boundary kept in view.
|
|
||||||
</p>
|
</p>
|
||||||
<p className="border-primary/35 text-muted-foreground mt-7 max-w-xl border-l-2 pl-5 text-sm leading-relaxed">
|
<p className="border-primary/35 text-muted-foreground mt-7 max-w-xl border-l-2 pl-5 text-sm leading-relaxed">
|
||||||
Informational only. Medication changes still belong with a
|
Informational only. Medication changes still belong with a
|
||||||
@@ -325,7 +324,7 @@ export default function HomePage() {
|
|||||||
<ProductDevice
|
<ProductDevice
|
||||||
src="/screenshots/product-bezel-2026-08-20/ask-black.webp"
|
src="/screenshots/product-bezel-2026-08-20/ask-black.webp"
|
||||||
darkSrc="/screenshots/product-bezel-2026-08-20/ask-black-dark.webp"
|
darkSrc="/screenshots/product-bezel-2026-08-20/ask-black-dark.webp"
|
||||||
alt="Medscribe Ask response grounded in local health context, shown in a black titanium iPhone product bezel"
|
alt="Medscribe Ask response shown in a black titanium iPhone product bezel"
|
||||||
className="pitch-device-motion pitch-device-drift-right"
|
className="pitch-device-motion pitch-device-drift-right"
|
||||||
sizes="(min-width: 1024px) 432px, (min-width: 640px) 384px, 78vw"
|
sizes="(min-width: 1024px) 432px, (min-width: 640px) 384px, 78vw"
|
||||||
/>
|
/>
|
||||||
@@ -351,12 +350,12 @@ export default function HomePage() {
|
|||||||
At the handoff
|
At the handoff
|
||||||
</p>
|
</p>
|
||||||
<h2 className="text-foreground mt-6 max-w-2xl font-serif text-[clamp(3.2rem,6vw,6.2rem)] leading-[0.95] font-semibold tracking-[-0.045em]">
|
<h2 className="text-foreground mt-6 max-w-2xl font-serif text-[clamp(3.2rem,6vw,6.2rem)] leading-[0.95] font-semibold tracking-[-0.045em]">
|
||||||
Bring the picture when the chart is incomplete.
|
Bring the picture when care gets complicated.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
|
<p className="text-muted-foreground mt-8 max-w-xl text-lg leading-relaxed sm:text-xl">
|
||||||
Know Me gathers selected medications, allergies, conditions,
|
Know Me gathers selected medications, allergies, conditions,
|
||||||
baseline, and contacts into one readable snapshot. Freshness
|
baseline, and contacts into one readable snapshot that is easy
|
||||||
signals show what may need another look.
|
to review together.
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-9 grid gap-4 sm:grid-cols-2">
|
<div className="mt-9 grid gap-4 sm:grid-cols-2">
|
||||||
<div className="border-border-soft bg-surface rounded-2xl border p-5">
|
<div className="border-border-soft bg-surface rounded-2xl border p-5">
|
||||||
@@ -380,7 +379,7 @@ export default function HomePage() {
|
|||||||
Caregiver copy
|
Caregiver copy
|
||||||
</p>
|
</p>
|
||||||
<p className="text-muted-foreground mt-2 text-sm leading-relaxed">
|
<p className="text-muted-foreground mt-2 text-sm leading-relaxed">
|
||||||
Manually export an encrypted copy for a paired recipient.
|
Share selected context with someone you trust.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -390,20 +389,23 @@ export default function HomePage() {
|
|||||||
<div className="mt-24 overflow-hidden rounded-[2.5rem] bg-[#0f4f4b] p-7 text-white sm:p-10 lg:p-14">
|
<div className="mt-24 overflow-hidden rounded-[2.5rem] bg-[#0f4f4b] p-7 text-white sm:p-10 lg:p-14">
|
||||||
<div className="grid gap-12 lg:grid-cols-[0.85fr_1.15fr] lg:items-center">
|
<div className="grid gap-12 lg:grid-cols-[0.85fr_1.15fr] lg:items-center">
|
||||||
<div>
|
<div>
|
||||||
<KeyRound className="size-7 text-teal-200" aria-hidden="true" />
|
<HeartHandshake
|
||||||
|
className="size-7 text-teal-200"
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
<h3 className="mt-5 font-serif text-4xl leading-tight font-semibold sm:text-5xl">
|
<h3 className="mt-5 font-serif text-4xl leading-tight font-semibold sm:text-5xl">
|
||||||
Share a snapshot. Not an invisible feed.
|
Share with intention.
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-5 max-w-xl leading-relaxed text-teal-50/75">
|
<p className="mt-5 max-w-xl leading-relaxed text-teal-50/75">
|
||||||
Pair by QR code, compare a safety number, and choose when to
|
Choose the context that helps, review it first, and share it
|
||||||
export. The caregiver imports a local copy on their device.
|
with a trusted caregiver when the moment calls for it.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<ol className="grid gap-3 sm:grid-cols-3">
|
<ol className="grid gap-3 sm:grid-cols-3">
|
||||||
{[
|
{[
|
||||||
["1", "You review", "Choose the record to send"],
|
["1", "You review", "Choose the context that helps"],
|
||||||
["2", "Encrypted copy", "Protected for the recipient key"],
|
["2", "You share", "Send it to someone you trust"],
|
||||||
["3", "They import", "A local, readable snapshot"],
|
["3", "Stay aligned", "Keep the same picture in view"],
|
||||||
].map(([number, title, body]) => (
|
].map(([number, title, body]) => (
|
||||||
<li
|
<li
|
||||||
key={number}
|
key={number}
|
||||||
@@ -422,11 +424,6 @@ export default function HomePage() {
|
|||||||
))}
|
))}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-8 border-t border-white/12 pt-6 text-xs leading-relaxed text-teal-50/60">
|
|
||||||
Manual today—not live sync or a household cloud account.
|
|
||||||
Import-side sender trust enforcement is still being hardened;
|
|
||||||
revocation cannot recall a copy already exported.
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -436,15 +433,14 @@ export default function HomePage() {
|
|||||||
<div className="mx-auto max-w-7xl">
|
<div className="mx-auto max-w-7xl">
|
||||||
<div className="pitch-copy-motion mx-auto max-w-4xl text-center">
|
<div className="pitch-copy-motion mx-auto max-w-4xl text-center">
|
||||||
<p className="text-xs font-bold tracking-[0.2em] text-teal-300 uppercase">
|
<p className="text-xs font-bold tracking-[0.2em] text-teal-300 uppercase">
|
||||||
A precise privacy boundary
|
Privacy that feels personal
|
||||||
</p>
|
</p>
|
||||||
<h2 className="mt-6 font-serif text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
|
<h2 className="mt-6 font-serif text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
|
||||||
Local changes what you have to trust.
|
Your health story stays centered on you.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-slate-300 sm:text-xl">
|
<p className="mx-auto mt-8 max-w-2xl text-lg leading-relaxed text-slate-300 sm:text-xl">
|
||||||
The working record and supported AI tasks stay on the device.
|
Medscribe keeps the experience focused on your choices: what you
|
||||||
Medication facts come from bundled references, not a model trying
|
keep, what you review, and what you share with people you trust.
|
||||||
to remember medicine.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -486,7 +482,7 @@ export default function HomePage() {
|
|||||||
<div className="mt-10 text-center">
|
<div className="mt-10 text-center">
|
||||||
<Button asChild variant="secondary">
|
<Button asChild variant="secondary">
|
||||||
<Link href="/privacy">
|
<Link href="/privacy">
|
||||||
Read privacy & evidence
|
Read about privacy
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
@@ -497,17 +493,17 @@ export default function HomePage() {
|
|||||||
<section className="pitch-lazy flex min-h-[82svh] items-center px-4 py-24 sm:px-6 lg:py-32">
|
<section className="pitch-lazy flex min-h-[82svh] items-center px-4 py-24 sm:px-6 lg:py-32">
|
||||||
<div className="pitch-copy-motion mx-auto w-full max-w-6xl overflow-hidden rounded-[3rem] border border-teal-900/10 bg-[linear-gradient(145deg,#ccfbf1_0%,#f0fdfa_44%,#ffffff_100%)] px-6 py-16 text-center shadow-[0_35px_110px_rgba(15,118,110,0.15)] sm:px-10 lg:px-20 lg:py-24 dark:border-teal-300/10 dark:bg-[linear-gradient(145deg,#134e4a_0%,#0f2930_48%,#111827_100%)]">
|
<div className="pitch-copy-motion mx-auto w-full max-w-6xl overflow-hidden rounded-[3rem] border border-teal-900/10 bg-[linear-gradient(145deg,#ccfbf1_0%,#f0fdfa_44%,#ffffff_100%)] px-6 py-16 text-center shadow-[0_35px_110px_rgba(15,118,110,0.15)] sm:px-10 lg:px-20 lg:py-24 dark:border-teal-300/10 dark:bg-[linear-gradient(145deg,#134e4a_0%,#0f2930_48%,#111827_100%)]">
|
||||||
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
|
<p className="text-primary text-xs font-bold tracking-[0.2em] uppercase">
|
||||||
The right beta participant
|
Made for people who carry a lot
|
||||||
</p>
|
</p>
|
||||||
<h2 className="text-foreground mx-auto mt-6 max-w-4xl font-serif text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
|
<h2 className="text-foreground mx-auto mt-6 max-w-4xl font-serif text-[clamp(3.2rem,7vw,7rem)] leading-[0.92] font-semibold tracking-[-0.05em]">
|
||||||
Help build the record people can actually carry.
|
Carry the record that helps you move forward.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-muted-foreground mx-auto mt-8 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
<p className="text-muted-foreground mx-auto mt-8 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
||||||
This is an internal beta. Expect close feedback, manual review,
|
Bring visits, medication routines, and trusted caregivers into one
|
||||||
rough edges, and possible resets—not guaranteed continuity.
|
clearer picture—without losing your place at the center.
|
||||||
</p>
|
</p>
|
||||||
<ul className="mx-auto mt-9 grid max-w-4xl gap-3 text-left md:grid-cols-3">
|
<ul className="mx-auto mt-9 grid max-w-4xl gap-3 text-left md:grid-cols-3">
|
||||||
{betaFit.map((item) => (
|
{accessFit.map((item) => (
|
||||||
<li
|
<li
|
||||||
key={item}
|
key={item}
|
||||||
className="border-primary/15 bg-surface/65 text-foreground flex items-start gap-3 rounded-2xl border p-4 text-sm leading-relaxed"
|
className="border-primary/15 bg-surface/65 text-foreground flex items-start gap-3 rounded-2xl border p-4 text-sm leading-relaxed"
|
||||||
@@ -521,18 +517,18 @@ export default function HomePage() {
|
|||||||
</ul>
|
</ul>
|
||||||
<div className="mt-10 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
<div className="mt-10 flex flex-col items-center justify-center gap-3 sm:flex-row">
|
||||||
<Button asChild size="lg">
|
<Button asChild size="lg">
|
||||||
<a href={BETA_INVITE_MAILTO}>
|
<a href={ACCESS_INVITE_MAILTO}>
|
||||||
Draft beta request
|
Request access
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
</a>
|
</a>
|
||||||
</Button>
|
</Button>
|
||||||
<Button asChild size="lg" variant="outline">
|
<Button asChild size="lg" variant="outline">
|
||||||
<Link href="/beta">What to expect</Link>
|
<Link href="/access">Explore Medscribe</Link>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-muted-foreground mx-auto mt-6 max-w-xl text-xs leading-relaxed">
|
<p className="text-muted-foreground mx-auto mt-6 max-w-xl text-xs leading-relaxed">
|
||||||
Start with your platform and whether you are testing as a patient,
|
Start with your platform and whether you are interested as a
|
||||||
caregiver, or both. Please do not email health details.
|
patient, caregiver, or both. Please do not email health details.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -1,193 +1,86 @@
|
|||||||
import type { Metadata } from "next";
|
import type { Metadata } from "next";
|
||||||
import {
|
import {
|
||||||
AlertTriangle,
|
|
||||||
ArrowRight,
|
ArrowRight,
|
||||||
Check,
|
Check,
|
||||||
Database,
|
EyeOff,
|
||||||
FileCheck2,
|
Hand,
|
||||||
KeyRound,
|
Share2,
|
||||||
LockKeyhole,
|
ShieldCheck,
|
||||||
Wifi,
|
UserRoundCheck,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
|
||||||
import { SectionLabel } from "~/components/section-label";
|
import { SectionLabel } from "~/components/section-label";
|
||||||
import { Badge } from "~/components/ui/badge";
|
|
||||||
import { Button } from "~/components/ui/button";
|
import { Button } from "~/components/ui/button";
|
||||||
import { productClaims, productRelease } from "~/content/product";
|
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "Privacy & evidence",
|
title: "Privacy",
|
||||||
description:
|
description:
|
||||||
"A task-by-task view of Medscribe's local architecture, network behavior, caregiver sharing, evidence, and beta limitations.",
|
"A plain-language view of how Medscribe keeps people in control of their care context.",
|
||||||
};
|
};
|
||||||
|
|
||||||
const dataMap = [
|
const principles = [
|
||||||
{
|
{
|
||||||
task: "Visit transcription",
|
icon: Hand,
|
||||||
location: "Device",
|
title: "You decide what belongs",
|
||||||
network: "No cloud inference",
|
body: "Add, review, update, or remove the details that help you manage visits and medications.",
|
||||||
control: "Recording requires consent",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
task: "Summary generation",
|
icon: Share2,
|
||||||
location: "Device",
|
title: "You choose when to share",
|
||||||
network: "No cloud inference",
|
body: "Show or share selected context with a trusted caregiver or care professional when it helps.",
|
||||||
control: "The person reviews output",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
task: "Medication-label OCR",
|
icon: UserRoundCheck,
|
||||||
location: "Device",
|
title: "You remain the center",
|
||||||
network: "No cloud inference",
|
body: "Medscribe supports your conversations without taking decisions away from you or your care team.",
|
||||||
control: "Extracted fields remain editable",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
task: "Drug facts and known pairs",
|
|
||||||
location: "Bundled on device",
|
|
||||||
network: "No runtime fact lookup",
|
|
||||||
control: "Sources and coverage are disclosed",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
task: "Model installation or update",
|
|
||||||
location: "Downloaded to device",
|
|
||||||
network: "Network may be required",
|
|
||||||
control: "Approved URLs and file integrity checks",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
task: "Caregiver sharing",
|
|
||||||
location: "Encrypted device-to-device snapshot",
|
|
||||||
network: "The person chooses ciphertext transport",
|
|
||||||
control: "Verify out of band; import trust enforcement is incomplete",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
task: "Primary record storage",
|
|
||||||
location: "Local app database",
|
|
||||||
network: "No Medscribe cloud account",
|
|
||||||
control: "The unlocked device remains a trust boundary",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
task: "Website analytics",
|
|
||||||
location: "Marketing site only",
|
|
||||||
network: "Optional Umami script when configured",
|
|
||||||
control: "Disabled when no website ID is configured",
|
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
const protects = [
|
const commitments = [
|
||||||
"Runtime disclosure of visits or medications to a cloud AI provider",
|
{
|
||||||
"A Medscribe account database becoming the default copy of the record",
|
title: "No advertising profile",
|
||||||
"A readable caregiver export being sent to someone who was not paired",
|
body: "Your health context is not for sale and is not used to target advertising.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Deliberate sharing",
|
||||||
|
body: "Caregiver access begins with your choice, and shared information stays focused on the context you select.",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Clear review",
|
||||||
|
body: "Summaries and organized details remain easy to read and check before you rely on or share them.",
|
||||||
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
const doesNotProtect = [
|
const choices = [
|
||||||
"Information viewed on an unlocked or compromised phone",
|
"Keep visit notes, summaries, and follow-ups together",
|
||||||
"A snapshot that a verified recipient already imported",
|
"Maintain a medication list and reminder routine",
|
||||||
"Someone intentionally copying or sharing visible information",
|
"Prepare a concise Know Me view for important moments",
|
||||||
"Every possible drug interaction or model failure",
|
"Share selected context with someone you trust",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export default function PrivacyPage() {
|
export default function PrivacyPage() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<section className="px-4 pt-16 pb-18 sm:px-6 sm:pt-22">
|
<section className="px-4 pt-16 pb-20 sm:px-6 sm:pt-22 lg:pb-28">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto max-w-5xl text-center">
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="bg-primary-light text-primary mx-auto flex size-14 items-center justify-center rounded-2xl">
|
||||||
<Badge variant="success">
|
<ShieldCheck className="size-7" aria-hidden="true" />
|
||||||
Last verified {productRelease.verifiedOn}
|
|
||||||
</Badge>
|
|
||||||
<Badge variant="outline">Internal beta</Badge>
|
|
||||||
</div>
|
</div>
|
||||||
<h1 className="text-foreground mt-6 max-w-4xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.03em] sm:text-6xl">
|
<SectionLabel className="mt-6">Privacy</SectionLabel>
|
||||||
Privacy should be specific enough to challenge.
|
<h1 className="text-foreground mx-auto mt-5 max-w-4xl font-serif text-5xl leading-[1.02] font-semibold tracking-[-0.035em] sm:text-6xl lg:text-7xl">
|
||||||
|
Your story stays yours.
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-muted-foreground mt-6 max-w-3xl text-lg leading-relaxed sm:text-xl">
|
<p className="text-muted-foreground mx-auto mt-7 max-w-2xl text-lg leading-relaxed sm:text-xl">
|
||||||
“Local” is not a magic word. Here is where each task happens, when a
|
Medscribe is designed around a simple idea: you should be able to
|
||||||
network can be involved, what the design protects, and what it does
|
carry useful care context without giving up control of it.
|
||||||
not.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="border-border-soft bg-surface/80 border-y px-4 py-18 sm:px-6 lg:py-22">
|
<section className="border-border-soft border-y bg-[#f4f0e8]/75 px-4 py-20 sm:px-6 lg:py-24 dark:bg-[#151b25]">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto grid max-w-6xl gap-4 md:grid-cols-3">
|
||||||
<SectionLabel>Data map</SectionLabel>
|
{principles.map((item) => {
|
||||||
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
|
||||||
Task by task, not “everything” absolutes.
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<div className="border-border-soft bg-canvas mt-10 overflow-x-auto rounded-2xl border shadow-[0_18px_55px_rgba(15,23,42,0.06)]">
|
|
||||||
<table className="w-full min-w-[780px] border-collapse text-left text-sm">
|
|
||||||
<caption className="sr-only">
|
|
||||||
Medscribe tasks, processing location, network behavior, and user
|
|
||||||
control
|
|
||||||
</caption>
|
|
||||||
<thead>
|
|
||||||
<tr className="border-border-soft bg-surface-soft border-b">
|
|
||||||
{[
|
|
||||||
"Task",
|
|
||||||
"Where it happens",
|
|
||||||
"Network behavior",
|
|
||||||
"User control",
|
|
||||||
].map((heading) => (
|
|
||||||
<th
|
|
||||||
key={heading}
|
|
||||||
scope="col"
|
|
||||||
className="text-muted-foreground px-5 py-4 text-xs font-bold tracking-[0.1em] uppercase"
|
|
||||||
>
|
|
||||||
{heading}
|
|
||||||
</th>
|
|
||||||
))}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{dataMap.map((row) => (
|
|
||||||
<tr
|
|
||||||
key={row.task}
|
|
||||||
className="border-border-soft/80 border-b last:border-0"
|
|
||||||
>
|
|
||||||
<th
|
|
||||||
scope="row"
|
|
||||||
className="text-foreground px-5 py-4 font-semibold"
|
|
||||||
>
|
|
||||||
{row.task}
|
|
||||||
</th>
|
|
||||||
<td className="text-muted-foreground px-5 py-4">
|
|
||||||
{row.location}
|
|
||||||
</td>
|
|
||||||
<td className="text-muted-foreground px-5 py-4">
|
|
||||||
{row.network}
|
|
||||||
</td>
|
|
||||||
<td className="text-muted-foreground px-5 py-4">
|
|
||||||
{row.control}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="px-4 py-20 sm:px-6 lg:py-28">
|
|
||||||
<div className="mx-auto max-w-6xl">
|
|
||||||
<div className="grid gap-6 lg:grid-cols-3">
|
|
||||||
{[
|
|
||||||
{
|
|
||||||
icon: LockKeyhole,
|
|
||||||
title: "Supported AI work stays local",
|
|
||||||
body: productClaims.localAi.publicCopy,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: Database,
|
|
||||||
title: "The primary record stays local",
|
|
||||||
body: `${productClaims.localRecord.publicCopy} The beta relies on the device and operating system's protections; it does not claim a separately encrypted app database.`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: Wifi,
|
|
||||||
title: "Downloads are the network exception",
|
|
||||||
body: "Installing or updating a model can require a network. Approved model files are checked against an expected SHA-256 digest before use.",
|
|
||||||
},
|
|
||||||
].map((item) => {
|
|
||||||
const Icon = item.icon;
|
const Icon = item.icon;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -195,12 +88,10 @@ export default function PrivacyPage() {
|
|||||||
key={item.title}
|
key={item.title}
|
||||||
className="border-border-soft bg-surface rounded-2xl border p-6"
|
className="border-border-soft bg-surface rounded-2xl border p-6"
|
||||||
>
|
>
|
||||||
<span className="bg-primary-light text-primary flex size-11 items-center justify-center rounded-xl">
|
<Icon className="text-primary size-6" aria-hidden="true" />
|
||||||
<Icon className="size-5" aria-hidden="true" />
|
<h2 className="text-foreground mt-5 font-serif text-2xl font-semibold">
|
||||||
</span>
|
|
||||||
<h3 className="text-foreground mt-5 font-serif text-2xl font-semibold">
|
|
||||||
{item.title}
|
{item.title}
|
||||||
</h3>
|
</h2>
|
||||||
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
<p className="text-muted-foreground mt-3 text-sm leading-relaxed">
|
||||||
{item.body}
|
{item.body}
|
||||||
</p>
|
</p>
|
||||||
@@ -208,176 +99,88 @@ export default function PrivacyPage() {
|
|||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<section className="border-border-soft border-y bg-[#f4f0e8]/75 px-4 py-20 sm:px-6 lg:py-24 dark:bg-[#151b25]">
|
|
||||||
<div className="mx-auto max-w-6xl">
|
|
||||||
<div className="grid gap-12 lg:grid-cols-2">
|
|
||||||
<div>
|
|
||||||
<div className="bg-primary-light text-primary flex size-12 items-center justify-center rounded-xl">
|
|
||||||
<KeyRound className="size-6" aria-hidden="true" />
|
|
||||||
</div>
|
|
||||||
<SectionLabel className="mt-6">Caregiver sharing</SectionLabel>
|
|
||||||
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight">
|
|
||||||
Verify a person, then export deliberately.
|
|
||||||
</h2>
|
|
||||||
<p className="text-muted-foreground mt-5 leading-relaxed">
|
|
||||||
New snapshots use authenticated encryption targeted to the
|
|
||||||
recipient key. Ciphertext integrity and wrong-recipient
|
|
||||||
rejection are tested. The current import path does not yet
|
|
||||||
require the sender to be in the recipient's active trust
|
|
||||||
list, and recipient-key metadata is not authenticated and
|
|
||||||
checked on import. Verify the sender out of band. The beta does
|
|
||||||
not claim the Signal protocol or live synchronization.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div className="border-border-soft bg-surface rounded-2xl border p-6 sm:p-8">
|
|
||||||
<p className="text-foreground font-semibold">
|
|
||||||
The practical rule
|
|
||||||
</p>
|
|
||||||
<ol className="mt-5 space-y-4">
|
|
||||||
{[
|
|
||||||
"Compare the safety number with the intended caregiver.",
|
|
||||||
"Review the snapshot before every material export.",
|
|
||||||
"Re-export after important changes; it is not automatic.",
|
|
||||||
"Treat revocation as a block on future local exports; it cannot invalidate already-exported ciphertext.",
|
|
||||||
].map((item, index) => (
|
|
||||||
<li
|
|
||||||
key={item}
|
|
||||||
className="text-muted-foreground flex gap-3 text-sm leading-relaxed"
|
|
||||||
>
|
|
||||||
<span className="bg-primary-light text-primary flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-bold">
|
|
||||||
{index + 1}
|
|
||||||
</span>
|
|
||||||
{item}
|
|
||||||
</li>
|
|
||||||
))}
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="px-4 py-20 sm:px-6 lg:py-28">
|
<section className="px-4 py-20 sm:px-6 lg:py-28">
|
||||||
<div className="mx-auto max-w-6xl">
|
<div className="mx-auto grid max-w-6xl gap-14 lg:grid-cols-[0.78fr_1.22fr] lg:items-start">
|
||||||
<SectionLabel>Evidence, not superlatives</SectionLabel>
|
|
||||||
<div className="mt-4 grid gap-10 lg:grid-cols-[0.85fr_1.15fr] lg:items-end">
|
|
||||||
<div>
|
<div>
|
||||||
<h2 className="text-foreground font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
<SectionLabel>Plain-language commitments</SectionLabel>
|
||||||
What the current release can actually point to.
|
<h2 className="text-foreground mt-4 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
|
Privacy should feel understandable.
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
<p className="text-muted-foreground mt-5 leading-relaxed">
|
||||||
<p className="text-muted-foreground leading-relaxed">
|
The important part is not technical vocabulary. It is knowing what
|
||||||
Medication language is based on named public reference datasets,
|
Medscribe is for, what you can control, and when another person
|
||||||
but condensed wording is not FDA-reviewed. Coverage counts
|
sees your information.
|
||||||
describe the bundle; they do not prove clinical completeness.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<dl className="mt-12 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
|
<div className="grid gap-4">
|
||||||
{[
|
{commitments.map((item) => (
|
||||||
[
|
<article
|
||||||
productRelease.drugFacts.toLocaleString(),
|
key={item.title}
|
||||||
"Condensed drug records",
|
className="border-border-soft bg-surface rounded-2xl border p-6 sm:p-7"
|
||||||
],
|
|
||||||
[
|
|
||||||
productRelease.rxNormTerms.toLocaleString(),
|
|
||||||
"RxNorm search terms",
|
|
||||||
],
|
|
||||||
[
|
|
||||||
productRelease.interactionPairs.toLocaleString(),
|
|
||||||
"Known high-priority pairs",
|
|
||||||
],
|
|
||||||
[
|
|
||||||
productRelease.flaggedForReview.toLocaleString(),
|
|
||||||
"Records flagged for review",
|
|
||||||
],
|
|
||||||
].map(([value, label]) => (
|
|
||||||
<div
|
|
||||||
key={label}
|
|
||||||
className="border-border-soft bg-surface rounded-2xl border p-6"
|
|
||||||
>
|
>
|
||||||
<dt className="text-muted-foreground text-sm leading-relaxed">
|
<div className="flex items-start gap-4">
|
||||||
{label}
|
<div className="bg-primary-light text-primary flex size-10 shrink-0 items-center justify-center rounded-xl">
|
||||||
</dt>
|
<EyeOff className="size-5" aria-hidden="true" />
|
||||||
<dd className="text-foreground mt-2 font-serif text-4xl font-semibold">
|
|
||||||
{value}
|
|
||||||
</dd>
|
|
||||||
</div>
|
</div>
|
||||||
))}
|
<div>
|
||||||
</dl>
|
<h3 className="text-foreground font-serif text-2xl font-semibold">
|
||||||
|
{item.title}
|
||||||
<div className="border-border-soft bg-surface-soft mt-6 flex gap-3 rounded-2xl border p-5">
|
</h3>
|
||||||
<FileCheck2
|
<p className="text-muted-foreground mt-2 text-sm leading-relaxed">
|
||||||
className="text-primary mt-0.5 size-5 shrink-0"
|
{item.body}
|
||||||
aria-hidden="true"
|
|
||||||
/>
|
|
||||||
<p className="text-muted-foreground text-sm leading-relaxed">
|
|
||||||
Source families include openFDA label data, RxNorm terminology,
|
|
||||||
MED-RT and DailyMed class inputs, plus a bounded high-priority
|
|
||||||
interaction list. Release dates and full methodology should be
|
|
||||||
published with each wider release.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</article>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="border-border-soft bg-surface/75 border-t px-4 py-20 sm:px-6">
|
<section className="bg-[#082f2c] px-4 py-20 text-white sm:px-6 lg:py-24">
|
||||||
<div className="mx-auto grid max-w-6xl gap-8 lg:grid-cols-2">
|
<div className="mx-auto grid max-w-6xl gap-12 lg:grid-cols-2 lg:items-center">
|
||||||
<div className="border-success/25 bg-success-light/45 rounded-2xl border p-6 sm:p-8">
|
<div>
|
||||||
<div className="flex items-center gap-3">
|
<p className="text-xs font-bold tracking-[0.16em] text-teal-200 uppercase">
|
||||||
<Check className="text-success size-6" aria-hidden="true" />
|
Your choices
|
||||||
<h2 className="text-foreground font-serif text-2xl font-semibold">
|
</p>
|
||||||
Designed to protect against
|
<h2 className="mt-5 font-serif text-4xl font-semibold tracking-tight sm:text-5xl">
|
||||||
|
Keep the context that helps. Share it when it matters.
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<ul className="text-muted-foreground mt-5 space-y-3 text-sm leading-relaxed">
|
<ul className="grid gap-3">
|
||||||
{protects.map((item) => (
|
{choices.map((item) => (
|
||||||
<li key={item} className="border-success/30 border-l-2 pl-4">
|
<li
|
||||||
{item}
|
key={item}
|
||||||
</li>
|
className="flex items-start gap-3 rounded-xl border border-white/15 bg-white/8 p-4 text-sm leading-relaxed text-teal-50/90"
|
||||||
))}
|
>
|
||||||
</ul>
|
<Check
|
||||||
</div>
|
className="mt-0.5 size-4 shrink-0 text-teal-200"
|
||||||
<div className="rounded-2xl border border-amber-500/25 bg-amber-50 p-6 text-slate-900 sm:p-8 dark:bg-amber-950/30 dark:text-slate-100">
|
|
||||||
<div className="flex items-center gap-3">
|
|
||||||
<AlertTriangle
|
|
||||||
className="size-6 text-amber-700 dark:text-amber-300"
|
|
||||||
aria-hidden="true"
|
aria-hidden="true"
|
||||||
/>
|
/>
|
||||||
<h2 className="font-serif text-2xl font-semibold">
|
|
||||||
It does not eliminate
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<ul className="mt-5 space-y-3 text-sm leading-relaxed text-slate-600 dark:text-slate-300">
|
|
||||||
{doesNotProtect.map((item) => (
|
|
||||||
<li key={item} className="border-l-2 border-amber-500/35 pl-4">
|
|
||||||
{item}
|
{item}
|
||||||
</li>
|
</li>
|
||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</section>
|
||||||
|
|
||||||
<div className="mx-auto mt-10 flex max-w-6xl flex-col items-start justify-between gap-5 rounded-2xl bg-[#0f4f4b] p-7 text-white sm:flex-row sm:items-center sm:p-9">
|
<section className="px-4 py-18 sm:px-6">
|
||||||
|
<div className="border-border-soft bg-surface mx-auto flex max-w-6xl flex-col items-start justify-between gap-6 rounded-[2rem] border p-7 sm:flex-row sm:items-center sm:p-9">
|
||||||
<div>
|
<div>
|
||||||
<h2 className="font-serif text-3xl font-semibold">
|
<h2 className="text-foreground font-serif text-3xl font-semibold">
|
||||||
Help test the boundary.
|
See how Medscribe fits into the day.
|
||||||
</h2>
|
</h2>
|
||||||
<p className="mt-2 text-sm text-teal-50/75">
|
<p className="text-muted-foreground mt-2 text-sm leading-relaxed">
|
||||||
The internal beta is focused on correctness, comprehension, and
|
Follow the journey from a visit to a medication routine and a
|
||||||
caregiver handoffs.
|
trusted handoff.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<Button
|
<Button asChild size="lg">
|
||||||
asChild
|
<Link href="/how-it-works">
|
||||||
size="lg"
|
See how it works
|
||||||
variant="outline"
|
|
||||||
className="border-white/20 bg-white text-[#0f4f4b] hover:bg-teal-50"
|
|
||||||
>
|
|
||||||
<Link href="/beta">
|
|
||||||
Beta expectations
|
|
||||||
<ArrowRight className="size-4" aria-hidden="true" />
|
<ArrowRight className="size-4" aria-hidden="true" />
|
||||||
</Link>
|
</Link>
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
+2
-2
@@ -21,7 +21,7 @@ export const metadata: Metadata = {
|
|||||||
template: "Medscribe | %s",
|
template: "Medscribe | %s",
|
||||||
},
|
},
|
||||||
description:
|
description:
|
||||||
"A private, patient-controlled beta that helps keep visits, medications, and critical context together on your device.",
|
"A private, patient-controlled companion for keeping visits, medications, and critical context together.",
|
||||||
applicationName: "Medscribe",
|
applicationName: "Medscribe",
|
||||||
icons: {
|
icons: {
|
||||||
icon: [
|
icon: [
|
||||||
@@ -37,7 +37,7 @@ export const metadata: Metadata = {
|
|||||||
openGraph: {
|
openGraph: {
|
||||||
title: "Medscribe",
|
title: "Medscribe",
|
||||||
description:
|
description:
|
||||||
"Carry the context when care gets complicated. Private, patient-controlled medical context on your device.",
|
"Carry the context when care gets complicated. Private, patient-controlled health context when you need it.",
|
||||||
type: "website",
|
type: "website",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const capabilities = [
|
|||||||
{
|
{
|
||||||
icon: Mic,
|
icon: Mic,
|
||||||
title: "Understand a visit",
|
title: "Understand a visit",
|
||||||
body: "Type, paste, snap the after-visit summary, or record the conversation with consent. Medscribe transcribes and summarizes it on the phone.",
|
body: "Type, paste, snap the after-visit summary, or record the conversation with consent, then review the useful details together.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: ScanLine,
|
icon: ScanLine,
|
||||||
@@ -70,7 +70,7 @@ const capabilities = [
|
|||||||
{
|
{
|
||||||
icon: MessageSquare,
|
icon: MessageSquare,
|
||||||
title: "Answer the hard questions",
|
title: "Answer the hard questions",
|
||||||
body: "Ask whether two medications are safe together and get an answer grounded in bundled FDA drug facts and known interaction pairs, not a chatbot's guess.",
|
body: "Bring medication questions into the same view as the patient's list, with important decisions left to the pharmacist or care team.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: Layers,
|
icon: Layers,
|
||||||
@@ -84,8 +84,8 @@ const capabilities = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: ShieldCheck,
|
icon: ShieldCheck,
|
||||||
title: "Share without exposure",
|
title: "Share with intention",
|
||||||
body: "End-to-end encrypted sharing lets a caregiver help, without a server ever reading the record.",
|
body: "The patient chooses what to share with a trusted caregiver and when that handoff happens.",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -121,9 +121,9 @@ const payoffs = [
|
|||||||
{
|
{
|
||||||
patientTitle: "A tool that is theirs",
|
patientTitle: "A tool that is theirs",
|
||||||
patient:
|
patient:
|
||||||
"An advocate they control, on their own device. Not a sales pitch, and never on a server.",
|
"An advocate they control, centered on their choices rather than a sales pitch.",
|
||||||
cvsTitle: "Engagement without the liability",
|
cvsTitle: "Engagement without the liability",
|
||||||
cvs: "A CVS-branded habit patients actually open, with no PHI on a server: no new breach surface and no BAA to negotiate.",
|
cvs: "A CVS-branded habit patients can understand, with a clear privacy posture and deliberate patient control.",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -139,17 +139,16 @@ export function CvsPrintSummary() {
|
|||||||
medical picture.
|
medical picture.
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-5 text-[15px] leading-[1.55] text-slate-600">
|
<p className="mt-5 text-[15px] leading-[1.55] text-slate-600">
|
||||||
Real medical AI on the patient's phone. Medscribe summarizes
|
Medscribe organizes visits, reads pill bottles, supports
|
||||||
visits, reads pill bottles, answers medication questions from
|
medication questions, and keeps one ready-to-share record across
|
||||||
bundled drug facts, and keeps one emergency-ready record across
|
every provider.
|
||||||
every provider. Nothing is sent to the cloud.
|
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
||||||
{[
|
{[
|
||||||
"On-device AI",
|
"Private by design",
|
||||||
"Facts-first",
|
"Clear by design",
|
||||||
"Patient-owned",
|
"Patient-controlled",
|
||||||
"iOS and Android beta",
|
"iOS and Android",
|
||||||
].map((badge) => (
|
].map((badge) => (
|
||||||
<span key={badge} className="flex items-center gap-2">
|
<span key={badge} className="flex items-center gap-2">
|
||||||
<span className="size-1 rounded-full bg-teal-600" />
|
<span className="size-1 rounded-full bg-teal-600" />
|
||||||
@@ -177,7 +176,7 @@ export function CvsPrintSummary() {
|
|||||||
<div className="mt-8 border-t border-teal-700/25 pt-5">
|
<div className="mt-8 border-t border-teal-700/25 pt-5">
|
||||||
<p className="northwell-print-label">What it can do</p>
|
<p className="northwell-print-label">What it can do</p>
|
||||||
<h2 className="mt-2 font-serif text-[25px] leading-[1.12] font-semibold text-slate-950">
|
<h2 className="mt-2 font-serif text-[25px] leading-[1.12] font-semibold text-slate-950">
|
||||||
Real medical AI, working entirely on the phone
|
The daily tools patients need, connected in one place
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -198,12 +197,12 @@ export function CvsPrintSummary() {
|
|||||||
<div className="mt-8 grid grid-cols-3 gap-7 border-t border-teal-700/25 pt-5">
|
<div className="mt-8 grid grid-cols-3 gap-7 border-t border-teal-700/25 pt-5">
|
||||||
{[
|
{[
|
||||||
[
|
[
|
||||||
"On the device, not the cloud",
|
"Private by design",
|
||||||
"Summarization and medication Q&A run on the phone. No health data goes to a server for AI, so there is no new breach surface and no BAA.",
|
"The experience keeps the patient's choices at the center of every review and handoff.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Facts first, not guesswork",
|
"Clear medication context",
|
||||||
"Drug facts, classes, and interaction pairs come from bundled reference data. The model helps phrase the answer; it does not invent it.",
|
"Medication questions stay connected to the list the patient already carries and the professionals they trust.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Owned by the patient",
|
"Owned by the patient",
|
||||||
@@ -288,9 +287,8 @@ export function CvsPrintSummary() {
|
|||||||
refills at CVS.
|
refills at CVS.
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
||||||
Live in beta on iOS and Android today. The core patient experience
|
Designed for iOS and Android. A partnership can connect the
|
||||||
ships now; the business layer is what a partnership builds
|
patient experience with CVS's adherence and pharmacy goals.
|
||||||
together.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
@@ -20,15 +20,15 @@ const features = [
|
|||||||
icon: CalendarDays,
|
icon: CalendarDays,
|
||||||
title: "Turn a visit into context you can review",
|
title: "Turn a visit into context you can review",
|
||||||
description:
|
description:
|
||||||
"Type or paste notes, import a portal screenshot or document, or use consent-gated recording. The beta creates a local summary for the person to check.",
|
"Type or paste notes, import a portal screenshot or document, or use consent-gated recording to create a summary you can check.",
|
||||||
points: [
|
points: [
|
||||||
"Supported transcription and summarization run on device",
|
"Keep the visit and summary easy to revisit",
|
||||||
"The person reviews generated information",
|
"Review important details before relying on them",
|
||||||
"Structured visit-to-record change review is still roadmap",
|
"Carry follow-ups into the next conversation",
|
||||||
],
|
],
|
||||||
image: "/screenshots/product-bezel-2026-08-20/visits-natural.webp",
|
image: "/screenshots/product-bezel-2026-08-20/visits-natural.webp",
|
||||||
darkImage: "/screenshots/product-bezel-2026-08-20/visits-natural-dark.webp",
|
darkImage: "/screenshots/product-bezel-2026-08-20/visits-natural-dark.webp",
|
||||||
alt: "Synthetic Medscribe beta visit detail showing a visit summary and follow-up information",
|
alt: "Illustrative Medscribe visit detail showing a visit summary and follow-up information",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "medications",
|
id: "medications",
|
||||||
@@ -36,17 +36,17 @@ const features = [
|
|||||||
icon: Pill,
|
icon: Pill,
|
||||||
title: "Keep the daily medication picture close",
|
title: "Keep the daily medication picture close",
|
||||||
description:
|
description:
|
||||||
"Scan a label, correct the extracted fields, set reminders, follow refills, and see a local intake history without asking a language model to invent drug facts.",
|
"Scan a label, review the details, set reminders, follow refills, and see your medication routine in one calm view.",
|
||||||
points: [
|
points: [
|
||||||
"Label text remains editable before it becomes the record",
|
"Review medication details before saving them",
|
||||||
"Bundled facts and known pairs use named reference datasets",
|
"Keep schedules and reminders easy to understand",
|
||||||
"Coverage is intentionally bounded, not a complete interaction check",
|
"Bring important questions to a clinician or pharmacist",
|
||||||
],
|
],
|
||||||
image:
|
image:
|
||||||
"/screenshots/product-bezel-2026-08-20/medication-detail-natural.webp",
|
"/screenshots/product-bezel-2026-08-20/medication-detail-natural.webp",
|
||||||
darkImage:
|
darkImage:
|
||||||
"/screenshots/product-bezel-2026-08-20/medication-detail-natural-dark.webp",
|
"/screenshots/product-bezel-2026-08-20/medication-detail-natural-dark.webp",
|
||||||
alt: "Synthetic Medscribe beta medication detail with schedule and medication information",
|
alt: "Illustrative Medscribe medication detail with schedule and medication information",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "questions",
|
id: "questions",
|
||||||
@@ -54,15 +54,15 @@ const features = [
|
|||||||
icon: MessageCircle,
|
icon: MessageCircle,
|
||||||
title: "Facts first, fluent answers second",
|
title: "Facts first, fluent answers second",
|
||||||
description:
|
description:
|
||||||
"Medication questions can use the person’s local record and bundled fields. Dosing changes, diagnosis, and treatment decisions stay with a clinician or pharmacist.",
|
"Ask about a visit or medication using the context you have already collected. Dosing changes, diagnosis, and treatment decisions stay with a clinician or pharmacist.",
|
||||||
points: [
|
points: [
|
||||||
"Known facts render from bundled data",
|
"Keep answers connected to your own context",
|
||||||
"The local model helps with conversational phrasing",
|
"Prepare for a clearer care conversation",
|
||||||
"High-risk or unsupported questions defer to a professional",
|
"High-risk or unsupported questions defer to a professional",
|
||||||
],
|
],
|
||||||
image: "/screenshots/product-bezel-2026-08-20/ask-black.webp",
|
image: "/screenshots/product-bezel-2026-08-20/ask-black.webp",
|
||||||
darkImage: "/screenshots/product-bezel-2026-08-20/ask-black-dark.webp",
|
darkImage: "/screenshots/product-bezel-2026-08-20/ask-black-dark.webp",
|
||||||
alt: "Synthetic Medscribe beta answer with medication context and a safety boundary",
|
alt: "Illustrative Medscribe answer with medication context and a safety boundary",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: "handoff",
|
id: "handoff",
|
||||||
@@ -72,14 +72,14 @@ const features = [
|
|||||||
description:
|
description:
|
||||||
"The Know Me view brings selected medications, allergies, conditions, baseline, and contacts together. Current, unconfirmed, and review-needed states make uncertainty visible.",
|
"The Know Me view brings selected medications, allergies, conditions, baseline, and contacts together. Current, unconfirmed, and review-needed states make uncertainty visible.",
|
||||||
points: [
|
points: [
|
||||||
"Medication schedules can include source and confirmation",
|
"Medication schedules stay easy to review",
|
||||||
"The person can show or share the snapshot they reviewed",
|
"The person can show or share the snapshot they reviewed",
|
||||||
"It complements—not replaces—clinical verification",
|
"It complements—not replaces—clinical verification",
|
||||||
],
|
],
|
||||||
image: "/screenshots/product-bezel-2026-08-20/know-me-natural.webp",
|
image: "/screenshots/product-bezel-2026-08-20/know-me-natural.webp",
|
||||||
darkImage:
|
darkImage:
|
||||||
"/screenshots/product-bezel-2026-08-20/know-me-natural-dark.webp",
|
"/screenshots/product-bezel-2026-08-20/know-me-natural-dark.webp",
|
||||||
alt: "Synthetic Medscribe beta Know Me handoff with active medications and review state",
|
alt: "Illustrative Medscribe Know Me handoff with active medications and review state",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ export function FeatureShowcase() {
|
|||||||
<div className="flex min-w-0 flex-col gap-6">
|
<div className="flex min-w-0 flex-col gap-6">
|
||||||
<div
|
<div
|
||||||
role="tablist"
|
role="tablist"
|
||||||
aria-label="Explore the Medscribe beta"
|
aria-label="Explore Medscribe"
|
||||||
className="flex max-w-full gap-2 overflow-x-auto pb-1"
|
className="flex max-w-full gap-2 overflow-x-auto pb-1"
|
||||||
>
|
>
|
||||||
{features.map((feature) => {
|
{features.map((feature) => {
|
||||||
@@ -161,7 +161,7 @@ export function FeatureShowcase() {
|
|||||||
className="focus-visible:ring-primary/40 rounded-xl outline-none focus-visible:ring-2"
|
className="focus-visible:ring-primary/40 rounded-xl outline-none focus-visible:ring-2"
|
||||||
>
|
>
|
||||||
<p className="text-primary text-xs font-bold tracking-[0.14em] uppercase">
|
<p className="text-primary text-xs font-bold tracking-[0.14em] uppercase">
|
||||||
Current beta
|
Medscribe
|
||||||
</p>
|
</p>
|
||||||
<h3 className="text-foreground mt-3 max-w-xl font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
<h3 className="text-foreground mt-3 max-w-xl font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
|
||||||
{active.title}
|
{active.title}
|
||||||
@@ -195,7 +195,7 @@ export function FeatureShowcase() {
|
|||||||
width={220}
|
width={220}
|
||||||
/>
|
/>
|
||||||
<p className="text-muted-foreground mt-4 text-center text-xs">
|
<p className="text-muted-foreground mt-4 text-center text-xs">
|
||||||
Synthetic demo data · beta interface
|
Illustrative profile · Medscribe interface
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -60,22 +60,22 @@ const people = [
|
|||||||
const productPillars = [
|
const productPillars = [
|
||||||
[
|
[
|
||||||
"Capture visits",
|
"Capture visits",
|
||||||
"Type or paste notes, import a portal screenshot, attach a document, or use consent-gated recording. Summarization stays on device.",
|
"Type or paste notes, import a portal screenshot, attach a document, or use consent-gated recording, then review the important details.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Keep medications current",
|
"Keep medications current",
|
||||||
"Pill-bottle label recognition, reminders, refill tracking, dose history, and questions grounded in bundled FDA facts.",
|
"Pill-bottle label recognition, reminders, refill tracking, dose history, and questions connected to the patient's list.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Be ready to hand off",
|
"Be ready to hand off",
|
||||||
"A patient-controlled Know Me record and encrypted caregiver sharing keep critical context ready when the chart is incomplete.",
|
"A patient-controlled Know Me record keeps critical context ready for a caregiver or care professional.",
|
||||||
],
|
],
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
const northwellFit = [
|
const northwellFit = [
|
||||||
[
|
[
|
||||||
"AI patients can trust",
|
"An experience patients can trust",
|
||||||
"Visit summarization and medication Q&A run on the phone, while medication facts come from bundled reference data rather than model recall. It is a clear AI posture for patients, privacy teams, and clinicians.",
|
"Visit summaries, medication routines, and important questions stay clear and reviewable for patients, privacy teams, and clinicians.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"A Northwell story worth telling",
|
"A Northwell story worth telling",
|
||||||
@@ -111,10 +111,10 @@ export function NorthwellPrintSummary() {
|
|||||||
</p>
|
</p>
|
||||||
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
||||||
{[
|
{[
|
||||||
"On-device AI",
|
"Private by design",
|
||||||
"Emergency-ready",
|
"Emergency-ready",
|
||||||
"Patient-owned",
|
"Patient-controlled",
|
||||||
"iOS and Android beta",
|
"iOS and Android",
|
||||||
].map((badge) => (
|
].map((badge) => (
|
||||||
<span key={badge} className="flex items-center gap-2">
|
<span key={badge} className="flex items-center gap-2">
|
||||||
<span className="size-1 rounded-full bg-teal-600" />
|
<span className="size-1 rounded-full bg-teal-600" />
|
||||||
@@ -177,8 +177,8 @@ export function NorthwellPrintSummary() {
|
|||||||
<div>
|
<div>
|
||||||
<p className="northwell-print-label">One living picture</p>
|
<p className="northwell-print-label">One living picture</p>
|
||||||
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
||||||
The record is useful in an emergency because ordinary use keeps it
|
Everyday use keeps the record ready for the moments when a clear
|
||||||
from becoming a stale export.
|
handoff matters most.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<ul className="grid grid-cols-2 gap-x-5 gap-y-2 text-[9.5px] leading-[1.45] text-slate-600">
|
<ul className="grid grid-cols-2 gap-x-5 gap-y-2 text-[9.5px] leading-[1.45] text-slate-600">
|
||||||
@@ -201,8 +201,8 @@ export function NorthwellPrintSummary() {
|
|||||||
A medical record the patient owns and carries
|
A medical record the patient owns and carries
|
||||||
</h2>
|
</h2>
|
||||||
<p className="northwell-print-lede">
|
<p className="northwell-print-lede">
|
||||||
The daily tools are not separate features. They are the maintenance
|
The daily tools work together as one clear, emergency-ready
|
||||||
system for one emergency-ready record.
|
experience.
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-5 grid grid-cols-3 gap-5">
|
<div className="mt-5 grid grid-cols-3 gap-5">
|
||||||
{productPillars.map(([title, body], index) => (
|
{productPillars.map(([title, body], index) => (
|
||||||
@@ -247,35 +247,31 @@ export function NorthwellPrintSummary() {
|
|||||||
</h2>
|
</h2>
|
||||||
<div className="mt-3 grid grid-cols-2 gap-6 text-[10.5px] leading-[1.55] text-slate-600">
|
<div className="mt-3 grid grid-cols-2 gap-6 text-[10.5px] leading-[1.55] text-slate-600">
|
||||||
<p>
|
<p>
|
||||||
Every institutional record stops at its own walls. Epic aggregates
|
Institutional records reflect their own care settings. Patients
|
||||||
Epic; urgent care, community specialists, and facilities on other
|
often move among urgent care, community specialists, pharmacies,
|
||||||
systems can still sit outside the picture in front of a clinician.
|
and family caregivers.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Visit notetakers, medication trackers, record vaults, and
|
Medscribe connects visit memory, medication routines, and the
|
||||||
emergency IDs each solve one slice. Medscribe connects daily
|
handoff across those settings while keeping the patient's
|
||||||
maintenance to the handoff across Epic and non-Epic care, on the
|
choices at the center.
|
||||||
patient's device and under the patient's control.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section className="mt-5 grid grid-cols-2 gap-7 border-t border-slate-300 pt-5">
|
<section className="mt-5 grid grid-cols-2 gap-7 border-t border-slate-300 pt-5">
|
||||||
<div>
|
<div>
|
||||||
<p className="northwell-print-label">Facts first</p>
|
<p className="northwell-print-label">Clear medication context</p>
|
||||||
<p className="mt-2 text-[10px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10px] leading-[1.5] text-slate-600">
|
||||||
Medication facts, drug classes, and known interaction pairs come
|
Medication details, routines, and questions stay connected in one
|
||||||
from bundled reference data. The language model helps with
|
readable view, with clinical decisions left to the care team.
|
||||||
phrasing; it is not treated as the source of medical facts.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p className="northwell-print-label">Local by default</p>
|
<p className="northwell-print-label">Patient-controlled sharing</p>
|
||||||
<p className="mt-2 text-[10px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10px] leading-[1.5] text-slate-600">
|
||||||
Visit summarization and medication Q&A run on the phone.
|
The patient reviews the context first and decides when a trusted
|
||||||
Caregiver sharing is end-to-end encrypted, so a server is not
|
caregiver or care professional should see it.
|
||||||
asked to read the patient's record in order to coordinate
|
|
||||||
care.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -285,7 +281,7 @@ export function NorthwellPrintSummary() {
|
|||||||
<section className="pt-3">
|
<section className="pt-3">
|
||||||
<p className="northwell-print-label">The Northwell opportunity</p>
|
<p className="northwell-print-label">The Northwell opportunity</p>
|
||||||
<h2 className="northwell-print-title">
|
<h2 className="northwell-print-title">
|
||||||
A trusted AI touchstone between visits
|
A trusted touchstone between visits
|
||||||
</h2>
|
</h2>
|
||||||
<p className="northwell-print-lede max-w-[650px]">
|
<p className="northwell-print-lede max-w-[650px]">
|
||||||
Medscribe gives Northwell a useful presence in the part of care no
|
Medscribe gives Northwell a useful presence in the part of care no
|
||||||
@@ -338,7 +334,7 @@ export function NorthwellPrintSummary() {
|
|||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<h3 className="font-serif text-[16px] font-semibold text-slate-950">
|
<h3 className="font-serif text-[16px] font-semibold text-slate-950">
|
||||||
The patient carries the missing context
|
The patient carries personal context
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-2 text-[10.5px] leading-[1.55] text-slate-600">
|
<p className="mt-2 text-[10.5px] leading-[1.55] text-slate-600">
|
||||||
Non-Epic visits, medication changes, caregiver knowledge, and
|
Non-Epic visits, medication changes, caregiver knowledge, and
|
||||||
@@ -356,10 +352,10 @@ export function NorthwellPrintSummary() {
|
|||||||
A patient promise people can understand
|
A patient promise people can understand
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
||||||
Private AI. One current picture. Ready for the caregiver, the new
|
Private by design. One current picture. Ready for the caregiver,
|
||||||
doctor, or the ER. That is a more human story than “AI in
|
the new doctor, or the ER. That is a human story people can
|
||||||
healthcare,” and it gives Northwell a visible way to stand
|
understand, and it gives Northwell a visible way to stand for
|
||||||
for continuity beyond its own walls.
|
continuity beyond its own walls.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
@@ -370,8 +366,8 @@ export function NorthwellPrintSummary() {
|
|||||||
<p className="mt-3 text-[10.5px] leading-[1.5] text-slate-600">
|
<p className="mt-3 text-[10.5px] leading-[1.5] text-slate-600">
|
||||||
A Bucknell computer science and engineering graduate who built
|
A Bucknell computer science and engineering graduate who built
|
||||||
Medscribe after watching his family lose the full picture of his
|
Medscribe after watching his family lose the full picture of his
|
||||||
grandfather's care. The product is live in beta on iOS and
|
grandfather's care. Medscribe is designed for iOS and
|
||||||
Android today.
|
Android.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ import { MedscribeLogo } from "~/components/medscribe-logo";
|
|||||||
|
|
||||||
const footerLinks = [
|
const footerLinks = [
|
||||||
{ href: "/how-it-works", label: "How it works" },
|
{ href: "/how-it-works", label: "How it works" },
|
||||||
{ href: "/privacy", label: "Privacy & evidence" },
|
{ href: "/privacy", label: "Privacy" },
|
||||||
{ href: "/beta", label: "Beta access" },
|
{ href: "/access", label: "Request access" },
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export function SiteFooter() {
|
export function SiteFooter() {
|
||||||
@@ -21,8 +21,8 @@ export function SiteFooter() {
|
|||||||
<span className="font-serif text-lg font-semibold">Medscribe</span>
|
<span className="font-serif text-lg font-semibold">Medscribe</span>
|
||||||
</Link>
|
</Link>
|
||||||
<p className="text-muted-foreground mt-4 max-w-md leading-relaxed">
|
<p className="text-muted-foreground mt-4 max-w-md leading-relaxed">
|
||||||
A private, patient-controlled beta for keeping visits, medications,
|
A private, patient-controlled way to keep visits, medications, and
|
||||||
and critical context together on the device you carry.
|
important care context together.
|
||||||
</p>
|
</p>
|
||||||
<p className="text-muted-foreground mt-3 text-xs leading-relaxed">
|
<p className="text-muted-foreground mt-3 text-xs leading-relaxed">
|
||||||
Medscribe does not diagnose, prescribe, or replace emergency
|
Medscribe does not diagnose, prescribe, or replace emergency
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import { Button } from "~/components/ui/button";
|
|||||||
const navigation = [
|
const navigation = [
|
||||||
{ href: "/", label: "Home" },
|
{ href: "/", label: "Home" },
|
||||||
{ href: "/how-it-works", label: "How it works" },
|
{ href: "/how-it-works", label: "How it works" },
|
||||||
{ href: "/privacy", label: "Privacy & evidence" },
|
{ href: "/privacy", label: "Privacy" },
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export function SiteHeader() {
|
export function SiteHeader() {
|
||||||
@@ -39,7 +39,7 @@ export function SiteHeader() {
|
|||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
<Button asChild size="sm" className="ml-2">
|
<Button asChild size="sm" className="ml-2">
|
||||||
<Link href="/beta">Request beta access</Link>
|
<Link href="/access">Request access</Link>
|
||||||
</Button>
|
</Button>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
@@ -62,10 +62,10 @@ export function SiteHeader() {
|
|||||||
</Link>
|
</Link>
|
||||||
))}
|
))}
|
||||||
<Link
|
<Link
|
||||||
href="/beta"
|
href="/access"
|
||||||
className="bg-primary-button hover:bg-primary-button/90 focus-visible:ring-primary/40 mt-1 rounded-xl px-4 py-3 text-center text-sm font-semibold text-white outline-none focus-visible:ring-2"
|
className="bg-primary-button hover:bg-primary-button/90 focus-visible:ring-primary/40 mt-1 rounded-xl px-4 py-3 text-center text-sm font-semibold text-white outline-none focus-visible:ring-2"
|
||||||
>
|
>
|
||||||
Request beta access
|
Request access
|
||||||
</Link>
|
</Link>
|
||||||
</nav>
|
</nav>
|
||||||
</details>
|
</details>
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ const capabilities = [
|
|||||||
{
|
{
|
||||||
icon: Mic,
|
icon: Mic,
|
||||||
title: "Understand a visit",
|
title: "Understand a visit",
|
||||||
body: "Type, paste, snap the after-visit summary, or record the conversation with consent. Medscribe transcribes and summarizes it on the phone.",
|
body: "Type, paste, snap the after-visit summary, or record the conversation with consent, then review the useful details together.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: ScanLine,
|
icon: ScanLine,
|
||||||
@@ -70,7 +70,7 @@ const capabilities = [
|
|||||||
{
|
{
|
||||||
icon: MessageSquare,
|
icon: MessageSquare,
|
||||||
title: "Answer the hard questions",
|
title: "Answer the hard questions",
|
||||||
body: "Ask whether two medications are safe together and get an answer grounded in bundled FDA drug facts and known interaction pairs, not a chatbot's guess.",
|
body: "Bring medication questions into the same view as the patient's list, with important decisions left to the pharmacist or care team.",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: Layers,
|
icon: Layers,
|
||||||
@@ -84,8 +84,8 @@ const capabilities = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: ShieldCheck,
|
icon: ShieldCheck,
|
||||||
title: "Share without exposure",
|
title: "Share with intention",
|
||||||
body: "End-to-end encrypted sharing lets a caregiver help, without a server ever reading the record.",
|
body: "The patient chooses what to share with a trusted caregiver and when that handoff happens.",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -121,9 +121,9 @@ const payoffs = [
|
|||||||
{
|
{
|
||||||
patientTitle: "A tool that is theirs",
|
patientTitle: "A tool that is theirs",
|
||||||
patient:
|
patient:
|
||||||
"An advocate they control, on their own device. Not a sales pitch, and never on a server.",
|
"An advocate they control, centered on their choices rather than a sales pitch.",
|
||||||
bizTitle: "Engagement without the liability",
|
bizTitle: "Engagement without the liability",
|
||||||
biz: "A Walgreens-branded habit patients actually open through myWalgreens, with no PHI on a server: no new breach surface and no BAA to negotiate.",
|
biz: "A Walgreens-branded habit patients can understand through myWalgreens, with a clear privacy posture and deliberate patient control.",
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
@@ -139,17 +139,16 @@ export function WalgreensPrintSummary() {
|
|||||||
medical picture.
|
medical picture.
|
||||||
</h1>
|
</h1>
|
||||||
<p className="mt-5 text-[15px] leading-[1.55] text-slate-600">
|
<p className="mt-5 text-[15px] leading-[1.55] text-slate-600">
|
||||||
Real medical AI on the patient's phone. Medscribe summarizes
|
Medscribe organizes visits, reads pill bottles, supports
|
||||||
visits, reads pill bottles, answers medication questions from
|
medication questions, and keeps one ready-to-share record across
|
||||||
bundled drug facts, and keeps one emergency-ready record across
|
every doctor and pharmacy.
|
||||||
every doctor and pharmacy. Nothing is sent to the cloud.
|
|
||||||
</p>
|
</p>
|
||||||
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
<div className="mt-6 grid grid-cols-2 gap-x-5 gap-y-2 text-[8.5px] font-bold tracking-[0.08em] text-slate-600 uppercase">
|
||||||
{[
|
{[
|
||||||
"On-device AI",
|
"Private by design",
|
||||||
"Facts-first",
|
"Clear by design",
|
||||||
"Patient-owned",
|
"Patient-controlled",
|
||||||
"iOS and Android beta",
|
"iOS and Android",
|
||||||
].map((badge) => (
|
].map((badge) => (
|
||||||
<span key={badge} className="flex items-center gap-2">
|
<span key={badge} className="flex items-center gap-2">
|
||||||
<span className="size-1 rounded-full bg-teal-600" />
|
<span className="size-1 rounded-full bg-teal-600" />
|
||||||
@@ -177,7 +176,7 @@ export function WalgreensPrintSummary() {
|
|||||||
<div className="mt-8 border-t border-teal-700/25 pt-5">
|
<div className="mt-8 border-t border-teal-700/25 pt-5">
|
||||||
<p className="northwell-print-label">What it can do</p>
|
<p className="northwell-print-label">What it can do</p>
|
||||||
<h2 className="mt-2 font-serif text-[25px] leading-[1.12] font-semibold text-slate-950">
|
<h2 className="mt-2 font-serif text-[25px] leading-[1.12] font-semibold text-slate-950">
|
||||||
Real medical AI, working entirely on the phone
|
The daily tools patients need, connected in one place
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -198,12 +197,12 @@ export function WalgreensPrintSummary() {
|
|||||||
<div className="mt-8 grid grid-cols-3 gap-7 border-t border-teal-700/25 pt-5">
|
<div className="mt-8 grid grid-cols-3 gap-7 border-t border-teal-700/25 pt-5">
|
||||||
{[
|
{[
|
||||||
[
|
[
|
||||||
"On the device, not the cloud",
|
"Private by design",
|
||||||
"Summarization and medication Q&A run on the phone. No health data goes to a server for AI, so there is no new breach surface and no BAA.",
|
"The experience keeps the patient's choices at the center of every review and handoff.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Facts first, not guesswork",
|
"Clear medication context",
|
||||||
"Drug facts, classes, and interaction pairs come from bundled reference data. The model helps phrase the answer; it does not invent it.",
|
"Medication questions stay connected to the list the patient already carries and the professionals they trust.",
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Owned by the patient",
|
"Owned by the patient",
|
||||||
@@ -288,9 +287,9 @@ export function WalgreensPrintSummary() {
|
|||||||
refills at Walgreens.
|
refills at Walgreens.
|
||||||
</h3>
|
</h3>
|
||||||
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
<p className="mt-2 text-[10.5px] leading-[1.5] text-slate-600">
|
||||||
Live in beta on iOS and Android today. The core patient experience
|
Designed for iOS and Android. A partnership can connect the
|
||||||
ships now; the business layer is what a partnership builds
|
patient experience with Walgreens' adherence and pharmacy
|
||||||
together.
|
goals.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
+8
-45
@@ -1,71 +1,34 @@
|
|||||||
export type ClaimStatus = "built" | "beta-verified" | "roadmap";
|
|
||||||
|
|
||||||
export type ProductClaim = {
|
|
||||||
publicCopy: string;
|
|
||||||
status: ClaimStatus;
|
|
||||||
evidence: string;
|
|
||||||
verifiedOn: string;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const productRelease = {
|
export const productRelease = {
|
||||||
stage: "Internal beta",
|
stage: "Private by design",
|
||||||
platforms: "iOS and Android",
|
platforms: "iOS and Android",
|
||||||
verifiedOn: "August 20, 2026",
|
|
||||||
drugFacts: 203,
|
|
||||||
rxNormTerms: 33_185,
|
|
||||||
interactionPairs: 1_150,
|
|
||||||
flaggedForReview: 76,
|
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const productClaims = {
|
export const productClaims = {
|
||||||
localAi: {
|
localAi: {
|
||||||
publicCopy:
|
publicCopy:
|
||||||
"Visit transcription and supported AI tasks run on the device, without cloud AI inference.",
|
"Medscribe helps turn visits and medication routines into clear, reviewable context.",
|
||||||
status: "built",
|
|
||||||
evidence: "App architecture and release-path audit",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
},
|
||||||
localRecord: {
|
localRecord: {
|
||||||
publicCopy:
|
publicCopy:
|
||||||
"The primary record is stored locally on the person's device, with no Medscribe cloud account.",
|
"Your health context stays organized around you and under your control.",
|
||||||
status: "built",
|
|
||||||
evidence: "Local SQLite data architecture",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
},
|
||||||
medicationFacts: {
|
medicationFacts: {
|
||||||
publicCopy:
|
publicCopy:
|
||||||
"Medication facts and known interaction pairs are read from bundled reference data rather than model memory.",
|
"Medication information is presented clearly, with important decisions left to you and your care team.",
|
||||||
status: "built",
|
|
||||||
evidence: "Bundled data release manifest and deterministic answer paths",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
},
|
||||||
caregiverSharing: {
|
caregiverSharing: {
|
||||||
publicCopy:
|
publicCopy:
|
||||||
"A person can manually export an encrypted snapshot targeted to a caregiver's public key.",
|
"Share selected context with a trusted caregiver when you choose.",
|
||||||
status: "built",
|
|
||||||
evidence:
|
|
||||||
"QR pairing, safety-number display, encrypted export, ciphertext integrity, and wrong-recipient rejection",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
},
|
||||||
recordFreshness: {
|
recordFreshness: {
|
||||||
publicCopy:
|
publicCopy:
|
||||||
"Medication schedules can carry source, confirmation, timezone, and freshness state in the beta.",
|
"See schedules, reminders, and key details together in one readable view.",
|
||||||
status: "built",
|
|
||||||
evidence: "Medication schedule and Know Me freshness implementation",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
},
|
||||||
broaderProvenance: {
|
} as const;
|
||||||
publicCopy:
|
|
||||||
"Source and freshness for conditions, allergies, baseline, and visit-derived changes are planned next.",
|
|
||||||
status: "roadmap",
|
|
||||||
evidence: "Current product roadmap",
|
|
||||||
verifiedOn: "2026-08-20",
|
|
||||||
},
|
|
||||||
} satisfies Record<string, ProductClaim>;
|
|
||||||
|
|
||||||
export const publicRoutes = [
|
export const publicRoutes = [
|
||||||
"/",
|
"/",
|
||||||
"/how-it-works",
|
"/how-it-works",
|
||||||
"/privacy",
|
"/privacy",
|
||||||
"/beta",
|
"/access",
|
||||||
] as const;
|
] as const;
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export const ACCESS_INVITE_MAILTO =
|
||||||
|
"mailto:sean@soconnor.dev?subject=Medscribe%20access&body=Hi%20Sean%2C%0D%0A%0D%0AI%27m%20interested%20in%20Medscribe.%0D%0A%0D%0APlatform%20(iOS%20or%20Android)%3A%0D%0AI%27m%20interested%20as%20a%20(patient%2C%20caregiver%2C%20or%20both)%3A%0D%0A%0D%0APlease%20do%20not%20include%20diagnoses%2C%20medication%20names%2C%20or%20other%20health%20details%20in%20this%20email.%0D%0A%0D%0AThanks%21";
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
/** Shared beta / early-access copy for the marketing site. */
|
|
||||||
|
|
||||||
export const BETA_SUMMARY =
|
|
||||||
"Medscribe is in internal beta on iOS and Android. Visit transcription and supported AI tasks run on the device, without cloud AI inference.";
|
|
||||||
|
|
||||||
export const BETA_CTA_TITLE = "Request beta access";
|
|
||||||
|
|
||||||
export const BETA_CTA_BODY =
|
|
||||||
"The beta is for people managing repeated visits or several medications, and for family caregivers willing to review the record and report errors.";
|
|
||||||
|
|
||||||
export const BETA_INVITE_MAILTO =
|
|
||||||
"mailto:sean@soconnor.dev?subject=Medscribe%20beta%20access&body=Hi%20Sean%2C%0D%0A%0D%0AI%27m%20interested%20in%20the%20Medscribe%20beta.%0D%0A%0D%0APlatform%20(iOS%20or%20Android)%3A%0D%0AI%27m%20testing%20as%20(patient%2C%20caregiver%2C%20or%20both)%3A%0D%0AI%20can%20test%20with%20a%20caregiver%20(yes%20or%20no)%3A%0D%0A%0D%0APlease%20do%20not%20include%20diagnoses%2C%20medication%20names%2C%20or%20other%20health%20details%20in%20this%20email.%0D%0A%0D%0AThanks%21";
|
|
||||||
|
|
||||||
export const BETA_FOOTER_NOTE =
|
|
||||||
"Beta on iOS (TestFlight) and Android (Google Play internal testing).";
|
|
||||||
Reference in New Issue
Block a user