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 interfaceopensatcom 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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

opensatcom-0.6.0.tar.gz (139.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

opensatcom-0.6.0-py3-none-any.whl (107.0 kB view details)

Uploaded Python 3

File details

Details for the file opensatcom-0.6.0.tar.gz.

File metadata

  • Download URL: opensatcom-0.6.0.tar.gz
  • Upload date:
  • Size: 139.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for opensatcom-0.6.0.tar.gz
Algorithm Hash digest
SHA256 a883a8c458b3eda36aa1b3b65e45547ff9a8625e9fdb72cf342f6c1ba23393e8
MD5 f03de0cc8cc3aadd92bacf57de3fa09c
BLAKE2b-256 9112a9a29ef556eb0fbd6bdf6af1edd42e32f1bd117d343d527cc2d24e1035d7

See more details on using hashes here.

Provenance

The following attestation bundles were made for opensatcom-0.6.0.tar.gz:

Publisher: publish.yml on jman4162/opensatcom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file opensatcom-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: opensatcom-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 107.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for opensatcom-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 486266774b667b1791bade4e457c80e81480976590f7921e554177acc4c5867e
MD5 27acb7b3d2fad99b9632c6ce12b5ff66
BLAKE2b-256 852710c97949762767a8f5d2cb2ab7cff45b3777a1edc48958413eab4b4e29bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for opensatcom-0.6.0-py3-none-any.whl:

Publisher: publish.yml on jman4162/opensatcom

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.7.0

2 files

This release

0.6.0 This release

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

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