← appaday

The TODO list from 2023

In April 2023 I made a screensaver in four commits: one HTML file that asked The Met for a random painting and set it as the background. No title, no artist, nothing to press. Above the code I left a comment block that starts with // TODO and runs for fourteen lines. Then I did none of it for three and a half years, and the page kept serving paintings at the same address the whole time.

That address now answers with something else.

ok new project at screensaver.patrickreinbold.com (or I guess the new version of the old project)

A painting fills the whole screen: a ship with torn sails in a grey storm, a rowing boat full of people in the foreground waves, pale cliffs behind. In the lower left corner sits a white card like a museum wall label: Thomas Birch, Shipwreck near a Rocky Coast, 1833, Oil on canvas, 51.4 by 76.8 cm, Gift of the family of Richard H. Daniel, Art Institute of Chicago. A small clock in the upper right reads 15:18
What it looks like when nobody is touching it. The label is white because a real wall label is white.

What it is

ArtFrame shows one public-domain painting at a time, full-screen, for 45 seconds, with the label a museum would hang next to it: artist, dates, title, year, medium, size, who gave it. It is laid out for a 4K television seen from a sofa, so there is no cursor and nothing on screen until you press something. The first press only brings the controls up. The second one does the thing. Each painting also drifts very slowly while it is up, because a still image on an OLED for hours is a burn-in risk.

You pick a playlist and it stays for the session, so an evening is one exhibition and not a shuffle.

A pale gallery wall headed Choose a playlist. Eleven framed covers in two rows, each with a white caption card: Shuffle, Favourites (empty), Masterpieces, Dutch Golden Age, Japanese Screens, Impressionists, Sea and Sky (selected, its card black), Wild Places, After Dark, Gardens, and Refused (nothing refused yet)
The picker. Favourites and Refused are empty here because this is a fresh browser.
paintings
117, by 65 artists, all from the Art Institute of Chicago's open-access collection
playlists
8, plus Shuffle, Favourites and Refused
smallest picture
3,867 px on the long edge; 19 of them are 7,680
made of
one HTML file and three JavaScript modules, 3,059 lines, no framework
this build
12 October, 23:32

The list

The interesting part is to read the 2023 comment next to the 2026 page. These are my lines from back then, unedited, and what became of each.

history of "last displayed" with artist and name.... so you can go back and find out more

The label is the artist and name. Back steps through the last 120 pieces. There is also a Hold button, and the code says why: you reach for a camera and the painting is already gone.

add a simple "like" button that'll push to storage this URL and ... idk. Just store it for now
and also allow "dislike" to store it and... skip next time or so

F keeps a painting and it shows up in Favourites. B is labelled "Not this" and the piece never comes back, but it is kept in Refused, where you can change your mind.

strongly prefer loading landscape format artwork in landscape and vice versa

This turned from a preference into a set of hard rules. A picture gets in only if its long edge is at least 3,840 pixels and its shape is between 1.30 and 2.60 to one. It fills the screen only if that throws away no more than 22 percent of it; otherwise it hangs whole on a mat. And nothing is ever enlarged. A comment in the code gives the reason: an enlarged JPEG on a 4K television reads as cheap however good the painting is.

I do very much want it to be scrollable, so that you can choose the excerpt you see in cover mode

The same shipwreck painting with tools over it. A dark panel in the upper left lists the picture's key, its size of 6746 by 4422 pixels, position 50 percent 50 percent, zoom 1.00, mat black, and the keys: arrows pan, plus and minus zoom, S save, R reset, W see whole. A small map in the upper right shows the whole painting with a yellow rectangle around the visible part and the words 86 percent shown. Two rows of round buttons sit in the lower right, Next highlighted
Reframe, on C. The yellow box is what the screen shows of the whole canvas.

Cropping from the centre is wrong surprisingly often, because the subject of a painting is rarely in the centre. So every painting can be moved, zoomed and given a black, grey or white mat, and the choice is saved with the work. Twelve of the 117 carry a framing chosen by hand so far.

hide images behind my own API cause that's def the unique work, collecting and curating them
although the best product would probably be the actual screen saver and themes etc...

Both happened. The 2023 page called the museum live on every load. This one reads a single file of 117 entries and the pictures next to it on my own server. The museum search still exists, but it runs once, offline, to build that file. The reason is in the code as well: nothing that hangs on a wall for an evening should depend on a museum's API being up. And the themes are the playlists.

The very first commit in 2023 was one hard-coded picture, Hokusai's Great Wave. The library now holds three impressions of it.

Still rough

It is one museum. The code knows how to ask the Met and Cleveland too, but everything on the server today is from Chicago. The playlists are uneven: Masterpieces has 40 pieces, Gardens has four and After Dark three, and the cover of Gardens in the picture above is an altarpiece. It only takes landscape pictures, so no portraits at all.

On the public page your favourites and refusals stay in your own browser. The part that sends them to a server is not there.

The comments talk about Apple TV and Roku, which cannot run a web page, and about keeping the curation separate so it can feed them. Neither app exists. What exists is a page you open in a browser and put into full screen.

Letter keys work everywhere: N next, V back, H hold, F keep, B not this, P playlists, G to see the whole painting, I to hide the label.