Full remote control of an AstroArch astronomical observatory from your Android smartphone. Mobile-friendly clone of KStars/Ekos with all the essential features for an astrophotography session.
Author: Zarletti-Osservatorio Jupiter Targets: AstroArch (Arch Linux ARM) on Raspberry Pi 5 + Android smartphone
Astroarch Interface consists of two parts (now in two dedicated repos since v0.2.29 — this monorepo is preserved for combined history):
| 📱 Android app (astroarch-interface-app) | A Flutter app with 14 dedicated screens, one per Ekos module cloned for mobile use. Communicates with the bridge over Tailscale. |
| 🖥️ Bridge backend (astroarch-bridge) | A Python daemon (FastAPI + WebSocket) installed on the Raspberry Pi 5. Connects to INDI server, PHD2 and Ekos via DBus, exposing REST + two WebSocket streams. Zero changes to the existing Ekos setup. |
The app does NOT replace Ekos: it works alongside it. Ekos keeps running on the AstroArch desktop, the app reads its state via DBus and INDI and sends commands that Ekos executes as usual. When Ekos captures an image, the app receives it in real time via INDI BLOB intercept (parallel client, non-invasive).
- 🚀 v0.2.30 — Launch KStars/Ekos & PHD2 from the Dashboard: two big buttons that spawn the GUI apps on the RPi's monitor, with live "running" indicator
- 🌐 v0.2.29 — Multi-bridge support: save more than one Pi, switch between them with a single tap on the Dashboard
- 💾 v0.2.28 — Capture folder + format read from KStars userdb: the bridge no longer overwrites the user's Ekos save folder
- 🎛️ v0.2.26 — Ekos-native autofocus: live params, frame
preview, real V-curve from
Ekos.Focus.newHFRsignal, log tail - 📈 v0.2.25 — PHD2-style guide chart: signed Y-axis arcsec, per-frame RA/DEC raw deflection, same chart you see on the desktop
- 🎯 v0.2.24 — App-owned active target: pushed to Ekos before every solve so KStars "Center & Slew" no longer leaves Ekos with a stale target
- 📷 v0.2.22 — Stop button always reachable while a Capture sequence is alive (even one started from KStars or another session)
- 🌍 v0.2.16 — IT / EN language selector in Settings, persistent
- 🟢 v0.2.17 — Master Start/Stop Ekos toggle on the Dashboard
- 📱 v0.2.18 — Pairing QR with Tailscale IP auto-generated by the bridge, in Settings
- Master Start/Stop Ekos toggle (green/red/yellow with live status)
- AVVIO PROGRAMMI card: launch KStars/Ekos and PHD2 on the Pi's desktop with one tap each, with live "running" indicators
- Active bridge selector: name shown in the AppBar, tap to switch between saved Pi bridges (multi-RPi support)
- Live connection status (INDI · PHD2 · WebSocket state · WebSocket frames)
- Active target coordinates (RA/Dec) with mount status
- Last frame preview auto-stretched, with HFR and star count
- 4 live cards: Mount tracking · Camera temp/cooler · Guide RMS · Focuser pos
- Observatory telemetry: weather, dome, weather-safe flag
- Live RA/Dec coordinates streamed via WebSocket
- Built-in SIMBAD search (type "M 31" → automatic RA/Dec via astropy)
- One-tap GoTo + Track / Slew / Sync
- Manual N/S/E/W slew joypad with rate selection (Guide / Centering / Find / Max)
- Park / Unpark / Sync / Emergency Stop
- Tracking mode chips: Sidereal / Lunar / Solar / Off
- Pier side, accuracy, settle time
Plate Solve — exact clone of the Ekos Align module:
- Live FITS preview (pinch-zoom) stretched identically to Ekos (ZScale + asinh MTF algorithm)
- Configurable Exposure, Gain, Binning — applied to the camera before the solve
- Solver action: GoTo / Sync / Slew to target / Nothing
- Solver mode: StellarSolver / Remote (INDI)
- Live telescope coordinates + solution (RA · DEC · Err · PA · Pixel scale · FOV · Focal length · F-ratio)
- History of recent solves with color-coded dRA/dDEC errors (green<50″, yellow<150″, red beyond)
- Target plot Ekos-style with concentric 50/100/150″ rings
- Expandable Ekos Align log
Polar Align — drift-based 3-step routine:
- Capture + plate-solve at 3 different RA positions
- AZ/ALT error computation from Dec drift
- Suggested screw adjustments
- Persistent multi-job sequencer — full Ekos model
- Each job has: filter, count, exposure, gain, offset, binning, frame type, transfer format (FITS/NATIVE/XISF), capture format (RAW/RGB), delay, dither flag, target name
- Drag-and-drop reorderable job list, edit/duplicate/remove
- Save/Load JSON presets locally (e.g. "M31 LRGB night 1")
- 3 execution modes:
- ⭐ FULL OBSERVATION — 10-stage pre-flight pipeline (resolve target → slew → tracking → plate solve → sync → autofocus → guide calibrate → guide start → capture)
- VIA EKOS — jobs are loaded into the Ekos Capture queue via DBus + start
- DIRECT — straight INDI driver commands (Ekos bypassed)
- Live RMS Total · SNR · RMS RA · RMS DEC
- RA/DEC tracking error chart (last 120 samples)
- Buttons: Start / Stop / Dither / Find Star / Calibrate / Clear cal / Pause
- PHD2 equipment info (version, pixel scale, calibrated, settling)
- Manual movement ±10/100/1000 steps
- Absolute position numeric field
- Iterative autofocus on the bridge: N steps × ±step_size, exposure, HFR computation, find minimum, move to best
- Live V-curve plot with colored points and vertical line on the best position
- ON/OFF toggle with visual state (green when ON, neutral when OFF)
- Editable target temperature, live sensor reading
- Cooler power % bar
- Stuck-driver detection (e.g. ToupTek toupbase) with RECONNECT DRIVER button to recover
- Weather card with all parameters (temp, humidity, wind, sky)
- Dome shutter open/close (handles both standard DOME_SHUTTER and DOME_PARK scripting/roll-off)
- Dust cap park/unpark
- Flat panel toggle + 0-255 intensity slider
- Candidate drivers with inline CONNECT/DISCONNECT buttons
- Sky-state card with twilight phase (day/civil/nautical/astronomical/night)
- Live sun/moon altitude (lat/lon auto-detected from the mount via INDI)
- Persistent multi-target job list
- + NEW JOB form with automatic SIMBAD resolution
- Live condition checks (twilight required, target altitude, weather safe)
- Reads Ekos profiles from
~/.local/share/kstars/userdb.sqlite - Active INDI driver list with Connect/Disconnect toggle
Exact clone of the KStars/Ekos INDI Control Panel:
- List of all connected devices
- Tap a device → all its properties grouped by Group
- Switch / Number / Text editable in real time
- Light read-only with colored state
- Live two-way propagation (you change here → Ekos sees it; you change in Ekos → you see it here)
- FITS browser for
~/Pictures/Ekos/ - Recent files list with auto-stretched thumbnails
- Tap → fullscreen preview with pinch-zoom
- Multi-select via long-press
- Batch delete with confirmation (frees space on the RPi without occupying your phone)
- RPi storage card: colored GB used/total bar, FITS count
- Session counters: WS events, total properties, devices
- Last frame info (object, filter, exposure, HFR, stars, size)
- Historical PHD2 RMS chart (RA/DEC)
- INDI message stream
- Every API call the app makes to the backend, with millisecond timestamp, color-coded status code, duration, body
- Tap for details + copy → very fast debugging
Android app Tailscale (WireGuard) Raspberry Pi 5 (AstroArch)
┌─────────────────┐ ┌──────────────────────────────┐
│ │ ─────HTTPS / WSS───────────────────► │ astroarch-bridge :8765 │
│ Astroarch │ │ ├─ REST /api/* │
│ Interface │ ◄────── live snapshots ──────────── │ ├─ WS /ws/state │
│ (Flutter) │ │ └─ WS /ws/frames │
│ │ │ │
│ 14 screens │ │ ┌─ INDI client TCP :7624 │
│ Provider │ │ │ + enableBLOB (parallel │
│ WebSocket │ │ │ to Ekos, no impact) │
│ │ │ ├─ PHD2 client TCP :4400 │
│ │ │ ├─ Ekos via DBus │
└─────────────────┘ │ └─ FITS watcher │
│ │
│ KStars/Ekos (untouched) │
│ PHD2 (untouched) │
│ ~/Pictures/Ekos/ │
└──────────────────────────────┘
Key design choice: the bridge is a secondary INDI client that does not modify Ekos's setup. It receives the camera BLOBs via enableBLOB Also in parallel with Ekos, processes them in memory, and forwards them to the app — zero files written to disk, zero interference with Ekos's workflow.
If you're running AstroArch on your Raspberry Pi 5 (the
devDucks/astroarch ArchLinux
ARM distro), everything you need on the Pi side is already
installed: KStars 3.8.x with Ekos and DBus, INDI server, PHD2,
Python 3.11+, qdbus6, dbus-monitor, systemd user services.
Setup time: ~10 minutes.
ssh astronaut@RPI_IP
git clone https://github.com/Johannes1979I/astroarch-interface
cd astroarch-interface/backend
sudo bash deploy/install.sh --user astronautThe script:
- copies the bridge to
/home/astronaut/astroarch-bridge/ - generates a random token saved in
~/.config/astroarch-bridge/token - creates and enables the systemd user service
astroarch-bridge.service(auto-starts at boot) - prints the Tailscale URL, the LAN URL, and the token to enter in the app
If Tailscale isn't installed yet:
sudo pacman -S tailscale
sudo systemctl enable --now tailscaled
sudo tailscale upThen on your phone: install Tailscale from the Play Store and sign in with the same account (or join a shared tailnet). Verify the Pi shows up in the Tailscale phone app.
Download the latest APK from GitHub Releases and install it on the phone (Android 8.0+).
Open the app → SCAN QR FROM DASHBOARD and frame the QR code shown by the desktop dashboard widget that the install script enables. Alternatively, Enter manually and fill:
- Host: your Pi's Tailscale IP (e.g.
100.x.y.z, shown bytailscale ip -4on the Pi) - Port:
8765 - Token: the string printed by
install.sh
Tap Connetti / Connect and you're in.
The app reads your existing Ekos settings — it does NOT overwrite them. In particular:
- ✅ FITS save folder (Capture → Cartella) — read from KStars
userdb.sqliteand preserved in every job - ✅ Placeholder format (Capture → Formato) — same source
- ✅ Optical train + camera/focuser/filter wheel mapping
- ✅ Target coordinates when you select an object via SIMBAD or KStars
- ✅ PHD2 server at
127.0.0.1:4400 - ✅ INDI server at
127.0.0.1:7624
So if Ekos already works on your desktop with your hardware, the app works too — without any extra configuration.
| Symptom | Fix |
|---|---|
| App shows "Bridge unreachable" | Check Tailscale on the phone is ON (key icon green). ping 100.x.y.z from tailscale debug netcheck on the Pi. |
Invalid token |
Re-scan the QR or copy the token from ~/.config/astroarch-bridge/token on the Pi. |
| Ekos shows empty Cartella/Formato | You're on bridge ≤ v0.2.27. Update with git pull && sudo systemctl restart astroarch-bridge.service (the fix landed in v0.2.28). |
qdbus6: command not found |
sudo pacman -S qt6-tools |
| Bridge log | journalctl --user -u astroarch-bridge -f |
Se hai AstroArch sul tuo Raspberry Pi 5, tutto quello che serve sul Pi è già installato (KStars 3.8, Ekos, DBus, INDI, PHD2, Python, qdbus6, dbus-monitor). Tempo di setup: ~10 minuti.
1) SSH sul Pi e installa il bridge:
ssh astronaut@RPI_IP
git clone https://github.com/Johannes1979I/astroarch-interface
cd astroarch-interface/backend
sudo bash deploy/install.sh --user astronautLo script genera un token randomico, crea il servizio systemd e stampa URL Tailscale + URL LAN + token.
2) Installa Tailscale sul Pi (sudo pacman -S tailscale && sudo tailscale up) e sul telefono dal Play Store, con lo stesso
account.
3) Scarica l'APK da GitHub Releases e installala sul telefono (Android 8.0+).
4) Apri l'app → SCANSIONA QR DALLA DASHBOARD sul desktop, o inserisci manualmente host/porta/token. Pronto.
L'app legge automaticamente le tue impostazioni Ekos (cartella salvataggio, formato file, profilo, camera/focuser/filtri) — non sovrascrive niente. Se Ekos funziona sul tuo desktop, l'app funziona sul tuo telefono.
- 📄 User manual PDF — complete printable guide (13 pages)
- 🔧 DEPLOY.md — step-by-step installation
- 🎨 mockups.html — UI preview (open in a browser)
| Backend | Python 3.11+, FastAPI, uvicorn, WebSocket, asyncio |
| astropy (FITS, SIMBAD, AltAz), Pillow, numpy, watchdog | |
| Custom incremental INDI XML protocol parser | |
| PHD2 JSON-RPC, Ekos DBus (qdbus6) | |
| App | Flutter 3.32 / Dart 3.5 |
| provider, http, web_socket_channel, fl_chart, mobile_scanner | |
| Deploy | systemd user service, install.sh, optional PKGBUILD |
| Connectivity | Tailscale (WireGuard) — no router port forwarding required |
- iOS not supported (Android only, by design)
- Plate solving requires
solve-field(astrometry.net) installed on the RPi - Polar align is a simplified drift-based routine (3 steps); not a replacement for tools like SharpCap Polar Align
- Mosaic planner
- Push notifications (frame done, sequence finished, weather alert)
- Possible upstream contribution to the devDucks/astroarch project
MIT — feel free to use, modify, distribute. Please keep the attribution to Zarletti-Osservatorio Jupiter.
- AstroArch — ArchLinux ARM distribution for astrophotography github.com/devDucks/astroarch
- KStars / Ekos — the de-facto open source astrophotography suite edu.kde.org/kstars
- PHD2 — autoguider openphdguiding.org
- astrometry.net — offline plate solving astrometry.net
🌙 Clear skies! — Zarletti-Osservatorio Jupiter