Distributed Endorsements

Concept outline

Distributed Endorsements are peer-generated tags indicating a quality or skill of the earner. “Endorse” buttons can be included on any website. Visitors compelled to endorse, can specify one or more appropriate tag(s). The set of all endorsements received by an earner forms a necessarily fuzzy picture of their skills and qualities. Part of the idea here is a recognition that such things are inherently statistical. And that there is perhaps more power in numbers than in details.

Specifically, it could work as follows:

  • there are one or more badge issuers
  • people who want to include endorsement buttons embedded with the content on websites, sign up for a badge account with one of the issuers
  • issuer gives them an snippet of code for an ”endorse” button, which they can embed on their site(s).
  • when visitors click that button, it allows them to specify arbitrary endorsement tags (“python”, “management”, “inspiration”, “napoleon” etc.) through a small popup form
  • hitting enter submits those endorsement tags to the issuer API which generates the necessary JSON and stores it in the earners badge “backpack”

finer points:

  • IMHO the badge issuer should function more like a public key server – a public endorsement server.
    • one can upload their public key to many public key servers.
    • ultimately, these distributed endorsement servers could even be federated – ie, if i am registered with endorsement server A and you with server B,  it shouldn’t matter which one i ping to retrieve my credentials, as they have some kind of eventual consistency.


  • presumably there should be a way to prevent someone from giving a specific tag for a specific piece of content more than once. eg. by having endorsers sign, either with their email or a public key.
  • what if you disagree with an endorsement? can you delete an endorsement?

example json format (taken from Mozilla open badge assertions spec), one for each tag:

  "recipient": <sha256 hash of earner email, prepopulated>,
  "salt": <random word>,
  "evidence": <url where the endorsement button lives>,
  "issued_on": <today's date>,
  "badge": {
    "version": "0.5.0",
    "name": <user-generated tag>,
    "image": "/path/to/some/img.png",
    "description": "optional user-generated or default text",
    "criteria": "/endorsements/criteria",
    "issuer": {
      "origin": "http://issuer.endorsements.com",
      "name": "Distributed Endorsements Server",
      "contact": "admin@issuer.endorsements.com"

if a visitor to a site chose to elaborate on why they were assigning a given tag to the earner, that would be stored in the description field.