Skip to main content

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


Download files

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

Source Distribution

sensorkit-2.0.0b1.tar.gz (593.3 kB view details)

Uploaded Source

Built Distribution

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

sensorkit-2.0.0b1-py3-none-any.whl (423.4 kB view details)

Uploaded Python 3

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

Hashes for sensorkit-2.0.0b1.tar.gz
Algorithm Hash digest
SHA256 43f9e6cfd6a625bb1c8ca07aec0159e51146f3d26c51196fcd1d5ce67679d9bc
MD5 774964d91ee1b83c6090974fd6c8e1f3
BLAKE2b-256 9bc6cbdd4b0e642a552de3dc1e12d3f6b9c2af70e2f6314d48083a27257308e3

See more details on using hashes here.

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

Hashes for sensorkit-2.0.0b1-py3-none-any.whl
Algorithm Hash digest
SHA256 57e6b3ddb4fc15dbfcb807d82c11683e8d7caa431434050dfac37fc361c1c14d
MD5 f48cb358c87b65e4982689ab553d0b86
BLAKE2b-256 79d86b9f9c8a76316fac92b04f0e012527a159fe170749d1a321fd07ed2f7744

See more details on using hashes here.

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