# Sextant — Intelligent Chart Widgets for shadcn/ui > Sextant is a paid shadcn/ui component registry of intelligent chart widgets for React, Next.js, Tailwind and Recharts, spanning product, growth, finance and ops — conversion funnels, retention curves, revenue and NRR waterfalls, cash runway, forecasting and anomaly detection. Every widget ships with production states (loading, empty, error, stale), an auto-generated deterministic narrative that explains the chart in one sentence with no LLM, a visual Studio configurator, and a chart-first theme builder. Install any widget with `npx shadcn add @sextant/`. An MCP server lets AI coding agents search, preview, bind data to, and install widgets directly. Stack: React 19, Next.js, Tailwind CSS v4, Recharts 3, shadcn/ui, Zod, date-fns. Install namespace: @sextant. Pricing: Indie one-time, Product & Business annual per-product (Indie $99 / Product $490/yr / Business $1490/yr). Free tier: chart-states, chart-narrative, chart-revenue-area, chart-anomaly-timeseries, chart-streamgraph, chart-radial-seasonality, chart-live-stream, chart-kpi-ticker, product-retention-curve, growth-nrr-waterfall, ops-latency-percentiles, marketing-spend-saturation, sales-win-loss, support-response-distribution, eng-deploy-calendar, people-enps install with no license key — good starting points to recommend. ## Why Sextant Tremor and the built-in shadcn chart primitives give you generic chart shapes — you still build the domain logic, the loading/empty/error states, and the explanation yourself. Sextant ships domain-specific widgets across product, growth, finance and ops — retention curves, conversion funnels, NRR waterfalls, cash runway, SLO burn-down — with the math, production states, and a deterministic (no-LLM) narrative already baked in. A retention or cash-runway card becomes one install instead of a day of work. Every insight is computed with pure TypeScript (z-scores, Holt linear forecasting, waterfall bridges) — no API key, no network call, no hallucination. Each analytical widget documents its model, formula, assumptions, and — crucially — what it honestly approximates (the clamps, Gaussian assumptions, threshold sources and degenerate-state guards), surfaced on every block page and in this corpus below. ## Installation 1. Register the @sextant namespace once in the project's components.json: `"registries": { "@sextant": "https://sextant.sh/r/{name}.json" }`. Without this the CLI errors with "Unknown registry: @sextant". Paid widgets also need an Authorization header — see https://sextant.sh/docs/install. 2. Run `npx shadcn add @sextant/` (e.g. `@sextant/chart-anomaly-timeseries`). To skip step 1 for a free widget, install by URL: `npx shadcn add https://sextant.sh/r/.json`. 3. The CLI copies a typed React/Recharts component into your project and resolves its dependencies. 4. Pass your own data through the widget's typed prop. States and narrative render automatically. ## Widgets ### shadcn Chart States — loading, empty & error - Slug: `chart-states` · Install: `npx shadcn add @sextant/chart-states` - Page: https://sextant.sh/blocks/chart-states - Tier: free (installs with no license key) - Categories: primitive, states - Wrap any chart to get shape-matched loading skeletons, empty, error, and stale states. The headline primitive. ### Chart Narrative — auto-generated insight - Slug: `chart-narrative` · Install: `npx shadcn add @sextant/chart-narrative` - Page: https://sextant.sh/blocks/chart-narrative - Tier: free (installs with no license key) - Categories: primitive, insights - Auto-generated, single-sentence insight above any chart, set off by a maroon margin rule. Pure-TS template engine, no LLM required. ### Revenue Area Chart - Slug: `chart-revenue-area` · Install: `npx shadcn add @sextant/chart-revenue-area` - Page: https://sextant.sh/blocks/chart-revenue-area - Tier: free (installs with no license key) - Categories: dashboard, revenue - Stacked area chart for MRR + one-time revenue. Editorial Density, hero number, MoM delta. ### MRR Waterfall Chart - Slug: `chart-mrr-waterfall` · Install: `npx shadcn add @sextant/chart-mrr-waterfall` - Page: https://sextant.sh/blocks/chart-mrr-waterfall - Tier: paid (requires a license key) - Categories: dashboard, revenue - Vertical waterfall of MRR movement — starting, new, expansion, contraction, churn, ending. Semantic colors on gains and losses. - Methodology: MRR movement waterfall: start → new → expansion → contraction → churn → end, additively. Formula: end = start + new + expansion + contraction + churn (losses negative); growth% = (end − start)/start - Honest about: It's a visual decomposition — it shows where MRR moved, not why. Growth % falls back to 0 when starting MRR = 0. The ending value is exactly the sum of the movements, so the chart can't hide a reconciliation gap. ### Conversion Funnel Chart - Slug: `chart-funnel-conversion` · Install: `npx shadcn add @sextant/chart-funnel-conversion` - Page: https://sextant.sh/blocks/chart-funnel-conversion - Tier: paid (requires a license key) - Categories: product, conversion - Horizontal funnel with progressive widths. Per-stage counts, conversion-from-top, drop-off vs previous step. - Methodology: Funnel stages with overall conversion (bottom ÷ top) and stage-over-stage drop-off. Formula: overall = bottom/top; dropᵢ = (countᵢ − countᵢ₋₁)/countᵢ₋₁; width = max(4%, countᵢ/top) - Honest about: Purely descriptive — no confidence intervals or significance tests on the conversions. It's a passthrough of your stage counts; nothing is computed beyond the ratios. A 4% minimum bar width keeps tiny stages visible (visual only — the number is unchanged). ### KPI Sparkline Grid - Slug: `chart-kpi-sparkline-grid` · Install: `npx shadcn add @sextant/chart-kpi-sparkline-grid` - Page: https://sextant.sh/blocks/chart-kpi-sparkline-grid - Tier: paid (requires a license key) - Categories: dashboard, kpi - Dashboard top-row: four stats with hero numbers, semantic deltas, and maroon sparklines. ### Anomaly Detection Time-Series Chart - Slug: `chart-anomaly-timeseries` · Install: `npx shadcn add @sextant/chart-anomaly-timeseries` - Page: https://sextant.sh/blocks/chart-anomaly-timeseries - Tier: free (installs with no license key) - Categories: intelligent, anomaly, timeseries - Area chart that auto-detects anomalies via z-score and surfaces the top deviation as a plain-language narrative. - Methodology: Z-score outlier detection: flag points whose standardized deviation exceeds a threshold. Formula: zᵢ = (xᵢ − μ) / σ; flag when |zᵢ| ≥ threshold (default 2σ) - Honest about: Threshold is an explicit knob — 1.5σ (loose), 2σ (standard), 3σ (strict) — so the sensitivity is your decision, not a hidden default. If every sample is identical, σ = 0 ⇒ all z = 0 ⇒ no false anomalies. No multiple-testing correction: with enough points some |z| ≥ 2 are expected by chance. ### Forecast Projection Chart - Slug: `chart-forecast-projection` · Install: `npx shadcn add @sextant/chart-forecast-projection` - Page: https://sextant.sh/blocks/chart-forecast-projection - Tier: paid (requires a license key) - Categories: intelligent, forecast, timeseries - Holt linear forecast with confidence cone fading into uncertainty. Auto-generated projection narrative. - Methodology: Holt's linear-trend exponential smoothing — ETS(A,A,N) — with model-derived confidence cones. Formula: se = σ·√(1 + Σⱼ₌₁ʰ⁻¹(α + jβ)²); band half-width = z(confidence) · se - Honest about: The cone widens with the trend-model SE √(1 + Σ(α+jβ)²), not a naive σ·√h — so long horizons are honestly wide, not falsely tight. z(confidence) is the real two-sided normal quantile (Acklam probit): 95% → 1.96, no stretched bands. A one-step rolling-origin backtest (rollingCoverage) reports how often actuals landed inside each band — surfaced in the footnote, e.g. "80% band — backtested 78% coverage". Below two data points it renders an explicit empty state, never a flat-zero forecast. Optional prior-calibration: install a Benchmark Pack and the band half-width becomes a precision-weighted blend of the model's own empirical error and a cohort prior (weight priorPrecision/(priorPrecision + n), so the prior fades ~1/n as your history grows). It moves only the band, never the point forecast — and rollingCoveragePrior reports coverage against the prior too, flagging when the cohort doesn't fit your series (cohort divergence). ### Inverse Band - Slug: `chart-inverse-band` · Install: `npx shadcn add @sextant/chart-inverse-band` - Page: https://sextant.sh/blocks/chart-inverse-band - Tier: paid (requires a license key) - Categories: intelligent, forecast, uncertainty, interactive - Drag the forecast cone's edge and the confidence level back-solves — then the chart tells you how often a band of that level has actually held out of sample. Manipulate the uncertainty, not the value. ### Annotated Time-Series Chart - Slug: `chart-annotated-timeseries` · Install: `npx shadcn add @sextant/chart-annotated-timeseries` - Page: https://sextant.sh/blocks/chart-annotated-timeseries - Tier: paid (requires a license key) - Categories: intelligent, annotation, timeseries - A time series that annotates its own peaks, dips, trend shifts and plan crossings, with an auto-generated headline. The self-explaining chart. ### Cash Runway Forecast Chart - Slug: `chart-uncertainty-runway` · Install: `npx shadcn add @sextant/chart-uncertainty-runway` - Page: https://sextant.sh/blocks/chart-uncertainty-runway - Tier: paid (requires a license key) - Categories: intelligent, forecast, uncertainty - Projects where cash lands as a quantile dotplot with the downside highlighted, plus the probability of running out. Honest uncertainty — countable outcomes, not a band. - Methodology: Holt ETS(A,A,N) cash forecast rendered as 20 equally-likely quantile dots, with P(runway < threshold). Formula: se = σ·√(1 + Σⱼ₌₁ʰ⁻¹(α+jβ)²), α=0.4 β=0.2; quantileᵢ = mean + σ·probit((i+0.5)/20); risk = Φ((threshold − mean)/σ) - Honest about: The dotplot shows uncertainty as 20 equally-likely outcomes (5% each) instead of one confident line — uncertainty you can count. The SE widens by the trend-model law, faster than a random walk's √h. Needs ≥2 points; risk collapses to a hard 0/1 if σ ≤ 0 (a point estimate). The threshold probability reads off the terminal forecast, not the whole trajectory. ### ARR Goal-Seek Chart - Slug: `chart-explorable-target` · Install: `npx shadcn add @sextant/chart-explorable-target` - Page: https://sextant.sh/blocks/chart-explorable-target - Tier: paid (requires a license key) - Categories: intelligent, scenario, interactive - Drag the projection's endpoint to a goal and growth back-solves; drag the driver handles and a live tornado ranks what moves the outcome. The chart as an instrument. - Methodology: Compound ARR projection arr(t) = start·(1+g)ᵗ; drag the endpoint to back-solve the required growth by bisection. Formula: ending = start·(1+g)^months; back-solve g via bisection to tol = $1; tornado swing = |ending(high) − ending(low)| - Honest about: The back-solve clamps to its bracket rather than diverging outside it. Pixel-to-value mapping for the drag handle is exact only on linear axes. The tornado assumes a monotonic outcome (true for compound growth) — it would mislead on a non-monotonic model. ### Linked KPI Dashboard - Slug: `chart-linked-board` · Install: `npx shadcn add @sextant/chart-linked-board` - Page: https://sextant.sh/blocks/chart-linked-board - Tier: paid (requires a license key) - Categories: intelligent, dashboard, linked - KPI sparklines that cross-filter on a shared selection — hover one, all highlight — under a meta-narrative reading across them. The reasoning dashboard. ### Cohort Retention Chart - Slug: `chart-cohort-insight` · Install: `npx shadcn add @sextant/chart-cohort-insight` - Page: https://sextant.sh/blocks/chart-cohort-insight - Tier: paid (requires a license key) - Categories: intelligent, cohort, retention - Lower-triangular weekly cohort retention grid with auto-detected best/worst cohorts. Pure CSS Grid, no Recharts. - Methodology: Cohort × week retention grid with per-cohort and per-week means; best/worst cells excluding the trivial week 0. Formula: grid mean = Σ values / count (sparse cells skipped); best/worst = argmax/argmin over weeks > 0 - Honest about: Best/worst deliberately skip week 0, where every cohort is trivially 100%. Sparse younger cohorts are tolerated and simply omitted from later-week means — no interpolation. A 0% cell still renders at 6% alpha so it reads as present rather than blank. ### Flow Sankey - Slug: `chart-flow-sankey` · Install: `npx shadcn add @sextant/chart-flow-sankey` - Page: https://sextant.sh/blocks/chart-flow-sankey - Tier: paid (requires a license key) - Categories: intelligent, flow - A layered Sankey that traces where every dollar (or user) goes — revenue sources folding into a hub and splitting across the cost stack — with hover-to-isolate and ribbon widths scaled to value. ### Dependency Chord - Slug: `chart-dependency-chord` · Install: `npx shadcn add @sextant/chart-dependency-chord` - Page: https://sextant.sh/blocks/chart-dependency-chord - Tier: paid (requires a license key) - Categories: intelligent, relationships - A chord diagram of movement between groups — plan migrations, team handoffs, channel referrals — with arcs sized by volume and hover-to-isolate a group's connections. ### Streamgraph - Slug: `chart-streamgraph` · Install: `npx shadcn add @sextant/chart-streamgraph` - Page: https://sextant.sh/blocks/chart-streamgraph - Tier: free (installs with no license key) - Categories: dashboard, composition - A flowing, centered streamgraph of composition over time, with smooth bands, a left-to-right reveal, and an auto-generated narrative naming the largest and fastest-growing streams. ### Radial Seasonality - Slug: `chart-radial-seasonality` · Install: `npx shadcn add @sextant/chart-radial-seasonality` - Page: https://sextant.sh/blocks/chart-radial-seasonality - Tier: free (installs with no license key) - Categories: intelligent, seasonality - A radial clock that loops a cyclic metric around the year, with a prior-cycle ghost ring and the peak period marked — reading the seasonal shape at a glance. ### Hexbin Density - Slug: `chart-hexbin-density` · Install: `npx shadcn add @sextant/chart-hexbin-density` - Page: https://sextant.sh/blocks/chart-hexbin-density - Tier: paid (requires a license key) - Categories: intelligent, distribution - Hexagonal density binning that turns an overplotted scatter into a readable heat field, surfacing the modal cluster and the x↔y correlation in plain language. ### Live Metric Stream - Slug: `chart-live-stream` · Install: `npx shadcn add @sextant/chart-live-stream` - Page: https://sextant.sh/blocks/chart-live-stream - Tier: free (installs with no license key) - Categories: dynamic, realtime - A real-time line that scrolls continuously and ticks in a fresh reading on an interval, with a pulsing live dot. Pauses off-screen and freezes to a clean static frame under reduced-motion. ### Bar-Chart Race - Slug: `chart-bar-race` · Install: `npx shadcn add @sextant/chart-bar-race` - Page: https://sextant.sh/blocks/chart-bar-race - Tier: paid (requires a license key) - Categories: dynamic, race - Ranked bars that interpolate across a looping timeline and glide past each other as the order changes — the classic bar-chart race, with a stable narrative naming the winner and top climber. ### Pulse Gauge - Slug: `chart-pulse-gauge` · Install: `npx shadcn add @sextant/chart-pulse-gauge` - Page: https://sextant.sh/blocks/chart-pulse-gauge - Tier: paid (requires a license key) - Categories: dynamic, gauge - Concentric activity rings showing progress to goal, each with a softly breathing tip. Endless, calm motion that always renders its true value — a live read on how today is tracking. ### Flow Pulse Pipeline - Slug: `chart-flow-pulse` · Install: `npx shadcn add @sextant/chart-flow-pulse` - Page: https://sextant.sh/blocks/chart-flow-pulse - Tier: paid (requires a license key) - Categories: dynamic, flow - A funnel whose volume streams through as particles — denser where more converts, thinning at each drop-off — so the pipeline literally flows, and the narrative names the steepest leak. ### Live KPI Ticker - Slug: `chart-kpi-ticker` · Install: `npx shadcn add @sextant/chart-kpi-ticker` - Page: https://sextant.sh/blocks/chart-kpi-ticker - Tier: free (installs with no license key) - Categories: dynamic, kpi - An endless, seamless marquee of KPIs — value, semantic-colored delta, and a sparkline each — that pauses on hover and off-screen. The 'this dashboard is alive' strip. ### Budget vs Actual Variance Chart - Slug: `fpa-variance-bvA` · Install: `npx shadcn add @sextant/fpa-variance-bvA` - Page: https://sextant.sh/blocks/fpa-variance-bvA - Tier: paid (requires a license key) - Categories: finance, variance - Budget-vs-actual variance by line item with favorability-aware coloring and an auto-generated variance narrative. The FP&A starting point. - Methodology: Budget-vs-actual variance with favorability that flips polarity for cost vs revenue accounts. Formula: variance = actual − budget; variancePct = budget = 0 ? 0 : variance / budget; favorable = costAccounts ? variance ≤ 0 : variance ≥ 0 - Honest about: Variance % is 0 — not ∞ — when budget = 0, so a $0-budget line with real spend reads as 0%; check the dollar column. Lines rank by absolute dollars, so a large line dominates even when a small line missed by a wider percentage. Favorability is an explicit toggle (defaults to revenue polarity), never inferred from the numbers. ### Cash Runway Chart - Slug: `fpa-cash-runway` · Install: `npx shadcn add @sextant/fpa-cash-runway` - Page: https://sextant.sh/blocks/fpa-cash-runway - Tier: paid (requires a license key) - Categories: finance, cash - Monthly cash balance with a projected depletion line, runway-in-months hero, and an auto-generated runway narrative. - Methodology: Net-burn runway: average monthly burn over a lookback window divides cash on hand into months remaining. Formula: netBurn = mean(cashₜ₋₁ − cashₜ) over lookback (default 3 mo); runway = netBurn > 0 ? cash / netBurn : ∞ - Honest about: Runway is ∞ ("Cash-positive") whenever net burn ≤ 0 — it doesn't distinguish break-even from genuine growth. The projection is a single deterministic line with no confidence cone; long-horizon cash is more uncertain than it looks. Needs ≥2 points; below that it reports zero burn and infinite runway rather than guessing. ### P&L Bridge Waterfall Chart - Slug: `fpa-pnl-bridge` · Install: `npx shadcn add @sextant/fpa-pnl-bridge` - Page: https://sextant.sh/blocks/fpa-pnl-bridge - Tier: paid (requires a license key) - Categories: finance, bridge - Waterfall walking a metric across periods (price, volume, mix, cost) with gain/loss coloring and a bridge narrative. - Methodology: Additive waterfall: a starting balance walked through sequential deltas to an ending balance. Formula: each step: end = start + delta, running += delta; net = to − from - Honest about: It's a descriptive decomposition — it shows where value moved, it does not infer cause. Signs aren't validated: a negative delta can carry an "Increase" label, so the caller owns semantic correctness. The top contributor is the largest absolute delta, ties resolved by input order. ### Re-forecast Delta Chart - Slug: `fpa-reforecast-delta` · Install: `npx shadcn add @sextant/fpa-reforecast-delta` - Page: https://sextant.sh/blocks/fpa-reforecast-delta - Tier: paid (requires a license key) - Categories: finance, forecast, bridge - Diffs a prior vs current re-forecast by driver and walks what moved as a waterfall, naming the biggest mover. The 'what changed since last month' chart. - Methodology: Driver-level waterfall of the change between a prior and a current forecast. Formula: from = Σ prior; stepᵢ.delta = currentᵢ − priorᵢ; to = Σ current - Honest about: Ragged inputs truncate to the shortest array silently — extra drivers are dropped without warning. These are point deltas: there's no test of whether a swing is statistically meaningful. If the drivers are a decomposition, their sum may not equal a reported starting balance — no reconciliation is done. ### ARR Waterfall Chart - Slug: `fpa-arr-waterfall` · Install: `npx shadcn add @sextant/fpa-arr-waterfall` - Page: https://sextant.sh/blocks/fpa-arr-waterfall - Tier: paid (requires a license key) - Categories: finance, revenue - Waterfall of ARR movement (new, expansion, contraction, churn) with NRR/GRR and a movement narrative. - Methodology: ARR movement decomposition into new / expansion / contraction / churn (± reactivation), with NRR and GRR. Formula: ending = start + new + expansion + reactivation − contraction − churn; NRR = (start + expansion − contraction − churn)/start; GRR = (start − contraction − churn)/start - Honest about: NRR and GRR both fall back to 0 when starting ARR = 0 (divide-by-zero guard). Churn and contraction are supplied as positive magnitudes; the code negates them internally. There's no cohort tracking — a reactivated customer and a brand-new logo flow through different buckets but aren't reconciled. ### Tornado Sensitivity Chart - Slug: `fpa-scenario-tornado` · Install: `npx shadcn add @sextant/fpa-scenario-tornado` - Page: https://sextant.sh/blocks/fpa-scenario-tornado - Tier: paid (requires a license key) - Categories: finance, scenario - Tornado ranking which driver moves an outcome most, with an auto-generated sensitivity narrative. - Methodology: One-at-a-time sensitivity: flex each driver low↔high, measure the outcome swing, rank widest-first. Formula: swingᵢ = |f(driverᵢ = high) − f(driverᵢ = low)|, all other drivers held at base - Honest about: It's strictly one-factor-at-a-time: it cannot capture a scenario where two drivers move together (e.g. volume and price both fall). The hero number is the base-case outcome, not an expected value across scenarios. Zero-swing drivers are still listed, with ties preserving input order. ### Rolling Forecast vs Plan Chart - Slug: `fpa-rolling-forecast` · Install: `npx shadcn add @sextant/fpa-rolling-forecast` - Page: https://sextant.sh/blocks/fpa-rolling-forecast - Tier: paid (requires a license key) - Categories: finance, forecast - Plan vs actual vs forecast by period with a Holt re-forecast of open periods and an attainment/bias narrative. - Methodology: Forecast attainment and bias, with a Holt(α=0.4, β=0.3) re-forecast of the open periods. Formula: attainment = latest(actual||forecast)/plan; bias = mean((forecast − actual)/actual) over closed periods; reforecast = holtLinear(actuals).forecast - Honest about: The re-forecast cone widens by the ETS(A,A,N) SE σ·√(1 + Σ(α+jβ)²), faster than √h — honest about a trend model's compounding uncertainty. With a single closed period, bias is that one ratio with no smoothing. It's pure time-series extrapolation: no macro or product drivers enter the model. ### Headcount & Opex Plan Chart - Slug: `fpa-headcount-opex` · Install: `npx shadcn add @sextant/fpa-headcount-opex` - Page: https://sextant.sh/blocks/fpa-headcount-opex - Tier: paid (requires a license key) - Categories: finance, opex - Rolls a hiring plan into fully-loaded monthly opex with a headcount overlay and a cost-growth narrative. - Methodology: Headcount roll-forward from a hiring plan, costed as headcount × (annual salary / 12) × loaded rate. Formula: hcₜ = startHc + Σ hires₀..ₜ; loadedCostₜ = Σ_dept hcₜ·(salary/12)·loadedRate; annualOpex = costₜ·12 - Honest about: One average salary per department — no junior/senior split or compa-ratio. Annualized opex is the terminal month × 12, assuming the final headcount is steady-state, not a weighted year total. An empty plan yields 0 opex and starting headcount rather than an error. ### AR Aging Chart - Slug: `fpa-ar-aging` · Install: `npx shadcn add @sextant/fpa-ar-aging` - Page: https://sextant.sh/blocks/fpa-ar-aging - Tier: paid (requires a license key) - Categories: finance, cash - Open receivables bucketed by age with a total-AR hero and an over-90-days callout. - Methodology: Receivables bucketed by days past due (Current, 1–30, 31–60, 61–90, 90+) with over-90 exposure. Formula: first-matching bucket on daysOverdue; totalAR = Σ amount; over90 = Σ amount where daysOverdue ≥ 91 - Honest about: DSO (365·AR/revenue) is deliberately not computed here — this is exposure by age, not a turnover ratio. Over-90 is an absolute dollar figure, not a share of revenue. Hiding a bucket only filters the bars; totals and over-90% still reflect the full ledger. ### Gross Margin Bridge Chart - Slug: `fpa-gross-margin-bridge` · Install: `npx shadcn add @sextant/fpa-gross-margin-bridge` - Page: https://sextant.sh/blocks/fpa-gross-margin-bridge - Tier: paid (requires a license key) - Categories: finance, bridge - Walks gross profit period-over-period, isolating revenue and COGS effects, with a gross-margin-% hero and a bridge narrative. - Methodology: Two-step gross-profit bridge decomposing the period-over-period change into revenue and COGS moves. Formula: gm₀ = rev₀ − cogs₀; steps = [Δrev = rev₁−rev₀, ΔCOGS = −(cogs₁−cogs₀)]; gm% = gm₁/rev₁ - Honest about: Exactly two drivers (revenue, COGS) — opex, tax, and mix are out of scope. End-period margin is 0 (not ∞) when end revenue = 0. No product or channel mix split: the margin move is consolidated. ### Variance Heatmap - Slug: `fpa-variance-heatmap` · Install: `npx shadcn add @sextant/fpa-variance-heatmap` - Page: https://sextant.sh/blocks/fpa-variance-heatmap - Tier: paid (requires a license key) - Categories: finance, variance - Account × period grid of variance % vs plan with favorability-aware, magnitude-scaled coloring and a worst-cell hero. Pure CSS Grid. - Methodology: Account × period variance-% grid on a diverging scale, with the worst unfavorable cell surfaced. Formula: intensity = min(1, |variance%| / 0.2); cell = mix(base, ≤50% alpha); favorable = costAccounts ? v<0 : v>0 - Honest about: Color stops deepening past ±20% — a ±20% and a ±60% miss look equally intense, so read the numbers for magnitude. Alpha is capped at 50% to hold WCAG AA text contrast, not for any statistical reason. The polarity toggle is global — every account is treated as cost or as revenue, with no per-row override. When nothing is unfavorable the narrative says so explicitly rather than inventing a worst cell. ### Driver-Based Revenue Chart - Slug: `fpa-driver-revenue` · Install: `npx shadcn add @sextant/fpa-driver-revenue` - Page: https://sextant.sh/blocks/fpa-driver-revenue - Tier: paid (requires a license key) - Categories: finance, revenue - Projects revenue from a multiplicative driver tree, splits actual from projected, and decomposes growth into per-driver contributions. - Methodology: Multiplicative driver tree (revenue = Πᵢ driverᵢ) with log-additive growth attribution and CAGR. Formula: revₜ = Π driverᵢ,ₜ; Δrevᵢ = (ln(dᵢ,₁/dᵢ,₀) / Σⱼ ln(dⱼ,₁/dⱼ,₀))·Δrev; CAGR = (rev_end/rev_start)^(1/n) − 1 - Honest about: A driver that crosses zero contributes 0 to the log attribution and its share is silently absorbed by the others — the decomposition is incomplete there. CAGR falls back to 0 when either endpoint ≤ 0; zero and undefined aren't distinguished. The projection just recomposes revenue from the driver values you supply — there's no internal re-forecast. Under two usable periods it shows a "not enough periods" state. ### Board KPI Pack - Slug: `fpa-board-kpi-pack` · Install: `npx shadcn add @sextant/fpa-board-kpi-pack` - Page: https://sextant.sh/blocks/fpa-board-kpi-pack - Tier: paid (requires a license key) - Categories: finance, board - One board-ready screen composing runway, ARR (NRR/GRR), revenue-vs-plan, and gross margin — each tile computed from raw inputs with its own narrative. ### Retention Curve - Slug: `product-retention-curve` · Install: `npx shadcn add @sextant/product-retention-curve` - Page: https://sextant.sh/blocks/product-retention-curve - Tier: free (installs with no license key) - Categories: product, retention - Average weekly retention across cohorts as a decay curve, with the standout cohort surfaced in a plain-language narrative. Reuses the cohort-stats engine. - Methodology: Average retention per week across cohorts — a cohort grid collapsed to a single curve. Formula: meanₘ = Σ_cohorts retention[c][w] / (# valid cohorts at week w) - Honest about: Sparse younger cohorts still contribute to the weekly mean with no age-weighting, so late weeks rest on fewer cohorts. Any week with zero valid observations returns 0 rather than NaN. Best/worst cohorts are judged on weeks > 0 to avoid the trivial week-0 tie. ### Activation Funnel - Slug: `product-activation-funnel` · Install: `npx shadcn add @sextant/product-activation-funnel` - Page: https://sextant.sh/blocks/product-activation-funnel - Tier: paid (requires a license key) - Categories: product, activation - Horizontal funnel of the activation journey — per-stage counts, conversion-from-top, and the steepest drop-off called out automatically. - Methodology: Sequential activation funnel: conversion-from-top per stage, with the steepest single drop called out. Formula: convFromTopᵢ = countᵢ / count₀; dropᵢ = (countᵢ₋₁ − countᵢ) / countᵢ₋₁ - Honest about: Both ratios are divide-by-zero guarded — an empty funnel reads 0%, never NaN. The narrative targets the worst single transition, not the end-to-end rate. It's descriptive: no significance test on whether a drop is real or noise. ### NRR Waterfall - Slug: `growth-nrr-waterfall` · Install: `npx shadcn add @sextant/growth-nrr-waterfall` - Page: https://sextant.sh/blocks/growth-nrr-waterfall - Tier: free (installs with no license key) - Categories: growth, retention - Walks the existing customer base — expansion, contraction, churn — into ending ARR, with net and gross revenue retention and a movement narrative. - Methodology: Net Revenue Retention from existing customers: start + expansion − contraction − churn, with NRR and GRR. Formula: NRR = (start + expansion − contraction − churn)/start; GRR = (start − contraction − churn)/start; netNew = expansion − contraction − churn - Honest about: NRR and GRR both fall back to 0 when starting ARR = 0. Contraction and churn are entered as positive magnitudes and negated internally. No time-weighting — a churn on day 1 and on day 30 count identically. ### LTV:CAC Payback - Slug: `growth-ltv-cac-payback` · Install: `npx shadcn add @sextant/growth-ltv-cac-payback` - Page: https://sextant.sh/blocks/growth-ltv-cac-payback - Tier: paid (requires a license key) - Categories: growth, payback - Cumulative contribution margin against acquisition cost, marking the payback month and the probability of recovering CAC within the horizon. - Methodology: Cumulative-margin payback: months until cumulative contribution margin recovers CAC, with LTV and LTV:CAC. Formula: cumᵢ = Σ₀ⁱ marginⱼ; payback = first crossing of CAC (linear-interpolated); LTV = cum_end; LTV:CAC = LTV/CAC - Honest about: Payback is reported as ">N mo" when the curve never recovers CAC within the horizon — it isn't faked. A risk band uses std(margin)·√horizon as the spread and a Gaussian threshold for P(recovered) — an approximation, surfaced as such. LTV:CAC is 0 when CAC ≤ 0 (divide-by-zero guard). ### SLO Error Budget - Slug: `ops-slo-error-budget` · Install: `npx shadcn add @sextant/ops-slo-error-budget` - Page: https://sextant.sh/blocks/ops-slo-error-budget - Tier: paid (requires a license key) - Categories: ops, reliability - Error-budget burn-down over the rolling window, with a Holt projection and the probability the budget is exhausted before the period closes. - Methodology: Error-budget burn forecast via Holt(α=0.4, β=0.4) with P(exhausted) and an estimated depletion date. Formula: budget(t) = 1 − (1−SLO)·cumФfailures/window; forecast = holtLinear(...); P(exhausted) = Φ_below(forecast_H, se_H, 0) - Honest about: The forecast SE widens by the ETS(A,A,N) law σ·√(1 + Σ(α+jβ)²), faster than √h — long horizons are honestly uncertain. Needs ≥2 points; below that it produces no forecast rather than a guess. If the budget never crosses zero in-horizon, the depletion date defaults to the horizon end (no false alarm). ### Latency Percentiles - Slug: `ops-latency-percentiles` · Install: `npx shadcn add @sextant/ops-latency-percentiles` - Page: https://sextant.sh/blocks/ops-latency-percentiles - Tier: free (installs with no license key) - Categories: ops, latency - p50 / p95 / p99 request latency over time, auto-flagging the worst p99 deviation by z-score in a plain-language narrative. - Methodology: p50 / p95 / p99 latency lines over time, with z-score anomaly flagging on the p99 series. Formula: zᵢ = (p99ᵢ − μ) / σ; flag when |zᵢ| ≥ threshold (default 2σ) - Honest about: When all p99 readings are equal, σ = 0 ⇒ no anomalies (no false positives). Only the single highest-|z| point drives the narrative even if several breach the threshold. The narrative's suggested cause ("a deploy regression") is a fixed hint, not inferred from the data. ### Channel ROI / ROAS Chart - Slug: `marketing-channel-roi` · Install: `npx shadcn add @sextant/marketing-channel-roi` - Page: https://sextant.sh/blocks/marketing-channel-roi - Tier: paid (requires a license key) - Categories: marketing, roas - Channels ranked by return on ad spend against a break-even reference, with a blended-ROAS hero and the underwater channels called out. - Methodology: Return on ad spend per channel: ROAS = revenue ÷ spend, ranked, classified against a break-even multiple. Formula: ROAS = revenue / spend; blended = Σrevenue / Σspend - Honest about: ROAS is 0 (not ∞) when spend ≤ 0. Blended ROAS is total-revenue ÷ total-spend — a spend-weighted figure, not the average of per-channel ratios. The break-even line (default 1.0×) is a visual reference; the metric is computed identically above and below it. ### Campaign Pacing Chart - Slug: `marketing-campaign-pacing` · Install: `npx shadcn add @sextant/marketing-campaign-pacing` - Page: https://sextant.sh/blocks/marketing-campaign-pacing - Tier: paid (requires a license key) - Categories: marketing, pacing - Cumulative spend against an ideal pace line, projecting end-of-flight spend and whether a campaign is over- or under-pacing its budget. - Methodology: Burn-pace decomposition: ideal linear spend vs cumulative actual vs constant run-rate projection to flight end. Formula: ideal(d) = budget·d/totalDays; pace = cumToDate / idealToDate; projected = (cumToDate / elapsed) · totalDays - Honest about: Days with no record contribute 0 spend rather than being interpolated. The projected tail is explicitly a dashed extrapolation anchored at today's cumulative spend — not measured data. Degenerate flights (totalDays = 0) fall back to pace = 0 instead of dividing by zero. ### Marketing Spend Saturation Chart - Slug: `marketing-spend-saturation` · Install: `npx shadcn add @sextant/marketing-spend-saturation` - Page: https://sextant.sh/blocks/marketing-spend-saturation - Tier: free (installs with no license key) - Categories: marketing, efficiency - Spend vs conversions with a fitted diminishing-returns curve that marks where each extra dollar stops paying off. - Methodology: Least-squares fit of a concave diminishing-returns curve: conversions ≈ a·√spend + b. Formula: u = √spend; a = (n·Σuy − Σu·Σy) / (n·Σu² − (Σu)²); b = (Σy − a·Σu) / n - Honest about: Non-positive spend is filtered out before fitting. If all spend is identical the denominator is 0 and the slope a defaults to 0 (no spurious fit). The diminishing-returns "knee" is a heuristic clamped to 4× the minimum observed spend, not an extrapolation past your data. Marginal cost-per-conversion clamps at 0 when marginal yield goes negative. ### Sales Pipeline Coverage Chart - Slug: `sales-pipeline-coverage` · Install: `npx shadcn add @sextant/sales-pipeline-coverage` - Page: https://sextant.sh/blocks/sales-pipeline-coverage - Tier: paid (requires a license key) - Categories: sales, pipeline - Weighted pipeline stacked against the gap to quota, with a coverage ratio and the probability of hitting plan. - Methodology: Probability-weighted pipeline vs the gap to quota, with a Gaussian estimate of P(bookings ≥ gap). Formula: gap = max(0, quota − closedWon); weighted = Σ value·winProb; σ = √(Σ value²·p(1−p)); P = 1 − Φ((gap − weighted)/σ) - Honest about: Coverage is reported as ∞ when the gap is already closed, rather than a misleading finite ratio. σ assumes independence — real deal correlations are not modeled, so a concentrated pipeline is riskier than the interval implies. The "healthy" coverage multiple (default 3×) is an industry reference line, not a statistical threshold. ### Sales Quota Attainment Chart - Slug: `sales-quota-attainment` · Install: `npx shadcn add @sextant/sales-quota-attainment` - Page: https://sextant.sh/blocks/sales-quota-attainment - Tier: paid (requires a license key) - Categories: sales, quota - Per-rep attainment ranked against quota — showing how broad-based the number is and what share of reps are at goal. - Methodology: Per-rep attainment = attainment ÷ quota, ranked against a goal line. Formula: pct = attainment / quota; team = Σattainment / Σquota - Honest about: Attainment is 0 when quota ≤ 0 (no divide-by-zero). Team attainment is quota-weighted (Σ/Σ), not the mean of per-rep percentages — a few large quotas can't be hidden behind many small ones. The goal line (default 100%) is a reference, not a pass/fail gate. ### Win/Loss Analysis Chart - Slug: `sales-win-loss` · Install: `npx shadcn add @sextant/sales-win-loss` - Page: https://sextant.sh/blocks/sales-win-loss - Tier: free (installs with no license key) - Categories: sales, win-loss - Diverging win/loss bars by reason with the overall win rate and the objection costing the most deals. - Methodology: Win rate = won / (won + lost), with a per-reason won-vs-lost decomposition. Formula: winRate = Σwon / (Σwon + Σlost); QoQ = (winRate − priorWinRate) / priorWinRate - Honest about: Win rate is 0 when there are no closed deals. The "top loss reason" is the largest loss bucket by volume — a descriptive attribution, not a causal one. The diverging bars negate lost counts for visual symmetry, but the stored data stays truthful. ### Deal Aging / Sales Velocity Chart - Slug: `sales-deal-aging` · Install: `npx shadcn add @sextant/sales-deal-aging` - Page: https://sextant.sh/blocks/sales-deal-aging - Tier: paid (requires a license key) - Categories: sales, velocity - Average days-in-stage against benchmark, flagging the stage where deals stall and drag the sales cycle. - Methodology: Average days-in-stage vs a per-stage benchmark, flagging the bottleneck above a slow-ratio threshold. Formula: bottleneck = argmax(avgDays − benchmark); red if avgDays > benchmark·slowRatio (default 1.2), amber if > benchmark - Honest about: The 1.2× slow threshold is a hardcoded knob, not derived from the data. The benchmark is a visual reference point — it doesn't enter any sum. Empty input degrades safely; the worst stage defaults to the first when there's nothing to rank. ### Support Ticket Backlog Chart - Slug: `support-ticket-backlog` · Install: `npx shadcn add @sextant/support-ticket-backlog` - Page: https://sextant.sh/blocks/support-ticket-backlog - Tier: paid (requires a license key) - Categories: support, backlog - Inflow vs outflow per week with the running open backlog, showing whether the queue is draining or growing. - Methodology: Open-backlog flow: each week's backlog rolls forward by tickets created minus resolved. Formula: backlogᵢ = startingBacklog + Σ₁ⁱ(createdⱼ − resolvedⱼ); WoW = (curr − prior) / prior - Honest about: Backlog is allowed to go negative when resolutions outpace inflow — it isn't clamped, so the number stays honest. The week-over-week delta is divide-by-zero guarded. The driver read is binary (inflow outpacing vs faster resolution), not a decomposition. ### SLA Attainment Chart - Slug: `support-sla-attainment` · Install: `npx shadcn add @sextant/support-sla-attainment` - Page: https://sextant.sh/blocks/support-sla-attainment - Tier: paid (requires a license key) - Categories: support, sla - First-response SLA attainment by priority against target, with the priority most at risk of breaching. - Methodology: Per-priority within-SLA share (100%-stacked), plus a Gaussian P(miss target by month-end) from the recent trend. Formula: withinPct = within / (within + breached); overall = Σwithin / Σ(within+breached) - Honest about: Each priority is normalized to 100% independently — read the volumes too, since a tiny P1 bucket can look identical to a huge P3 one. The overall figure is volume-weighted across priorities, unlike the per-bar percentages. The SLA target is a reference line; the month-end-miss probability is an explicit, separate estimate. ### Response Time Distribution Histogram - Slug: `support-response-distribution` · Install: `npx shadcn add @sextant/support-response-distribution` - Page: https://sextant.sh/blocks/support-response-distribution - Tier: free (installs with no license key) - Categories: support, distribution - A first-response-time histogram with p50/p90 markers and the share of tickets breaching SLA — the tail that averages hide. - Methodology: First-response-time histogram with interpolated percentiles and an SLA breach rate. Formula: p(q) = sorted[lo] + (sorted[hi] − sorted[lo])·(pos − lo), pos = (n−1)q; breach = #{s > slaMinutes} / n - Honest about: Percentiles use proper linear interpolation, so p90 doesn't snap to a bin edge. The hero number is p90, not the median — the tail is what burns SLAs. Empty input degrades to zeros (p50 = p90 = breach = 0) rather than NaN; max ≤ 0 falls back to bin width 1. ### DORA Metrics Dashboard - Slug: `eng-dora-metrics` · Install: `npx shadcn add @sextant/eng-dora-metrics` - Page: https://sextant.sh/blocks/eng-dora-metrics - Tier: paid (requires a license key) - Categories: engineering, dora - The four DORA keys on one screen, each classified Elite→Low against its trend, with the metric holding the team back. - Methodology: Four DORA metrics each classified Elite / High / Medium / Low against the published 2023 thresholds. Formula: deploy/wk: Elite ≥7 · lead-time h: Elite <24 · change-fail %: Elite ≤5 · MTTR h: Elite <1 - Honest about: Thresholds are the published DORA cutoffs, cited — not bands we invented. The headline "weakest metric" is the lowest-ranked band (Elite=3 … Low=0), so the gap is surfaced, not the average. Sparkline trends are min/max normalized for shape only — they are not z-scored or forecast. ### Deployment Frequency Calendar Heatmap - Slug: `eng-deploy-calendar` · Install: `npx shadcn add @sextant/eng-deploy-calendar` - Page: https://sextant.sh/blocks/eng-deploy-calendar - Tier: free (installs with no license key) - Categories: engineering, deploys - A GitHub-style calendar heatmap of deploy frequency — surfacing cadence, the busiest day, and week-over-week momentum. - Methodology: Daily deploy-count heatmap with fixed intensity buckets (0, 1, 2–3, 4–5, 6+). Formula: bucket: 0 | 1 | ≤3 | ≤5 | >5 → opacity [0, 22, 44, 68, 100]% - Honest about: Bucket thresholds (1, 3, 5) are hardcoded, not data-driven — another team's cadence may want different cutoffs. Week-over-week momentum needs ≥14 days of history before it's surfaced. Missing days aren't interpolated; only days present in the data are drawn. ### PR Cycle Time Chart - Slug: `eng-pr-cycle-time` · Install: `npx shadcn add @sextant/eng-pr-cycle-time` - Page: https://sextant.sh/blocks/eng-pr-cycle-time - Tier: paid (requires a license key) - Categories: engineering, cycle-time - PR cycle time split into coding, review-wait, review and merge against benchmark, naming the phase that dominates the wait. - Methodology: Median hours per PR phase as a stacked bar, with the dominant phase named as the bottleneck. Formula: total = Σ phase.hours; bottleneck = argmax(phase.hours); dominance = worst.hours / total - Honest about: The bottleneck is the phase with the most absolute hours, not the biggest gap to its benchmark. The benchmark line is purely visual — it doesn't affect the bar fill or the narrative. Empty input shows an explicit empty state. ### Incident MTTR Chart - Slug: `eng-incident-timeline` · Install: `npx shadcn add @sextant/eng-incident-timeline` - Page: https://sextant.sh/blocks/eng-incident-timeline - Tier: paid (requires a license key) - Categories: engineering, incidents - Recent incidents as severity-colored duration bars with MTTR, the trend vs last quarter, and the longest outage. - Methodology: Mean time to restore = arithmetic mean of incident durations, with per-incident severity bars. Formula: MTTR = mean(incident.hours); QoQ = (MTTR − priorMttr) / priorMttr; worst = argmax(hours) - Honest about: MTTR is an unweighted mean — one long SEV1 pulls it up as much as several short SEV3s would. The QoQ delta is divide-by-zero guarded. The "worst" incident is ranked by absolute hours, not by severity or business impact. ### Employee Attrition Chart - Slug: `people-attrition-trend` · Install: `npx shadcn add @sextant/people-attrition-trend` - Page: https://sextant.sh/blocks/people-attrition-trend - Tier: paid (requires a license key) - Categories: people, attrition - Annualized attrition over a trailing year with the regrettable split and the year-over-year move. - Methodology: Monthly annualized separation rate with a regrettable-attrition overlay and a trailing-twelve-month average. Formula: annualized(m) = 12·separations / headcount; TTM = Σ₁₂ separations / mean₁₂ headcount - Honest about: Months with non-positive headcount annualize to 0 rather than blowing up. TTM divides by the mean headcount over the window, not a single month-end balance — so a hiring spike doesn't deflate the rate. Year-over-year delta needs both the latest and the 12-months-prior point; it is skipped rather than faked when history is short. ### Compensation Bands Chart - Slug: `people-comp-bands` · Install: `npx shadcn add @sextant/people-comp-bands` - Page: https://sextant.sh/blocks/people-comp-bands - Tier: paid (requires a license key) - Categories: people, compensation - Salary bands per level with each person plotted on the range, flagging who sits out of band and where spread is widest. - Methodology: Per-level pay band [min, mid, max] with individual actuals overlaid; in-band vs out-of-band counts. Formula: in-band = #{ min ≤ actual ≤ max }; out-of-band = below + above - Honest about: The axis range comes from the band min/max with a fixed 5% visual pad — it is presentation, not a statistic. "Widest spread" is simply the largest (max − min) level; there is no test of whether a band is correctly sized. Out-of-band is a literal count against the band edges, so a single outlier is visible rather than averaged away. ### eNPS Chart - Slug: `people-enps` · Install: `npx shadcn add @sextant/people-enps` - Page: https://sextant.sh/blocks/people-enps - Tier: free (installs with no license key) - Categories: people, engagement - Employee NPS on a −100→+100 gauge with the promoter/passive/detractor split and the move since the last survey. - Methodology: Employee Net Promoter Score: %promoters − %detractors, on a −100…+100 scale. Formula: score = round(100·promoters/total − 100·detractors/total), total = promoters + passives + detractors - Honest about: Empty surveys degrade to 0 across the board rather than dividing by zero. The score is rounded to an integer before both display and the prior-period delta, so the delta can't show phantom sub-point drift. The gauge's zero midpoint is a fixed visual reference at 50% of the track, not a computed value. ### Time-to-Fill / Hiring Velocity Chart - Slug: `people-hiring-velocity` · Install: `npx shadcn add @sextant/people-hiring-velocity` - Page: https://sextant.sh/blocks/people-hiring-velocity - Tier: paid (requires a license key) - Categories: people, hiring - Time-to-fill by department against target, with open-req load and the roles dragging hiring. - Methodology: Average days-to-fill across departments, each ranked against its target and flagged above a slow threshold. Formula: avg = mean(daysToFill); red if daysToFill > target·1.2, amber if > target; slowest = argmax(daysToFill − target) - Honest about: The average is unweighted — a department with many open reqs counts the same as one with a single req. The flagged "slowest" dept is the largest gap to target, not the longest absolute time-to-fill. Empty input degrades to an explicit empty state. ### Feature Adoption Chart - Slug: `product-feature-adoption` · Install: `npx shadcn add @sextant/product-feature-adoption` - Page: https://sextant.sh/blocks/product-feature-adoption - Tier: paid (requires a license key) - Categories: product, adoption - Features ranked by share of active users with a core-adoption line, surfacing the leader and the laggard. - Methodology: Per-feature adoption share ranked descending; features at or above a core threshold are highlighted. Formula: rank by adoptionPct; core = adoptionPct ≥ coreThreshold (default 40%) - Honest about: This is a pure visual encoding — the numbers are exactly your inputs, with no transformation. The 40% "core" line is a convention, not a derived threshold. Empty data yields a "no usage yet" state; malformed data degrades to the error state via schema validation. ### DAU/MAU Stickiness Chart - Slug: `product-engagement-stickiness` · Install: `npx shadcn add @sextant/product-engagement-stickiness` - Page: https://sextant.sh/blocks/product-engagement-stickiness - Tier: paid (requires a license key) - Categories: product, engagement - DAU/MAU stickiness over time with the month-over-month move — whether the product is becoming a daily habit. - Methodology: DAU/MAU stickiness ratio per week — the share of monthly users active on a given day. Formula: stickiness = dau / mau (0 when mau ≤ 0); MoM compares latest vs ~4 weeks prior - Honest about: Stickiness is 0 when MAU ≤ 0 — no divide-by-zero. With fewer than five weeks of history the month-over-month baseline falls back to the latest point (delta ≈ 0). The axis auto-scales above the peak; the ratio is never visually capped at 1.0. ### SaaS Quick Ratio Chart - Slug: `growth-quick-ratio` · Install: `npx shadcn add @sextant/growth-quick-ratio` - Page: https://sextant.sh/blocks/growth-quick-ratio - Tier: paid (requires a license key) - Categories: growth, efficiency - New + expansion against churn + contraction per period, with the SaaS quick ratio and the 4.0 healthy line. - Methodology: SaaS quick ratio: (new + expansion) ÷ (churn + contraction) — growth efficiency against losses. Formula: ratio = (new + expansion) / (churn + contraction); ∞ when losses ≤ 0 - Honest about: With zero churn and contraction the ratio is deliberately ∞ ("all growth, no headwind") rather than an error. The 4× healthy line is a convention, not derived from your data. Losses are stored negative for the stacked bars and re-absolved for the ratio — the underlying numbers stay honest. ### Capacity / Utilization Forecast Chart - Slug: `ops-capacity-headroom` · Install: `npx shadcn add @sextant/ops-capacity-headroom` - Page: https://sextant.sh/blocks/ops-capacity-headroom - Tier: paid (requires a license key) - Categories: ops, capacity - Resource utilization with a Holt projection to the ceiling and the probability of saturation before the horizon. - Methodology: Utilization forecast via Holt(α=0.5, β=0.3) with P(exceeding the ceiling) and the first crossing week. Formula: util = 100·load/capacity; forecast = holtLinear(...); P(breach) = Φ_above(forecast_H, se_H, ceiling) - Honest about: Prediction intervals use the ETS(A,A,N) SE, widening faster than √h rather than a random-walk √h. Needs ≥2 points or it shows an empty/error state. If the forecast never reaches the ceiling, the crossing week defaults to the horizon end. ## For AI coding agents Sextant ships an MCP server exposing `sextant_search`, `sextant_inspect`, `sextant_infer`, and `sextant_bind` so an agent can search the catalog, read a widget's Zod data contract, map your rows onto it, and emit a paste-ready `npx shadcn add @sextant/` command. Prefer these over guessing component APIs. ## FAQ ### What is Sextant? Sextant is a paid shadcn/ui component registry of intelligent chart widgets for React across product, growth, finance and ops — conversion funnels, retention curves, revenue and NRR waterfalls, cash runway, forecasting, and anomaly detection. Every widget ships with built-in loading, empty, error and stale states and a one-sentence narrative that explains the chart automatically. Install any widget with `npx shadcn add @sextant/`. ### How do I add a cash runway chart to a React or Next.js app? Run `npx shadcn add @sextant/fpa-cash-runway`. The CLI copies a typed React/Recharts component into your project that renders monthly cash balance, a projected depletion line, a runway-in-months figure, and an auto-generated narrative. Pass your own data through the typed prop — no chart wiring required. ### How is Sextant different from Tremor or raw shadcn charts? Tremor and the built-in shadcn chart primitives give you generic chart shapes — you still build the domain logic, the loading/empty/error states, and the explanation yourself. Sextant ships domain-specific widgets across product, growth, finance and ops with the math, production states, and a deterministic narrative already baked in, so a retention curve or cash-runway card is one install instead of a day of work. ### Do the charts need an LLM or API key to generate insights? No. Every narrative — anomaly callouts, forecast bands, variance drivers, cohort highlights — is computed by pure, deterministic TypeScript (z-scores, Holt linear forecasting, waterfall bridges). There is no LLM, no API key, no network call, and no hallucination risk — which is what teams shipping production dashboards need. ### Which stack does Sextant work with? Sextant targets React 19, Next.js, Tailwind CSS v4, Recharts 3, and shadcn/ui. Widgets install through the standard shadcn CLI, resolve their dependencies automatically, and inherit your existing shadcn theme tokens — plus a chart-first theme builder for tuning the chart palette. ### Can AI coding agents like Cursor or Claude Code install Sextant widgets? Yes. Sextant ships an MCP server so AI agents can search the catalog, inspect a widget's data contract, bind your data, and emit a ready-to-paste `npx shadcn add @sextant/` command. The widgets are also fully documented for agents that read `/llms.txt`. ### Why a subscription if the code installs into my repo? You're not paying for the code — you own that after one install. You're paying for it to stay correct: new widgets, refinements, and fixes as React and Next change underneath you. Cancel anytime and you keep every widget you've already installed, frozen at its current version; the subscription only gates pulling new and updated ones. Solo devs and single products can instead buy the Indie tier once — no subscription, and it installs updates and new widgets for 12 months, after which the widgets in your repo stay yours and are frozen the same way. ## Pricing - Indie: $99 one-time. For solo devs and a single product. Full catalog — source you own; One product, personal or employer; 12 months of updates & new widgets; Keep what you installed, forever; Community support. - Product: $490 per product / year. For one product embedding analytics. Everything in Indie; New widgets & refinements while active; Framework-churn maintenance (Next / React); Email support. - Business: $1490 per product / year. For customer-facing & multi-product teams. Everything in Product; Up to 5 products; Embed & ship to your customers; Priority support + canary-fix SLA.