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

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.5.1},
  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.5.1.tar.gz (134.5 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.5.1-py3-none-any.whl (101.0 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for opensatcom-0.5.1.tar.gz
Algorithm Hash digest
SHA256 a13139345f794fe8db26d2cb826b9a4399c2099b96c0e985e34d0ff382693e89
MD5 fc23c35d6a8a9b9fa9875165bbec7ebe
BLAKE2b-256 ba088b955bba3dba3216e111bbf396eb8614b61fdcc9d7e29a27ac5239349f5f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: opensatcom-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 101.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.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 f08766441d60f0f4634601090242b6374ee594f49c1d352156da03218ba8d51f
MD5 39d54054000158e4193dbdfdb84c9821
BLAKE2b-256 b1778f9498cb2cad55aa2f046feb21edc73405987c1a69bcd07ad94150ffc10b

See more details on using hashes here.

Provenance

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

0.6.0

2 files

This release

0.5.1 This release

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