A decentralized peer-to-peer network for exchanging standardized space data using Space Data Standards, built on IPFS and libp2p.
Enable decentralized, global collaboration on space situational awareness and space traffic management.
As space becomes increasingly congested with satellites, debris, and new actors, the need for transparent, real-time data sharing has never been greater. Space Data Network removes barriers to collaboration by:
- Eliminating single points of failure - No central server that can go down or be blocked
- Enabling permissionless participation - Anyone can join and contribute data
- Ensuring data integrity - Cryptographic verification of all shared data
- Reducing latency - Direct peer-to-peer data exchange without intermediaries
- Promoting interoperability - Standardized formats everyone can use
Space Data Network enables real-time sharing of space situational awareness data between organizations, satellites, and ground stations. Built on IPFS/libp2p with FlatBuffers serialization, SDN provides:
- Standardized Data Exchange - All Space Data Standards schemas supported
- Decentralized Architecture - No central server required
- Real-time PubSub - Subscribe to data streams by type (OMM, CDM, EPM, etc.)
- Cryptographic Verification - Ed25519 signatures on all data
- Cross-Platform - Server (Go), Browser (TypeScript), Desktop, Edge Relay support
# Download latest release
curl -sSL https://digitalarsenal.github.io/space-data-network//install.sh | bash
# Or build from source
git clone https://github.com/DigitalArsenal/space-data-network.git
cd space-data-network/sdn-server
go build -o spacedatanetwork ./cmd/spacedatanetworkcd space-data-network/sdn-js
npm install
npm run build# Initialize configuration
./spacedatanetwork init
# Start the node
./spacedatanetwork daemonimport { SDNNode, SchemaRegistry } from './path/to/sdn-js/dist/esm/index.js';
// Create and start a node
const node = new SDNNode();
await node.start();
// Subscribe to Orbital Mean-Elements Messages
node.subscribe('OMM', (data, peerId) => {
console.log(`Received OMM from ${peerId}:`, data);
});
// Publish data
const ommData = { /* your OMM data */ };
await node.publish('OMM', ommData);- Local CI (same checks as GitHub CI):
./scripts/ci-local.sh quick- Full local CI (includes encryption tests):
./scripts/ci-local.sh full- Pushes run local CI automatically via
.husky/pre-push. To bypass intentionally:
SKIP_LOCAL_CI=1 git push+-------------------------------------------------------------------+
| Space Data Network |
+-------------------------------------------------------------------+
| |
| +-----------+ +-----------+ +-----------+ |
| | Full Node |<---->| Full Node |<---->| Full Node | |
| | (Go) | | (Go) | | (Go) | |
| +-----+-----+ +-----+-----+ +-----+-----+ |
| | | | |
| | DHT + PubSub | | |
| | | | |
| +-----+-----+ +-----+-----+ +-----+-----+ |
| |Edge Relay | |Edge Relay | |Edge Relay | |
| | (Go) | | (Go) | | (Go) | |
| +-----+-----+ +-----+-----+ +-----+-----+ |
| | | | |
| | Circuit Relay | | |
| | | | |
| +-----+-----+ +-----+-----+ +-----+-----+ |
| | Browser | | Desktop | | Browser | |
| | (JS) | | (App) | | (JS) | |
| +-----------+ +-----------+ +-----------+ |
| |
+-------------------------------------------------------------------+
| Platform | Architecture | Download |
|---|---|---|
| Linux | amd64 | spacedatanetwork-linux-amd64 |
| Linux | arm64 | spacedatanetwork-linux-arm64 |
| macOS | amd64 | spacedatanetwork-darwin-amd64 |
| macOS | arm64 | spacedatanetwork-darwin-arm64 |
| Windows | amd64 | spacedatanetwork-windows-amd64.exe |
| Platform | Architecture | Download |
|---|---|---|
| Linux | amd64 | spacedatanetwork-edge-linux-amd64 |
| Linux | arm64 | spacedatanetwork-edge-linux-arm64 |
| Platform | Download |
|---|---|
| macOS | SpaceDataNetwork.dmg |
| Windows | SpaceDataNetwork-Setup.exe |
| Linux | SpaceDataNetwork.AppImage |
cd sdn-js
npm install
npm run buildEvery SDN node derives its cryptographic identity from a BIP-39 mnemonic using SLIP-10 hierarchical deterministic key derivation with the standard BIP-44 Bitcoin derivation path (coin type 0).
BIP-39 Mnemonic → PBKDF2 → 512-bit Seed → SLIP-10 Master Key
├── m/44'/0'/0'/0'/0' → Ed25519 Signing Key (also libp2p PeerID)
└── m/44'/0'/0'/1'/0' → X25519 Encryption Key
SDN reuses the standard BIP-44 HD wallet path structure with Bitcoin's coin type 0:
- Wallet-native identity. The BIP-44 path structure lets users derive SDN signing and encryption keys from the same mnemonic they use for cryptocurrency wallets. One seed, many independent key trees.
- Multi-account. The
account'segment enables one mnemonic to manage multiple SDN identities (operator, sensor, analytics service), each with independent key pairs.
The xpub (extended public key) serves as the master network identity. Anyone with the xpub can derive the node's public signing and encryption keys without access to private key material.
Space Data Network is built on the InterPlanetary File System (IPFS) stack:
| Technology | Purpose |
|---|---|
| libp2p | Modular P2P networking |
| Kademlia DHT | Distributed peer discovery |
| GossipSub | Publish/subscribe messaging |
| Circuit Relay | NAT traversal |
| Kubo | IPFS reference implementation |
SDN extends IPFS with space-specific optimizations:
- FlatBuffers for zero-copy performance
- Schema-validated data (Space Data Standards + OrbPro control schemas)
- Topic-per-schema PubSub
- SQLite storage with FlatBuffer virtual tables
| Component | Description | Language |
|---|---|---|
| sdn-server | Full node and edge relay server | Go |
| sdn-js | Browser/Node.js SDK | TypeScript |
| desktop | Desktop application | TypeScript |
| schemas | FlatBuffer schema definitions | FlatBuffers |
| kubo | IPFS reference implementation | Go |
OrbPro licensing/key exchange stream schemas (v1.0) are versioned in the plugin SDK:
packages/plugin-sdk/schemas/orbpro/key-broker/PublicKeyResponse.fbspackages/plugin-sdk/schemas/orbpro/key-broker/KeyBrokerRequest.fbspackages/plugin-sdk/schemas/orbpro/key-broker/KeyBrokerResponse.fbs
Regenerate plugin SDK + SDN Go bindings from these schemas (via flatc-wasm):
npm run generate:plugin-sdk:key-broker-bindingsRun the plugin SDK protocol test client:
npm run test:plugin-sdk:key-broker-client -- --node-info-url http://127.0.0.1:5010/api/node/info| Package | Description |
|---|---|
internal/sds |
FlatBuffer builders for all SDS schemas with fluent API |
internal/vcard |
EPM to vCard/QR code bidirectional conversion |
internal/pubsub |
PubSub topics and PNM-based tip/queue system |
internal/storage |
SQLite storage with FlatBuffer support |
SDN supports all Space Data Standards:
| Category | Standards |
|---|---|
| Orbit | OMM, OEM, OCM, OSM |
| Conjunction | CDM, CSM |
| Tracking | TDM, RFM |
| Catalog | CAT, SIT |
| Entity | EPM, PNM |
| Maneuver | MET, MPE |
| Propagation | HYP, EME, EOO, EOP |
| Reference | LCC, LDM, CRM, CTR |
| Other | ATM, BOV, IDM, PLD, PRG, REC, ROC, SCM, TIM, VCM |
node.subscribe('CDM', (cdm, peerId) => {
if (cdm.COLLISION_PROBABILITY > 1e-4) {
alertOperator(cdm);
}
});- OMM - Mean orbital elements (TLE-equivalent)
- OEM - Precise ephemeris state vectors
- OCM - Comprehensive orbit characterization
- MPE - Maneuver notifications
- LDM/LCC - Launch coordination
- ROC - Reentry predictions
SDN uses a two-tier peer topology for maximum reach and reliability:
┌─────────────────────────────────────────────────────────────────┐
│ FULL NODES (Open Internet) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │Full Node │◄────►│Full Node │◄────►│Full Node │ │
│ │ (Go) │ │ (Go) │ │ (Go) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ │ DHT + GossipSub + Relay │ │
│ │ │ │ │
├─────────┼─────────────────┼─────────────────┼────────────────────┤
│ ▼ ▼ ▼ │
│ LIGHT PEERS (Behind NAT/Firewall) │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Browser │ │ Desktop │ │Corporate │ │
│ │ (JS) │ │ (App) │ │ Node │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
- Run on servers with public IP addresses
- Participate in DHT routing and peer discovery
- Relay traffic for firewalled peers via Circuit Relay
- Pin and store content for the network
- Requirements: Public IP, ports 4001 (libp2p), 8080 (HTTP API)
- Connect through relay nodes when behind NAT/firewalls
- Can subscribe to data, publish messages, verify signatures
- Cannot contribute to DHT routing
- Includes: browsers, mobile apps, desktop apps, corporate networks
Help strengthen the network by running a full node:
./spacedatanetwork daemon --relay-enabled --announce-publicAll data on SDN is content-addressed using cryptographic hashes (CIDs):
| Feature | Description |
|---|---|
| Tamper-proof | Hash changes if data is modified - tampering is immediately detectable |
| Permanent references | CIDs never change - reference specific data versions forever |
| Deduplication | Same data = same hash - network automatically deduplicates |
| Selective pinning | Choose what to store locally - pin critical data for availability |
SDN uses Publish Notification Messages (PNM) for intelligent content distribution. Instead of broadcasting all data, nodes announce content availability via PNM, allowing peers to selectively fetch based on their configuration.
Publisher Subscriber
| |
|-- Pin content locally |
|-- Broadcast PNM (CID + schema) ---|--> Receive PNM
| |-- Check config for peer + schema
| |-- If autoFetch: fetch content
| |-- If autoPin: pin with TTL
Nodes can configure auto-fetch, auto-pin, and TTL per-source AND per-schema:
| Setting | Description |
|---|---|
| Per-schema defaults | E.g., always fetch CDM (conjunction data) |
| Per-source overrides | E.g., trust data from partner organizations |
| Per-source+schema | E.g., special handling for OMM from trusted source |
This enables flexible policies like:
- Auto-pin all conjunction warnings from anyone
- Auto-fetch orbital data only from trusted partners
- Store data from government agencies for 1 week, commercial for 24h
See sdn-server documentation for configuration details.
SDN includes an optional commercial layer for monetizing space data:
- Provider publishes premium data product (high-precision ephemeris, analysis, etc.)
- Per-customer encryption - Data encrypted with each customer's public key (ECIES)
- Customer pays via credit card through integrated payment gateway
- Access granted - Customer receives and decrypts data with their private key
| Category | Options |
|---|---|
| Data Products | High-precision ephemeris, conjunction analysis, historical archives, real-time feeds |
| Plugin Marketplace | Analysis algorithms, visualization tools, format converters, custom propagators |
| Payment Options | Credit cards (Stripe), subscriptions, usage-based billing, enterprise invoicing |
- Encryption: ECIES with X25519 key exchange + AES-256-GCM
- Payment Gateway: Stripe integration for credit card processing
- Revenue Distribution: Automated splits between data providers and platform
- Metering: Usage tracking for consumption-based billing
The marketplace operates on top of the free, open network. Core SSA data exchange remains free and open - the commercial layer is opt-in for premium products.
Run an end-to-end check that validates loading a licensing plugin from a local workspace into SDN.
npm run plugin-harness -- /path/to/private-repoYou can also use the command with any plugin workspace path:
npm run plugin-harness -- /path/to/repoOptions:
--repo(or positional first arg): path to the plugin workspace--admin-addr: admin endpoint used for verification (default127.0.0.1:5010)--artifact-dir: path to existing encrypted artifacts when--skip-buildis set--skip-build: use existing artifacts in the staging directory--keep-workspace: keep temporary workspace for debugging--derivation-secret: optional derivation secret override (64 hex chars)
This command is key-management agnostic on the CLI:
- It derives the keypair internally for normal runs.
- A fixed test public key is read from
PLUGIN_KEY_SERVER_ARTIFACT_PUBLIC_KEY_HEXwhen set. - For
--skip-build, it requires bothPLUGIN_KEY_SERVER_ARTIFACT_PUBLIC_KEY_HEXandPLUGIN_KEY_SERVER_ARTIFACT_PRIVATE_KEY_HEX.
The command uses the standardized plugin task:
npm run build:key-serverIt then copies/decrypts the generated encrypted artifact, boots SDN with a temporary plugin catalog, and verifies:
/api/v1/plugins/manifestreports the plugin id (defaultplugin-key-broker) asrunning/api/v1/plugins/<plugin-id>/bundlereturns 200 and non-empty WASM payload
This harness runs against private repos as long as the repo is reachable and follows the plugin workspace contract.
- Clone/fetch private repo using your normal auth path (SSH key or token-based HTTPS).
- Confirm workspace layout includes:
package.jsonscripts/build-plugin-release.js(orPLUGIN_HARNESS_BUILD_HELPER_SCRIPToverride)npm run build:key-serversucceeds (or configurePLUGIN_HARNESS_BUILD_COMMAND)
- Export one of the artifact public key env vars used for staging:
PLUGIN_KEY_SERVER_ARTIFACT_PUBLIC_KEY_HEX(preferred)PLUGIN_KEY_SERVER_ARTIFACT_PRIVATE_KEY_HEXwhen using--skip-build
- Run:
npm run plugin-harness -- /path/to/private-plugin-repo
5. The harness validates the plugin lifecycle and plugin API endpoints in SDN.
Use `--skip-build` when reusing staged artifacts already in CI:
```bash
export PLUGIN_KEY_SERVER_ARTIFACT_PUBLIC_KEY_HEX=<public_hex>
export PLUGIN_KEY_SERVER_ARTIFACT_PRIVATE_KEY_HEX=<matching_private_hex>
npm run plugin-harness -- /path/to/private-plugin-repo --skip-build --artifact-dir /path/to/Build/plugin/licensing-server
If your private repo has a custom auth requirement, run the harness in that authenticated shell context so Git can access dependencies and source.
- Go 1.21+
- Node.js 18+
- Emscripten (for WASM)
git clone https://github.com/DigitalArsenal/space-data-network.git
cd space-data-network
# Build server
cd sdn-server
go build -o spacedatanetwork ./cmd/spacedatanetwork
go build -tags edge -o spacedatanetwork-edge ./cmd/spacedatanetwork-edge
# Build JavaScript SDK
cd ../sdn-js
npm install
npm run build# Go tests
cd sdn-server && go test ./...
# JavaScript tests
cd sdn-js && npm testFull documentation is available at docs.digitalarsenal.github.io/space-data-network or locally at docs/docs.html.
To preview the docs locally, start a webserver from the docs/ directory:
cd docs && python3 -m http.server 8080Then open http://localhost:8080.
Topics covered:
- Getting Started & Quick Start
- Full Node Setup & Configuration
- Edge Relay Deployment
- JavaScript SDK Reference
- REST & WebSocket API
- Schema Reference (all Space Data Standards)
- digitalarsenal.github.io/space-data-network
- docs.digitalarsenal.github.io/space-data-network
- GitHub
- Space Data Standards
- SDN JS Source
See CONTRIBUTING.md for guidelines.
MIT License - see LICENSE for details.
Built for the space community