Kenneth Christensen

Fullstack developer, open source enthusiast helping businesses win

About

I’m passionate about open-source technologies and creating maintainable and scalable software. I help businesses win with programming, test automation, and DevOps practices. I always strive to make the most business value with simple solutions.

I thrive in fast-moving environments with a high level of autonomy. I’m a “manager of one”, highly autonomous, and always take ownership of my tasks. I prefer to work in teams with other skilled people always searching for excellent solutions.

I have an entrepreneurial mindset and always have suggestions or questions about whether we do things optimally.

I’m passionate about Rust and have been coding Rust for two full days a week for three years, building Råd til Bolig. Beyond that, I have been coding Rust for open-source and personal projects. I’ve, for example, contributed to the Cargo Lambda crate.

I live in a small house in Copenhagen with my girlfriend and our dog, a Cocker Spaniel named Ulla.

Education

2013 - 2017 University of Copenhagen

Projects

April 2023 - Current Full stack developer | Veo Technologies

I set up a Chromecast receiver app using React, Typescript, and the CAF framework. Then I built a new player using Web Components and Lit with Hls.js in Typescript to support the playback of HLS and .mp4 files to be shared across the company.

I built a new video download service for downloading moments from an HLS stream. The service runs on AWS App Runner behind a CloudFront cache. The service is built in Rust using Axum and Tokio. It calls down on FFMPEG to cut out the moment from the HLS stream.

I also helped maintain and develop the existing systems built in Nest.js with Typescript and MongoDB running on AWS App Runner and a system made in Python using DynamoDB and RDS running serverless using Lambda and API Gateway.

Technologies

React, NestJS, Typescript, Python, AWS, Chromecast, Web Components, Lit, Hls.js, MongoDB, DynamoDB, RDS, Lambda, API Gateway, AWS App Runner, CloudFront, Rust, Axum, Tokio

Nov 2020 - Current Full stack developer | Råd til Bolig | Side project

Råd til Bolig started as a mortgage rebalancing surveillance platform.

I built an option pricing algorithm for Danish mortgage bonds using a binomial tree and an algorithm for checking whether a rebalancing is profitable. The algorithm is used to calculate the profit of a rebalancing and to find the optimal rebalancing. Both algorithms were first implemented in Python and then ported to Rust.

The infrastructure used Cloudformation and AWS CDK with RDS, Fargate, S3, and Cloudformation. Test automation uses Cypress. It deploys with Github action.

After running the mortgage rebalancing platform for a year, we pivoted the project into a housing registry platform using public data.

I ingested over 500GB of data using Serde and Polars in Rust. The ingestion uses streams to avoid having everything in memory at once. The data is then stored using .parquet files.

After ingestion, I built queries for the data using Polars and Rust. The queries are then exposed using a Lambda function with Rust and Tokio.

The web app uses Zola to generate static pages with redirects using CloudFront functions and Nginx locally. Content requests on the dynamic pages use Hotwire Turbo Frames, which calls the Rust lambda function. The ingested data is stored on EFS to make it available for the lambda function.

We use S3 to store the data, which then is made available for the lambda function using Datasync to EFS. Processing is handled using AWS Batch. Workflow orchestration is done using Step functions.

All of the infrastructure is deployed using Cloudformation and AWS CDK and everything is deployed and tested using GitHub actions.

Technologies

StencilJS, Polars, Lambda, Cypress, Typescript, AWS CDK, GitHub actions, Rust, Python, DevOps, PostgreSQL, Docker

Aug 2022 - April 2023 Full stack developer | Biowatch

I helped set up e2e test automation using Cypress running on GitHub actions. I implemented testing of the whole app to enable daily deployments with gated checks for review.

After moving the code into a single repository, I built a system for branch deployments using Google Cloud’s App Engine and Vercel so each PR could be tested independently.

We continuously improve the platform built with Typescript, React, and Next.js.

I also helped move our database from Firestore to Postgres, running on Google Cloud SQL. The data is then moved to Big Query using DataSync with Granular access management.

Technologies

Next.js, Google Cloud, Vercel, Cypress, DevOps, PostgreSQL, Typescript, GitHub actions, React, Docker, GraphQL

Jan 2021 - Jun 2022 Full stack developer | TV2

I helped build and maintain TV2’s player using Typescript functional streams with RxJS and React for the web and Chromecast.

I worked on several internal players and test automation using Cypress and CI/CD on Jenkins and Github actions.

For the Chromecast app, I set up dynamic slideshow images that allowed the marketing team to upload images directly instead of developers. The images are hosted on AWS using S3 behind a CloudFront cache.

Technologies

Jenkins, AWS, Cypress, Typescript, GitHub actions, RxJS, React, Next.js

Jun 2019 - Jan 2021 Full stack developer | YouTv

I helped with the release of a new streaming platform called YouTv. I was responsible for Infrastructure and DevOps for the web and Chromecast app. I built the infrastructure using Cloudformation and AWS CDK, S3, Cloudfront, Cloudwatch, Lambda@edge, lambda, IAM, Secretsmanager, SSM, and more.

It supports branch deploys, so each PR creates a unique URL for testing purposes. We also had gated checks for review of pull requests and deployment to production.

I used CircleCI to set up CI where each PR deployed a new URL. Support for staging and production deployment, including rollback and tests for the infrastructure using Jest.

I migrated multiple repositories to a mono repository with Lerna and set up Cypress with BDD support for e2e test automation.

Technologies

CircleCI, Cypress, Redux, React, DevOps, Typescript, AWS CDK

Okt 2019 - Okt 2020 Full stack developer | Trackbit

As a technical co-founder of Trackbit, I built an app for collecting royalties on TV ads. The app allows rightsholders to upload their music and match against TV ads from a 3. party API.

The web app uses Elixir and the Phoenix framework. With a fingerprinting algorithm based on the latest scientific research that uses Python, Annoy, Numpy and Dask.

The system runs with Docker and docker-compose on AWS with infrastructure using Cloudformation and AWS CDK. We use RDS, S3, Cloudfront, ECS, IAM, and VPC. CI and test automation are running on CircleCI.

The music to be tracked is uploaded to S3 and added to an SQS queue for processing. Then the fingerprinting algorithm running on a ECS cluster would process it and save the results to RDS so they would be ready to recognize. Access management is handled using IAM.

Technologies

CircleCI, DevOps, AWS CDK, Phoenix, Elixir, Python, Docker

Apr 2017 - Jun 2019 Full stack developer | YouSee

While working for YouSee, I built and deployed a new Chromecast receiver app; Using React and (CAF) Cast Application Framework. It supports playback of Live, Catch-up, and VOD content. It also included a binge-watching feature and multiple themes for different brands.

I also migrated away from an outdated proprietary player to an open-source player DashJS, Supporting Live Catch-up and VOD smooth streaming manifests. Catch-up wasn’t natively supported, so I implemented that for DashJS. It’s integrated with React RxJS and Redux using an Elm-inspired functional architecture.

In my time at YouSee, we migrated from a legacy Backbone.js web app to a modern one. With React, RxJS, and Redux. The new app supported white labeling for multiple brands.

Technologies

Redux, Chromecast, Dash.js, React, Typescript, Javascript, RxJS

Nov 2015 - Jun 2018 Full stack developer | Copenhagen Capacity

For Copenhagen Capacity, I built a web scraper that crawled companies’ websites for jobs in Denmark daily. It’s made using Python and deployed on a Digital Ocean Linux server. For websites that use client-side rendering, Selenium handles the browser automation for rendering the sites, pagination, etc.

Technologies

Selenium, Linux, Digital Ocean, Python

Jun 2014 - Okt 2016 Full stack developer | Nykredit

While studying computer science, I was working at Nykredit. I worked in the markets department on several internal applications. The leading technologies used were Javascript, Angular, and React, and some PHP for our open-source CRM system.

Technologies

Angular, React, PHP, Javascript

Open Source

June 2023 - June 2023 Open source project | Ethereum transaction crawler

I built a project that crawls the Ethereum blockchain for transactions for a given address. You can input an address and a start block and the crawler will crawl the blockchain for transactions for that address.

The crawler is built using Streams and ethers-rs to concurrently crawl the blockchain with an exponential backoff strategy to handle rate limits.

The transactions found are shown in a table on the website that uses Axum.

Everything is tested and the Ethereum blockchain is mocked to have deterministic tests.

You can find it here GitHub

Technologies

Rust, Axum, ethers-rs, Tokio

April 2023 - June 2023 Open source project | Crypto streaming order book

I built a project that connects to Binance’s and Bitstamp’s WebSockets at the same time and pulls order books from both exchanges using Tungstenite. The order books are then deserialized using a custom Serde deserializer.

The order books are then merged and sorted. The combined order books spread, top ten bids and top ten asks are then published through a gRPC server using Tonic as a stream.

Everything is tested and the WebSockets are mocked using a custom test server with Tokio.

It’s built in Rust using Tokio, Tonic, and Serde.

You can find it here GitHub

Technologies

Rust, Tonic, Serde, Tokio

April 2023 - June 2023 Open source project | Cargo musl builder

I build a small CLI tool that builds Rust projects for Lambdas using Docker. It uses a Docker image with cargo-chef to optimize caching. It then compresses the binary into a .zip file ready to be uploaded to AWS and uses the Docker CLI to copy the binary out of the container.

It uses Tera to generate the Dockerfile with the CLI arguments and Tokio to run the Docker CLI commands. The CLI arguments are parsed using Clap.

You can find it here GitHub

Technologies

Rust, Docker, Clap, Tera, Tokio

Dec 2017 - May 2019 Open source project | OpenBot

As a side project, I built an open-source cryptocurrency trading bot. The bot runs on Node.js with Javascript. The bot’s architecture is event-driven, utilizing RxJS for functional reactive programming using observables. It runs using Docker and docker-compose.

To show the bot’s result, I built a frontend with React and D3.js to create the plots. I used TDD (Test-driven development) to ensure everything worked as expected.

You can find it here GitHub

Technologies

docker-compose, D3.js, TDD, React, Docker, Javascript, RxJS