Orbital is the typed event layer for Stellar - SDKs that turn raw Horizon operations and Soroban contract events into normalized, decoded, strongly-typed streams, plus the open registry and schema standard that makes that decoding canonical. This document describes the planned work in concrete terms. Dates are targets, not guarantees.
Legend.
[x]shipped onmaintoday ·[-]in flight ·[ ]planned.Ship discipline. Each phase has a named release gate - a command and a condition that must both be green before the phase is considered shipped. A phase does not ship partial.
Orbital is not a runtime, not a payments product, and not an identity layer. It is a compounding loop:
- A contract's event schema gets registered in the ABI registry.
orbital codegenembeds those registry types directly in downstream codebases, so the schema travels with the code that consumes it.- Real usage surfaces community labels and taxonomy corrections -
swap.executedinstead of a raw topic hash, a verified deployer attribution. - Richer semantics make the registry canonical - the place a contract's event shape is defined, not just one place it happens to be documented.
- A SEP-governed registry and taxonomy standard - building on SEP-48's embedded event schemas, not competing with them - becomes the format other tools emit against, closing the loop: registration is now worth doing because the standard it feeds is the one everyone reads.
Everything on this roadmap exists to serve that loop. Everything else - payments, identity, agent infrastructure, intent compilers - is out of scope and lives in the Frozen section below, not on the active roadmap.
| Phase | Theme | Tag | Target gate | Status |
|---|---|---|---|---|
| Phase 0 - Foundation | Typed SDKs for Stellar classic operations | v0.1.0 |
pnpm -r typecheck && pnpm test green; tag pushed; CHANGELOG entry shipped |
🟢 Released 2026-05-29 |
| Phase 1 - Production SDK | Soroban + cursor persistence + stability pledge | v1.0.0 |
pnpm publish -r --filter "./packages/*" succeeds; STABILITY.md merged; Soroban e2e test green |
🟡 In progress - STABILITY.md merged (this PR); starter boilerplates + v1.0.0 tag outstanding |
| Phase 2 - The Decoding Standard | SEP draft, orbital codegen, semantic layer, hosted registry |
v1.x |
SEP draft submitted; orbital codegen published and used in all three starter boilerplates; ≥25 contracts with registered verified schemas; hosted registry serving reads in production |
⚪ 2026 H2 |
| Phase 3 - Anchor Events | SEP-24/31 lifecycle events, @orbital-stellar/anchor-sdk |
v2.0.0 |
@orbital-stellar/anchor-sdk on npm; SEP-24 + SEP-31 lifecycle events normalized into the standard taxonomy; ≥1 named anchor consuming it in production |
⚪ 2027 H1 |
The former "Trust & Agent Layer" and "Protocol Permanence" phases are not gone - they are preserved verbatim in the Frozen section below.
Goal: SDKs that any Stellar developer can install and use today.
Release gate (met 2026-05-29): pnpm -r typecheck && pnpm test green across all packages; v0.1.0 tag pushed; CHANGELOG.md entry written with Added / Changed / Fixed / Security / Impact sections.
- Horizon SSE subscription with AWS Full-Jitter reconnection
- Full classic operation taxonomy normalized into
NormalizedEvent: payments, account create/merge/options/bump-sequence, trustlines (change/allow/set_flags), DEX offers, claimable balances, liquidity pools, manage_data - Per-address
Watcherpub/sub with*wildcard and per-watcherfilterpredicate -
engine.subscribe,engine.unsubscribe,engine.unsubscribeAll,engine.status - Testnet + mainnet support;
horizonUrloverride for self-hosted nodes
- HMAC-SHA256 signing with
x-orbital-signature,x-orbital-timestamp,x-orbital-attempt -
verifyWebhook(Node, timing-safe) andverifyWebhookEdge(Web Crypto) - Exponential-backoff retry with concurrent-retry cap (
webhook.droppedon eviction) - Per-attempt
AbortControllertimeout (default 10s) - SSRF hardening with DNS-rebinding defense
-
useStellarEvent<T>with generic type narrowing -
useStellarPayment,useStellarActivity - Dual call signature (positional + config object)
- Stable dep-array via sorted
eventKey
-
engine.reconnecting,engine.reconnected,engine.rate_limited,engine.stoppednotifications - Rate-limit (
429) handling withRetry-Afterparsing - Graceful
engine.stop()on SIGTERM/SIGINT in the reference composition
- CI matrix (Node 20, 22), CodeQL, Dependabot
- All-contributors integration with bot wiring
-
docs/ARCHITECTURE.md,docs/COOKBOOK.md,docs/open-source-policy.md,docs/proposal.md - Public marketing + documentation site (
apps/web) with sandboxed demo API routes - Reference composition consolidated into
apps/web- one runtime to self-host
Goal: a stability-pledged v1.0 that teams can build production systems on.
Release gate: pnpm publish -r --filter "./packages/*" succeeds against npm with version: "1.0.0"; STABILITY.md merged with documented semver contract; Soroban subscription e2e test passing against testnet RPC; M1–M6 in docs/proposal.md all check out. Waves 1.1–1.3 below have shipped; Wave 1.4 is down to the OpenAPI-generated schemas; Wave 1.5 is down to boilerplates and the tag. Wave 1.6 does not gate v1.0.0 - it is the first post-tag release (v1.1.0).
- Stellar RPC subscriber feeding the same normalization pipeline
-
contract.invokedandcontract.emittednormalized event types -
engine.subscribeContract({ contractId, topics })API - Topic filter and contract ID filter
This wave ships the client side of the registry - discovery, decoding, and codegen primitives. The schema standard, hosted service, and semantic layer that make the registry canonical move to Phase 2, where they belong alongside the SEP draft.
-
@orbital-stellar/abi-registryclient package - On-chain
contractspecdiscovery (discoverContract,fetchContractCode,parseContractSpec,xdrToSpec) -
decodedDatafield oncontract.emittedfor registered contracts - Type-generation primitives (
generate.ts) - the foundationorbital codegenbuilds on in Wave 2.2
-
CursorStoreinterface onEventEngineconfig - Reference adapters - memory, file, Postgres, Redis, S3
- Cache and write-coalescing
CursorStoredecorators (cacheCursorStore,coalesceCursorStore) - not separate backends, wrappers over any adapter above -
RetryQueueinterface onWebhookDelivery - Reference adapters - memory, Postgres, Redis, SQS
- Narrow
NormalizedEventtypes soswitch (event.type)produces exhaustive type narrowing with nodefaultclause - enforced bypackages/pulse-core/test/types.exhaustive.test-d.ts, run viapnpm test:types - Generated schemas from Horizon's OpenAPI
- Starter boilerplates:
orbital-next-starter,orbital-express-starter,orbital-anchor-starter -
pnpm add @orbital-stellar/pulse-coreworks against npm -
STABILITY.md- semver contract, deprecation window (6 months), breaking-change policy -
v1.0.0git tag with full release notes
Protocol 23's CAP-67
makes classic asset movements (transfer, mint, burn, clawback, fee,
set_authorized) emit Soroban-format events in a single unified stream, and SDF
has deprecated Horizon in favor of Stellar RPC.
Orbital's classic ingestion currently rides Horizon SSE - a legacy rail. This
wave moves asset-movement ingestion to the unified stream without changing the
NormalizedEvent surface consumers see.
- Ingest CAP-67 unified asset events from Stellar RPC, feeding the same normalization pipeline as Horizon and Soroban events today
- Map unified events onto the existing
NormalizedEventtaxonomy - consumers see no behavior change; the transport underneath switches - RPC-first for asset-movement events; Horizon SSE remains the source for
operation types with no unified-event equivalent (offers, account options,
claimable balances, manage_data) and the fallback transport otherwise -
documented in
docs/ARCHITECTURE.md - Cursor semantics compatible with
BACKFILL_STELLAR_ASSET_EVENTSretroactive history, so replay from genesis-era ledgers is possible against a backfilled RPC/CDP source
Release gate (v1.1.0): unified-event ingestion e2e test green against a
Protocol 23 RPC; existing NormalizedEvent type tests (pnpm test:types)
unchanged and green.
Goal: make the registry the canonical source of truth for what a Soroban contract's events mean - not just a convenience client.
Release gate: SEP draft submitted to stellar/stellar-protocol; orbital codegen published to npm and used in all three starter boilerplates; ≥25 contracts with registered verified schemas; hosted registry serving reads in production.
The on-chain leg of the registry: a Soroban contract that makes schema publication verifiable, plus the indexer that keeps it populated automatically. This is what makes "canonical" true rather than aspirational.
- On-chain registry contract - code complete, blocked on deployment
- Soroban contract:
publish(contract_id, version, spec_hash, pointer), per-version lookup, publisher authorization, emits aspec_publishedevent (contracts/registry, 7 unit tests) - Stores hash + pointer (not the full spec) - integrity verifiable on-chain, spec blobs live off-chain
- Blocked on maintainer action: deploy to testnet (needs a funded
testnet account) and commit
contracts/deployed.testnet.json - Blocked on maintainer action: wire
SOROBAN_CONTRACT_ID+SOROBAN_INVOKER_SECRETrepo secrets so the nightly integration test stops skipping
- Soroban contract:
-
OnChainRegistryPublisher+OnChainAbiRegistryClient- on-chain publish and resolution path, wired into pulse-core's default registry chain (@orbital-stellar/abi-registry) - Seed the registry with the 4 bundled well-known specs (USDC, EURC,
AQUA, native XLM wrapper) through the live contract - script written and
tested (
packages/abi-registry/scripts/seed-well-known.ts), blocked on deployment -
AutoPublishIndexer(packages/orbital-indexer) - unknowncontractIdauto-discovers, publishes under Orbital's key, and caches, with in-flight dedupe and backoff for undiscoverable contracts; manualabi-registry publishstays the override path - "Fire test event" button on
/demo/contracts- code complete, blocked ondemo-emitterdeployment (part of the deploy above) - Preload the playground with well-known mainnet contracts (USDC, EURC, AQUA) - verified live
This is the highest-leverage item on the roadmap. Everything else in this phase is either infrastructure for it or evidence that it works.
Scope note. SEP-48
already standardizes event schemas inside the contract spec
(#[contractevent]; XDR merged, SDK and CLI support in flight). This SEP does
not compete with it - it standardizes what SEP-48 leaves open: contracts
deployed before SEP-48 existed, off-chain registry verification, and the
semantic layer above raw schemas.
- Draft SEP covering (a) an off-chain schema registry with a verification
pipeline cross-checking against on-chain
contractspec, (b) retroactive schema attestation for pre-SEP-48 contracts already deployed on mainnet, and (c) a semantic taxonomy and entity-label format on top of raw event schemas - SEP-48 compatibility clause: an embedded SEP-48 event spec, when present, is the canonical schema source; the registry adds attestation and semantics on top, never a competing schema
- Reference-implementation checklist mapping every SEP clause to code in this repo
- Submit as a draft PR to
stellar/stellar-protocol
-
orbital typegen <contractId>- ships TypeScript types + Zod schemas from a contract's resolved spec (registry first, WASM auto-discovery fallback); verified live against a mainnet contract - Consume SEP-48 event specs natively - embedded
#[contractevent]spec first, registry attestation as the fallback for pre-SEP-48 contracts. Differentiation vsstellar contract bindings typescriptstays sharp: Zod runtime validation, typed event guards, and React hooks - not raw types - Extend the CLI with typed event guards and
useContractEvent<T>hooks from the registry schema - building on the existinggenerate.tsinpackages/abi-registry -
orbital.config.tscontract manifest so regeneration is one CI command - Watch mode
- Generated output committed in all three starter boilerplates
- Human-readable event taxonomy on top of raw topics (e.g.
swap.executed,loan.liquidated) with community-submitted mappings - Entity labels - verified contract → protocol/deployer/asset-issuer attribution - with a public submission and review flow
- Labels and taxonomy published as open data (see
docs/open-source-policy.md- the data is open, the operated service is the product)
- Hosted read API for schemas, taxonomy, and labels (client stays MIT)
- Verification pipeline cross-checking submitted schemas against on-chain
contractspec - Public registry explorer page in
apps/web - Replay/history beyond RPC's ~7-day retention window - built on top of the Composable Data Platform (Galexie exports) and CAP-67 retroactive backfill, not as an Orbital-operated ledger store; second candidate move once this wave lands (semantics + memory = the full foundation); not yet scheduled to a wave
Goal: extend the typed event taxonomy across the SEP-24 / SEP-31 anchor lifecycle, so compliance and audit tooling gets the same normalized-stream treatment as on-chain events.
Release gate: @orbital-stellar/anchor-sdk on npm; SEP-24 and SEP-31 lifecycle events normalized into the standard taxonomy; at least one named anchor consuming it in production.
-
@orbital-stellar/anchor-sdk- typed client for SEP-24 interactive deposit/withdrawal and SEP-31 cross-border payment lifecycle events - Lifecycle taxonomy -
anchor.deposit.*,anchor.withdrawal.*,anchor.payment.*mapped to the SEP-defined status machines - Replay-safe delivery recipes - cursor + retry queue composition documented in
docs/COOKBOOK.mdfor audit-trail use cases - Design-partner program - 2–3 anchors or Soroban protocol teams co-designing the surface before
v2.0.0freezes
These items are frozen, not deferred. No issues, no waves, no partial implementations accepted against any row below while Phases 1–3 are open.
| Frozen item | Why frozen |
|---|---|
@orbital-stellar/payments, @orbital-stellar/auth (passkeys/WalletConnect), identity layer |
Different product category; competes with wallet SDKs and SDF-funded smart-account work. "Identity in 80% of Stellar apps" was a vanity target, not a defensible moat. |
@orbital-stellar/x402, @orbital-stellar/agent-sdk |
SDF is shipping first-party x402 tooling. Revisit only if agent payments create demand for typed agent event streams - that's our actual lane, not the payment rail itself. |
| Intent compiler, shadow-fork simulator, reactor contracts | Each of these is a standalone company in its own right. None of them advances the registry loop. |
@orbital-stellar/analytics dashboards |
Belongs to the operated service per docs/open-source-policy.md, not the SDKs. |
| "10+ SEPs authored" | One accepted SEP that others implement beats ten drafts sitting in review. The target is one. |
Unfreezing any row requires the Phase 2 gate met and the Phase 3 gate met
and a maintainer-signed rationale recorded in CHANGELOG.md.
- Support for non-Stellar networks
- Hosted / managed infrastructure beyond the registry read API (the hosted runtime is a separate product per
docs/open-source-policy.md, not part of this open-source repository) - Operational dashboards and admin UIs (these belong in deployment tooling, not the SDKs)
If you have a feature request or want to propose a change to the roadmap, open a GitHub Discussion in the Ideas category. Roadmap items that attract significant community interest move up in priority.
Roadmap changes that add scope (new waves, new packages, new phase items) follow the normal PR flow. Roadmap changes that remove or postpone shipped scope require a maintainer sign-off and a note in CHANGELOG.md under ### Changed. Proposals targeting a Frozen item will be closed with a pointer to this document.