Humanitarian Toolbox Codeathon .NET South East - Coding for the Greater Good

On Saturday (20th January) we held a special .NET South East event, spending the day ‘coding for the greater good’ on the Humanitarian Toolbox allReady project. We were very excited to be joined by Richard Campbell, one of the co-founders of Humanitarian Toolbox and co-host of the popular .NET Rocks Podcast. A team of 19 volunteers joined us to contribute towards the project during the day, all first time contributors to the project. For many, this was also their first time working on an open source project and GitHub.

Richard Campbell - Humanitarian Toolbox co-founder
Richard Campbell Introducing the Humanitarian Toolbox to our Team.


The possibility of running a codeathon came together quite recently and once I was able to arrange with Richard for him to join us, I kicked the planning into high gear. The first problem when trying to host an event like this is usually finding a suitable venue. In my case this was not a problem as Madgex, my employer, are very supportive of these events and were immediately open to the idea of hosting it. We have three neighbouring meeting rooms which can be opened up into one larger space. We do this for our monthly .NET South East meetups too and it creates a very reasonable working area.

We picked the date around Richard’s travel plans for NDC London. Richard and Carl were recording their shows at the event and Richard had a day spare following the conference which was ideal for hosting the codeathon. I created a meetup event to allow people to begin reserving their place at the codeathon. Initially I set a limit of 14 spaces until I’d had chance to fully assess the logistics of running the event. In the end we raised this to 18 spaces.

So we now had a date and a venue planned; the final  thing I started to put into place was food. I wanted to ensure that our contributors didn’t run out of steam too early in the day and as we all know, the best fuel for developers is pizza!! Madgex kindly agreed to pay for the pizzas and also for some post event catering to re-fuel before our regular meetup began.

Organising GitHub Issues

After the Christmas holidays I started to organise the issues in the project. allReady has evolved over the last few years into a quite large application. As a result, the complexity level for those starting out with the project has increased. When running a codeathon I am conscious that for some people, everything may be new and so I wanted to try to make the barrier of entry as low as possible. Part of this includes having a good range of smaller issues that can be easily tackled by first-timers.

Fortunately, one of the things we had recently been focusing on is the need to improve the user experience (UX) of the application. The application is very much functional, but not always intuitive for a new user. As a result of this I spoke to a friend of mine, Chris, a UX designer working in Brighton. We spent a couple of hours reviewing the application and during that session he found a number of small, but neccesary changes we could make to give us some quick win improvements to the UX.

After that meeting I came away with a lot of subtle changes that I was able to create issues for; perfect for the codeathon. These may not see very exciting on the surface but they will really help improve the usability of the application. They were also small enough that they can easily be tackled in one day as someone new to the project finds their feet. I hoped these could be good gateway issues before people started to tackle more complex feature requirements.

In the week leading up to the event I spent time organising the final logistics, such as ensuring we would have sufficient power connections for all of the laptops. I was also able to increase the RSVP limit as we wanted to make the most of the opportunity and allow as many members of our community to contribute. I also reached out to some local charities to see if they would be interested in attending the event to see how the application may be able to help with their own requirements.

I am very thankful to some of my colleagues at Madgex who were also helping to make sure we had everything in place ready for the weekend. This was particularly useful as I was at the NDC London conference the three days prior to the event so couldn’t be there in person to perform any last minute preparations.


On the day of the codeathon I set off by train to Brighton. Once there, my first stop was to pick up Richard from his hotel. Dan, the organiser of .NET Oxford was also staying at the same hotel and would be joining us for the event. It was great to finally meet Dan in person after many months of chatting via Twitter about running our user groups.

Together, the three of us set off for the Madgex office. One of my colleagues, Chris was already there and had been helping out by letting the early arrivals into the building.

The next 45 minutes to an hour were spent organising the meeting room space. Again, my colleagues had been very helpful, having set up a few things the day before. We just needed to ensure we had the suitable power points for the numerous devices we’d be running on the day. Ricky, our IT support technician at Madgex had kindly come in on his weekend to help with the setup and to be on hand for any technical challenges.

The setup went very smoothly and soon we had most of volunteers for the day settled in. Nearly everyone had been able to get the project cloned onto their laptops and tested prior to the event. This is extremely useful and meant that we were ready to start the event and begin coding with very little delay. At codeathons this really does help with the productivity as we can focus on code, rather than machine preparation.

At about 9:20am we were all ready to begin. We started with a short introduction from Richard who shared the history behind Humanitarian Toolbox and the goals of the allReady project we would be working on. Our volunteers listened with rapt attention and it was fantastic to have Richard with us to share his passion for the charity he has founded.

Humanitarian Toolbox Codeathon introduction

After Richard finished his introduction, I spent a few minutes speaking about the technical stack and the basic flow for working on issues and submitting pull requests. I find it useful to review this flow before starting, especially when we have some first time open source contributors in the room. In hindsight I probably needed to mention a few other things to make it easier for people to get going which I’ll include in my slide deck for future events.

With the introductions complete, we commenced coding. Everyone was heads down very quickly, choosing issues to work on and producing code to address them. As expected, there were quite a few questions along the way and I hope I was able to help everyone get started without too much of a delay. There’s a lot to take on and learn at an event like this and I thank everyone for being very patient as I worked through the various questions.

In under 1 hour we had had our first pull request to the project and after that the flood gates opened and more streamed in. I did my best to keep up with the requests, performing code reviews before merging them into the project. Our AppVeyor account was struggling under the load a little. Each pull request to the project triggers a build on the AppVeyor system. This is very useful to be able to verify that the code included in the PR builds and that the tests all pass. As we had many PR’s coming in concurrently, it did start to creak at the seams a little. Worth noting for future events to see if we can increase the capacity of the account.

We had a brief lunchtime break for pizza at around 12:45pm, which was a good chance for people to break from their screens and chat about the progress so far. The morning had flown past at a great rate and already the team had achieved a great deal. The team were eager to get going again and before long were back at their laptops, working on the next set of pull requests!

Codeathon contributors in action

During the afternoon we had organised a series of User Experience (UX) user testing sessions. We are conscious that the project has been developed mostly by backend developers and as a result, while functional, the User Interface (UI) and UX of the project leave something to be desired. This is now a focus on the project to see what we can change and improve to make it as easy to use as possible. A big thanks to my friend Chris for joining us to run the user testing sessions and to our willing test subjects, Jenny, Zen and my wife Rhiannon. It proved really useful and we now have a number of good suggestions from Chris for changes that we can make to resolve some difficulties identified during the testing.

The afternoon seemed to go even faster than the morning, with more PRs being made as people became more familiar with the project and the workflow. By 5pm we had made significant progress and it was time to wrap up the event. We concluded with some sandwiches provided from a local caterer which were very welcome after our busy afternoon.


Including myself and Richard we had 17 people working on the project all day, and a further 4 contributors for the additional work being done in the afternoon to perform the UX testing. This was a really great turnout and it meant we could get through a lot of work in a relatively short space of time. I can’t thank everyone enough for coming along and helping to make the day such a success. On reflection, the number we had was just about right. Any more would have been harder for me to support without delaying people.

In total we had 30 pull requests opened during the event. That’s thirty issues within the project being addressed and fixed which is pretty incredible. That may be close to a record for a single day Humanitarian Toolbox event! I was able to review and merge 18 of those during the day as well, which means that code is already active in the project. I will endeavour to get through the reviews of the remaining 12 PRs as soon as possible.

How can you help?

If you like the sound of this project and this style of event, we’d love for people to join us in contributing to allReady. For those that took part in the codeathon, we hope many will continue contributing to the project too. During the next couple of months there is a global Microsoft MVP (Most Valuable Professional) event running which is a virtual codeathon to get Microsoft MVPs from around the world contributing to the project. I am helping to organise and run that event and hope to see lots of activity on the project leading up to the Global MVP summit event in March.

This is a great time for newcomers to join the project as we have lots of experts on hand to support you and help you get started. The best place to start is to visit the GitHub project repository. From there you can view the open issues and jump in wherever you feel comfortable. If you need support, just let us know and we can help out.

I have started a series of videos explaining how you can get started with open source contributions and showing the technical steps. You can view these on my YouTube channel.


I’d like to wrap up with another huge thank you to everyone who helped in some way with organising this event and especially to those contributors who took part during the day. It was a great showing from the community and I hope everyone enjoyed the day as much as I did. The aim of the event was to introduce people to the project and get them past the learning curve for contributing to an open source project. A big thanks to Madgex for supporting the event with the use of their meeting rooms, as well as for providing some food to keep the troops fuelled up. In my opinion it was a huge success and I hope that we can arrange future events to continue the good work from everyone who contributed.

Working on Your First GitHub Issue Contributing to open source projects (Part 2)

In this post we’ll look the steps that you can take as a new contributor to open source, in order to find and work on your first contribution to an issue on GitHub. As with the first post (Forking and Cloning from GitHub), we’ll use the Humanitarian Toolbox allReady project as our example.

Choosing An Issue

The first step when contributing to a project is to visit the project site and find an issue you would like to work on and which you think is suitable for your skill set. From the project homepage on GitHub you can click the Issues tab to navigate to a list of the open issues.

GitHub navigating to the issues

As a first time contributor you will ideally want to find something small and relatively straightforward to use as a nice entry into the project, before trying to tackle larger more complex issues. Don’t try to dive in too deep on your first few contributions!

Many projects will label their issues and this is often a good way to filter down the issues list to ones that you might want to work on. On the allReady project we have a “good first issue” label and we also use the “upforgrabs” label convention. “upforgrabs” is a label projects can use to highlight available issues, usually ones which are good for new contributors. There is a master site which scrapes these and provides a way to find issues that you can contribute to across many projects on GitHub.

To view a list of the available labels you can click on the “Labels” button in the UI

GitHub label filter button

From the labels view, you can scroll and find a label to work on.

From this list for allReady, “good first issue” sounds like a reasonable candidate for newcomers so we’ll click on that. This will result in a filtered view of issues, showing only those which have this label applied to them.

GitHub issues filtered by label

In this example, there is one issue now showing. We can click on that issue to view more detail and to determine if it’s something we’d like to work on.

GitHub Issue Details

The issue details page provides the full information about the issue. Usually the top comment will include details of the bug or the feature that is needed. Issues can be raised by anyone and as a result, the level of detail may not always be sufficient to understand the problem or requirement. On allReady, the project owners and core contributors try to view new issues and triage them. This involves verifying the issue being reported is valid and where necessary, providing some further details or guidance. If it’s not clear what is needed from an issue, you can leave a comment to ask questions about it. If you have an idea for a solution, but want to run it past the project team before starting, work, you can leave a comment for that too. Issues are a good place for open discussions like this.

In this example, the requirement is quite clear and the solution should be very simple; we’d like to have a go at working on this issue. It’s good practice and etiquette to leave a comment an any issues you plan to work on so that other people know it’s no longer available. Having two people spending their time on the same issue can be frustrating. It’s also worth pointing out that you should check for any comments indicating that someone else is already working on an issue before you pick it up yourself!

Leaving a comment on GitHub

Working on an Issue

When beginning work on an issue locally, the first thing you’ll need to do is to create a branch for that piece of work. There are many Git UI tools that allow you to create a branch, for this demo we’ll use the command line. To create and checkout a branch you can use a single command.

git checkout -b <branchname>

This command allows us to specify a name for our new branch and immediately check it out so we can work on it. The naming convention you use for your branches is up to you. They will live in your clone and fork of the project. Bare in mind, once pushed to your public fork and when you later submit a pull request, they will be public. I tend to use the issue number for my branch names. Personally I find this works quite well since the branch names are short and I can easily lookup the issue details on GitHub to see the requirements. In this case, the issue we’ve selected is issue #2204 so I’ll use that for my new branch name.

git checkout -b 2204

Checkout a Git Branch

Once we are on our new branch we can make changes to the code which address the issue. I won’t show that here, but for this issue I opened up the markdown file and made the appropriate fix to remove the duplicated text using VS Code. You can use any tools you like at this stage to work on the code and files.

Once we have made the required changes that address a particular issue, we need to commit that code to our branch. We can use the “git status” command to view the changes since our last commit.

Git status modified

In our example above, only one file has changed. We then use the “git add” command to stage the changes for the next commit. As we have one modified file we can use the following command:

git add .

This stages any new or modified files from our working tree.

Next we will commit our staged changes using the “git commit” command. In this case we can use the following example:

git commit -m "Fixed duplicate text"

The -m option allows us to specify a message for our commit. It’s good practice to try and provide a succinct, but descriptive message for your commits. This helps a reviewer understand at a high level what was addressed in each commit.

At this point we have made and committed out changes local to our development machine. Our final step is to push the changes to our fork of the allReady repository up on GitHub. We can do that using the “git push” command. We need to specify the name of the remote that we want to push to and the name of the branch we want to push up. In our example, the command looks like this:

git push origin 2204

This pushes our local 2204 branch to the origin remote, which is the fork of the allReady project which we created on GitHub.

Result of git push to GitHub


At this stage we have selected an issue to work on and begun that work locally on a new branch of the code. Once we had completed our changes we are able to commit those and push them up to our fork of the code on GitHub. In the next post we’ll look at how we create a pull request in order to submit our change to the project for inclusion.

If you are a visual learner, then I have a video which covers the topics in this post available up on my YouTube Channel

Other posts in this series

Part 1 – Forking and Cloning from GitHub
Part 2 – This post

Forking and Cloning from GitHub Contributing to open source projects (Part 1)

In this post I’m going to share the initial steps that you will need to take in order to be begin contributing to an open source project. I’ve covered this more generally in the past and wanted to provide a more focused post that covered these steps for a new open source contributor. For this post we’ll use the Humanitarian Toolbox allReady project as our example.

Forking a Repository

When beginning to contribute to a project on GitHub, your first step is to fork the repository. This creates a copy of that repository under your own account enabling you to begin working with the code. The rights to public repositories will be such that you can view the code, but not directly commit into the repository or create branches. This allows the project owners to control changes within their codebase. Changes are made via pull requests; which we’ll cover in a future post.

The forking step creates a copy to which you do have permission to commit and branch on and you can consider this your working copy of the project. You can make changes and commits here, safe in the knowledge that you will not affect the main repository.

The process of forking on GitHub is very simple. Make sure you are logged into your account on GitHub and then open the project you are interested in contributing to. In this example I’ll navigate to Once inside the repository you will see a “Fork” button in the upon right hand corner of the UI. Click on this button to begin the automatic forking process.


GitHub Fork Button



GitHub forking progress

Within a few seconds you’ll have your completed fork.

Cloning your Fork

Now that you have your fork, the next step is to clone the code down to your local development machine. Again, GitHub make this quite simple in their UI. To clone a repository you will need its URL. Clicking on the “Clone or download” button will open a UI showing the Git URL. A button to the right hand side of the URL allows you to copy it into your clipboard.

GitHub Clone or Download button

To perform the clone operation I’m going to demonstrate using the command line. There are various graphical tools you can use to work with Git repositories but for simple procedures, the command line is often fastest.

Open a command window and navigate to the path where you would like to clone the repository.

Use the following command to begin a clone:

git clone

Here we’ve pasted in the URL of the fork that we just copied as the argument to the “git clone” command. You will see the output of the clone command as it clones the contents of your repository onto your local device.

Git clone progress

Once the command completes you will have a new folder containing the cloned repository. We can validate this by running the “dir” command.

Directory after cloning

Next we’ll need to navigate into the newly cloned folder. Will do that with the following command:

cd allReady

Registering an Upstream Remote

The final step is to setup a remote which points to the main repository. Remotes simply represent paths or URLs to other versions of your repository. In our case, as we cloned from our fork on GitHub a default remote will have been setup for us called origin. This origin allows us to push and pull code from our forked repository hosted on GitHub. We can list the currently configured remotes on our machine using the “git remote” command.

Default git remote for origin

Pushing and pulling from your own fork is very useful and this will be how you will work with the project most often. However, when working on that code, you’ll want to be starting from the most recent version of the code from the main allReady repository. That code may have been updated and changed since you first made your fork. In order to get access to that latest code, we’ll setup a second remote which points to the main allReady repository. We will not have commit rights there, so we cannot push changes, however, we will be able to fetch the latest commits that have occurred.

To create a new remote we use the “git remote add” command, passing in a name for the new remote and the URL as arguments. First we need the git clone URL for the remote we want to add. We can get this by heading back to GitHub in our browser. From our fork we can use the convenience link to take us back to the main repository from which we forked it.

Switch to fork parent repository on GitHub

Once back in the allReady main project we can use the same steps as we previously used to access the clone URL via the “Clone or download” button and copy it to our clipboard.

Back in our command window; to add our remote for our allReady example we’ll use:

git remote add upstream

We could name the remote anything we like, but the convention is to use upstream, so we’ll follow that.

If we run the “git remote” command again we can verify that we now have two remotes.

After adding upstream remote


That’s as far as we’ll take it in this post. We have forked a copy of a repository, in this case allReady, and then cloned the code down to our local machine. We’ve down the work needed to setup an extra remote and we are now in a position to begin working on our first issue. We’ll cover that in a future post.

If you are a visual learner, then I have a video which covers the topics in this post available up on my YouTube Channel

Other posts in this series

Part 1 – This post
Part 2 – Working on Your First GitHub Issue

2017 – The Year in Review Looking back at an exciting 2017

2017 was an incredibly fun, exciting and busy year for me. I’m a bit late in pulling it together but I wanted to write this year in review post.

2017 Highlights

For me there are a few distinct highlights that come to mind in a year packed full of goodness…

MVP Award

The biggest highlight by far was being nominated for, and later being presented a Microsoft MVP award. To say it was a dream come true would not be true, as I’d never even considered dreaming it before being nominated! I’m still getting used to the idea of joining such an amazing group of community leaders, experts and enthusiasts. My trophy sits pride of place on my desk at home and I often glance at it to reassure myself it actually happened!

Microsoft MVP Award Pack

Public Speaking

I kicked off my speaking “career”; first with some small internal talks at work, then a 20 minute public talk in April, next a talk at London .NET User Group and then two conferences. One in London for Progressive .NET, one in Germany at ADC Core! In January last year, I would have laughed at anyone that said that within the year I’d be volunteering to talk in front of a room full of people! I’m gaining my confidence, experience and most importantly enthusiasm to present more talks in 2018. I’m applying to conferences and planning new talks that I hope will benefit the community. I found a passion for sharing with the community and giving back, since I have personally learned a lot from other writers and speakers over the years.


I again managed to carve out some time to contribute to the Humanitarian Toolbox, allReady project. During 2017 I submitted 45 pull requests to the project, with 121 commits. Some of the biggest work involved migrating from 1.0 to 2.0 of ASP.NET Core. I’ve gotten more involved with helping plan and manage issues, answer questions and review pull requests. It’s a fantastic team and a project I love working on. I also created a little OSS library for basic correlation IDs on ASP.NET Core APIs. It was something we needed at work that I chucked together one weekend and published to NuGet. It’s had nearly 17,000 downloads!! I guess that number is skewed by CI systems and the like, but still way more than I imagined would ever pull it down! I completed a 2.0 upgrade for that project during the Christmas break which added a context concept that might be useful.

Meeting People

I got to meet some great people within the community, as well as forming friendships both online and off. As a naturally introvert and shy person, this hasn’t come easily but I’m building my own self confidence, the more I put myself out there. I got to meet a few people I never expected to meet in person which was a real bonus. Much of that has come from the two items above, contributing to allReady and starting to speak at conferences. In additional I’ve got to know many people via Twitter and enjoy being engaged with the community directly. I learn a lot from the blog posts and content shared via Twitter and rarely does a day pass without my flagging something to read later.

Twitter Growth

My Twitter follower count has grown dramatically this year. On the 10th of January 2017 I marked the milestone of reaching 100 followers with a tweet. By the close of the year I got close to 700 followers which seems incredible to me. I hope this is because my content is resonating with people and being deemed useful. Thanks to everyone who follows me and engaged with me in some way in 2017. Let’s make it at least 1,000 followers this year! That would be very cool!


My blog has been a big focus for me in 2017. I published 45 posts during the year, which looking back is coming on for 1 per week on average. I really love writing for my blog and sharing what I’m learning. Much of the content is ASP.NET Core related, although Docker is featuring heavily too. I’ve started to try and write more soft-skills type posts as I develop myself personally and professionally. For example I wrote two long posts focused on my progress from hating public speaking, to actually really enjoying it. I enjoyed writing something a bit different and while they are long and probably not to everyone’s taste, I had some nice feedback. I’ll hopefully break down some shorter posts early in 2018. I’ve been honoured that a lot of my posts have been featured on the ASP.NET Community Standup by Jon Galloway. That’s certainly helped with reach. In terms of numbers, I’ve seen some impressive growth…

Headline Numbers:

  • 117k unique visitors (up  242% on 2016)
  • 185k sessions (up 268% on 2016)
  • 233k page views (up 290% on 2016)

I’m not sure how that compares to other blogs, but I’m happy with that reach and the growth factor. I’d love to keep growing it in 2018 and will aim to keep up the flow of quality posts. I have many drafts from 2017 left partially worked on which I will pick up against soon!

I also took a quick look at my top 10 posts:

Blog Post

Unique Pageviews

R.I.P project.json – Out with the new, in with the old


How to Send Emails in ASP.NET Core 1.0


Docker for .NET Developers (Part 1)


Migrating from .NET Framework to .NET Core


Implementing IHostedService in ASP.NET Core 2.0


Docker for .NET Developers (Part 2)


CQRS with Mediatr and ASP.NET Core


Upgrading to ASP.NET Core 2.0


Getting started with ASP.NET Core 2.0 Preview 1


ASP.NET Core Identity Token Providers – Under the Hood


The project.json one got a lot of traffic not long after the announcement of it’s demise! Good to see Docker up there. Interesting that the how to send emails in 1.0 is so popular. Maybe I need to produce and update for 2.0 that covers the options we have now!

.NET Meetup

For a while I’d craved a local user group focused on hosting speakers for .NET related topics. I started attending Brighton ALT.NET early in 2017 which is a long running group hosted by Mike Hadlow. It’s a fun event and I enjoy attending, however it’s format is discussion based and I still wanted an option to see speakers present longer topics. This kept coming back to me during the year and by mid 2017 I started to seriously consider starting a meetup. However I was worried about how to go about it. Where would I even start? In the end I decided to simply bite the bullet and put one together. I created a .NET South East meetup account, agreed with Madgex, my employer, that I could kindly use their office space and got planning. It all came together quite quickly and we had our first event in August. The membership has exceeded my initial imagination and we get a good turnout of regulars. Our busiest night was when we arranged for an evening with Jon Galloway that packed the space we had with nearly 60 people. I’m so glad the community are getting behind the group and the feedback is always positive. Thanks to all of the speakers and attendees who’ve made it a reality. Thanks especially to some of the Madgex staff who have continually supported the logistics of the events. Big shout out to Chris Sargood in particular who’s helped me with every event.


My career has progressed at Madgex and I enjoy every day working for them. I’ve got to work on some exciting greenfield technology, building our new reporting system using the latest tools. I learn a lot from working within such a great team of people. I was very happy to be promoted to senior developer during the year and towards the end of 2017 took on some extra responsibilities as a developer community lead. I’m excited about the goals of that role and look forward to working with everyone more closely in 2018.


I’m continuously learning and my personal view is that you have to proactively work at learning new things, consuming new ideas and experimenting all the time. I’ve learned a lot simply by working with new technology in my day job as well as a significant amount from contributing to Humanitarian Toolbox. I love developing and keeping up with the ASP.NET Core space in particular. I watch a lot of recorded conferences and online video content as primers on topics. I then seek blog posts to dive in a bit deeper. I spend a fair bit of time watching the notifications on the ASP.NET Core repositories and reading some of the code there which I find very useful. One of my best learning tools though has been to teach. I found that I learned so much from each and every blog post I put together. Speaking has taken me even deeper as well. I can’t recommend sharing content enough as a way to develop your skills and truly understand something. It’s a win-win!


Late in 2017 I started thinking about recording some YouTube videos. I’d been approached by a couple of online course providers about creating content, but honestly felt I needed some more experience first. In November I started experimenting and in December I recorded my first video about ASP.NET Core Startup, focusing specially on Program.cs. I was quite happy with the content for a first try, but the quality was not quite at the level I wanted, so I invested in some new equipment, including lighting and a proper microphone to hopefully take me to the next level. I’ve since managed one more video, this time about Dockerfile Basics and it’s an improvement over the first video. They’ve gained quite a lot of views (around 700 between them) in a short space of time which has encouraged me to put more time into this during 2018. It’s a lot of work though! I’d like to consider producing a formal course as well if I can find the time and some content that’s not already been covered!

Looking to 2018

I’ve been setting personal goals and noting down ideas for 2018 for the last month or so. Much of it is really to build on 2017. Keeping up blogging, doing more video content and hopefully speaking at more conferences. Overall it’s about being part of the community, earning my MVP wings and sharing what I can with others. Hopefully some of my crazier ideas will become a reality too. I’ll save those until they happen! A key thing I learned in 2017 is that anything is possible if you put the work in. I achieved far more than I would have written in a list at the beginning of the year!

Here’s some larger things on the list for 2018

  • MVP Summit – This is the big one for me and will be my highlight of 2018 for sure. I’m all set to travel to the US for the first time to visit Microsoft HQ in Redmond. It’s an extremely exciting opportunity to meet fellow MVPs as well as interact with the Microsoft teams directly. I’m told it’s a very tiring and packed experience but so, so valuable.
  • NDC London – In a week and half I’ll be attending NDC London. I’ve always wanted to go to an NDC conference in person. Last year I took part in a two day codeathon for Humanitarian Toolbox before the main conference but this year I get to pack in three days or learning and networking. I’m really looking forward to catching up with some people from the Twitter world as well as hopefully meeting a few “tech celebrities”!
  • Humanitarian Toolbox codeathon – The day after NDC I’m very excited to have been able to organise a codeathon in Brighton. I’ll be joined by Richard Campbell to spend a day coding with developers from Madgex and the Brighton community. It’s going to be an exciting and hectic day. I love introducing new people to the allReady project though.
  • Videos – I plan to spend more time recording in 2018 now that I have learned the basics. Why not subscribe to my channel to be notified of new content?
  • Live Coding – I’d like to try some live coding in 2018. It’s an intimidating idea but I think it’s well worth trying. I’ve been watching Jeff Fritz do regular sessions and it’s very inspiring. I also think it’s extremely valuable to see someone code “for real” and not in an edited video. Don’t get me wrong, there’s lots to learn from video training courses and it’s a big part of my learning pattern. The polished videos are great when you want to learn a topic. However, edited videos do tend to disguise the reality and the challenges of coding, obscuring the picture for junior developers which can lead to people feeling under skilled. I know I’ve left videos feeling like I’m not skilled enough, but those videos are likely shot multiple times and edited together to give that clean, slick impression. Live coding lets people see that we’re all human. We miss things, get stuck at what later seem like obvious blockers, make errors and forget stuff. I’m sure we all write sloppy or poorly crafted code at times! My plan would be to live code as I work on issues for Humanitarian Toolbox. The main problems is scheduling as I’m not sure I can easily commit to specific, regular days/times which does make it harder for people to join in live.
  • Blogging – Lots more blogging in 2018 I hope. I want to continue some of the series I started in 2017 as well as finding new areas to explore and topics to cover.
  • Speaking – I definitely want to do more talks in 2018 now that I’ve got my feet wet. I’m actively submitting to talks and developing ideas for a range of new topics. As well as conferences I hope to get to some of the UK meetup groups as well.
  • Learning – As I said earlier, this is a continuous effort for me. You get out what you put in. I’ll be reading a lot of blogs and books, watching videos and hopefully attending some conferences. My particular focus is on the deeper internals of .NET and focusing on performance and bench marking. As ever I’ll dive off into any tangents the Twitter community provides!


So it”ll be a great 2018 I’m sure. Thanks to everyone I met, talked to or interacted with in 2017.

Producing my First ASP.NET Video How I recorded ASP.NET Core 2.0 - Exploring Application Startup

This weekend I published my first ever technical video on YouTube. It’s a short 8 minute introduction which explains how an ASP.NET Core 2.0 web application starts up. Specifically I chose to explore the contents of the Program class, digging into the IWebHostBuilder. It’s designed primarily for beginners to ASP.NET Core, but hopefully it will also be of interest to developers who have some experience of ASP.NET Core already.

I’ve been wanting to record some video content for a long time but it’s always been something that has slipped down my list of things to do. This past week I managed to grab some time in the evenings to experiment with the recording process and on Saturday I had a whole day free where I could focus on the recording, editing and production of my first video.

The first thing I learned is that it takes a lot longer than you might think to produce a completed video. I expected to be done by midday but in reality I wasn’t able to complete the upload before about 4pm in the end. To be fair, a lot of that was simply learning the process. I was using Camtasia for the first time and so some of the time was spent getting up to speed with that too. In the end, including experimenting with the setup, I think I spent between 6-8 hours to get this single 8 minute video finished. I expect that to reduce as I do more videos and purchase some proper equipment but it’s still a much larger investment than blogging!

The toughest issue that I faced was with the lighting. My home office is not the most well lit room in the house, and with a gloomy sky outside it was fairly dark. For this first video I put together a basic homemade setup using a couple of lamps and a reflector. My wife and I are part time photographers, so having the reflector to hand was useful. It’s not a perfect setup but it was enough to get me somewhat reasonably lit.

Based on this great post from Scott Hanselman I now have ordered a small Neewer CN 160 LED video light from Amazon which I hope will make the setup more repeatable and professional in the future. I’m hoping it arrives in time to test it out before Christmas.

The next challenge is good audio. I had a couple of options initially; using the built in audio from my Trust HD webcam or using my Microsoft headset. Neither felt like a great option so I decided to try recording the audio separately via my phone. I used my Samsung hands free headphone with microphone which I positioned in front of me connected to my Galaxy S7. I then used a Voice Recorder app on my phone to record the audio. I remembered to clap loudly at the start of the video so that I could sync up the sound and video later.

This worked reasonably well and the sound is okay for now. I used a the noise reduction enhancement in Camtasia to clean it up a little and then did some volume leveling as well. I found that getting the video and audio syncing spot on was quite difficult as Camtasia only allows the movement of tracks by frames and after one perfect take I couldn’t get the audio perfectly aligned. It was just enough out that I had to ditch that recording. My next attempt worked a lot better. Once I do more videos I’ll look to invest in a decent USB microphone and stand.

Here is my final setup for this first video:

My video recording setup

And here is the final video:

I’ll try to write a more thorough blog about the video recording process once I’ve developed it further and got it to a point where I think it’s useful for others. I hope to be able to make more time to record new content to share with you soon. Until then, please check out the video and like/share if you enjoy it. I’d welcome your comments and feedback as well.