{"id":33919057,"url":"https://github.com/funkite/solunatus","last_synced_at":"2026-04-18T13:04:03.402Z","repository":{"id":320627027,"uuid":"1071895867","full_name":"FunKite/solunatus","owner":"FunKite","description":"Solar and lunar dashboard and library in Rust","archived":false,"fork":false,"pushed_at":"2026-04-16T23:16:47.000Z","size":13415,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-17T00:37:52.856Z","etag":null,"topics":["astronomy","educational","ephemeris","moon","moonrise","ollama","rust","science","sun","sunrise","sunset"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/FunKite.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"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":"2025-10-08T01:08:31.000Z","updated_at":"2026-04-16T23:16:50.000Z","dependencies_parsed_at":"2025-10-25T13:22:12.187Z","dependency_job_id":"2d7de46d-4efb-44fb-95d9-22f168ee340d","html_url":"https://github.com/FunKite/solunatus","commit_stats":null,"previous_names":["funkite/astrotimes","funkite/solunatus"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/FunKite/solunatus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FunKite%2Fsolunatus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FunKite%2Fsolunatus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FunKite%2Fsolunatus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FunKite%2Fsolunatus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/FunKite","download_url":"https://codeload.github.com/FunKite/solunatus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/FunKite%2Fsolunatus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31969773,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"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":["astronomy","educational","ephemeris","moon","moonrise","ollama","rust","science","sun","sunrise","sunset"],"created_at":"2025-12-12T08:39:54.410Z","updated_at":"2026-04-18T13:04:03.397Z","avatar_url":"https://github.com/FunKite.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Solunatus\n\n[![Crates.io](https://img.shields.io/crates/v/solunatus.svg)](https://crates.io/crates/solunatus)\n[![Downloads](https://img.shields.io/crates/d/solunatus.svg)](https://crates.io/crates/solunatus)\n[![Documentation](https://docs.rs/solunatus/badge.svg)](https://docs.rs/solunatus)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nHigh-precision astronomical calculations for sun and moon events, available as both:\n- A Rust library (`solunatus`)\n- A CLI app (`solunatus`)\n\nSolunatus runs offline for core calculations and supports historical/future dates (from astronomical year `-0999` through `3000`).\n\n## What You Get\n\n- Sunrise, sunset, and solar noon\n- Civil, nautical, and astronomical twilight\n- Moonrise, moonset, and transit\n- Moon phase, illumination, altitude/azimuth, distance\n- Built-in city database (570+ cities)\n- Interactive terminal UI (watch mode)\n- JSON output and calendar export (HTML/JSON)\n- Optional USNO validation reports\n- Optional AI insights via local Ollama\n\n## Install\n\nSolunatus targets the latest stable Rust release for active development. The current release line supports stable Rust versions compatible with `rust-version = \"1.91\"`, and that floor may rise in a minor release when security, dependency compatibility, or maintainability require it. If you need an older Rust toolchain, use an older Solunatus release that still supports it.\n\nTo upgrade an existing installation from crates.io:\n\n```bash\ncargo install solunatus --force\n```\n\n### From crates.io\n\n```bash\ncargo install solunatus\n```\n\n### From source\n\n```bash\ngit clone https://github.com/FunKite/solunatus.git\ncd solunatus\ncargo install --path .\n```\n\n## Quick Start\n\n```bash\n# Use a city from the built-in database\nsolunatus --city \"New York\"\n\n# Or specify coordinates + timezone\nsolunatus --lat 40.7128 --lon -74.0060 --tz America/New_York\n```\n\nBy default, Solunatus starts in interactive watch mode.  \nPress `q` to quit, `s` for settings, and `r` for reports.\n\n## Common CLI Usage\n\n### Single snapshot (non-interactive)\n\n```bash\nsolunatus --city \"Tokyo\" --no-prompt\n```\n\n### JSON output\n\n```bash\nsolunatus --city \"Tokyo\" --json\n```\n\n### Specific date\n\n```bash\nsolunatus --city \"Lisbon\" --date 2026-01-15\n```\n\n### Calendar export\n\n```bash\nsolunatus --city \"Lisbon\" \\\n  --calendar \\\n  --calendar-start 2026-01-01 \\\n  --calendar-end 2026-01-31 \\\n  --calendar-format html \\\n  --calendar-output lisbon-jan-2026.html\n```\n\n### USNO validation report (feature-enabled builds)\n\n```bash\nsolunatus --city \"San Diego\" --validate\n```\n\n### AI insights with Ollama (feature-enabled builds)\n\n```bash\nsolunatus --city \"Seattle\" --ai-insights\n```\n\n## Command Highlights\n\nCore flags:\n- `--city \u003cCITY\u003e`\n- `--lat \u003cLAT\u003e --lon \u003cLON\u003e --tz \u003cTIMEZONE\u003e`\n- `--date \u003cYYYY-MM-DD\u003e`\n- `--json`\n- `--calendar --calendar-start \u003cDATE\u003e --calendar-end \u003cDATE\u003e`\n- `--calendar-format \u003chtml|json\u003e`\n- `--calendar-output \u003cPATH\u003e`\n- `--watch`\n- `--no-prompt`\n- `--no-save`\n- `--strict`\n\nOptional flags (feature gated):\n- `--validate` (`usno-validation`)\n- `--ai-insights`, `--ai-server`, `--ai-model`, `--ai-refresh-minutes` (`ai-insights`)\n\nFor full CLI docs, see [`docs/features/cli-reference.md`](docs/features/cli-reference.md).\n\n## Optional Features\n\nDefault features:\n- `cpu-portable`\n- `usno-validation`\n- `ai-insights`\n\nNon-default feature:\n- `parallel` (Rayon-based parallel processing)\n\nExamples:\n\n```bash\n# Minimal build (no USNO validation, no AI insights)\ncargo install solunatus --no-default-features\n\n# USNO validation only\ncargo install solunatus --no-default-features --features usno-validation\n\n# AI insights only\ncargo install solunatus --no-default-features --features ai-insights\n\n# Add parallel processing\ncargo install solunatus --features parallel\n```\n\n## Library Usage\n\nAdd dependency:\n\n```toml\n[dependencies]\nsolunatus = \"0.4.0\"\nchrono = \"0.4\"\nchrono-tz = \"0.10\"\n```\n\nBasic example:\n\n```rust\nuse chrono::Local;\nuse chrono_tz::America::New_York;\nuse solunatus::prelude::*;\n\nfn main() {\n    let location = Location::new(40.7128, -74.0060).unwrap();\n    let now = Local::now().with_timezone(\u0026New_York);\n\n    if let Some(sunrise) = calculate_sunrise(\u0026location, \u0026now) {\n        println!(\"Sunrise: {}\", sunrise.format(\"%H:%M:%S\"));\n    }\n\n    if let Some(sunset) = calculate_sunset(\u0026location, \u0026now) {\n        println!(\"Sunset: {}\", sunset.format(\"%H:%M:%S\"));\n    }\n\n    let (phase_name, phase_emoji) = get_current_moon_phase(\u0026location, \u0026now);\n    println!(\"Moon phase: {} {}\", phase_emoji, phase_name);\n}\n```\n\nMore examples: [`examples/`](examples/)\n\n## Accuracy and Scope\n\nSolunatus uses NOAA-based solar methods and Meeus-based lunar methods, with validation tooling aligned to USNO-style conventions.\n\nThis project is intended for educational, planning, and general-purpose astronomical use.  \nIt is not certified for safety-critical navigation or legal timing decisions.\n\n## Configuration\n\nCLI settings are saved to:\n\n```text\n~/.solunatus.json\n```\n\nUse `--no-save` to avoid writing configuration.\n\n## Releases\n\nCrates.io is the supported distribution channel for published releases:\n\n```bash\ncargo install solunatus\n```\n\nGitHub Releases are used for tags and release notes for each published version. They should not be treated as a guaranteed source of fresh binary artifacts unless a specific release explicitly says otherwise.\n\n## Development\n\n```bash\n# Build\ncargo build\n\n# Test\ncargo test\n\n# Safer local test runner\n./scripts/safe_local_test.sh\n```\n\nProject docs index: [`docs/README.md`](docs/README.md)\n\n## Contributing\n\nIssue reports and feature requests are welcome:\n- [GitHub Issues](https://github.com/FunKite/solunatus/issues)\n- [Contributing Guide](CONTRIBUTING.md)\n- [Code of Conduct](CODE_OF_CONDUCT.md)\n- [Security Policy](SECURITY.md)\n\n## License\n\nMIT ([`LICENSE`](LICENSE))\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunkite%2Fsolunatus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunkite%2Fsolunatus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunkite%2Fsolunatus/lists"}