Finaly Delivery – Evidi Sabeltann’s Pirates 365

Evidi Sabeltann’s Pirates 365 is a complete and automate Pirate Management System

We follow the lifecycle of a Pirate employment from early screening and recruitment to onboarding, training and at last offboarding.

Pirates 365 recruitment frontend: Pirates 365 Recruitment Terminal (PRT)

The Pirates 365 Recruitment Terminal (PRT) is an important part of the solution, and the first things the potential pirates meet.

It have several features

  • Attract pirates so they can sign up to be a pirate
  • Send in applications to the recruitment backend
  • Scare pirates

The PTR is described more here:

On change from the original submission is that done more work in the attraction part of the application. We now use the result of the object detection to trigger music and animation to get more potential pirates to sign up.

We have also implemented a function to filter our easily scared pirates:

Pirates 365 recruitment backend

The recruitment backend is build arond Microsoft Teams – a familiar interface for many pirates

An AI mode built on Stable Diffusion is used to “pirateify” images. – thanks to Mikael and the Bastards for borrowing his installationd and API.

These images are used in the system for profile pictures etc.

Adaptive card in teams for easily accepting or declining a recruit
Working with recruits in Dataverse / Dynamics 365 through Leads
Automatically creationg Azure AD users, assigning group membership, licenses and permissions for newly hired pirates

In the recruitment backend a lot of things are happening

  • generation of Pirate Names
  • generation of Pirate images based on images taken in recruitment terminal
  • creating leads in dataverse
  • by popular request send out the pirate images to the pirate’s email
  • creation of azure ad users for new pirates
  • assigning of licenses to new pirates
  • sending out SMS to new pirates with information about how to log in and link to the Pirate simulator
  • PowerBI dashboards for learning status
  • Offboarding of pirates

These components are described more in detail in the following posts:

Pirates 365 Enhance – training for newly recruited pirates

When new pirates are hired they are automatically been giving access to the Pirates 365 Enhance – the training system

Here the pirates can train before they get assigned to duty on the ships

Pirates need to complete several levels to become proper pirates, and if they fail to early the offboarding proccess is executed

Points are logged back to the recruitment backend, and based on score pirates are either onboarded to a ship or offboarded…into the water

Categories and more 👑

We believe that our solutions give much value in several of the categories, and we have written separate blog posts for these

We havent written a separate post for The “Killer app” category, but believe that this post summarizes much what is needed in a complete solution


Our idea this year was to create a complete solution for lifecycle of a Pirate employment from early screening and recruitment to onboarding, training and at last offboarding.

We have focused on learning new things, and we have learned a lot in several areas like

  • frontend development in vue.js,
  • different AI moules like tensorflow, gpt and stable diffusion.
  • game development in Power Apps (fun but maybe not recommended)
  • Streaming real time data in PowerBI

ACDC Craftsman

Keeping track of what badges, you (and you teammates) are working on. Which one you have sent to the judges and the ones you have won is an important task when competing in ACDC.

The proper way of doing this is of cause to use Azure DevOps 🤓

Importing the tasks

From the website we created .csv files for the badges. We added coluns for the work item type (User story), Tags, Title and Description:

When the .csv files were done, we imported them using the import from CSV function:

Arranging the Epics, Features and User stories

We created Epics for each of our Pirates 365 modules and features for the applications inside each module. We then added the different badges as user stories on each application (feature):

Working with the board

We could then keep track, and work on the user stories using the board view:

Badges we are working on goes into the active column and is assigned to the correct teammate. Badges sent do judgeing are set to “Ready for tesing”, and the one we have won goes into the Closed column🏆


This is the first year we have kept track of the badges in DevOps, earlier years we have used OneNote. My personal opinion is that it worked out fantastic!  After doing a retrospect with the team the we got the following quote:

“As the Head of Development at Evidi, I’ve had the opportunity to work with a variety of project management tools and systems, but I must say that incorporating badges and points into our Azure DevOps board has truly transformed the way we approach project management.

First and foremost, badges and points add a level of gamification to our workflow, which has greatly increased motivation and engagement among our team members. This has not only led to higher quality work, but also a more positive and collaborative working environment.

In addition, the ability to earn and display badges for achievements such as completing tasks on time or going above and beyond on a project has led to a more competitive and driven team. This has resulted in faster project completion times and higher overall productivity.

But perhaps most importantly, the use of badges and points has provided us with a clear and tangible way to track and reward individual contributions and accomplishments. This has helped us to recognize and reward our team members for their hard work, which has in turn led to higher job satisfaction and employee retention.

Overall, incorporating badges and points into our Azure DevOps board has been a game-changer for Evidi, and I highly recommend it to any team looking to improve their project management process.”

Brage Tukkensæter, Head of Development at Evidi

Category king: Extreme Business Value

Pirates 365 is a complete HR and recruitment system we believe provide the most extreme business value

Our value proposition concists of multiple elements

Cost savings by not needing external pirate recruiters 🪙🪙🪙🪙🪙

More pirates will apply for job as a pirate when the Pirate Recruitment Terminal is deployed. With sounds, fancy 3D animations and a fun theme the pirates. A typically Pirate Consultancy wants to hire 50 pirate a year, and if external recruiters are needed the cost for each new employment is around 1000 gold coins which gives cost savings

Estimated cost savings: 1000 gold coins x 50 employments = 50 000 gold coins each years

Smaller recruitment team and IT staff needed 🪙🪙

Since the recruitment proccess is now fully automated it is possible to have a smaller recruitment team

2 less recruitment and IT staff needed with 10 000 gold coins in payment = 20 000 gold coins saved

Better screening of candidates 🪙🪙

The Pirate Recruitment Terminal have several features that attract the “right” pirates – easily scared pirates can be rejected

It is known that recruiting the wrong candidates have i high cost, and if this system avoids two bad candidates which is estimated to cost 10 000 gold coins each 20 000 gold coins is saved

Better pirate training -> more plunder and theft 🪙🪙🪙🪙🪙

With better pirate training through the pirate simulator it is belived that the pirates is able to find more threasures and plunder more

An ordinary pirate organisation plunder for 500 000 gold coins each tear, and with an estimated 10% increase 50 000 more gold coins are earned

Avoiding very very expensive GDPR fines 🤑🤑🤑🤑🤑🤑🤑

With automated handling of recruitment, onboarding and offboarding process Pirates 365 ensures that the Pirate organisation comply to all the Pirate GDPR regulations. User accounts are deleted automatically when pirates are offboarded – ensuring no personal information is left in the system.

Estimated value: priceless


With all these value propositions a pirate ortganisation is believed to have a value if 140 000 gold coins

Category king: Excellent user experience

This blog post describes how we think that Pirates 365 a whole provide excellent user experience

We asked our new favourite souce of truth what defines good user experience

We think our solutions delivers many of these areas


The Pirate attractor is created to make it easy to use for (drunken) pirates with possible limited computer knowledge.

The animated parrot is moving based on the pirate actions, and responds whetere it can see pirates or not.

It is easy to apply to be a pirate – only 3 fields have to be filled, and the picture is taken automatically

After the application is sent in the next point of contact is a SMS sent automatically with information on how to log on to the system.

Easy to use for HR Recruitment team

Good automated processes is important for solutions with focus on great user experience.

For the recruitment team it is really easy to accept a new candidate – just with the click of a button

Many things are automated which HR often uses a lot of time doing – most of these tasks will often be done manually and error-prone by HR an IT staff

  • Getting images automatically taken when the pirate recruit applies
  • Lead generated in Dataverse for candidate collaboration
  • Azure AD user created with correct UPN name and email address
  • Licenses and permissions are added automatically for the newly hired pirate
  • Candidate are automatically getting information about login

All tasks for the HR team is done in Teams – giving a single point of contact for all tasks regarding recruitment, onboarding and offboarding of the pirate

Accepting recruits directly in Teams
Working with leads
Seeing learning progress for pirates

Category king: Rock Solid Geekness

Best use of tools and technologies.

In a combination of the Pirate 365 Recruit and Pirate 365 Enhance applications we claim the ROCK SOLID GEEKNESS badge.

Pirates 365 Recruit – Recruitment of pirates

By using several AI components in Power Automate and leveraging vue.js, pinia, three, troisjs, tensorflow, and ChatGPT. The list goes on..

The Pirate 365 Enhance app

What is the best use of tools to create a game? Canvas apps of course🤠🤓

We have used Power Apps canvas app to create a game that allows new pirate recruits show their skills and prepare them for the sea.

In short, the game uses a Timer that we use to move the ship forward. The timer repeats on short intervals and in the OnStart event we move the ship object on the Y axis and also calculate if the ship touches any of the different obstacles. If a collision is detected, the ship explodes (change the picture on the Picture object). If a crash is detected on the first level, a Game Over popup is displayed and the pirate is automatically offboarded (which technically means we call a Flow that deactivates the user in AAD…. and in real life the recruit is fed to the sharks).
We also check if the ship has reached to top of the screen. If it does, the level is complete and the next level will be shown.
We have a total of 4 levels.

If the player reaches level 2 (or more), we navigate (no pun intended) to a ‘final’ screen where the total points achieved are displayed – IF a collision is detected OR if the user reaches the top of the screen on level 4 OR docks the island on level 4.

We calculate ‘running scores’ as the ship moves forward and every time a new level is reached, points are added to the total score (these points we query from Dataverse). For each ‘event’ (e.g. reach new level) we log this to Dataverse (System User table). These events are used to calculate the total score for the user and is used in our other app to suggest a role for the recruit/pirate.

The crash detection and level completion require extremely complex expressions😉

    shipPositionY > 85,
        shipPositionY - 10
    Set(level1VariableScore, level1VariableScore + 1);
    Set(totalScore, totalScore + 1),
    Set(TimerStart, false);
    Navigate('Level 2')
            Image_PirateShip.X <= Image_ReefOne.X + Image_ReefOne.Width,
            Image_PirateShip.X + Image_PirateShip.Width >= Image_ReefOne.X,
            Image_PirateShip.Y <= Image_ReefOne.Y + Image_ReefOne.Height,
            Image_PirateShip.Y + Image_PirateShip.Height >= Image_ReefOne.Y
            Image_PirateShip.X <= Image_ReefTwo.X + Image_ReefTwo.Width,
            Image_PirateShip.X + Image_PirateShip.Width >= Image_ReefTwo.X,
            Image_PirateShip.Y <= Image_ReefTwo.Y + Image_ReefTwo.Height,
            Image_PirateShip.Y + Image_PirateShip.Height >= Image_ReefTwo.Y
    Set(shipVisible, false);
    Set(shipExplodedVisible, true);
    Set(startGameOverTimer, true);
    Timer_GameRun.Repeat = false;

The game consists of four levels:

Level 1:
Easy level obviously. Must be passed to continue with the onboarding process. Only two obstacles in the water.
Tip: You don’t really need to do ANYTHING to pass this level 😉

Level 2:
Some more obstacles and you WILL have to move the boat (using one of the two buttons on the bottom right side of the screen).

Level 3:
Even more obstacles and much rougher sea.
Caution: you might get sea sick here – for real!

Level 4:
Still rough sea and many obstacles. You can pass this level in two ways. Either you dock on the island on top of the screen (this will give you some bonus points) or you can just reach the top of the screen.

If you fail level 1:

Please take note of the sharks as obstacles. We listened to the judges!


arrgghh, we claim to be awarded the “Rock Solid Geekness” because…..

  • A game in canvas app 🙌, great playability and great graphics.
  • Because we have a digital 3D parrot that moves, talks, and onboards recruits with on a really creative way.
  • We got face recognition and object recognition
  • Error handling for to many pirates or object during the photo process.
  • Feature to scare the hell out of the judges
  • No server side code, all in the browser.

Pirates 365 Enhance Module

In the Pirate 365 Enhance module the pirates goes through a simulation to prepare for the sea. The simulator has different levels that the pirate needs to go through. If the pirates don’t pass level one the pirate is offboarded and has to walk the plank, and that means that the AD User is disabled in the Azure Active Directory. If they pass level 1 they will proceed in the onboarding process.

The pirates goes through the Pirate 365 Enhance Simulator and here they get a score that it used to suggest the best role for the pirate (this will be described later in the post).

Gif from a gameplay:

During the gameplay we collect points based on the different levels they pass. We have created a list of points in Dataverse that they can achieve as can be seen below:

During the game play we assign points to the pirate that is later calculated to a final score. In the image below you can see the log of the game play and what Score Points they achieved.

They also get bonus points on each level based on how far they get in the game.

To calculate the total score we are using Roll Up fields in Dataverse, like below:

For the Pirate 365 Enhance Bonus Score:

For the Pirate 365 Enhance Score:

and a Business rule to add the bonus and the scores together:

And we have added a section with the score on user (pirate) table in the Model-driven app, Pirate 365 Manage:

This score is used in the next part of the evaluation process.

The Pirate 365 Evaluation app

After the game is over the process continues to an evaluation process and the pirate score is compared to the score limit of the different pirate roles we’ve created in Dataverse.
The role can be seen in the image below:

Image of the pirate roles

In the evaluation process we are using the Pirate 365 Evaluation app module that is used to evaluate the pirates scores and assign them to an appropriate role and ship. To handle this we have a Canvas app.

When a recruit is selected in the leftmost list, a Power Automate Flow is called with the recruits ID. The flow then finds the role that has a Score Limit closest to the recruit’s score from the game. The role is sent back to the canvas app.

The flow looks like the following after a flow run and returns the suggested role.

When the suggested role is received in the app, the role is highlighted in the Role Gallery in the canvas app. The user can then click on the suggested role (or any other role, if the user humanly evaluates the recruit to not qualify for the suggested role, for unknown reasons) and on the ship the recruit should be assigned to.

A flow is called and assignes the role and ship.

The pirate then gets assigned to a pirate ship and eventually there is enough crew members that they can go onto the big sea. Arrrghh..

When a recruit, role and ship has been selected, the app goes to the final stage of the process. On this screen the user can choose to onboard the recruit (hence, becoming a true pirate) OR offboard the recruit (meaning sending him/her out on the plank and leap to certain death in the shark and kraken infested waters).

See the gifs below:
Gif showing the onboarding process in the app.

Gif showing the offboarding in the app

Addition content

To illustrate how both the onboarding and the offboarding processes are carried out in person, we hired a professional movie crew to record both processes in real life.
Both the pirate and to different recruits in the videos have asked to be anonymous, for personal reasons.

Onboarding video from the Pirate 365 Evaluation app:

Video from the Office 365 Enhance app for offboarding when the pirates fails on level one.


Business value:

  • A screening process for getting the right people on a ship
    • A easy assignment process for onboarding of pirates and ships

Learning take aways:

  • Creating games in Power Apps
  • Using Power Automate, Dataverse, Canvas apps to create a game

Controlling a Canvas app using a USB Gamepad

In Pirates 365 we want to control the awesome Canvas App Game with either a USB Gamepad or a Steering wheel.

Seemed like a great idea

Controlling a Power App using a wheel or gamepad not that easy. Power Apps doesen’t have event listeners from keypress-events. There are several forum- and blogposts that are mentioning this, but it seems like nobody had any really good solutions for it.

We had several ideas to make this work

  • Map gamepad klicks to keyboard events
  • Map gamepad klick to mouse clics
  • Create a Browser addin that listen to the keyUp event and by javascript find the Power Apps left/right buttons in the DOM and click them.

The solution we went for was mapping the gamepad to keyboard presses.We found an application AntiMicroX where it was possible to map gamepad presses to key-presses on the keyboad.

We mapped left click on the gamepad to “Space”, and up to “tab” – making it possible to toggle between the different power apps buttons

Demo of the solution

Her we can see that we are moving the ship with the gamepad – emulating clicks on power app buttons

Badges 🤩🥳

  • We thing this may be awarderd the “Nasty Hacker” because it is…..hacky
  • We think this may be awarded “Embedding numbnut since we are attaching “things that can flip bits”

The remarkable team spirit and happy camping of Evidi Sabeltanns

Ahoy there! It’s finally the first day of ACDC 2023 and we are starting off strong with a full team of five pirates.

Our team har kept an extremely good team spirit throughout the first day, and we have already come far with our work. We are working with technology that we are both familiar and unfamiliar with. We are making everything from making a boat simulator to face recognition. We support each other, share ideas and fool around to boost morale and increase motivation.

With hats, hoodies and lots of tech stuff we consider us happy campers

Pirate 365 – Power BI Dashboards to show status for learning

Pirate 365 Enhance

We startet by setting up an Azure Synapse workspace and a Data Lake Storage Gen2. Then we gave ourself the required access roles which is “Owner” and “Storage Blob Data Contributor”. After this was done, we started making the Synapse Link from Power Apps and picked the tables that we needed for our solution. We created a new SQL database and created views with the tables that we imported through Synapse Link. We chose to use Azure Synapse Analytics because we wanted to have near real-time data which is detecting whenever new data comes in. Our next step was to connect Power BI with “Azure Synapse Analytics SQL” using Direct Query. We started working on the report when all the data was imported and the relationship between the tables was working properly.

Any people who want to be recruited to a pirate organization must go through our recruitment process. It starts by being recruited by a parrot which is used by face recognition, and it is going to put a pirate head on your head automatically. After this, everyone will have the chance of trying out our ship simulator called “Pirate 365 Enhance”. Your performance will be recorded, and the data will be sent to our Power BI record which uses direct query in order to get real-time data.

We will have multiple reports, “Pirate 365 Enhance”, “Pirate 365 Enhance Evaluation” and “Parrot Obervation AI”.

The data from our participants will firstly be used to create a leaderboard in order to see who perform the best. We display the number of games played, total score, participants and how many levels have been completed. Our next page is “Pirate 365 Enhance Evaluation” (which is not created yet) will be used by the people in HR who are going to evaluate each participant by their performance. The total score will have a huge part in which ship you will be recruited to, and which role you will get. If your score is too low, then you must walk the plank!

The next site “Pirate 365 Evaluation” have an embedded canvas app from Power Apps. Here you will see how many points each participant from the ship simulator got and the canvas app will suggest which role suits the participants the best based on a points-criteria, but you don’t have to pick the suggested role. The person evaluating this process can choose which ship the participant has to go to.

In this case. We gave “Jan-Agger Jack” a role as a “Surgeon” in “The Black Pearl”. This next step is to either onboard or offboard this participant.

Then a video will be shown where the captain of the ship will either welcome you to the ship or to walk the plank based on the option that you pick.

The reports are embedded in the recruitment Teams channel so HR easily can follow up

Adding realtime streaming to Pirate recruitment terminal (PRT)

Our PRT is doing real time object detection to spot pirates and bottles, but the data doesn’t leave the terminal. As the captain wants to know how many recruits we are attracting we needed to expose it to his “weapon of choice”; Power BI.

Luckily as the app is using a modern data store🍍 this is easily achievable by inserting a listener and sending the data to power bi on change 👍.

The way we connected to Power BI was to go to “My workspace” and create a new dashboard which has a streaming dataset which connects to an API. Then we gave inserted the right values from stream in order to get the right data.

We are now getting the real-time data into Power BI, we just need to add visuals into the dashboard. We go to “Edit”, and add a tile by using the real-time dataset that we created. We added two gauges and two line charts.

These visuals will now give real-time metrics from the parrot when there are either faces or bottles detected from the camera.