Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions components/Footer.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { BLOG_LINK, DEVELOPER_LINKS } from 'data/developerLinks'
import { track, EVENTS } from 'utils/analytics'
import repositoryStatsView from 'utils/repositoryStatsView'
import repositoryStatsSelection from 'utils/repositoryStatsSelection'
import useLiveRepositoryStats from 'utils/useLiveRepositoryStats'
import styles from './Footer.module.css'

const { sourceLabel } = repositoryStatsView
Expand Down Expand Up @@ -56,8 +57,10 @@ function ForkOcticon() {
)
}

// Repository counts refresh at build/ISR time. A visitor does not need a
// repeating timer or a client-side fetch for a value that changes over hours.
// Repository counts server-render from build/ISR data, then converge through
// one shared same-origin refresh (utils/useLiveRepositoryStats) so every page
// shows the same number. No repeating timer, and never api.github.com from a
// visitor's browser.
function RepositorySource({ stats }) {
const label = sourceLabel(stats, Date.now())
return (
Expand Down Expand Up @@ -134,9 +137,9 @@ export default function Footer({
}) {
const currentYear = new Date().getFullYear()
const qualificationHref = '/qualify'
const stats = validStats(repositoryStats)
? repositoryStats
: OPENADAPT_STATS_SNAPSHOT
const stats = useLiveRepositoryStats(
validStats(repositoryStats) ? repositoryStats : OPENADAPT_STATS_SNAPSHOT
)

return (
<div className={styles.footerContainer}>
Expand Down Expand Up @@ -275,6 +278,11 @@ export default function Footer({
Healthcare
</FooterLink>
</li>
<li>
<FooterLink href="/solutions/dental">
Dental
</FooterLink>
</li>
<li>
<FooterLink href="/solutions/lending">
Lending
Expand Down
83 changes: 83 additions & 0 deletions components/HeroProofStrip.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import Link from 'next/link'

import benchmark from '../data/benchmark.json'
import { ATTRIBUTION_SHORT } from '../lib/benchmarkProvenance'

/*
* Compact run-economics strip directly under the hero.
*
* The sharpest published numbers on this site sat only on /compare; a visitor
* who never clicked through left without them. This strip surfaces the same
* three figures beside the hero, derived from data/benchmark.json with the
* same formulas as /compare's charts, so the two surfaces cannot state
* different numbers. Registered in data/published-version-claims.json under
* attribution_required: the ATTRIBUTION_SHORT chip below must stay next to
* the figures.
*
* Scope stays honest: these are measured MockMed benchmark results, labelled
* as such, with the full method, samples, and caveats one click away.
*/
const mm = benchmark.mockmed

const speedup = (mm.agent.wall_s_p50 / mm.compiled.wall_s_p50).toFixed(1)
const agentCost = `$${mm.agent.cost_usd_per_run.toFixed(2)}`

const STATS = [
{
figure: `${mm.compiled.model_calls_per_run} model calls`,
caption: 'on a healthy replay',
},
{
figure: `${speedup}× faster`,
caption: 'median run vs. a computer-use agent',
},
{
figure: `$0 vs ${agentCost}`,
caption: 'model cost per run',
},
]

export default function HeroProofStrip() {
return (
<section
className="border-b border-hairline bg-panel px-5 py-8"
data-testid="hero-proof-strip"
>
<div className="mx-auto max-w-5xl">
<p className="text-center text-base leading-relaxed text-ink-2 md:text-lg">
Show it once. It runs the same way every time. If anything
looks wrong, it stops and asks a person instead of
guessing.
</p>
<div className="mt-6 grid gap-3 sm:grid-cols-3">
{STATS.map((stat) => (
<div
key={stat.figure}
className="rounded-xl border border-hairline bg-ground p-4 text-center"
>
<p className="font-display text-2xl font-semibold tracking-tight text-ink tnum">
{stat.figure}
</p>
<p className="mt-1 text-sm leading-relaxed text-ink-2">
{stat.caption}
</p>
</div>
))}
</div>
<p className="mt-4 flex flex-wrap items-center justify-center gap-x-4 gap-y-2 text-sm text-ink-3">
<span className="chip-evidence">{ATTRIBUTION_SHORT}</span>
<span>
Measured on the MockMed benchmark, reproducible from
source.
</span>
<Link
href="/compare#benchmark-evidence"
className="font-medium text-accent"
>
Method, samples, and caveats →
</Link>
</p>
</div>
</section>
)
}
27 changes: 22 additions & 5 deletions components/MastHead.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import Link from 'next/link'
import ReplayHero from '@components/ReplayHero'
import AttendedDecisionPreview from '@components/AttendedDecisionPreview'
import { track, EVENTS } from 'utils/analytics'
import useLiveRepositoryStats from 'utils/useLiveRepositoryStats'

import styles from './MastHead.module.css'

const formatStars = (n) =>
n >= 1000 ? `${(n / 1000).toFixed(1).replace(/\.0$/, '')}k` : String(n)

export default function Home({ githubStats }) {
export default function Home({ githubStats: initialGithubStats }) {
// Same live source and same en-US formatting as the footer, so the hero
// and the footer can never show two different star counts for the same
// repository on the same page view.
const githubStats = useLiveRepositoryStats(initialGithubStats)
return (
<div className={styles.section}>
<div className="relative flex items-center justify-center">
Expand Down Expand Up @@ -40,7 +42,10 @@ export default function Home({ githubStats }) {
style={{ border: '1px solid var(--hairline)' }}
>
<span aria-hidden="true">★</span>
{formatStars(githubStats.stars)} stars on OpenAdapt
{githubStats.stars.toLocaleString(
'en-US'
)}{' '}
stars on OpenAdapt
<span className="text-ink-3">
· {githubStats.forks} forks
</span>
Expand Down Expand Up @@ -76,6 +81,18 @@ export default function Home({ githubStats }) {
>
Qualify one workflow
</Link>
<Link
className="btn-ghost-ink"
href="/book"
data-testid="book-call-cta"
onClick={() =>
track(EVENTS.HERO_CTA_CLICK, {
cta: 'book_call',
})
}
>
Book a 30-minute call
</Link>
<Link
className="btn-ghost-ink"
href="/start"
Expand Down
1 change: 1 addition & 0 deletions components/NavHeader.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ const CLOUD_APP_URL = 'https://app.openadapt.ai'

const SOLUTIONS_LINKS = [
{ label: 'Healthcare', href: '/solutions/healthcare' },
{ label: 'Dental', href: '/solutions/dental' },
{ label: 'Lending', href: '/solutions/lending' },
{ label: 'Insurance', href: '/solutions/insurance' },
{ label: 'Partners & OEM', href: '/partners' },
Expand Down
17 changes: 11 additions & 6 deletions components/Pricing.js
Original file line number Diff line number Diff line change
Expand Up @@ -347,12 +347,17 @@ export default function Pricing({ hostedOffer = null }) {
One qualification conversation scopes the whole
path.
</p>
<Link
href="/qualify"
className="btn-ghost-ink mt-6 inline-block"
>
Qualify one workflow
</Link>
<div className="mt-6 flex flex-wrap gap-3">
<Link
href="/qualify"
className="btn-ghost-ink"
>
Qualify one workflow
</Link>
<a href="#book" className="btn-ghost-ink">
Book a 30-minute call
</a>
</div>
</div>

<ol className="divide-y divide-hairline border-y border-hairline">
Expand Down
6 changes: 5 additions & 1 deletion components/RdpHybridPresentation.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@ import { useEffect, useMemo, useRef, useState } from 'react'
import JsonArtifactLink from './JsonArtifactLink'
import styles from './RdpHybridPresentation.module.css'

// Rendered when a viewer opens the raw video without its exported timeline.
// This states a design property, not an error: phase annotations come only
// from the run's exported timeline, so without it OpenAdapt shows the
// authenticated recording as-is rather than guessing phases from playback.
const MISSING_TIMELINE =
'The media timeline is unavailable. OpenAdapt shows the authenticated video and artifacts, but it does not infer a phase from playback time.'
'By design, OpenAdapt never infers a workflow phase from playback time. Phase annotations come from the exported run timeline; here the authenticated video and artifacts are shown as recorded.'

// These labels explain exact renderer phases. Runtime facts stay in the
// exported timeline and are never reconstructed from playback time.
Expand Down
22 changes: 13 additions & 9 deletions data/published-version-claims.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,17 @@
"id": "status-manifest-component-versions",
"kind": "pypi-latest",
"source_of_truth": "public/status.json#/versions",
"verified_on": "2026-08-01",
"evidence": "Published package and GitHub release records on 2026-08-01: openadapt 1.10.3, openadapt-flow 1.27.1, openadapt-capture 1.2.2, openadapt-desktop 0.15.0.",
"verified_on": "2026-08-02",
"evidence": "Published package and GitHub release records on 2026-08-02: openadapt 1.10.4, openadapt-flow 1.28.0, openadapt-capture 1.2.2, openadapt-desktop 0.15.0.",
"packages": {
"launcher": "openadapt",
"flow": "openadapt-flow",
"capture": "openadapt-capture",
"desktop": "openadapt-desktop"
},
"versions": {
"launcher": "1.10.3",
"flow": "1.27.1",
"launcher": "1.10.4",
"flow": "1.28.0",
"capture": "1.2.2",
"desktop": "0.15.0"
}
Expand All @@ -57,12 +57,12 @@
"evidence": "openadapt-flow cbec44c2c2f355d5cc04a72ea9267e2d6ea68ac6 declares version = \"0.1.0\" in pyproject.toml and describes as v0.1.0-24-gcbec44c; v0.2.0 (2026-07-11) is the first release tag containing it.",
"verified_on": "2026-07-27",
"acknowledged_release_lag": {
"as_of_release": "1.27.1",
"releases_behind": 73,
"minor_releases_behind_first_containing_tag": 25,
"acknowledged_on": "2026-07-31",
"as_of_release": "1.28.0",
"releases_behind": 74,
"minor_releases_behind_first_containing_tag": 26,
"acknowledged_on": "2026-08-02",
"review_by": "2026-10-31",
"note": "73 live openadapt-flow releases postdate 0.1.0, and v0.2.0 -- the first release tag containing the pinned commit -- is 25 minor releases behind 1.27.1. That is recorded, labelled on every surface that renders them, and deliberately NOT edited -- these are historical measurements. The lag may not grow past the acknowledged value without a decision, and the acknowledgement expires on review_by so it cannot be renewed by silence. Refreshing means re-running the benchmarks: MockMed is deterministic and CI-reproducible; OpenEMR runs against a shared public demo that resets daily, so its refresh is a field run whose numbers will legitimately differ. Re-acknowledged on 2026-07-31 for v1.27.1 (70 -> 73). review_by is deliberately UNCHANGED at 2026-10-31: restating the count is not a decision to keep waiting, and this acknowledgement must still expire on its original date."
"note": "74 live openadapt-flow releases postdate 0.1.0, and v0.2.0 -- the first release tag containing the pinned commit -- is 26 minor releases behind 1.28.0. That is recorded, labelled on every surface that renders them, and deliberately NOT edited -- these are historical measurements. The lag may not grow past the acknowledged value without a decision, and the acknowledgement expires on review_by so it cannot be renewed by silence. Refreshing means re-running the benchmarks: MockMed is deterministic and CI-reproducible; OpenEMR runs against a shared public demo that resets daily, so its refresh is a field run whose numbers will legitimately differ. Re-acknowledged on 2026-08-02 for v1.28.0 (73 -> 74). review_by is deliberately UNCHANGED at 2026-10-31: restating the count is not a decision to keep waiting, and this acknowledgement must still expire on its original date."
},
"attribution_required": [
{
Expand All @@ -77,6 +77,10 @@
"file": "components/ProofBand.js",
"context": "Measured on Flow {benchmark.provenance.flow_version},"
},
{
"file": "components/HeroProofStrip.js",
"context": "{ATTRIBUTION_SHORT}"
},
{
"file": "pages/research.js",
"context": "<BenchmarkAttribution className=\"mt-4 max-w-3xl\" />"
Expand Down
14 changes: 8 additions & 6 deletions pages/about.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,12 +174,14 @@ export default function AboutPage() {
oracle, execution boundary, and fastest path to a
production deployment.
</p>
<Link
href="/qualify"
className="btn-ink mt-5 inline-block"
>
Evaluate a workflow
</Link>
<div className="mt-5 flex flex-wrap justify-center gap-3">
<Link href="/book" className="btn-ink">
Book a 30-minute call
</Link>
<Link href="/qualify" className="btn-ghost-ink">
Evaluate a workflow
</Link>
</div>
</div>
</div>

Expand Down
18 changes: 18 additions & 0 deletions pages/call.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// Redirect stub: /call is the low-friction "talk to a human" path used in
// outreach. The canonical scheduler page is /book, which embeds the Cal.com
// destination defined in utils/booking.js (DEFAULT_BOOKING_URL) — change the
// scheduler there, not here. Non-permanent so this route can later become its
// own page without fighting cached 308s. Redirect stubs stay out of
// sitemap.xml and llms.txt (tests/aiDiscoverability.test.js enforces this).
export default function CallPage() {
return null
}

export function getServerSideProps() {
return {
redirect: {
destination: '/book',
permanent: false,
},
}
}
6 changes: 3 additions & 3 deletions pages/execute.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const description =
const STEPS = [
{
number: '01',
title: 'Qualify one transaction',
title: 'Qualify one workflow',
body: 'We bind the intended inputs, identity checks, effect proof, target environment, and exception path to one workflow version.',
},
{
Expand Down Expand Up @@ -67,7 +67,7 @@ export default function ExecutePage() {
</p>
<div className="mt-8 flex flex-col gap-3 sm:flex-row sm:items-center">
<Link href="/qualify" className="btn-ink text-center">
Qualify one transaction
Qualify one workflow
</Link>
<Link href="/partners#apply" className="btn-ghost-ink text-center">
Discuss an OEM integration
Expand Down Expand Up @@ -191,7 +191,7 @@ export default function ExecutePage() {
We qualify the first workflow with your team. That creates the reusable execution contract, customer-runner plan, mobile operator decision path, and evidence needed to scale it through your product.
</p>
<div className="mt-7 flex flex-col gap-3 sm:flex-row">
<Link href="/qualify" className="btn-ink text-center">Qualify one transaction</Link>
<Link href="/qualify" className="btn-ink text-center">Qualify one workflow</Link>
<Link href="/partners#apply" className="btn-ghost-ink text-center">Talk to partnerships</Link>
</div>
</div>
Expand Down
2 changes: 2 additions & 0 deletions pages/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import CustomerCaseStudy from '@components/CustomerCaseStudy'
import DashboardShowcase from '@components/DashboardShowcase'
import FinalQualificationCta from '@components/FinalQualificationCta'
import Footer from '@components/Footer'
import HeroProofStrip from '@components/HeroProofStrip'
import HowItWorksCondensed from '@components/HowItWorksCondensed'
import MastHead from '@components/MastHead'
import ProductStatus from '@components/ProductStatus'
Expand Down Expand Up @@ -157,6 +158,7 @@ export default function Home({ githubStats, hostedOffer }) {
/>
</Head>
<MastHead githubStats={currentGithubStats} />
<HeroProofStrip />
<div id="customer-result">
<Reveal>
<CustomerCaseStudy />
Expand Down
Loading
Loading