ƒenster – a small, lightweight & embeddable window-server
Posted: Tue Nov 18, 2025 2:16 pm
Hey everyone,
I know this topic is not strictly OSDev, but bear with me because I think it is very tightly related and interesting to OSDevs in particular.
Today I'd like to present ƒenster — a small, lightweight window server and UI toolkit designed for easy embedding and minimal dependencies:
https://github.com/maxdev1/fenster/
The project originally began as the window server for Ghost, my hobby OS, but I moved it out and extracted all platform-specific code into an abstraction layer. Porting it requires minimal dependencies: basic libc functionality, a C++ compiler, freetype/cairo, mouse & keyboard input as well as a video output.
The goal of the project is to provide a clean, self-contained GUI system without depending on other heavyweight software. It runs as a userspace application and exposes a communication library — libfenster — so client applications can create windows, listen to events, update their UI, and draw custom content. For those building more monolithic systems, the entire server can also be embedded directly into a kernel or any other environment that meets the basic requirements. The README includes detailed notes on porting and architecture.
Features
While the project is still early and far from complete, it already features:
- Standard UI components: windows (obviously), buttons, labels, panels, scroll-panes, text areas, checkboxes and more
- Multiple container layouts: stack, flow, flex, grid
- Update/layout/paint cycle for optimized updates
- Dirty-region tracking & minimal blitting for efficient rendering
- Structured event-handling & dispatch system
- Client-drawn canvas
- libfenster, the client library for creating components, listening to changes, layouting, repainting and more
To make development easier, there are also simulators for working on the server: SDL on MacOS and WinAPI on Windows. Right now they don't cover the libfenster interaction yet, but allow for fast iteration when working on the server itself:

Demo in Ghost
To show off a bit what it is capable of right now, in the screenshot below you see the server running in Ghost. Everything you see on screen is running in separate applications here, so none of it is implemented directly in the server:
- the navigator, calculator and desktop applications are completely built using only native components
- the terminal and task bar are separate applications using a canvas to paint their content

Why I think this project has its place? Modern window servers and compositors (Wayland, X11) are very capable but also very complex, tied to large systems, and difficult to embed into small OS or embedded projects. They assume the presence of a full userspace, established drivers, IPC systems, advanced graphics stacks, and what-not. ƒenster exists for the opposite use case: when you want something small, self-contained, easy to understand, easy to port, and easy to embed — either in a hobby OS, a research OS, or any minimal environment where bringing in a full graphics stack would be overkill.
In the future there are plans to add a lot more components, layouts, a more complete client library, themeing and more. So far I've mostly been developing the project to fit the needs of my OS, but depending on the interest in it, I might shift my focus a bit. I think it could be a cool collaboration project for OSdevers that would like to work on a common GUI framework like this.
I'd really love to hear your thoughts, feedback, ideas or anything else you have to say about the project and would greatly appreciate a little star on the repo if you like it.
Thank you!
I know this topic is not strictly OSDev, but bear with me because I think it is very tightly related and interesting to OSDevs in particular.
Today I'd like to present ƒenster — a small, lightweight window server and UI toolkit designed for easy embedding and minimal dependencies:
https://github.com/maxdev1/fenster/
The project originally began as the window server for Ghost, my hobby OS, but I moved it out and extracted all platform-specific code into an abstraction layer. Porting it requires minimal dependencies: basic libc functionality, a C++ compiler, freetype/cairo, mouse & keyboard input as well as a video output.
The goal of the project is to provide a clean, self-contained GUI system without depending on other heavyweight software. It runs as a userspace application and exposes a communication library — libfenster — so client applications can create windows, listen to events, update their UI, and draw custom content. For those building more monolithic systems, the entire server can also be embedded directly into a kernel or any other environment that meets the basic requirements. The README includes detailed notes on porting and architecture.
Features
While the project is still early and far from complete, it already features:
- Standard UI components: windows (obviously), buttons, labels, panels, scroll-panes, text areas, checkboxes and more
- Multiple container layouts: stack, flow, flex, grid
- Update/layout/paint cycle for optimized updates
- Dirty-region tracking & minimal blitting for efficient rendering
- Structured event-handling & dispatch system
- Client-drawn canvas
- libfenster, the client library for creating components, listening to changes, layouting, repainting and more
To make development easier, there are also simulators for working on the server: SDL on MacOS and WinAPI on Windows. Right now they don't cover the libfenster interaction yet, but allow for fast iteration when working on the server itself:

Demo in Ghost
To show off a bit what it is capable of right now, in the screenshot below you see the server running in Ghost. Everything you see on screen is running in separate applications here, so none of it is implemented directly in the server:
- the navigator, calculator and desktop applications are completely built using only native components
- the terminal and task bar are separate applications using a canvas to paint their content

Why I think this project has its place? Modern window servers and compositors (Wayland, X11) are very capable but also very complex, tied to large systems, and difficult to embed into small OS or embedded projects. They assume the presence of a full userspace, established drivers, IPC systems, advanced graphics stacks, and what-not. ƒenster exists for the opposite use case: when you want something small, self-contained, easy to understand, easy to port, and easy to embed — either in a hobby OS, a research OS, or any minimal environment where bringing in a full graphics stack would be overkill.
In the future there are plans to add a lot more components, layouts, a more complete client library, themeing and more. So far I've mostly been developing the project to fit the needs of my OS, but depending on the interest in it, I might shift my focus a bit. I think it could be a cool collaboration project for OSdevers that would like to work on a common GUI framework like this.
I'd really love to hear your thoughts, feedback, ideas or anything else you have to say about the project and would greatly appreciate a little star on the repo if you like it.
Thank you!