v0.3.0
Tessera 0.3.0: A built-in launcher, a nightlight, and smoother floating windows
Browse 30 files
- NEWS.md
- POLICY.md
- README.md
- UPSTREAM.md
- backgrounds/README.md
- design/lock-greet/MIDDLE.md
- design/theme-generation.md
- docs/annotations.md
- docs/application-themes.md
- docs/bar.md
- docs/design/OWNERSHIP.md
- docs/development.md
- docs/devices.md
- docs/follow-ups.md
- docs/foreign-toplevel.md
- docs/guix-and-nix.md
- docs/launcher.md
- docs/lock-and-greet.md
- docs/logging.md
- docs/nightlight.md
- docs/process-context.md
- docs/releasing.md
- docs/repl-api.md
- docs/session.md
- docs/testing.md
- docs/text.md
- docs/title-bars.md
- fonts/README.md
- patches/README.md
- wallpapers/README.md
Tessera 0.3 is out! Back in the 0.1 announcement, I said this release would be all about a built-in launcher, where commands from your config sit right next to your applications. That's exactly what it is. Press Mod+space and your applications, your open windows and the commands you define are all in one list, drawn in your palette.
There's more than the launcher, too. Tessera can warm your screens in the evening on its own, dragging a floating window is much smoother, and notifications can have their own font and SVG icons. There's also an experimental lock screen and login greeter, which stay off by default for now.
Press Mod+space and tessera launch opens a panel over the screen you're working on. It lists your applications and the session's commands together. Type a few letters, press Enter, and you're done.
Matching is fuzzy, so the letters only need to appear in order, and it looks at more than the name: typing "term" finds foot. The things you pick often rise to the top over time. Each application shows the icon from your icon theme, and a line under the list tells you about whatever is selected, whether that's an application's description or the keys already bound to a command.
The built-in commands cover the things you'd usually set up a key binding for: switch to a window, focus a workspace, move a window to a workspace, apply a palette, change the wallpaper, reload your config, lock the screen and take a screenshot. "switch to window" works as a window switcher on its own, so you can bind it straight to a key:
("Mod+Tab" exec "tessera" "launch" "switch to window")The launcher runs as a separate process, so a crash in it never takes your desktop down. It doesn't load your config either. It asks the running session for its commands, and whatever you pick runs inside the session, where your config defined it.
This is my favorite part. Any command you define in your config shows up in the launcher alongside your applications:
(define-command "rotate wallpaper" next-wallpaper!)
(define-command "go to workspace" focus-workspace!
args: (list (argument "workspace" complete: (lambda () (workspace-names)))))A command with an argument opens a second step, and the list fills with the completions the session offers right now: your workspaces, your windows, your palettes, or whatever your own completion function returns. You can also define a command from tessera repl and use it straight away.
As with everything else in Tessera, you can drive it from a terminal or a script, too:
tessera launch --initial wall
tessera launch "apply theme" lichen
tessera launch --run "next wallpaper"Underneath the launcher is tessera select, a chooser that works like dmenu. It reads choices on standard input and prints the one you pick, so your scripts can use it too:
choice=$(ls ~/src | tessera select --prompt "Project:") && foot -D ~/src/"$choice"If you've been using fuzzel, the launcher guide has a section on moving over. The short version: Mod+space opens Tessera's launcher by default now, but if your config binds Mod+space to fuzzel, that binding still works, and tessera select accepts the flags fuzzel and dmenu share.
Tessera can now warm your screens in the evening and bring them back in the morning, without gammastep or any other program. Give it your location or a pair of times, and it changes the color temperature gradually around sunset and sunrise. The sun's position is calculated on your machine, so there's no location service or network involved.
(config-with default-config
nightlight: (nightlight location: '(37.983810 23.727539)
day: 6500 night: 3500))tessera nightlight on, off and auto change it on the fly, and the bar shows the current temperature. The schedule catches up after suspend, and Tessera resets your screens to neutral when it starts, so a warm tint left behind by your previous compositor doesn't follow you into the morning. The nightlight guide has the details.
Dragging a floating window used to lag behind the pointer, and the borders of the tiled windows underneath could flicker over it. Both are much improved. The window, its border and its title bar now follow the pointer directly, without waiting for the window manager to update the layout on every movement.
In a headless test that drags a floating window across tiled windows with 128 pointer motions, the median time from pointer input to the new position appearing on screen fell from 48.3 to 10.5 ms, and the 95th percentile from 71.9 to 17.1 ms. Before the change, 64 frames showed the window behind the pointer; afterward, none did, even with the window manager's policy deliberately stalled for 80 ms at a time. Those are headless measurements from one machine, so let me know how dragging feels on yours.
Notification cards can now have their own font, set with font: the same way you set the bar's. Icons can be SVGs as well as PNGs, and they come from the same icon theme the launcher uses. The cards also got a one-pixel edge to match window frames.
The built-in lock screen is off by default until its security review is complete, and swaylock is still the stock locker.
If you'd like to see where this is going, you can try it today. tessera lock and tessera greet share a clock, an animated Drift background and an optional logo. The locker runs outside the compositor and uses PAM, and the greeter runs in its own restricted host under greetd. Turning the locker on takes an explicit setting in your config and a PAM service set up for it, so keep another login terminal handy while you experiment. The lock and greeter guide covers the setup, Guix and NixOS examples, how to recover from another terminal, and what the review still has to check.
- The pause on the first text render is gone. Tessera now initializes Fontconfig before the session starts taking input, so the first popup doesn't wait for it. In a headless test that started with an empty font cache, the first text render took 4.2 ms. The cache still has to be built, but that now happens during startup.
- Context menus near the edge of a monitor stay on that monitor, instead of spilling onto the next one.
- The "input reply queue full" error is fixed. When it happened, a key or button reply could be lost and hold up your next key binding.
- The helper that tells the bar what's running in a terminal no longer scans every process on your machine. In 60-second headless tests on Sigil 0.23.1 with 748 processes running and the screen on, its CPU use fell from 11.7% to 0.6% of one core, and with 700 more idle processes added, from 19.9% to 0.5%.
- Programs you start from a key binding no longer leave
<defunct>entries in your process list for up to 30 seconds, on Linux 6.9 and newer. - When a window's frame fails to reach the screen, Tessera now tries it again. That fixes one way foot's blinking cursor could get stuck hidden. There's another case I haven't been able to reproduce yet, so let me know if you still see it.
- Reloading your config leaves unchanged schedules alone.
Focus changes can still pause right after a garbage collection. With Sigil 0.24.1 at its default nursery size, a focus change immediately after a minor collection took 28.4 to 31.0 ms of compositor owner CPU in three headless runs at scale 2 with four real clients, and the collection work itself can add more latency on top: one sample in the same test that included a collection took 107.8 ms. No other nursery size is qualified for Tessera yet, so 0.3 ships with the default while I keep working on these pauses.
An external monitor can still stay dark after resume; turning it off and on again brings it back. Plain GTK widgets, such as pavucontrol, still use Adwaita's styling instead of your palette. The stacked layout is still planned.
Tessera 0.3 is built on Sigil 0.24.1. The download requires Linux amd64, glibc 2.38 or newer, and the host libraries listed in the build manifest. One new entry there: Tessera now needs libpam installed, even if you never turn on the lock screen. Start your session with exec tessera so that exiting Tessera returns you to the login prompt.
You can download Tessera 0.3 from the release page, read more at tesserawm.org, and browse the source on Sigil Forge. If you try the launcher, I'd love to hear what commands you end up defining!
The commit this tag names.