Skip to content


My name is Josh, and I'm sort of a software engineer. This blog is a place for me to share technical notes, guides, articles, and whatever else my heart desires. The information shared here represents my own thoughts, opinions, and experiences, and does not represent the opinions, positions, ideology, or any other characteristic of my employer.

Most of what I share here will relate to PowerShell and .NET software development, especially as it relates to Milestone XProtect VMS products.

Sort of a software engineer?

I started my career with Milestone Systems in 2006 as a technical support engineer. I had some prior experience building basic websites using the LAMP stack (Linux, Apache, PHP, and MySQL), and did some programming in school using QBasic and later Visual Basic. I even took CS-101 at Portland Community College and learned a minute amount of C++. However, I was not actually employed as a software engineer.

During the course of my job as a technical support engineer, I started learning Python and made some tools to make certain aspects of the job easier and more consistent. Later, I learned C# so that I could better understand how to use our SDK which is based on .NET Framework. This also made it significantly easier to look at our product source code and understand how certain elements really worked -- or rather, why they didn't work under certain circumstances.

One of my first ambitious projects was a tool called XProtect Analyzer. The goal of that project was to build a tool that could quickly and consistently identify problems, or potential problems, with a Milestone XProtect installation. It was self-updating and could update the set of "test definitions" it used dynamically.

In 2019 I started learning PowerShell and published MilestonePSTools - a PowerShell module enabling "easy" configuration of, and reporting on Milestone XProtect VMS installations. In the process of developing this module I fell in love with PowerShell, and the PowerShell community.

I continue to maintain MilestonePSTools, and as a "Senior Principal Support Engineer", I have a broad range of additional responsibilities including:

  • Advocating for our customers (for every definition of "customer")
  • Offering assistance with complex and/or escalated technical support cases
  • Offering technical guidance to internal and external customers
  • Identifying important areas of improvement
  • Occasionally doing technical presentations online or in-person
  • Working with our key accounts and project managers on strategic projects