Files
medscribe-web/src/app/(marketing)/page.tsx
T
soconnorandClaude Opus 4.8 c8730a9657 Make "Request an invite" draft an email to sean@soconnor.dev
Replace the placeholder soconnor.dev link with a mailto: that pre-fills
the subject and body for a TestFlight invite request.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 13:05:53 -04:00

346 lines
13 KiB
TypeScript

import {
AlertTriangle,
ChevronRight,
ClipboardList,
HeartPulse,
Lock,
Mic,
Pill,
Shield,
Users,
} from "lucide-react";
import { FeatureShowcase } from "~/components/feature-showcase";
import { PhoneMockup } from "~/components/phone-mockup";
import { SectionLabel } from "~/components/section-label";
import { Badge } from "~/components/ui/badge";
import { Button } from "~/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "~/components/ui/card";
const quickActions = [
{
icon: HeartPulse,
title: "Know Me card",
meta: "Baseline, conditions, allergies",
featured: true,
},
{
icon: Pill,
title: "Time-critical meds",
meta: "Schedules caregivers can trust",
},
{
icon: Mic,
title: "Visit capture",
meta: "Consent-gated, on-device",
},
{
icon: Users,
title: "Caregiver handoff",
meta: "One current shared truth",
},
];
const pillars = [
{
icon: ClipboardList,
title: "Keep the record current",
body: "Capture visits, scan labels, and keep conditions, medications, allergies, contacts, and caregiver notes in one portable record.",
},
{
icon: AlertTriangle,
title: "Make the critical context obvious",
body: "The emergency view prioritizes the facts clinicians need fast: baseline, time-critical meds, active conditions, allergies, and who to call.",
},
{
icon: Shield,
title: "Stay private by architecture",
body: "Transcription, OCR, and medication chat run locally. No cloud AI processing. Sharing should be explicit, revocable, and encrypted.",
},
];
const impact = [
{
title: "Fewer blank handoffs",
body: "When a caregiver is overwhelmed, the important 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: "More confident families",
body: "Caregivers can see what changed, where it came from, and what still needs a clinician or pharmacist instead of guessing from memory.",
},
];
export default function HomePage() {
const today = new Date().toLocaleDateString("en-US", {
weekday: "long",
month: "long",
day: "numeric",
});
return (
<div className="mx-auto max-w-6xl space-y-14 px-4 py-8 sm:px-6 sm:py-12 lg:space-y-20 lg:py-14">
{/* Hero */}
<section className="grid items-center gap-8 lg:grid-cols-[minmax(0,1fr)_minmax(230px,280px)] lg:gap-14">
<div className="space-y-6">
<div className="animate-fade-in-up space-y-5">
<SectionLabel>Medscribe · Private complex-care context</SectionLabel>
<h1 className="max-w-2xl font-serif text-4xl leading-[1.05] font-semibold tracking-tight text-foreground sm:text-5xl lg:text-6xl">
Be known when care gets complicated
</h1>
<p className="max-w-xl text-base leading-relaxed text-muted-foreground sm:text-lg">
A private medical context app for families managing complex care.
It keeps visits, medications, baseline, contacts, allergies, and
emergency facts ready before the chart catches up.
</p>
<p className="text-sm text-muted-foreground">{today}</p>
</div>
<div className="animate-fade-in-up-delay-1 flex flex-wrap gap-3">
<Button asChild size="lg">
<a href="/executive-summary">
Read executive summary
<ChevronRight className="size-4" />
</a>
</Button>
<Button asChild variant="outline" size="lg">
<a href="#features">See how it works</a>
</Button>
</div>
<div className="animate-fade-in-up-delay-2 flex flex-wrap gap-2">
<Badge variant="success">On TestFlight</Badge>
<Badge variant="outline">iOS</Badge>
<Badge variant="outline">Emergency-ready</Badge>
<Badge variant="outline">No cloud AI</Badge>
</div>
</div>
<div className="animate-fade-in-up-delay-3 flex justify-center lg:justify-end">
<div className="flex w-fit items-start justify-center">
<PhoneMockup
src="/screenshots/home.png"
alt="Medscribe home dashboard"
priority
width={190}
/>
</div>
</div>
</section>
{/* Strategic spine */}
<section className="animate-fade-in-up space-y-5">
<SectionLabel>The story</SectionLabel>
<div className="grid gap-6 lg:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)] lg:items-start">
<div className="space-y-3">
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
The story scatters right when it matters
</h2>
<p className="max-w-xl leading-relaxed text-muted-foreground">
A daughter remembers the medication schedule. A spouse knows what
normal looks like. A specialist mentioned a change three visits ago.
In a crisis, those details are scattered across people, portals, and
memory.
</p>
</div>
<div className="rounded-lg border border-border-soft bg-surface p-5 shadow-[0_1px_4px_rgba(0,0,0,0.05)]">
<div className="flex items-start gap-3">
<HeartPulse className="mt-0.5 size-5 shrink-0 text-primary" />
<div className="space-y-2">
<h3 className="font-serif text-xl font-semibold tracking-tight">
One current story
</h3>
<p className="text-sm leading-relaxed text-muted-foreground">
Medscribe gives the family a private place to keep that context
alive: current meds, timing, baseline, allergies, recent visit
summaries, emergency contacts, and the source trail behind each
fact.
</p>
</div>
</div>
</div>
</div>
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
{quickActions.map((action) => {
const Icon = action.icon;
return (
<Card
key={action.title}
className={`card-hover ${action.featured ? "border-primary-button/20 bg-primary-button text-white" : ""}`}
>
<CardHeader className="gap-3">
<div
className={`flex size-10 items-center justify-center rounded-[10px] ${
action.featured ? "bg-white/18" : "bg-primary-light"
}`}
>
<Icon
className={`size-5 ${action.featured ? "text-white" : "text-primary"}`}
/>
</div>
<div>
<CardTitle className={action.featured ? "text-white" : ""}>
{action.title}
</CardTitle>
<CardDescription
className={action.featured ? "text-white/72" : ""}
>
{action.meta}
</CardDescription>
</div>
</CardHeader>
</Card>
);
})}
</div>
</section>
{/* Interactive feature showcase */}
<section id="features" className="animate-fade-in-up scroll-mt-24 space-y-5">
<div className="space-y-2">
<SectionLabel>The record</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
The pieces that keep the story current
</h2>
<p className="max-w-2xl text-muted-foreground">
Visits, medications, reminders, search, and questions all point toward
the same outcome: a record the family can trust when the stakes rise.
</p>
</div>
<FeatureShowcase />
</section>
{/* Privacy */}
<section id="privacy" className="animate-fade-in-up scroll-mt-24 space-y-6">
<div className="space-y-3">
<SectionLabel>Why this is different</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
Built for the family record, not another cloud inbox
</h2>
<p className="max-w-2xl text-muted-foreground">
The crowded space already has visit recorders, medication apps, and
caregiver portals. Medscribe&apos;s wedge is the private, portable
context layer families control before an institution is ready.
</p>
</div>
<div className="grid gap-4 md:grid-cols-3">
{pillars.map((pillar) => {
const Icon = pillar.icon;
return (
<Card key={pillar.title} className="card-hover">
<CardHeader>
<div className="flex size-10 items-center justify-center rounded-[10px] bg-primary-light">
<Icon className="size-5 text-primary" />
</div>
<CardTitle>{pillar.title}</CardTitle>
<CardDescription>{pillar.body}</CardDescription>
</CardHeader>
</Card>
);
})}
</div>
<Card className="border-primary/15 bg-primary-light/40">
<CardContent className="flex items-start gap-4 pt-5">
<Lock className="mt-0.5 size-5 shrink-0 text-primary" />
<p className="text-sm leading-relaxed text-foreground">
All AI models run on your device. No health data is uploaded for
processing. The medication chatbot stays in drug-information
territory. It defers dosing and diagnosis questions to your
clinician or pharmacist.
</p>
</CardContent>
</Card>
</section>
{/* Screenshot strip */}
<section className="animate-fade-in-up space-y-6">
<SectionLabel>What travels with them</SectionLabel>
<div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4">
{[
{ src: "/screenshots/emergency-record.png", label: "Emergency record" },
{ src: "/screenshots/appointment-summary.png", label: "Visit summary" },
{ src: "/screenshots/medications.png", label: "Medication list" },
{ src: "/screenshots/chat.png", label: "Medication questions" },
].map((shot) => (
<Card key={shot.src} className="card-hover overflow-hidden">
<div className="flex min-h-[270px] items-start justify-center bg-surface-soft p-4">
<PhoneMockup src={shot.src} alt={shot.label} width={112} />
</div>
<p className="border-t border-border-soft px-4 py-3 text-center text-sm font-medium text-muted-foreground">
{shot.label}
</p>
</Card>
))}
</div>
</section>
{/* Impact */}
<section id="impact" className="animate-fade-in-up scroll-mt-24 space-y-6">
<div className="space-y-3">
<SectionLabel>Potential impact</SectionLabel>
<h2 className="font-serif text-3xl font-semibold tracking-tight sm:text-4xl">
Less panic, more context, better handoffs
</h2>
<p className="max-w-2xl text-muted-foreground">
The goal is simple: make the person easier to understand at the exact
moment their care team has the least context.
</p>
</div>
<div className="grid gap-4 md:grid-cols-3">
{impact.map((item) => (
<Card key={item.title} className="card-hover">
<CardHeader>
<CardTitle>{item.title}</CardTitle>
<CardDescription>{item.body}</CardDescription>
</CardHeader>
</Card>
))}
</div>
</section>
{/* CTA */}
<section className="animate-fade-in-up">
<Card className="overflow-hidden border-primary-button/20 bg-primary-button text-white">
<CardHeader className="gap-4 sm:flex-row sm:items-center sm:justify-between">
<div className="space-y-2">
<CardTitle className="text-white">Try Medscribe on iOS</CardTitle>
<CardDescription className="text-white/75">
The app is live on TestFlight. Reach out for an invite if
you&apos;re managing medications, visits, or emergency context for
someone you love.
</CardDescription>
</div>
<Button
asChild
size="lg"
variant="outline"
className="border-white/30 bg-white text-primary-button hover:bg-white/90"
>
<a href="mailto:sean@soconnor.dev?subject=Medscribe%20TestFlight%20invite%20request&body=Hi%20Sean%2C%0D%0A%0D%0AI%27d%20like%20a%20TestFlight%20invite%20to%20try%20Medscribe.%20I%27m%20managing%20medications%2C%20visits%2C%20or%20emergency%20context%20for%20someone%20I%20care%20for.%0D%0A%0D%0AThanks%21">
Request an invite
</a>
</Button>
</CardHeader>
</Card>
</section>
</div>
);
}