Skip to main content

Remotely control a telescope while it polls for tasks, collects and edge processes data, and delivers results and data for further processing.

Project description

CitraSense

Pytest Publish Python Package PyPI version PyPI - Downloads License

Documentation | Citra.space | PyPI | CitraSense-Pi

Photograph satellites from your backyard telescope.

CitraSense turns your astrophotography rig into an autonomous satellite observation station. It connects to Citra.space, picks up tasks for specific satellites, slews your telescope, captures images, and processes everything on the edge — plate solving, source extraction, photometry, and satellite matching — before delivering calibrated results back to the platform.

CitraSense Web UI

Use Citra.space to search for satellites, schedule observation windows, and task your telescope — CitraSense handles the rest. If you already have a mount, a camera, and software like N.I.N.A. or KStars/Ekos, CitraSense plugs right in. Install it, select your hardware adapter, and you're one click away from photographing the ISS.

Supported Hardware

Adapter Platform Connects to
Direct Any Composable device adapters (USB cameras, Ximea, Raspberry Pi Camera)
NINA Windows N.I.N.A. via Advanced HTTP API
KStars Linux, macOS KStars/Ekos via D-Bus
INDI Linux Any INDI-compatible device

Quick Start

Requires Python 3.10+. We recommend uv for installation.

# Install and run
uv tool install citrasense
citrasense

Or with pip:

pip install citrasense
citrasense

Open http://localhost:24872 in your browser to configure your hardware adapter, connect to Citra.space, and start accepting tasks.

Raspberry Pi? Check out citrasense-pi for a ready-to-flash SD card image with CitraSense pre-installed.

Optional Extras

uv tool install citrasense --with citrasense[indi]        # INDI protocol support
uv tool install citrasense --with citrasense[kstars]      # KStars/Ekos via D-Bus
uv tool install citrasense --with citrasense[usb-camera]  # USB cameras via OpenCV
uv tool install citrasense --with citrasense[rpi]         # Raspberry Pi Camera Module
uv tool install citrasense --with citrasense[all]         # INDI + KStars
pip equivalents
pip install citrasense[indi]
pip install citrasense[kstars]
pip install citrasense[usb-camera]
pip install citrasense[rpi]
pip install citrasense[all]

CLI Options

citrasense --help
citrasense --web-port 8080    # Custom web UI port (default: 24872)

Documentation

Full documentation is available at docs.citra.space/citrasense. Documentation source is maintained in the citra-space/docs repository.

Developer Setup

uv sync --extra dev
uv run pre-commit install

Dev Container (INDI on macOS/Windows)

If you need to work with the INDI adapter on a non-Linux host, the project includes a VS Code Dev Container that provides a Linux environment with pyindi-client and its system dependencies pre-installed. Open the project in VS Code and choose Reopen in Container.

Running Tests

uv run pytest                          # Unit tests (fast, skips slow tests)
uv run pytest -m "not integration"     # Same as above, explicit
uv run pytest --override-ini="addopts=" -m "not integration"  # Include slow tests locally

Tests use pytest markers to separate fast unit tests from expensive ones:

Marker What it covers Runs locally Runs in CI
(none) Unit tests Yes Yes
@pytest.mark.slow Real FITS processing, plate solving No Yes
@pytest.mark.integration Live hardware or services No Opt-in

Pre-commit Hooks

The project uses pre-commit with Ruff (linting + import sorting), Black (formatting), and Pyright (type checking).

uv run pre-commit run --all-files    # Run all checks manually

VS Code Launch Configs

The .vscode/launch.json includes pre-configured debug configurations:

  • Python: citrasense — Runs the daemon with default settings
  • Python: citrasense (custom port) — Runs with web interface on port 8080

Releasing

bump-my-version bump patch    # 0.1.3 → 0.1.4
bump-my-version bump minor    # 0.1.3 → 0.2.0
bump-my-version bump major    # 0.1.3 → 1.0.0
git push && git push --tags

Tagging triggers create-release.yml which creates a GitHub release, which in turn triggers pypi-publish.yml.

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

citrasense-1.0.1.tar.gz (33.1 MB view details)

Uploaded Source

Built Distribution

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

citrasense-1.0.1-py3-none-any.whl (580.2 kB view details)

Uploaded Python 3

File details

Details for the file citrasense-1.0.1.tar.gz.

File metadata

  • Download URL: citrasense-1.0.1.tar.gz
  • Upload date:
  • Size: 33.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for citrasense-1.0.1.tar.gz
Algorithm Hash digest
SHA256 f4c41aae730609e2976ee97832208c45f92b0c65708c92a939ce44dc874460e1
MD5 4db7a39d9bd1468201e9bd5ad02c8a1c
BLAKE2b-256 55117c518ab2e957fedb7a2ec9c792898baaf1164cb770b3f0e3e89da3091198

See more details on using hashes here.

File details

Details for the file citrasense-1.0.1-py3-none-any.whl.

File metadata

  • Download URL: citrasense-1.0.1-py3-none-any.whl
  • Upload date:
  • Size: 580.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for citrasense-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6715fb994ed57ea314c1a192cef6da453f26a5b0230cd1697ba545bd366f94f1
MD5 ff30c72f93889d160b6a68206cb3ec5e
BLAKE2b-256 e83aae680dee898535dbfb2b786128b4aed6c4dff0c2f6fd804f31d398dcb3f8

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