agentleFS
zedxterzedxter/utility-belt/skills/weather/SKILL.md

weather

Skill4 starsChanged 14 days agoMITView on GitHub

Gets weather and air quality for any place without an API key from Open-Meteo - current conditions, an hourly and daily forecast up to 16 days (temperature, feels-like, rain and its chance, wind and gusts, UV, sunrise and sunset), past weather for any day since 1940, and air quality now and ahead (European and US AQI, PM2.5, PM10, ozone, NO2, pollen) - for a city, address, landmark or coordinates, with the resolved place shown. Use when the user asks about the weather, temperature, rain, snow or wind, a forecast for a place or date, what the weather was on a past date or in a past month, whether to take an umbrella or how to dress, or whether the air is clean or safe to run or go outside, AQI, PM2.5, smog or pollen today ("какая погода в", "будет ли дождь", "какой сейчас воздух"). Not for severe-weather warnings, climate facts or classifications (wiki-lookup), climate projections, marine or aviation forecasts.

  • Reads credentials

75 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use taskflow-inbox-triage, node-connect and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • AtomicBot-aiSkill

    taskflow-inbox-triage

    Also in 6 projects that use this

  • hkyutongSkill

    node-connect

    Diagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps. Use when QR/setup code/manual connect fails, local Wi-Fi works but VPS/tailnet does not, or errors mention pairing required, unauthorized, bootstrap token invalid or expired, gateway.bind, gateway.remote.url, Tailscale, or plugins.entries.device-pair.config.publicUrl.

    Also in 18 projects that use this

  • molt-botSkill

    discord-e2e

    Test Discord with Convex-leased QA bots: check credentials without a Gateway, exercise owned messages, or prove OpenClaw replies, files, threads, reactions, streaming, and typing. Distinguish API and Gateway evidence from manual user interactions.

    Also in 10 projects that use this

  • molt-botSkill

    openclaw-repair-sweep

    Run scoped OpenClaw issue/PR repair campaigns: coordinate workers, prove root causes, and land or close verified work under the requested authority.

    Also in 10 projects that use this

  • clawdbotSkill

    openclaw-performance

    Performance work in OpenClaw: a slow or heavy flow (latency, CPU, memory, SQL, RPC, renders), writing or reviewing a perf PR, or adding a cache. Count the work, delete waste first, cache last.

    Also in 7 projects that use this

  • clawdbotSkill

    plugin-sdk-impact

    Count Plugin SDK consumers across live ClawHub releases and bundled OpenClaw plugins before deprecation, removal, or behavior changes; supports public release-date filters.

    Also in 7 projects that use this

  • +2 more from molt-bot

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 1 is distinctive, and 2 are very specific to this project.

  • 0

    Common

    Most of the 44 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Every answer starts with the place it resolved to: name, region, country, coordinates, elevation and time zone.

    line 27
  2. Very specific:

    All times are the place's local time.

    line 154
  3. Very specific:

    Use the place the user means: If the note: lists alternatives, or the header names a different country than the conversation suggests, run …

    line 160

“Common” is measured: kept by at least 6 in 10 of the 44 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Weather

Weather from Open-Meteo, which serves national weather models and the ERA5 reanalysis through one key-less API. The script resolves the place, asks the right endpoint in the place's local time zone, and prints a compact table or JSON.

  • Forecast: now, then up to 16 days, and hour by hour on request.
  • History: any day since 1 January 1940, with a summary: mean highs and lows, total precipitation, wet days, hottest and coldest day. Long ranges also get monthly rows.
  • Air quality: European and US AQI with their levels, PM2.5, PM10, ozone, NO2, SO2 and UV, plus pollen in Europe. The daily worst AQI is shown for the coming days.

Every answer starts with the place it resolved to: name, region, country, coordinates, elevation and time zone. When a name is ambiguous, check that line before you answer.

When to use

  • "What's the weather in X", "do I need a jacket", "weekend forecast" → the default command.
  • "Will it rain this afternoon / tomorrow" → --hours 24 / --hours 48.
  • "What was the weather on 12 June 2019", "how hot was last July" → history. For "is this November unusually warm", compare with a 30-year baseline (history PLACE --from 1991-11-01 --to 2020-11-30; its monthly rows give the normal range).
  • "Is the air bad today", "can I run outside", "smog", "pollen" → air.

Not for:

  • severe-weather warnings or alerts (those come from national weather services);
  • climate facts and classifications (Köppen, climate zones) → wiki-lookup;
  • climate projections;
  • marine, surf or aviation (METAR/TAF) forecasts.

Quick start

The script is scripts/weather.py relative to this skill. It uses only the standard library.

uv run scripts/weather.py Berlin                                   # now + 7 days
uv run scripts/weather.py "Paris, Texas" --days 3 --hourly --hours 12
uv run scripts/weather.py 40.71,-74.01 --units imperial
uv run scripts/weather.py "Eiffel Tower" --days 1                  # landmarks go through OpenStreetMap
uv run scripts/weather.py history Moscow --from 2024-07-01 --to 2024-07-31
uv run scripts/weather.py air Delhi

Output of the first command (shortened):

# Berlin, State of Berlin, Germany · 52.53°N 13.42°E · 46 m · Europe/Berlin (GMT+1)
now (20:00): 8.6°C, feels 6.8°C · Light drizzle · wind 8 km/h WNW (gusts 18) · humidity 95% · 1032 hPa

date       weather     min/max °C  feels  precip mm (chance)  wind/gusts km/h  UV   sun
Fri 10-30  Light rain  7 / 9       5 / 8  0.0 (0%)            10/22 WNW        2.1  06:58–16:40
Sat 10-31  Light rain  6 / 11      4 / 9  0.0 (3%)            11/27 NNW        2.1  07:00–16:38

model: best_match (Open-Meteo's regional blend of national models) · Weather data by Open-Meteo.com (CC BY 4.0) · free tier for non-commercial use

Places

  • Name: "Berlin". The most prominent match is taken. When another place of that name is comparable in size, a note: lists the others.
  • Name with region or country: "Paris, Texas", "Springfield, Illinois", "Valencia, Venezuela". Only matches whose region or country fits are kept. --country US does the same with a code.
  • Addresses, landmarks, districts that the place index lacks fall back to OpenStreetMap Nominatim, and the output credits it.
  • Region and country codes: US state codes (Salem, IN is Indiana), Canadian province codes (Victoria, BC), and country codes (Paris, FR, London, UK).
  • Coordinates: 52.52,13.41 or -33.87,151.21, latitude first, in decimal degrees. Decimal commas also work: 52,52 13,41.
  • --lang de gives place names in another language. Weather descriptions stay in English.

The output shows the model's grid point. It can be a few kilometres from the place, and its elevation can differ in the mountains.

Options

Command / flagDefaultMeaning
PLACE (or forecast PLACE)—Current conditions and a daily forecast. Use forecast explicitly if the place is called "history" or "air".
--days N7Forecast days, 1–16. For air: 1–7, default 3.
--hourly, --hours Noff, 24Add an hourly table for the next N hours (1–384), starting at the current hour, with temperature, feels-like, precipitation, its chance and wind. --hours alone implies --hourly. For history, --hourly covers ranges up to 7 days.
--model NAMEbest_matchbest_match lets Open-Meteo pick the best model for the place. Others: ecmwf_ifs025, icon_seamless (DWD), gfs_seamless (NOAA), meteofrance_seamless, ukmo_seamless, jma_seamless, gem_seamless. Some models do not provide every field, so columns such as rain chance or UV can show –.
history PLACE --from D [--to D]--to = --fromDaily rows for up to 62 days, monthly rows beyond. Ranges run from 1940-01-01 to today.
air PLACE—Air quality now and the daily maximum AQI ahead.
--unitsmetricimperial gives °F, mph and inches (two decimals). Not for air, whose units are the same everywhere.
--country CC, --lang—, enRestrict the place search; name language.
-ftablemarkdown (tables for a chat or document) or json.
-o FILE, --timeout S, -q—, 30, offWrite to FILE; network timeout; hide note: lines.

JSON output

Shapes, values shortened:

// forecast
{"kind": "forecast",
 "place": {"name": "Berlin", "admin1": "State of Berlin", "country": "Germany", "country_code": "DE",
           "latitude": 52.52, "longitude": 13.41, "grid_latitude": 52.53, "grid_longitude": 13.42,
           "elevation": 46.0, "timezone": "Europe/Berlin", "timezone_abbreviation": "GMT+1",
           "source": "Open-Meteo geocoding (GeoNames)", "alternatives": ["Berlin, New Hampshire, United States"]},
 "units": {"temperature_2m": "°C", "wind_speed_10m": "km/h", "precipitation": "mm", ...},
 "model": "best_match",
 "current": {"time": "2026-10-30T20:00", "temperature_2m": 8.6, "apparent_temperature": 6.8, "weather_code": 51,
             "weather": "Light drizzle", "wind_speed_10m": 8.0, "wind_from": "WNW", "wind_gusts_10m": 18.0,
             "relative_humidity_2m": 95, "precipitation": 0.1, "cloud_cover": 100, "pressure_msl": 1032.0, "is_day": 0, ...},
 "daily": [{"date": "2026-10-30", "weather": "Light rain", "temperature_2m_min": 7.0, "temperature_2m_max": 9.0,
            "precipitation_sum": 0.0, "precipitation_probability_max": 0, "wind_speed_10m_max": 10.0, "wind_from": "WNW",
            "apparent_temperature_min": 4.0, "apparent_temperature_max": 7.0, "wind_gusts_10m_max": 30.0,
            "uv_index_max": 2.1, "sunrise": "2026-10-30T06:58", "sunset": "2026-10-30T16:40",
            "daylight_duration": 35000.0, ...}],
 "hourly": [{"time": "2026-10-30T21:00", "temperature_2m": 8.4, "precipitation_probability": 10, "weather": "...", ...}],
 "attribution": "Weather data by Open-Meteo.com (CC BY 4.0)"}
// history
{"kind": "history", "place", "units", "from": "2024-07-01", "to": "2024-07-31",
 "summary": {"days": 31, "days_with_data": 31, "mean_temperature", "mean_max", "mean_min",
             "hottest": {"date", "temperature_2m_max"}, "coldest": {"date", "temperature_2m_min"},
             "precipitation_total", "wet_days"},
 "daily": [{"date", "weather", "temperature_2m_min", "temperature_2m_max", "temperature_2m_mean",
            "precipitation_sum", "snowfall_sum", "wind_speed_10m_max", "sunshine_hours"}],
 "hourly": [{"time", "temperature_2m", "apparent_temperature", "precipitation", "weather", ...}],   // with --hourly
 "monthly": [{"month": "2024-07", "mean_max", "mean_min", "precipitation_total", "wet_days"}],   // ranges over 62 days
 "note": "the last days are preliminary ...",                                                  // ranges ending in the last 5 days
 "dataset", "attribution"}
// air
{"kind": "air", "place", "units",
 "current": {"time", "european_aqi": 56, "european_aqi_level": "moderate", "us_aqi": 62, "us_aqi_level": "moderate",
             "pm2_5", "pm10", "ozone", "nitrogen_dioxide", "sulphur_dioxide", "carbon_monoxide", "uv_index"},
 "pollen": {"birch": 3.0, "grass": 12.0} | null,
 "daily": [{"date", "european_aqi_max", "european_aqi_level", "us_aqi_max", "us_aqi_level", "pm2_5_max"}],
 "model", "attribution"}

All times are the place's local time. Units follow --units and are listed in units. A wet day has at least 1 mm (0.04 inch). In the table, the sun column says "polar night" or "polar day" when the sun does not rise or set.

Workflow for the agent

  1. Use the place the user means. If the note: lists alternatives, or the header names a different country than the conversation suggests, run again with "Name, Region" or --country. Mention the resolved place in your answer ("Paris, Texas").
  2. Answer the question, not the table.
    • "Umbrella?": the precipitation chance and amount for the hours that matter. Use --hours 48 when the question is about tomorrow.
    • "What to wear?": the feels-like temperatures (the daily "feels" column), the gusts and the rain.
    • Give numbers with units, in the user's convention: --units imperial for US users.
  3. Forecasts are model output. Beyond about 7 days they are rough trends. Say so when giving days 8–16. best_match blends national models by region; for a second opinion, use --model ecmwf_ifs025 or --model gfs_seamless.
  4. History is reanalysis, not a station record. ERA5 is a 25 km grid (ERA5-Land 0.1°, about 11 km). It smooths extremes and local effects such as cities, coasts and valleys. For official records, point to the national weather service. The last 5 days are preliminary.
  5. Air quality is a CAMS model forecast, not a sensor reading. Pollen is only available in Europe, in season.
  6. Credit Open-Meteo ("weather data by Open-Meteo.com") when you publish the numbers. The free tier is for non-commercial use; a commercial product needs an Open-Meteo API key (OPEN_METEO_API_KEY).
  7. On exit 4, stop. The free-tier limits are in the compatibility line above. Don't loop over many places or dates: one history call covers a whole range.

Exit codes

One error: line on stderr with a hint after —.

ExitMeaningWhat to do
0Done.—
1The place was not found.Check the spelling, add the region or country, or give lat,lon.
2Bad input: an empty place, numbers that are not a lat,lon pair, coordinates out of range, --days/--hours out of range, a bad date or a date outside 1940..today, --hourly history over 7 days, a bad --lang/--country/--model, or a parameter Open-Meteo rejects (its reason is shown).Fix the argument.
4Rate-limited by Open-Meteo (HTTP 429), or Nominatim refused an address lookup.Wait; do not loop. For addresses, give lat,lon.
6Network error, or Open-Meteo down (5xx).Retry later.
7An unexpected answer, a rejected OPEN_METEO_API_KEY, or a bug.Read the message.
130Interrupted.—

Limitations

  • No warnings or alerts. Severe-weather warnings come from national services (DWD, Météo-France, NWS…), not from these models.
  • The model grid is coarse. Point forecasts in mountains, on coasts and in cities can be off by several degrees.
  • History before 1950 is less certain. ERA5 assimilates fewer observations for that period.
  • Pollen covers Europe only. Air-quality resolution is about 45 km globally and 11 km in Europe.
  • Weather descriptions are English. They come from the WMO weather code; --lang changes only place names.
  • Licences. Open-Meteo data is CC BY 4.0; OpenStreetMap place results are ODbL. The output credits both.

Chaining

  • weather history + pdf-typeset → a one-page climate summary for a trip or report.
  • wiki-lookup entity CITY --props P625 gives coordinates for a place whose name is ambiguous.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.