Skip to main content

OpenSatCom

CI PyPI version Python 3.10+ License: MIT Ruff mypy

Open-source Python toolkit for satellite communications engineering.

Maps antenna + RF chain + propagation + mission time-series to link margin & capacity, with reproducible, trade-study-ready outputs.

Features

  • Snapshot link budgets — EIRP, G/T, C/N0, Eb/N0, margin in one call
  • Composite propagation — FSPL + ITU-R P.618 rain + P.676 gas + scintillation
  • DVB-S2 modem — 28 built-in ModCods, analytic BER curves, hysteresis ACM
  • Multi-beam payload — BeamSet, SINR/C(N+I) maps, interference modeling
  • Mission simulation — Tier 1 (single-sat), Tier 2 (multi-sat handover), Tier 3 (network traffic)
  • Trade studies — DOE (LHS/factorial/random), batch evaluation, Pareto extraction
  • Beautiful visualizations — Plotly interactive + Seaborn statistical plots
  • HTML reports — Standalone reports with embedded interactive charts
  • CLI interface — opensatcom run, mission, beammap, doe, batch, pareto

Installation

pip install opensatcom

For development:

pip install -e ".[dev]"

For Jupyter notebooks:

pip install -e ".[notebooks]"

Quickstart

from opensatcom.core.models import *
from opensatcom.antenna.parametric import ParametricAntenna
from opensatcom.propagation import FreeSpacePropagation
from opensatcom.link.engine import DefaultLinkEngine
from opensatcom.geometry.slant import slant_range_m

# Define terminals
satellite = Terminal("GEO-Sat", 0.0, 0.0, 35_786_000.0)
ground = Terminal("Ground", 38.9, -77.0, 0.0, system_noise_temp_k=290.0)

# Build link inputs
link_inputs = LinkInputs(
    tx_terminal=satellite,
    rx_terminal=ground,
    scenario=Scenario(
        name="Ku-DL", direction="downlink",
        freq_hz=12e9, bandwidth_hz=36e6,
        polarization="RHCP", required_metric="ebn0_db", required_value=5.0,
    ),
    tx_antenna=ParametricAntenna(gain_dbi=36.0),
    rx_antenna=ParametricAntenna(gain_dbi=38.0),
    propagation=FreeSpacePropagation(),
    rf_chain=RFChainModel(tx_power_w=100.0, tx_losses_db=1.5, rx_noise_temp_k=75.0),
)

# Evaluate
engine = DefaultLinkEngine()
range_m = slant_range_m(0.0, 35_786_000.0, 30.0)
result = engine.evaluate_snapshot(30.0, 0.0, range_m, link_inputs, PropagationConditions())
print(f"Margin: {result.margin_db:.2f} dB")

Architecture

src/opensatcom/
├── core/          # Datamodels, protocols, units, constants
├── antenna/       # PAM wrappers, parametric, cosine, coupling
├── rf/            # RF chain, cascaded stages
├── propagation/   # FSPL, ITU-R rain/gas/scintillation, composite
├── geometry/      # Slant range, elevation/azimuth
├── modem/         # DVB-S2 ModCods, analytic BER, ACM policy
├── link/          # Snapshot link budget engine
├── payload/       # BeamSet, BeamMap, multi-beam interference
├── world/         # WorldSim Tier 1/2/3, traffic, schedulers
├── trades/        # DOE, batch runner, Pareto extraction
├── viz/           # Plotly + Seaborn visualizations
├── reports/       # HTML report generation
├── io/            # Artifact I/O (parquet, yaml, json)
└── cli/           # CLI entry points

CLI Usage

# Snapshot link evaluation
opensatcom run config.yaml

# Time-series mission simulation
opensatcom mission config.yaml

# Multi-beam capacity map
opensatcom beammap config.yaml

# Design of experiments
opensatcom doe config.yaml -n 500 --method lhs

# Batch evaluation
opensatcom batch cases.parquet --parallel

# Pareto extraction
opensatcom pareto results.parquet --x cost_usd --y throughput_p50

# Generate report
opensatcom report results.parquet --format html

Tutorial Notebooks

Notebook Topic Colab
01_quickstart.ipynb End-to-end snapshot link budget Open In Colab
02_mission_simulation.ipynb Time-series mission simulation Open In Colab
03_multibeam_payload.ipynb Multi-series capacity analysis Open In Colab
04_propagation_models.ipynb Propagation model comparison Open In Colab
05_trade_studies.ipynb DOE + Pareto workflow Open In Colab

Testing

pytest tests/ -v              # All tests
pytest tests/ -m golden       # Golden regression tests only
pytest tests/ -m integration  # Integration tests only
ruff check src/ tests/        # Lint
mypy src/opensatcom/          # Type check

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/my-feature)
  3. Write tests for new functionality
  4. Ensure all tests pass (pytest tests/)
  5. Submit a pull request

MCP server

Expose the link and trade tools to MCP-compatible agents (install the mcp extra):

pip install "opensatcom[mcp]"
opensatcom mcp serve

Client configuration:

{"mcpServers": {"opensatcom": {"command": "opensatcom", "args": ["mcp", "serve"]}}}

Six tools: link_validate_config, link_snapshot, trade_doe, trade_batch, trade_pareto, report_render_snapshot. The surface follows the family convention in APAB's mcp-conventions.md.

Citation

If you use OpenSatCom in your research or publications, please cite:

@software{opensatcom,
  author       = {Hodge, John},
  title        = {OpenSatCom: Open-Source Satellite Communications Engineering Toolkit},
  year         = {2026},
  publisher    = {GitHub},
  url          = {https://github.com/jman4162/opensatcom},
  version      = {0.6.0},
  license      = {MIT}
}

License

MIT License. See LICENSE for details.

Metadata

Release files for opensatcom 0.7.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for opensatcom 0.7.0
File Size Uploaded Provenance Actions
opensatcom-0.7.0.tar.gz 146.8 kB With provenance Details for opensatcom-0.7.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for opensatcom 0.7.0
File Interpreter ABI Platform Actions
opensatcom-0.7.0-py3-none-any.whl Python 3 none any Details for opensatcom-0.7.0-py3-none-any.whl

Total release size: 257.3 kB

Release files / opensatcom-0.7.0.tar.gz

Download URL opensatcom-0.7.0.tar.gz
Size 146.8 kB
Tags Source
SHA-256 checksum
How to use checksums
943315262f4dbfd2660a799f49f0cdafb8042eab983acf1a190ff7a523123520
BLAKE2b-256 checksum
How to use checksums
44e6eb99c71e1d8ebb1743daccd3f701b79e78e2ab8c012af4e1f42fbffc9b80
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Release files / opensatcom-0.7.0-py3-none-any.whl

Download URL opensatcom-0.7.0-py3-none-any.whl
Size 110.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6aee7e9c27fb4eb0a5247fa1156b289d8d5492afa1e9017db161a6e5efa3db2d
BLAKE2b-256 checksum
How to use checksums
93710134fffae3d44e647ef37737f508473133bb27411440151760b81a98f4e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Security for opensatcom 0.7.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for opensatcom-0.7.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page