What's shipped, in progress, and planned
Pulled from the same persistent changelog the /status page uses, so the public roadmap and the production deploy are never out of sync. “Planned” items don't promise dates — if something sits here for more than ~2 months, it either ships or gets dropped.
Competitive response roadmap
Trust layerOrrery should not race to become another copy-trading bot, raw historical-data vendor, or whale leaderboard. The defensible category is verification-first intelligence: what moved, what can go wrong, and what to verify next.
Native exchanges and dashboards already show prices. Orrery wins by making freshness, derived status, resolution risk, and source context impossible to miss.
Deliverable: Snapshot consistency guards, stale-data banners, status/risk copy invariants, and shared data builders across Home, Scanner, Brief, Signals, and Research Queue.
Free/no-auth APIs are a distribution weapon. Orrery needs a starter layer for developers without giving away the intelligence moat.
Deliverable: /api/free/v1 for health, brief preview, movers, search, and snapshot-lite; x402 remains the money layer for why, resolution-risk, wallets, share cards, and decision bundles.
Competitors have viral hooks like whale trades and PnL leaderboards. Orrery's safer loop is shareable verification: price is not settlement, high evidence is not edge, large trade is not smart money.
Deliverable: Market cards, pulse chart cards, resolution-warning cards, large-trade context cards, public receipts, and public watchlist clone flows.
Wallet trackers pull search demand. Orrery can compete there only if activity is separated from profitability and sample confidence is explicit.
Deliverable: Public wallet pages, trade inspector pages, 7d/30d rollups, concentration context, and 'activity != profitability' labels.
Polymarket-vs-Kalshi price comparison is crowded. Orrery's wedge is contract comparability: same event, similar event, or related only.
Deliverable: Kalshi WebSocket streaming, matched-event confidence, contract wording differences, and cross-venue alerts only after realtime is green.
Strategic operating map
DirectionOrrery is the trust and verification layer for prediction markets. The product should not drift into execution, copy trading, raw data commoditization, or “AI alpha” language. Every roadmap item must strengthen at least one of these four pillars.
Canonical status, freshness, source context, resolution risk, and contract wording are the moat. Raw odds and raw orderbooks are increasingly public commodities.
Daily Brief, Research Queue, and Alerts should form one loop: open in the morning, verify what changed, create or review alerts, and return when something fires.
Free discovery gets developers in; paid x402/API credits monetize interpreted intelligence. Agents need stable JSON, source IDs, not_trade_advice, and suggested next calls.
Wallet pages, whale receipts, market cards, compare pages, and citation-ready Markdown turn Orrery insights into shareable, indexable evidence.
Guardrails
Do not drift- No trade calls. Research, monitoring, source checks, and verification only.
- No copy-trading framing. Wallet activity is not profitability; large trades are not smart money.
- No raw-data race. Use free data for discovery; monetize interpretation, confidence, and workflow.
- No cross-venue overclaim. Kalshi goes live only after realtime and contract comparability are trustworthy.
Phase plan
Launch sequenceMake Orrery impossible to distrust
Product: Freshness contract, canonical market-status invariant, public data-quality checks on /status, no stale SSR/crawler fallback rows, no impossible states, and clean share/OG cards.
Customer motion: Keep acquisition tied to trust: every public artifact must say observation, verification, resolution risk, and not trade advice.
Proof: The data quality contract stays green on /status; stale/expired markets cannot be misread as current outcomes.
Turn verification into a daily loop
Product: Brief onboarding, watchlist delta, alert handoff, Telegram-ready sharing, and a mobile/app-like flow: open, verify, monitor, return.
Customer motion: Daily Brief becomes the first habit; Alerts and Watchlist keep the loop alive; share cards carry verified context into public conversations.
Proof: Repeat Brief opens, first watchlist, first alert, alert-trigger follow-through, and weekly verified actions per active account.
Build the compounding SEO surface
Product: Market pages, wallet pages, trade pages, resolution-risk explainers, compare pages, public watchlists, and shareable receipts with guardrails.
Customer motion: Win search around resolution risk, price-is-not-settlement, wallet context, and same-event-is-not-same-contract instead of generic odds pages.
Proof: Indexed pages with clean OG cards, no stale fallback states, share clicks, and organic users reaching Scanner/Brief from public artifacts.
Expose verified intelligence to agents
Product: Decision Card, /decision/attention, free starter API, paid x402 depth, MCP/docs, source IDs, freshness metadata, and suggested next calls.
Customer motion: Developers get a no-friction first call; paid depth is reserved for why-it-moved, resolution risk, wallets, share cards, and decision bundles.
Proof: First API call in under 60 seconds, repeat agent usage, settled x402 calls, and public receipts that cite snapshot/source/not_trade_advice metadata.
Upgrade individual verification into shared monitoring
Product: Shared watchlists, alert routing, delivery audit, signed webhooks, role-aware entitlements, and team-level Brief/watchlist workflows.
Customer motion: Design partners first: newsletters, research desks, market-monitoring teams, and agent builders who need auditability.
Proof: Team demo requests, shared watchlists created, routed alerts, webhook deliveries, and audit-log usage.
Only launch cross-venue after true comparability
Product: Kalshi WebSocket/realtime, stored markets at scale, same-event matching, contract wording differences, comparable/similar/related labels, and cross-venue alerts.
Customer motion: Keep cross-venue as preview until realtime is green and contract-comparability confidence is visible.
Proof: Heartbeat green, fresh stored markets, real divergence events, wording-confidence labels, and no preview badge only after streaming passes.
KPI system
Operating metricsNorth star
Weekly verified actions per active account
Market source checks, resolution-risk opens, alert confirmations, market deep dives, and agent decision-card calls.
Activation
First value < 5 min
Brief preview, first market snapshot, first alert, first wallet/trade receipt, or first free API 200.
Retention
Brief opens + alert usage
Daily Brief should lead to repeat verification and at least one durable monitoring rule.
Revenue
Brief/Pro/Team/API repeat usage
Subscriptions and x402 calls are downstream of trusted repeat workflows, not the product's core meaning.
In progress
5- In progressFirst-value path under five minutes
New users should get one useful verification loop before they understand the whole product: read Brief preview, search one market, open snapshot-lite, create one alert, or make one free API call. This is the activation KPI that keeps Orrery from becoming a beautiful but heavy terminal.
- In progressFree starter API for agent adoption
No-auth discovery routes for health, brief preview, movers, search, and snapshot-lite. Deep explanations, resolution-risk analysis, share cards, wallets, and decision bundles remain paid x402/API-credit calls. This gives developers a <60 second first touch without making the paid intelligence layer a free hole.
- In progressCompetitive comparison pages
Public /compare pages position Orrery against analytics dashboards, whale trackers, execution terminals, SQL tools, and unified APIs without falling into copy-trading or alpha language. The point is category creation: verification-first intelligence, not another raw odds surface.
- In progressTelegram + Discord channels for Alerts
Bring Orrery alerts into the chats where research teams already work: concise market context, source-check prompts, and delivery history without turning channels into noisy alpha rooms.
- In progressEmail-digest design polish
Promote the alert-digest and Brief-digest emails from plain-text + minimal HTML to a branded table-based template (header / market cards / footer). Email-client compatibility (Outlook, Gmail, Apple Mail) is the constraint — modern CSS doesn't render.
Planned / Exploring
6- PlannedBranded notification sender
Send Daily Brief and alert emails from a verified Orrery sender so inbox delivery feels consistent with the product and every notification is easy to recognize.
- PlannedDeeper large-trade / wallet context
Wallet trade timeline already ships; next layer is per-market concentration, large-trade behavior clustering across wallets, and a public wallet-leaderboard API tier. Most of the data is already in the persistent ledger; the work is presentation + sample-confidence guardrails.
- PlannedTelegram as the first chat delivery channel
Prediction-market workflows live in chats. Telegram should receive Brief summaries, alert triggers, and share cards before Discord, while keeping the same server-side retry, idempotency, and audit model as email/webhooks.
- PlannedDesign-partner program
Run a small, explicit program for three groups: newsroom/research writers, desk/team monitors, and AI-agent builders. Each partner should validate one loop: Brief retention, team alerts, or agent API repeat usage.
- ExploringAI-agent x402 catalog expansion
Orrery already exposes 24 x402 endpoints for autonomous-agent consumption, including the gated research/anomalies layer. Next: per-endpoint cost surfaces, payment-receipt audit log on /receipts, and developer-quickstart documentation for agent builders.
- ExploringPublic data-quality SLA
/status already publishes upstream uptime, per-component uptime, and a data-quality incident feed. The next step is a stated SLA — e.g. "99.5% of trading hours produce a valid live snapshot within 5 minutes of upstream" — and automatic incident write-through when the invariant trips.
Recently shipped
24Most recent 24 changelog entries — newest first. Full history lives in lib/incident-log.ts CHANGELOG and on /status.
- Rule changev4.01 — /scanner default view filters to live_research bucket2026-05-09
Pipes the 200 active markets through `partitionByBucket()` and keeps only `live_research`. Excludes resolution-watch markets (UMA pending, expired but not closed, within 72h of expiry) and settled markets (closed, pinned ≤1¢/≥99¢ with real volume). A Bundesliga match that ended hours ago and is awaiting Oracle confirmation no longer pollutes the "what to research now" surface — those still live on /opportunities Resolution tab and /signals Resolution Watch view. Summary KPIs recompute over the live-research subset so the chip row matches the table.
- Releasev4.00 — chart hover crosshair + rich tooltip + density tokens align2026-05-09
InspectorChart on /scanner /signals /opportunities now responds to cursor: vertical dashed crosshair guide spans the canvas, a 2px dot tracks the price line at the interpolated y, and a styled tooltip anchored to cursor x renders price (interpolated, in tone colour), relative-ago time, nearest volume bucket (compact $X.Yk/M), and any event labels within 2% of the timespan. Auto-flips left/right at 60% width to stay in-plot. Synthetic-fallback mode hides the tooltip entirely (no real timestamps to honestly label). The shell's existing density toggle (`data-density="dense"`) now drives the v3.98 `--space-*` tokens too, shrinking padding globally.
- Releasev3.99 — WalletInspector + WalletsExplorer split-view (/wallets joins workbench pattern)2026-05-09
/wallets refactored from inline cards+table → ScannerSplitView. Desktop: row click selects into right-rail WalletInspectorPane via SelectionProvider context (paramKey="wallet"). Mobile keeps existing card→detail navigation. Inspector renders five 0..100 quality dimensions (Activity / Performance confidence / Specialisation / Early-entry / Copy risk) as inline progress bars with green/amber/red tone, plus an insufficient-sample warning when winRateSample<3 with open>$25k OR copyRiskScore≥60. Five inspectors now share one chrome — Trade / Market / Signal / Opportunity / Wallet.
- Releasev3.98 — premium primitives (Skeleton + AnimatedNumber + Tooltip + LiveRefresh)2026-05-09
Sprint A (visual foundation) + Sprint B (live feel) shipped together. Skeleton primitive (CSS shimmer, no deps, prefers-reduced-motion respected). AnimatedNumber primitive (requestAnimationFrame tween 280ms easeOutCubic, optional flashOnChange green/red glow on direction). Tooltip primitive (zero-dep, viewport edge auto-flip, Esc dismiss). LiveRefresh component — auto router.refresh() every 30s, "Updated Xs ago" pulse, pause/play toggle persisted in localStorage, visibility-API aware (backgrounded tab doesn't burn refreshes). Density tokens (--space-tight / -base / -relax + --type-display / -h2 / -body / -meta / -micro). Wired into /scanner price column (animated + flashOnChange), DataConfidencePill (styled tooltip with score+tier+factor breakdown), InspectorChart current-cents chip, /scanner data-meta strip.
- Rule changev3.97 — alerts copy drift fix on Market Detail + /scanner toolbar count clarity2026-05-08
AlertBuilder on Market Detail page hard-coded "Email, Telegram, Discord delivery are coming soon" + email channel disabled — outdated since RESEND was wired. Now `emailDeliveryLive` prop drives both copy and chip availability: when true, "Email digests are wired to a server-side cron and continue while your tabs are closed"; when false, dry-run language. /scanner toolbar count line read "100 markets" while KPI showed 200; now renders "Showing X of N markets" when slice is smaller than universe.
- Rule changev3.96 — alerts CTA reflects production state, history cap 50→2002026-05-09
Threads serverDeliveryLive into AlertsCreate. Until any out-of-browser channel is wired, every rule is effectively local-only — server-eligible rules are stored, the cron logs them in dry-run mode, no email leaves. CTA + card title + subtitle reflect this honestly: serverDeliveryLive=false → "Create local alert" / "In-app only · email dry-run"; serverDeliveryLive=true + server-eligible condition → "Create alert". Local triggered-history cap raised 50→200; display window 20→50.
- Releasev3.95 — public proof + observation copy consistency2026-05-08
Sprint A (public proof) + Sprint D (copy consistency). Build line directly under the /status page header — "Build vX.YZ · <short-sha> · changelog · last entry <date>" reading commit SHA from VERCEL_GIT_COMMIT_SHA. Lets an external auditor cross-reference a /status snapshot against a specific deploy. Copilot "momentum signal active" → "momentum observation active" (last surface that hadn't migrated in v3.40). Brief intro paragraph, metadata.description, JSON-LD WebPage description, FAQ Q&A, markdown export, OpenGraph image, BriefView + PersonalBriefView empty states all flipped from "research signals" → "research observations".
- Releasev3.94 — chart primitive shared across /scanner /signals /opportunities + alerts plural fix2026-05-08
InspectorChart (mid-size probability line, real CLOB ticks, volume bars, event markers, 1D/7D/30D/ALL toggle) now lives inside the right-rail inspector on three pages, not just /scanner. The chart fetches /api/markets/[slug]/history once on selection (60s revalidate) and overlays whale trades ≥ $5k, signal firings deduped by kind+day, expiry, and current UMA state on the line. Bundle: chart moves into a shared chunk so /scanner's per-page payload drops 15.2 → 12.7 kB. Pluralization fix for the email-digest count: "0 rule s eligible" rendered with a stray space across multi-line JSX; folded into a single template-string expression.
- Releasev3.93 — InspectorChart Phase 3 (volume bars + event markers)2026-05-08
The /api/markets/[slug]/history route now returns { points, volumeBuckets, events } in a single round-trip. Volume bars normalised against the heaviest bucket so the shape stays honest across markets that vary by orders of magnitude. Event markers — whale ◆ / signal ● / expiry ▲ / UMA ◆ — anchored to the same (firstSec → lastSec) x-axis as the price line, with `<title>` hover for label + detail. Foot strip gains a marker legend (shape-coded so the reader can map legend → chart by shape alone, no colour reading required) and a total-volume figure for the visible window.
- Releasev3.92 — Inspector chart Phase 3 part 1 (real CLOB history + range toggle + keys)2026-05-08
Inspector chart now fetches tick-by-tick CLOB price history per (slug, interval) with a 1D/7D/30D/ALL range toggle. Per-mount cache prevents re-fetches when toggling back to a previously-viewed range. Synthetic 4-anchor curve stays as the loading-state fallback at 0.55 opacity so the panel never paints empty. /scanner keyboard nav: ArrowUp / ArrowDown alongside j / k; Escape closes the inspector + clears the URL `?market=` param.
- Releasev3.91 — Inspector polish (pluralization + info icon + empty-state)2026-05-08
Five JSX-whitespace pluralization bugs across market-table ("100 market s"), personal-brief-view ("1 market s watched"), portfolio-view ("1 categor / ies"), watchlist-import-prompt ("Import N market / s"). All folded into single template-string expressions so the noun + plural suffix stay glued. Category trace trigger character `?` replaced with the standard lucide Info icon for consistency with canonical-status / data-confidence affordances. Inspector empty-state copy now mentions the 7-day probability chart so a first-time user knows what they'll see when they click a row.
- Releasev3.90 — Markets Inspector redesign (chart on top + tabs)2026-05-08
Right-rail inspector restructured: Header → mid-size probability chart → KPI strip → primary insight → tabs (Overview / Resolution / Related) → sticky footer. Tabs replace the prior flat scroll-of-sections so the inspector reads as panels, not a list. Tab strip is keyboard-navigable (Arrow Left / Right cycle, Home / End jump). Chart tone is canonical-status-aware: rail-pinned + UMA-pending → amber, resolved → muted, live → green or red by 1w direction.
- Rule changev3.89 — Sprint 1 design stabilization (legal/court taxonomy + copy fixes)2026-05-08
Twelve new byPattern entries in category-overrides (epstein / guilty verdict / indictment / convicted / sentenced / case dismissed / SCOTUS ruling / DOJ release / FBI release / Congressional release) so legal/court markets stop classifying as Unclassified. +8 regression tests. Brief per-section share button now icon-only (literal "Share" word inline read as a stray CTA in editorial flow). Market Detail timeline label "Resolve" → "Scheduled resolution" (noun event vs. verb imperative). /backtest "3 categor / ies" JSX whitespace bug fixed. /alerts presets now carry an inline `local` pill on whale_trade / signal_fired entries.
- Releasev3.88 — magic-link auth + synced watchlist (Sprint 5)2026-05-08
Account-light identity using HMAC-signed magic links: pair an email once, get a 90-day HttpOnly cookie. Synced watchlist mirrors browser state to the server keyed by sha256(email). Cron alert evaluator expands watchlist-target rules against the synced state, so price/expiry/volume/UMA-status conditions on watchlist rules now fire from the server — not just while a tab is open. Five new routes (/api/auth/request-link, /verify, /sign-out, /me + /api/watchlist/sync). +11 invariants for token sign/verify roundtrip, expired rejection, tampered-payload rejection, cookie roundtrip, user store CRUD, watchlist sanitisation. Activates once production auth, durable storage, and email delivery are configured. Until then dry-runs to structured logs + in-memory storage; UI surfaces dry-run state honestly.
- Releasev3.87 — /alerts UX honesty pass (Sprint 1 of audit)2026-05-08
Production-readiness banner at the top of /alerts (green when server delivery wired, amber otherwise) with per-channel chip row tagged active / dry-run / client-side only / not connected. Server-eligibility badge in the rule builder Step 2; Email channel button per-rule tagged server-side / local-only based on kind/target. CTA copy switches to "Create local alert" when the rule is local-only. Webhook collapsed section now has a "client-side only" pill in the title. Drops the "scaffolded · dry-run" / "channel unset" / "webhook unset" jargon.
- Releasev3.86 — /whales Trade Inspector split-view2026-05-08
Replaces the modal-only WhaleDrawer pattern with a persistent right-rail inspector via ScannerSplitView, mirroring /scanner /signals /opportunities. Selection lives in SelectionProvider context (paramKey="trade") — row click sets state directly and mirrors `?trade=<key>` via replaceState, no server roundtrip. Below lg the inspector hides and a fallback WhaleDrawer modal renders the selected trade.
- Rule changev3.85 — /whales context chips + wallet label fix2026-05-08
Each /whales row now carries a context chip — Live move / Settlement-like / Rail-pinned / Near expiry / UMA pending / Low-liq impact / Unknown — derived from canonical status + price + liquidity so the reader doesn't misread settlement housekeeping as directional alpha. Inspector primary-insight tone matches the chip. Wallet-label spec fix: pseudonym always preferred over short address, with clear fall-through.
- Rule changev3.42 — canonical status-copy formatter (Sprint 1 audit follow-up)2026-05-06
Single shared formatter (`lib/status-copy.ts`) now owns every user-facing string derived from MarketStatus across Markets table, Detail timeline, Brief, and the x402 API. Hard invariant pinned: only RESOLVED_YES + RESOLVED_NO render the verb "resolved"; UMA_PENDING / UMA_DISPUTED / EXPIRED_UNRESOLVED / ARCHIVED do not. 15-invariant status × surface regression test prevents drift. Resolves the audit's last P0 trust-copy bug.
- Releasev3.41 — dashboard scroll fix + UMA-pending wording cleanup2026-05-06
Fixed home dashboard scroll: .ov2 used min-height:100% so content past viewport made the topbar scroll away; switched to height:100% so the inner .ov2-page overflow:auto scroll architecture activates as designed. UMA-pending markets in the Markets table no longer falsely labelled "Resolved" in the expiry column; Detail timeline no longer says "Market resolved Xh ago" for UMA-proposed markets — instead reads "Expiry passed Xh ago; awaiting UMA confirmation".
- Releasev3.40 — observation copy + snapshot family + category trace popover + queue sorting + Brief Quality Score2026-05-06
Five surfaces touched: (1) signal → observation copy across Detail / Dashboard / /signals / /receipts / Brief; (2) snapshotFamilyFor / snapshotsAreSiblings / snapshotMinutesApart helpers for diagnosing minute-level snapshot drift across surfaces; (3) Why-this-category click-popover in Markets table (computes the deterministic engine trace server-side, ships only display markup to the client); (4) Research Queue gains four explicit sort modes — most-urgent / highest-evidence / lowest-ambiguity / best-backtest; (5) Brief Quality Score 0..100 composite across freshness, category confidence, resolution clarity, and backtest support.
- Releasev3.39 — Sprint 2-5 reliability + persistent foundations (code-side)2026-05-06
Stripe-style HMAC-SHA-256 webhook signing via X-Orrery-Signature with replay-window verification. Delivery audit log (capped at 1000 entries) + postWithRetry helper with exp backoff and Retry-After honoring. Typed incident kinds (upstream_probe / data_quality / snapshot_mismatch / schema_drift / manual) + pruneIncidents with 90-day retention. Signal firing history with (snapshot, kind, slug) dedup. x402 catalog × filesystem parity test (20↔20 routes), 24-invariant catalog contract test, p50/p95/p99 latency ring buffer with measureLatency wrapper.
- Rule changev3.38 — taxonomy regression fixes (Judy Shelton / SPX / aliens)2026-05-06
Three Markets-table classification failures fixed: (1) Judy Shelton Fed Chair confirmation → Politics (was Sports — common surname collision with tennis player Ben Shelton); (2) S&P 500 (SPX) Opens Up or Down → Macro (was Unclassified — no equity-index keywords); (3) Will the US confirm aliens exist before 2027 → Science (was Unclassified). Added 16 byPattern overrides covering Fed governance, equity indices, UFO/extraterrestrial. Removed ambiguous tennis surnames (shelton/sinner/fritz/ruud/medvedev) from sports hard markers — tennis still classifies via venue + tour markers + unique surnames.
- Releasev3.37 — lib unit-test coverage closeout (446 invariants, 22 files)2026-05-06
Closed the lib coverage gap from the audit. Eight new test files: resolution.ts (extractResolutionSource regex coverage), polymarket.ts (normalizeMarket from raw Gamma response), data-api.ts (normalizeTrade), decision-card.ts (confidenceLabel/severityLabel ordinal tiers), whale-ledger.ts (txHash idempotency, wallet aggregation), server-alerts.ts (rule-kind boundary semantics), public-watchlists.ts (slug/title/author cap rules), signals.ts (flow/momentum/divergence/resolution_risk thresholds).
- Releasev3.36 — doubled test coverage + smoke tests (262 invariants)2026-05-06
Six new test files: subcategories taxonomy routing (45 tests), opportunities axes + workflow router (30), signal calibration tiers (22), Top Actions priority + observation wording (10), dashboard panel composition (23), API smoke against live x402 endpoints (8). Reordered subcategories switch (TENNIS → F1 → ESPORTS → FOOTBALL → SOCCER) and space-anchored ticker patterns to prevent collisions like 'eth' eating 'method 1'.