Nearly 2 years ago I was employed by VQ Communications primarily because of my open source contributions to NancyFX. They had started work on a v2 of their flagship product and had begun work with Nancy and needed someone to help drive a HTTP API and architect a scaling solution as their v2 product was addressing a requirement they had for it cope with large volumes of traffic. Also of interest to me was their aim to deliver all of this as a black box appliance to customers on a VM running a custom embedded version of Linux using Postgres as the database. I would work four days a week remotely and go into the office one day a week. They already had completely remote employees and since
For the past three weeks I have been living the dream - full-time development of Nancy, while still picking up a salary. Not long after I wrote my blog post about "Support the development of Nancy financially" I was contacted by a company, that are invested in Nancy and wanted to discuss a potential win-win scenario.
A couple of conference calls later and the deal was signed for me to work, full-time, on fast-tracking our plans to make Nancy run on the CoreCLR. This has always been a goal of ours, but we have been holding back on it because it has been a very moving target and there have been plenty of other fish in the sea to focus on.
I've always wanted to write a click bait headline and it seems like I've now found the perfect opportunity.
I run my side project, CompareVino, on the "Canoe" Appharbor plan - cheap and cheerful but it gets the job done. My only gripe was that NancyFX would take between 4
Working on Nancy has always been a labor of love. We have never thought about charging for commercial use or in any other put up a pay wall that restricts your use of the framework. During the past five years, thousands of hours have been put into making Nancy what is it today and it makes us extremely proud that it is being used in production, all over the world and in a wide range of products.
That said, even though Nancy itself is free to use, the development of it is not. Each hour we spend working on Nancy is an hour less we could have spent working on other personal projects or spending time with friends and family.
As with most project, time is the most valuable commodity we have
In my continued experience learning GoLang I started looking at how to best use it when dealing with HTTP. The idiomatic way to use GoLang and HTTP is to use the standard library which keeps things minimal but there are a few features missing. The first thing is a router. OOTB GoLang doesn't have a router and the majority seem to suggest using a package called Mux from Gorilla Toolkit, a set of libraries that aims to improve the standard library from Go. After having a play with it I didn't really warm to it so spent some time looking into the alternatives (and there are plenty!) and eventually decided upon Goji
Once I had started using Goji I then wanted to handle content negotiation
Usually when we put out a new version of Nancy, we also bump the version number of all other Nancy packages, even if they have not had any changes.
This approach has made it easy to know that you are using a version that is guaranteed to be compatible with the current Nancy version. It has made upgrading easy since you just update the Nancy package and it will update all other packages that has a dependency on the Nancy package.
However, now that the
v1.x releases have officially entered maintenance mode, we have decided that the
v1.4.2 release will break this tradition. For the
v1.4.2 release we will only update the Nancy package it self and leave the remaining packages at
At the time that I write this, Nancy is less than two weeks (the 20th!) shy of turning 5 years old. For any open-source project that is quite an achievement and I dare to say that for one that is based on .NET it is amazing.
If we turn it into numbers, we put out 37 releases (a bit more than 7 per year), had 228 unique (only counting the main repository) contributors and 1237 closed pull-requests. We have had the pleasure of seeing the community embrace it, job ads pop up and people traveling to conferences, all over the world, to deliver sessions on our framework. Amazing!
In February, of this year, we put out the
v1.0 release and just the other day we released
v1.4.1 into the wild.
I am pleased to be able to announce that I am now able to accept Nancy based contract work (world wide).
If you are building products based on Nancy and you are looking for help with (but not limited to) code reviews, training / workshops, team coaching / mentoring, project implementations or problem solving, then you should drop me a line. I am based in Sweden so ideally looking for clients that are comfortable with remote workers, although I will also be available to occasionally work on-site.
On the legal side, all contracts will go through my employer, tretton37, which is one of the top consultancy agencies in Sweden, so you won't be dealing directly with a "one man band". Another
I've been slowly educating my self on hypermedia; what it is, how does it help and how to use it. I must say I've found it a very interesting topic and I thought it was time I put some information into a blog post just in case the 2 people that read this blog might find it useful.
In my day job I'm responsible for a HTTP API (notice I didn't use REST) and some months ago I spoke to Glenn Block around a general discussion about hypermedia. Glenn put this on YouTube if you want to watch it.
I'm currently working on a project that has Nancy serving up an API. For the UI there is AngularJS. We were using JWT for authentication just to get us up and running but then as things became more final in the product we knew it would be better to swap to cookies for security plus we may as well leverage the browser capabilities for cookie handling. I'm not going to get into the arguments about JWT security vs cookie security, there are advantages/disadvantages for using both in this scenario. Our API is built on top of OWIN and Microsoft provide cookie middleware so I thought this would be nice and simple to plug in. Lets just remember I'm working on Mono!
In our Startup class I