Python Executor
cortega26/chile-hub
Execute Python code in a safe sandboxed environment via [inference.sh](https://inference.sh).
Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…
$ npx skills add owid/etl --skill owid-catalog -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install owid/etl owid-catalog --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .claude/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .claude/skills/owid-catalog && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .claude/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalogType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add owid/etl --skill owid-catalog -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install owid/etl owid-catalog --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .agents/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .agents/skills/owid-catalog && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .agents/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add owid/etl --skill owid-catalog -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install owid/etl owid-catalog --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .cursor/skills/owid-catalog && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .cursor/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/owid/etl.git --path lib/catalog/skills/owid-catalog--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add owid/etl --skill owid-catalog -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install owid/etl owid-catalog --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .gemini/skills/owid-catalog && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .gemini/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install owid/etl owid-catalogInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add owid/etl --skill owid-catalog -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .github/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .github/skills/owid-catalog && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .github/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add owid/etl --skill owid-catalog -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install owid/etl owid-catalog --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/owid/etl.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/lib/catalog/skills/owid-catalog .opencode/skills/owid-catalog && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "owid-catalog" agent skill from https://github.com/owid/etl/tree/master/lib/catalog/skills/owid-catalog into .opencode/skills/owid-catalog/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "owid-catalog", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
owid-catalogAccess Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…
Owid Catalog is an agent skill from owid/etl. Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources and citations. Use this skill whenever the work happens in Python or a notebook (pandas, a uv script, matplotlib, parquet); whenever you need an indicator's metadata, units or codebook; whenever you need dimensions that published charts flatten away, such as sex, age group or projection variant; or whenever you need to…
Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Data & Analytics, covering DataFrames and Data visualization. It works with Python, pandas, GitHub and Matplotlib. The repository describes itself as: A compute graph for loading and transforming OWID's data. The licence is MIT.
Read from SKILL.md and the folder at commit 70c9705. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvpipFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
ourworldindata.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Owid Catalog loads about 2.3k tokens when it runs. Until then it costs about 192 tokens; SKILL.md has 686 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from owid/etl at commit 70c9705, republished under its MIT licence (© owid). 686 words, ~2,307 tokens.
.claude/skills/owid-catalog/SKILL.md (or your agent's skills folder).The owid-catalog library provides a unified Python API for discovering and loading OWID datasets. It supports three search kinds: charts (published visualizations), tables (catalog datasets), and indicators (semantic search via embeddings).
Charts are the most curated and best-documented uses of the data, so for answering questions about data they are often a better starting point than indicators. One chart can use a single indicator or several.
Indicators give access to the full catalog of time series, with varying levels of curation. Indicators and tables are addressed by ETL catalog paths, for example garden/un/2024-07-12/un_wpp/population#population. The path fragments are:
#)Channels are levels of curation. meadow is upstream data as a dataframe. garden is where the data is cleaned and processed; garden tables can carry extra dimensions beyond time and entity (sex, age group, projection variant) and tend to be wide. grapher is the data reshaped for OWID's charting tool, which only understands time and entity, so the extra dimensions are flattened into separate columns. For indicator work, grapher or garden is usually what you want: garden when the extra dimensions help, grapher when you want simple series that merge easily.
Tables are whole datasets' worth of indicators. Table search is more primitive and the frames can be large (hundreds of columns, or millions of rows — garden/un/2024-07-12/un_wpp/population is ~13M rows because of its sex × age × variant dimensions), but when you need several indicators from one dataset they save you joining them by hand. Fetching a single indicator with #column still loads every row of its table.
Country names are harmonized across OWID data, so tables join cleanly on entity and time.
Once you know which data you need, always print the codebook to bring units, descriptions and sources into context. It is what keeps an analysis from misreading a percentage as a share or a per-capita value as a total.
Suggest to the user that they credit the data. If an origin has citation_full, suggest that. Otherwise build an acknowledgment like "PROVIDER 1, PROVIDER 2, ... with processing by Our World in Data", using each origin's attribution, or producer as a fallback (see Metadata and citations).
If uv is available (preferred), use inline script dependencies — no separate install step:
# /// script
# requires-python = ">=3.11"
# dependencies = ["owid-catalog"]
# ///Run with:
uv run --no-project script.pyWithout uv:
pip install owid-catalog# /// script
# requires-python = ">=3.11"
# dependencies = ["owid-catalog"]
# ///
from owid.catalog import fetch, search
# Fetch chart data by slug — returns a Table (a DataFrame with metadata)
tb = fetch("life-expectancy")
print(tb.head(30).to_csv())
print(tb.codebook.to_csv())
# Search charts, then fetch the top result
results = search("population")
print(results.to_frame().head(30).to_csv())
tb = results[0].fetch()The default display of ResponseSet, Table and the codebook is rich formatting meant for notebooks; printed as text it is truncated to a few columns. Convert to CSV instead:
print(search("gdp per capita").to_frame().to_csv()) # search results
print(tb.head(30).to_csv()) # data
print(tb.codebook.to_csv()) # column, title, description, unit, sourceFetch data from any published chart by slug or full URL:
from owid.catalog import fetch, search
tb = fetch("life-expectancy")
tb = fetch("https://ourworldindata.org/grapher/life-expectancy")
# Search charts (10 results by default; pass limit= for more)
results = search("child mortality", limit=30)
print(results.to_frame().to_csv()) # titles, descriptions, URLs
tb = results[0].fetch()Chart tables are indexed by entities and years (not country/year), and their value columns get generated names such as life_expectancy_0. Read tb.columns before referring to a column.
Search the full data catalog for tables by name, namespace, dataset, version or channel. This covers every dataset in the catalog, not just those behind published charts.
from owid.catalog import fetch, search
# Fuzzy, typo-tolerant matching on the table name (default)
results = search("population", kind="table")
print(results.to_frame().head(30).to_csv())
# Filter by data provider
results = search("wdi", kind="table", namespace="worldbank_wdi")
# Matching modes: "fuzzy" (default), "exact", "contains", "regex"
results = search("gdp.*capita", kind="table", match="regex")
# Keep only the latest version of each table
results = search("population", kind="table", latest=True)
# Fetch by catalog path: a whole table, or one indicator from it
tb = fetch("garden/un/2024-07-12/un_wpp/population")
tb = fetch("garden/un/2024-07-12/un_wpp/population#population")namespace, version, dataset, channel, match and case only apply to table search; chart and indicator search ignore them.
Semantic search using vector embeddings — finds indicators by meaning, not just keywords:
from owid.catalog import Client, search
results = search("share of energy from renewable sources", kind="indicator", latest=True)
print(results.to_frame().head(30).to_csv())
# All fields: unit, score, n_charts, popularity, channel, namespace, ...
print(results.to_frame(all_fields=True).head(30).to_csv())
tb = results[0].fetch() # the single indicator column
tb = results[0].fetch_table() # the full table containing itResults are ranked by relevance: a blend of semantic similarity (60%) and popularity, i.e. how much the indicator is viewed (40%). Without latest=True the same indicator often appears several times, once per dataset version. latest=True deduplicates after limit is applied, so it can return far fewer than limit results — raise limit (e.g. limit=50) when you use it. search() has no sort argument; re-sort the ResponseSet, or rank by similarity alone through the client:
results = results.sort_by("n_charts", reverse=True) # any result field
results = Client().indicators.search("CO2 emissions per capita", sort_by="similarity")Every column of a fetched Table carries its own metadata, including the origins that the citation guidance above draws on:
meta = tb["life_expectancy_0"].metadata
print(meta.unit, meta.short_unit, meta.description_short)
for origin in meta.origins:
print(origin.producer, origin.attribution, origin.citation_full)Search returns a ResponseSet:
results = search("gdp", kind="table")
first = results[0]
for r in results[:5]:
print(r.title)
filtered = results.filter(lambda r: "worldbank" in r.namespace)
sorted_results = results.sort_by("popularity", reverse=True)
# The single newest result (by version, or last_updated for charts) — not a filtered set
newest = results.latest()
df = results.to_frame() # DataFrame of the main fields
df = results.to_frame(all_fields=True) # every field
records = results.to_dict() # list of plain dicts
# In Jupyter, for human users only: switch the notebook display
results.set_ui_advanced()
results.set_ui_basic() # defaultowid-grapher-py renders OWID-style interactive charts in a notebook. Its plot() expects year and entity columns by default, so name the chart table's columns explicitly:
# dependencies = ["owid-catalog", "owid-grapher-py"]
from owid.catalog import fetch
from owid.grapher import plot
tb = fetch("life-expectancy")
df = tb.reset_index()
chart = plot(df, x="years", entity="entities", y="life_expectancy_0", title="Life expectancy", types=["line", "map"])© owid, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in lib/catalog/skills/owid-catalog of owid/etl.
Open the folder on GitHubat commit 70c9705
Owid Catalog next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Owid Catalog this skillowid/etl | 159 | — | ~2.3k | Automated safety check: Pass | MIT | |
| Python Executorcortega26/chile-hub | 113 | 2 repos | ~1.5k | Automated safety check: Pass | MIT | |
| Analytics Data AnalysisMindrally/skills | 271 | — | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| SeabornK-Dense-AI/scientific-agent-skills | 48k | 1 repos | ~3.4k | Automated safety check: Notes | BSD-3-Clause | |
| Plot ML Figureprobabl-ai/skills | 138 | — | ~796 | Automated safety check: Pass | BSD-3-Clause | |
| Release Evidence WorkflowAli-Marandi/ClimateDataAnalyzer | 107 | — | ~1.6k | Automated safety check: Pass | MIT |
cortega26/chile-hub
Execute Python code in a safe sandboxed environment via [inference.sh](https://inference.sh).
Mindrally/skills
Best practices for analytics, data analysis, and visualization using Python, pandas, matplotlib, seaborn, and Jupyter notebooks.
K-Dense-AI/scientific-agent-skills
Creates Seaborn statistical visualizations with pandas integration for distributions, relationships, categorical comparisons, regression displays, pair plots, and heatmaps.
probabl-ai/skills
Pick how to write a figure before custom plot code. An agent skill from probabl-ai/skills.
Ali-Marandi/ClimateDataAnalyzer
Build an auditable release-evidence workflow for a desktop or packaged application.
davila7/claude-code-templates
Processes tabular datasets too large for RAM with Vaex: lazy DataFrames, fast aggregations, big-data plots and ML pipelines over CSV, HDF5, Arrow and Parquet.
owid/etl
Find every OWID surface that references a chart, indicator, MDIM, or explorer — articles (links vs embeds), explorers, narrative charts, data insights, static viz, key-chart slots, MDIM views.
owid/etl
Add a scatter view (with GDP per capita on x) to existing OWID charts via the admin API, mirroring the admin UI's "Add scatter type" defaults, then retire the old standalone "X vs.
owid/etl
Add new survey question codes (e.g. An agent skill from owid/etl.
owid/etl
Build or refresh an OWID static visualization end to end — resolve what data it needs from an old static viz image, an indicator, or a grapher chart; check both the ETL catalog and the producer's…
owid/etl
Propose redirects from (soon-to-sunset) grapher charts to the matching views of published MDIMs.
owid/etl
Take (soon-to-sunset) OWID explorers to redirected MDIMs, end to end.
Works with
Categories
Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources…. Owid Catalog is an agent skill from owid/etl. Access Our World in Data from Python with the owid-catalog library: load chart data, catalog tables or individual indicators as pandas DataFrames that carry their own units, descriptions, sources and citations.
Owid Catalog fits situations like: the work happens in Python; A notebook (pandas; whenever you need an indicators metadata; whenever you need dimensions that published charts flatten away.
Run `npx skills add owid/etl --skill owid-catalog -a claude-code`. Or copy the skill folder (lib/catalog/skills/owid-catalog in owid/etl) into .claude/skills/owid-catalog in your project. Claude Code loads it when a task matches its description.
Run `npx skills add owid/etl --skill owid-catalog -a codex`. Or copy the skill folder (lib/catalog/skills/owid-catalog in owid/etl) into .agents/skills/owid-catalog in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add owid/etl --skill owid-catalog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/owid-catalog, .gemini/skills/owid-catalog, .github/skills/owid-catalog and .opencode/skills/owid-catalog in your project.
Going by SKILL.md and its folder, Owid Catalog needs the command-line tools its instructions call (uv and pip). Our summary lists: Python 3.
SKILL.md names 1 domain. In commands or code: ourworldindata.org; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Owid Catalog is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Owid Catalog: Python Executor (cortega26/chile-hub, 113 stars), Analytics Data Analysis (Mindrally/skills, 271 stars), Seaborn (K-Dense-AI/scientific-agent-skills, 48k stars) and Plot ML Figure (probabl-ai/skills, 138 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
owid (a GitHub organization) maintains it in owid/etl, which has 159 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 10, 2026.
Source: owid/etl on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.