AstroMate

Docs · v1

Everything to getfirst light tonight.

Install AstroMate, point it at your AsiAir or StellaVita, organize sessions, and stack with Siril. No login required.

Installation

Choose the installation method that fits your setup.

Raspberry Pi

Requirements

  • Raspberry Pi 4 or 5 (4GB+ RAM recommended)
  • Raspberry Pi OS 64-bit (Bookworm)
  • Same network as your AsiAir

Step 1: Download and install

Run this single command on your Raspberry Pi. It downloads AstroMate, installs all dependencies, and sets it up as a system service.

curl -sSL https://releases.astro-mate.net/astromate/setup-pi.sh | sudo bash

Step 2: Open AstroMate

Once installed, open a browser and navigate to your Raspberry Pi's IP address. AstroMate runs on port 80 by default. You'll see the license activation screen on first launch.

Step 3: Activate your license

Enter the license key you received by email after subscribing. AstroMate will automatically discover your AsiAir and start monitoring for new photos.

Updating

AstroMate checks for updates automatically. When a new version is available, you'll see a notification in the app. Click Update and AstroMate will download and install the latest version, then restart automatically.

Docker

macOS users: Docker Desktop on macOS has networking limitations that can prevent some features — including Remote Access — from working correctly. We recommend OrbStack instead: same docker CLI, drop-in replacement, and everything works out of the box.

Requirements

  • Docker installed on your machine
  • Same network as your AsiAir
  • Available on amd64 and arm64 architectures

Option A: Docker Run

The simplest way to get started:

docker run -d \
  --name astromate \
  -p 80:80 \
  --cap-add=NET_ADMIN \
  --device=/dev/net/tun:/dev/net/tun \
  -v astromate-data:/data \
  --restart unless-stopped \
  astromate/astromate:latest

--cap-add=NET_ADMIN and the /dev/net/tun device mount are required for the bundled Tailscale remote-access feature so it can bring up its tailscale0interface and advertise LAN routes. You can drop both flags if you are certain you won't enable Tailscale.

Option B: Docker Compose

Create a docker-compose.yml:

volumes:
  astromate-data:

services:
  astromate:
    image: astromate/astromate:latest
    ports:
      - "80:80"
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun:/dev/net/tun
    volumes:
      - astromate-data:/data
    restart: unless-stopped
    environment:
      ASPNETCORE_ENVIRONMENT: Production

Then run:

docker compose up -d

cap_add: NET_ADMIN and the /dev/net/tundevice are required for the bundled Tailscale client. Remove both if you don't plan to use the Tailscale remote-access feature.

Optional: separate volume for the database

By default the SQLite database lives inside the container and is preserved as long as you don't docker rm the container. If you want to put the database on a dedicated volume — for backups, moving between hosts, or pinning it to a fast disk — mount one at /db:

docker run -d \
  --name astromate \
  -p 80:80 \
  --cap-add=NET_ADMIN \
  --device=/dev/net/tun:/dev/net/tun \
  -v astromate-data:/data \
  -v astromate-db:/db \
  --restart unless-stopped \
  astromate/astromate:latest

Mount the directory, not the .db file alone — SQLite runs in WAL mode and writes -wal/-shm sidecar files next to the database that need to live alongside it.

Updating

Pull the latest image and recreate the container:

docker pull astromate/astromate:latest
docker compose up -d

Your data is stored in the astromate-data volume and is preserved across updates.

OrbStack — recommended on macOS

Requirements

  • macOS 13+ on Apple Silicon or Intel
  • OrbStack installed (free for personal use)
  • Same network as your AsiAir

Step 1: Install OrbStack

Download and install OrbStack from orbstack.dev. It replaces Docker Desktop's daemon while keeping the standard dockerCLI, so the rest of these instructions are identical to a regular Docker install — just on a daemon that can actually route AstroMate's remote-access traffic onto your LAN.

If Docker Desktop is already running, quit it before launching OrbStack so the two don't fight over the docker command.

Step 2: Run AstroMate

docker run -d \
  --name astromate \
  -p 80:80 \
  --cap-add=NET_ADMIN \
  --device=/dev/net/tun:/dev/net/tun \
  -v astromate-data:/data \
  -v astromate-db:/db \
  --restart unless-stopped \
  astromate/astromate:latest

Same flags as the Docker install. The /db volume is included so your license and Tailscale settings persist across image upgrades.

Step 3: Open AstroMate

Open a browser and go to http://localhost. You'll see the license activation screen on first launch.

Updating

Pull the latest image and recreate the container — your data in the named volumes survives the recreate:

docker pull astromate/astromate:latest
docker stop astromate && docker rm astromate
# then re-run the docker run command from Step 2

Kubernetes

Requirements

  • A Kubernetes cluster with kubectl access
  • A default StorageClass (or edit the manifest to set one)
  • At least one node on the same network as your AsiAir

Step 1: Apply the manifest

One command deploys the namespace, persistent volumes, deployment, and service:

kubectl apply -f https://releases.astro-mate.net/astromate/astromate.yaml

The above URL always points at the latest release. To pin to a specific version, use the per-release URL instead:

kubectl apply -f https://releases.astro-mate.net/astromate/versions/astromate-v1.8.1.yaml

Step 2: Reach the UI

The manifest creates a ClusterIP Service. Port-forward from your workstation to try it out:

kubectl -n astromate port-forward svc/astromate 8080:80

Then open http://localhost:8080. For permanent access, uncomment the Ingress block at the bottom of the manifest and set a host name (the manifest has a worked example).

Auto-discovering your AsiAir / StellaVita

Pods on the default bridge network can't see L2 broadcasts on your LAN, so AsiAir / StellaVita auto-discovery (mDNS, ARP probes) won't work out-of-the-box. To enable it, edit the manifest and uncomment the hostNetwork: trueblock on the pod spec — the pod then uses the node's network stack directly. The trade-off is that port 80 on the node has to be free. If you can't free port 80, add the telescope manually by IP from the Telescopes page; the SMB scan and Live telemetry both work fine over routed traffic.

Pod capabilities

The shipped manifest grants the container NET_ADMIN so the bundled Tailscale client can create its tailscale0 interface and write the iptables rules needed to advertise LAN routes — without it tailscale up fails with 503 no backend. If your cluster enforces a PodSecurityPolicy / Pod Security Admission profile that bans this capability you'll need to grant an exception, or strip the securityContext block from the manifest if you don't intend to use Tailscale.

Updating

The default image tag is :latest. Pull the newest image and bounce the deployment:

kubectl -n astromate rollout restart deployment/astromate

The Deployment uses the Recreate strategy because SQLite runs in single-writer WAL mode — two pods cannot share the database at once. The PVCs preserve your data across restarts and image upgrades.

Connecting a Telescope

AstroMate connects to AsiAir devices over your local network via SMB.

Auto-discovery

AstroMate automatically scans your network for AsiAir devices using mDNS. When a device is found, it appears on the Telescopes page with its hostname, IP address, and online status. No manual configuration is needed in most cases.

Adding a telescope manually

If auto-discovery doesn't find your device (e.g., different subnet), you can add it manually:

  1. 01Go to the Telescopes page and click Add Telescope
  2. 02Enter a display name, the AsiAir's IP address, and the SMB share name (default: EMMC Images)
  3. 03Click the folder icon to browse available SMB shares and verify the connection

Telescope settings

Each telescope card shows its online status, IP address, MAC address, and last seen time. You can edit the display name, folder alias (used for organizing downloaded files), and SMB share name directly on the card. The folder alias determines the directory structure where your photos are saved locally.

Important: Do not mount the AsiAir share in your OS file manager (e.g., Finder on macOS) while AstroMate is running. AstroMate uses a direct SMB connection and an OS-level mount may cause conflicts.

Remote Access

Reach your AstroMate dashboard — and the AsiAir / StellaVita controller it’s monitoring — from anywhere, over a private VPN.

Prerequisite: Add the telescope you want to reach remotely first. See Connecting a Telescope above. Remote Access advertises a route per telescope, so AstroMate needs to know about the device before it can tunnel to it.

How it works

AstroMate joins your VPN tailnet as a subnet router and publishes a small route for each of your telescopes (typically the AsiAir or StellaVita IP on your home network). Once your phone or laptop is on the same VPN, the AsiAir / StellaVita app reaches the controller as if you were sitting next to it. Your data stays inside your VPN — AstroMate doesn't proxy traffic through any third-party service.

Choose a provider

AstroMate supports two VPN providers. Pick whichever you already use; if you're starting fresh, Tailscale has the simplest setup.

  • Tailscale — hosted, free for personal use up to 100 devices. Sign up at tailscale.com and pick this if you don't already run a VPN.
  • NetBird — open-source, can be self-hosted or used via netbird.io. Pick this if you already run NetBird or prefer a self-hosted control plane.

Step 1: Set up Tailscale

Skip to Step 2 if you're using NetBird.

  1. 01Sign up at tailscale.com and finish onboarding so you have a tailnet.
  2. 02In the Tailscale admin console, go to Settings → OAuth clients and create a new client with the all scope. Copy the client secret (starts with tskey-client-) — Tailscale only shows it once.
  3. 03In AstroMate, open Remote Access in the sidebar. Pick Tailscaleas the provider and paste the OAuth client secret. AstroMate reads your tailnet's ACL, declares the tag:astromatetag if it's not already there, and mints its own pre-tagged auth key — you don't have to.
  4. 04Wait a few seconds. The status pill switches to Connected and each of your telescopes appears with a green dot and its tailnet-routable IP.

Step 1 (alternative): Set up NetBird

  1. 01Sign up at netbird.io or use your self-hosted NetBird management URL.
  2. 02In the NetBird dashboard, create a setup key (for the AstroMate peer to register with) and a personal access token (so AstroMate can manage routes for you).
  3. 03In AstroMate, open Remote Access, pick NetBird as the provider, and paste the management URL, setup key, and API token.

Step 2: Choose a connection level

Once the provider is connected, pick one of two modes:

  • Lightweight— only the telescope's IP is reachable through the VPN. You'll need to enter that IP manually in the AsiAir / StellaVita app on your phone (it shows on the Remote Access page next to each telescope). Recommended if you only run AstroMate's remote access occasionally.
  • Deep — in addition to per-telescope routes, AstroMate proxies LAN broadcast / mDNS discovery so the AsiAir or StellaVita app auto-discovers your controller through the VPN, exactly as it would on the home Wi-Fi. Pick this for the best experience; the trade-off is that the AstroMate node briefly forwards more discovery traffic.

Step 3: Connect from your phone or laptop

  1. 01Install the Tailscale or NetBird client on your phone (App Store / Play Store) and sign in with the same account you used in Step 1.
  2. 02Turn the VPN on. The phone now sees your AstroMate as a peer and can reach any of the routes it advertises.
  3. 03Open the AsiAir / StellaVita app. In Deep mode it auto-discovers; in Lightweight mode, enter the controller's IP from AstroMate's Remote Access page.
One AstroMate per VPN: Don't run two AstroMate instances against the same tailnet — they race each other for the same routes and traffic silently black-holes. AstroMate refuses to start a second registration while another is online and prunes old offline records on its own; if you're moving AstroMate from one machine to another, just stop the old one first.

Sessions & Images

AstroMate automatically organizes your captures into sessions and photo buckets.

How sessions work

When AstroMate detects new FITS files on your AsiAir, it automatically groups them into sessions based on the target object and a configurable time window. Photos captured within the same window for the same object are grouped together. Calibration frames (darks, flats, biases) are grouped into separate calibration sessions.

The sessions page

The sessions list shows all your observation sessions with their status (Shooting or Completed), the target object name, telescope used, photo count, and download progress. Active sessions show a Finish button to mark them as complete when your imaging run is done.

Photo buckets

Inside each session, photos are organized into buckets — groups of frames with the same type (Light, Dark, Flat, Bias), filter, exposure time, and sensor temperature. Each bucket shows:

  • Photo type, filter name, and exposure duration
  • Sensor temperature (auto-detected from filenames)
  • Download progress bar and individual photo status
  • Actions: download as ZIP, delete local files, queue pending downloads

Auto-download

Photos captured within the configured auto-download window (default: 14 days) are queued for download automatically. Older photos can be queued manually from the session or bucket view. Downloads happen sequentially to avoid overwhelming the AsiAir or Raspberry Pi.

Calibration Bookmarks

Assign dark, flat, and bias frames to your light sessions for streamlined stacking.

What are calibration bookmarks?

Calibration bookmarks let you pre-assign which dark, flat, and bias frames should be used with your light frames. When you create a stack later, these assignments are automatically applied — saving you from manually pairing calibration frames every time.

Setting bookmarks

Bookmarks are set from the session detail page:

  • Bias bookmark is set at the session level — it applies to all buckets in the session
  • Dark bookmarks are set per exposure group — AstroMate matches darks by exposure time and sensor temperature (within the configured tolerance)
  • Flat bookmarks are set per light bucket — matched by filter

The calibration picker

When you click to assign a calibration frame, a picker opens showing all available calibration buckets filtered by the correct type. Buckets are sorted by relevance: darks are matched by exposure and temperature, flats are sorted by capture time proximity to your lights, and the picker highlights the recommended choice. Already-bookmarked frames appear at the top with a badge.

The calibration page

The dedicated Calibration page gives you an overview of all your calibration frames organized by type. Dark frames are grouped by exposure time and temperature, flat frames by filter, and bias frames together. Each group shows the frame count and download progress, and you can ingest, download, or delete frames in bulk.

Creating Stacks

Combine your light frames with calibration data and process them with Siril for a final stacked image.

Creating a new stack

The stack creation wizard guides you through selecting your frames:

  1. 01Choose an object — select the space object you imaged (e.g., M42, IC1805)
  2. 02Pick a telescope — select which telescope captured the frames
  3. 03Select a session — choose the imaging session
  4. 04Choose light buckets — select which light frame groups to include (by filter and exposure)
  5. 05Name your stack — auto-generated from the object name, or customize it

Configuring calibration

On the stack detail page, AstroMate automatically applies your calibration bookmarks. You can review and change the assigned darks, flats, and bias for each light entry. A warning banner alerts you if any calibration frames are missing. Light frames are grouped by exposure and temperature, making it easy to assign the correct darks for each group.

Processing settings

Before processing, you can configure:

  • Stacking method — Winsorized Sigma Clipping (recommended), Average, Median, Sum, or Linear Fit
  • Sigma values — Low and high rejection thresholds (for clipping methods)
  • Normalization — Additive+Scale (recommended), Linear, or None

Running a stack

Click Run Stack to start processing. AstroMate generates a Siril script, calibrates your frames (bias, dark, flat), registers (aligns) them, and stacks the result. You can watch the Siril log in real-time as it processes. When complete, download the resulting FITS file for further processing in your favorite editor (PixInsight, Siril GUI, etc.).

Re-running and resetting

If a stack fails or you want to try different settings, use the Reset button to clear the previous result, then Re-run Stack with adjusted parameters. The reset also cleans up the working directory on disk.

Need a hand?

We answer every ticket personally.

Stuck on installation or want to validate your stacking settings? Reach out.

Contact support

We use cookies to understand how you use our site and to improve your experience. This includes analytics (Google Analytics) and advertising measurement (Google Ads, Reddit, Meta).