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.7.0.tar.gz (146.8 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.7.0-py3-none-any.whl (110.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for opensatcom-0.7.0.tar.gz
Algorithm Hash digest
SHA256 943315262f4dbfd2660a799f49f0cdafb8042eab983acf1a190ff7a523123520
MD5 18020d48b182c368ad4ffed78885477b
BLAKE2b-256 44e6eb99c71e1d8ebb1743daccd3f701b79e78e2ab8c012af4e1f42fbffc9b80

See more details on using hashes here.

Provenance

The following attestation bundles were made for opensatcom-0.7.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.7.0-py3-none-any.whl.

File metadata

  • Download URL: opensatcom-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 110.5 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.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6aee7e9c27fb4eb0a5247fa1156b289d8d5492afa1e9017db161a6e5efa3db2d
MD5 d5d220aa535606cf048f881e417b7678
BLAKE2b-256 93710134fffae3d44e647ef37737f508473133bb27411440151760b81a98f4e3

See more details on using hashes here.

Provenance

The following attestation bundles were made for opensatcom-0.7.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

This release

0.7.0 This release

2 files

0.6.0

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