Hello friends!
Today is the second birthday of SerenityOS, counting from the first commit in the git repository, on October 10, 2018.
Previous birthdays: 1st.
NOTE: Since the HTML and CSS support has improved over the last year, this page uses a bit more of them to showcase SerenityOS browser support. :^)
SerenityOS is a from-scratch desktop operating system that combines a Unix-like core with the look&feel of 1990s productivity software. It's written in modern C++ and goes all the way from kernel to web browser. The project aims to build everything in-house instead of relying on third-party libraries.
I started building this system after finishing a 3-month rehabilitation program for drug addiction in 2018. I found myself with a lot of time and nothing to spend it on. So I began building something I'd always wanted to build: my very own dream OS.
Parts of my development work is presented in screencast format on my YouTube channel. I also post monthly update videos showcasing new features there.
Anyways, let's continue looking at screenshots where we left off in last year's birthday celebration! We had just gotten the browser strong enough to display the first birthday celebration page..
Jesse ported Quake to Serenity. We didn't have sound at first but that was fixed later. Still, it was very exciting!
Getting a NES emulator running helped drive improvements for threading and timing APIs in the kernel. Check out the video to see me die before even reaching the 1st palace..
Someone put together a CTF (Capture The Flag) challenge at the
36c3 computer security conference. I learned about this when
two exploits showed up (complete with write-ups!) on GitHub:
one from Fire30 and another one from braindead.
This caught me by total surprise and I was a little bit disappointed
at how easy it was to break into the system. This event sent me down
a deep rabbit hole of learning about system security and applying
everything I learned to secure Serenity. I wanted to make sure that
the next CTF presented more of a challenge!
After the classic platformer VVVVVV was released as open-source, I wanted to get it running on Serenity. It was pretty easy to get it going since it used SDL and we already had a decent SDL port. The game was open sourced on Jan 10th and I had it running 2 days later.
Outside of enabling every protection mechanism the x86 has to offer,
there was also a fair amount of architectural Unix-level security
work. One of the most important pieces was adopting two OpenBSD-like
system calls: pledge()
and unveil()
.
I wrote about Serenity's pledge and unveil implementation on my blog.
People kept asking me if the web browser would ever support JavaScript.
I honestly felt a bit intimidated when starting this project but I just
did it anyway, and a whole bunch of people very quickly joined up to
help out.
I started by implementing a simple AST interpreter,
and building some test AST's by hand. Then Stephan added a parser, and Sergey made a REPL,
and then things really took off, with Linus and Matt going especially deep.
To celebrate the project reaching 10'000 commits, I updated the main license file to assign copyright to "the SerenityOS developers" instead of just myself.
Browser development was moving forward with the LibJS engine allowing
more and more complex things. But we were still limited to visiting unencrypted
websites served over HTTP.
In comes LibTLS and LibCrypto! Thanks to some amazing work by Ali, assisted by
Itamar and DexesTTP, we can now talk to HTTPS websites as well. The whole world
opens up!
I was super excited when I could get Google loading for the first time!
I spent a whole bunch of time improving standards compliance in the LibWeb engine's CSS implementation. I've been using the classic ACID2 test to drive some of the work. As you can see from the picture, a lot of work still remains!
One tool I've missed ever since starting the SerenityOS project is the amazing
Valgrind.
I finally decided to do something about it, and I was curious how such a thing might
be implemented, so I set out to create a workalike of my own.
I've hacked on x86 emulators in the past, so I decided to bring my knowledge in that
area into Serenity and started building UserspaceEmulator (or UE for short), a program
that implements a ring-3-only x86 CPU and intercepts system calls so we can instrument them.
Within a couple of weeks of hacking, I could run compiled programs without changing
anything about them, and catch memory leaks just like Valgrind would!
I've always been a fan of desktop games, ever since the days of the
Microsoft Entertainment Pack.
Here we were joined by two great games, a 2048 clone by Ali & Sergey,
and a Chess game by Peter. The chess engine is still pleasantly stupid,
so I can even beat it myself!
Also of note: the awesome icons in the system menu! Many of them were
drawn by thankyouverycool (so thank you, thankyouverycool, very cool!)
Even more: the "About" box was redesigned by Nick, and Buggie the system
mascot was drawn by Simon! These things happened much earlier but I'm
mentioning them here since they are visible in the screenshot.
Itamar started adding support for Git integration (diffing, staging, commits)
to the HackStudio IDE.
Note that this is an optional feature that is only available if you have the
git
port installed. HackStudio is the only program in the system
that makes use of ports since we don't have our own implementations of
git, a compiler, or a linker... yet. :^)
The Spreadsheet app was started by Ali and is powered internally by the
LibJS JavaScript engine. Cell expressions are evaluated as JS.
It feels really neat so far, although we're still figuring out
how it should work.
It even has built-in documentation, which is generated from the JavaScript
source code!
While we've had a system clipboard for a long time, it only recently
became possible to copy anything other than text between apps.
Here I had just added an image context menu in the Browser so you can
copy images from the web directly to the clipboard!
Also on display: the PixelPaint app (formerly PaintBrush), which became
a layer-based image editor in the last year.
And with that, this little tour of the second year of Serenity is over!
If you would like to see more, I've continued the tradition of making a monthly round-up video at the end of each month. You can find them in a special playlist on my YouTube channel.
To all the lovely people have helped out in the last year, with code, bug reports, man pages, commenting/liking/sharing my videos, sending letters, chilling on IRC, retweeting my shower thoughts, telling your friends, etc, thank you! I'm eternally grateful for all the love and support this project gets.
And also, a huge thank you! to everyone who has supported me via GitHub Sponsors, Patreon, and PayPal. I hope to be able to do this full time some day, and your continued support is keeping the dream alive!
All right, let's keep pushing forward into year 3!
Andreas Kling, 2020-10-10