Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Art Institute of Chicago


A bash script to query our API for public domain artworks and render them as ASCII art

Just a small side-project we did to show what could be done with our museum's API.

The Art Institute of Chicago (AIC) offers all of its public data via a centralized, searchable API. There, you can find data on artworks, artists, and places represented in our collection, and much more besides. For more information, check out our Open Access initiatives.



Please read this section in its entirety before installing anything.

Not all terminals support truecolor! See for more information.

New to the command-line life? From testing, we recommend the following:

Note that the default which ships with macOS does not support truecolor.

Likewise, macOS's default bash is locked to 3.2.57(1)-release due to licensing issues. Instructions for upgrading:

Lastly, jq and jp2a must be reachable via $PATH. You can install them using a package manager of your choice.

# macOS with Homebrew
brew install jq coreutils
brew install

# Ubuntu with APT
sudo apt-get install jq jp2a coreutils

Debugging jp2a issues

On macOS, if you see errors such as the following:

$ ./ --id 27992
./ line 428: 16#'cl,''l:'..........; : syntax error: invalid arithmetic operator (error token is "'cl,''l:'..........; ")

$ ./ --id 28560
./ line 428: 16#,.''ooolxOc.;cooollllcllollllcclllllllloxxdxxdocclollc:cdxxxdlcokxdoolccldddxdddddddll;clcc,c : syntax error: operand expected (error token is ".''ooolxOc.;cooollllcllollllcclllllllloxxdxxdocclollc:cdxxxdlcokxdoolccldddxdddddddll;clcc,c ") probably have jp2a v1.0.7, which is broken. Check here for more context:

You can confirm this by running brew info:

$ brew info jp2a
jp2a: stable 1.0.7 (bottled)
Convert JPG images to ASCII
/usr/local/Cellar/jp2a/1.0.7 (9 files, 67.7KB) *  <-- this should be 1.0.6_1
  Poured from bottle on 2019-09-06 at 15:59:33

You can fix this by running the following commands:

brew unlink jp2a
brew install

On Ubuntu, you should be fine. Double-check that 1.0.6-6build1 is installed.


For now, just clone this repository to wherever you store code on your system:

git clone

If you'd like to run from anywhere, you can add the repository directory to your $PATH:

# Add this to your ~/.bashrc or equivalent, then open a new terminal instance
export PATH=/path/to/aic-bash:$PATH

You can also run when you start a new terminal session:

# Add this to your ~/.bashrc or equivalent, then open a new terminal instance
/path/to/aic-bash/ --quality medium --ratio 120

Adjust quality to reduce color artifacts or improve performance.

The --ratio 120 is aimed at iTerm users. Although terminal fonts tend to be monospace, not all of them will have the same aspect ratio for each character. We can use ratio to stretch or compress the width to compensate for these differences. In this example, --ratio 120 will stretch the width to 120% of original, which is ideal for iTerm users who use default settings.


$ ./ -h
usage: [options] [query]
  -c, --cache [num]     Cache results of this query for [num] seconds.
                        [num] defaults to 1 hour (3600 sec) if blank.
                        Use cached results if available.
  -i, --id <id>         Retrieve specific artwork via numeric id.
  -j, --json <path>     Path to JSON file containing a query to run.
  -l, --limit <num>     How many artworks to retrieve. Defaults to 1.
                        One random artwork from results will be shown.
  -n, --no-fill         Disable background color fill.
  -q, --quality <enum>  Affects width of image retrieved from server.
                        Reduces color artifacts. Valid options:
                          h, high   = 843x (default)
                          m, medium = 400x
                          l, low    = 200x
  -r, --ratio <num>     Stretch the width by this percent of original.
                        Useful to compensate for terminal font aspect.
                        (iTerm users, try `120` for less stretching.)
  -s, --seed <val>      For random queries. Defaults to timestamp.
  [query]               (Optional) Full-text search string. has four modes of operation:

  1. Running it without any arguments will return a random public domain oil painting.

  2. Running it with the -i or --id option will look up a specific artwork by its identifier:

    # Stacks of Wheat (End of Summer) by Claude Monet
    ./ --id 64818
  3. Running it with a string argument will perform a full-text search and show the first result:

    # The Bedroom by Vincent Van Gogh
    ./ bedroom
    # Be sure to use quotes when searching for phrases!
    ./ "la grande jatte"
    # With --limit, show a random artwork from the top <num> results
    ./ --limit 10 "mountains"
  4. Running it with -j or --json will query our API using a query stored in the specified JSON file:

    # Just some example queries we included for reference
    ./ --json "queries/default-random-asian-art.json"
    ./ --json "queries/default-random-landscape.json"

Please note that these queries will only return public domain artworks.

Under the hood, all of its queries are stored as JSON files in the ./queries directory.

We treat JSON files as query templates. Before executing a JSON query, we replace the following text:

  • VAR_FULLTEXT is replaced by whatever is specified in the [query] argument
  • VAR_SEED is replaced by the value of the --seed option or the current Unix timestamp
  • VAR_LIMIT is replaced by the value of the --limit option
  • VAR_ID is replaced by the value of the --id option

So if the query supports it, you can combine --json with full-text search:

# Flower Girl in Holland by George Hitchcock
./ --json "queries/default-fulltext-landscape.json" "holland"

If you want to write custom queries for use with --json, feel free to store them in the ./queries directory.

Any file in ./queries that doesn't begin with default-* will be ignored by version control.

The --limit <num> option provides a way to randomize search, assuming that the query in question uses VAR_LIMIT.

Here, "limit" indicates how many results should be returned on each page from the API. Internally, we show a random result from the first page. By default, limit is set to 1, so the top result will always be shown. Specifying a greater limit means that we will select a random artwork from the top <num> results from the API. For performance, limit is capped at 100.

Limit is meant to work primarily in conjunction with full-text search. For example:

# Show a random artwork from the top 50 results for "paperweight"
./ --limit 50 "paperweight"

If you are writing your own queries, and you'd like to select a random artwork from a category, with no regard to relevance or popularity, consider avoiding the use of VAR_LIMIT. Instead, use term queries with function_score and "boost": false. See queries/default-random-landscape.json for an example.

Lastly, --cache [num] allows you to cache the API response, so that the script won't have to hit the API each time it runs the same query. This is useful for running full-text search with high limit. For example:

# Show a random artwork from the top 100 results for "paperweight"
# Results will be cached for 1 day (86400 seconds)
./ --limit 100 --cache 86400 "paperweight"

After running this query once, it will cache the results. If you run it again within the 24-hour window, it'll show a new random paperweight from the top 100 results without needing to re-query the API.

If you use --cache without specifying [num], it'll default to 3600 seconds, i.e. 1 hour.


We encourage your contributions. Please fork this repository and make your changes in a separate branch. To better understand how we organize our code, please review our version control guidelines.

# Clone the repo to your computer
git clone

# Enter the folder that was created by the clone
cd aic-bash

# Start a feature branch
git checkout -b feature/good-short-description

# ... make some changes, commit your code

# Push your branch to GitHub
git push origin feature/good-short-description

Then on GitHub, create a Pull Request to merge your changes into our develop branch.

This project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

We welcome bug reports and questions under GitHub's Issues. For other concerns, you can reach our engineering team at


This project is licensed under the GNU Affero General Public License Version 3.


A bash script to query our API for public domain artworks and render them as ASCII art




Code of conduct





No releases published


No packages published

Contributors 4