initial commit

This commit is contained in:
2026-06-24 17:02:04 -04:00
commit d521c66903
50 changed files with 2519 additions and 0 deletions
+174
View File
@@ -0,0 +1,174 @@
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import { PrintButton } from "~/components/print-button";
export const metadata: Metadata = {
title: "Medscribe Executive Summary",
description:
"One-page executive summary for Medscribe, a private medical context app for families managing complex care.",
};
const proofPoints = [
"iOS TestFlight build",
"Visit capture and local transcription",
"Medication OCR, reminders, and history",
"Search and grounded medication questions",
"Emergency-ready profile direction",
"Full founder ownership",
];
const sections = [
{
label: "Problem",
title: "Families hold the context care teams need most.",
body:
"In complex care, the real story often lives outside the chart: what normal looks like, which medication is time-critical, what changed after the last visit, and who can explain it under pressure. Portals store records, but families still perform the handoff from memory.",
},
{
label: "Product",
title: "A private context layer for the person, not the institution.",
body:
"Medscribe keeps visits, medications, baseline, allergies, contacts, reminders, summaries, and questions under the person they belong to. The goal is not another medical inbox. It is the family-held record that makes someone easier to understand when care gets complicated.",
},
{
label: "Wedge",
title: "Emergency-ready, caregiver-centered, private by architecture.",
body:
"The market has AI scribes, medication trackers, caregiver portals, and EHR-adjacent tools. Medscribe's wedge is the portable layer families control before an institution is ready: current context, source trails, time-critical medication visibility, and on-device AI where possible.",
},
];
const opportunities = [
{
title: "B2C",
body: "A caregiver app for families managing aging parents, chronic illness, disability, or high-friction medication routines.",
},
{
title: "IP / partnership",
body: "A private family-context layer that could matter to care navigation, home health, senior care, pharmacy, or patient-engagement platforms.",
},
{
title: "Impact",
body: "Fewer blank handoffs, safer medication moments, and more confident advocates when someone cannot fully speak for themselves.",
},
];
export default function ExecutiveSummaryPage() {
return (
<main className="mx-auto max-w-[8.5in] px-4 py-6 sm:px-6 print:p-0">
<div className="print-hidden mb-5 flex items-center justify-between gap-4">
<Link
href="/"
className="text-sm font-medium text-muted-foreground underline-offset-4 hover:text-foreground hover:underline"
>
Back to site
</Link>
<PrintButton />
</div>
<article className="summary-sheet relative overflow-hidden rounded-lg border border-border-soft bg-surface px-8 py-7 shadow-[0_12px_40px_rgba(15,23,42,0.08)] print:h-[10.5in] print:rounded-none print:border-0 print:px-[0.34in] print:py-[0.3in] print:shadow-none">
<header className="relative z-10 grid gap-6 border-b border-teal-900/10 pb-5 lg:grid-cols-[minmax(0,1fr)_190px] print:grid-cols-[minmax(0,1fr)_1.45in] print:gap-4 print:pb-3">
<div>
<p className="text-[11px] font-semibold tracking-[0.2em] text-primary uppercase print:text-[8.5px]">
Executive Summary
</p>
<h1 className="mt-2 font-serif text-5xl leading-none font-semibold tracking-tight text-foreground print:text-[28px]">
Medscribe
</h1>
<p className="mt-2 font-serif text-2xl leading-tight font-semibold tracking-tight text-foreground print:text-[16px]">
Be known when care gets complicated.
</p>
<p className="mt-4 max-w-2xl text-base leading-relaxed text-slate-700 print:mt-2 print:text-[10px] print:leading-[1.45]">
Medscribe is a private medical context app for families managing
complex care. It helps the people closest to a patient keep the
living record current: medications, baseline, visits, contacts,
allergies, emergency facts, and the source trail behind what changed.
</p>
</div>
<div className="flex justify-center lg:justify-end print:justify-end">
<div className="h-[360px] w-[166px] overflow-hidden rounded-[24px] border-[6px] border-slate-950 bg-white shadow-[0_18px_45px_rgba(15,23,42,0.18)] print:h-[2.9in] print:w-[1.34in] print:rounded-[18px] print:border-[4px] print:shadow-[0_10px_22px_rgba(15,23,42,0.16)]">
<Image
src="/screenshots/home.png"
alt="Medscribe home screen"
width={1206}
height={2622}
priority
unoptimized
className="h-full w-full object-cover object-top"
/>
</div>
</div>
</header>
<section className="relative z-10 grid gap-4 py-5 md:grid-cols-3 print:gap-2 print:py-3">
{sections.map((section) => (
<div key={section.label} className="space-y-2 print:space-y-1">
<p className="text-[11px] font-semibold tracking-[0.16em] text-primary uppercase print:text-[8px]">
{section.label}
</p>
<h2 className="font-serif text-xl leading-tight font-semibold tracking-tight text-foreground print:text-[12px]">
{section.title}
</h2>
<p className="text-sm leading-relaxed text-slate-700 print:text-[8.8px] print:leading-[1.38]">
{section.body}
</p>
</div>
))}
</section>
<section className="relative z-10 grid gap-4 border-t border-teal-900/10 py-5 md:grid-cols-[0.95fr_1.05fr] print:gap-3 print:py-3">
<div>
<p className="text-[11px] font-semibold tracking-[0.16em] text-primary uppercase print:text-[8px]">
Current State
</p>
<h2 className="mt-2 font-serif text-2xl leading-tight font-semibold tracking-tight text-foreground print:mt-1 print:text-[14px]">
Built enough to show, focused enough to sharpen.
</h2>
<p className="mt-2 text-sm leading-relaxed text-slate-700 print:text-[8.8px] print:leading-[1.38]">
Medscribe is owned and built by Sean O&apos;Connor. Bucknell
MedTech Entrepreneurial Fellows contributed market discovery and
pitch feedback; they are not founders, owners, or the technical
team. The near-term product spine is an emergency-ready profile
that can travel with the family across fragmented care settings.
</p>
</div>
<div className="grid gap-2 sm:grid-cols-2 print:grid-cols-2 print:gap-1.5">
{proofPoints.map((point) => (
<div
key={point}
className="rounded-md border border-teal-900/10 bg-white/78 px-3 py-2 text-sm font-medium text-slate-800 print:px-2 print:py-1.5 print:text-[8.4px]"
>
{point}
</div>
))}
</div>
</section>
<section className="relative z-10 grid gap-3 border-t border-teal-900/10 pt-5 md:grid-cols-3 print:gap-2 print:pt-3">
{opportunities.map((item) => (
<div
key={item.title}
className="rounded-lg bg-teal-950 px-4 py-3 text-white print:rounded-md print:px-2.5 print:py-2"
>
<h2 className="font-serif text-lg font-semibold tracking-tight print:text-[11px]">
{item.title}
</h2>
<p className="mt-1.5 text-sm leading-relaxed text-white/78 print:text-[8.4px] print:leading-[1.32]">
{item.body}
</p>
</div>
))}
</section>
<footer className="relative z-10 mt-5 flex flex-col gap-2 border-t border-teal-900/10 pt-4 text-xs text-slate-600 sm:flex-row sm:items-center sm:justify-between print:mt-3 print:pt-2 print:text-[8px]">
<p>Sean O&apos;Connor / Founder, full owner</p>
<p>Private complex-care context / iOS TestFlight</p>
</footer>
</article>
</main>
);
}
+54
View File
@@ -0,0 +1,54 @@
import "~/styles/globals.css";
import { type Metadata } from "next";
import { Instrument_Sans, Playfair_Display } from "next/font/google";
import { ScreenBackground } from "~/components/screen-background";
import { SiteFooter } from "~/components/site-footer";
import { SiteHeader } from "~/components/site-header";
const instrumentSans = Instrument_Sans({
subsets: ["latin"],
variable: "--font-instrument-sans",
});
const playfair = Playfair_Display({
subsets: ["latin"],
variable: "--font-playfair",
});
export const metadata: Metadata = {
title: "Medscribe — be known when care gets complicated",
description:
"A private, emergency-ready medical context app for families managing complex care. Keep visits, medications, baseline, allergies, and caregiver handoffs current on device.",
icons: {
icon: [
{ url: "/favicon.ico", sizes: "any" },
{ url: "/favicon.svg", type: "image/svg+xml" },
{ url: "/favicon-32x32.png", sizes: "32x32", type: "image/png" },
{ url: "/favicon-16x16.png", sizes: "16x16", type: "image/png" },
],
apple: [{ url: "/apple-touch-icon.png", sizes: "180x180", type: "image/png" }],
},
openGraph: {
title: "Medscribe",
description:
"Be known when care gets complicated. Private medical context for families managing complex care.",
type: "website",
},
};
export default function RootLayout({
children,
}: Readonly<{ children: React.ReactNode }>) {
return (
<html lang="en" className={`${instrumentSans.variable} ${playfair.variable}`}>
<body className="min-h-screen">
<ScreenBackground />
<SiteHeader />
<main>{children}</main>
<SiteFooter />
</body>
</html>
);
}
+348
View File
@@ -0,0 +1,348 @@
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-4">
<SectionLabel>Private complex-care context</SectionLabel>
<h1 className="font-serif text-4xl leading-[1.05] font-semibold tracking-tight text-foreground sm:text-5xl lg:text-6xl">
Medscribe
</h1>
<p className="max-w-xl font-serif text-3xl leading-tight font-semibold tracking-tight text-foreground sm:text-4xl">
Be known when care gets complicated
</p>
<p className="max-w-xl text-base leading-relaxed text-muted-foreground sm:text-lg">
Medscribe is 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">
Be known before the handoff breaks
</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/20 bg-primary 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/20 bg-primary 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 hover:bg-white/90"
>
<a href="https://soconnor.dev">
Request an invite
</a>
</Button>
</CardHeader>
</Card>
</section>
</div>
);
}