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.
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 (
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 (
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 storyFaded · regional-bank stress