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


Travis Docker Pulls

Herder is a tool for automagically generate schedules for your convention, given such information as "when", "who's coming" and "what events do they want to attend". It leverages OptaPlanner for constraint satisfaction solving to be able to figure out the best schedule it can given your constraints, or at least the one that violates the smallest number of them.

It's a Clojure(Script) Boot app, with a tiny little bit of Java for helping OptaPlanner along.

Getting started

  1. Get Boot
  2. boot dev
  3. Goto http://localhost:3000

This will get you a running dev setup using h2.

Production build

dev boot target builds, tests and runs the system. There's also prod-build which makes a target directory with all the parts in and prod-run which assumes you've done prod-build and runs that.

Production setup

This uses Docker, PostgreSQL and Let's Encrypt, but if you set DATABASE_URL and HOST you can run this outside of Docker. See docker-compose.yml for information. We're using prebuilt images from Docker Hub using prod-build/prod-run

  1. Find a suitable machine to run all of this on (I suggest DigitalOcean, because then I get referrer credit). Main tested environment is a Debian 8.3 x64 machine.
  2. apt-get install vim curl
  3. Follow
  4. Check docker version and then follow instructions for latest release
  5. git clone
  6. cd herder
  7. Edit docker-compose-public.yml. Set VIRTUAL_HOST and LETSENCRYPT_HOST to your host (hereafter assumed to be ""). Set LETSENCRYPT_EMAIL to your email.
  8. docker-compose -f docker-compose-public.yml up -d
  9. Goto, and make sure you've got the main "Conventions" page. If not, check docker logs -f herder_herder_1 for "Starting #'" at the end. This takes a bit to occur after the "Postgres is up" line
  10. Goto If that doesn't work, check docker logs -f letsencrypt-nginx-proxy-companion for no ERROR lines
  11. If this all works, replace "ports:" section of "herder" in "docker-compose-public.yml" with an "expose:" section
    - "3000:3000"


  - "3000"

and docker-compose -f docker-compose-public.yml up -d, which will stop the port 3000 version being exposed to the outside world.


If you've done the Production setup, backing up your data is good. Here's an example way to backup the Postgres data

  1. apt-get install postgresql-client ssmtp uudeview
  2. Create as follows (replacing the "From" and "To" addresses)
PGPASSWORD=mysecretpassword pg_dump postgres --host localhost --username=postgres | gzip -c - > backup.sql.gz
echo -e "From:\nTo:\nSubject: Herder backup\n\n"|uuenview -a -bo backup.sql.gz |sendmail -t

and doing a chmod +x 3. To then backup every night at 2am, crontab -e and add the following 0 2 * * * /root/herder/ (assuming that's the path to


No releases published


No packages published