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.10.tar.gz (101.9 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.10-py3-none-any.whl (61.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: satdeploy-0.3.10.tar.gz
  • Upload date:
  • Size: 101.9 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.10.tar.gz
Algorithm Hash digest
SHA256 6d9220ab3fa836c53dee4add67bf368f7729f4bdace3ec87ce30e1f9bc46a2b9
MD5 b5162a7e87e8339728416c68f04ca843
BLAKE2b-256 3a02150f6850e338860215774d9598b215e9409412aab9332cedb5b1f427a54c

See more details on using hashes here.

Provenance

The following attestation bundles were made for satdeploy-0.3.10.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.10-py3-none-any.whl.

File metadata

  • Download URL: satdeploy-0.3.10-py3-none-any.whl
  • Upload date:
  • Size: 61.6 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.10-py3-none-any.whl
Algorithm Hash digest
SHA256 f18f862053c3bde9d66824189422b62c09caa3d643f92bcadd9a39495970f4ba
MD5 ddda98ac93c5830b134c0303bf12c5c8
BLAKE2b-256 32d80df818d53d352fe909006d7dc027d9fb2fe5b91d6d87d7b78a73ec303d7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for satdeploy-0.3.10-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