Ondřej BašeFRONTEND · AI · GAME DESIGN
CZEN

galerie

A self-hosted web art gallery, and the AI curator that fills it.

A self-hosted art gallery, and the curator that fills it.

Name a painter. The curator builds their catalogue, searches the archives it is connected to, and downloads the best printable copy of each work it can find.

The gallery is the other half: a private place to look at what came back. Full screen, no crops.

The gallery

What you do

./curate.sh "Jules Bastien-Lepage"

That is the whole interaction. The curator resolves the artist, pulls their catalogue from Wikidata, asks every connected source for every work, merges duplicates, and collects candidate images.

Works it cannot find a clean copy of stay in the catalogue, marked as missing.

One artist

Where the AI comes in

Fetching files is the easy half. The hard half is that most of what an archive returns is not a reproduction of a painting — it is a photograph of an object.

A scan with the frame in shot. Stretcher bars along one edge. A colour calibration strip next to the canvas. A conservation sticker. A gigapixel tile of one corner. A print floating in a paper margin with a pencil signature under it. All of them are catalogued the same way, and none of them can be printed.

So the AI looks at them. For each work it gets every candidate side by side and answers one question: is this a flat reproduction where the painting reaches all four edges? What fails is rejected with a reason and never offered again. The next round brings different versions, until something clean turns up or the work is marked unavailable.

Three more things it handles, none of which can be written as a rule:

The same painting under two names. One archive has The Grand Canal, another has Le Grand Canal, a third uses Cyrillic. Same picture, three records. They get merged and the best scan survives.

Bigger files that are worse. Museum photographs come with yellowed varnish, a colour cast, gallery lighting, a slight angle. A smaller restored reproduction often wins.

The wrong artist. Archives match on surnames and painting runs in families. Without something looking at the pictures, a father’s illustrations end up filed under his son.

What you get

One work

Each work shows the size it prints at — in centimetres, at 300 DPI and at 150 DPI, not just a pixel count. Download the file as it is, or have it converted to TIFF in AdobeRGB at 300 DPI, ready for a lab.

One button deletes a bad reproduction. It blocks that version permanently and puts the work back in the queue, so the next round finds a different one.

On a phone

The gallery and the artist list on a phone

Where it looks

Five connectors, all official open-access APIs. Nothing behind a login, nothing scraped, nothing reassembled from an image a site serves in pieces.

connector what it brings
Wikidata the catalogue, and the identity every other source is matched against
Wikimedia Commons the widest net: individual scans and whole category trees
The Metropolitan Museum few works per artist, often the best scan of them
Smithsonian CC0 originals, frequently the source others serve a shrunken copy of
Art Institute of Chicago, Cleveland Museum their own collections, CC0

Adding one is small. A connector is one file with one function: given a work, return candidate images with their dimensions. Scoring, deduplication, review and downloading are already there and treat every source the same. curator/sources/cleveland.py is fifty lines and is the template; the five rules are in AGENTS.md.

No artwork ships with it

The repository contains code, not pictures. Nothing is downloaded until you ask for an artist, and what lands on disk depends entirely on which artists you ask for.

Expect it to get large. One painter can be hundreds of works, and a print-quality scan is tens of megabytes.

The screenshots above are from a running installation.

For personal use

It collects from public collections for private use. It does not clear rights and it records no licence, because sources report licensing inconsistently and a guessed value that looks authoritative is worse than none.

A file may be public domain, a museum’s open-access release, or someone’s own photograph under a licence requiring attribution. Before publishing, printing commercially or redistributing, check at the source. Every work links back to the page it came from.

What to expect

  • Painters still in copyright come back nearly empty. The catalogue is right; the images are not in open collections.
  • Clean scans are often smaller than framed ones, so many works land below print size.
  • Some catalogues are mostly prints and drawings — Victorian illustrators and 17th-century Dutch masters especially.

Running it

Postgres and two containers, in docker-compose.yml. Configuration in .env. The only optional extra is a Smithsonian API key, which is free.

cp .env.example .env      # then edit it
docker compose up -d --build
./curate.sh "Johannes Vermeer"
file what it covers
AGENTS.md how it works, the rules, the invariants
docs/sources.md every source and its traps
docs/vision-qc.md the review step: criteria and file format
Vydáno 27. srpna 2026
Otevřít na GitHubu
Mimo provoz, prozatím…