10 years of Avalonia!

Celebrating a decade of innovation and community-driven development, this blog post takes a deep dive into Avalonia's ten-year journey.

...
Steven Kirk
Share:

Reflecting on the 10-year journey of Avalonia, it's clear that this milestone represents a massive achievement for the community. From its inception as a mere experiment, Avalonia has evolved into a leading, cross-platform framework adopted by some of the largest and most prestigious organisations. This anniversary is not just a celebration of technological achievements; it's a testament to the power of open collaboration, our drive to solve complex challenges, and our unwavering commitment to continuous improvement. Join us in this post as we delve into the early history of the project.

The Initial Commit

https://github.com/AvaloniaUI/Avalonia/commit/cd2b7530f5e3e0cea2c45c39bdc9a433149c2200

commit cd2b7530f5e3e0cea2c45c39bdc9a433149c2200]
Author: grokys <[email protected]>
Date:   Thu Dec 5 21:16:06 2013 +0100
    Initial commit

At the time Avalonia was called Perspex and Perspex came about from another project which was, rather confusingly, called Avalonia.

The original Avalonia was me playing about seeing how difficult to would be to reimplement WPF as an OSS project. The answer would have been: "very difficult", but more importantly after a few months of sporadically working on it, I decided I wasn't having fun. I wanted to improve things where I saw problems, rather than blindly reimplement WPF warts and all!

Before starting on Perspex I remember thinking to myself "But does the world need another incompatible XAML UI Framework?" (these were the days of WPF/Silverlight/Metro). My answer was "No, but who cares? No-one is going to take any notice anyway." And so I began work on Perspex, just to see how far I would get. And I never in a million years would have expected what I started 10 years ago to have become what Avalonia has become today!

The original commit was Windows-only, though there was clearly the intention of making Perspex cross-platform as all of the Windows-specific code was located in Perspex.Windows. It even had 5 unit tests!

Running the TestApplication in that initial commit shows just how far we've come in 10 years:

image

A simple "Hello World!" that doesn't even handle window resizing correctly! This was quickly rectified an hour and a half later though:

https://github.com/AvaloniaUI/Avalonia/commit/c8df546e73f90951f5117f1eeb168a33b207652b

commit c8df546e73f90951f5117f1eeb168a33b207652b
Author: grokys <[email protected]>
Date:   Wed Dec 11 22:43:22 2013 +0100

    Re-measure/render when window resized.
 

Of note is that the initial commit already had in place the strongly-typed DependencyProperty equivalent that we now know as AvaloniaProperty (at the time called PerspexProperty).

Towards a Kinda-Functioning Application

The next few months saw sporadic work on Perspex, mainly starting with implementing the CSS-like styling system. I seemed to be enjoying myself with commit messages for these:

commit 581a037cb8b87561003184012f1d48cf732f8fe9
Author: grokys <[email protected]>
Date:   Tue Feb 4 01:17:42 2014 +0100

    Style council.

commit ae79a51d727f4df07b5e83a03ddcca47478195ff
Author: grokys <[email protected]>
Date:   Tue Feb 4 02:12:08 2014 +0100

    Styley style.

commit ac659701b8811c6d2e75e6bbb8c40b26a28669e7
Author: grokys <[email protected]>
Date:   Tue Feb 4 18:00:19 2014 +0100

    Style away the hours.

commit 63f674d897ba4e9b7f37ce9e6e1d99b86a05a9fc
Author: grokys <[email protected]>
Date:   Tue Feb 4 18:15:18 2014 +0100

    Gangnam Style

commit 18bbb2c41e3bd03e57d55c57413b34fc43a9ac70
Author: Steven Kirk <[email protected]>
Date:   Wed Mar 12 23:17:39 2014 +0100

    WIP

    Not sure where I am - went away for 2 weeks and forgot what I was doing.
    oops.
 

By April I had a couple of very basic controls working (Button and CheckBox):

commit c1a09314456ebd7dbe604f9d8709d4a74277c27d
Author: Steven Kirk <[email protected]>
Date:   Sun Apr 6 01:09:28 2014 +0200

    Added (VERY!) basic checkbox
image

 

And by November of 2014 I had a pretty basic application which included things like a basic TabControlTextBoxTreeView and even DevTools:
image

Moving Cross-Platform

Nearly a year after the initial commit, I started working on making Perspex cross-platform. The initial cross-platform work was to add a Cairo renderer in addition to the existing Direct2D renderer:

commit 7167f26c93b2bffc30143d928523f9fe10478717
Author: Steven Kirk <[email protected]>
Date:   Sun Nov 30 22:14:43 2014 +0100

    Trying to create a cairo renderer.

    Not working. Nothing is drawn...

commit 848f8e7b4bfff7c5bbd400ac73cdb3d4c842f750
Author: Steven Kirk <[email protected]>
Date:   Sun Nov 30 22:38:17 2014 +0100

    Now at least draws something.

    Need to implement a fair bit more before it makes sense though!

commit b9609d3621fd64bb1fee69f83fc800feacc6a7a5
Author: Steven Kirk <[email protected]>
Date:   Sun Nov 30 22:56:36 2014 +0100

    Make transforms work.

    Now draws something resembling the proper content.
 

First Contribution!

And then on November 30 2014, a milestone! Our first outside contribution from @SuperJMN: if you're ever wondering who to thank for being able to set your Window title in Avalonia, you can thank José!

commit 5f1b9617bb5d5ae4f2426097ff5c4917de257037
Author: SuperJMN <[email protected]>
Date:   Sun Nov 30 23:36:57 2014 +0100

    Title property for Window
Soon after that, @keichinger came along to help with documentation (something we struggle with to this day!)
commit 7aec2d141cabecd5f590aee3660be324312de0f1
Author: Kai Eichinger <[email protected]>
Date:   Thu Dec 11 15:48:45 2014 +0100

    Added syntax highlighting to intro.md
And the same day, another outside contribution from @ncarrillo:
commit a6476cb7ec69f7a220de0bd33ed989ec3b906806
Author: Nelson Carrillo <[email protected]>
Date:   Thu Dec 11 09:59:50 2014 -0500

    - Added Ctrl+A to select all text in the TextBox
    - Made the TextBox lose its selection when focus is lost.
@ncarrillo was quite active in the months following these first commits and was soon joined by @robertofon too. In the meantime @SuperJMN was quiet, preparing something big...

XAML Support

Believe it or not, up to this point Perspex had no XAML support. All UI was defined in C# code (which is something that seems to have come back into fashion with a bang more recently) and I was pretty down on the verboseness of WPF XAML at the time too (I'm still not a huge fan if I'm honest, but that's for another day).

However XAML support remained a popular feature and so @SuperJMN had quietly gone away and written the OmnXAML library; and on Aug 24, 2015 added XAML support to Avalonia:

commit fc3cc76bd60e897d4aaf1e66ffcdfce7517603b1
Author: José Manuel Nieto Sánchez <[email protected]>
Date:   Mon Aug 24 02:20:37 2015 +0200

    Added XAML feature

0.0.1-alpha

With XAML support in place, it was time for the big release: 0.0.1-alpha!

Merge: 3abb17f21 a6079c23f
Author: Steven Kirk <[email protected]>
Date:   Fri Aug 28 16:08:45 2015 +0200

    Merge branch 'alpha1'
At this point, Perspex was still pretty basic, but things were starting to take shape, with a few controls now implemented, and even basic animations and popups in place, though it looks like, despite the work on cross-platform support, that the 0.0.1-alpha release was still Windows-only.:

image

Familiar Faces

The 0.0.1-alpha release was pretty basic, but it was enough to get the interest of a few maintainers who have stuck around until this day!

The venerable @kekekeks showed up three days later with the following inauspicious commit, that was soon followed by many other more substantial commits:

commit ef7d86f04e7c634579756672efb76691fdc12185
Author: Nikita Tsukanov <[email protected]>
Date:   Mon Aug 31 22:33:58 2015 +0300

    Broken link

    https://github.com/grokys/Perspex/blob/master/Docs/architecture.md - 404
    https://github.com/grokys/Perspex/blob/master/docs/architecture.md - OK
A week later he was already infuriated by StyleCop:
commit 7f72c7763b227a3225f470bc84a4935fc3175791
Author: Nikita Tsukanov <[email protected]>
Date:   Mon Sep 7 23:03:00 2015 +0300

    Implemented cursors. Ceterum censeo StyleCopum esse delendum.
A few weeks later, along came @danwalmsley with his first fix for TextBox:
commit 8309adf6dac298b5c78b754f064bfdeb40e47933
Author: Dan Walmsley <[email protected]>
Date:   Fri Sep 25 00:35:11 2015 +0100

    Implemented caret inverting background colour.
Followed by some other familiar names who contributed greatly to the sucess of the project in those early years:
commit b13b870741aefe63f3f7c7c83ae50cd256209be4
Author: Wiesław Šoltés <[email protected]>
Date:   Wed Nov 4 00:48:03 2015 +0100

    Added RelativeRectTypeConverter

commit 74cea9595637c6351b2f633d3be782a7b7c681ec
Author: Jeremy Koritzinsky <[email protected]>
Date:   Mon Feb 22 18:48:11 2016 -0600

    Can now bind to a non-IList/Array indexer (with any parameter type convertible via TypeUtilities).

Designer Support

Almost immediately after his first commit, @kekekeks started work on implementing the designer (or, more accurately previewer):

commit abf60b5a5ce84c905c2e2d8106d7a88de11ce8f7
Author: Nikita Tsukanov <[email protected]>
Date:   Wed Sep 2 12:29:50 2015 +0300

    Added EmbeddedWindowImpl for embedding and designer support

commit eee5da30a0214869b2f99f7bcd29b0e0510084e8
Author: Nikita Tsukanov <[email protected]>
Date:   Thu Sep 3 00:12:12 2015 +0300

    Designer: Initial out-of-process renderer implementation
And just a day later, along came @Seeker1437 to start adding that support to the Visual Studio Extension!
commit ecd6efe766324ecbb44d23b7d15837cf3001a14a
Author: Darnell Williams <[email protected]>
Date:   Thu Sep 3 21:26:15 2015 -0400

    Add Designer Support Part 1

commit fdcb454b27f95951ac5afa575df831f14aad4659
Author: Darnell Williams <[email protected]>
Date:   Fri Sep 4 07:47:46 2015 -0400

    Small source code corrections

commit 0d0e70312bb2829b08852276b0a9661d92ef7f18
Author: Darnell Williams <[email protected]>
Date:   Sun Sep 6 02:59:50 2015 -0400

    Add Designer Support Part 2

    * Add build start/stop detection
    * Removed unused references
    * adjusted injection code to keep trying if not able to find the needed
    entry point (rare)
    * Now displays designer properly
    * Now can detect output path (Improvable, current will not detect change
    without reopening designer)
    * Now detects when designer is closed
    * better namespace detection with fallback
It's pretty interesting to look back and see how fast things were starting to move by this point!

Experimental Mobile Support

Shortly after adding designer support, @kekekeks started work on adding support for Android and iOS too!

commit abd7edd6b04264048977a636db71e38593fd8169
Author: Nikita Tsukanov <[email protected]>
Date:   Mon Nov 9 03:05:55 2015 +0300

    Android support for skia

commit 0870aad3d79b26222681a9ec3a0c4ef7f8dd605f
Author: Nikita Tsukanov <[email protected]>
Date:   Tue Nov 10 16:30:46 2015 +0300

    Build Skia.Android on CI

commit d6745e88c1d90d98c84425c025107a5fffda43a4
Author: Nikita Tsukanov <[email protected]>
Date:   Sun Nov 15 04:46:44 2015 +0300

    Added iOS support for skia backend

commit 043e1d5eaf0648d04f69348ea931c83d3d6ceebc
Author: Nikita Tsukanov <[email protected]>
Date:   Thu Nov 26 02:49:21 2015 +0300

    Added nuget package for iOS

The Big Rename

It was quickly becoming obvious that, far from being a personal project that I was working on to scratch an itch, Avalonia had the chance of actually becoming a feasible UI framework. With that, the potential legal troubles of using a trademark (Perspex) came to the front, and after what seemed like a long period of deliberation, we decided to rename Perspex to Avalonia, stealing the name of the aborted project that it replaced.

commit 5be41985c32c1270b41aa531e8b2a96ddf6792cb
Author: Steven Kirk <[email protected]>
Date:   Wed May 11 23:36:54 2016 +0200

    Renamed Perspex -> Avalonia

0.4.0

Avalonia 0.4.0 was released in August 2016 - a year after Perspex 0.0.1-alpha.

commit e71e6714f0be6fae9136af4def747bce58af41a6 (tag: 0.4.0)
Author: Steven Kirk <[email protected]>
Date:   Sat Aug 6 10:58:10 2016 +0200

    Added link to VS extension.
I think this can be thought of as the first "real" release of Avalonia: partly because it's the first to have the Avalonia name but more importantly one can really see the foundations of modern Avalonia were really in place by this point, even though there was still so much to do. I remember us planning to do a 1.0 release "about a year" after 0.4.0, but that never happened. In fact deciding on when we were at 1.0 proved to be such a difficult job that we finally jumped from 0.10 to 11.0 in 2023!

This release even had a video (makde by @kekekeks, resplendent with relaxing music)!

https://www.youtube.com/watch?v=c_AB_XSILp0&t=28s

And with that, I think would be a good time to finish this first part of our walk through the history of Perspex Avalonia. A huge thank-you to the hundreds of contributors who helped us along the way, and here's to another 10 years! 🍻