Skip to main content
ClaudeWave
Skill1.2k repo starsupdated 11d ago

museum-art

Source authentic, high-res PUBLIC-DOMAIN artwork from museum open-access APIs (Met, Cleveland, SMK, Rijksmuseum, NGA, Art Institute of Chicago, Getty, Smithsonian) instead of AI-generated or generic-stock imagery. The default move whenever a visual needs an aesthetic, credible image (blog heroes, decks, social cards, essay/spec figures). Verified keyless recipes + licensing rules inside.

Install in Claude Code
Copy
git clone --depth 1 https://github.com/huytieu/COG-second-brain /tmp/museum-art && cp -r /tmp/museum-art/.claude/skills/museum-art ~/.claude/skills/museum-art
Then start a new Claude Code session; the skill loads automatically.

SKILL.md

# museum-art: Public-Domain Artwork for Visuals

> Standing rule (adopted 2026-07-24, from Eric Li's post on museum open-access): **whenever a visual needs a real image with aesthetic weight, source public-domain museum artwork first** - over AI-generated imagery and over generic stock. Curated, historically significant art reads as credible and sophisticated; AI-gen reads as slop. This stacks with, and reinforces, the `no-ai-slop` skill and your house image style. It does NOT replace the generative `editorial-illustrations` skill (that owns claim-driven diagrams/figures) or your house chart style - use museum art for photographic/hero/decorative/mood imagery, generative figures for data and concept diagrams.

## When to reach for this
- Blog post hero images, section breaks, mood imagery (the blog-publish image step).
- Deck/slide backgrounds and section dividers, social cards, essay figures, spec cover art.
- Any time the instinct is "generate an image" for something decorative or evocative. Stop and pull a real painting instead.
- NOT for: product screenshots, UI mockups, data charts, logos, or claim-driven explanatory diagrams (those are editorial-illustrations / real captures).

## Decision: which source
1. **Met -> Cleveland -> SMK first.** All keyless, one JSON hop, CC0/PD, broad collections. Fastest path to a hi-res image.
2. **Need Dutch/Flemish masters or decorative arts?** Rijksmuseum (keyless, 3 hops).
3. **Need European antiquities/photography and keyword isn't essential?** Getty (keyless, SPARQL).
4. **Nothing fits, or you want a cross-museum search?** Wikimedia Commons API (keyless aggregator, normalized license metadata) is the best general fallback.
5. **"Historical illustration/engraving/old photo" rather than fine-art painting?** Go straight to Internet Archive or Wikimedia Commons.
6. **Science/health/medical essay figure?** Wellcome Collection (keyless, CC0/PD).

## How to fetch in THIS environment
- Use **WebFetch** to hit the JSON search endpoint, then WebFetch/download the returned image URL. These APIs are server-side reachable; no browser needed.
- **Exception - Art Institute of Chicago images:** the JSON API (`api.artic.edu`) is fine, but the image host `www.artic.edu/iiif/...` 403s scripted/curl fetches via a Cloudflare bot challenge. Use the JSON metadata from AIC, but download the actual image through a real/headless browser (browser-harness) or prefer a different museum for the image bytes.
- Always **filter for public domain in the query AND spot-check the per-image license flag** before shipping (see Licensing).

## Freshness over caching (mandatory)
**Fetch fresh per need. Do NOT build a reusable local pool of downloaded images to draw from.** A small cached set gets reused everywhere and becomes the new "same stock photo on every post" - sameness is a form of slop, and the variety of a huge open collection is the entire point. Fetching is keyless and sub-second, so there is no cost reason to cache pixels.
- **Cache recipes/metadata, not images** - that is what this skill's `references/` already are.
- **Commit an image only into the specific artifact that uses it** (a post's `assets/`, a deck's media) once chosen - for provenance and offline builds. That is an artifact asset, never a shared library other artifacts pull from.
- Each new visual = a fresh query. Vary the search terms and the source museum so consecutive posts do not converge on the same few crowd-pleasers.

## Verified keyless recipes (2026-07-24, all live-tested)

### 1. The Met - best all-around default
- Base: `https://collectionapi.metmuseum.org/public/collection/v1/` - no key, 80 req/s, CC0 where `isPublicDomain:true`.
- Search: `GET /search?q=<term>&hasImages=true&isPublicDomain=true` -> `{total, objectIDs[]}`
- Object: `GET /objects/{id}` -> read `primaryImage` (full-res JPEG, static, no IIIF hop) or `primaryImageSmall` (web-large).
- Example: `https://collectionapi.metmuseum.org/public/collection/v1/search?q=sunflowers&hasImages=true&isPublicDomain=true`

### 2. Cleveland Museum of Art - only one with archival TIFF
- Base: `https://openaccess-api.clevelandart.org/api/artworks/` - no key, CC0.
- Search: `GET /api/artworks/?cc0=1&has_image=1&limit=10` (add `&q=monet`, `&skip=10`).
- Image fields on each result: `images.web.url` (900px), `images.print.url` (3400px JPEG), `images.full.url` (archival TIFF). Directly downloadable from `openaccess-cdn.clevelandart.org`.
- Confirm `share_license_status == "CC0"` per result.

### 3. SMK (Denmark) - one-hop, broad European/Nordic
- Base: `https://api.smk.dk/api/v1` - no key. License: Public Domain Mark 1.0 (functionally CC0).
- Search: `GET /art/search?keys=*&filters=[public_domain:true]&filters=[has_image:true]`
- Read `image_native` directly from each result (no chain).
- **Gotcha (verified):** pass `filters` as a **repeated** query param, one `[field:value]` bracket each. Concatenating `filters=[public_domain:true][has_image:true]` returns 200 but silently ignores the second condition.

### 4. Rijksmuseum - Dutch/Flemish masters (keyless, 3 hops)
- Base: `https://data.rijksmuseum.nl/search/collection` (Linked Art, no key).
- `GET /search/collection?type=painting&imageAvailable=true` -> walk object -> VisualItem -> DigitalObject -> `access_point[0].id` is a ready IIIF URL.
- Mixed license: mostly CC0/PD but some CC BY 4.0 - **check the per-object rights block** (a CC BY item requires attribution).

### 5. NGA (Washington) - bulk/offline, no live search
- CSV: `https://raw.githubusercontent.com/NationalGalleryOfArt/opendata/main/data/published_images.csv` - filter `openaccess=1`.
- Image (IIIF): `https://api.nga.gov/iiif/{uuid}/full/full/0/default.jpg`
- **Per-image `openaccess=0` rows are NOT open** (resolution-capped, rights-restricted). Only `openaccess=1` is free.

### 6. Art Institute of Chicago - Impressionism/European (image host caveat)
- JSON: `GET https://api.artic.edu/api/v1/artworks/search?query[term][is_public_domain]=true&fie