My Journey With SerenityOS, So Far 🐞

Published on 2021-08-22.

This is a timeline of personal highlights of my involvement in the SerenityOS project — from learning C++ to becoming a maintainer and beyond.

If you have any questions, feel free to get in touch, for example on the Discord Server. :^)

2019 — Discovery

I first heard about SerenityOS in late 2019, but cannot remember where and when exactly — probably Reddit, Twitter, or a YouTube recommendation. I started watching Andreas' hacking videos occasionally and found them very enjoyable.

2020-01-26 — First PR

My first ever contribution was PR #1137, titled LibVT: Rename escape functions. 12 commits, +57 −35 changeset.

This was inspired by a remark in one of the videos and subsequent commit. It seemed easy enough for me to attempt, so I did. It was a one-off though, and I went back to just watching.

2020-03-13 — First LibJS PR

PR #1439 was my first ever contribution to LibJS, or to any JavaScript engine for that matter. A simple change resolving a FIXME.

A long time before that, I — like so many others — believed that you can't build a browser from scratch anymore, they're too complex. Sure, SerenityOS already had a simple browser, but as far as I was concerned that already existed when I first saw it, like all the other browsers. When Andreas uploaded a YouTube video titled Browser hacking: Let's build a JavaScript engine for SerenityOS! it clicked for me. I had been wrong, I just watched a guy doing what I considered to be impossible, starting from nothing.

I still didn't know any C++ though, but after a week the urge to take on this challenge/chance became strong enough to dive into it. I could work on a brand new JS engine, where literally all the things still had to be implemented. I'm a web developer professionally, so I was excited — and that provided enough motivation to get started. Needless to say, I'm glad I did, otherwise I'd probably still be watching this project from the outside.

2020-04-08 — Starting the Promises PR

A few weeks into the first lockdown in the UK and with more free time on my hands than ever before, I needed something to work on. That something was implementing JavaScript Promises in LibJS.

At that point I still barely knew what I was doing when it comes to C++, so I spent countless hours trying to understand compiler errors and debugging silly mistakes. I got pretty far and opened PR #1706 after a few days, earning lots excitement, but then got stuck, and eventually closed the PR after having it sit around for a while, thinking I couldn't finish it (I probably could have, with some help).

Luckily this story will have a happy ending!

2020-05-17 — 100 Commits

About two months after starting to contribute regularly, I reached 100 commits in the project, and became the fifth person to join the list of contributors in the README.

70 of these commits are work on LibJS and the js REPL :^)

At this point things calmed down for a little while, as I went on vacation in July/August and was quite busy with work in September/October.

2020-12-29 — Crash Reporter

This is a fun little project I started during the last couple of days in 2020 (PR #4626).

Here's what the initial version looked like, and what it looks like now (as of August 2021):

Even though I've worked on various GUI applications in SerenityOS, the Crash Reporter remains the only one that I wrote myself.

2021-01-18 — Python 3.9 Port

For a long time I was a bit uncomfortable with contributing to Serenity's ports, as I had never ported software to a new system before. After working on a couple of small ports (gnuplot, neofetch, as well as fixes for other existing ones), I attempted a big one: Python 3.9.

At the time we already had a Python 3.6 port, but it was several releases behind upstream, experimental, and didn't compile with threading support enabled. So, I started over, and it was a success! The initial port was done in PR #5001, with several follow-up PRs afterwards.

Since then I've been keeping the port up to date with the latest Python releases and gradually enabled more features (which mostly boils down to getting as many modules as possible to compile). Python is first programming language I learned and still the one I know the best, and as such it's my favourite non-core part of the system. 🐍

Loading tweet... (might be blocked by your browser, alternatively you can manually visit https://twitter.com/linusgroh/status/1351251082601787396)

2021-02-13 — Developer Interview

Andreas asked me if I'd be interested in doing an interview in early January, and without much hesitation I agreed. I had never done anything of this sort before, so I was slightly nervous, but it was a great experience :^)

Other developer interviews followed, you can watch those here.

2021-04-02 — Finishing the Promises PR

Mar 26 09:40:04 <kling> linusg: I used a JS promise at work the other day and it made me remember you had a LibJS promise thing going a while back
Mar 26 09:41:21 <linusg> I did never finish it, the "schedule this asap but not immediately" part threw me off IIRC
Mar 26 09:42:53 <linusg> I'll rebase it and then we can figure that out :)
Mar 29 20:02:04 <linusg> kling: thanks for nudging me towards picking up the promises PR again, it's been a fun couple of days :D

I rewrote some parts of it, fixed some other parts, posted an up-to-date screenshot — and then it got merged, almost exactly one year after starting it. I was stoked :^)

During this one year, the question of when LibJS would have Promise support came up several times, and the answer always was "when someone picks it up (again)". I still wanted to be that person.

This PR remains one of my all time favourites, not only because it's a really cool JS feature and basic requirement for many modern Web APIs, but also because of what it represents for me personally: going from poking at a new JS engine and trying to somehow make it work, to later turning that initial failure into a success and realising I can actually do this.

Loading tweet... (might be blocked by your browser, alternatively you can manually visit https://twitter.com/awesomekling/status/1377724079696924676)

2021-04-05 — 1000 Commits

A little over a year after starting to contribute regularly, I reached 1000 commits in the project. Andreas tweeted this screenshot of a DM I had sent him, and I couldn't be happier about proving myself wrong!

Loading tweet... (might be blocked by your browser, alternatively you can manually visit https://twitter.com/awesomekling/status/1379127438823817220)

2021-04-10 — Discord

For a long time all the SerenityOS developers were only on IRC — and it was great. Any requests to start a Discord server were dismissed, until we tried it one day after a good experience with a Discord server of the Zig community, and it turns out: we were so wrong.

There was a concern that Discord would have more memes and nonsense than productive discussion, and to some extent that appeared to be true — there was a lot of noise and excitement in the beginning. Now the Discord server has grown to almost 4000 people and about two dozen channels, and it's more active and productive than IRC ever was (it had less than 200 people on it). Oh, and it also has more yak emotes than IRC. :yaksplode: emote from the SerenityOS Discord server

My ZNC is still running, but I haven't connected to it in a long time, especially since the freenode drama. It was fun while it lasted :^)

2021-04-16 — Becoming a Reviewer

Andreas did an interview with Jonathan Turner (Systems With JT), and the topic of dealing with the ever growing list list of pull requests came up. Later that day I Andreas asked me if I wanted to be a reviewer. Of course I did!

It took me a couple of days to get comfortable with this new position as well as overcoming the initial fear of somehow messing up. Over the next couple of weeks my code contributions plummeted as I spent more time on code reviews instead.

Loading tweet... (might be blocked by your browser, alternatively you can manually visit https://twitter.com/awesomekling/status/1383081852857155592)

If one person doesn't scale, two won't either, so we were soon after joined by Ali, and then Gunnar.

2021-06-30 — Montly Update Video

Much to my surprise Andreas asked me if I wanted to do a part of his monthly SerenityOS update video, specifically to talk about LibJS. It already was the last day of the month though, so there was very little preparation time 😅

It worked out nonetheless!

2021-07-31 — Montly Update Video, Again

This time with way more preparation, a proper microphone, and covering both LibJS and LibWeb.

The Future

As you know, there is no plan!

Well, that's not entirely true: I do plan to use Serenity as my primary OS eventually. I haven't managed to do a full successful boot on bare metal yet though, so that will definitely have to join this list one day.

This is the most fun and ambitious project I have ever worked on, and I'm proud to be a part of it. It's been keeping me busy during lockdown in 2020, and has been growing closer to my heart ever since. Being exposed to the exceptional can-do attitude has been invaluable. In other words: I'm here to stay :^)