rustormy 0.3.1

Minimal neofetch-like weather CLI
rustormy-0.3.1 is not a library.

rustormy

Minimal and neofetch-like weather CLI with multiple data providers support, ASCI-icons, ANSI colors, localization and various output modes.

Tests Crates.io Commit activity Lines of code

Screenshot


Current features

  • Fetch weather data from multiple providers: OpenMeteo (default, no API key required), OpenWeatherMap, amd World Weather Online
  • If first provider is not available (e.g. API limit exceeded), automatically fallback to the next one
  • Display current temperature, weather condition, wind speed and direction, humidity. precipitation, atmospheric pressure.
  • Display ASCII art icons for weather conditions
  • Supports ANSI colors in terminal output
  • Supports geocoding by city name or latitude/longitude input
  • Supports caching geocoding results to reduce API calls
  • Supports multiple languages (English, Russian, Spanish; more to come)
  • Supports imperial and metric units
  • Supports different text output modes (full, compact, one-line) and JSON output
  • Supports live mode (periodically fetch and display updated weather data)
  • Cross-platform (Linux, macOS, Windows)

Planned features

  • More weather-related information (e.g. sunrise/sunset times, moon phase, etc.)
  • Support for more weather APIs and data providers
  • More customization options (e.g. colors, layout, etc.)
  • More languages
  • Improved test coverage
  • Homebrew, nix, rpm, deb packages
  • Docker image (just for fun)

Installation

You can install rustormy using cargo:

cargo install rustormy

Or download a precompiled binary from the releases page.

Configuration

rustormy uses XDG Base Directory Specification for configuration files and will create a configuration file at ~/.config/rustormy/config.toml to set default options at first run.

On macOS, the configuration file will be located at $HOME/Library/Application Support/rustormy/config.toml.

On Windows, the configuration file will be located at %APPDATA%\Roaming\rustormy\config.toml.

Configuration options

# Default city name (if not provided via CLI)
city = "New York"
# Default latitude (if not provided via CLI)
lat = 40.7128
# Default longitude (if not provided via CLI)
lon = -74.0060
# Weather data provider (`open_meteo`, `open_weather_map`, or `world_weather_online`)
provider = "open_meteo"
# API key for OpenWeatherMap (required if provider is `open_weather_map`)
api_key_owm = ""
# API key for World Weather Online (required if provider is `world_weather_online`)
api_key_wwo = ""
# Default units for temperature and wind speed (`metric` or `imperial`)
units = "metric"
# Default output format (`text` or `json`)
output_format = "text"
# Language for weather description (e.g. "en" for English, "ru" for Russian, "es" for Spanish, etc.)
language = "en"
# Show city name in output
show_city_name = true
# Use ANSI colors in terminal output
use_colors = true
# Use exact degrees for wind direction instead of arrows
wind_in_degrees = true
# Text output mode (`full`, `compact`, or `one_line`)
text_mode = "full"
# Live mode (periodically fetch and display updated weather data)
live_mode = false
# Live mode interval in seconds
live_mode_interval = 300
# Align labels in text output to the right
align_right = true
# Use cache for geocoding results
use_geocoding_cache = true
# Verbosity level (0 = fatal, 1 = error, 2 = warn, 3 = info, 4 = debug, 5 = trace)
# Currently used only to display (if verbosity >= 1) an error if request to weather provider fails
verbosity = 0

Usage

rustormy [OPTIONS]

Options:
  -C, --city <CITY>
          City name (required if lat/lon not provided)
  -y, --lat <LAT>
          Latitude (required if city not provided)
  -x, --lon <LON>
          Longitude (required if city not provided)
  -p, --provider <PROVIDER>
          Weather data provider (OpenMeteo, OpenWeatherMap, WorldWeatherOnline) [possible values: om, owm, wwo]
  -u, --units <UNITS>
          Units for temperature and wind speed [possible values: metric, imperial]
  -o, --format <OUTPUT_FORMAT>
          Output format [possible values: text, json]
  -g, --lang <LANGUAGE>
          Language for weather output [possible values: en, ru, es]
      --name
          Show city name in output
      --colors
          Use colors in output
      --degrees
          Use degrees for wind direction in output
      --compact
          Compact mode for text output (short for `--text-mode compact`)
      --one-line
          One-line mode for text output (short for `--text-mode one_line`)
  -m, --text-mode <TEXT_MODE>
          Text output mode [possible values: full, compact, one_line]
      --align-right
          Align labels to the right in text output
  -l, --live
          Live mode - continuously update weather data every 5 minutes (or specified interval)
  -i, --interval <LIVE_MODE_INTERVAL>
          Live mode update interval in seconds (default: 300)
      --no-cache
          Disable caching of geocoding results
      --clear-cache
          Clear cached geocoding results and exit
  -v, --verbose...
          Increase verbosity level (can be used multiple times)
  -h, --help
          Print help
  -V, --version
          Print version

Examples

Basic usage: rustormy -C London Colors: rustormy -C Milan --colors Imperial units: rustormy -C "New York" --colors -u imperial Spanish translation: rustormy -C Valparaiso -g es --name --colors Compact and one-line modes JSON output: rustormy -C Ajax -o json

License

This project is licensed under the MIT License. See the LICENSE file for details.

Contributing

Contributions are welcome! Please open an issue or submit a pull request on GitHub.

This project uses just for basic scripting. You can install it from cargo:

cargo install just

Use the following commands to run tests and lint the code before committing:

just check     # Run tests and clippy
just before-commit  # Run commands before committing (lint and check)

To run the application in development mode with specific options, use:

cargo run -- -C London --colors

Acknowledgements

This project heavily inpired by stormy. Actually, it started as a clone of stormy, just in Rust. Then I added more features, but kept the name similar to honor the original project.

Also, wttr.in was a big inspiration for this project.