Hello! I am a UK based software engineer who's looking for ways to use tech to do social good, utilise it to to empower communities and, simply put, leave the world a better place. I'm also looking forward to seeing how we can bring worlds and stories to life using interactive mediums, particularly games and virtual reality.

I have clocked 4+ years of experience as a software engineer, out of that I've worked in embedded development & automated testing of hardware for almost 2 years. Outside of that my roles have been a mix of of infrastructure work, full-stack and building CI/CD pipelines. I love obscure shell commands, whales carrying containers and anything DevOps related. There's plenty of that & more in my CV!

As you can tell from my projects I'm quite a devoted gamer with a few amateur gamedev projects under my belt. You might also find me at various meetups around London involving volunteering, board games or social tech (or, ideally, all 3!). Feel free to say hi if you ever run into me there!


A spin-off of my colleague's LetMeCreate library which he wrote as a set of wrappers to communicate between Imagination Technologies' Ci40 board and MikroElektronika's click boards. It included a set of Linux C wrappers for common communication protocols (for example I2C, SPI, GPIO) as well as drivers for specific click boards.

LetMeCreateIoT was written with the idea of preserving LetMeCreate's API but implementing it for Contiki RTOS. The RTOS is then run on a constrained device based on the PIC32 system on chip. This way code could be prototyped on the Ci40 first, and then moved to Contiki with little to no changes. Similarly, writing click board drivers meant they were immediately available for both platforms. Prime example was my colleague's implementation of a display controller board that worked out of the box on both platforms.

On top of that the library provided wrappers for UDP/TCP communication as well as functionality to send live logs using a low power radio that came together with the SoC. This meant the output was readily available, accessing it any other way was quite cumbersome since it required buying a dedicated UART click board & soldering cables.

Language: C

IoT Carpark

A project that combines LetMeCreateIoT and AwaLWM2M device management software. The aim was to connect a constrained device to a cloud server, and use LWM2M to communicate the device's sensors' state. Since a motion sensor was fitted on top of it, which updated its status on the cloud whenever it was trigged, we were able to react whenever motion was detected.

The project includes a NodeJS app that could be run side-by-side with an AwaLWM2M server, this way the webapp can use interprocess comunication to access all sensors' states. Then it displays dynamically which spaces are taken, with a free spot shown if there's no motion, and a car if motion is detected.

Language: C


  • A few fixes, an SPI joystick driver, and extra abstractions for LetMeCreate to allow for better portability of driver code. Since we were trying to ensure easy portability of driver code any hardware & OS differences required hiding them away behind extra LMC API calls, and limited the amount of patches needed to port the driver code. Additionally if we ever wanted to migrate to a new OS (eg. RIOT) it meant we already had a solid and stable API to implement to make the code portable.
  • Various commits to AwaLWM2M, mainly to make the Python API compatible with both Python 2 and 3, fixes to Contiki network abstraction layer made to resolve issues with caching of parsed addresses, and fix ports not being consistently saved in one endianness.
  • Changes submitted to CreatorDev fork of Contiki RTOS to fix Makefile issues, clean up and add missing functionality to I2C, and add a driver to handle multiple callbacks for the CN interrupt.

Graphics Engine

A fun side project I used to play around with 3D graphics - using OpenGL's rendering pipelines, writing shaders and handling lighting. The goal was to learn more about 3D math for graphics programming as well as design something that would be fairly extensible in the future (eg. to implement DirectX support).

The engine can render fairly simple scenes with lighting & shading enabled. For shadows it uses shadowmaps, but also includes a phong reflection model to render surface reflections. All of the rendering is handled via a proper vertex and pixel shader pipeline with shaders written in GLSL.

Language: C++


Something I started working on in 2015 before & after starting my new position as a system assurance engineer at Imagination Technologies. The goal was to refresh my Python skill and have a go at writing a component-based game engine (Unity-style) rather than an inheritance based one. The latter was more of my area of expertise due to a few years of working with the Source Engine. For the media library handling system calls, rendering and input/output I used PyGame and split the game into separate engine & game modules for easier code re-use. Thanks to PyTMX levels can be built quickly using Tiled and imported straight into the game.
Language: Python

Space Invaders

A clone of the classic Space Invaders arcade game, originally it was an interview challenge for a gamedev job I applied to in 2014. The goal was to build a fully working game in 7 days, but with enough abstraction to allow for easy plugging in of different implementations of the engine components (renderer, user interface manager etc.). For handling low level input/output and rendering calls I used SFML

Plus, it's Space Invaders, and who doesn't like Space Invaders!

Language: C++

Valve's Source Engine Mod

My first major C++ project started back in 2008 while I was still in high school. It continued (with pauses) until 2012, when development effectively stopped until I cleaned it up before releasing as a perpetual alpha in 2015 on ModDB.

Originally the mod was meant to be fairly simple - the players were tasked with solving puzzles, while one other player was supposed to randomise them by changing the puzzles on the fly. As development went on it turned into a full-blown Player vs Player modification pitting one team against a single player whose goal is to use traps & environmental hazards to stop anyone from finishing the level. The traps included suicidal, mechanical pigeons, exploding, flying orbs talking with my friend's voice and giant, human-eating blenders.

While working on the mod I acted as a lead for a small team of 3D and 2D artists, while my responsibilities included all of the game design, level design, level creation and gameplay programming.

Language: C++

Manhunt - Arma 3 mission

My gaming group started running into issues where we couldn't find any Player vs Player scenarios designed for our group's size - which is about 4-6 people playing at a time. Disappointed I figured the best around this is to write my own mission instead.

Manhunt pits a small group of players - the Hunted - against a much larger enemy team - the Hunters. The smaller team has to sneak through the island, accomplish objectives (usually those involve just getting to a specific place), and finally extract via a helicopter. Their opponents have access to light vehicles, helicopters and are constantly being informed about the rough are where to look. This means that the Hunted have to be careful about the path they choose through the island, as well as have to make choices about sacrificing stealth in favour of speed.

Countless evenings were lost playing this game mode, and even more trying to fix various gameplay issues or fighting Bohemia Interactive's SQF syntax. In the end I decided to share the mission via the Steam Workshop .

Language: SQF

Scavenger - Arma 3 mission

An early prototype that never received a proper test run. As a follow up to Manhunt I decided to try a more symmetric Player vs Player approach, but with AI added to the mix to balance the lack of human opponents. The mission is still geared towards groups of 4-6 players.

Players are evenly split between two teams, both are tasked with recovering briefcases from the city of Vorkuta. The city, however, is occupied by AI which patrols the streets and positions snipers on the roofs. The players have to either deal with the AI guards, or sneak past them whenever possible. This also means that running into the opposing team might require holding fire and cooperating to avoid mutually assured deaths.

Language: SQF