Autonomous observatory control for space domain awareness and time-domain astronomy: hardware drivers, satellite tracking, scheduling, and safety automation, distributed over NATS.
Project description
SensorKit
An open-source control system for autonomous observatories, built for space domain awareness and time-domain astronomy. SensorKit connects your telescope hardware to an automation layer that decides — continuously and safely — when to open the dome, what to observe, and when to shut down, whether that's for a passing satellite, a transient follow-up, or an ordinary night of survey work.
You describe your site in a single YAML file: which mount, camera, and dome you have, what weather limits you trust, and which observing programs are allowed to request time. SensorKit runs the night.
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. Drivers for ASCOM Alpaca, PlaneWave PWI4, and Software Bisque TheSky are included, with additional modules for INDIGO, NINA, and the Observable Space Node Platform.
- 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.
Batteries included: Otto (standalone satellite observation scheduling) and UDL (Unified Data Library tasking) observing programs, plus analysis modules for astrometry and photometry (SENPAI) and all-sky transmission. 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
See Installation for the full list of extras and how to go from an empty config to running services.
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
uv run pytest core/tests
# Run tests against a live NATS server (requires Docker)
SK_TEST_BACKEND=nats 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.
Project details
Release history Release notifications | RSS feed
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.0b1.tar.gz.
File metadata
- Download URL: sensorkit-2.0.0b1.tar.gz
- Upload date:
- Size: 593.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43f9e6cfd6a625bb1c8ca07aec0159e51146f3d26c51196fcd1d5ce67679d9bc
|
|
| MD5 |
774964d91ee1b83c6090974fd6c8e1f3
|
|
| BLAKE2b-256 |
9bc6cbdd4b0e642a552de3dc1e12d3f6b9c2af70e2f6314d48083a27257308e3
|
File details
Details for the file sensorkit-2.0.0b1-py3-none-any.whl.
File metadata
- Download URL: sensorkit-2.0.0b1-py3-none-any.whl
- Upload date:
- Size: 423.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57e6b3ddb4fc15dbfcb807d82c11683e8d7caa431434050dfac37fc361c1c14d
|
|
| MD5 |
f48cb358c87b65e4982689ab553d0b86
|
|
| BLAKE2b-256 |
79d86b9f9c8a76316fac92b04f0e012527a159fe170749d1a321fd07ed2f7744
|