Portfolio

Picture of the author

SimpleChat

SimpleChatApp is a full-stack application that uses Elixir/Phoenix as an API framework. This app allows users to sign up, sign in, create new chats, and invite other users. However, there is currently no method for inviting users to existing chats, which needs to be implemented. Chatting is possible through Phoenix Channels and WebSockets, and users must be authorized to enter a chat.

WebSocket
ChakraUI
TypeScript
React
Phoenix
Elixir
Picture of the author

Portfolio

Portfolio's primary purpose is to showcase all of my notable projects and personal notes in one convenient location. It consists of mainly frontend websites and an API to publish new projects or project notes. The API is hidden behind two BasicAuth authentications, one for entering the form page and one for posting the form to the API. For storage, Supabase is used to serialize both images and objects. This application was crafted using the NextJS framework.

Tailwind
Docker
BasicAuth
Supabase
TypeScript
NextJS
Picture of the author

Manifest

A project containing all my Kubernetes manifest files I write to deploy my applications and database to my Kubernetes cluster. Additionally, it contains most configuration files for external plugins I have added to the cluster. All files are written in YAML format.

Database
ArgoCD
Grafana
Ingress
Kubernetes
YAML
Picture of the author

StunServer

StunServer is a STUN-server implemented to return your public IPv4-address when you send a STUN-request. It currently only accepts UDP-protocol messages, but TCP may be added later. StunServer parses and validates your request and returns an adequate response. Responses will either return your public IPv4-address or return a STUN error code. Currently only tested in Google Chrome and Firefox.

WebRTC
UDP
STUN
C++
Picture of the author

IssueBoard

IssueBoard is a web application made to store issues for projects in boards. Users are able to create their own boards or join groups for collaborative work. All members of the group are able to add new issue boards and invite new members to that group. A user is also able to add members to a non group issue board that they own. Issue board functionality described later. The web application is made with React, this is developers first time using this framework. It was selected for it's popularity and online support. For styling, the app is made with solely CSS, and not with a CSS-framework. For the backend part of the application, Ruby on Rails is being used. Both backend and frontend will be hosted, but only available from 09:00 - 19:00 GMT+2 / UTC+01:00.

GraphQL
JWT
TypeScript
React
Ruby
Rails
Picture of the author

Chess

This hobby project was developed during the summer 2022 concurrently with a summer intership (not part of). The main objective was to experiment with Elixir/OTP. As a result I developed a full stack application using Elixir/Phoenix (API framework) and Svelte (JS framework). The backend consists of a pure websocket interface (no HTTP endpoints, only WS endpoints) and no database. All data is stored in memory using Elixir/OTP. Elixir/OTP are independent processes with memory that can communicate with the application. Svelte was selected as the UI framework because of its reputation of being lightweight, simple, has Typescript support and was a technology that I wanted to experiment with.

WebSocket
OTP
Phoenix
Elixir
Svelte
Phoenix

Project Notes

23 Mar 2024

Project Updates June 2023 - March 2024

This note outlines updates from last year until March 2024 in bullet-point format for the following three projects: the proxy server, Kubernetes cluster, and portfolio application. The proxy server and Kubernetes cluster received updates that enhanced security, performance, and manageability. Meanwhile, the portfolio application underwent improvements related to the user experience.

25 Dec 2023

File Storage: Part 1

Improved TLS versions ensure secure data transport from client to server without extra client-side encryption. In this note, I'll explain how to add unnecessary encryption when uploading files in the Phoenix web framework. In the rare case, a zero-day is discovered in the TLS protocol, causing data to leak. Adding an additional layer of encryption and integrity could be the solution. This note will explain how I set up client-side encryption and server-side decryption using forge.js, the Web Crypto API and Erlang's :crypto and :public_key libraries NB! This solution increases the overhead of uploading files and is only an example. I do not recommend it for direct production usage. It is not Post-Quantum safe either, but a Post-Quantum Hybrid Key Exchange may be future work.

15 Sep 2023

RaspberryPI eBook Library

These notes were written after I configured my first RaspberryPI. It is a RaspberryPI 4 Model B with 8GB RAM, a 64-bit processor, and a 32 GB SD card. The main goal was to create a self-hosted library web application only accessible to me.

29 Apr 2023

Kubernetes Zero to Hero: Part 3

This series of notes is about my experience learning and configuring a Kubernetes cluster. Previously, I used a single Virtual Machine to host all my web applications. However, they have become cumbersome to keep track of and are hard to deploy and update. In addition, cloud technologies are in trend and something I want to get practical and theoretical experience on. This article will explain my improvements from the last post, adding a Proxy and implementing Grafana for monitoring.

28 Mar 2023

Personal Website Update

The portfolio website has been updated, and this note explains the changes. The previous version of the website only contained notes. However, after the recent update, I decided to add a front page and a project page, and I updated the layout of the notes. In addition, I adjusted the responsiveness to better fit mobile users (not entirely satisfied with the outcome, but it works).

24 Feb 2023

Kubernetes Zero to Hero: Part 2

This series of notes is about my experience learning and configuring a Kubernetes cluster. Previously, I used a single Virtual Machine to host all my web applications. However, they have become cumbersome to keep track of and are hard to deploy and update. In addition, cloud technologies are in trend and something I want to get practical and theoretical experience on. This article will explain the infrastructure and setup to deploy my chess and simple chat applications.

05 Feb 2023

Kubernetes Zero to Hero: Part 1

This series of notes is about my experience learning and configuring a Kubernetes cluster. Previously, I used a single Virtual Machine to host all my web applications. However, they have become cumbersome to keep track of and are hard to deploy and update. In addition, cloud technologies are in trend and something I want to get practical and theoretical experience on.