<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>eclair.cafe posts</title>
  <link href="https://eclair.cafe/posts/"/>
  <link rel="self" href="https://eclair.cafe/posts/feed.xml" type="application/atom+xml"/>
  <id>https://eclair.cafe/posts/feed.xml</id>
  <author>
    <name>Kirill Primak</name>
    <email>vyivel@eclair.cafe</email>
  </author>
  <updated>2026-05-17T00:00:00Z</updated>
    <entry>
      <title>Problems</title>
      <link href="https://eclair.cafe/posts/problems"/>
      <id>https://eclair.cafe/posts/problems</id>
      <updated>2026-05-17T00:00:00Z</updated>
      <content type="html"><![CDATA[<style>
.sep {
  display: inline-block;
  width: 100%;
  text-align: center;
}
</style>
<p>I am a simple person with a simple purpose: I solve Problems. I take a Problem, put in effort, and get rid of it.
Failing that, I try to make the Problem smaller, at least. Then I move on to another Problem; thankfully, they seem to
be never-ending. Solving Problems is good; it makes someone's life better. Hopefully. My effort might even get
acknowledged.</p>
<p><span class="sep" style="margin: 1rem 0;">…</span></p>
<p>A friend reaches out to me; they have a Problem. I drop everything and try my best to help them. They're my friend, so I
can't say no.</p>
<p><span class="sep" style="margin: 1rem 0;">…</span></p>
<p>An educational institution gives me a task. I stare at it; suspiciously Problem-shaped, it stares back at me. But I see
its true nature. I know it's not a Problem, so I don't do it, not until failing to do the task becomes a Problem by
itself.</p>
<p><span class="sep" style="margin: 2rem 0;">…</span></p>
<p>I scroll through bits and pieces of human minds their owners deemed worthy of sharing. Yet another attempt to convince
me that a machine will take my job, solving Problems instead of me. I glance around; the number of Problems doesn't seem
to decrease much. Maybe in the future it will.</p>
<p><span class="sep" style="margin: 3rem 0;">…</span></p>
<p>Sometimes, when I'm bored, I make up a Problem. It's not real, but it doesn't matter; a few hours in, I can't tell the
difference anyway. Eventually I solve it, and for a fleeting moment it even feels almost as satisfying.</p>
<p><span class="sep" style="margin: 5rem 0;">…</span></p>
<p>There are other people who solve Problems, and many are better at it than I am too. Do they look at me as someone to
replace? As a Problem to solve?</p>
<p><span class="sep" style="margin: 8rem 0;">…</span></p>
<p>I'm scrolling again. Someone reminds me that I am a part of some Problem.</p>
<p>This means I should solve… myself?</p>
<p><span class="sep" style="margin: 13rem 0;">…</span></p>
<p>A friend reaches out to me; they want to vent. Is it a Problem? I can't tell.</p>
<p>I don't know what to do.</p>
<p><span class="sep" style="margin: 21rem 0;">…</span></p>
<p>It's 4 in the morning. The city's asleep. The only sound outside is the chirping of birds.</p>
<p>Sometimes I wish I were a bird. Then I wouldn't have Problems.</p>
]]></content>
    </entry>
    <entry>
      <title>croffle</title>
      <link href="https://eclair.cafe/posts/croffle"/>
      <id>https://eclair.cafe/posts/croffle</id>
      <updated>2026-04-30T00:00:00Z</updated>
      <content type="html"><![CDATA[<h2 id="why">Why</h2>
<p>Ever since I started using Linux about 8 years ago, I've been fascinated by the freedom it offers its users; more
specifically, the freedom of customization. I used to frequent spaces like r/unixporn and r/unixart, looking at
beautiful screenshots of setups and getting inspired to keep tinkering with my own. <span class="sidenote">Are you even
a real Linux user™ if you've never written a <del>compton</del> picom config?</span></p>
<p>My memories of that period are a bit fuzzy, but some time after trying my hand at writing an X11 window manager with the
most important feature others seemed to lack — vertical window title bars — I discovered Wayland and Sway, fixed a few
bugs in the latter, then some more, and before I knew it, became a wlroots team member.</p>
<p><img src="/assets/vertical-title-bar.png" alt="A small terminal emulator window with a title bar on the left."></p>
<blockquote>
<p>This is what I wanted. A cropped screenshot from <a href="https://old.reddit.com/r/unixporn/comments/fhd70d/awesomewm_floppier/">u/ilovecookieee's
post</a>.</p>
</blockquote>
<p><a href="https://codeberg.org/vyivel/croissant">croissant</a>'s initial commit dates back to June 26, 2023, but that's not the
<em>first</em> commit… I may or may not have accidentally removed my entire <code>~/src</code> before pushing the code anywhere, oops.
More than just a Wayland compositor to me, it was the culmination of everything I had learned. It offered stacking
window management with some weird system with 4 static window groups, which got completely replaced later with a static
tiling approach; it spawned <a href="https://gitlab.freedesktop.org/vyivel/libsfdo">libsfdo</a> because I wanted to have window
icons; it had a window switcher with live previews, not something you would often see in a non-mainstream desktop
environment; and of course, it had vertical title bars. Slowly but steadily, it was shaping into what I had envisioned
from the start.</p>
<p>At the same time in real life, I was getting closer to finishing my bachelor's degree. I decided to kill two stones with
one bird, or however the saying goes, and reused croissant as my thesis project (with great success). In the end, I
finished my compositor, I got my diploma, I fulfilled a long-time wish of that kid who spent most of his free time
writing configs and reading ArchWiki… and I felt burned out. It didn't take long for croissant to stop being something
important and turn into just a 20000-lines-of-C behemoth I didn't really want to maintain, or touch at all. There was no
goal to work towards anymore, and only a void remained.</p>
<p>A bit later, I quit wlroots and stopped working on Wayland software for a while.</p>
<h2 id="how">How</h2>
<p>Fast forward to a few weeks ago. I had grown tired of my Fedora setup filled with lots of ancient garbage on a very
inconveniently partitioned drive, and so I decided to just nuke everything and go for a clean Arch install, as &lt;your
preferred deity&gt; intended. This created an opportunity to try out <a href="https://isaacfreund.com/software/river">river</a>, a
modular compositor that allows (or rather, requires) users to bring their own window manager. Of course, I had to write
it myself.</p>
<p>A window manager in river is just a special Wayland client that uses a bunch of private protocols to, well, manage
windows. As Wayland clients tend to be single-threaded programs with manual object lifetime management, I naturally
reached for Go, and after taking a small detour to write <a href="https://codeberg.org/vyivel/wlcl">a Wayland client package</a>
for it and a <a href="https://codeberg.org/river/tinyrwm">tinyrwm</a> implementation and picking a name for the project, I got to
work on <em>croffle</em>.</p>
<p>One nice thing about not writing a whole Wayland compositor is that you don't have to care about the
boring-but-important stuff like synchronizing simultaneous window updates, managing layer surfaces, and so on. On the
other hand, it means that sometimes the tools you are offered can be limiting, but hey, creativity flourishes under
constraints, and even if they end up being too tight, Isaac, river's developer, is open to suggestions and feature
requests. As such, it didn't take me long before I had a working WM tailored to my needs.</p>
<h2 id="what">What</h2>
<p>croffle is actually two separate programs: crofflewm, a window manager, and croffleim, an input device manager. The
latter is about as boring as it can be, so let's focus on the former.</p>
<p>Just like its ontological ancestor, crofflewm is a static tiling WM, which means that opening or closing a window
doesn't resize everything else. You can add or remove tiles manually.</p>
<p><img src="/assets/croffle-example.png" alt="A croffle screenshot with three tiles; one of them has a Zed window with croffle code, and the other two are empty.
The first empty tile is purple because it's focused."></p>
<p>You can also resize the &quot;main&quot; tile (the first one), and that's about all the control you have over the layout, really.</p>
<p>My reasons for preferring this somewhat unorthodox window management approach are pretty simple:</p>
<ol>
<li>Most of the time, I just want to have one maximized window.</li>
<li>With a maximized window open, a new window must either be floating, or maximized too. &quot;Resize the first window and
show both side by side&quot; is rarely what I actually want to see.</li>
<li>When I <em>do</em> want to have two side-by-side windows, it must be a deliberate decision, and opening yet another window
absolutely shouldn't break the existing delicate structure.</li>
<li>In the rare case I need to have <strong>three</strong> tiled windows open, one of them can usually be designated as the main one,
and the sizes of the other two don't matter.</li>
<li>As far as science can tell, nobody has ever needed more than three tiled windows.</li>
</ol>
<p>If you've heard of Notion (not the &quot;AI workspace&quot; or whatever it's being marketed as these days, <a href="https://notionwm.net/">the other
one</a>), it's similar to that, except tiles are stored as a list (and not a tree), tabs don't
exist, and all the currently hidden windows are stored in one per-workspace list, which not only simplifies the whole
model, but also allows me to avoid adding extra UI and controls. Win-win!</p>
<p>When it comes to workspaces, or just spaces in crofflewm parlance, having a static number of them has always felt
strangely limiting to me, be it 4, 10, or 32, although as I'm writing this now, I feel like this can be attributed to
the general rigidity of dynamic tiling window managers without support for hidden windows, which makes their users say
nonsense like &quot;workspace 6 is for communication&quot;. Sure, i3 has scratchpad, but that's not even remotely It.</p>
<p>In crofflewm, a space exists as long as it has at least one window in it or is focused; it's there only if you need it.</p>
<p>The final piece of the puzzle is a window switcher which I find very convienient as I prefer temporal navigation (&quot;focus
the previous window&quot;) over spatial (&quot;focus a window to the right&quot;) when it comes to focus management. In croissant,
getting this right involved doing some funny business with a custom no-op <code>wlr_backend</code> and <code>wlr_output</code> which
ultimately worked pretty well and provided live previews for all targets; crofflewm just gives you one static
translucent preview of the current selection, striking a nice balance between clarity and implementation simplicity.</p>
<p>All in all, crofflewm is a pretty weird beast in its category.</p>
<p><img src="/assets/croffle-actual.jpg" alt="A photo of a croffle with some vanilla ice cream and whipped cream with dusted cocoa
powder."></p>
<blockquote>
<p>Not quite what my window manager looks like, but it's pretty close. A photo by
<a href="https://blog.naver.com/lovelyelice/222156590954">까만앨리스</a>, licensed under <a href="https://creativecommons.org/licenses/by-sa/2.0/kr/deed.en">CC BY-SA 2.0
KR</a>.</p>
</blockquote>
<h2 id="conclusion">Conclusion</h2>
<p>The freedom Linux promised was just a bait to get me to spend my teen years and then some on a relatively niche OS and
its quirky windowing system. Good bait, though, I'd bite again.</p>
<p>Go write a river WM, it's fun. And maybe check out <a href="https://codeberg.org/vyivel/croffle">croffle</a> too.</p>
]]></content>
    </entry>
    <entry>
      <title>Hello</title>
      <link href="https://eclair.cafe/posts/hello"/>
      <id>https://eclair.cafe/posts/hello</id>
      <updated>2026-04-11T00:00:00Z</updated>
      <content type="html"><![CDATA[<p>Will this blog stay up for longer than its predecessors? Who knows.</p>
]]></content>
    </entry>
</feed>
