A little while back I blogged about an accomplishments system that Stuart Langridge and I designed when he came to visit a while back. The idea was simple: a de-centralized system in which we can easily define different types of accomplishments (e.g. filing a bug, submitting a patch, getting a patch sponsored, translating a string) and a means in which users can be rewarded trophies for these accomplishments as well as discovering new accomplishments and how they can be achieved.
The nice thing about the system we designed is that it is de-centralized, it uses Ubuntu One as a transport mechanism (which means we don’t have to build our own transport system and your trophies are visible across all your Ubuntu machines), and the system has a verification process to ensure that people can’t fake their community accomplishments.
I wrote this all up into a spec which you can find here.
We had an interesting session about this topic at UDS and Stuart put together a draft implementation which is at
lp:~sil/+junk/libaccom-draft/. The implementation defines a set of sample accomplishments and provides a daemon that runs to maintain state on which accomplishments have been achieved and which are still yet to be completed. The system is neatly integrated into Ubuntu and accomplishments are displayed in a notify-osd bubble:
Stuart also wrote a small API (
libaccomplishment) that client apps can use to query the system and present trophies achieved or those yet to be achieved. You can read more about this draft implementation here.
In the original spec there are two clients that would be in the system. A lens:
…and a helper app that is loaded when you click on a trophy in the lens which can provide more information about an accomplishment as well as showing the list of achieved accomplishments and those yet to achieve:
This weekend I decided to start writing this helper app (Michael Hall has expressed an interest in writing the lens). To get things rolling I wanted to display the list of trophies that have been accomplished. It looks like this so far:
This app is using the
libaccomplishment API that Stuart provided in his draft implementation and this code could obviously used to develop the lens. There is obviously still lots to build into the app, but it provides a useful proof-of-concept for how it could work. This is a Quickly project and you can grab the code from
If you want to play with this, grab Stuart’s draft implementation (
lp:~sil/+junk/libaccom-draft/) and run
examples/demo.sh – this will start the daemon. You can then grab my branch (
lp:~jonobacon/junk/trophyinfo) and run
quickly run and see the trophies in the view.
Everything so far has been something of a proof of concept, but I wanted to see if anyone else was interested in participating. There are a number of things that we need to do:
- Stuart’s draft implementation needs extending, and he would like to find a new owner for it. Currently the API is simple but might need fleshing out further.
- The helper app here that I created a first cut of needs expanding and functionality added. We need to provide different ways of filtering the trophies, providing information about a specific trophy and how to achieve it, and the other features outlined in the spec.
- Each accomplishment has a script that is run to see if you achieved something (e.g. if you filed a bug in Launchpad). In the spec, when one of these scripts returns that you accomplished the task, it creates a trophy, and syncs it via Ubuntu One to a validation server which runs the same script to verify you really did achieve the accomplishment. This then signs the trophy which then syncs back to your machine. We need someone to build this verification service.
- We need to evaluate and extend the .accomplishment format to include documentation for how to achieve a trophy. I know Jim Campbell expressed an interest in working on this and I would love to encourage others to participate too.
- We need to create a library of Ubuntu Community accomplishments. Stuart’s draft implementation includes an example script for filing a bug. See the list of ideas that Daniel has been working on.
Anyone interested in taking part?
Since I posted this I have made a bunch of improvements to the helper app. This includes:
- The app now displays trophies achieved on the My Trophies page and those not yet achieved on the Opportunities page.
- Locked trophies (i.e. those that need another trophy to be accomplished before it can be) now use a different icon (we will need new icons for all of these, so I am using stock icons right now).
- Trophy/opportunities status is now updated with each page load which means that trophies are updated more dynamically.
- Double-clicking an opportunities will take you to the WebKit page to display info about it. I just need to update the .accomplishment scheme to provide more useful info.
I pushed all these updated to
lp:~jonobacon/junk/trophyinfo if you want to play with it.