{"id":44501374,"url":"https://github.com/scdouglas1999/nightshade","last_synced_at":"2026-06-17T18:01:08.335Z","repository":{"id":336134298,"uuid":"1127038575","full_name":"Scdouglas1999/Nightshade","owner":"Scdouglas1999","description":"Cross-platform astrophotography suite: sequencing, plate solving, Plan Tonight, remote control","archived":false,"fork":false,"pushed_at":"2026-06-10T19:53:18.000Z","size":158704,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-10T21:13:36.028Z","etag":null,"topics":["alpaca","ascom","astrophotography","flutter","indi","rust","sequencer"],"latest_commit_sha":null,"homepage":"https://github.com/Scdouglas1999/Nightshade/blob/main/docs/index.md","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Scdouglas1999.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-03T03:45:30.000Z","updated_at":"2026-06-10T19:53:18.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Scdouglas1999/Nightshade","commit_stats":null,"previous_names":["scoduglas1999/nightshade","scdouglas1999/nightshade"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/Scdouglas1999/Nightshade","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scdouglas1999%2FNightshade","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scdouglas1999%2FNightshade/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scdouglas1999%2FNightshade/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scdouglas1999%2FNightshade/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Scdouglas1999","download_url":"https://codeload.github.com/Scdouglas1999/Nightshade/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Scdouglas1999%2FNightshade/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34459619,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alpaca","ascom","astrophotography","flutter","indi","rust","sequencer"],"created_at":"2026-02-13T07:18:00.532Z","updated_at":"2026-06-17T18:01:08.328Z","avatar_url":"https://github.com/Scdouglas1999.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/branding/logo-512.png\" width=\"120\" alt=\"Nightshade logo\"\u003e\n\n# Nightshade\n\n**Run an entire unattended deep-sky night from one app.**\n\n[![Latest release](https://img.shields.io/github/v/release/Scdouglas1999/Nightshade?label=release)](https://github.com/Scdouglas1999/Nightshade/releases/latest)\n[![Platforms](https://img.shields.io/badge/platforms-Windows%20%7C%20Linux%20%7C%20macOS%20%7C%20Android-blue)](#platforms)\n[![License](https://img.shields.io/badge/license-source--available-lightgrey)](LICENSE)\n\n[**Download**](https://github.com/Scdouglas1999/Nightshade/releases/latest) · [**Documentation**](docs/index.md) · [**Changelog**](CHANGELOG.md) · [**Release notes (3.1.0)**](docs/releases/3.1.0.md)\n\n\u003cimg src=\"assets/screenshots/desktop-dashboard.png?v=20260608\" width=\"860\" alt=\"Nightshade live dashboard with preview, equipment, guiding, and weather tiles\"\u003e\n\n\u003c/div\u003e\n\n---\n\nA clear-sky imaging night usually means a stack of programs: one to drive the camera, one to plan targets, a planetarium to frame, a sequencer to automate, a guider, and something to watch the weather. Each keeps its own profiles. Each fails in its own way. When a USB cable hiccups at 2 a.m., you find out in the morning.\n\nNightshade runs the whole night from a single program. Connect the rig, plan targets, frame and plate-solve, build the sequence, capture, guide, and watch the sky. Pick a target in the planner and it runs in the sequencer without re-typing coordinates. It targets the unattended night: it parks safely and recovers from disconnects on its own. The desktop app is the control surface. A LAN web dashboard and an Android companion supervise the same live session while you sleep.\n\n## What it does\n\n- Equipment, planetarium, planner, sequencer, imaging, guiding, weather, and analytics share one session model. Pick M42 in the planner and it runs in the sequencer with the same coordinates, rotation, and optics.\n- End-of-night and emergency stops park the mount, close the cover, and close the dome to reach a real safe state. The run gates on twilight and Sun altitude, so it won't image in daylight, and weather-unsafe or low-disk conditions pause and park instead of imaging through them.\n- A device that drops mid-sequence reconnects, re-acquires the guide star, and retries the interrupted instruction, so the night keeps going.\n- One scheduler engine scores targets by altitude, moon, and per-azimuth horizon. The planner is a read-only preview of what the autopilot will actually run.\n- ASTAP and astrometry.net solve every field, with RA unified to degrees across every solve path. Slew-and-center converges. Framing registers survey imagery to sky coordinates, mosaics included.\n- A customizable tile dashboard shows live frames, HFR/FWHM/eccentricity, equipment telemetry, guiding, and weather. The Android companion and the web dashboard drive the full unattended-night control set over the LAN.\n\n\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"assets/screenshots/sequencer.png?v=20260608\" width=\"420\" alt=\"Sequence builder with draggable instruction nodes on a canvas\"\u003e\n\u003cimg src=\"assets/screenshots/imaging.png?v=20260608\" width=\"420\" alt=\"Imaging workspace with capture controls, histogram, and frame stats\"\u003e\n\u003c/div\u003e\n\n## A night with Nightshade\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/screenshots/equipment.png?v=20260608\" alt=\"Equipment discovery\"\u003e\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/screenshots/planetarium.png?v=20260608\" alt=\"Sky map with FOV rings\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eDiscover and connect cameras, mounts, focusers, and wheels over ASCOM, Alpaca, INDI, or native SDKs. Save one profile that every screen shares.\u003c/td\u003e\n\u003ctd\u003ePan a GPU-rendered sky map with equipment FOV rings and a red night-vision mode to pick fields before committing time.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/plan-tonight.png?v=20260608\" alt=\"Plan Tonight target scoring\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/framing.png?v=20260608\" alt=\"Framing over a survey image\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRead the live autopilot's scored target list and altitude windows. Send any candidate straight to the sequencer.\u003c/td\u003e\n\u003ctd\u003eRegister a plate-solved survey overlay to real sky coordinates so rotation and offset match the plan.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/guiding.png?v=20260608\" alt=\"PHD2 guiding with RMS graph\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/weather.png?v=20260608\" alt=\"Weather radar overlay with cloud motion\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eRun PHD2 inside Nightshade with RMS trends and dither-settle waits, while sequencer triggers watch tracking quality.\u003c/td\u003e\n\u003ctd\u003eRead per-cell radar cloud-motion, with stated reasons when data is missing, feeding a single fail-closed safety verdict that can pause and park.\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/analytics.png?v=20260608\" alt=\"Session analytics\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"assets/screenshots/flat-wizard.png?v=20260608\" alt=\"Flat wizard with ADU target\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eSee frame-quality, HFR, and eccentricity trends plus per-target integration totals, computed from real metrics with rejected subs excluded.\u003c/td\u003e\n\u003ctd\u003eCapture ADU-targeted, filter-aware flats at the camera's real gain and offset when the sequence or meridian calls for it.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nThen step away. Supervise or drive the same live session from a LAN browser or the paired Android companion.\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/screenshots/settings-equipment-profiles.png?v=20260608\" alt=\"Equipment profile settings\"\u003e\u003c/td\u003e\n\u003ctd width=\"50%\"\u003e\u003cimg src=\"assets/screenshots/web-dashboard.png?v=20260608\" alt=\"Browser dashboard controlling camera, mount, focuser, and sequencer\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eKeep optics, camera defaults, filters, solver settings, and device assignments in one shared equipment profile.\u003c/td\u003e\n\u003ctd\u003eRun the same unattended-night control surface from a LAN browser, with camera, mount, focuser, filter wheel, sequencer, guiding, and planetarium panels.\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n## What's new in 3.1.0\n\n3.1.0 finishes the unattended night.\n\n- **Safe-state on abort and park** now closes the cover and dome and brings the rig to a genuine safe state, not only halting the mount.\n- **Disconnect, reconnect, resume.** A device dropping mid-sequence reconnects, re-acquires the guide star, and retries the interrupted instruction.\n- A single weather-verdict authority with a real abstain channel, so \"unknown\" never reads as \"safe.\" The Rust executor enforces the pause/park/close action as a second check.\n- **Per-azimuth horizon mask** honored by both the runnable gate and the AltitudeAbove/Below loop conditions, plus count-based filter completion.\n- **The planner is now a read-only preview** of the live autopilot, after three separate target-selectors were unified into one engine.\n- **Per-sub eccentricity** computed from real star-shape moments, used to fire the grade gate, and shown as a color-graded cockpit overlay.\n- **Live-stacking auto-feed.** Accepted frames build the live stack during sequencer runs and broadcast over the LAN.\n- **Real per-cell radar** (RainViewer, NOAA, GOES) drives cloud-motion prediction, replacing the uniform-field placeholder and reporting honest reasons when data is absent.\n- **Plate solving** unified RA to degrees across every solve path and made the local ASTAP fallback functional and fail-loud.\n- **Slew-and-center converges** after fixing the solved-RA degrees-to-hours conversion. PHD2 dither waits for a real settle and fails closed.\n- **Mobile remote parity** across the full unattended-night control set, with shortest-side device-class detection so foldables lay out correctly in landscape.\n- **No daylight imaging.** The live scheduler gates on twilight and Sun altitude and parks at dawn through a distinct end-of-night hook.\n\nFull detail: [docs/releases/3.1.0.md](docs/releases/3.1.0.md).\n\n## Hardware support\n\nNightshade talks to devices through four backends. Coverage depends on the backend and your OS.\n\n| Backend | Windows | Linux | macOS | Notes |\n|---|---|---|---|---|\n| ASCOM COM | Available | Unsupported | Unsupported | Needs Windows COM and locally installed ASCOM Platform/device drivers. Windows-only. |\n| ASCOM Alpaca | Available | Available | Available | Network REST API for ASCOM devices and bridges. Capability gaps are reported by the Alpaca server. |\n| INDI | Available | Available | Available | Needs a reachable INDI server. Feature depth depends on the driver and device properties. |\n| Native SDK | Capability-gated | Capability-gated | Capability-gated | Depends on packaged vendor libraries, OS driver support, and redistribution approval. Verified per release. |\n\n**Native camera SDKs:** ZWO ASI, QHY, Player One, SVBony, Atik, FLI, Moravian, and the Touptek family (Touptek, Altair, Mallincam, OGMA). DSLR capture (Canon/Nikon via gphoto2) exists in the codebase but is not a public-release guarantee.\n\n**Native mounts:** SkyWatcher/Synta, iOptron, and LX200 (serial).\n\nSee [docs/supported-hardware-by-platform.md](docs/supported-hardware-by-platform.md) for the full matrix and [docs/known-limitations.md](docs/known-limitations.md) for current gaps.\n\n## Platforms\n\nWindows is the primary, hardware-tested path. Linux is in early testing. macOS builds in CI but ships no signed artifact and has had no hardware soak.\n\n| Surface | Windows | Linux | macOS | Mobile |\n|---|---|---|---|---|\n| Desktop app | Tested (primary) | Early testing (compiles/runs on CI) | Builds in CI; no signed release artifact, no hardware soak | — |\n| Headless server + API | Tested | Early testing | Builds in CI; untested on hardware | — |\n| Web dashboard | Supported (browser on LAN) | Supported | Supported | Supported (browser) |\n| Mobile companion | — | — | — | iOS + Android (QR pairing; monitor + light control). Android ships as an APK; iOS builds from source. |\n\n## Install\n\nDownload the latest release: **[github.com/Scdouglas1999/Nightshade/releases/latest](https://github.com/Scdouglas1999/Nightshade/releases/latest)**\n\n| Platform | Asset |\n|---|---|\n| Windows installer | `Nightshade-3.1.0-Windows-Setup.exe` |\n| Linux x64 | `Nightshade-3.1.0-Linux-x64.tar.gz` |\n| Android companion | `Nightshade-3.1.0-Android.apk` |\n| macOS desktop | Not shipped for 3.1.0 (build from source) |\n| iOS companion | Build from source (requires signing) |\n\nThe Android and iOS apps pair to a running desktop or headless instance by QR code over your LAN. They supervise and lightly control the live session; the desktop app remains the full control surface.\n\n**System requirements**\n\n- **Windows:** Windows 10 or 11 (64-bit). 8 GB RAM minimum (16 GB recommended). DirectX 11 GPU with 2 GB VRAM. About 500 MB plus image storage. ASCOM Platform is optional but required for local COM drivers.\n- **Linux:** Ubuntu 22.04 LTS or equivalent. OpenGL 3.3 GPU. Runtime needs libgtk-3, libsecret-1, and a current glibc. INDI needs a reachable server; native USB/SDK paths may need vendor udev rules and dialout/plugdev/video group membership.\n\nNew to Nightshade? Start with the [installation guide](docs/getting-started/installation.md) and [first connection](docs/getting-started/first-connection.md). For headless and remote setups, see [headless / remote setup](docs/headless-secure-setup.md).\n\n## Documentation\n\n- [User documentation (index)](docs/index.md)\n- [Installation guide](docs/getting-started/installation.md)\n- [First connection](docs/getting-started/first-connection.md)\n- [Supported hardware by platform](docs/supported-hardware-by-platform.md)\n- [Known limitations](docs/known-limitations.md)\n- [Headless / remote setup](docs/headless-secure-setup.md)\n- [FFI troubleshooting](docs/FRB_TROUBLESHOOTING.md)\n- [Release notes 3.1.0](docs/releases/3.1.0.md)\n- [Changelog](CHANGELOG.md)\n\n## Build from source\n\nNightshade is a Flutter front end over a Rust core, bridged with flutter_rust_bridge. The Dart bindings and the native library have to stay in sync, so the dev scripts handle codegen and DLL staging for you. Running plain `flutter run` will load stale bindings.\n\n```bash\ndart pub global activate melos\nmelos bootstrap          # link workspace packages and fetch deps\nmelos run dev            # FRB codegen + Rust build + copy native libs + run desktop\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eFull command reference and toolchain requirements\u003c/b\u003e\u003c/summary\u003e\n\n### Dev cycle\n\n| Command | When |\n|---|---|\n| `melos run dev` | Full cycle on Windows: FRB codegen + Rust build + copy native DLLs + run desktop app (uses `scripts/dev.ps1`). |\n| `melos run dev:quick` | Rust/Dart implementation changed but the FFI API is unchanged (skips FRB regen; `scripts/dev.ps1 -SkipFrb`). |\n| `melos run dev:norun` | Rebuild native bridge + bindings without launching Flutter (`scripts/dev.ps1 -NoRun`). |\n| `melos run dev:clean` | Clean all build artifacts and rebuild from scratch (`scripts/dev.ps1 -Clean`). |\n| `melos run generate` | After model/API edits: regenerate freezed, drift, json_serializable, and FRB bindings (build_runner). |\n\n### Release builds\n\n| Command | When |\n|---|---|\n| `melos run build:desktop:windows` | Release Windows desktop (Rust release + `flutter build windows` + stage native DLLs). |\n| `melos run build:desktop:linux` | Release Linux desktop (Rust release + `flutter build linux`). |\n| `melos run build:desktop:macos` | Release macOS desktop (Rust release per-arch + `flutter build macos`). |\n| `melos run build:mobile:android` | Build the Android companion APK. |\n| `melos run build:mobile:ios` | Build the iOS companion (requires signing). |\n\n### Quality gates\n\n| Command | When |\n|---|---|\n| `melos run test` | Run Flutter tests across all packages. |\n| `melos run analyze` | Run `dart analyze` in all packages. |\n| `melos run format` | Format all packages (`dart format`). |\n\n### Toolchain\n\n- **Windows:** Visual Studio 2022 with \"Desktop development with C++\". LLVM/Clang on PATH for FRB/ffigen. Flutter 3.44.1 (all CI jobs — analyze/test/release on every OS — pin 3.44.1, matching the Dart 3.12 / analyzer 10 toolchain; use 3.44.1 locally so your `dart format` and `flutter analyze` match CI). Rust stable, 2021 edition. Melos via `dart pub global activate melos`.\n- **Linux:** `build-essential`, `clang`, `cmake`, `ninja-build`, `pkg-config`, `libgtk-3-dev`, `libsecret-1-dev`, `libjsoncpp-dev`. Flutter 3.44.1, Rust stable. Vendor udev rules for native USB cameras where applicable.\n- **macOS:** Xcode Command Line Tools. Code signing for device builds. Flutter 3.44.1, Rust stable.\n\nIf codegen or the FFI boundary misbehaves, start with [docs/FRB_TROUBLESHOOTING.md](docs/FRB_TROUBLESHOOTING.md).\n\n\u003c/details\u003e\n\n## Contributing\n\nBug reports, hardware coverage notes, and pull requests are welcome. Real hardware is hard to simulate, so test reports from actual rigs are especially useful: name the camera, the mount, the backend (ASCOM/Alpaca/INDI/native), the OS, and the sequence step where things went sideways. Start with [CONTRIBUTING.md](CONTRIBUTING.md) and the [docs index](docs/index.md). For security issues, see [SECURITY.md](SECURITY.md) to report privately.\n\n## License\n\nNightshade is **source-available**, not open source. The source is published so you can read it, build it, and audit what runs on your observatory, but it is distributed under its own license terms rather than an OSI-approved open-source license. Read [LICENSE](LICENSE) before redistributing or building on it.\n\n## Acknowledgments\n\nBuilt on Flutter and Rust. Plate solving uses [ASTAP](https://www.hnsky.org/astap.htm) and [astrometry.net](https://astrometry.net/). Guiding integrates [PHD2](https://openphdguiding.org/). Device connectivity stands on the [ASCOM](https://ascom-standards.org/) and [INDI](https://indilib.org/) ecosystems and their driver authors, plus the camera and mount vendors whose SDKs make native support possible. Radar cloud-motion data comes from RainViewer, NOAA, and GOES. Thanks to everyone who runs Nightshade against real hardware under a real sky and reports back.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscdouglas1999%2Fnightshade","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fscdouglas1999%2Fnightshade","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fscdouglas1999%2Fnightshade/lists"}