Skip to main content

Deployment tool for embedded Linux satellites — push, track, rollback over SSH and CSP

Project description

A DISCO-2 cubesat in orbit above Earth

satDeploy

satDeploy pushing and rolling back a local test app in 20 seconds

satdeploy demo against a local throwaway target. Same hashing, backups, git provenance, and rollback code paths as a production deploy.

We flew DISCO-2, a 3U student CubeSat, and then spent weeks trying to recreate what was on it.

The payload ran a Yocto Linux image with several apps on it, each on its own release cadence, each updated the same way: rebuild locally, copy the binary over USB or SCP, and post "I updated the binary" in Slack. By launch, nobody could list every commit running on the hardware with confidence. After launch, rebuilding the same set on our flatsat took weeks of chasing memory and old tmux sessions, and we still ran into lib version mismatches we hadn't known were there.

satDeploy is what we built so it doesn't happen again. Every deploy is versioned, hash-verified, and tagged with the git commit it came from. Every file can be rolled back with one command. It works over SSH for networked targets on the bench, and over CSP (CAN bus, KISS serial, ZMQ) for air-gapped satellite links.

DISCO-2 is a 3U student CubeSat from Aarhus University, SDU, and ITU Copenhagen, launched on SpaceX Transporter-16 (March 30, 2026) to image Arctic glaciers from a 510 km sun-synchronous orbit. Coverage: Danish Space News, The Danish Dream, project site.

Early stage, but heading to orbit. We built satDeploy after DISCO-2 launched, so the current payload is flying without it. The next uplink window will push satDeploy to the DISCO-2 payload, and every deploy after that will be versioned, hash-verified, and rollback-able from the ground. Right now it runs on our flatsat, and we're actively putting it in front of other satellite teams — the more hardware it sees on the bench, the more rough edges we find and fix together before anything flies. If you run a satellite program, we'd love to see it on your flatsat. Open an issue or reach out.

Try it now

Zero dependencies on your laptop beyond Python and git.

pipx install satdeploy   # or: pip install satdeploy
satdeploy demo

satdeploy demo sets up a throwaway git repo and a local target directory, then pre-installs test_app v1.0.0. Run the real product loop against it:

satdeploy status              # See what's deployed
satdeploy push test_app       # Deploy v2 (new hash, new commit)
satdeploy rollback test_app   # Undo in one command, git tag carries through
satdeploy demo stop           # Tear it down when you're done

The demo runs against a directory on your own machine instead of a satellite, so test_app (a small shell script the demo ships) executes right there on your laptop. Against real hardware, the binary lives on the target and you watch its effects there.

Deploy to real hardware

SSH (networked target)

Your target has network access. You don't need any C components, just the Python CLI.

satdeploy init                   # select "ssh", enter your target's IP

Then edit ~/.satdeploy/config.yaml:

name: flatsat
transport: ssh
host: 192.168.1.50
user: root
apps:
  controller:
    local: ./build/controller          # path to your local binary
    remote: /opt/bin/controller        # where it goes on target
    service: controller.service        # systemd service to restart (or null)

Deploy:

satdeploy push controller
satdeploy status
satdeploy rollback controller        # undo
satdeploy logs controller            # service logs

CSP (air-gapped target, CAN/serial, experimental)

The CSP path has more moving parts. You need three pieces running:

Piece Where it runs How to get it
Python CLI or CSH APM Ground station pip install satdeploy or build the APM
satdeploy-agent Target satellite Yocto recipe or cross-compile
CSH Ground station Bridges ZMQ ↔ CAN/serial

Start the agent on the target:

satdeploy-agent -i CAN  -p can0           # CAN bus
satdeploy-agent -i KISS -p /dev/ttyS1     # Serial link
satdeploy-agent -i ZMQ  -p localhost      # ZMQ (local testing only)

On the ground station, satdeploy init (select "csp") gives you a config like:

name: my-satellite
transport: csp
zmq_endpoint: tcp://localhost:9600       # CSH's ZMQ address
agent_node: 55                           # your satellite's CSP node ID
ground_node: 40                          # your ground station's CSP node ID
apps:
  controller:
    local: ./build/controller
    remote: /opt/bin/controller

Then satdeploy push controller works the same as SSH.

If you just want to see the workflow without any of this, use satdeploy demo.

Docs

Requirements

  • Python 3.8+
  • git (for the demo, and for provenance tracking on real deploys)
  • SSH access to target (SSH transport)
  • satdeploy-agent on target + CSH on ground station (CSP transport)
  • systemd on target

License

MIT

Project details


Download files

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

Source Distribution

satdeploy-0.3.12.tar.gz (101.8 kB view details)

Uploaded Source

Built Distribution

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

satdeploy-0.3.12-py3-none-any.whl (61.5 kB view details)

Uploaded Python 3

File details

Details for the file satdeploy-0.3.12.tar.gz.

File metadata

  • Download URL: satdeploy-0.3.12.tar.gz
  • Upload date:
  • Size: 101.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for satdeploy-0.3.12.tar.gz
Algorithm Hash digest
SHA256 a7f32deb6c76ba3d06f91210eccab76c274bc505f9ee410d72e74960fc637c47
MD5 d690223f7fcb99d5b54a3e1dfbc31f78
BLAKE2b-256 1b37e9524583c515b1960ac18b021c7e59a0e54f09f4be1a5c4fe79894027d7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for satdeploy-0.3.12.tar.gz:

Publisher: pypi-publish.yml on MahmoodSeoud/satDeploy

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

File details

Details for the file satdeploy-0.3.12-py3-none-any.whl.

File metadata

  • Download URL: satdeploy-0.3.12-py3-none-any.whl
  • Upload date:
  • Size: 61.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for satdeploy-0.3.12-py3-none-any.whl
Algorithm Hash digest
SHA256 2785a6a02943390a3a5085017347461c43793573d90556904c26751a4147ef2e
MD5 cbf54ac7d3728f652f7d065f72fe239a
BLAKE2b-256 f977a3459a3c1e48b63604d04ef69ec1b5f0f4015603011aa295e1f3bd426e1c

See more details on using hashes here.

Provenance

The following attestation bundles were made for satdeploy-0.3.12-py3-none-any.whl:

Publisher: pypi-publish.yml on MahmoodSeoud/satDeploy

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page