Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,5 +119,7 @@ jobs:
- run: pnpm install --frozen-lockfile
- name: Build pulse-core
run: pnpm tsc -p packages/pulse-core/tsconfig.json
- name: Build pulse-webhooks
run: pnpm tsc -p packages/pulse-webhooks/tsconfig.json
- name: Typecheck apps/web
run: pnpm tsc --noEmit -p apps/web/tsconfig.json
18 changes: 8 additions & 10 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ jobs:
with:
node-version: 20
cache: pnpm
# registry-url is needed when the npm publish step is uncommented
registry-url: https://registry.npmjs.org

# ── Build and test gate ───────────────────────────────────────────────
Expand All @@ -41,8 +40,8 @@ jobs:
- name: Build pulse-core
run: pnpm tsc -p packages/pulse-core/tsconfig.json

- name: Typecheck pulse-webhooks
run: pnpm tsc --noEmit -p packages/pulse-webhooks/tsconfig.json
- name: Build pulse-webhooks
run: pnpm tsc -p packages/pulse-webhooks/tsconfig.json

- name: Typecheck pulse-notify
run: pnpm tsc --noEmit -p packages/pulse-notify/tsconfig.json
Expand All @@ -64,10 +63,9 @@ jobs:
prerelease: ${{ contains(github.ref_name, '-') }}

# ── npm publish ───────────────────────────────────────────────────────
# Uncomment when packages are ready to publish.
# Requires NPM_TOKEN to be added to GitHub secrets first.
#
# - name: Publish packages to npm
# run: pnpm -r --filter './packages/*' publish --access public --no-git-checks
# env:
# NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
# Packages are already live on npm under the @orbital-stellar scope;
# this step publishes each subsequent tagged version bump.
- name: Publish packages to npm
run: pnpm -r --filter './packages/*' publish --access public --no-git-checks
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
12 changes: 9 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

This file rolls up changes across the public packages: `@orbital-stellar/pulse-core`,
`@orbital-stellar/pulse-webhooks`, and `@orbital-stellar/pulse-notify`. Per-package changelogs
live in each package directory.
`@orbital-stellar/pulse-webhooks`, `@orbital-stellar/pulse-notify`, and `@orbital-stellar/abi-registry`.
Per-package changelogs live in each package directory.

## [Unreleased]

Expand Down Expand Up @@ -113,11 +113,17 @@ in Phase 1 (Q2–Q3 2026).
is now a single Next.js file rather than a separate Express server, so
there is one runtime to deploy when self-hosting the SDKs end-to-end.

### Known limitations
### Known limitations (as of this release)

- Soroban contract events (`invoke_host_function`) are not yet normalized
— Phase 1.
- Webhook retries are in-process; restarting loses pending retries.
Persistent retry queues ship in Phase 1 alongside cursor persistence.
- Packages are not yet published to npm. Until `v0.1.0` is tagged and
released, consume via `pnpm install` against the workspace.

> **Update (2026-07-06):** all three limitations above have since been resolved —
> Soroban event subscription, durable retry queues, and cursor persistence shipped
> (see `ROADMAP.md` Wave 1.1–1.3), and all four packages are now published to npm
> under the `@orbital-stellar` scope (published out-of-band; the `release.yml`
> npm-publish step is now uncommented for future version bumps).
5 changes: 3 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,10 @@ That installs all workspace packages. No additional steps are needed to run the
```
orbital/
├── packages/
│ ├── pulse-core/ # EventEngine, Watcher, Horizon + RPC streaming
│ ├── pulse-core/ # EventEngine, Watcher, Horizon + Soroban RPC streaming
│ ├── pulse-webhooks/ # HMAC delivery, retry, SSRF protection
│ └── pulse-notify/ # React hooks
│ ├── pulse-notify/ # React hooks
│ └── abi-registry/ # Soroban ABI client, schema helpers, registry publisher
├── apps/
│ └── web/ # Next.js marketing + documentation site
├── tsconfig.base.json # Shared TypeScript config
Expand Down
113 changes: 60 additions & 53 deletions PROGRESS.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,43 @@
# Orbital: Progress & Status Report

**Last Updated:** 2026-05-07
**Project Status:** Phase 0 (SDK Foundation) — Complete ✅
**Next Milestone:** Phase 1 — Production-grade `v1.0` (Q2–Q3 2026)
**Last Updated:** 2026-07-06
**Project Status:** Core SDK family — Shipped ✅

---

## Executive Summary

Orbital is **Stellar's open-source real-time event SDK family** — three MIT-licensed packages on npm that give any Stellar developer typed event subscriptions, signed webhook delivery, and React hooks without re-implementing the plumbing.
Orbital is **Stellar's open-source real-time event SDK family** — four MIT-licensed packages on npm that give any Stellar developer typed event subscriptions (Horizon and Soroban), signed webhook delivery with durable retry, typed ABI decoding, and React hooks, without re-implementing the plumbing.

**Current Status:** Phase 0 (Foundation) is complete. The full classic operation taxonomy is shipped, edge-runtime webhook verification works on Cloudflare Workers and Vercel Edge, and React hooks are in production-shape. Phase 1 (Soroban event subscription, ABI registry, `v1.0` stability pledge, npm publish) begins Q2 2026.
**Current Status:** The full classic operation taxonomy, Soroban contract event subscription, cursor persistence, durable webhook retry queues, the ABI registry client, and edge-runtime webhook verification are all shipped and tested. Next up is the Phase 2 SDK family (`@orbital-stellar/hooks`, `@orbital-stellar/payments`, `@orbital-stellar/auth`) — see [`ROADMAP.md`](ROADMAP.md).

**OSS posture:** SDKs are MIT and free indefinitely. Production hosting is the separately-built **Orbital Cloud** managed runtime, in development. Until Cloud ships, the SDKs run great in any Node.js or edge backend you operate.

---

## What Has Been Completed

### Phase 0 — Foundation
### Core SDK family

All three packages are feature-complete for Phase 0 scope and ready for use against testnet today:
All four packages are feature-complete and ready for use against testnet and mainnet today:

| Component | Status | Details |
|---|---|---|
| Classic operation event streaming via Horizon SSE | ✅ Done | Horizon subscription, automatic reconnection with AWS Full Jitter backoff |
| Full classic operation taxonomy | ✅ Done | Payments (received/sent/self), account create/merge/bump-sequence, trustlines (change/allow/set_flags), DEX offers (created/updated/deleted), claimable balances (created/claimed), liquidity pools (deposit/withdraw), `manage_data` (set/cleared) |
| Soroban contract event subscription | ✅ Done | `engine.subscribeContract({ contractId, topics })` via Stellar RPC, `contract.invoked` / `contract.emitted` normalized events |
| Cursor persistence | ✅ Done | Pluggable `CursorStore` adapters — memory, file, Postgres, Redis, S3 — for resumable streams across restarts |
| ABI registry client | ✅ Done | `AbiRegistryClient` / `LocalAbiRegistryClient`, typed `decodedData` enrichment on `contract.emitted`, schema validation |
| HMAC-signed webhook delivery | ✅ Done | Retry, exponential backoff, concurrent-retry caps, configurable timeout |
| Durable webhook retry queues | ✅ Done | Pluggable `RetryQueue` adapters — memory, Redis, SQS — survive process restarts |
| Edge-runtime webhook verification | ✅ Done | `verifyWebhookEdge` for Cloudflare Workers and Vercel Edge (Web Crypto API) |
| React hooks (`useStellarEvent`, `useStellarPayment`, `useStellarActivity`) | ✅ Done | Type-narrowing generic on `useStellarEvent`, multi-event subscription, stable config rules |
| React hooks (`useStellarEvent`, `useContractEvent`, `useStellarPayment`, `useStellarActivity`, `useStellarAddresses`, `useStellarHistory`) | ✅ Done | Type-narrowing generic on `useStellarEvent`, multi-event subscription, stable config rules |
| Custom Horizon URL override | ✅ Done | `CoreConfig.horizonUrl` for self-hosted nodes / regional mirrors / futurenet |
| Engine lifecycle notifications | ✅ Done | `engine.reconnecting`, `engine.reconnected`, `engine.rate_limited`, `engine.stopped` |
| Public marketing + documentation site (`apps/web`) | ✅ Done | Next.js 16, Tailwind CSS 4. Hosts the docs, the sandboxed `/api/events/[address]` SSE demo, and the `/api/webhook-sample` signing demo. |
| Testnet + mainnet support | ✅ Done | Network selector via `network: "mainnet" \| "testnet"` |
| CI/CD pipeline | ✅ Done | GitHub Actions on Node 20 and 22, CodeQL, Dependabot |
| npm publish | ✅ Done | All four packages live under the `@orbital-stellar` scope |
| MIT License & open-source setup | ✅ Done | `LICENSE`, `CONTRIBUTING.md`, `SECURITY.md` |

---
Expand All @@ -43,9 +47,10 @@ All three packages are feature-complete for Phase 0 scope and ready for use agai
```
orbital_stellar/
├── packages/ # MIT-licensed SDKs published to npm
│ ├── pulse-core/ # Event engine — Horizon + Soroban subscription
│ ├── pulse-webhooks/ # HMAC webhook delivery + verification
│ └── pulse-notify/ # React hooks
│ ├── pulse-core/ # Event engine — Horizon + Soroban subscription, cursor persistence
│ ├── pulse-webhooks/ # HMAC webhook delivery + verification, durable retry queues
│ ├── pulse-notify/ # React hooks
│ └── abi-registry/ # Soroban ABI client, schema helpers, registry publisher
├── apps/
│ └── web/ # Marketing + docs site + sandboxed demo API routes (Vercel)
├── docs/
Expand All @@ -64,28 +69,36 @@ orbital_stellar/

### 1. `@orbital-stellar/pulse-core` — Event Engine

Subscribes to Horizon SSE, normalizes raw operations into a typed `NormalizedEvent` taxonomy, and routes them to per-address `Watcher` instances. Handles reconnection, backoff, and rate-limit responses automatically.
Subscribes to Horizon SSE and Stellar RPC (Soroban), normalizes raw operations and contract events into a typed `NormalizedEvent` taxonomy, and routes them to per-address `Watcher` instances. Handles reconnection, backoff, rate-limit responses, and cursor persistence (memory, file, Postgres, Redis, S3 adapters) automatically.

**Status:** Production-ready for Phase 0 scope (full classic operation taxonomy). Soroban event subscription is Phase 1.
**Status:** Production-ready full classic operation taxonomy plus Soroban contract event subscription and cursor persistence.

See [`packages/pulse-core/README.md`](./packages/pulse-core/README.md) for the API and [`packages/pulse-core/CHANGELOG.md`](./packages/pulse-core/CHANGELOG.md) for the per-feature commit trail.

### 2. `@orbital-stellar/pulse-webhooks` — Webhook Delivery

Attaches to a `Watcher` and POSTs every event to one or more endpoints with HMAC-SHA256 signing, exponential backoff retry, configurable timeout, and SSRF hardening. `verifyWebhook` (Node) and `verifyWebhookEdge` (Web Crypto) are exported for the receiver side.
Attaches to a `Watcher` and POSTs every event to one or more endpoints with HMAC-SHA256 signing, exponential backoff retry, configurable timeout, SSRF hardening, and durable retry queues (memory, Redis, SQS adapters) that survive process restarts. `verifyWebhook` (Node) and `verifyWebhookEdge` (Web Crypto) are exported for the receiver side.

**Status:** Production-ready for Phase 0 scope.
**Status:** Production-ready.

See [`packages/pulse-webhooks/README.md`](./packages/pulse-webhooks/README.md).

### 3. `@orbital-stellar/pulse-notify` — React Hooks

Browser-side React hooks (`useStellarEvent`, `useStellarPayment`, `useStellarActivity`) that open an SSE connection to your Orbital-powered backend and re-render on each event. Generic type narrowing supported on `useStellarEvent<T>`.
Browser-side React hooks (`useStellarEvent`, `useContractEvent`, `useStellarPayment`, `useStellarActivity`, `useStellarAddresses`, `useStellarHistory`) that open an SSE connection to your Orbital-powered backend and re-render on each event. Generic type narrowing supported on `useStellarEvent<T>`.

**Status:** Production-ready for Phase 0 scope.
**Status:** Production-ready.

See [`packages/pulse-notify/README.md`](./packages/pulse-notify/README.md).

### 4. `@orbital-stellar/abi-registry` — ABI Registry Client

Canonical client for fetching Soroban contract ABI specs (`AbiRegistryClient` over HTTP, `LocalAbiRegistryClient` for offline/self-hosted use), plus schema validation and `scval`/JS conversion helpers. Wired into `pulse-core`'s `EventEngine` to enrich `contract.emitted` events with typed `decodedData`.

**Status:** Production-ready.

See [`packages/abi-registry/README.md`](./packages/abi-registry/README.md).

---

## Reference Composition: `apps/web` API routes
Expand Down Expand Up @@ -128,15 +141,14 @@ Stellar Network (Horizon REST/SSE + Stellar RPC)
@orbital-stellar/pulse-core
EventEngine · Watcher · Normalization · Reconnect · Backoff
┌────┴─────────────────┐
▼ ▼
@orbital-stellar/pulse-webhooks @orbital-stellar/pulse-notify
HMAC delivery React hooks (browser SSE)
SSRF hardening useStellarEvent
Edge-runtime verify useStellarPayment
useStellarActivity
EventEngine · Watcher · Normalization · Reconnect · Backoff · Cursor persistence
│ ▲
┌────┴─────────────────┐ │
▼ ▼ │
@orbital-stellar/pulse-webhooks @orbital-stellar/pulse-notify @orbital-stellar/abi-registry
HMAC delivery React hooks (browser SSE) ABI spec fetch + decode
Durable retry queues useStellarEvent / useContractEvent (wired into EventEngine
Edge-runtime verify useStellarPayment / useStellarActivity for contract.emitted)
```

---
Expand All @@ -152,57 +164,52 @@ Edge-runtime verify useStellarPayment
- ✅ Security disclosure policy (`SECURITY.md`)
- ✅ CodeQL static analysis on every PR
- ✅ Dependabot for dependency CVE tracking

### Phase 1 Scope
- 🔲 Cursor persistence (resumable streams)
- 🔲 Pluggable durable adapters (Redis, Postgres, S3) for replay
- 🔲 Soroban event subscription via Stellar RPC
- 🔲 ABI registry client for typed Soroban event decoding
- ✅ Cursor persistence (resumable streams) — `CursorStore` memory/file/Postgres/Redis/S3 adapters
- ✅ Durable retry queues — `RetryQueue` memory/Redis/SQS adapters
- ✅ Soroban event subscription via Stellar RPC
- ✅ ABI registry client for typed Soroban event decoding

---

## Phase 0 Scope Boundaries
## Scope Boundaries

These are **not** in Phase 0 and are tracked for Phase 1 or later:
Not yet in this repository, tracked for later phases:

1. **Soroban events** — contract event subscription via Stellar RPC. Phase 1.
2. **Cursor persistence** — resumable streams across process restarts. Phase 1.
3. **Webhook replay store** — durable retry adapters for Redis/Postgres/S3. Phase 1.
4. **Production hosting** — multi-region orchestration, persistent registries, leader election. Belongs in **Orbital Cloud** (separate closed product), not in this repository.
5. **`@orbital-stellar/hooks`, `@orbital-stellar/payments`, `@orbital-stellar/auth`** — Phase 2 SDK family. See [`ROADMAP.md`](./ROADMAP.md).
6. **`@orbital-stellar/x402`, `@orbital-stellar/agent-sdk`** — Phase 3. See [`ROADMAP.md`](./ROADMAP.md).
1. **Production hosting** — multi-region orchestration, persistent registries, leader election. Belongs in **Orbital Cloud** (separate closed product), not in this repository.
2. **`@orbital-stellar/hooks`, `@orbital-stellar/payments`, `@orbital-stellar/auth`** — Phase 2 SDK family. See [`ROADMAP.md`](./ROADMAP.md).
3. **`@orbital-stellar/x402`, `@orbital-stellar/agent-sdk`** — Phase 3. See [`ROADMAP.md`](./ROADMAP.md).
4. **`v1.0` stability pledge** — formal semver contract, tracked in [`ROADMAP.md`](./ROADMAP.md).

---

## Next Steps: Phase 1 (Q2–Q3 2026)
## Next Steps: Phase 2

| Milestone | Q2 2026 | Q3 2026 |
|---|---|---|
| **Events** | Soroban event subscription (Stellar RPC) | ABI registry client for typed decoding |
| **Types** | Discriminated union refinement (exhaustive `switch`) | — |
| **Persistence** | Cursor persistence in `pulse-core` | Pluggable replay adapters in `pulse-webhooks` |
| **Distribution** | Starter boilerplates (`next`, `express`, `anchor`) | npm publish under `@orbital-stellar/` |
| **Stability** | — | `v1.0` stability pledge — semver contract |
| Milestone | Target |
|---|---|
| **SDKs** | `@orbital-stellar/hooks`, `@orbital-stellar/payments`, `@orbital-stellar/auth` |
| **Standards** | First SEP submission |
| **Distribution** | Starter boilerplates (`next`, `express`, `anchor`) |
| **Stability** | `v1.0` stability pledge — formal semver contract |

See [`ROADMAP.md`](./ROADMAP.md) for the full multi-year vision and [`docs/proposal.md`](./docs/proposal.md) for the Phase 1 SCF funding proposal.
See [`ROADMAP.md`](./ROADMAP.md) for the full multi-year vision and [`docs/proposal.md`](./docs/proposal.md) for the current SCF funding proposal.

---

## How to Get Started

### As a Stellar Developer
1. Read [Getting Started](./apps/web/content/getting-started/introduction.md)
2. Install: `pnpm add @orbital-stellar/pulse-core @orbital-stellar/pulse-webhooks @orbital-stellar/pulse-notify`
2. Install: `pnpm add @orbital-stellar/pulse-core @orbital-stellar/pulse-webhooks @orbital-stellar/pulse-notify @orbital-stellar/abi-registry`
3. Follow the [Quick Start](./apps/web/content/getting-started/quick-start.md)

### As a Contributor
1. Read [`CONTRIBUTING.md`](./CONTRIBUTING.md)
2. Browse [issues tagged `good-first-issue`](https://github.com/orbital/orbital/labels/good-first-issue) — Drips Wave Program rewards apply
2. Browse [issues tagged `good-first-issue`](https://github.com/determined-001/orbital_stellar/labels/good-first-issue) — Drips Wave Program rewards apply
3. Run `pnpm -r typecheck && pnpm test` before submitting

### As a Funder / Reviewer
1. Read [`docs/proposal.md`](./docs/proposal.md) for the SCF Infrastructure Grant ask
2. See [`CHANGELOG.md`](./CHANGELOG.md) for the Phase 0 commit trail
2. See [`CHANGELOG.md`](./CHANGELOG.md) for the full commit trail

---

Expand All @@ -213,7 +220,7 @@ See [`ROADMAP.md`](./ROADMAP.md) for the full multi-year vision and [`docs/propo
| Build Status | ✅ Passing |
| Test Coverage | ✅ Core paths covered; integration tests gated by `INTEGRATION_TESTS=true` |
| Security Scanning | ✅ CodeQL + Dependabot active |
| Documentation | ✅ Complete for Phase 0 |
| Documentation | ✅ Complete for the shipped SDK family |
| License | ✅ MIT |
| Workspace | ✅ pnpm 10 monorepo, Node 20 + 22 in CI |

Expand Down
Loading
Loading