// landing-2.jsx — continuation of the TranscriptAgent landing page. // Features grid, tracked-question differentiator, walkthrough, trust, levels, CTA. /* ============================================================ FIVE QUESTIONS — feature grid ============================================================ */ function FiveQuestions() { const heatmap = [ { label: 'Semiconductors', heat: [0.2, 0.3, 0.5, 0.7, 0.9, 0.95, 0.85, 0.8], delta: 38, tone: 'warm' }, { label: 'Gold miners', heat: [0.3, 0.35, 0.4, 0.5, 0.6, 0.7, 0.85, 0.95], delta: 41, tone: 'warm' }, { label: 'Recession calls', heat: [0.15, 0.2, 0.25, 0.35, 0.5, 0.6, 0.7, 0.8], delta: 33, tone: 'warm' }, { label: 'Dollar (DXY)', heat: [0.85, 0.7, 0.55, 0.45, 0.4, 0.35, 0.3, 0.25], delta: -29, tone: 'cool' }, { label: 'Regional banks', heat: [0.7, 0.6, 0.4, 0.3, 0.35, 0.45, 0.6, 0.75], delta: 12, tone: 'cool' }, { label: '10Y yield', heat: [0.5, 0.55, 0.6, 0.6, 0.55, 0.45, 0.4, 0.35], delta: -18, tone: 'cool' }, ]; return (
What the desk shows you

One dashboard. Six questions you currently cannot answer.

Each module is a lens on the same flow of commentary — the things the videos already said, just structured so you can act on them. Card names are the in-product titles you'll see on /insights.

Plus seven live strips for Anomalies, Narrative Velocity, Narrative Stability, and tracked-question matches that move with your feed in real time.

{/* 1 — themes heating up */} {/* 2 — polarization */} {/* 3 — regime (NEW) */} {/* 4 — speaker spectrum */} {/* 5 — niche assets */}
{/* 6 — voice independence */}
{[ { topic: 'Gold miners', echo: 0.22, label: 'Independent takes', detail: '4 analysts · distinct rationales' }, { topic: 'Semis (AI)', echo: 0.71, label: 'Mostly echoing', detail: '6 analysts · 3 share core argument' }, { topic: 'Regional banks', echo: 0.45, label: 'Some overlap', detail: '5 analysts · 2 shared sources' }, { topic: 'Bitcoin', echo: 0.83, label: 'High echo', detail: '8 analysts · 1 narrative dominates' }, ].map((r, i) => (
{r.topic} 0.6 ? 'chip--danger' : r.echo > 0.4 ? 'chip--warm' : 'chip--mint'}`} style={{ fontSize: 10, fontWeight: 600, padding: '3px 7px' }}> {r.label}
0.6 ? '#a7503e' : r.echo > 0.4 ? 'var(--gold)' : 'var(--brand-deep)' }} />
{r.detail}
))}
); } function FeatureCard({ span, q, name, inProduct, blurb, children }) { return (
{name} {inProduct && ( · in product: {inProduct} )}

{q}

{blurb}

{children}
); } function PolarizationQuadrant() { const dots = [ { topic: 'Gold', x: 0.8, y: 0.8 }, { topic: 'Semis', x: 0.2, y: 0.85 }, { topic: 'USD', x: 0.45, y: 0.3 }, { topic: 'Banks', x: 0.25, y: 0.55 }, { topic: 'BTC', x: 0.7, y: 0.45 }, ]; return (
{dots.map((d, i) => (
{d.topic}
))}
Consensus →
Consensus
); } /* ---- RegimeGauge: perceived (from feed) vs actual (FRED + Yahoo) ---- */ function RegimeGauge() { const regimes = ['Reflation', 'Goldilocks', 'Stagflation', 'Deflation', 'Mixed']; const perceivedIdx = 0; // late-cycle reflation const actualIdx = 1; // goldilocks (slight divergence) const Row = ({ label, idx, accent, sub }) => (
{label} {regimes[idx]}
{regimes.map((r, i) => (
))}
{regimes.map((r, i) => {r})}
{sub &&
{sub}
}
); return (
Diverges from FRED + Yahoo by +1 step. Worth a read.
); } /* ============================================================ TRACKED-QUESTION DIFFERENTIATOR ============================================================ */ function DifferentiatorTracked() { const questions = [ 'Is anyone turning bearish on semiconductors?', 'Who is still bullish on the dollar?', 'Are gold miners getting mentioned with evidence?', 'Is regional bank stress coming back?', ]; return (
Tracked questions

The product does not summarize what happened. It watches for what you care about.

Type a research question once. TranscriptAgent scans every new video against it and only pings you when someone genuinely answers — and gets sharper with every relevance signal you give it.

{questions.map((q, i) => (
{q} Tracking
))}
); } function MatchedQuestion() { return (
New answer · 2 minutes ago

“Is anyone turning bearish on semiconductors?”

Was this on the mark?
); } function FeedbackBtn({ label, tone }) { return ( ); } function FeedbackLoop() { return (
How the agent learns
{[ { label: 'You ask', icon: 'search' }, { label: 'New video', icon: 'play' }, { label: 'Match check', icon: 'flask' }, { label: 'You rate it', icon: 'check' }, ].map((n, i) => (
{n.label}
))}

After ~40 reviews the matcher tunes to your bar. Loops back: every signal tightens the threshold.

); } /* ============================================================ REAL-WEEK WALKTHROUGH ============================================================ */ function RealWeekWalkthrough() { const steps = [ { num: '01', title: 'You ask', body: 'Is anyone turning bearish on semiconductors?' }, { num: '02', title: 'New Bianco video drops', body: 'Forward Guidance · 38 min. Indexer pulls the transcript automatically.' }, { num: '03', title: 'Claims are extracted', body: '“Semis priced for perfection on AI capex.” Bearish · evidence 5/5 · hype 2/5.' }, { num: '04', title: 'Matcher routes the relevant one', body: 'Bianco · flagged. Alden mentions semis but stays mixed — still flagged. Wood off-topic — skipped.' }, { num: '05', title: 'Dashboard flips the theme', body: 'Semis moves from “consensus bull” to “mixed / more divided.” 3 bull · 3 bear.' }, ]; return (
How it plays out

One real research question, one real week.

{steps.map((s, i) => (
{s.num}

{s.title}

{s.body}

))}
); } /* ============================================================ GROUNDING / TRUST ============================================================ */ function GroundingTrust() { return (
Always grounded

Every answer points back to the video, speaker, and claim it came from.

This isn't a model freestyling about markets. TranscriptAgent can only tell you what was actually said — on a channel you chose to follow. Every claim carries an evidence score, a hype score, a speaker, and a one-click path to the exact line in the transcript.

    {[ ['Claim text', 'as it appears in the structured layer'], ['Speaker + channel', 'attribution is a first-class field'], ['Stance + conviction', 'bullish / bearish / mixed · 1–3 dots'], ['Evidence score', '0–1 · rated against the claim itself'], ['Hype score', '0–1 · separate from evidence, calibrated to your eye'], ['Citation link', 'video title · timestamp · transcript snippet'], ].map(([k, v], i) => (
  • {k} — {v}
  • ))}
); } function EvidenceTrail() { return (
Claim → evidence trail
{/* paired Evidence + Hype */}
traces back to
“…and so when I look at the rate differential I think the floor is closer than people are saying, even if structurally the path is still down…”
); } /* ---- ScoreRow: 5-dot Evidence / Hype indicator ---- */ function ScoreRow({ label, score, max = 5, tone = 'deep', hint }) { const onColor = tone === 'gold' ? 'var(--gold)' : 'var(--brand-deep)'; const offColor = 'rgba(28,51,67,0.12)'; return (
{label} {hint} · {score}/{max}
{Array.from({ length: max }).map((_, i) => ( ))}
); } /* ============================================================ LEVELS — 5 tiers matching LEVEL_DEFINITIONS / LEVEL_FEATURE_GATES ============================================================ */ function LevelsSection() { /* Per-tier visual + copy props (designer-controlled). The tier label, name, and threshold are overlaid from window.__landingData.levels when present so they track LEVEL_DEFINITIONS in training_points_service.py automatically. If the server payload is missing (e.g. running the bundle outside the app) the hardcoded fallbacks render. */ const visualByName = { Observer: { bg: '#fff', border: 'var(--border-warm)', dot: 'var(--ink-muted)', accent: 'var(--ink-slate)', note: 'Paste your first channels, read the global Insights view — and start the loop with your first tracked question.', perks: ['Follow channels', 'Neutral video reads', 'Your first tracked question', 'Custom Reports', 'Research Lab shell'] }, Apprentice: { bg: 'var(--surface-warm)', border: 'var(--border-warmer)', dot: 'var(--gold)', accent: 'var(--brand-bronze)', note: 'The agent learns your read: your feed becomes the dashboard.', perks: ['Personalized Analysis', 'Insights · My Feed + Compare', 'Daily Brief + Question Inbox', 'Track up to 5 questions', '2-source Compare Views'] }, Analyst: { bg: 'var(--surface-cream-hl)', border: '#ecd58a', dot: 'var(--brand-bronze)', accent: 'var(--brand-bronze)', note: 'Bring in your own material. Compare three views at once.', perks: ['Build From Material (upload docs)', '3-source Compare Views', 'Longer reports'] }, Strategist: { bg: 'var(--surface-paper)', border: 'var(--brand-bronze)', dot: 'var(--brand-bronze)', accent: 'var(--brand-bronze)', note: 'Stress-test your theses against the opposite side.', perks: ['Thesis Stress Test (bull vs. bear)', '4-source Compare Views', 'Detailed reports'], bronze: true }, Architect: { bg: 'var(--brand-deep)', border: 'var(--brand-deep)', dot: 'var(--gold-bright)', accent: 'var(--gold-bright)', note: 'The full unlock. Community-spanning research opens up.', perks: ['Ask the Network', 'Deep agent memory', 'No depth limits'], dark: true }, }; /* Fallback tier list — used when window.__landingData.levels is absent. Mirrors LEVEL_DEFINITIONS as of 2026-05-18 so the static bundle and the live page stay visually identical. */ const FALLBACK_LEVELS = [ { number: 1, tier: 'I', name: 'Observer', threshold: 'Free' }, { number: 2, tier: 'II', name: 'Apprentice', threshold: '50 pts' }, { number: 3, tier: 'III', name: 'Analyst', threshold: '200 pts' }, { number: 4, tier: 'IV', name: 'Strategist', threshold: '600 pts' }, { number: 5, tier: 'V', name: 'Architect', threshold: '1,500 pts' }, ]; const serverLevels = (typeof window !== 'undefined' && window.__landingData && Array.isArray(window.__landingData.levels)) ? window.__landingData.levels : null; const levelSpine = serverLevels && serverLevels.length > 0 ? serverLevels : FALLBACK_LEVELS; const fallbackVisual = visualByName.Observer; const tiers = levelSpine.map((lvl) => { const visual = visualByName[lvl.name] || fallbackVisual; return { ...visual, tier: lvl.tier, name: lvl.name, threshold: lvl.threshold }; }); return (
Free to start · levels you earn

Free to start. More depth unlocks as your agent learns.

Levels aren't a paywall meter — there is no paid plan. Each tier is earned through training points, granted for in-app actions like rating insights, scheduling reports, and reviewing claims. We can't know your read the second you sign up — so the personalized lenses calibrate as you teach it.

Day one you get the global desk, a daily brief, catalysts, neutral reads, and your first tracked question. After a few reviews (~50 pts) the agent flips on My Feed, Compare, more tracked questions, and personalized analysis — tuned to you.

Names and gates match LEVEL_DEFINITIONS in the codebase.

Looking for pricing? There isn't one. Every tier is free — you earn it.
{tiers.map((t, i) => (
{/* tier circle */}
{t.tier}
Level {t.tier}
{t.name}
{/* threshold pill */}
{t.threshold}
{/* note */}
{t.note}
{/* perks */}
    {t.perks.map((p, j) => (
  • {p}
  • ))}
))}
); } /* ============================================================ FINAL CTA ============================================================ */ function FinalCTA() { return (
From the channels you watch to a research desk that works for you

Build your research desk from the channels you already watch.

TranscriptAgent helps you organize market commentary and research narratives. It does not tell you what to buy.

); } /* ============================================================ TIME AXIS — Today's Diff (backward) + Catalyst Calendar (forward). The feature grid above shows today's STATE; these two read the clock: what just changed, and what's coming that the feed cares about. Both are real surfaces in the product. ============================================================ */ function TimeAxisCard({ name, direction, title, blurb, children }) { return (
{name} · {direction}

{title}

{blurb}

{children}
); } function TimeAxisBand() { const chip = { fontSize: 11, fontWeight: 600, padding: '4px 9px' }; const cal = [ { when: 'Jun 12', what: 'US CPI', note: '3 channels flagged · split on path' }, { when: 'Jun 18', what: 'FOMC decision', note: 'dot-plot the real event' }, { when: 'Jun 25', what: 'NVDA — Computex read-through', note: '5 speakers positioned' }, ]; return (
The time axis

Markets move in time. The desk reads both directions.

The lenses above show today's state. These two read the clock — what just changed since yesterday, and what's coming that your channels already care about.

New today · semis “priced for perfection” Framing flipped · a rates story, not an AI story Faded · regional-bank stress
{cal.map((c, i) => (
{c.when} {c.what} {c.note}
))}
); } Object.assign(window, { FiveQuestions, DifferentiatorTracked, RealWeekWalkthrough, GroundingTrust, LevelsSection, FinalCTA, TimeAxisBand, });