Why I'm Moving my Blog from F# to C#

Date: 2025.11.26 | csharp | fsharp | hamy.xyz | iamhamy |

DISCLOSURE: If you buy through affiliate links, I may earn a small commission. (disclosures)

I've just finished the latest refactor of my blog - porting it from F# to C#.

In this post I want to share a bit about the move and why I chose to do it.

What's changed

Not much, hopefully!

I started with a close 1:1 port from F# to C#. They're both general purpose languages and have tools to accomplish basically anything the other one could.

Along the way I took the time to update some styles and add a few new features like dynamic featured posts on my main page and a tags list.

Everything else is the same:

Main difference - it's now built with C#.

To see how the F# version was created, see: Build a Simple Markdown Blog with F# / Giraffe

Why I'm Moving from F# to C#

I love F# in theory but C# makes more sense for me in practice.

Less context switching. C#'s syntax and patterns feel closer to mainstream languages. I use TypeScript regularly at work and for side projects so less context switching helps me get going faster, especially with my more limited free time as a new dad.

C# has gotten really good. Discriminated unions, records, LINQ, pattern matching, pipes - modern C# has borrowed many of F#'s best features. They're not quite on F#'s level but close enough to get by and a lot more escape hatches if you want them. Plus C# has the network effects to continue improving year after year.

The ecosystem just works. C#'s ecosystem keeps improving. The tooling just works, it gets frequent updates, and there's a package for everything. F# is a beautiful language but you end up writing a lot of wrappers, use libraries last updated years ago, and there's far less resources to get unstuck.

AI is great at C#. It's okay at F#, but it's great at C#. This gap will likely widen going forward as the models get better and suck up more training data. When I'm trying to iterate quickly C# feels like the path of least resistance. This is particularly important for me as I try to push my projects forward in my limited freetime while raising a baby.

I might actually like the syntax more? F#'s minimal syntax is beautiful, but minimal != simple. I still find some code hard to read - meaningful whitespace, no types on params, default currying to name a few. C# is more verbose certainly but I often find it easier to read. A lot of this is likely just familiarity but that can go a long way towards improved efficiency. Also the need for explicit top to bottom compilation is nice and theory but in practice I found it so annoying to need to update the fsproj manually just to add a file. Little things but they add up.

IMO Gleam is a great compromise on the features of a type-safe functional language and syntax of a more mainstream language. If it was more stable and supported that might've been my next language.

It meshes with what I want to build. C# is a great general-purpose language, just as F# is. But it has better tooling for things like web apps, games, and new libraries. I've got a lot of things I want to build and increasingly limited time so I think it's going to get out of my way and help me build more.

Next

F# is a great language. But I've realized you can do a lot of similar things in many languages. I'm bringing some of those patterns with me - immutable records, DUs, Results, and function composition. The language changed, but the principles remain.

Technology is about tradeoffs and the best one isn't always the best one on paper / in theory but the one that you actually use to accomplish your goals.

Similar to the saying "the best camera is the one you actually use".

Right now, C# is that tool.

If you liked this post you might also like:

Want more like this?

The best way to support my work is to like / comment / share for the algorithm and subscribe for future updates.