This release is a pre-release and may not be stable for production use.
Open-source orchestration for autonomous sensor systems. Built for space domain awareness, fully capable for time-domain astronomy.
SensorKit is a Python framework for edge-distributed control systems, plus a complete, extensible ground-based sensor stack built on it. It drives your hardware, manages multiple tasking sources, and runs the full operating lifecycle, from scheduling observations to standing down for weather. Configurable from a single YAML file.
Highlights
- Autonomous operation. An agent service evaluates operating modes, weather and safety constraints, and program schedules, then starts up, tasks, and shuts down each sensor on its own. A single command hands control back to a human.
- Speaks your hardware's language. ASCOM Alpaca, PlaneWave PWI4, Software Bisque TheSky, and more, all included.
- Satellite tracking as a first-class citizen. Targets can be fixed alt/az or ICRS positions, TLEs, state vectors, or precomputed ephemerides. SensorKit propagates orbits and drives mounts in rate-tracking modes for fast-moving objects.
- Observing programs in a few dozen lines of Python. A program advertises when it has work and produces the next task when asked. Scheduling, priorities, device sequencing, and FITS writing are handled for you.
- Configuration-defined data flow. Camera frames move through a pipeline you declare in YAML: FITS headers populated from live telescope state, compression, disk, or hand-off to analysis services.
- Built to be pulled apart. Every device driver, sensor controller, program, and the agent itself is an independent service communicating over NATS JetStream. Run them on different machines, restart them independently, swap them freely.
SensorView is the graphical interface to a running system.
Quick start
The repository ships a complete simulated observatory: mount, camera, dome, and weather simulators with the full automation stack on top. No hardware, just Docker:
git clone <repo-url>
cd sensorkit/deploy/simulated
docker compose up --build
Open http://localhost:6080 to watch the simulated mount slew to targets. The quick start guide walks through the rest: exploring the system with the CLI, connecting SensorView, and reading the ~35-line observing program that drives it.
Installation
pip install sensorkit
Hardware and feature support ships as optional extras. Install only what your site uses:
pip install "sensorkit[alpaca,pwi4]"
SensorKit requires Python 3.13+ and a NATS server with JetStream enabled:
docker run -d --name nats -p 4222:4222 nats:alpine -js
export NATS_URL=nats://localhost:4222
The modules table below lists every extra. See Installation for how to go from an empty config to running services.
Modules
Every module below ships in the box.
Each one is an install extra named after the module, with underscores written as dashes, so node_platform becomes node-platform.
| Module | Kind | What it does |
|---|---|---|
| alpaca | Hardware | ASCOM Alpaca cameras, mounts, domes, focusers, filter wheels, rotators, switches, weather, and safety monitors |
| autoslew | Hardware | ASA Autoslew mounts over Alpaca, including ASA satellite tracking, pointing model, and Nasmyth selection |
| indigo | Hardware | INDIGO (and INDI) devices over the INDIGO WebSocket protocol |
| nina | Hardware | N.I.N.A. equipment through the Advanced API plugin |
| node_platform | Hardware | Observable Space Node Platform mounts, enclosures, optics, and weather |
| pwi4 | Hardware | PlaneWave Instruments mounts, focusers, rotators, and covers over the PWI4 HTTP API |
| thesky | Hardware | Software Bisque TheSky over its JavaScript-over-TCP scripting interface |
| otto | Program | Autonomous satellite collection from NORAD IDs, orbit regimes, or Horizons names, across a camera parameter grid |
| udl | Program | Unified Data Library tasking. Polls CollectRequests, reports progress, and delivers products back |
| burr | Program | Sensor characterization and calibration tasking |
| senpai | Analysis | Per-frame astrometry and photometry, with results published back into the system |
| sky_transmission | Analysis | All-sky star matching for live cloud and sky-transmission telemetry |
| sdasim | Simulation | Synthetic SDA scene renderer that presents itself as an ordinary camera device |
| slack | Notification | Real-time Slack alerts and daily observatory summaries |
Documentation
Full documentation lives in docs/:
quick start, installation, configuration, guides for devices, sensors, programs, and the agent, plus CLI and API references.
To build and serve it locally:
uv run zensical serve
Development
Requirements: Python 3.13+, uv
git clone <repo-url>
cd sensorkit
uv sync --all-extras
# Run the test suite. Backend tests are parametrized over the fake backend and a
# real NATS server in a container; the latter is skipped when Docker is absent.
uv run pytest core/tests
# Force every test onto a live NATS server instead of the fake backend
SK_TEST_BACKEND=nats uv run pytest core/tests
# Also run tests needing site-local hardware or services
ENV=local uv run pytest core/tests
# Lint and check import-layer contracts
uv run ruff check core modules
uv run lint-imports
To run the stack natively against the containerized simulators during development, see Trying it against simulators.
Status
SensorKit is in beta and under active development. It runs real telescopes nightly, but APIs and configuration formats are still evolving, and some corners are unfinished. Feedback and issues are very welcome.
Contributing
Contribution guidelines, PR process, and coding standards are still being documented. In the meantime, please open an issue before starting work on a significant change.
License
Licensed under the Apache License 2.0.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sensorkit-2.0.0b3.tar.gz.
File metadata
- Download URL: sensorkit-2.0.0b3.tar.gz
- Upload date:
- Size: 600.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b8ea4fb15a9c68d9264f87c75ad23dc36a1e1fe7a6ddc080438753ff5d20b675
|
|
| MD5 |
810226d6aa612278918ee32883cb7f26
|
|
| BLAKE2b-256 |
4340d58f4c1638213e2e953e74f921725ed80d07f2a9cb3fa79d159c285eafdf
|
Provenance
The following attestation bundles were made for sensorkit-2.0.0b3.tar.gz:
Publisher:
pypi.yml on sensorkit/sensorkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensorkit-2.0.0b3.tar.gz -
Subject digest:
b8ea4fb15a9c68d9264f87c75ad23dc36a1e1fe7a6ddc080438753ff5d20b675 - Sigstore transparency entry: 2553303209
- Sigstore integration time:
-
Permalink:
sensorkit/sensorkit@d9005b6422d7893f0bd6df17521fc79ebe69177a -
Branch / Tag:
refs/tags/v2.0.0b3 - Owner: https://github.com/sensorkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@d9005b6422d7893f0bd6df17521fc79ebe69177a -
Trigger Event:
release
-
Statement type:
File details
Details for the file sensorkit-2.0.0b3-py3-none-any.whl.
File metadata
- Download URL: sensorkit-2.0.0b3-py3-none-any.whl
- Upload date:
- Size: 504.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0532dde856d56c9f82c2b0c904bbb607e873efd299d6ad7cc4998e60bfe800c
|
|
| MD5 |
0a8f9d1a702ed899c66b1c032b1979e4
|
|
| BLAKE2b-256 |
a6401e2d2b5eb6a334b635f4dbf3f8e8bba993631feed0f9e4c55ecc4ce9af19
|
Provenance
The following attestation bundles were made for sensorkit-2.0.0b3-py3-none-any.whl:
Publisher:
pypi.yml on sensorkit/sensorkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensorkit-2.0.0b3-py3-none-any.whl -
Subject digest:
c0532dde856d56c9f82c2b0c904bbb607e873efd299d6ad7cc4998e60bfe800c - Sigstore transparency entry: 2553303280
- Sigstore integration time:
-
Permalink:
sensorkit/sensorkit@d9005b6422d7893f0bd6df17521fc79ebe69177a -
Branch / Tag:
refs/tags/v2.0.0b3 - Owner: https://github.com/sensorkit
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@d9005b6422d7893f0bd6df17521fc79ebe69177a -
Trigger Event:
release
-
Statement type: