An application for improving (application and project) skills of your teams through gamification.
It allows teams to self assess their skills and checks if they are reaching a specified ability level. If they reach a new ability level, they will be rewarded with a cool new Team Avatar, Level Rewards - like a virtual belt - and topic specific Badges. TeamDojo also calculates scores, based on specific skill, level and badge ranking/difficulty and ranks the teams by the amount of their achieved scores.
git clone https://github.com/otto-de/TeamDojo.git
cd TeamDojo/
First build a docker image by running:
./gradlew bootWar -Pprod -PnodeInstall jibDockerBuild
Then run:
docker-compose -f src/main/docker/app.yml up -d
The application will be available at http://localhost:8080
TeamDojo comes prefilled with some demo data. Log in with the default admin credentials: admin/teamdojo at http://localhost:8080/#/admin and change your organization Entities - Organization. It will be your navigation root node.
Next you would like to create some Dimensions your teams want to achieve skills for: Entities - Dimension. Examples could be Quality Assurance, Security, Operations, Architecture, ...
Teams are the users of TeamDojo. Here you can create them.
Entities - Team
- Name - The full Team name.
- Short Name - An acronym of the Team's name. It will be part of the REST URL.
- Picture - The Team's logo
- Team Slogan
- Team Contact Person
- Participations - Every Team can participate on one or more Dimensions.
Now you can specify maturity or ability Levels for these Dimensions. Each Level should contain n Skills - see next step.
A Level consists of the following settings:
Entities - Level
- Name - The level name. Judo belt ranks for example: yellow, orange, green, ...
- [OPTIONAL] Description of the level.
- A Picture to be shown. You can find some examples in examples/images/level. You can create your own icons, but for the best user experience get some help from some skilled UI/UX people.
- Required Score - A decimal value from 0 to 1. You can define how much percent of achieved skills are necessary to get this level. Default can be 1.0
- Skill Score Multiplier - A decimal value. Here you can specify how much bonus points the team can achieve with every skill of this level. Default can be 0.0. See Scoring System for more details.
- [OPTIONAL] Level Completion Bonus - A numeric value. How much bonus points the team can achieve with the completion of this level. See Scoring System for more details.
- Dimension - Every Level must be assigned to one dimension.
- [OPTIONAL] A level can depends on a previous level. E.g.: To reach Level 2, all skills of Level 2 and Level 1 must be completed.
While Level are the core of the maturity model, Badges can be used to push some specific skills or to reward well performing teams.
Entities - Badges
- Name - The badge name. Technology specific or cool names for skill subsets. E.g.: AWS Badge, Docker Master, Always-up-to-date Badge, Password Ninja, ...
- [OPTIONAL] Description of the badge.
- A Picture to be shown. You can find some examples in examples/images/badge. You can create your own icons, but for the best user experience get some help from some skilled UI/UX people.
- [NOT IMPLEMENTED] Available Until - not implemented yet.
- [NOT IMPLEMENTED] Available Amount - not implemented yet.
- Required Score - A decimal value from 0 to 1. You can define how much percent of achieved skills are necessary to get this badge. Default can be 1.0.
- Skill Score Multiplier - A decimal value. Here you can specify how much bonus points the team can achieve with every skill of this badge. Default can be 0.0. See Scoring System for more details.
- [OPTIONAL] Badge Completion Bonus - A numeric value. How much bonus points the team can gain with the completion of this badge. See Scoring System for more details.
- Dimensions - Every Badge can be assigned to one ore more Dimensions.
The core element of this framework. Teams can obtain skills.
Entities - Skill
- Skill Title - Short and significant.
- Description - Is part of the skill details. Why is this skill useful? Why should a team aim to obtain this skill?
- Implementation - How can the team achieve this skill? Hard facts to configure/implement/learn something.
- Validation - How can the team tell they have achieved this skill? Hard criteria.
- [OPTIONAL] Expiry Priod - For future development. A skill expires after a period of time.
- [OPTIONAL] Contact - A person with know how relevant for this skill.
- Score - With every achieved skill, a team gains scores. A default value could be 1 for every skill.
- [DO NOT TOUCH] Rate Score - Users can vote for a skill (1-5 stars). This value should not be set in the admin view.
- [DO NOT TOUCH] Rate Count - Users can vote for a skill (1-5 stars). This value should not be set in the admin view.
Every Skill should be assigned to at least one Level or Badge:
- Entities - Level Skills
- Entities - Badge Skills
Here you can specify which skills are necessary to obtain a specific Level or Badge.
If a team completes a skill, its score will be added to the team's score. With the Skill Score property you can value its costs / complexity / importance.
To honor the skill completion of specific levels or badges, you can adjust the Level/Badge Score Multiplier. Every completed Skill will add its skill score multiplied with the Score Multiplier. E.g.:
Skill: TLS everywhere; Score: 10
Badge: Encryption Master; Score Multiplier: 2
#Completion of TLS everywhere will resulting in:
10 (Skill Score)
+ 20 (Skill Score x Score Multiplier)
=> 30 Points
You can also reward the completion of levels and badges. Therefore you can gain bonus points with Level/Badge Completion Bonus. If the required percentage (Required Score) of skills for the Badge or Level is reached, the Completion Bonus will be added to the Team scores. E.g.:
Skill: TLS everywhere; Score: 10
Skill: Update your Systems; Score: 30
Level: Green; Required Score: 1.0; Level Completion Bonus: 100
#Completion of all skills will resulting in:
10 (Skill Score)
+ 30 (Skill Score)
+ 100 (Completion Bonus)
=> 140 Points
You can combine them of course:
Skill: TLS everywhere; Score: 10
Skill: Update your Systems; Score: 30
Level: Green; Required Score: 1.0; Score Multiplier: 1; Level Completion Bonus: 100
Badge: Encryption Master; Score Multiplier: 2
#Completion of all skills will resulting in:
10 (Skill Score)
+ 10 (Skill Score x Level Multiplier)
+ 20 (Skill Score x Badge Multiplier)
+ 30 (Skill Score)
+ 30 (Skill Score x Level Multiplier)
+ 100 (Level Completion Bonus)
=> 200 Points
For maximum transparency and accessibility there is no user / role concept. Everyone can see and change everything. An exception is the technical Administrator. He configures rarely changing data like teams, levels, skills, etc. to hide the internal complexity.
We believe that this tool helps software development teams to track where they are performing well and where they can become improve to build better software. Any additional complexity level - processes, login, role models - will result in a decreasing motivation to use yet another tool during your daily business.
The easiest way to hide your internal data are IP whitelists on network level. Host this tool in your internal network and let everyone use and see it.
If you really want any kind of authentication/authorization process, build it, push it back into this repository but make it optional.
The default admin credentials are: admin/teamdojo, configured in src/main/resources/config/liquibase/users.csv.
The secret for the "Remember me" Cookie is configured in src/main/resources/config/application-prod.yml.
Please change the password and secret in your production environment.
Here you can find the dev documentation.
Determining the status of a skill acquired by a Team was reworked.
A combination of data from the Skill and Teamskill entities are used in the determination of the status.
The fields used in calculating the status are "irrelevant" and "completedAt" (From the TeamSkill Entity) and "expiryPeriod" (from the Skill Entity).
In the context of a given Team, a skill is in the
OPEN Status - If the TeamSkill.completedAt field is not set (that is null) and TeamSkill.irrelevant is not true
IRRELEVANT status - If the TeamSkill.irrelevant field is set to true, notwithstanding the values of the other fields.
ACHIEVED status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true and the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) is later than the current date.
EXPIRING status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true, the current date is later than the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) but not later than a 7-days grace period.
EXPIRED status - If the TeamSkill.completedAt field is set and the TeamSkill.irrelevant is not true, the current date is later than the TeamSkill.completedAt plus the SKill.expiryPeriod (in days) and the 7-days grace period is past.
The corresponding skill status for a team is determined and set in the AchievableSkillDTO and passed as part of the JSON string on to the frontend.
At the frontend, the skillstatus information in the JSON-string from the backend is deserialized into a typescript object (SkillStatus enum in the IAchievableSkill Typescript type).
The Skillstatus information at the frontend is used to calculate the number of teams that have acquired a given skill, to display the status of a skill for a given team, to toggle status from one state to another.