No description, website, or topics provided.
Ruby JavaScript HTML CSS Handlebars
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.


This is an LTI-enabled service that allows you to award badges (Mozilla Open Badges, specifically) to students in a course based on their accomplishments in the course. Currently this will will only work with Canvas. You can see (and use!) Canvabadges at

Canvabadges now supports multiple badges per course, and has better support for launching from multiple courses in the same session.


NOTE: If you are upgrading from a previous version of Canvabadges, you need to check out the migrations section of this page!

You need two configurations set up in order to run this app. First, you need to set up an application at Write down your key and secret. Next you'll need a developer key for the Canvas account you want to speak with. Write down the key id and secret.

Below are instructions for starting up in a dev environment. If you know how to run a production ruby environment you should be able to figure out how to translate these instructions to your prod environment.

# install gems...
sudo bundle install

# let's set up the variables you'll need in order to function
require './canvabadges.rb'
#  store your Canvas token settings
ExternalConfig.create(:config_type => 'canvas_oauth', :value => "<canvas developer key id>", :shared_secret => "<canvas developer secret>")
#  store your twitter token settings
ExternalConfig.create(:config_type => 'twitter_for_login', :value => "<twitter consmyer key>", :shared_secret => "<twitter shared secret>")
#  create a record matching your domain
#  set twitter_login to false if you only want LTI credentials created by hand
#  (twitter_login lets anyone generate an LTI key and secret with a twitter login)
d = Domain.create(:host => "", :name => "Name Of Your Badging Thing")
o = Organization.create(:host => "", :settings => {
  'name' => "Name Of Your Badging Thing", 
  'description' => "I just really like badging!",
  'twitter_login' => true,
  'url' => '',
  'image' => '',
  'email' => ''

# to create an LTI configuration by hand, do the following
require './canvabadges.rb'
#  create a new LTI configuration
conf = ExternalConfig.generate("My Magic LTI Config")
#  print out the results
puts "key:    #{conf.value}"
puts "secret: #{conf.shared_secret}"

# now start up your server

Note that in a production environment you'll also need to set the SESSION_KEY environment variable or you'll get errors on boot.


If you've been running Canvabadges for a little while, we've made a minor change that will affect you. We have separated the badge configuration settings from badge completion settings, making it possible for two courses to use the same badge. This adds a lot of flexibility and will fix an unexpected error with large badge URLs (i.e. data-uri), so I'd suggest you get to a console and run the following command after updating your code:


It may take a little while to run depending on how many badges you've got set up already.

Advanced Settings


Canvabadges by default only talks to one instance of Canvas. It's possible for it to talk to multiple instances, it just takes an additional step.

Multitenancy is set at the organization level. An organization can have multiple domains (each has a corresponding object). On the organization object if you make the following change:

org = Organization.find(:name => "whatever it's called")
settings = org.settings
settings['oss_oauth'] = true
org.settings = settings

Then the organzation will be set up to use its own configuration. Now we need to add a Canvas developer key. Ask the Canvas admin -- if that's you, you can create a new developer key by logging in as a site admin and going to https://<yourcanvas>/developer_keys and creating one. You can use the image at https://<canvabadges>/logo.png as the developer key image. For the redirect URI enter https://<canvabadges>/oauth_success. Then in Canvabadges run the following code:

ec = => 'canvas_oss_oauth', :organization_id =>
ec.app_name = "Name for Canvas Instance"
ec.value = "<developer key id>"
ec.shared_secret = "<developer key secret>"

Getting Your Canvas Working with

This gets asked of me enough that I figured I should just write it down for everyone's benefit. If you are the owner of a Canvas instance and you don't want to run your own Canvabadges instance, you have a couple options for getting it to play nice with the instance.

  1. Point a subdomain you own to You would create a DNS CNAME to do this. Since Canvabadges requires SSL you'll have to generate an SSL cert for your subdomain and share it with me (@whitmer). Canvabadges runs in heroku, and I have to configure it to pick up your subdomain, but that means I need the actual certs. This lets you "own" your badges long-term since you control the subdomain, but the cert thing is usually a show-stopper for most sysadmins (justifiably so).

  2. Settle for a branded subdirectory. You can own (where you pick "something") without getting too crazy. The badge certificates will stay on so you won't control your own destiny, but if that's not a huge issue then all I need is:

  • a developer key as specified in the Multitenancy section (not required if you're in Instructure's cloud)
  • the domain of your Canvas instance
  • a 90x90 px image for your organization
  • a URL for your organization's home page

Once you're ready just ping me (@whitmer).

  1. Run your own instance of Canvabadges. It's a Sinatra app and not too complicated, you should hopefully be able to get it up pretty easily. Then you can put it on whatever domain/subdomain you like and you never have to tell me any of your secrets.


  • Per-badge option to auto-publish
  • Shared pool of badges for entire organization
  • API for querying for things like leaderboards
  • Way for admins to manually modify specific badge issuances

Build Status