ABOUT US ABOUT US

> Simon Timms

Simon Timms is always interested in improving himself and learning all that he can. He has worked in various oil and gas domains as well as insurance and enterprise search. He began his career working with build systems so is very passionate about proper builds and is excited by the burgeoning DevOps movement. For the most part Simon works in C# mostly on web applications. Somehow he seems to have picked up a reputation for knowing about JavaScript. He is a big fan of ReactJS and currently dislikes knockoutjs, but that will likely change in a day or two. Check back soon!

Simon holds an honours degree in computing science from the University of Alberta and a masters in information systems from Athabasca University. Simon believes in community and giving back for all of his good fortune. He helps run the Calgary .net User Group where he typically talks several times a year. He also talks whenever he can at technical conferences. He is a two time ASP.net MVP and blogs at Simon Online.

> Blog posts

NOV
20
2024
NOV
14
2024
NOV
10
2024
OCT
12
2024
SEP
15
2024
SEP
14
2024
NServiceBus Kata 6 - When things go wrong
Simon Timms
So far in this series things have been going pretty well. We've looked at sending messages, publishing messages, switching transports, long running processes, and timeouts. But what happens when things go wrong? In this kata we're going to look at how to handle errors in NServiceBus.
SEP
9
2024
NServiceBus Kata 5 - Timeouts
Simon Timms
In the previous kata we looked at sagas which are a way to coordinate long running processes. In this kata we're going to look at another tool in the NServiceBus toolbox: timeouts. Timeouts are a way to schedule a message to be sent at some point in the future. This is a powerful tool for building out complex processes.
SEP
2
2024
NServiceBus Kata 4 - Long Running Processes
Simon Timms
We now have a pretty solid way to send messages, publish messages and we've got those messages flowing over a reliable transport mechanism. Sending and publishing individual messages only gets us so far. We often need a way to coordinate complex processes which involve multiple services. For this NServiceBus has the concept of sagas which some might call process managers.
SEP
1
2024
NServiceBus Kata 3 - Switching transports
Simon Timms
In the previous article we looked at publishing messages and the one before that sending messages. But in both cases we cheated a little bit: we used the LearningTransport. This is effectively just a directory on disk. It cannot be used as real world transport. Let's change out this transport for something more production ready.
AUG
31
2024
NServiceBus Kata 2
Simon Timms
In the previous kata we sent a message from one application to another. This is a common pattern in messaging systems. In this kata we're going to look at a different pattern: publishing a message.
AUG
30
2024
NServiceBus Kata 1
Simon Timms
Exciting times for me, I get to help out on an NServiceBus project! It's been way too long since I did anything with NServiceBus but I'm back, baby! Most of the team has never used NServiceBus before so I thought it would be a good idea to do a little kata to get them up to speed. I'll probably do 2 or 3 of these and if they help my team they might as well help you, too.
JUL
31
2024
Plinko Diagram
Simon Timms
NOV
23
2023
OCT
14
2023
MAR
15
2023
MAR
4
2023
MAR
4
2023
FEB
15
2023
Excel and Ruby
Simon Timms
AUG
12
2022
APR
7
2022
APR
4
2022
MAR
18
2022
FEB
18
2022
JAN
27
2022
NOV
19
2021
NOV
14
2021
OCT
25
2021
OCT
25
2021
OCT
22
2021
OCT
22
2021
OCT
22
2021
OCT
5
2021
SEP
17
2021
SEP
8
2021
AUG
31
2021
SQL Mail
Simon Timms
AUG
31
2021
JUL
29
2021
JUL
8
2021
JUN
24
2021
Azure Automation
Simon Timms
JUN
16
2021
JUN
7
2021
JUN
7
2021
JUN
3
2021
Sequences
Simon Timms
MAY
20
2021
MAY
11
2021
JQ
Simon Timms
MAY
10
2021
MAY
10
2021
MAY
8
2021
MAY
8
2021
MAY
8
2021
MAY
8
2021
MAY
8
2021
Transforms
Simon Timms
NOV
18
2020
Allocating a Serverless Database in SQL Azure
Simon Timms
I'm pretty big on the SQL Azure Serverless SKU. It allows you to scale databases up and down automatically within a band of between 0.75 and 40 vCores on Gen5 hardware. It also supports auto-pausing which can shut down the entire database during periods of inactivity. I'm provisioning a bunch of databases for a client and we're not sure what performance tier is going to be needed. Eventually we may move to an elastic pool but initially we wanted to allocate the databases in a serverless configuration so we can ascertain a performance envelope. We wanted to allocate the resources in a terraform template but had a little trouble figuring it out.
NOV
9
2020
Running Stored Procedures Across Databases in Azure
Simon Timms
In a previous article I talked about how to run queries across database instances on Azure using ElasticQuery. One of the limitations I talked about was the in ability to update data in the source database. Well that isn't entirely accurate. You can do it if you make use of stored procedures.
NOV
5
2020
NOV
5
2020
Querying Across Databases In SQL Azure
Simon Timms
I seem to be picking up a few projects lately which require migrating data up to Azure SQL from an on premise database. One of the things that people tend to do when they have on premise databases is query across databases or link servers together. It is a really tempting prospect to be able to query the orders database from the customers database. There are, of course, numerous problems with taking this approach not the least of which is making it very difficult to change database schema. We have all heard that it is madness to integrate applications at the database level and that's one of the reasons.
SEP
28
2020
The trimStart rabbit hole
Simon Timms
If you're missing expected functions in your TypeScript app the problem might be an incorrect target
APR
1
2020
Flutter unit testing with native channels
Simon Timms
Today I was digging through some unit tests in our flutter project that seemed to be failing on my machine but not necessarily in other places like our build pipeline. The problem was that we had some calls to async methods which were not being awaited properly. I fixed those up and they uncovered a bunch of more serious problems in our tests. We were calling out to validate a phone number with libphonenumber and now we were actually awaiting the call properly we saw this error
APR
1
2020
Solve WebForms Errors with PreCompilation
Simon Timms
I have a webforms application that I help maintain. Today I made some change and managed to break one of the pages on the site. The error was unbelievably unhelpful. In older versions of ASP.NET it is nearly impossible to diagnose these sorts of errors. Was it something with the web.config? Did I mess up the dependency injection? I messed about a bit and found that if I deleted everything out of the .aspx file things worked. So it was the view. But what?
JAN
10
2020
Allow Azure DevOps Hosted Agents Through Firewall
Simon Timms
I have an on-premise (well in a third party data center but close enough) database which I'd like to update via a build in a hosted agent on Azure. We've done this before in Jenkins by just allowing a specific IP address through the firewall. However we're in the process of moving to DevOps for this build. Unfortunately, the hosted build agents don't have entirely predictable IP addresses. Every week Microsoft publishes a list of all the IP addresses in Azure. It is a huge json document and for our region (Central Canada) there are about 40 IP addresses ranges the build agent could be in. We want an automated way to update our firewall rules based on this list.
DEC
30
2019
UNION vs. UNION ALL in SQL Server
Simon Timms
I really dislike database queries which are slow for no apparent reason. I ran into one of those today. It queries over a few thousands of well indexed rows and returned a handful, perhaps 3, records. Time to do this? 33 seconds. Well that's no good for anybody. Digging into the query I found that it actually used a UNION to join 3 sets of similar data together. I go by the rule of thumb that SQL operations which treat data as sets and do things with that in mind are efficient. I'm not sure where I read that but it has stuck with me over the years. What it suggests is that you should avoid doing things like looping over rows or calling functions on masses of data. As it turns out there are actually two different UNION operators in SQL Server: UNION and UNION ALL. They differ in how they handle duplicate entries. UNION will check each entry to ensure that it exists in the output only one time.
OCT
12
2019
Bulk Load and Merge Pattern
Simon Timms
The more years you spend programming the more you run into situations you've run into before. Situations you now know, instinctively, how to address. I suppose this is "experience" and is what I'm paid the medium dollars for. One such problem I've solved at least a dozen times over the years is updating a bunch of data in a database from an external source. This, as it turns out, can be a great source of poor performance if you don't know how to address it. Let's dig into my approach.
JUL
5
2019
Debug PHP Inside A Container with VSCode
Simon Timms
Sometimes good things happen to bad people and sometimes bad things happen to good people. I'll let you decide which one me developing a PHP application is. Maybe it is a bit of a mixture. This particular PHP app was a bit long in the tooth (what PHP app isn't) and ran on full VMs. My first operation was was to get it running inside a docker container because I couldn't be sure that my Windows development environment would be representative of production, then I wanted to be able to debug it. This is the story of how to do that.
FEB
18
2019
Durable Functions Analyzer
Simon Timms
When it was announced the Roslyn would become the default compiler for C# in Visual Studio I was super excited. I felt like it would generate all sorts of domain specific languages, custom flavors of C#, tons of custom error providers. So here we are 5 years later and almost none of it has come to pass. Why not?
FEB
15
2019
Durable Azure Functions vs. NServiceBus Sagas
Simon Timms
I've been on a bit of an Azure Functions kick over the last little while. I've blogged a bunch on Durable Functions and deployed a bunch more. When you're as old as me then you tend to draw comparisons between new technologies and existing ones. For instance I'm constantly telling people about how web pages are a lot like the cave paintings I use to do in my youth. The Twitter Exchange The technology that draws the closest comparison I've seen to Durable Functions are NServiceBus Sagas. A few weeks ago I tweeted out wondering if any body had done a comparison. The good folks at Particular stepped up and answered.
FEB
14
2019
Accessing B2C Claims in an Azure Function
Simon Timms
In a previous article I talked about how to authenticate your function application against Azure Active Directory Business to Consumer (which we're going to call B2C for the sake of my fingers). Chances are in your function you're going to want to get some of the information which is available as a claim from the bearer token. Here is how to do it.
JAN
31
2019
Running a single instance of a durable function
Simon Timms
I have a durable functions project which orchestrates several thousand function calls the purpose of which is to scrape and load a bunch of data. It is scheduled to run once a day but one of my concerns was that I didn't want to accidentally run to functions at the same time. They would duplicate a bunch of the data loading and, at least until the function ran again, chaos would reign. I'm not a huge fan of chaos reigning so I set out to find a way around this.
JAN
30
2019
Azure Functions and Azure B2C Authentication
Simon Timms
I had a pretty good struggle setting up Azure Functions and Azure B2C to work together. There are a few guides out there but I wanted to put my own together because I had a terrible time finding these posts initially. The scenario here is that we want a single page application written in React to talk to an API hosted entirely in Azure Functions such that the functions are authenticated.
DEC
6
2018
Creating Storage Queues in Azure DevOps
Simon Timms
Storage Queues are one of the original pieces of Azure dating back about a decade now. They are great for deferring work to later or spreading it out over a bunch of consumers. If you're following best practices for DevOps you'll know that the creation of your queues should be done in code. In some cases you can create the queues on application startup but in serverless scenarios there often is no startup code so the responsibility of creating queues falls to your deployment process. Let's look at how to do that on Azure DevOps
NOV
5
2018
Azure Data Factory - a rapid introduction
Simon Timms
Azure is huge. There are probably a dozen ways to host a website, a similar number of different data storage technologies, tools for identity, scaling, DDoS protection - you name it Azure has it. With that many services it isn't unusual for me to find some service I didn't even know existed. Today that service is Data Factory. Data factory is a batch based Extract, Transform and Load(ETL) service which means that it moves data between locations. I mention that it is batch to distinguish it from services which are online and process events as they come in. Data Factory might be used to move data between a production database and the test system or between two data sources.
OCT
21
2018
Checking in packages
Simon Timms
If there is one thing that we developers are good at it is holy wars. Vi vs. Emacs, tabs vs. spaces, Python vs. R, the list goes on. I'm usually smart enough to not get involved in such low brow exchanges... haha, who am I kidding? (vi, spaces and R, BTW) Recently I've been tilting at the windmill that is checking in package files. I don't mean the files that tell what version of files to check in but the actual library files.
OCT
20
2018
DevOps and Microservices - Symbiotes
Simon Timms
Two of the major ideas de jour in development circles these past few years have been DevOps and Microservices. That they rose to the forefront at the same time was not a coincidence. They are inexorably linked ideas.
OCT
12
2018
Terraform for a statically hosted AWS site
Simon Timms
Just the other day somebody was mentioning to me that they were having trouble setting up a statically hosted site on AWS. That was the kick in the nose I needed to get this article written as it's been on my back-burner for a while. Terraform makes the whole process easy.
JUL
2
2018
Weird JavaScript - Destructuring
Simon Timms
I've been at this programming game for a long time and I've written two books on JavaScript. Still today I ran into some code that had me scratching my head. It looked like 1function AppliedRoute ({ component: C, props: cProps, ...rest }) { I was converting some JavaScript to TypeScript and this line threw an linting error because of implicit any. That means that the type being passed in has no associated type information and has been assumed to be of type any. This is something we'd like to avoid. Problem was I had no idea what this thing was. It looked like an object but it was being built in the parameters?
JUL
1
2018
Application Insights Cloud Role Name
Simon Timms
Logging is super important in any microservices environment or really any production environment. Being able to trace where your log messages are coming from is very helpful. Fortunately Application Insights have a field defined for just that.
JUL
1
2018
Application Insights Alerts
Simon Timms
Application Insights is another entry in the vast array of log aggregators that have been springing up in the last few years. I think log aggregators are very important for any deployed production system. They give you insight into what is happening on the site and should be your first stop whenever something has gone wrong. Being able to search logs and correlate multiple log streams give you just that much more power. One feature I don't see people using as much as they should is basing alerting off of log information. Let's mash on that.
MAY
17
2018
SignalR as a Service
Simon Timms
The SignalR service which recently entered public preview in Azure closes the loop on building rich serverless applications.
MAY
15
2018
Reporting Success in JavaScript Lambdas when Using AppInsights
Simon Timms
AWS Lambda provides a solid platform for doing serverless coding but when used in conjunction with Application Insights there are some tricks to get the function to return properly.
MAR
28
2018
Environment Agnostic Packaging - Just Do It
Simon Timms
I've been noticing a bit of a trend lately around how some tools suggest you package your builds: they build differently for each environment. This is super-inconvenient if you're trying to progress a package through multiple environments. Just don't package configuration in with your build packages.
FEB
21
2018
Angular Testing Patterns - Leverage Observable
Simon Timms
One of the most challenging parts of testing is finding seams to reduce the scope of tests. Doing so is important because it make your tests smaller and cleaner which makes them more resilient to changes in the rest of your code base. Testing isn't helping you if every minor change breaks dozens of interconnected tests. Angular's heavy use of Observable provides us a great seam.
DEC
31
2017
Angular Testing Patterns - TestBed
Simon Timms
Spec files are automatically generated by Angular 5's CLI but most projects leave them empty. Why not actually write some tests? This post covers some useful patterns to make the whole process as painless as possible.
SEP
29
2017
Creating a Custom Matcher for TS-Mokito
Simon Timms
Mocking libraries can be useful, even in JavaScript testing. One of my favorites is ts-mokito a TypeScript mocking library. One minor problem with it is that it is lacking a good array matcher. In this article we'll see how to fix that.
JUN
7
2017
Running Kubernetes on Azure Container Services
Simon Timms
Docker is cool and all but shipping containers to production has a lot of added challenges. Scaling, deploying, rolling deployments, storage,... the list of challenges goes on and on. An orchestration engine, like Kubernetes, can solve many of the challenges.
MAY
11
2017
The Great RS-232 Adventure
Simon Timms
Talking over the RS-232 serial protocol is a bit of a blast from the past but I needed to use in on an Android tablet from within Xamarin. This is the, painfully complete, story of my journey.
MAY
3
2017
JSON.net not just for serialization
Simon Timms
If you happen to head over to https://www.nuget.org/packages and look at which package has been downloaded the most there is a clear winner: JSON.net. It is in everything, every where. JSON is so wildly ubiquitous that I play a little game with myself when I start a new project: how long can I go before I need to serialize or deserialize JSON and need to pull in JSON.net. I rarely last more than a couple of hours. But it turns out that there is a lot more that JSON.net can do.
APR
19
2017
Using azure-cli in windows bash
Simon Timms
The latest versions of Windows support running linux executables. The technical trickery to get that done boggle my mind. I wanted to get the Azure command line tools working inside of the bash. The tools are written in python so we need to get that installed.
MAR
19
2017
Getting Started with RabbitMQ in ASP.NET
Simon Timms
In the last post we looked at how to set up RabbitMQ in a Windows container. It was quite the adventure and I'm sure it was woth the time I invested. Probably. Now we have it set up we can get to writing an application using it. A pretty common use case when building a web application is that we want to do some background processing which takes longer than we'd like to keep a request open for. Doing so would lock up an IIS thread too, which ins't optimal. In this example we'd like to make our user creation a background process.
MAR
16
2017
Creating a Rabbit MQ Container
Simon Timms
I bought a new laptop, a Dell XPS 15 and my oh my is it snazzy. The thing I was most excited about was that I'd get to play with Windows containers again. I have 3 other machines in the house but they're either unsuitable for containers (OSX running Windows in parallels) or I've so toally borked them playing with early betas of containers they need to be formatted and reinstalled - possibly also thrown into the sun. So when I found myself presented with the question "how can we get into messaging in our apps for free?" I figured I'd crack open the laptop and build something with MassTransit. I found that MassTransit supports running on RabbitMQ. Why that sounds like a perfect opportunity to deploy RabbitMQ to a container. Only problem was that I didn't really know how to do that.
NOV
9
2016
C# Wildcard Variables
Simon Timms
Wildcard variables in C# are up for discussion for inclusion in C# 7 or some later version. They are a useful construct taken from functional languages like Haskel.
AUG
28
2016
You're using HttpClient wrong and it is destabilizing your software
Simon Timms
I've been using HttpClient wrong for years and it finally came back to bite me. My site was unstable and my clients furious, with a simple fix performance improved greatly and the instability disapeared. At the same time I actually improved the performance of the application through more efficient socket usage.
JUL
17
2016
An Intro to NGINX for Kestrel
Simon Timms
Kestrel is a server capable of serving up ASP.NET Core applications on any platform but in production you need to run it behind another server.
JUL
15
2016
End to end testing for your saga
Simon Timms
Looking to do end to end testing of your saga? I strugged.
JUN
11
2016
How I fixed OneDrive like Mark Russinovich
Simon Timms
Even with compiled applications it is possible to debug issues
MAY
6
2016
CI with F# SQL Type Providers
Simon Timms
F# type providers are awesome but it took me a bit to figure out how to get them to work with CI
APR
27
2016
Running your app on Windows Server Core Containers
Simon Timms
Getting started with NServiceBus on windows containers
APR
24
2016
FSharp.Data.SqlClient Type Provider Having Trouble Bulk Loading
Simon Timms
Uh oh: Method not found: 'Void FSharp.Data.DataTable`1.BulkCopy'
APR
23
2016
FSharp.Data.SqlClient Type Provider Not Finding Tables
Simon Timms
If the SqlProgrammabilityProvider isn't finding table names for you this might be the fix
MAR
16
2016
What is middleware anyway?
Simon Timms
I find middleware to be a confusing term which doesn't mean anything or perhaps means everything. Let's figure out what middleware means
FEB
18
2016
I squash my pull requests and you should too
Simon Timms
By squashing your git commits you can make everybody's life better except for Idi Amin
JAN
31
2016
ProTip: Get a random date in SQL Server
Simon Timms
How to fill a table with some random dates.
JAN
26
2016
Launching ASP.NET Monsters
Simon Timms
We're really excited about the new ASP.NET Core and the future of ASP.NET in general. So much so that we're starting a specialty site and a bi-weekly video blog all about it.
JAN
20
2016
ASP.net vNext is now ASP.net 5 is now ASP.net Core 1.0
Simon Timms
What the rename was and why it didn't go far enough
DEC
17
2015
SQL Server Aliases
Simon Timms
Ever run into that problem where everybody on your team is using a different database instance name and every time you check out you have to update the config file with your instance name?
DEC
16
2015
Updating Sub-Collections With SQL Server's Merge
Simon Timms
When you get to be as old as me then you start to see certain problems reappearing over and over again. I think this might be called "experience" but it could also be called "not getting new experiences".
DEC
4
2015
Copy Azure Blobs
Simon Timms
Ever wanted to copy blobs from one Azure blob container to another? Me neither, until now. I had a bunch of files I wanted to use as part of a demo in a storage container and they needed to be moved over to a new container in a new resource group. It was 10 at night and I just wanted it solved so I briefly looked for a tool to do the copying for me. I failed to find anything. Ugh, time to write some 10pm style code, that is to say terrible code. Now you too can benefit from this. I put in some comments for fun.
NOV
19
2015
Source Control for SQL Databases
Simon Timms
There are a bunch of options for migrating database schema, how can you be sure you've picked the right one?
NOV
7
2015
Stop OSX deleting /tmp so frequently
Simon Timms
Some time ago I lost a podcast recording because I stored it in /tmp. It is a bad habit but I tend to store things that I'm not going to need in the long run in /tmp. It is a throw back to my real Linux days when storage was expensive and I might not be back on that machine for a while to figure out why all the space was used.
OCT
13
2015
Getting Started With ELK using Docker
Simon Timms
Being able to trace calls through services an be difficult. We need to find some way to gather and aggregate these disparate logs. This is exactly what the ELK stack does.
OCT
13
2015
Layer Already Being Pulled by Another Client. Waiting.
Simon Timms
I've been seeing a lot of this frustrating error when working with docker today. It turns out that pressing ^C when docker is downloading layers is not a good thing. In my case I changed hotspots which broke the download so I hit ^C. There are a couple of issues on github, here and here but basically nobody cares that the docker experience in this scenario is crummy. If you encounter this error it seems the only way to solve it is to restart the machine on which docker is running. If you're running docker against a VM then restarting the machine seems to fix it.
OCT
5
2015
Yet Another Docker Intro on OSX
Simon Timms
You would think that there were enough introductions to Docker out there already to convince me that the topic is well covered and unnecessary. Unfortunately the sickening mix of hubris and stubbornness that endears me so to rodents also makes me believe I can contribute.
OCT
3
2015
Winner Selector
Simon Timms
A quick tool for picking winners from a list
SEP
15
2015
CrashPlan Tip - Move the cache directory
Simon Timms
I use CrashPlan to back up my collection of computers. It is a great tool and has saved me on a number of occasions. Most memorably was the time that I forgot the password for my comically well-encrypted drive. Restoring from crash plan got me back all the important things.
SEP
11
2015
A discussion on knockout
Simon Timms
It is rare that a day passes on the Western Devs' slack channel that we don't have some lively discussion. Today was my day to rant about knockout.js.
SEP
3
2015
A Couple of Things About Powershell Remoting
Simon Timms
I couldn't find the answers to these questions readily anywhere on the internet so I thought I would write them down here for the good of mankind. When using remoting as a different user does the target account or my account need to be an admin?
AUG
31
2015
Ooops, Repointing Git Head
Simon Timms
I screwed up. I force pushed a branch but I forgot to tell git which branch to push so it clobbered another branch.
AUG
28
2015
Running Process as a Different User on Windows
Simon Timms
Running commands as another user on Windows can be a bit tricky, but this is a method that worked for me.
AUG
15
2015
Change Management - the Missing Podcast
Simon Timms
Some people are really good at computers. I am, apparently, not one of those people. This last Friday we had a fantastic podcast with
AUG
14
2015
Azure SQL Point in Time Restore Is Near Useless
Simon Timms
Azure SQL Point In Time restores are so slow as to be near useless.
AUG
12
2015
Setting Up an IIS Site Using PowerShell
Simon Timms
The cloud has been such an omnipresent force in my development life that I'd kind of forgotten that IIS even existed. There are, however, some companies that either aren't ready for the cloud or have legitimate legal limitations that make using the cloud difficult.
AUG
7
2015
Change Management for the Evolving World
Simon Timms
I've had this blog post percolating for a while. When I started it I was working for a large company that has some internal projects I was involved with deploying. I came to the project with a background in evolving projects rapidly. It has been my experience that people are not upset that software doesn't work so much as they are upset that when they discover a bug that it isn't fixed promptly.
AUG
2
2015
Casting in Telerik Reports
Simon Timms
Short post as I couldn't find this documented anywhere. But if you need to cast a value inside the expression editor inside a Telerik Report then you can use the conversion functions
JUL
23
2015
Unit Conversions Done (Mostly) Right
Simon Timms
Thanks to a certain country which, for the purposes of this blog let's call it Backwardlandia, which uses a different unit system there is frequently a need to use two wildly different units for some value. And they have so many people and so much money that we can't ignore them.
JUN
10
2015
Getting lookup data into your view ASP.net MVC 6 version
Simon Timms
This is a super common problem I encounter when building ASP.net MVC applications. I have a form that has a drop down box. Not only do I need to select the correct item from the edit model to pick from the drop down but I need to populate the drop down with the possible values.

Simon Timms

Email Email
Web Web
Twitter Twitter
GitHub GitHub
RSS

Looking for someone else?

You can find the rest of the Western Devs Crew here.

© 2015 Western Devs. All Rights Reserved. Design by Karen Chudobiak, Graphic Designer