Welcome to Badge Lab Tutorial #89163. There are many like it, but this one is yours.
This tutorial assumes that you have your navigator badge and a rudimentary knowledge of JSON syntax.
In this tutorial, you will create your very own “hand-made” Open Badges Badge by constructing and linking together the mandatory parts of a badge, whose structure is diagrammed below.

Don’t worry about what each of these parts mean yet; that will be explained to you along the way. but you may want to occasionally refer back to the above diagram to understand how everything fits together.
Finally, this tutorial uses some built-in tools that make it quick and easy for you to play around with badge creation. However, the badge you create will only exist temporarily on the internet, so you shouldn’t use it to issue real badges. If you host your own website via a service like Dreamhost, however, you can use the skills learned here to make real badges and host them on your domain.
With that out of the way, let’s begin.
Issuer metadata contains information about you (or your organization). You only have to create this file once; all the badges you create will reference this file, so you don’t need to duplicate the information for every badge you issue.
Just visit http://badgelab.herokuapp.com/89163/issuer.json and paste in the following content:
{
"name": "YOUR NAME GOES HERE",
"url": "http://badgelab.herokuapp.com"
}
Feel free to change the value of name to anything you want. There are more optional fields you can add, too; see the IssuerOrganization documentation for more information.
Every badge needs a square PNG image less than 256K in size. Visit http://badgelab.herokuapp.com/89163/badge.png and upload one; if you don’t have one, consider using spacecat:

Alternatively, if you enjoy design and want to have a little fun, try out the Chicago Badge Studio.
This is just a page that explains the criteria for anyone who is awarded your badge.
Visit http://badgelab.herokuapp.com/89163/criteria.txt and type whatever criteria you want. Badges hosted on this site only allows text content to be on the criteria page for security purposes; when you host your own badges on your own domain, however, you’ll be able to set it to whatever HTML content you like.
A badge class is a type of badge rather than a specific instance of one. For instance, a badge class might be HTML Noob, while instances of the class might be the specific HTML Noob badges awarded to Lars and Jess.
Visit http://badgelab.herokuapp.com/89163/class.json and paste in the following content:
{
"name": "BADGE NAME GOES HERE",
"description": "ONE SENTENCE BADGE DESCRIPTION GOES HERE",
"image": "http://badgelab.herokuapp.com/89163/badge.png",
"criteria": "http://badgelab.herokuapp.com/89163/criteria.txt",
"issuer": "http://badgelab.herokuapp.com/89163/issuer.json"
}
Feel free to change the values of name and description to whatever you want. There are more optional fields you can add, too; see the BadgeClass documentation for more information.
Notice how the URLs you created in the previous steps are all linked-to by the badge class metadata. Open Badges tools like backpacks will follow these links to discover everything about your badge class.
To issue your badge to a specific person, you need to create instance metadata.
Visit http://badgelab.herokuapp.com/89163/1.json and paste in the following:
{
"uid": "89163#1",
"recipient": {
"type": "email",
"hashed": false,
"identity": "RECIPIENT@DOMAIN.COM"
},
"issuedOn": "2016-03-07T01:04:21.766Z",
"badge": "http://badgelab.herokuapp.com/89163/class.json",
"verify": {
"type": "hosted",
"url": "http://badgelab.herokuapp.com/89163/1.json"
}
}
You’ll want to change the value of recipient.identity to a real email address. There are more optional fields you can add, too; see the BadgeAssertion documentation for more information.
As you may have intuited, the JSON file you’ve just created is called a badge assertion. That’s because it signifies a domain owner’s assertion that an individual deserves a badge.
Issuing your badge to another user is as simple as creating another JSON file, for example at http://badgelab.herokuapp.com/89163/2.json, and dropping in slightly different metadata (specifically, changing uid, recipient.identity, and verify.url). There is no need to duplicate badge class information, since every instance points to the same badge class metadata URL.
At this point, you have essentially created your badge—you just need a way of giving it to the recipient. One way to do this is by “baking” the badge image by using a tool to hide the assertion URL inside a copy of the badge image. You can then give this baked badge to the recipient, who can upload the image to their backpack, or use it with other Open Badges tools.
To do this, just visit bakery.openbadges.org and paste in your assertion URL. It will give you back a PNG that looks just like your badge’s PNG, but contains your assertion URL hidden inside it. Just give this image to your recipient and make sure they know what to do with it.
Congratulations, you’ve just issued your first hand-made badge!