Paavo Karppinen

Ambitious Software Developer

Picture of myself

University of Jyväskylä, 2018-2024
Bachelor and Master of Science
Grade: 4/5
Major: Mathematical Information Technology (Computer Science)
Specialisation: Specialisation in Software and Telecommunication Technology
Minor: Basics of Human Resource Management
Master's Thesis: Project management of software development projects during the COVID-19 pandemic, grade: 4/5

Jamk University of Applied Sciences, 2025-, (149/240 cr)
Bachelor of Engineering
Major: Electrical and Automation Engineering
Orientation: Automation Engineering

I am a Master of Science in Computer Science from University of Jyväskylä. I would describe myself as an analytical person, I like try to figure out how different systems are built from the information that is just plainly available to me. I like solving problems and I would argue that I'm very good at it. On two uni courses, Continuous Software Engineering and Software Project, it has dawned on me how much I know when comparing to my fellow students. I've also been complimented on my intelligence/knowledge on these courses, especially the latter one.

I have strong programming skills via multiple courses and I also possess a C# certificate by the name of "Foundational C# with Microsoft". The certificate is by freeCodeCamp in collaboration with Microsoft. I also have experience with project work from courses Team & Client and Software Project. The former was a course where I was part of a five-member student team to design an event geared towards tertiary education students. On this project I was on a leadership role with a second member and at the end of the project, my work was praised. The second project was a project where I was the project manager as part of, again, a five-member student team, but this project was a software development one. At the end of the project, the instructor from the university's side praised my leadership. My master's thesis topic was software development project management during COVID-19 pandemic, and for the thesis, I needed to research project management methods used in software engineering. From this research I have a solid knowledge of agile methods and more specifically Scrum. I completed my military service as a leader, and my evaluation in the end was very good.

My interest is first and foremost software development but I do want to work in managerial positions in the future. I am also interested in Machine Learning, and I've started to deepen my knowledge on creating machine learning models.

Skills

Below you can see my skills or technologies that I have used in some capacity. My strongest tech stack is .NET/C#/SQL for backend, while frontend is possible with React or Blazor for web apps, and then .NET MAUI or WPF for desktop applications.

Programming languages
  • C#
  • JavaScript
  • TypeScript
  • Python
  • Java
Frameworks
  • (ASP).NET
  • Express
  • NodeJS
  • Blazor
  • React
  • React Native
  • Next.js
Data storage
  • SQL
  • SQL Server
  • MongoDB
  • Azure Cosmos DB for NoSQL
  • Azure Blob Storage
Project management
  • Leadership
  • Agile
  • Scrum
  • Kanban
  • ScrumBan
  • Jira
Embedded systems
  • Arduino
  • CircuitPython

Web development

I started my React journey with the open Full Stack course from University of Helsinki. I did the mandatory 1-5 parts and don top of those, I did parts 8-10, so TypeScript is a skill of mine. React Redux (Full Stack course part 6) has become familiar to me via my own apps. I've also utilised a UI library in Material UI. Using React is familiar to me, and I'm capable of making beautiful user interfaces. Next.js is my most recent escapade with React. Although, I've only done the Vercel Next.js tutorial. Based on the tutorial, understanding Next.js is of no issue to me, it reminds me a lot of Blazor Server as they both have a similar base idea. Compared with React, Blazor is a newer UI tech to me. I started my Blazor journey with YouTube tutorials, and afterwards, I have built multiple of my own projects with it. From this Blazor experience, I can see, for what kind of applications it is suitable and what it is not. With Blazor, I've used Fluent UI, a component library by Microsoft. Combining Blazor and Fluent UI, I've learned to make great and responsive user interfaces.

CI/CD

In regards to Continuous Integration/Continuous Development, I've completed the course "Continuous Software Engineering" course at University of Jyväskylä, which was also called the DevOps-couse by the course's teachers. On the course we utilised Azure and GitLab to deploy a web application to a container on Azure. On my own applications I've used GitHub Actions to deployt apps to Azure. On the Continous Software Engineering -course it became clear to me what is included in CI/CD in terms of development and the operational side of it.

Embedded systems

I've learned about embedded systems on a few courses from Kokkola university center. The courses from them I've completed are subject-level course "Introduction to embedded systems" and two advanced-level courses "Telecommunications of IoT-devices" and "Embedded internet" (rough translation from Finnish "Sulautettu internet"). All these courses I completed with a grade of at least 4 (on a scale of 1-5, 5 being the best grade). On two of these courses, Arduino was used and on the last mentioned course, I used a real Arduino unit with WiFi and different sensors. On this course also, we learned how to send data from the device to a cloud service (asksensors). On my own, I have looked into CircuitPython. While I haven't created anythin useful yet, I possess the capabilities to develop embedded software using that and by extension Python. At Jamk, I have learned valuable information on electrical engineering where I have been able to strengthen my abilities to work as an embedded systems engineer.

Project management

In terms of project management, I was the project manager in Unversity of Jyväskylä's Software Project -course. I've also completed the course "Project management". The supervisor on Software Project -course complimented my actions as project manager saying how I was always on top of what the team was doing. I used Jira on this project to manage the teams tasks.

Projects

In this section you can read my projects that I have done on my free time. They are heavily skewed to web applications where many of these projects include a .NET Web API. In most of my projects, I use SQL Server where I write the SQL statements myself. Some projects also include a document-based database, in which case my current choice is Cosmos DB. I have also used a local version of Azure Blob storage to store files (mainly used for images).

I have made my own .NET project template where I structure a .NET Web API in a Clean Architecture structure. This API is set up with user authentication with JWTs. For user accounts, ASP.NET Core Identity is used. The API relies on ASP.NET's authentication middleware to decode the JWT that is sent in the Authorization header. The API is also set up to work with role-based authorization with multiple roles per user being possible. Using this API, users can set up 2FA as the API exposes endpoints for this (setup, validation, disabling). As per JWT setup, it includes short-lived access tokens with longer refresh tokens. Refresh tokens are saved with HybridCache currently, but the setup supports for easy transformation to save them in a database. After each update to the template, a NuGet package is automatically created in the GitHub repository.
This application uses a .NET Web API where the authentication setup is similar to the template project I have created. The premise of this application is that farm owners can assign farm managers that can manage a farm on their behalf. Only owners can add new managers to a farm. A farm contains multiple fields that it owns and cultivates, where the cultivated fields may not be the ones it owns (i.e. it rents the field from someone else). Field has cultivations linked to it where it is saved what was grown, and what was the result of the harvest (failed/succeeded, the yield amount). The API has role-checks in the sense that whether or not the user doing the action is permitted for it (owner of a farm, manager in the farm a field is cultivated on, etc.) This application includes integration with SignalR to notify users for management updates (added/removed as manager) as well as farm updates. SignalR is also used to stream LLM responses to the user's chat window. Speaking of which, the API integrates Semantic Kernel for LLM usage with support for function calling. Tech-wise, database used is SQL Server. The UI for this application is in a primitive stage with .NET MAUI. This MAUI application supports register, login, and 2FA setup. Also included is the main page where user's owned farms and managed farms are listed. From this main page, individual farm detail page is included with fields listing. In the main page, the user can also open the LLM chat popup/page (depending on the device used).
This is another web application where I utilised Blazor. The goal of this project was to create an application that would replicate the functionality of Discord. The functionality includes user registration and login. Registered users can then create new servers or join existing ones. The servers include default permissions, and given proper permissions, members can manage channels where members communicate with each other. Other permissions include managing roles (creation/deletion/editing of roles, managing role permissions). Proper permission having members can also update server info or kick members. The communication within servers (messages, server management) is created using SignalR for real-time usage. Members can send text messages or also include files. File saving is made with Azure Blob Storage (Azurite). The application also uses SQL Server for user and server-related objects, and Azure Cosmos DB for messages. I'm also using Hybrid Cache to reduce database calls. When it comes to the project structure, I practised Clean Architecture on .NET. I also practised using AI (GitHub Copilot Chat) in creation of non-essential features (REST API with JWT-based authentication).
My biggest project in the sense of moving parts is an IoT device status/management system. This system consists of a .NET Web API, a React UI for login and register, an Angular UI for the devices, Docker for containerisation, and Nginx for serving the different parts. Docker Compose is used to orchestrate the different containers. I use Identity for the user authentication. The user accounts are stored in an SQL Server database. I also have an Azure Cosmos DB for NoSQL in use. The API controller uses versioning with v1 using the SQL database for saving the devices as well as the user accounts, while v2 (which is the go-to version) user the Cosmos DB for saving the devices. I use Fluent UI in the React app, and PrimeNG in Angular. As the subject of the system is IoT devices, I use Azure IoT Hub as a mediator between the UI (API) and the device. The device-side software was created with PlatformIO. I use Microsoft's azure-iot-sdk-c for the IoT Hub communication, which uses MQTT for it. An Azure Function is used to detect events on the IoT Hub as soon as they arrive. The Function's role is to save the incoming sensor measurements to the database for the appropriate device. The user can send cloud-to-device commands from the UI. I created this project to learn some new skills, but mainly as a way to show, that I am capable of creating full systems like these.
Another project I worked on with Blazor was an IoT sensor dashboard/data visualisation app (akin to something like asksensors.com). Users first need to create an API key, and a sensor (or multiple) to be able to send data from their sensors. This app only receives data via a ReST API. Users can setup different charts to visualise the data with Apex Charts. Data can also be shown in a table form. The users can also setup email alerts based on what values their sent data gets (over/under certain value). Users can choose the threshold, email, and a custom message for the email. The app also supports binary data for the different data types. On this app, I've made a timer on the visualisations, so that whenever new data is uploaded, the user sees it, if they are on the page. I am using SQL Server for this app's database. For the database operations I utilise Dapper to write semi-complex SQL queries. For the app's UI, I use Fluent UI for the styling. This app is also available on Azure.
The first Blazor application's original meaning was for users to save information about the movies they've watched in a certain year. I improved the application at a later data to save wached TV series information. I also added a chat to chat with an AI model about films, or get recommendations based on the films they've watched, etc. Saved information includes the Director, Movie genre, name and release year and the year the user watched it. User can also write how they watched it (e.g. cinema, streaming and such) and also a Yes/No choice if they enjoyed the movie. As the application is done based on the Blazor template, I have configured 2FA for it and also external logins for GitHub, Google and Microsoft. I've also configured sending email for the confirmations. As the template included a Weather page, I decided to utilise this page to use the OpenWeatherMap API for user to search for a place to get a weather forecast. I am using SQL Server as the app's database. For the database operations I at first utilised Entity Framework, but later transitioned to writen SQL queries with Dapper. For the styling I am using Fluent UI. This app is also available on Azure.
Another application I've started working on as a hobby project is a social media app (like Bluesky and such). I chose to go with a .NET Web API for the backend and React for the frontend. For the authentication I went with token-based authentication with JWT bearer tokens. I wanted to replicate the Microsoft Identity providers for .NET, so I created my own version of their RoleManager, SignInManager, and UserManager (sort of). As for the frontend. I didn't want to rely on any ready-build component library like Fluent UI or Material UI, so I went with pure HTML and CSS. I wanted to use a NoSQL database for this application, and as Azure Cosmos DB for NoSQL had come to my mind earlier in 2024, and later I got some theoretical knowledge of it, I wanted to utilise it in practice. I very much embraced the strengths of the database (in my opinion) as I utilise Patch operations for updating existing data, and its unique SQL-like queries. I also use a local installation for Azure Blob Storage (Azurite) for saving and displaying images. The app still has some work around it, but it really showcases that I am capable of creating Full Stack applications from scratch, and it shows how far I've come since I first started web application development.
Apex Legends project
The first React-based application is meant for users to save their personal statistics from the videogame Apex Legends. It uses a .NET backend that is a ReST interface. User authentication is done with JWT. The app utilises Refresh Tokens to better secure the application with shorter Tokens and as long as the user visits the website when they left it logged in within a week, a new Token is generated. After a week, user is signed out upon visiting the website. The Profile page in this application has password change form and it shows aggregate data about the stats they've saved. I am using MongoDB as the app's database. For styling I am using Material UI.

Contact me

Send message
An unhandled error has occurred. Reload 🗙