High-precision astronomical calculations for sun and moon events, available as both:
- A Rust library (
solunatus) - A CLI app (
solunatus)
Solunatus runs offline for core calculations and supports historical/future dates (from astronomical year -0999 through 3000).
- Sunrise, sunset, and solar noon
- Civil, nautical, and astronomical twilight
- Moonrise, moonset, and transit
- Moon phase, illumination, altitude/azimuth, distance
- Built-in city database (570+ cities)
- Interactive terminal UI (watch mode)
- JSON output and calendar export (HTML/JSON)
- Optional USNO validation reports
- Optional AI insights via local Ollama
cargo install solunatusgit clone https://github.com/FunKite/solunatus.git
cd solunatus
cargo install --path .# Use a city from the built-in database
solunatus --city "New York"
# Or specify coordinates + timezone
solunatus --lat 40.7128 --lon -74.0060 --tz America/New_YorkBy default, Solunatus starts in interactive watch mode.
Press q to quit, s for settings, and r for reports.
solunatus --city "Tokyo" --no-promptsolunatus --city "Tokyo" --jsonsolunatus --city "Lisbon" --date 2026-01-15solunatus --city "Lisbon" \
--calendar \
--calendar-start 2026-01-01 \
--calendar-end 2026-01-31 \
--calendar-format html \
--calendar-output lisbon-jan-2026.htmlsolunatus --city "San Diego" --validatesolunatus --city "Seattle" --ai-insightsCore flags:
--city <CITY>--lat <LAT> --lon <LON> --tz <TIMEZONE>--date <YYYY-MM-DD>--json--calendar --calendar-start <DATE> --calendar-end <DATE>--calendar-format <html|json>--calendar-output <PATH>--watch--no-prompt--no-save--strict
Optional flags (feature gated):
--validate(usno-validation)--ai-insights,--ai-server,--ai-model,--ai-refresh-minutes(ai-insights)
For full CLI docs, see docs/features/cli-reference.md.
Default features:
cpu-portableusno-validationai-insights
Non-default feature:
parallel(Rayon-based parallel processing)
Examples:
# Minimal build (no USNO validation, no AI insights)
cargo install solunatus --no-default-features
# USNO validation only
cargo install solunatus --no-default-features --features usno-validation
# AI insights only
cargo install solunatus --no-default-features --features ai-insights
# Add parallel processing
cargo install solunatus --features parallelAdd dependency:
[dependencies]
solunatus = "0.3.2"
chrono = "0.4"
chrono-tz = "0.10"Basic example:
use chrono::Local;
use chrono_tz::America::New_York;
use solunatus::prelude::*;
fn main() {
let location = Location::new(40.7128, -74.0060).unwrap();
let now = Local::now().with_timezone(&New_York);
if let Some(sunrise) = calculate_sunrise(&location, &now) {
println!("Sunrise: {}", sunrise.format("%H:%M:%S"));
}
if let Some(sunset) = calculate_sunset(&location, &now) {
println!("Sunset: {}", sunset.format("%H:%M:%S"));
}
let (phase_name, phase_emoji) = get_current_moon_phase(&location, &now);
println!("Moon phase: {} {}", phase_emoji, phase_name);
}More examples: examples/
Solunatus uses NOAA-based solar methods and Meeus-based lunar methods, with validation tooling aligned to USNO-style conventions.
This project is intended for educational, planning, and general-purpose astronomical use.
It is not certified for safety-critical navigation or legal timing decisions.
CLI settings are saved to:
~/.solunatus.json
Use --no-save to avoid writing configuration.
# Build
cargo build
# Test
cargo test
# Safer local test runner
./scripts/safe_local_test.shProject docs index: docs/README.md
Issue reports and feature requests are welcome:
MIT (LICENSE)