Skip to content
Data Directory

Query these datasets with Claude

Install a skill and Claude can query this data directly with DuckDB — the catalogs, the schemas and the query patterns, with nothing between it and the files.

For your AI agentRecommended

npx skills add your-org/data-directory

Installs the query-datasets skill — the catalog URLs, the schemas and the query patterns — into Claude Code, Codex or any agent that reads skills.

For your machine

curl -fsSL https://data.bunnytech.app/skill.sh | sh

Checks for the DuckDB CLI, writes a ./datadirectory/ folder with an attach script and per-dataset notes, then connects to all 2 published catalogs and prints the schema it finds. It never installs anything without asking.

Both end up in the same place. Read the script before you run it — it is generated from the published manifests, so it cannot describe data that is not there.

← Datasets

Daily city weather forecasts

A daily snapshot of the Open-Meteo weather forecast for a fixed panel of eight major world cities: temperature, precipitation, wind, UV and sunrise/sunset for every day of the forecast horizon, recorded as of the day it was published. Because each run keeps what was forecast on that day, the series can be used to study how forecasts change as the target day approaches.

weatherforecastclimatecitiesopen-meteodaily

All three stay inside Daily city weather forecasts: the assistant is given this dataset’s schema and nothing else, and the playground attaches only these tables. Ask across every dataset from the home page instead.

Cadence
daily
Rows
64
Size
7.5 KB
Tables
2
Snapshot
2026-08-22
Last ingest
1 day ago
Manifest written
1 day ago
Version
01M0NH25E3QSH5TCFXMRTAR9X0

Source: https://open-meteo.com/en/docs
Machine-readable: manifest.json · catalog

Query it yourself

Generated from this exact manifest version, so the URLs are the ones actually published.

Fastest — Parquet exports (immutable, sorted)
INSTALL httpfs; LOAD httpfs;

CREATE OR REPLACE VIEW daily_weather AS
  SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/daily_weather.parquet');

CREATE OR REPLACE VIEW cities AS
  SELECT * FROM read_parquet('https://data-directory.fsn1.your-objectstorage.com/public/open-meteo-daily/v/01M0NH25E3QSH5TCFXMRTAR9X0/cities.parquet');

SELECT * FROM daily_weather LIMIT 10;
Live lake — DuckLake catalog, time travel included
INSTALL ducklake; LOAD ducklake;
ATTACH 'ducklake:https://data-directory.fsn1.your-objectstorage.com/catalog/open-meteo-daily/catalog.ducklake' AS lake (READ_ONLY); SELECT * FROM lake.main.daily_weather LIMIT 5;
USE lake;

Worked examples

Today’s forecast for every city
SELECT c.name, w.forecast_date, w.temperature_min, w.temperature_max, w.precipitation_sum
FROM daily_weather w
JOIN cities c USING (city_id)
WHERE w.snapshot_date = (SELECT max(snapshot_date) FROM daily_weather)
  AND w.lead_days = 0
ORDER BY w.temperature_max DESC;

Joins the fact table to the dimension. The snapshot_date range is what prunes: it is the leading sort column.

How the forecast for one day drifted as it got closer
SELECT w.snapshot_date, w.lead_days, w.temperature_max
FROM daily_weather w
JOIN cities c USING (city_id)
WHERE c.name_lc = 'tokyo'
  AND w.forecast_date = DATE '2026-08-28'
ORDER BY w.lead_days DESC;

Every run keeps its own view of the future, so a single forecast_date has one row per lead time.

Wettest city of each run day
SELECT w.snapshot_date, c.name, sum(w.precipitation_sum) AS mm
FROM daily_weather w JOIN cities c USING (city_id)
GROUP BY 1, 2 QUALIFY row_number() OVER (PARTITION BY w.snapshot_date ORDER BY mm DESC) = 1
ORDER BY 1 DESC;

Schema

One row per city per forecast day, as of the run day. A full daily snapshot of the forecast horizon: re-running a day rewrites exactly that day for exactly those cities, so the history of what was forecast when is preserved and comparable.

Rows
56
Size
5.4 KB
Write mode
snapshot_history
Sorted by
snapshot_datecity_idforecast_date
Files
1
Columns of daily_weather
ColumnTypeNullDescriptionMinMax
snapshot_date sortDATEnoThe run day (UTC) this forecast was captured on.2026-08-222026-08-22
city_id sortINTEGERnoOur stable id for the city; joins to cities.city_id.18
forecast_date sortDATEnoThe day (UTC) this row describes.2026-08-222026-08-28
lead_days INTEGER (days)noforecast_date minus snapshot_date, in whole days. 0 is today, 1 is tomorrow. Lets you compare a forecast against the same day observed later.
weather_code INTEGERyesWMO 4677 weather code for the day (0 clear … 95+ thunderstorm).
temperature_max DOUBLE (°C)yesHighest 2 m air temperature of the day.
temperature_min DOUBLE (°C)yesLowest 2 m air temperature of the day.
temperature_mean DOUBLE (°C)yesMean 2 m air temperature of the day.
precipitation_sum DOUBLE (mm)yesTotal precipitation (rain + showers + snow water equivalent).
rain_sum DOUBLE (mm)yesRain only, excluding snow.
snowfall_sum DOUBLE (cm)yesSnowfall, as fresh snow depth rather than water equivalent.
precipitation_hours DOUBLE (h)yesHours of the day with measurable precipitation.
wind_speed_max DOUBLE (km/h)yesHighest 10 m wind speed of the day.
wind_gusts_max DOUBLE (km/h)yesHighest 10 m wind gust of the day.
wind_direction_dominant INTEGER (°)yesDominant 10 m wind direction, meteorological convention (0 = from the north, 90 = from the east). Rounded to whole degrees.
uv_index_max DOUBLEyesHighest UV index of the day.
sunrise TIMESTAMPTZyesSunrise instant. The request pins timezone=UTC, so the naive local time the API returns is UTC and is stored as such.
sunset TIMESTAMPTZyesSunset instant, on the same UTC basis as sunrise.
ingested_at TIMESTAMPnoWhen this row was produced by the ingest run (UTC).

The fixed panel of cities the forecast is collected for: our own stable id, the requested city-centre coordinates, and the model grid point Open-Meteo actually answered from. Reference data with no history — every run replaces it wholesale.

Rows
8
Size
2.1 KB
Write mode
replace
Sorted by
city_id
Files
1
Columns of cities
ColumnTypeNullDescriptionMinMax
city_id sortINTEGERnoStable id of the city. Ours, not Open-Meteo’s; never reused.18
name VARCHARnoCity name as displayed.
name_lc VARCHARnoname, lowercased and accent-folded. The prefix-search column — “sao paulo” must find “São Paulo”.
country VARCHARnoCountry name as displayed.
country_code VARCHARnoISO 3166-1 alpha-2 country code.
latitude DOUBLE (°)noRequested city-centre latitude (WGS84).
longitude DOUBLE (°)noRequested city-centre longitude (WGS84).
grid_latitude DOUBLE (°)yesLatitude of the model grid cell Open-Meteo actually answered from. NULL when the last run could not read it.
grid_longitude DOUBLE (°)yesLongitude of the model grid cell that answered.
elevation DOUBLE (m)yesElevation of the grid cell above sea level.
timezone VARCHARyesTimezone the API reported for the answer. Always UTC/GMT here.