Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

Easel

demo of easel

A self-hosted daily painting viewer built in Go. One public-domain artwork from the Art Institute of Chicago per calendar day, persisted to SQLite.

  • Single Go binary with embedded assets
  • One artwork per day, picked from AIC's public-domain collection
  • Past days browsable via archive; future days unavailable until populated
  • Atom feed at /feed.xml
  • JSON API for today, any day, and the full archive
  • Optional backfill of missing past days on startup
  • Dark themed UI with Commit Mono font
  • SQLite for persistent storage

Configure

Environment Variables

VariableDescriptionDefault
HOSTServer bind address127.0.0.1
PORTServer port4242
EASEL_DB_PATHSQLite database file patheasel.sqlite
EASEL_TIMEZONEIANA timezone for day boundaryUTC
EASEL_CLASSIFICATIONSComma-separated classification_title filterpainting
EASEL_EXCLUDE_TERMSComma-separated phrases excluded across title/description/term/subject/category/classificationerotic,erotica,shunga
EASEL_BACKFILL_DAYSOn boot, fill missing past N days (0 disables)0
EASEL_MAX_DEDUP_RETRIESRetries when picking a non-duplicate artwork10
EASEL_BASE_URLPublic base URL for absolute links in /feed.xmlhttp://localhost:4242

Deploy

Railway

The easiest way to deploy Easel is with the one-click Railway template. See the Deploying with Railway guide for a walkthrough of the process.

Deploy on Railway

Docker

cd apps/easel
cp .env.example .env
docker compose up -d

Binary

Install with Homebrew:

brew install stevedylandev/tap/easel

Or grab a prebuilt binary from the releases page.

You can also build from source:

cd apps/easel && go build .

The resulting binary is self-contained with all assets embedded. Copy it to your server with a configured .env file and run it directly.

Use

Visit / for today's artwork. Browse past days at /day/{YYYY-MM-DD} or the full collection at /archive. Subscribe to /feed.xml for an Atom feed of new daily paintings.

Routes

RouteDescription
GET /Today's artwork
GET /day/{YYYY-MM-DD}Specific past day
GET /archiveFull archive
GET /feed.xmlAtom feed
GET /api/todayJSON of today
GET /api/day/{YYYY-MM-DD}JSON of specific day
GET /api/archiveJSON list

Image source

Images served from AIC's IIIF endpoint:

https://www.artic.edu/iiif/2/{image_id}/full/843,/0/default.jpg