Profile

Welcome to my personal website!

From the age of eight to twenty-three, swimming taught me focus, discipline, and the ability to delay gratification. Growing up in a pizzeria taught me humility, and that everyone carries their own struggles. Curiosity taught me more skills than university ever did, but there I met people I learned even more from. I also got more immersed in science, which interests me a lot, because it reflects the pursuit of the next level and that's always where I want to go.


If you're on a similar path, I'd be glad to connect.

Current Position: Master's Thesis @ Einride

Verification and Validation Team (Jan 2025 - June 2026)

View Full CV

Projects

BroCode
BroCode @ Florent Hackathon
Grandi
Grandmaster Intuition
RaySR
RaySR @ Ericsson
CalliQ
CalliQ @ Microsoft Hackathon
AD Prediction
AD Prediction Research
EyeBall
EyeBall RL Game
Robotics
Robotics Course Project
Bachelor Thesis
Bachelor Thesis @ Scania
Speech to Gesture
Speech to Gesture

Feb 2026

Together with Tom Boustedt and Marwin Haddad, I built BroCode. It is a traffic controller for AI agents that prevents merge conflicts and coordinates multi-agent coding sessions. The core idea is to use a Neo4j knowledge graph that indexes the entire codebase, mapping files, classes, and functions as nodes, so that multiple agents can safely work in parallel without stepping on each other's toes.


We built an MCP server that gives agents tools to claim, release, and update nodes in the graph, along with a message-passing inbox system for coordination. Exclusive claims act as locks to prevent two agents from editing the same file simultaneously, solving problems like silent bugs and context collisions. The system also includes a real-time Streamlit dashboard to visualize which agents are working where across the codebase.


GitHub Repository

Dec 2025

Grandi is a chess engine designed to mimic "Grandmaster Intuition" by predicting win probabilities from a single board state, rather than searching millions of future paths like traditional engines. Inspired by AlphaZero, the model uses a deep CNN with 18 binary feature planes to "see" strategic elements. I built a web interface with Gradio and deployed it on Hugging Face Spaces, allowing users to play against an engine and analyze their moves in real-time.


I also built a fully automated MLOps pipeline on Google Cloud Platform to keep the engine learning. I configured game logs to stream to BigQuery, triggering a weekly GitHub Actions workflow that fine-tunes the model on new amateur game data, adapting the system to gameplay styles not present in the original training data. I hosted the inference API on Cloud Run using FastAPI, implementing a dynamic reloading mechanism for zero-downtime updates, and added a monitoring layer in Looker Studio to track performance drift.


GitHub Repository

Sep 2025 - Dec 2025

This project explored the use of Super Resolution (SR) techniques to improve generation of radio maps, which are used to predict the signal strength of a radio signal in a given location. Inspired by NVIDIA's DLSS, the project aimed to see if a similar result can be achieved for radio maps, i.e. to generate a low resolution radio map and upsample it, faster than only using a high resolution radio map, without losing essential quality.


I worked on this project as part of the course DD2430 at KTH, in collaboration with Ericsson and fellow classmates. I utilized the Sionna physics simulator to explore techniques like ray tracing for data generation and applied SR models to the output. The project showed clear improvements in generation speed without losing essential quality. However, one limiting factor was the low complexity in the scenes used, and the requirements from network operators must be evaluated more closely to see if it is a viable solution.


Project Report (PDF) GitHub Repository

May 2025

Together with Didrik Munther, I built CalliQ (Call IQ) which is an assistant designed to prevent phone scams. The agent listens in on phone calls in real time, transcribes them using Microsoft’s Azure Speech SDK, and leverages a LangGraph LLM agent to detect and warn the receiver if a scam attempt is suspected.


We developed and demoed the prototype by conducting a live phone call between two devices on stage during the SSE x KTH x Microsoft Hackathon at Microsoft HQ in Stockholm. Out of 300 applicants, 14 teams were selected to build and pitch their projects, and ours was awarded runner-up.


SSE LinkedIn Post

Sep 2024 - May 2025

This project focused on improving trajectory prediction for autonomous driving by exploring ensemble methods to better handle difficult, long-tailed cases. Working with Oxford Robotics, I implemented and tested ensembles on large-scale datasets such as nuScenes.


The project explored distillation and other techniques but surprisingly, the most effective approach turned out to be a simple confidence-weighted average of pre-trained models, without retraining or fine-tuning. This yielded up to 10% improvement in prediction accuracy, particularly in the hardest long-tail scenarios, compared to any single model. The work also revealed how different models complement each other: smaller models, though weaker on average, provided robustness in edge cases where larger models failed.


The project culminated in a paper accepted to the IEEE International Conference on Intelligent Transportation Systems (ITSC) 2025 and was selected for an oral presentation.


arXiv Paper GitHub Repository

Mar 2025

EyeBall is a game where you control a ball with your eyes while competing on a track against a reinforcement learning (RL) agent. The idea was to combine computer vision with interactive gameplay and to use the setup as a practical playground to learn more about reinforcement learning.


To achieve this, I built an eye-tracking interface using MediaPipe FaceMesh that detects gaze direction in real time and maps it to in-game lane switching. On top of this, I created a game environment in Ursina that could be played either by the user (via eye movements or keyboard) or by an RL agent. For the agent, I designed a headless version of the environment and trained it with PPO from Stable-Baselines3, experimenting with reward shaping for lane changes, obstacle avoidance, and survival time.


GitHub Repository

Jan 2025 - May 2025

This project focused on improving trajectory planning in autonomous driving, with emphasis on out-of-distribution (OOD) generalization.


I built upon a baseline model that generated multiple trajectories and ranked them, but which consistently failed in OOD cases. I experimented with incorporating large-scale representation learning through LLM and VLM embeddings in PyTorch Lightning. The hypothesis was that such multimodal embeddings, with richer "world knowledge", could support better reasoning in edge cases. LLM-based embeddings were difficult because each dynamic scene had to be translated into a sufficiently rich textual description; a VLM embedding using vehicle history and scene context was simpler and more robust, though gains remained scenario-dependent.


My modifications to the original baseline model enabled the system to resolve some of these edge cases like driving around a blocking car and return safely to the correct lane (shown in the simulation above), and with additional training tweaks I also achieved a higher score than the reported SOTA on the InterPlan dataset. However, the simulator scoring itself proved noisy and gave somewhat questionable metrics.


The project was part of the course DD2414 Engineering project in Robotics, Perception and Learning (15 credits).

Jan 2024 - June 2024

This thesis project on autonomous driving was done in collaboration with Tom Boustedt and it spanned everything from data processing to simulator work, model building, and evaluation using PyTorch, Weights and Biases and the nuPlan simulator, all done on AWS.


The core research focused on a key question: could we improve autonomous driving performance by integrating and simultaneously optimizing the predictor with the planner in a differentiable manner? Rather than treating prediction and planning as separate modules, the project explored whether joint optimization could lead to better overall system performance.


The approach also integrated a non-linear optimization layer built using Theseus to enforce kinematic driving constraints. This created a more transparent system that could aid safe development compared to previous black-box approaches.


The results did not reach SOTA on overall performance, but in some scenarios where previous models struggled, our integrated approach showed improved lane-keeping behavior and better collision avoidance. We continued refining the model after thesis submission and presented the enhanced results at Scania in June 2024.


Bachelor Thesis PDF

Feb 2023 - Jan 2024

This project aimed to explore speech-to-gesture generation using deep learning. The goal was to see if we could curate a dataset of different motion capture data (different sizes, number of joints etc.) from sources like Ubisoft ZeroEGGS dataset and map the audio features directly to human motion. Therefore, I spent a good amount of time in Blender, retargeting the motion capture data to align everything with a unified rig across datasets.


Our modelling approach focused on extracting Mel spectrograms and frequency domain features using PyTorch Audio, testing the hypothesis that information in the frequency domain could map to acceleration in joint space to predict realistic motion based on speech. We started building a VAE model to handle the complexity of human gesture generation.


Although the project was discontinued when my thesis began, it became my introduction to serious research. Working with Linux environments, high‑performance clusters, PyTorch, and signal processing gave me a solid grounding in multimodal deep learning and the challenges of real‑world motion data.

Extracurriculars

Swimming

Competed for 15 years. National team level in open water marathon swimming.

Winner of Vansbrosimningen 2015

OW Swimmer of the Year 2016

Music

Self-taught Guitar (8y) & Piano (2y).

Composed: Recursive Solace