Home

Version 1.0.0

Built with Preact, TypeScript,Sass, Zustand and Vite.

Home

Tomasz ZajÄ…c

An experienced, self-motivated software developer


5 years of professional experience developing, maintaining and providing support on a variety of enterprise-grade Web services and apps.

Passionate about working on small videogame projects in my free time.

Professional experience

Due to programming being both my hobby and an integral part of my job, I have delved into a multitude of languages and domains.

My current professional background comes from a Web development perspective, which entails full-stack development using modern, open-source technologies, while also interfacing with proprietary/enterprise infrastructure to deliver services.

In my career, I have been responsible for not only developing new, innovative solutions, such as conversational AI (chatbots) and interactive navigation guides, but also maintaining legacy systems supporting key business operations and developing processes scalable to large volumes of data.

.NET Core
4 years using .NET Core in a professional capacity
Vue.js
4 years using Vue.js in a professional capacity. Familiar with Vue 2.x, 3.x, JSX syntax, Vue CLI and TypeScript API.
React
2 years using React in a professional capacity. Solid working knowledge of the concepts (virtual DOM, hooks, portals, passing props), experience with debugging and optimisation.
Testing
2 years' experience writing manual tests, unit tests using Jest (TypeScript), NUnit/Xunit (C#), GoogleTest (C++) as well as automated Web UI tests using Playwright.
Azure
3 years' experience with using the platform. Knowledge of common tasks, e.g. configuring & deploying app services, debugging deployed code, etc. Familiar with Azure DevOps, Git workflow, Continuous Testing, Pipelines and Artifacts.
Conversational AI
4 years of experience developing chat bots. Solid working knowledge of Microsoft's Bot Framework, Bot Builder SDK, Composer, as well as Natural Language Processing solutions such as Microsoft LUIS. Basic familiarity with machine learning concepts.

Portfolio

Navigate-Me

University of Lincoln, 2018-2022 | See it here

Navigate-Me is a campus navigation system I helped develop and maintain for over 4 years. Users can choose a starting point (or use geolocation) and destination, and the service will render a path, complete with text instructions for each segment.

I have joined the project close to its release, so my involvement was primarily to keep the system's maps up to date and adapt to new requirements over time (e.g. special maps to support social distancing measures during the COVID-19 outbreak).


JSXJSX
Vue.jsVue.js
Bootstrap & BootstrapVueBootstrap & BootstrapVue
.NET Core.NET Core

Navigate-Me

University of Lincoln, 2018-2022 | See it here

In addition to maintaining and improving the project's codebase, I was tasked with creating map data for the University campus.


JSXJSX
Vue.jsVue.js
Bootstrap & BootstrapVueBootstrap & BootstrapVue
.NET Core.NET Core

Find-A-PC

University of Lincoln, 2018-2022 | See it here

Find-A-PC is University of Lincoln's Web service designed to help students & staff locate nearest available workspaces. Select buildings & rooms can be viewed as maps populated with live tracked machine availability data, labelling each machine on the map with its availability status using a different colour for each state.


JSXJSX
Vue.jsVue.js
Bootstrap & BootstrapVueBootstrap & BootstrapVue
.NET Core.NET Core

Find-A-PC

University of Lincoln, 2018-2022 | See it here

I have joined the team once the service was already in operation, and was later responsible for introducing new features as well as long-term maintenance. Part of the challenge was implementing and maintaining the backend code which needed to use different strategies for polling machine availability data depending on their environment (Windows host/thin client/Mac OS)


JSXJSX
Vue.jsVue.js
Bootstrap & BootstrapVueBootstrap & BootstrapVue
.NET Core.NET Core

Blueprint Common Modules

Blueprint Gaming, 2023-present

Working as part of Blueprint Gaming's Framework/Tools team, I've been tasked with developing and maintaining "common" modules; ie. libraries that were used in every game, developed separately to the game code itself. Key amongst them was Common UI, which provides practically all of the on-screen controls and house style in Blueprint's games.

Having a reusable UI library allows game developers at Blueprint to focus on building the game client itself; the library provides callbacks for the client to subscribe to in order to respond to user input, and it can configure and manipulate the UI state via an easy-to-use API.

The UI also takes care of responsive layouts and text scaling, and is continuously tested on a variety of devices, including all major mobile browsers, resolutions and operating systems.


TypeScriptTypeScript
TSXTSX
ReactReact
CSS3 (using Emotion.js)CSS3 (using Emotion.js)

Blueprint Common Modules

Blueprint Gaming, 2023-present

Aside from just displaying 2D elements and forwarding user input events, the UI also plays a big compliance role. There are many requirements from gambling regulatory bodies as well as operators with regards how the interface needs to behave in certain markets, so the library also adapts its logic based on settings received from the server and any integration-specific code.

Common UI is also responsible for translating and localising all text, currency, time and date displayed in the controls; to achieve this goal it implements its own "default" translation set, but also supports loading custom translations at runtime.


TypeScriptTypeScript
TSXTSX
ReactReact
CSS3 (using Emotion.js)CSS3 (using Emotion.js)

Blueprint Common Modules

Blueprint Gaming, 2023-present

Another shared library I worked on at Blueprint is the game panel. This is a UI component that's present on select games that feature progressive jackpots. These are essentially supposed to act as a visually pleasing preview of the current pot state. As the player places a bet and spins the game, their bet contributes to the progressive pots; the game panel's task is to animate the pot values with a "counting" effect whenever they update.

There are several variants of the game panel; each comes with its own distinct visuals. Those can also be customised on a per-operator basis. Similarly to the common UI library itself, the panel handles all of the localisation, layout and text scaling - the latter two being major challenges due to having to fit on the screen without obscuring any key elements from the game's canvas, and also the need for supporting a range of currencies that result in varied text lengths.


TypeScriptTypeScript
TSXTSX
ReactReact
CSS3 (using Emotion.js)CSS3 (using Emotion.js)

RGS Dashboard

Blueprint Gaming, 2024

I was tasked with designing and developing an internal data visualisation site that would be featured on displays around the offices at Blueprint.


TypeScriptTypeScript
TSXTSX
ReactReact
Material UIMaterial UI
ESBuildESBuild

RGS Dashboard

Blueprint Gaming, 2024

The site was initially based off one of the templates the company had purchased in order to quickly establish a visual direction and develop a presentable proof-of-concept, but over time I've rewritten the majority of the components as they didn't entirely fit our requirements (lack of typing, theming support etc.)


TypeScriptTypeScript
TSXTSX
ReactReact
Material UIMaterial UI
ESBuildESBuild

RGS Dashboard

Blueprint Gaming, 2024

A good amount of work has gone into developing dataviz widgets such bar/line/gauge charts from scratch using React & SVG, etc. as many of the charts included with the template relied on an old library based on HTML5 Canvas, which made customisation difficult.


TypeScriptTypeScript
TSXTSX
ReactReact
Material UIMaterial UI
ESBuildESBuild

RGS Dashboard

Blueprint Gaming, 2024

In addition, I also developed a custom component for visualising Blueprint's top international markets. This consisted of a 3D shaded globe that animated along a coordinate trail of countries from the top plays data, procedurally bringing every country into view by rotating and zooming as needed, and highlighting the country with a flashing yellow fill. This involved implementing bespoke pre-processing, GLSL shaders and 3D math, so I was very proud to see it come to life.


TypeScriptTypeScript
TSXTSX
ReactReact
Material UIMaterial UI
ESBuildESBuild

Personal projects & hobbyist development

In my free time, however, I often challenge myself to learning completely different areas, such as graphics rendering and physics simulation in a game programming context.

I have working knowledge of industry-standard game engines Unity, Unreal and Godot, as well as graphics and physics middleware including OpenGL, PhysX and Bullet. I am familiar with many math concepts commonly used for rendering and lighting (algebra, vector math, calculus), as well as basic Newtonian mechanics required for physics and gameplay programming.

Unreal Engine
1 year of using Unreal Engine 4 and 5 for small personal game projects. Familiar with both C++ and Blueprint programming, as well as basics of setting up scene lighting using Lumen.
Unity
Familiar with using the Unity engine, having used it on-and-off since 2013, including 1 year spent on developing a small multiplayer game to completion. Familiar with C# programming, Photon & Netcode for GameObjects, Universal Render Pipeline, Shader Graph and HLSL.
OpenGL
Familiar with creating basic 3D renderers using the modern OpenGL spec using C++ for host code, writing GLSL shaders for simple lighting models (Gouraud, Phong), and debugging using ImGui and RenderDoc.
PhysX
Working knowledge of the NVIDIA PhysX C++ SDK. As part of University project, produced a small 3D pinball game making use of various collider types, different material properties (restitution/friction coefficients) to serve gameplay purposes, and integrated simulation with a basic OpenGL scene graph.

Side-projects

Roomba Rumble

7DFPS Game Jam, 2020 | See it here

For the 7DFPS game jam in 2020, I developed a multiplayer shooter game where players control weaponised cleaning robots.

For playability's sake, a concession had to be made and technically the camera placement is more similar to a third person perspective.

I've decided to continue with the game's development after the game jam had ended. As a result, I believe I have learned quite a lot about all facets of game development, from design, programming, time management, and so on. While the game was clearly far from a technical accomplishment, it served as a good introduction to learning gameplay programming, networking (using Photon initially, and porting to Unity MLAPI later on), shaders (using Shader Graph), as well as generally the Unity engine itself.


UnityUnity
BlenderBlender

Driving physics

Self learning, 2022 | See it here

I've always found vehicle physics in video games to be an interesting problem, which prompted me to make small experiments in my free time trying to implement my own solution.

Having studied the well-known Marco Monster paper on car physics, I began toying with an implementation using the Godot engine. Within a few weeks I had a basic demo with a simple weight transfer that responds to changes in acceleration, raycast-driven wheel suspension, cornering that adapts to velocity and tyre friction.

It is by no means a complete solution, but it's been eye-opening in just how complex this topic - which many outsiders consider trivial - actually is. I'm planning on revisiting it at some point again; I believe the main issue I've faced is an over reliance on built-in rigidbody physics and collision detection; what I've learned is that vehicle physics, especially for wheeled vehicles such as cars, mandate that all interactions with the physics world are performed using bespoke mechanisms and approximations instead of the main rigidbody solver and triangle geometry (e.g. how raycasts and distance functions offer a smoother collision response for wheels than using the general physics hit event).


Godot EngineGodot Engine
BlenderBlender

Survive the Hunt

Video game modding, 2021-present | See it here

Survive the Hunt is a custom gamemode I've built in FiveM, the community-made multiplayer client for Grand Theft Auto V.

The idea came from watching the YouTube channel "FailRace", who popularised this mode while playing GTA Online on console. However, I felt that this would be difficult for ordinary gamers to enjoy without a coordinated group, as there was no guarantee players would follow the rules (whereas the FailRace group were tight-knit and therefore could agree on fair play for content creation purposes). Hence, the goal was to implement the ruleset as a FiveM script, adding the constraints and restrictions needed to guarantee a fair experience for all players.

At its core, the script implements the basic ruleset: a "hunted" player is picked at random. They're hidden from the hunters' radar and given a one minute headstart to establish an initial position and strategy. During that prep phase, "hunters" are prevented from leaving the starting area. After that, the hunted player needs to survive 24 minutes (12 in-game hours) in the city while their approximate location is broadcast to the hunters every minute.


C#C#

Survive the Hunt

Video game modding, 2021-present | See it here

I don't necessarily consider this project critical to my career in any way, and it was born more out of my own interest in trying the gamemode with my friends, but despite that I still found I gained some knowledge and skill from developing it over the years.

For one, working on the project I had the opportunity to delve deeper into the game design side of things, specifically balancing in a competitive multiplayer context. It's not something I get to do a lot, and it's not something I see myself working in, but I feel like it provided me with a perspective on how to gauge player satisfaction, how feedback affects future iterations of a product, timescales, the QA process, and so on. In fact, in some areas I began to slightly deviate from the original concept and added or adjusted features/rules as necessary based on playtesting feedback.

From the technical side of things, most of the code boils down to calling functions from the game's executable in my C# code in order to update the player, world or HUD state as needed, so it was more analogous to tasks performed by mission scripters (with the added caveat of having to interface with the game from external code).


C#C#

LepusEngine

Self learning, 2023-present | See it here

This is a toy 3D engine I've been writing in my spare time for the purposes of learning C++ and graphics programming.

I've initially started tinkering with OpenGL around 2017 and got a basic OpenGL renderer working, but unfortunately it suffered from tech debt due to my lacking C++ knowledge. In 2023 I revisited the project and decided to rewrite it from scratch.

Currently, the engine can render a demo app with basic animated primitives, and it can use either of the two backends (OpenGL or Vulkan) with only minimal dependencies. I've been using this project as an opportunity to brush up on my understanding of low-level programming and architectures.

I try to limit the project's reliance on the standard library and math helpers to a minimum, implementing utility code on my own until I feel that it's becoming unfeasible.

By far the biggest challenge in the project was getting to grips with resource management, synchronisation and overall API design in Vulkan, but graphics programming has always been an area I wanted to explore, so learning about those topics bit by bit has been fascinating.


C/C++C/C++
VulkanVulkan
OpenGL & GLSLOpenGL & GLSL

Team player

While delivering the best product possible is always my primary objective, I make sure to promote good practice and endeavour to foster a friendly & helpful atmosphere within the team.

Despite having mostly worked junior roles thus far, I quite often coach other colleagues, offer feedback during code review, and generally make efforts to maintain technical conversations within the team where we can share ideas and experience. I believe that mutual respect and constructive, honest feedback are key for thriving teams.