Image annotation site and API to enable the distributed annotation of museum images.
Ruby HTML PLpgSQL CSS JavaScript Dockerfile
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
app Scavenger Hunt WIP Aug 3, 2018
bin Tweak MySQL migrator Jul 27, 2018
config Scavenger Hunt WIP Aug 3, 2018
db Scavenger Hunt WIP Aug 3, 2018
doc_assets Redesign Coyote Jul 24, 2018
docs chore: regenerate doc site Jan 17, 2018
lib Scavenger Hunt WIP Aug 3, 2018
public Fix setup and error code pages Sep 18, 2017
spec Scavenger Hunt WIP Aug 3, 2018
vcr Feature spec for adding an image [#106] Jul 19, 2017
.codeclimate.yml more code climate integration Sep 27, 2016
.gitignore Redesign Coyote Jul 24, 2018
.rspec Consolidate RSpec settings in one file Jul 20, 2017
.rubocop.yml Redesign Coyote Jul 24, 2018
.rubocop_todo.yml Cleanup several Rubocop style warnings Sep 21, 2017
.ruby-version Upgrade to Ruby v2.4.1 Aug 6, 2017
.slugignore add dev DB management tasks Oct 2, 2017
.travis.yml Force test failure so we can test new CI build failure correction Sep 12, 2017
.yardopts Reorganized README and tighten YARD config Jul 21, 2017 git setup ref #79; deploy self ENV fixes ref #78; contribution simpli… Apr 5, 2017
Dockerfile fix: do not run gem update system to avoid build failure Nov 6, 2017
Gemfile Scavenger Hunt WIP Aug 3, 2018
Gemfile.lock Scavenger Hunt WIP Aug 3, 2018
Guardfile Redesign Coyote Jul 24, 2018
LICENSE.txt MPLv2.0 ref #36 Aug 18, 2016
Procfile Switch from Thin to Puma server to make Docker setup easier Jul 20, 2017 Fix design_refinements link [skip ci] Jan 17, 2018
Rakefile Remove Capistrano #107 Aug 1, 2017
app.json Fix one-click installer setup #103 Aug 1, 2017 Redesign Coyote Jul 24, 2018
docker-compose.yml ensure coyote_test DB is created in docker compose environments Sep 12, 2017
sample.env Various user invitation cleanups; improve dev mode email sending Sep 18, 2017


Build Status

An open source image annotation app enabling the distributed annotation and comprehensive representation of images. Long descriptions can range from one sentence to several paragraphs. The software was developed by the Museum of Contemporary Art Chicago to support a distributed workflow for describing their images and publishing those descriptions to the web.


An image like this would traditionally be described by alt text like A red, white, and blue fabric canopy presses against walls of room; portable fans blow air into the room through a doorway.:

MCAChicago sample image T.Y.F.F.S.H

Kris Martin, Belgian, b. 1972. T.Y.F.F.S.H., 2011. Collection: Museum of Contemporary Art. Photo: Nathan Keay, © MCA Chicago.

Coyote aims to provide more comprehensive representations:

This is an installation that viewers are invited to walk inside of. From this viewpoint you are looking through a doorway at a slight distance, as if standing inside of a large cave and looking out of its narrow entrance at the world outside. The walls of this cave are alternating stripes of red, white, and blue material that seems to be made of some kind of thin fabric. These colored stripes spiral around toward the entrance, as if being sucked out of the opening. The inside of the cave is more shadowed and the area outside is brightly lit. Gradually you notice that there are in fact two openings lined up in front of each other, straight ahead of you: the first one is a tall rectangle—the red, white and blue fabric is wrapped through the edges of a standard doorway; beyond that it continues to spiral around toward another circular opening. The center of this circle is much brighter, as if one had finally escape from the cave. At the center of that circular opening you see two large white fans facing your direction, blowing air into the cave-like opening. Beyond the fans you see a brown, square form, which is the bottom of a huge wicker basket. This basket, lying on its side, helps to reveal the truth about what you are seeing: You are standing inside of a huge hot air balloon, which is lying on its side. Blown by the fans, the fabric billows out to press out against the existing w alls of a large room, the malleable shape of the balloon conforming to the rectangular surfaces of an existing building–the gallery that contains it.

More information about image description projects at the MCA and elsewhere is available at, along with contact information for the project team. You can also view or hear image descriptions on the MCA website.

Table of contents

Developer Setup

Beginning Developers

The app can run in a self-contained Docker container, which you can use for development. For more details see local development with Docker Compose.

  1. Install Docker Community Edition

  2. Run the following commands:

git clone
cd coyote
docker-compose build   # downloads images, builds containers
docker-compose up      # start running containers
docker-compose up test # run the test suite
docker-compose exec web bin/rake db:setup db:migrate db:seed                    # prepare database, add seed data
docker-compose exec web bin/rake coyote:admin:create[,password] # create initial user
  1. Open http://localhost:3000 in your browser.

Once the app is running you can interact with it using commands like this:

docker ps                                   # list running containers
docker-compose build                        # rebuild web container when new gems are installed
docker-compose exec web pumactl restart     # restart Puma
docker-compose exec web bin/rails console   # access Rails console
docker-compose exec web bin/rake db:migrate # update the Postgres server managed by Docker

Experienced Developers

The app can also run in your local development environment, but requires a bit more know-how.

  1. Install Postgres (on MacOS try

  2. Run the following commands:

git clone
cd coyote
bin/rails server && open http://localhost:3000

The seed script builds a simple user, so you can login as

We have setup a Guardfile to speed up development. Try bundle exec guard.

Testing Mailers in Development Mode

The settings in [sample.env] work with mailcatcher:

gem install mailcatcher     # runs independently of the app, so this gem is not part of our Gemfile
mailcatcher -f              # much better to run this in foreground vs. the default daemon mode
open # mail delivery console

Re-seeding the Database

You can regenerate development environment data by running bundle exec rake dev_only:reseed.


YARD documentation is hosted at

Fresh documentation can be generated locally by running bundle exec rake coyote:docs OUT=docs/apipie. The OUT parameter is for apipie.

Coyote design refinements are documented in design_refinements.pdf.


Coyote's API is based on the JSON API standard. Coyote-specific JSON API documentation is generated by apipie and can be viewed here.


We can extend the functionality of Coyote to better integrate with your particular CMS with a strategy file. For an example, check out /lib/coyote/strategies/mca.rb.


More info regarding accessibility: