Senior software engineer & technical lead

Saskatoon, Canada

I build the
systems behind
the product.

From the first prototype to the team that takes it further. I architect systems, build across the stack, and help engineers find their footing.

Kevin Koehler
Kevin KoehlerSaskatoon, SK

Currently leading engineering at RUNNR

A closer look
2,000+

businesses on RUNNR

10+

custom products at Rivercity

Full stack

architecture to the interface

~10 years

professional experience

01 / Selected work

Built from the
ground up.

Real operational problems. A few ambitious side projects. The decisions behind the things I’ve built.

01.1 / Logistics · Technical lead

Built the platform.
Then the team.

RUNNR

I built RUNNR from scratch: the business portal, courier operations, driver app, backend, and infrastructure. It takes deliveries from booking through dispatch and proof of delivery to billing.

Today, I still build across the stack, own the architecture, and turn product ideas into sprints for three engineers I’ve mentored from beginner level.

  1. Business portalBook & track deliveries
  2. Courier workspaceDispatch & manage orders
  3. Driver appDeliver & document
  4. Billing & accountingFrom completed order to invoice
~5,000deliveries / month
~30courier companies
  • TypeScript
  • React
  • React Native
  • PostgreSQL
  • GCP
One engine. Different rules.

A closer look: configurable courier pricing

Distance, parcel fees, and a flat rush fee.

12 km

Same sample order: 2 parcels · 10 kg total

// This courier’s formula$Distance + $[Parcel Types] + $[Service Speed]
Calculated quoteCAD · before tax
$18.00

Sample couriers and rates, using RUNNR’s formula syntax. Variables are calculated fees or multipliers from each courier’s service rules.

The engineering behind it

End-to-end ownership

I built the initial platform myself and continue working across the web apps, React Native driver app, backend, and infrastructure. The driver app connects delivery tasks, location tracking, and required proof of delivery to the rest of the order lifecycle.

A language for pricing

One example of the architecture: courier-specific service rules calculate fees and multipliers, then a custom DSL combines them into a quote and line items. A formula editor lets couriers or customer success staff change the equation without changing application code.

Building the team, too

I’ve mentored all three engineers from beginner level. One arrived with no programming experience and has become a strong production contributor. Helping people develop their judgment is a core part of my work.

01.2 / Field software · Rivercity

No signal.
Still working.

Caddie / AgDirect

Crop adjusters need to work together in fields without cell service. I helped build an offline-first mobile app with local SQLite storage and clear, deliberate sync actions.

For adjusters on the same claim, I designed QR-based data exchange. Scan a teammate’s tablet. Keep working.

50–100adjusters in the field
3 provincesSK · AB · MB
  • React Native
  • SQLite
  • Offline-first
See Caddie on the App Store
Why explicit sync matters

Make the state understandable

Earlier mobile work taught me that invisible background sync can leave users unsure where their data lives. Caddie keeps work on the device, with explicit actions to submit completed work and pull new assignments.

Collaborate without a network

Several adjusters could be working on the same claim. QR exchange let them share data directly between their iPads, without cellular data or an internet connection. This workflow was used in the field.

Connect fieldwork to operations

I built the product with a fellow engineer and AgDirect stakeholders. We co-developed policy payout calculations, and the system also supported adjuster remuneration.

01.3 / Independent game & tooling

Visit the game
A PERSONAL OBSESSION, BUILT FROM SCRATCH

Perfect
Dungeon.

Five teammates. A dungeon.
A faster time to beat.

A cooperative raid-speedrunning game built around a server-authoritative simulation, seeded worlds, and deterministic replays.

  • TypeScript
  • Canvas 2D
  • Python / Pillow
Procedural sprite artwork from Perfect Dungeon.
ACTUAL GAME ASSETS / SPRITE STUDY
Under the hood: simulation & procedural art

One authoritative simulation

The simulation advances as a pure state transition. Seeded generation and ordered commands support deterministic replay tests. The server filters observations, so clients only receive the parts of the dungeon their party has revealed.

Art as a reproducible pipeline

I built a Python/Pillow pipeline for isometric sprites: reusable rigs, interchangeable equipment, and layered animation. Automated checks catch palette, alignment, and animation-loop problems.

Where AI fits

I use coding agents to help author and iterate on the rendering code and specifications. The result is a controllable, reproducible art pipeline, with rendered output and automated validation guiding each iteration.

01.4 / Independent infrastructure

Small database.
Whole system.

SaaSQLite

An idea I’d had since 2018, brought to life with agentic coding: SQLite hosting, from C query executors to the dashboard. A live product with public docs you can explore.

TypeScript SDK HTTP
Authenticated gateway
SQLiteC executor
SQLiteC executor
SQLiteC executor
UNIX SOCKETS / ONE PROCESS PER DATABASE
A polar bear walking across Arctic snowPhoto: Hans-Jurgen Mager / Unsplash

01.5 / Machine learning · Wildlife research

Where did this
polar bear come from?

I developed classifiers to predict polar bear management zones from isotopic measurements, comparing models with cross-validation to support wildlife research.

Explore the research code

01.6 / Local inference tooling

GGUF Tensor Overrider

Putting model tensors where they fit. A tool for GPU/CPU placement in llama.cpp, using GGUF metadata, tensor priorities, and estimated KV-cache requirements.

↗

02 / Experience

Build the product.
Grow the team.

I’m at my best when I can connect the architecture, the work in front of us, and the people doing it.

The full résumé
JUL 2023 — PRESENTCurrent

RUNNR Delivery

Technical Lead

Built the initial platform from scratch. Own architecture and delivery across the stack, and lead three engineers I’ve mentored from beginner level.

AUG 2021 — JUL 2023

Rivercity Technology Services

Director of Software · previously Lead Developer

Led approximately five developers building 10+ custom applications, working directly with clients on requirements and technical direction.

Enrolr / BGC Saskatoon
Automated childcare registration and invoicing, eliminating roughly a week of manual reconciliation each month.

JUL 2018 — AUG 2021

SafetyTek

Machine Learning Engineer → Technical Lead

Built an NLP chatbot for completing construction safety forms, then most of the backend for the in-house V2 rebuild and both React Native apps. Grew into technical leadership for approximately five engineers.

  • TypeScript / Koa
  • Neo4j
  • React Native
  • TensorFlow
Other ventures

Trainer.ai · Co-Founder Jan 2022–Sep 2025

Accelerators Group · VP of Technology Jan 2020–Apr 2023

ZellenTech Software · Co-Founder Jul 2017–Jan 2019

03 / A little about me

Curious by default.
Hands-on by choice.

University of Saskatchewan
B.Sc. Computer Science · Mathematics minor
2018

Nearly a decade of professional software engineering experience. Still curious about how the whole thing works.

That’s taken me from training recurrent neural networks on accelerometer data in university to construction safety software, field apps, and logistics systems.

Alongside that machine learning and NLP background, I’ve built full-stack products and mobile apps, and helped newer engineers become confident contributors.

Outside client work, I tend to build the things I wish existed. Sometimes that’s database infrastructure. Sometimes it’s a cooperative dungeon game.

BUILD

TypeScript · React · Next.js · React Native · Node.js · Python

SYSTEMS

PostgreSQL · SQLite · Neo4j · GCP · Docker · Linux · CI/CD

ML / AI

TensorFlow · Keras · scikit-learn · spaCy · Local inference

Have something worth building?

Saskatoon, Saskatchewan / Canada
Let’s talk
[email protected]