skill-gallery

What agent skills do to a web page

The same prompts, built by Codex and Claude Code, each with and without a web-design skill (SKILL.md). Every prompt runs as a 2×2: Codex native, Codex + skill, Claude Code native, Claude Code + skill. The native cells are shared by all skills.

46 of 46 cells have run.

Overview

Rows are skills, columns are prompts. Each square shows the Codex result on the left and the Claude Code result on the right (top of the page, desktop width).

Skill
SaaS landing pagelanding-saas
Nativeno added skill, shared baseline
frontend-designwith skill
Out of scope
Codex + frontend-design: Out of scope
Out of scope
Claude Code + frontend-design: Out of scope
ui-ux-pro-maxwith skill
Out of scope
Codex + ui-ux-pro-max: Out of scope
Out of scope
Claude Code + ui-ux-pro-max: Out of scope
Out of scope
Codex + web-design-engineer: Out of scope
Out of scope
Claude Code + web-design-engineer: Out of scope
Out of scope
Codex + taste-skill: Out of scope
Out of scope
Claude Code + taste-skill: Out of scope
theme-factorywith skill
Out of scope
Codex + theme-factory: Out of scope
Out of scope
Claude Code + theme-factory: Out of scope

Skills

Prompts

Method

AgentModelEffortCLI versionRuns
Codex CLIgpt-6.1-solhigh0.164.023 runs
Claude Codeclaude-opus-5-5high2.1.30823 runs

The model and effort are fixed in the run scripts. The table shows what the run.json files record.

One sample per cell, no picking
Each cell is generated once, in one pass, with no follow-up turns. The result is shown as it came out, failed runs included. If a cell is rerun, the earlier attempt is kept in runs/<prompt>/_attempts/.
Same prompt in all four cells
The prompts use neutral wording with no style adjectives. Skill cells add one closing sentence that names the skill: Use the <name> skill. for Claude Code and Use the $<name> skill. for Codex.
Isolation
Every run starts in a fresh throwaway directory outside the repository, with an empty HOME, its own config home (CLAUDE_CONFIG_DIR or CODEX_HOME) and an environment built from scratch. No user settings, plugins, user-level skills, MCP servers or memories are loaded. The skill under test is copied only into that throwaway project's skill folder (.claude/skills/ or .agents/skills/). Skills bundled with each CLI stay available and count as native. The evidence comes from each agent's own logs and is stored in run.json under isolation.
The skill has to fire
For skill cells, the logs must show that the skill was loaded (skill_triggered). If it was not, the cell is marked Failed instead of being shown as a skill result.
Screenshots
Full-page captures at 1440 and 390 CSS px wide, taken after the network is idle and fonts have loaded, with animations disabled (playwright 1.64.1, playwright-chromium 156.0.8078.4). Thumbnails show the top of the page. “Open page” loads the original index.html in a sandboxed iframe (sandbox="allow-scripts", no same-origin access).
Accessibility scan
Each page is also checked with an automated accessibility scanner, and the number of violations by severity is shown. Automated scans catch only part of accessibility problems (they cannot judge, for example, whether alt text or focus order make sense), so treat the counts as a pointer, not a verdict.
Scroll recordings
Some cells also have a short recording of the page being scrolled at desktop width, because motion does not show in screenshots. It loads only when you press play on the cell page.
Run dates
2026-10-25 – 2026-10-26 (UTC), 46 cells.
Votes
Each result page has a 👍 vote through giscus, a third-party widget that loads only on result pages, not on the rest of the gallery. Voting needs a GitHub sign-in. Votes are stored as reactions in this repository's GitHub Discussions, one discussion per cell, shared by all languages. The counts on the comparison pages are refreshed every few hours. They show what visitors prefer; they are not an evaluation.

Known limitations