To client or… to server?

The hard choice we all face at least once a day. Any frontend dev will tell you.. wait they’ll just not tell you, they’ll just do a array.filter().filter().filter().map().map().reverse(). And like any backend dev will tell you.. ‘Why do they even need that?’.

The problem with sorting lists and transforming objects on the client is that your client has to do the work themselves. It is their computer that has to compute all your lousy n^5 algorithms. This might not be a problem on your dev server running 64 gigs of RAM, a brand new RTX 4090 and your 18 CPU-cores. But anyone with a parent that holds upwards of 50 tabs open at a time knows computers run slow. Even relatively new ones. Moving code execution to the server you could provision your own machines to do all that work your data model forced you to do. It’s not even your fault, it’s the product people. Why don’t they just know what the solution will be a couple years later? Pff..

We use Electron as a Javascript framework to create good-looking user interfaces. It runs as a desktopp app, which is exactly what we need. We don’t want an open browser in our MagicMirror. Since our solution lives 100% server-side, in the sense that it won’t run on a customers device, we still need to make use of the Client-Server architecture. We need to keep our asynchronous logic seperated from the frontend due to the architecture imposed on us by choosing to work with something open-source. Now, to stream videos, make API calls and the likes, we need to do this… vanilla! (yeah I’m talking vanilla javascript man it ain’t easy). So how can we make it easier for our selves? Well, we can leverage the websocket-connection between the somewhat-empty functionality of the DOM and the more powerful server side that can use node modules. Because our frontend and backend are sat up with a web socket we can transmit events with payloads in order to do compute and return the computed.

Our frontend can send events to our backend:

Our backend receives this message:

And do the necessary compute and return a new event:

Which our client can pick back up and do logic based off of:

Notice the updateDom function, which runs our conditional getDom function that in effect updates the document.

Giving businesses a (Power) platform

Since many of the business owners of Diagon Alley spend most of the days on their feet in the store, they require a working solution that is easy to use and accessible wherever they might be. Because of this, we have decided to give them different possible solution within the Power Platform. Power Page for customer interaction, Power Automate to help reducing time demanding tasks and a data driven Power App that fit perfectly on a small Teams application on a store-owners cellphone.

Automating the office work

The daily-to-day operations of any business is to make sure there always is enough of their products, and making sure they always are stocked. To help the owners keep the supplies under control, we developed an Power Automate flow that would help them generate an Supplier Agreement contract in SharePoint.

The initial thought was to create a content type on a document library that would inherit metadata properties from the SharePoint columns and automatically fill inn the SharePoint property fields and thereby create a valid contract.

Unfortunately, this require that we edit the template locally, but we are working on computers with a safety policy that doesn’t allow us to connect to this fields when they are in another tenant. Still, we found a solution by downloading an empty document from the library, populate the fields quick parts connected to the document properties and re-upload this to the library. This allowed us to generate the agreement anyway, by using a Power Automate flow that populated the documents quick part fields.

Oh my search!

I remember learning about Elasticsearch for the first time. I still don’t know it.

But I do know how to make a algorithm. And I do know how to use OpenAI. I’ve made embeddings before, but never did I think to try and find an animal based on your own photo.

In our MagicMirror you can send your son or daughter when they start Hogwarts. Not sure which school animal they want to keep? No problem! We’ve got you covered. Evaluating you we can find the animal that will suit you best. But if you’re not happy, no worries! Our algorithm isn’t 100% deterministic, so let it do a second rating and see if you get the same or again or if you indeed should have been with another animal.

This is the part of our solution I am talking about right now. It is the part where you step into the mirror, some code is ran – and voilà – you have found your companion for the coming years.

What a way to search huh? Using your own image?

Where do we find the animals to pair you with?

Naturally, our solution can’t know of real(magical)-life animals. It can only know what we tell it exists. Therefore we have integrated with a database from https://harrypotter.fandom.com. It finds the animals, and we pair that data up with animal-illustrations coming from a wide range of websites (gifs). This way you can even see your own little one moving around the screen there with you.

Claiming the Embedding Numbnut and Retro Badge

Hackathons challenge us to think outside the box, and our project brought together modern innovation and retro charm. We’re claiming two badges that perfectly showcase this fusion: Embedding Numbnut and Reto Badge. Here’s how we earned them!

🪞 Embedding Numbnut

When you think of “embedding,” your mind might go straight to software and APIs. But why stop there? We decided to embed technology into a physical object: a mirror.

  • What We Did:
    • We started by building a physical frame for our smart mirror, creating a seamless combination of form and function.
    • Behind the reflective surface lies a digital interface, powered by a screen and fancy software. The result? A fully interactive experience that combines the elegance of a mirror with the power of modern technology.
    • This transformation – taking a humble, everyday object and embedding it with a rich digital experience – redefines what it means to “embed.”
Behold the mighty mirror of Noitceles. Note the QR code, its mentioned below!

Our smart mirror isn’t just tech slapped onto a frame; it’s a deeply integrated design that blurs the line between physical and digital.

🕰️ Reto Badge

Every great innovation owes something to the past, and our project embraces retro technology in creative ways:

  • The Mirror:
    • Mirrors are an ancient invention, going back thousands of years. By using this timeless object as the foundation of our tech project, we brought a sense of history into the digital age.
  • Retro Tools in Modern Tech:
    • We used jQuery on Power Pages to manage interactive elements. Sure, jQuery might feel like a blast from 2013, but it proved to be a reliable and efficient choice for this project.
    • Our project also includes QR code generation, another nostalgic yet practical feature that bridges past trends with current functionality.
Oh the jQuery

By blending modern capabilities with retro technologies, we’ve crafted a project that feels both forward-thinking and delightfully old-school.

Elevating Diagon Alley

The Diagon Alley is the center of wizarding London, offering an assortment of restaurants, shops, and other services that are necessary for all magic people. To make sure this alley and everything in it is hidden from the muggle world, there have been taken steps to make it easier to hide. The streets are narrow, the buildings are small and the stores often have very few employees.

This means that there is usually very crowded in the alley and, particularly before the start of a new school year at Hogwarts, the stores are full of wizards and witches of every age. As a result, the shopping experience is not very comfortable as the lines are long, the stores are crowded and the staff is overworked.

This is where we come in. We want to help this magical world by improving the customer experience, increase the efficiency of the local businesses, expand the local economy and reducing unnecessary waste.

Improving the customer experience…

We want to create a solution that personalize and assist them in finding the equipment they need with less time spent waiting in lines. As a way of doing this we plan to create a “magic” mirror they can use while shopping that connects to their online profile and gives a visualization of their shopping list, personal information and other useful data.

… And moving the store lines to the cloud

As a way to improve the efficiency of the local businesses, we want to create a solution that reduces the time customers spend in the store. By creating a personalized profile for customers and give them the possibility of  ordering their equipment ahead of their visit, the customer service will be faster and allow the workers to focus on other tasks. This will also give valuable data the businesses can use to improve their income by adding modules for marketing or following up customers.

Digitalizing the magic

The target group for our business model is the local businesses of Diagon Alley, and the main product is a solution for customer relationship and marketing built using Dynamics and the Power Platform. This also makes Dataverse a natural choice as a database due to the built-in connections and easy setup, and easily synchronize data between users and businesses.

To improve the business value, there will be possible for the businesses to expand the solution by adding modules for additional customer interaction and marketing functionality. In addition, it will be possible to buy a smart mirror that allows customer to directly interact with their personal profile. This mirror is driven by a Raspberry Pi that recognizes the customer by using Azure AI Services, retrieves the customers data and displays it within the mirror.

Tubi or not to be – that is our solution

Link to our user journey is beautifully displayed on behance:
https://www.behance.net/gallery/190650075/Tubi

Demo of our solution

Our solution is built from multiple services and components. Our frontend is built with NodeJS and React with Typescript and SASS. These technologies make the user experience feel seamless and super quick in the browser.

The flow of the system starts with a user uploading their order request in our React frontend form which is then stored in our Azure Storage account. The plumbers receives the order and can start planning!

Only one click away, our customized Azure Custom Vision model is up-to-date on bathroom floor plans and maps out the coordinates of the different plumbing fixtures, sparing the plumber of tedious work.

Then, our custom made Azure Function App backend in C# Asp.net plans the piping based on the coordinates from the AI model, and draws the piping layout. The backend API then returns the piped-up floor plan to the frontend, drawing hot water and cold water pipes according to each of the bathroom components needs. The backend also calculates the equipment needed to build the bathroom, and provides a list of required equipment for the project. It also calculates a total project cost. Both the piping supplies and floor plan is saved in our Azure Blob Storage.

Because of this, the people working in the back office have instant interactive reports available to help them with filing and billing through Power BI.

The components of our architecture

It’s a wrap!

We had an amazing time at the Arctic Cloud Developer Challenge (ACDC) hackathon! Our team was so happy to work on a project that was both fun and challenging. We were able to create a plumbing planning system that was not only functional but also visually appealing

The judges were a group of highly experienced and knowledgeable people who were passionate about technology and innovation. We were impressed by their expertise and the valuable feedback they provided.

Overall, the ACDC hackathon was an incredible experience, and we learned a lot from it. We are grateful for the opportunity to participate and showcase our skills. We look forward to participating in future hackathons and continuing to develop our technical abilities!

Glossy Pixels + Mario badge + Chameleon

Before the hackathon we used some hours doing research, which included doing use research. Sofie on our team had experienced that renovating a bathroom includes a lot of back and forth between plumber, carpenter, project manager and several other people. It took more time then it needed to, to finish the bathroom due to bad communication, jo flere kokker, jo mere søl/Too many cooks spoil the broth.

We talked to two amazing plumbers, first asking a random question:

They, and their colleagues wanted:
– A pipe planner for when they renovate a bathroom
– Supply list with which pipes and other equipment
– Pipe (hehe)line for all the workers including in building a bathroom

Sofie wanted:
– Certificate of completion automatically …

We hade several calls with them before and during the hackathon, they gave us invaluable information and insight, and they have evaluated our solution each day.

This is our user journey

And of course, here is the user journey translated to Super Mario (please zoome in)
user journey mario

Late last night, after a couple of beers we finally found the perfect name for our plumber solution! Say hello to Tubi! We made a logo we are happy with, short and sweet!

Using Microsoft UI components, with a dash of Super Mario sprinkles on top, the UI is done.

Since this blog isn’t the best medium to showcase the design, please check it out at Behance

Feature bonanza

We’re claiming the feature bombing badge!

Our main page is packed with awesome features:

  • Floor plan image upload
  • Analyze image by using AI to detect the different components and generate hot and cold water piping (2 features in 1!)
  • Approve floor plan (sets the piping suggestion to: accepted)
  • Fetch order list based on piping suggestion (automatically)
  • Accept project (assign project to me)