Skip to content
Mark Rogers edited this page Oct 27, 2026 · 5 revisions

artwright

artwright is a plugin of four skills and one command-line script that give an AI agent an artist's eye. The agent critiques art, names styles and movements with the traits that prove them, answers art-history and art-market questions from sources, checks pixel art, and compares generated images two at a time, in both orders, blind to file names. The script, aw.py, does the measuring: image sizes and token costs, contact sheets, colour and value statistics, light, colour and composition measures, pixel-art checks, gates for paintings made over 3D renders, painted sprites and illustrations that join a series, pair images, a Bradley-Terry ranking and the verdict.json file that other plugins read.

It does not generate images, edit them, fix pixel grids, judge video or score brand fidelity. It judges, explains and says what to change next.

The current release is 0.7.2, tagged v0.7.2 on 2026-10-26 (Versions and upgrading). Since 0.3.0 it gained geomgate, sprite and setfit, lightness-based value numbers, a grain estimate, and pixel-art craft numbers (banding, pillow shading, corner doubles, tile repetition) that are reported but have no pass lines yet. It installs as a Claude Code plugin straight from this repository, and the skill folders, also in the release's zip, work in other agents that read skills. In Claude Code, type these two commands.

/plugin marketplace add m4bwav/artwright
/plugin install artwright@artwright

The smallest example

Before an agent reads an image, aw.py info says how big it is and what reading it costs. dusk.png is a 2000 x 1200 test image:

python aw.py info dusk.png

prints:

{
 "items": [
  {
   "file": "dusk.png",
   "ok": true,
   "format": "png",
   "bytes": 16342,
   "size": [
    2000,
    1200
   ],
   "sha256": "01069b7b7057f04bb65c47b1bd01c995bcae247570c53c24e6b7dde6053350c0",
   "alpha": "none",
   "partial_alpha_pixels": 0,
   "unique_colours": 288,
   "tokens": {
    "standard": {
     "tokens": 1500,
     "read_at": [
      1400,
      839
     ]
    },
    "high": {
     "tokens": 3096,
     "read_at": [
      2000,
      1200
     ]
    }
   }
  }
 ],
 "ok": true
}

At that size the agent fits it first (aw.py fit dusk.png -o dusk_1024.png gives 814 tokens). Every command prints one JSON object like this one, with "ok" saying whether it worked.

Which page to read

  • Getting started: install the plugin or the skill folders, check what decodes on your machine, run the first commands.
  • Skills: what each of the four skills does, what it refuses, and which sibling owns nearby requests.
  • Commands: every aw.py command and option, with real output, including the render, sprite and series gates and the pixel craft numbers.
  • Light, colour and composition: light, gamut, accents, depth and comp, their flags, text bands, grain, and the damage kinds that test them.
  • How images are judged: both orders, ties, the ranking, close_to_next, cycles, the rubric, and what the numbers from stats and pixel mean and do not mean.
  • Verdict contract: the artwright/verdict.json file a calling plugin reads, and what verdict validate checks.
  • Errors and edge cases: every error message, odd inputs, and the known issues.
  • Recipes: calling aw.py from Python or a shell, a batch end to end, a caller reading the verdict.
  • FAQ: short answers, with links to the detail.
  • Versions and upgrading: what changed in each version and what to do about it.
  • Development: the checks, the tests, the evals, CI and how a release is made.

About the examples

Every output on these pages was printed by aw.py 0.7.2, from the v0.7.2 tag at commit a185c05 (2026-10-26), the same aw.py, aw_measure.py and aw_geom.py that the release zip holds, unless the page names an older version. It ran on Linux with Python 3.14.4 and Pillow 13.0.0, against images drawn in code for the run: dusk.png and noon.png (snowy landscapes with a small fox), sprite.png (a 16 x 16 sprite drawn at 4x), sprite_ai.png (the same sprite resampled off its grid), 128 x 128 sprites in renders/ and batch/, and, for the gates and the pixel craft numbers, a 192 px mill render with painted copies, painted 48 px houses, a five-picture landscape series, a 32 px orb and three 16 px tiles. The same commands were also run on Linux without Pillow and on Windows with Python 3.9 and no Pillow; where those runs differ, the page says so. File hashes and pair ids belong to these drawn images, so yours will differ.

Elsewhere: the README, the CHANGELOG, the command list in the repository and the issues.

Clone this wiki locally