Skip to main content

Beginning of Scarlet

· One min read
Scarlet Maintainer

Welcome to the Scarlet blog.

What is Scarlet?

Scarlet is a project that came out of my discontent with existing wayland shell implementations. I have been searching for a modular wayland shell with sane defaults, one akin to GNOME shell in style and features.

Scarlet provides not only a bar, but an entire shell experience in a relatively small binary. In essence it is not very different from the other options. It mostly aims to be a mix of everything I like in wayland shells, like SCSS-based styling, notification and OSD popups and modular configuration.

The origins of Scarlet are chronicled on my blog post Wayland Shells, and Scarlet.

Plans for Scarlet 1.0 - Red Salvia

· 4 min read
Scarlet Maintainer

At the time of writing, Scarlet is still in early alpha. As the time of writing, Scarlet version 0.1.0 is live, marking the first step towards version 1.0.

The version scheme is still up in the air, I am currently torn between using a date-based naming scheme used by Niri, in that case version 0.1.0 would be 25.12, based on the month and year when of release.

Scarlet 0.1.0 is called Red Salvia, after the flower bearing that name. Scarlet's major version names are based on flowers that bear the color, well, Scarlet.

Upcoming features

Multi-monitor configuration

One of Scarlet's planned features is support for multi-monitor configurations. Each monitor should have it's own bar configuration, separate from the others.

bar "HDMI-A-1" {
// configuration for this monitor
}
bar "eDP-1" {
// configuration for this monitor
}

popups "HDMI-A-1" {
// popups on this monitor
}

popups "eDP-1" {
// popups on this monitor
}

Configuration inheritance

Multi-monitor configuration comes with the consequence that each monitor will need to be configured separately, as the bar window can not be present on multiple displays at once. To mitigate that, the plan is to implement inheritance, where individual configuration options are inheritable from other configurations, much like the nix inherit keyword.

The following configuration serves as an example of a setup using configuration inheritance. Where the bar on the monitor HDMI-A-1 has a horizontal layout, anchored to the top and the one on the monitor eDP-1 has a vertical layout, anchored to the left. They both use the same modules in the end, but have different orientations.

bar "HDMI-A-1" {
anchors "top" "left" "right" // anchored to the top
orientation "horizontal" // Horizontal orientation
modules {
start {
niri-workspaces
}
center {
clock
}
end {
sys-tray
}
}
}

bar "eDP-1" {
anchors "top" "left" "bottom" // Anchored to the left
orientation "vertical" // Vertical orientation
inherit "HDMI-A-1" {
modules // Inherit the same modules from HDMI-A-1
}
}

Expect this feature come between 0.2.0 and 0.7.0.

Popover windows

One core feature of Scarlet, inherited from the legacy of Crimson 0.2.0 is modular popover windows. These provide windows, much like the notification center or quicksettings provided by other shells.

The popup windows provide modular layouts. Modules will be available for these larger layouts.

This feature is planned for 0.3.0.

Configuration

Popover windows are part of the group module.

bar {
modules {
center {
group {
// grouped modules
modules {
music
clock
}
popover {
// Standard QS layout with a calendar, music widget
// and notification center
orientation "horizontal"
modules {
calendar
// sub groups act as boxes
group {
orientation "vertical"
modules {
music-player
notification-center
}
}
}
}
}
}
}
}

More system info widgets

Slated for the 0.2.0 are also extended system info widgets. As of 0.1.0, Scarlet provides CPU info, memory usage and network statistics. The plan is to add more system info modules, notably disk info and GPU info.

Disk info will arrive as part of 0.2.0. GPU info may take a bit more time, as I learn how to obtain GPU information for different GPU vendors. This feature is planned for 0.7.0 at latest.

Custom widgets

Custom widgets are an important feature missing from 0.1.0. As of writing, how this feature is implemented is largely undecided.

In the implementation of Crimson 0.2.0, custom widgets are configured in Lua, which allowed custom formatting. JSON parsing and formatting functions are provided to make the use of advanced data structures possible.

Right now, the Scarlet formatter only supports basic JSON formatting, which is perfectly fine for simple modules, but unfeasible for advanced modules. I want to provide a way to configure modules with Scarlet, without having to resort to bash scripts. A simple way at that.

I have considered Lua modules, dynamic Rust plugins and simple JSON based command output modules. None are particular superior to the others, and we could support all three, but focusing on binary size and maintainability, it would be wiser to choose from the bunch and optimize the chosen option.

This feature does not have a set release date. It is planned for release before Red Salvia, but the exact version is up for debate. An open issue about this problem is available on the main repository, at issue #1. If you have input on how this feature could be implemented, feel free to reach out.

Closing thoughts

These are just the bigger features planned for Scarlet. Other smaller features are being implemented as time passes. Scarlet Red Salvia is set to be the most interesting release so far and I am glad to get it there.