<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Index on Ozbem</title><link>https://www.ozbem.com/</link><description>Recent content in Index on Ozbem</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>info@ozbem.com (ebeem)</managingEditor><webMaster>info@ozbem.com (ebeem)</webMaster><copyright>© 2026 ebeem</copyright><lastBuildDate>Sun, 28 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.ozbem.com/rss.xml" rel="self" type="application/rss+xml"/><item><title>Emacs Vanilla vs Flavors (Spacemacs and Doom Emacs)</title><link>https://www.ozbem.com/posts/tech/emacs/vanilla-vs-flavors/</link><pubDate>Sun, 28 Jun 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/emacs/vanilla-vs-flavors/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Where to Begin?&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Emacs is not just a text editor, it is a Lisp machine that happens to edit text. When stepping into the Emacs ecosystem, new users are immediately faced with a choice: build from scratch (&lt;code class="verbatim"&gt;Vanilla Emacs&lt;/code&gt;) or use a pre-configured starter kit like &lt;code class="verbatim"&gt;Doom Emacs&lt;/code&gt; or &lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt;. Each approach has distinct pros and cons, and understanding them can save you months of configuration frustration.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;The Batteries-Included Flavors&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Starter kits are fantastic for package discovery. They show you exactly what Emacs is capable of right out of the box, coming pre-configured with themes, completion frameworks, and integrations for almost every programming language.&lt;/p&gt;&#10;&lt;p&gt;&#10;However, this convenience comes at a cost. &amp;#34;Batteries-included&amp;#34; setups reduce your visibility into the underlying mechanics. When something breaks, or when you want to change a core behavior, deep customization becomes harder. You often find yourself fighting the framework&amp;#39;s design rather than just configuring Emacs.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Spacemacs&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10; &lt;img src="imgs/spacemacs-screenshot.png" alt="imgs/spacemacs-screenshot.png" title="imgs/spacemacs-screenshot.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt; revolutionized the community by popularizing mnemonic, space-bar-driven keybindings and excellent &lt;code class="verbatim"&gt;Vim&lt;/code&gt; emulation. However, it relies heavily on configuration &amp;#34;layers.&amp;#34;&lt;/p&gt;&#10;&lt;p&gt;&#10;These layers add a massive amount of abstraction on top of the base editor. While this makes it incredibly easy to toggle features on and off, migrating your configuration from &lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt; to &lt;code class="verbatim"&gt;Vanilla Emacs&lt;/code&gt; becomes an extremely difficult task. Because of the heavy abstraction, you end up learning the &amp;#34;Spacemacs way&amp;#34; rather than the &amp;#34;Emacs way.&amp;#34;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;Doom Emacs&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;&lt;img src="imgs/doom-emacs-screenshot.png" alt="imgs/doom-emacs-screenshot.png" title="imgs/doom-emacs-screenshot.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Doom Emacs&lt;/code&gt; takes a different philosophical approach. It still provides a beautiful, feature-rich out-of-the-box experience, but it significantly reduces the layers between the user&amp;#39;s configuration and the core Emacs configuration.&lt;/p&gt;&#10;&lt;p&gt;&#10;It utilizes clever macros to keep startup times incredibly fast and maintains a structure much closer to standard Emacs Lisp. If you want to peek under the hood and see how a feature is implemented, &lt;code class="verbatim"&gt;Doom&lt;/code&gt; makes it highly visible and accessible.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-2"&gt;&#10;&lt;h2 id="headline-5"&gt;&#10;Vanilla Emacs&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;&lt;img src="imgs/vanilla-emacs-screenshot.png" alt="imgs/vanilla-emacs-screenshot.png" title="imgs/vanilla-emacs-screenshot.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Vanilla Emacs&lt;/code&gt; is exactly what you get when you download the software from the GNU website. It is a completely blank slate.&lt;/p&gt;&#10;&lt;p&gt;&#10;The primary advantage here is total ownership. You understand every single line in your configuration file because you put it there. You learn standard Emacs Lisp, making it straightforward to read official documentation and leverage community packages. The major downside is the steep learning curve. You are fully responsible for setting up your own package manager, user interface, completion frameworks, and language servers.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-2"&gt;&#10;&lt;h2 id="headline-6"&gt;&#10;The Keybinding&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Your choice of flavor is often heavily tied to your preferred typing style and hardware setup.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-3"&gt;&#10;&lt;h3 id="headline-7"&gt;&#10;Evil Mode (Vim Bindings)&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;If you are a user coming from &lt;code class="verbatim"&gt;vi&lt;/code&gt; or &lt;code class="verbatim"&gt;Vim&lt;/code&gt;, &lt;code class="verbatim"&gt;Evil mode&lt;/code&gt; (which powers both &lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt; and &lt;code class="verbatim"&gt;Doom&lt;/code&gt; by default) is practically magic. It flawlessly brings the language of Vim text objects into Emacs. However, modal editing can sometimes feel like a second-class citizen in niche Emacs packages, requiring extra translation packages (like &lt;code class="verbatim"&gt;evil-collection&lt;/code&gt;) to make third-party tools play nicely.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-3"&gt;&#10;&lt;h3 id="headline-8"&gt;&#10;Vanilla Bindings (Emacs Bindings)&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Standard Emacs keybindings (using &lt;code class="verbatim"&gt;Ctrl&lt;/code&gt; and &lt;code class="verbatim"&gt;Meta&lt;/code&gt;). They are deeply integrated into the entire Emacs ecosystem. Everything just works, seamlessly and consistently without any translation layers.&lt;/p&gt;&#10;&lt;p&gt;&#10;The common complaint is that they require uncomfortable hand stretching. However, if you use a high-quality split ergonomic keyboard, you can easily map modifiers to your thumb clusters. With good hardware, the chances are high that you will not need anything but the standard vanilla keybindings.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-9" class="outline-3"&gt;&#10;&lt;h3 id="headline-9"&gt;&#10;Meow (Middle Ground)&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-9" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;If you want the ergonomic benefits of modal editing without straying too far from the standard ecosystem, the &lt;code class="verbatim"&gt;meow&lt;/code&gt; package is a fantastic alternative. Packages like &lt;code class="verbatim"&gt;meow&lt;/code&gt; try to sit right in the middle. It allows modal editing but does not fight the default Emacs environment the way &lt;code class="verbatim"&gt;Evil&lt;/code&gt; sometimes does, keeping your experience much closer to vanilla Emacs.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-10" class="outline-2"&gt;&#10;&lt;h2 id="headline-10"&gt;&#10;My Recommendation&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-10" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;For newcomers to &lt;code class="verbatim"&gt;Emacs&lt;/code&gt;, I highly recommend starting with &lt;code class="verbatim"&gt;Doom Emacs&lt;/code&gt;. It offers a polished, out-of-the-box experience that lets you get real work done immediately while showing you what Emacs is truly capable of. Later on, as you pick up Emacs Lisp and learn more about the popular packages, you will want to configure things exactly your way, you&amp;#39;ll be well-prepared to drop the starter kit and craft your own &lt;code class="verbatim"&gt;Vanilla Emacs&lt;/code&gt; configuration from scratch.&lt;/p&gt;&#10;&lt;p&gt;&#10;If you&amp;#39;re already a &lt;code class="verbatim"&gt;vim&lt;/code&gt; user or just want to explore modal editing, &lt;code class="verbatim"&gt;evil-mode&lt;/code&gt; provides a fantastic experience. If you want the benefits of modal editing but aren&amp;#39;t tied to traditional vim bindings, &lt;code class="verbatim"&gt;meow&lt;/code&gt; is an excellent alternative. I do believe everyone should learn vim keybindings eventually as they are invaluable when you find yourself on a machine without Emacs. However, as a modal editing package, I prefer &lt;code class="verbatim"&gt;meow&lt;/code&gt; over &lt;code class="verbatim"&gt;evil-mode&lt;/code&gt; because it&amp;#39;s lightweight and integrates much more naturally with the native Emacs ecosystem. If you type on a solid ergonomic split keyboard, I strongly suggest sticking to standard vanilla Emacs keybindings.&lt;/p&gt;&#10;&lt;p&gt;&#10;My personal progression went from &lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt; to &lt;code class="verbatim"&gt;Doom Emacs&lt;/code&gt;, and finally to vanilla. If I go back in time I would skip &lt;code class="verbatim"&gt;Spacemacs&lt;/code&gt;, it didn&amp;#39;t teach me much about how things work under the hood. My editing journey followed a similar path: &lt;code class="verbatim"&gt;evil-mode&lt;/code&gt; to &lt;code class="verbatim"&gt;meow&lt;/code&gt; to vanilla. I am incredibly glad I spent time with &lt;code class="verbatim"&gt;evil-mode&lt;/code&gt;, as it left me highly proficient and comfortable with vim keybindings.&lt;/p&gt;&#10;&lt;p&gt;&#10; Useful Resources&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/doomemacs/doomemacs"&gt;Doom Emacs GitHub&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.spacemacs.org/"&gt;Spacemacs Official Website&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/meow-edit/meow"&gt;Meow - Modal Editing for Emacs&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Bootloader</title><link>https://www.ozbem.com/posts/tech/linux/bootloader/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/linux/bootloader/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Introduction&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Once the firmware finishes initializing the hardware, it hands the baton to the bootloader. The bootloader is a small program whose sole purpose is to load the Linux kernel and the initial RAM disk (&lt;code class="verbatim"&gt;initramfs&lt;/code&gt;) into memory and execute them.&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;GRUB&lt;/code&gt; (GRand Unified Bootloader) is the undisputed king of Linux bootloaders, though &lt;code class="verbatim"&gt;systemd-boot&lt;/code&gt; is a highly popular, lightweight alternative for modern UEFI systems.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;Customizing the Bootloader&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;The bootloader is highly customizable. By editing its configuration files, you can alter fundamental behaviors of your system&amp;#39;s startup.&lt;/p&gt;&#10;&lt;p&gt;&#10; Default Operating System: If you dual-boot Linux and Windows, you can set which OS boots by default. You can even configure GRUB to remember the last OS you booted and default to that one next time.&lt;/p&gt;&#10;&lt;p&gt;&#10; Timeout: You can change how long the boot menu waits for your input before selecting the default option. You can set it to 10 seconds, 1 second, or even hide the menu entirely for a faster boot.&lt;/p&gt;&#10;&lt;p&gt;&#10; Kernel Parameters: You can pass specific instructions to the Linux kernel before it starts. This is incredibly useful for troubleshooting. For example, you can add parameters to disable a problematic graphics driver, force a specific screen resolution, or boot into a text-only recovery mode.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-2"&gt;&#10;&lt;h2 id="headline-3"&gt;&#10;Themes and Visuals&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Your bootloader does not have to be a boring black-and-white text menu. &lt;code class="verbatim"&gt;GRUB&lt;/code&gt; heavily supports visual customization.&lt;/p&gt;&#10;&lt;p&gt;&#10;At the most basic level, you can easily add a custom background image to the GRUB menu. Going further, the Linux community has created thousands of full &lt;code class="verbatim"&gt;GRUB themes&lt;/code&gt;. These themes can completely overhaul the interface, adding custom typography, colorful progress bars, and high-resolution icons for each operating system you have installed.&lt;/p&gt;&#10;&lt;p&gt;&#10;To apply a theme, you typically download a theme folder, place it in the designated themes directory, and update your GRUB configuration file.&lt;/p&gt;&#10;&lt;p&gt;&#10; Edit your main GRUB configuration file (usually located at &lt;code class="verbatim"&gt;/etc/default/grub&lt;/code&gt;) to point to your new theme:&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example of setting a theme in /etc/default/grub&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRUB_THEME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/boot/grub/themes/my-custom-theme/theme.txt&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10; After saving the configuration, you must regenerate the actual boot menu for the visual changes to take effect:&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo grub-mkconfig -o /boot/grub/grub.cfg&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Whether you are prioritizing a minimalist, lightning-fast boot or a beautifully themed menu that welcomes you to your computer, the Linux bootloader gives you the tools to make the startup process your own.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Firmware (BIOS and UEFI)</title><link>https://www.ozbem.com/posts/tech/linux/firmware/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/linux/firmware/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Introduction&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;The firmware is the absolute bedrock of your system. Before Linux or any operating system can even think about running, the motherboard&amp;#39;s firmware must wake up the hardware. It performs the Power-On Self Test (POST), initializes the CPU and RAM, and locates the drive containing your operating system.&lt;/p&gt;&#10;&lt;p&gt;&#10;Historically, computers used the Basic Input/Output System (&lt;code class="verbatim"&gt;BIOS&lt;/code&gt;). Today, almost all modern computers use the Unified Extensible Firmware Interface (&lt;code class="verbatim"&gt;UEFI&lt;/code&gt;), which is essentially a mini-operating system itself. It supports larger hard drives, faster boot times, and graphical interfaces with mouse support.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;Upgrading Firmware&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Yes, firmware can and often should be upgraded. Motherboard and laptop manufacturers regularly release updates for your BIOS or UEFI.&lt;/p&gt;&#10;&lt;p&gt;&#10;These upgrades are released to:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Patch critical security vulnerabilities.&lt;/li&gt;&#10;&lt;li&gt;Fix bugs related to power management or sleep states.&lt;/li&gt;&#10;&lt;li&gt;Add support for newly released hardware, such as a newer generation CPU that fits into the same motherboard socket.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;This process is commonly known as &lt;code&gt;flashing the BIOS&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10; Warning: Flashing your firmware carries a small amount of risk. If the power goes out during the update, it can &amp;#34;brick&amp;#34; the motherboard, rendering the computer unusable without specialized recovery tools. Always ensure your system has a stable power supply or a fully charged battery before updating.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-2"&gt;&#10;&lt;h2 id="headline-3"&gt;&#10;Customizing Firmware&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Standard UEFI interfaces offer built-in customization, such as changing the boot order, adjusting fan curves, or enabling hardware virtualization. However, for true customization, the Linux community often looks toward open-source firmware replacements.&lt;/p&gt;&#10;&lt;p&gt;&#10;Projects like &lt;code class="verbatim"&gt;Coreboot&lt;/code&gt; and &lt;code class="verbatim"&gt;Libreboot&lt;/code&gt; aim to replace the proprietary, closed-source firmware shipped by manufacturers. These open-source alternatives offer massive benefits:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;They strip out hidden, proprietary code.&lt;/li&gt;&#10;&lt;li&gt;They allow for incredibly fast boot times because they only initialize exactly what is needed.&lt;/li&gt;&#10;&lt;li&gt;They give users total, transparent control over their hardware from the very first second of power-on.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Note that installing open-source firmware requires specific hardware compatibility and technical expertise, as it often involves physically clipping a flashing tool onto the motherboard&amp;#39;s firmware chip.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Introduction to Guix</title><link>https://www.ozbem.com/posts/tech/guix/intro/</link><pubDate>Fri, 19 Jun 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/guix/intro/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;&lt;span class="todo status-todo"&gt;TODO&lt;/span&gt;&#10;Installation&#10;&lt;/h2&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;Channels&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Channels in &lt;code class="verbatim"&gt;Guix&lt;/code&gt; are a way to customize and extend the &lt;code class="verbatim"&gt;Guix&lt;/code&gt; package collection. They allow users to pull packages and updates from multiple repositories. They are declared as a list of &lt;code class="verbatim"&gt;channel&lt;/code&gt; records in the file &lt;code class="verbatim"&gt;channels.scm&lt;/code&gt;. These channels are git repositories that store definitions that instruct &lt;code class="verbatim"&gt;Guix&lt;/code&gt; how to build and install packages. Since these are git repositories, then similar to any git cloned project, it needs to be pulled to kept up to date. &lt;code class="verbatim"&gt;Guix&lt;/code&gt; can help you update/pull all your configured channels with the command &lt;code class="verbatim"&gt;guix pull&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;Note: pulling &lt;code class="verbatim"&gt;Guix&lt;/code&gt; might take a long time depending on how outdated your system is. Expect up to an hour on your first installation.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Adding a channel&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create or edit your &lt;code class="verbatim"&gt;~/.config/guix/channels.scm&lt;/code&gt; file to include your desired channels. Here&amp;#39;s an example: &lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cons*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;my-channel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://example.com/my-channel.git&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;%default-channels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: we create a channel record with the name &lt;code class="verbatim"&gt;my-channel&lt;/code&gt; and the git url, then we use &lt;code class="verbatim"&gt;cons&lt;/code&gt; to append it to the &lt;code class="verbatim"&gt;%default-channels&lt;/code&gt; which includes the default &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channel. It&amp;#39;s possible to remove the default &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channel by returning a new list without appending the default channels.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Save the file and pull &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channels:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix pull&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;Removing a channel&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;edit your &lt;code class="verbatim"&gt;~/.config/guix/channels.scm&lt;/code&gt; file to exclude the target channel.&lt;/li&gt;&#10;&lt;li&gt;Save the file and pull &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channels:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix pull&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;Useful Resources&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/en/html_node/Channels.html"&gt;GNU Guix Manual - Channels&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://toys.whereis.xn--q9jyb4c/"&gt;Toys Whereis - A collection of guix Channels&lt;/a&gt; &lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-2"&gt;&#10;&lt;h2 id="headline-6"&gt;&#10;NonGuix Channel&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;&lt;code class="verbatim"&gt;Nonguix&lt;/code&gt; is a &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channel that packages some software which cannot be included in the official distribution for ethical or policy-related reasons. &lt;code class="verbatim"&gt;Guix&lt;/code&gt; official repository offers only &lt;a href="https://www.gnu.org/philosophy/free-sw.en.html"&gt;Gnu Compatible Free Software&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;It will be great if we can use only free software, but sometimes it&amp;#39;s necessary to add some nonfree software to get our machine functioning properly. For example, Guix&amp;#39;s default kernel is called &lt;code class="verbatim"&gt;Linux Libre&lt;/code&gt;, it&amp;#39;s a custom Linux kernel that doesn&amp;#39;t ship with some nonfree drivers embedded into the &lt;code class="verbatim"&gt;Linux&lt;/code&gt; kernel. These drivers are necessary to get some wifi and bluetooth cards to work.&lt;/p&gt;&#10;&lt;p&gt;&#10;Rule of thumb: If everything works properly in your case, no missing drivers, all hardware is working as expected, then you probably don&amp;#39;t want to add or use the nonguix channel.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-3"&gt;&#10;&lt;h3 id="headline-7"&gt;&#10;Adding the NonGuix channel&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-3"&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create or edit your &lt;code class="verbatim"&gt;~/.config/guix/channels.scm&lt;/code&gt; file to include the &lt;code class="verbatim"&gt;NonGuix&lt;/code&gt; channel &lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cons*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="ss"&gt;&amp;#39;nonguix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://gitlab.com/nonguix/nonguix&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;;; Enable signature verification:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;introduction&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-channel-introduction&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;897c1a470da759236cc11798f4e0a5f7d4d59fbc&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;openpgp-fingerprint&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;2A39 3FFF 68F4 EF7A 3D29 12AF 6F51 20A0 22FB B2D5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;%default-channels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Pull &lt;code class="verbatim"&gt;Guix&lt;/code&gt; channels&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix pull&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: in case you notice the message below after pulling &lt;code class="verbatim"&gt;NonGuix&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hint: Consider setting the necessary environment variables by running:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GUIX_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/ebeem/.config/guix/current&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; . &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GUIX_PROFILE&lt;/span&gt;&lt;span class="s2"&gt;/etc/profile&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Alternately, see &lt;span class="sb"&gt;`&lt;/span&gt;guix package --search-paths -p &lt;span class="s2"&gt;&amp;#34;/home/ebeem/.config/guix/current&amp;#34;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;hint: After setting `PATH&amp;#39;&lt;/span&gt;, run &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; guix&lt;span class="s1"&gt;&amp;#39; to make sure your shell refers to `/home/ebeem/.config/guix/current/bin/guix&amp;#39;&lt;/span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Then execute the below to ensure the updated profile path is active&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GUIX_PROFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/ebeem/.config/guix/current&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; . &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GUIX_PROFILE&lt;/span&gt;&lt;span class="s2"&gt;/etc/profile&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;hash&lt;/span&gt; guix&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: with this step, you only make the nonguix packages available to your system. You are still not using the &lt;code class="verbatim"&gt;Full Linux kernel&lt;/code&gt; or any other nonfree software. Continue to the other sections to learn more.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-3"&gt;&#10;&lt;h3 id="headline-8"&gt;&#10;Useful Resources&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/free-sw.en.html"&gt;What is Free Software?&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://gitlab.com/nonguix/nonguix"&gt;NonGuix Gitlab Repository&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Linux-libre"&gt;Linux Libre&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-9" class="outline-2"&gt;&#10;&lt;h2 id="headline-9"&gt;&#10;System Configuration&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-9" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;System configuration in &lt;code class="verbatim"&gt;Guix&lt;/code&gt; is declarative, meaning you define the desired state of your system in a configuration file, and &lt;code class="verbatim"&gt;Guix&lt;/code&gt; ensures your system matches that state. Upon installing &lt;code class="verbatim"&gt;Guix&lt;/code&gt;, you provided system configuration parameters that &lt;code class="verbatim"&gt;Guix&lt;/code&gt; installer used to create a system configuration file for you in the path &lt;code class="verbatim"&gt;/etc/config.scm&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;You can take a peak at this file and see all the parameters that have been configured like: &lt;code class="verbatim"&gt;locale&lt;/code&gt;, &lt;code class="verbatim"&gt;timezone&lt;/code&gt;, &lt;code class="verbatim"&gt;keyboard-layout&lt;/code&gt;, &lt;code class="verbatim"&gt;host-name&lt;/code&gt;, &lt;code class="verbatim"&gt;users&lt;/code&gt;, &lt;code class="verbatim"&gt;packages&lt;/code&gt;, &lt;code class="verbatim"&gt;services&lt;/code&gt;, &lt;code class="verbatim"&gt;bootloader&lt;/code&gt;, &lt;code class="verbatim"&gt;swap-devices&lt;/code&gt;, &lt;code class="verbatim"&gt;file-systems&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;These configurations are system level, this means that they impact all the users on your system. For example, we can add &lt;code class="verbatim"&gt;emacs&lt;/code&gt; to the declared &lt;code class="verbatim"&gt;packages&lt;/code&gt; list, this will install &lt;code class="verbatim"&gt;emacs&lt;/code&gt; globally on your system and make it available to all users. It&amp;#39;s important to understand here that unlike other Linux distributions and operating systems. &lt;code class="verbatim"&gt;Guix&lt;/code&gt; suggests adding packages to user configurations (called &lt;code class="verbatim"&gt;home&lt;/code&gt; configuration) rather than &lt;code class="verbatim"&gt;system&lt;/code&gt; configuration. However, some packages must be installed globally, like the &lt;code class="verbatim"&gt;Linux&lt;/code&gt; kernel, &lt;code class="verbatim"&gt;vi&lt;/code&gt; to have a text editor and your display manager like &lt;code class="verbatim"&gt;GDM&lt;/code&gt;. Knowing when to add a package to system or user level might take sometime, but the rule of thumb here, if you can add it to user level, then do so.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-10" class="outline-3"&gt;&#10;&lt;h3 id="headline-10"&gt;&#10;Creating System Configuration&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-10" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;It&amp;#39;s better to start with the generated &lt;code class="verbatim"&gt;Guix&lt;/code&gt; configuration located in the path &lt;code class="verbatim"&gt;/etc/config.scm&lt;/code&gt;. My preference is to have this system configuration added to my &lt;code class="verbatim"&gt;dotfiles&lt;/code&gt; so I can easily manage and track changes using &lt;code class="verbatim"&gt;git&lt;/code&gt;.&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Copy the generated &lt;code class="verbatim"&gt;Guix&lt;/code&gt; configuration file to your &lt;code class="verbatim"&gt;Guix&lt;/code&gt; configuration directory&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /etc/config.scm ~/.config/guix/system.scm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-11" class="outline-3"&gt;&#10;&lt;h3 id="headline-11"&gt;&#10;Applying System Configuration&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-11" class="outline-text-3"&gt;&#10;&lt;p&gt;Upon modifying the system configuration, you will have to tell &lt;code class="verbatim"&gt;Guix&lt;/code&gt; to apply your changes by providing it with the path of your system configuration.&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo guix system reconfigure ~/.config/guix/system.scm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: Remember that the &lt;code class="verbatim"&gt;Guix&lt;/code&gt; system configuration contains data that only superusers can access or modify. For example, only superusers can partition disks, manage users, manage system level packages, manage system level services. That&amp;#39;s the reason why a &lt;code class="verbatim"&gt;sudo&lt;/code&gt; is required when you would like to reconfigure your system.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-12" class="outline-3"&gt;&#10;&lt;h3 id="headline-12"&gt;&#10;Using Nonfree Linux Kernel&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-12" class="outline-text-3"&gt;&#10;&lt;p&gt;To be able to use the nonfree &lt;code class="verbatim"&gt;Linux&lt;/code&gt; kernel, you must add the &lt;code class="verbatim"&gt;NonGuix&lt;/code&gt; channel and pull it so the nonfree software become available to your system.&lt;/p&gt;&#10;&lt;p&gt;&#10;Edit your &lt;code class="verbatim"&gt;~/.config/guix/system.scm&lt;/code&gt; as below&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Add needed imports in your system configuration&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Just below the line where the &lt;code class="verbatim"&gt;gnu&lt;/code&gt; module is imported &lt;code class="verbatim"&gt;(use-modules (gnu))&lt;/code&gt;&#10;Add the below lines&lt;/p&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;;; Import nonfree linux module.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use-modules&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nongnu&lt;/span&gt; &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nongnu&lt;/span&gt; &lt;span class="nv"&gt;system&lt;/span&gt; &lt;span class="nv"&gt;linux-initrd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Modify the parameters of your operating system record&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Now you will have to add the new nonfree &lt;code class="verbatim"&gt;Linux&lt;/code&gt; kernel as the kernel of your system.&#10;You can do so be adding the below lines just below the line where the operating system is defined &lt;code class="verbatim"&gt;(operting-system&lt;/code&gt; and before the line where &lt;code class="verbatim"&gt;locale&lt;/code&gt; is defined.&lt;/p&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kernel&lt;/span&gt; &lt;span class="nv"&gt;linux&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;initrd&lt;/span&gt; &lt;span class="nv"&gt;microcode-initrd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;firmware&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="nv"&gt;linux-firmware&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Apply the system configuration&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;Now that you modified the used kernel, you must apply the configuration for it to take affect.&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo guix system reconfigure ~/.config/guix/system.scm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: This might take a long time if this is the first time you reconfigure the system. That&amp;#39;s because when you pull the channels, you updated the list of package definitions available with their versions. This means that the latest version of Emacs available becomes &lt;code class="verbatim"&gt;Emacs&lt;/code&gt; 30, while you&amp;#39;re still running &lt;code class="verbatim"&gt;Emacs&lt;/code&gt; 28. Pulling will NOT upgrade packages, it will just make the new versions available. On the other hand, system reconfigure will update packages if the pulled channels indicate that an update is available.&lt;/p&gt;&#10;&lt;p&gt;&#10;Note: Avoid running any guix configuration commands under the &lt;code class="verbatim"&gt;root&lt;/code&gt; user. Using &lt;code class="verbatim"&gt;sudo&lt;/code&gt; will ensure that your user configured channels are used, if you would like to reconfigure your system as &lt;code class="verbatim"&gt;root&lt;/code&gt; then you will have to also maintain another list of channels and keep them up to date which is not convenient. Rule of thumb: you probably never want to run any of the &lt;code class="verbatim"&gt;Guix&lt;/code&gt; commands as a &lt;code class="verbatim"&gt;root&lt;/code&gt; user, you should use &lt;code class="verbatim"&gt;sudo&lt;/code&gt; when superuser privileges are required.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-13" class="outline-3"&gt;&#10;&lt;h3 id="headline-13"&gt;&#10;Useful Resources&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-13" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.gnu.org/philosophy/free-sw.en.html"&gt;What is Free Software?&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://gitlab.com/nonguix/nonguix"&gt;NonGuix Gitlab Repository&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Linux-libre"&gt;Linux Libre&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/devel/en/html_node/System-Configuration.html"&gt;System Configuration - Guix Manual&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-14" class="outline-2"&gt;&#10;&lt;h2 id="headline-14"&gt;&#10;Home Configuration&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-14" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;Now that you have a good idea how to modify and apply system level configuration, let&amp;#39;s dive into modify your user level configuration (referred to as home configuration). &lt;code class="verbatim"&gt;Guix&lt;/code&gt; Home configuration allows you to set packages and services per user. Packages are software to be installed, while services can be actual sheperd services, configuration manager.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-15" class="outline-3"&gt;&#10;&lt;h3 id="headline-15"&gt;&#10;Creating Home Configuration&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-15" class="outline-text-3"&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Create or edit your &lt;code class="verbatim"&gt;~/.config/guix/home.scm&lt;/code&gt; file to include your desired configuration. Here&amp;#39;s an example: &lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use-modules&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt; &lt;span class="nv"&gt;shells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="nv"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;guix&lt;/span&gt; &lt;span class="nv"&gt;gexp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;home-environment&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="nv"&gt;htop&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;services&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;service&lt;/span&gt; &lt;span class="nv"&gt;home-bash-service-type&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;home-bash-configuration&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;guix-defaults?&lt;/span&gt; &lt;span class="no"&gt;#t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;bash-profile&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;plain-file&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;bash-profile&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export HISTFILE=$XDG_CACHE_HOME/.bash_history&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))))))))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: we define packages and services for our home configuration. our list of packages in this example is &lt;code class="verbatim"&gt;htop&lt;/code&gt; only. The services is only &lt;code class="verbatim"&gt;home-bash-configuration&lt;/code&gt; which create the file &lt;code class="verbatim"&gt;bash-profile&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;Note: notice that we import some modules that expose the package &lt;code class="verbatim"&gt;htop&lt;/code&gt; &lt;code class="verbatim"&gt;(gnu packages admin)&lt;/code&gt; and the &lt;code class="verbatim"&gt;home-bash-service-type&lt;/code&gt; &lt;code class="verbatim"&gt;(gnu home services shells)&lt;/code&gt;. Read more about how to find out the modules in Installing Packages. &lt;code class="verbatim"&gt;Guix&lt;/code&gt; also has a utility that will search for package from a string only (not recommended but works). &lt;/p&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map &lt;/span&gt;&lt;span class="nv"&gt;specification-&amp;gt;package&lt;/span&gt; &lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;btop&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;alacritty&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;gimp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Save the file and apply your home configuration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix home reconfigure ~/.config/guix/home.scm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Applying the home configuration above will install &lt;code class="verbatim"&gt;htop&lt;/code&gt; to your home configuration (user level) and create modify the &lt;code class="verbatim"&gt;.bash-profile&lt;/code&gt; to define the environment variable &lt;code class="verbatim"&gt;HISTFILE&lt;/code&gt; to the path defined.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-16" class="outline-3"&gt;&#10;&lt;h3 id="headline-16"&gt;&#10;Useful Resources&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-16" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/devel/en/html_node/Home-Services.html"&gt;Home Services - Guix Manual&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/devel/en/html_node/Shells-Home-Services.html"&gt;Shells Home Services - Guix Manual&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/devel/en/html_node/Invoking-guix-home.html"&gt;Invoking Guix Home - Guix Manual&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-17" class="outline-2"&gt;&#10;&lt;h2 id="headline-17"&gt;&#10;Installing Packages&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-17" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;At this point, it should be clear that you can declare your packages either in &lt;code class="verbatim"&gt;system.scm&lt;/code&gt; to become system level packages that can be accessed by all users on the system, or in &lt;code class="verbatim"&gt;home.scm&lt;/code&gt; to become user level packages that can be only access by the user who applies the &lt;code class="verbatim"&gt;home.scm&lt;/code&gt; to their home. We also agreed that it&amp;#39;s recommended to install packages on user level if possible to avoid any version conflicts, give more flexibility to users regarding when to upgrade, and have a minimal system configuration that doesn&amp;#39;t require frequent updates as opposed to user configuration that might be updated very regularly.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-18" class="outline-3"&gt;&#10;&lt;h3 id="headline-18"&gt;&#10;Finding Packages&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-18" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Similar to any other Linux distribution, &lt;code class="verbatim"&gt;Guix&lt;/code&gt; comes with its own utility to search and install packages. performing a simple &lt;code class="verbatim"&gt;Guix&lt;/code&gt; search &lt;code class="verbatim"&gt;[PACKAGE_NAME]&lt;/code&gt; will list available packages that contain the query in their package name or description. Below is an example to try to search for &lt;code class="verbatim"&gt;firefox&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix search firefox&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;output:&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: firefox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: 128.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;outputs:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ out: everything&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systems: x86_64-linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dependencies: alsa-lib@1.2.4 autoconf@2.13 bzip2@1.0.8 cairo@1.18.0 clang@18.1.8 cups@2.4.2 dbus-glib@0.112 eudev@3.2.14 ffmpeg@6.1.1 freetype@2.13.0 gdk-pixbuf@2.42.10 glib@2.78.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ gtk+@2.24.33 gtk+@3.24.41 hunspell@1.7.0 icu4c@73.1 jemalloc@5.3.0 libcanberra@0.30 libevent@2.1.12 libffi@3.4.4 libgnome@2.32.1 libjpeg-turbo@2.1.4 libnotify@0.8.3 libva@2.19.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ libvpx@1.12.0 libxcomposite@0.4.5 libxft@2.3.4 libxinerama@1.1.4 libxscrnsaver@1.2.4 libxt@1.2.1 llvm@13.0.1 m4@1.4.19 mesa@24.0.4 mit-krb5@1.20 nasm@2.15.05 node@18.19.0 nspr@4.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ pango@1.50.14 perl@5.36.0 pipewire@1.0.3 pixman@0.42.2 pkg-config@0.29.2 pulseaudio@16.1 python@3.10.7 rust-cbindgen@0.26.0 rust@1.77.0 speech-dispatcher@0.11.5 sqlite@3.39.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ startup-notification@0.12 unzip@6.0 wasm32-wasi-clang-toolchain@15.0.7 which@2.21 yasm@1.3.0 zip@3.0 zlib@1.2.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location: nongnu/packages/mozilla.scm:544:2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;homepage: https://mozilla.org/firefox/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;license: MPL 2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;synopsis: Trademarkless version of Firefox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: Full-featured browser client built from Firefox &lt;span class="nb"&gt;source&lt;/span&gt; tree, without the official icon and the name &lt;span class="s2"&gt;&amp;#34;firefox&amp;#34;&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;relevance: &lt;span class="m"&gt;37&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: icecat&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: 115.13.0-guix1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;outputs:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ out: everything&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systems: x86_64-linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dependencies: alsa-lib@1.2.4 bzip2@1.0.8 cairo@1.18.0 clang@15.0.7 cups@2.4.2 dbus-glib@0.112 eudev@3.2.14 ffmpeg@5.1.4 font-dejavu@2.37 freetype@2.13.0 gdk-pixbuf@2.42.10 glib@2.78.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ gtk+@3.24.41 hunspell@1.7.0 icu4c@73.1 libcanberra@0.30 libevent@2.1.12 libffi@3.4.4 libgnome@2.32.1 libjpeg-turbo@2.1.4 libnotify@0.8.3 libpng-apng@1.6.39 libvpx@1.12.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ libxcomposite@0.4.5 libxft@2.3.4 libxinerama@1.1.4 libxscrnsaver@1.2.4 libxt@1.2.1 llvm@15.0.7 m4@1.4.19 mesa@24.0.4 mit-krb5@1.20 nasm@2.15.05 node@18.19.0 nspr@4.35 pango@1.50.14&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ pciutils@3.8.0 perl@5.36.0 pixman@0.42.2 pkg-config@0.29.2 pulseaudio@16.1 python-wrapper@3.10.7 rust-cbindgen@0.26.0 rust@1.75.0 shared-mime-info@2.3 sqlite@3.39.3 unzip@6.0 which@2.21&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ yasm@1.3.0 zip@3.0 zlib@1.2.13&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location: gnu/packages/gnuzilla.scm:2001:4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;homepage: https://www.gnu.org/software/gnuzilla/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;license: MPL 2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;synopsis: Entirely free browser derived from Mozilla Firefox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: IceCat is the GNU version of the Firefox browser. It is entirely free software, which does not recommend non-free plugins and addons. It also features built-in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ privacy-protecting features. This package also includes the &lt;span class="sb"&gt;`&lt;/span&gt;geckodriver&lt;span class="err"&gt;&amp;#39;&lt;/span&gt; command, which can be useful &lt;span class="k"&gt;for&lt;/span&gt; automated web testing.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;relevance: &lt;span class="m"&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Let&amp;#39;s try to analyze the output, you will most likely see so many packages. The exciting part here is that if you don&amp;#39;t configure the &lt;code class="verbatim"&gt;Nonguix&lt;/code&gt; channel, you will not see &lt;code class="verbatim"&gt;firefox&lt;/code&gt; listed as it has some trademark on its arts. However, we will see &lt;code class="verbatim"&gt;ictcat&lt;/code&gt; which is described as the GNU version of &lt;code class="verbatim"&gt;firefox&lt;/code&gt;. We can also see the &lt;code class="verbatim"&gt;location&lt;/code&gt; of the package which we can use to import the package module into our configuration.&lt;/p&gt;&#10;&lt;p&gt;&#10;We can also minimize the output to get only the information we are interested in&#10;Note: there is an easier way to perform this task using &lt;code class="verbatim"&gt;recsel&lt;/code&gt; but it&amp;#39;s not installed by default.&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix search firefox &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s2"&gt;&amp;#34;^(name|version|location)&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/location:/a \\n&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;output:&lt;/p&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: firefox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: 128.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location: nongnu/packages/mozilla.scm:544:2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: icecat&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: 115.13.0-guix1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;location: gnu/packages/gnuzilla.scm:2001:4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Now we can quickly identify the name of the package, available version, and the location of the package definition and even the line in which it&amp;#39;s defined in the module.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-19" class="outline-3"&gt;&#10;&lt;h3 id="headline-19"&gt;&#10;Installing a package&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-19" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;To install &lt;code class="verbatim"&gt;firefox&lt;/code&gt;, we will declare it in our home configuration since a browser is typically a user level program (doesn&amp;#39;t have to be available to all users, they can install it if they desire).&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Identify your target package name and location&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;In our case, target is &lt;code class="verbatim"&gt;firefox&lt;/code&gt;, location is &lt;code class="verbatim"&gt;nongnu/packages/mozilla.scm&lt;/code&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Declare the module in your &lt;code class="verbatim"&gt;home&lt;/code&gt; configuration (&lt;code class="verbatim"&gt;system&lt;/code&gt; configuration if you want system level) by adding a new import to &lt;code class="verbatim"&gt;use-modules&lt;/code&gt;. This import should match the location with slashes replaced by spaces and without the extension &lt;code class="verbatim"&gt;.scm&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;code class="verbatim"&gt;nongnu/packages/mozilla.scm&lt;/code&gt; &lt;code class="verbatim"&gt;&amp;gt; =nongnu packages mozilla&lt;/code&gt;&lt;/p&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;use-modules&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;home&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt; &lt;span class="nv"&gt;shells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;services&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;gnu&lt;/span&gt; &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="nv"&gt;admin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;guix&lt;/span&gt; &lt;span class="nv"&gt;gexp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9; &lt;span class="c1"&gt;;; ensure that the paranthesis are closed and your definition is inside&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nongnu&lt;/span&gt; &lt;span class="nv"&gt;packages&lt;/span&gt; &lt;span class="nv"&gt;mozilla&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Add the package name to the list of packages&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-scheme"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-scheme" data-lang="scheme"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list &lt;/span&gt;&lt;span class="nv"&gt;htop&lt;/span&gt; &lt;span class="nv"&gt;firefox&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Save the file and apply your home configuration:&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="src src-sh"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;guix home reconfigure ~/.config/guix/home.scm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;Note: Bare in mind that installing packages from the &lt;code class="verbatim"&gt;Guix&lt;/code&gt; utility is as simple as &lt;code class="verbatim"&gt;guix install htop&lt;/code&gt;, but this is not very declarative, and even though there are ways to extract installed packages, in my opinion, it&amp;#39;s best to declare them in your configuration and then apply them. However, one might want to try packages first with &lt;code class="verbatim"&gt;guix install [PACKAGE_NAME]&lt;/code&gt; and then see if they would like to keep it. Without this package name specified in your system or home configuration file, next system or home &lt;code class="verbatim"&gt;reconfigure&lt;/code&gt; will uninstall these packages.&lt;/p&gt;&#10;&lt;p&gt;&#10;Note: sometimes you will need to logout from your account/shell and login again for environment variables to be updated, before you assume that the package wasn&amp;#39;t installed, try to reboot or logout.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-20" class="outline-3"&gt;&#10;&lt;h3 id="headline-20"&gt;&#10;Useful Resources&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-20" class="outline-text-3"&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://packages.guix.gnu.org/"&gt;Packages - Guix Website&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://guix.gnu.org/manual/en/html_node/Package-Management.html"&gt;Package Management - Guix Manual&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Root Genesis Now Available on Itch.io</title><link>https://www.ozbem.com/posts/games/root-genesis/itchio-page-available/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/root-genesis/itchio-page-available/</guid><description>&lt;p&gt;If you&amp;rsquo;re a fan of gritty cyberpunk aesthetics, hacking simulators, or incremental idle games that actually keep you engaged, I’ve got a brand-new release you need to check out today.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;What&amp;rsquo;s it all about?&#10; &lt;div id="whats-it-all-about" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#whats-it-all-about" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;figure&gt;&lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="Build Your Empire"&#10; src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/3.gif"&#10; &gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;You play as an underground hacker trying to systematically dismantle a shadowy elite’s control network. While it&amp;rsquo;s an idle game at its core, it brings a really satisfying, interactive terminal vibe to the genre.&#10;The game blends sci-fi, mild horror, and deep conspiracy elements brilliantly. As you infect the control grid and build your digital empire, you actually uncover the dark secrets hidden by elite bloodlines.&lt;/p&gt;&#10;&lt;p&gt;If you want to live out your ultimate keyboard-warrior, cyberpunk fantasy and expose some virtual elites, head over to the game page and give it a try.&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/" &gt;You can check more details here&lt;/a&gt;&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;MORE SCREENSHOTS&#10; &lt;div id="more-screenshots" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#more-screenshots" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10; &#10; &#10; &#10; &#10; &lt;div class="width-patch"&gt;&lt;/div&gt;&#10;&lt;div id="gallery-5f3dc1bb51363748511b0bdef417b441" class="gallery"&gt;&#10; &#10; &lt;img src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/screenshot-2.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/screenshot-1.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/screenshot-3.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/screenshot-4.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/screenshots/screenshot-5.png" class="grid-w33" /&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Play it right now!&#10; &lt;div id="play-it-right-now" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#play-it-right-now" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Check it out on your web browser, no need for download&lt;/p&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/4414040?bg_color=0d1015&amp;amp;fg_color=62bfde&amp;amp;link_color=a6da95&amp;amp;border_color=3c3f44" width="100%" height="167"&gt;&lt;a href="https://ozbem.itch.io/root-genesis"&gt;Root.Genesis by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;</description></item><item><title>What is Root Genesis?</title><link>https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/root-genesis/what-is-root-genesis/</guid><description>&lt;p&gt;&lt;em&gt;The elites think their network is untouchable. Prove them wrong.&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ROOT.GENESIS&lt;/em&gt; is a cyberpunk idle game where you hack a shadowy elite&amp;rsquo;s control network and expose the conspiracies they hide.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;BUILD YOUR EMPIRE&#10; &lt;div id="build-your-empire" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#build-your-empire" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Type commands and deploy hacking tools to pwn nodes. Every key you press chips away at the elite&amp;rsquo;s firewall.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="Build Your Empire"&#10; src="./screenshots/1.gif"&#10; &gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;COMPLETE CONTRACTS&#10; &lt;div id="complete-contracts" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#complete-contracts" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Deploy tools to complete contracts on the dark web and earn nodes in exchange. Each tool offers a unique contract minigame or upgrade to your workflow.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="Complete Contracts"&#10; src="./screenshots/2.gif"&#10; &gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;UNCOVER THE CONSPIRACY&#10; &lt;div id="uncover-the-conspiracy" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#uncover-the-conspiracy" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Discover the secrets hidden by the elite bloodline families. Infect their control grid and expose what lies beneath the surface.&lt;/p&gt;&#10;&lt;p&gt;&lt;figure&gt;&lt;img&#10; class="my-0 rounded-md"&#10; loading="lazy"&#10; decoding="async"&#10; fetchpriority="low"&#10; alt="Uncover the Conspiracy"&#10; src="./screenshots/3.gif"&#10; &gt;&lt;/figure&gt;&#10;&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;MORE SCREENSHOTS&#10; &lt;div id="more-screenshots" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#more-screenshots" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10; &#10; &#10; &#10; &#10; &lt;div class="width-patch"&gt;&lt;/div&gt;&#10;&lt;div id="gallery-27e2c514447d392f469b95366dc0d094" class="gallery"&gt;&#10; &#10; &lt;img src="./screenshots/screenshot-2.png" class="grid-w33" /&gt;&#10; &lt;img src="./screenshots/screenshot-1.png" class="grid-w33" /&gt;&#10; &lt;img src="./screenshots/screenshot-3.png" class="grid-w33" /&gt;&#10; &lt;img src="./screenshots/screenshot-4.png" class="grid-w33" /&gt;&#10; &lt;img src="./screenshots/screenshot-5.png" class="grid-w33" /&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;&lt;em&gt;Disclaimer&lt;/em&gt;: Videos displayed in the game are AI-generated. All information presented is a work of fiction and may or may not reflect reality.&lt;/p&gt;&#10;&lt;p&gt;Wishlist the game on STEAM to stay updated!&lt;/p&gt;&#10;&lt;iframe src="https://store.steampowered.com/widget/4563000/" frameborder="0" width="100%" height="190"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;You can also check out our itch.io page which has a web demo available&lt;/p&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/4414040?bg_color=0d1015&amp;amp;fg_color=62bfde&amp;amp;link_color=a6da95&amp;amp;border_color=3c3f44" width="100%" height="167"&gt;&lt;a href="https://ozbem.itch.io/root-genesis"&gt;Root.Genesis by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;</description></item><item><title>Spooky Night Is Out Now!</title><link>https://www.ozbem.com/posts/games/spooky-night/released/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/released/</guid><description>&lt;p&gt;It’s finally here, the night you’ve all been waiting for!&#10;We’re thrilled to announce that &lt;em&gt;Spooky Night&lt;/em&gt; is officially &lt;strong&gt;released&lt;/strong&gt; and ready for you to play.&lt;/p&gt;&#10;&lt;p&gt;After months of development, testing, feedback, and community support, the gates to our haunted village are open. Whether you’ve been with us since the early alpha or are just discovering the game now, we can’t wait for you to experience the chaos, mystery, and laughter that make &lt;em&gt;Spooky Night&lt;/em&gt; what it is.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;What Is &lt;em&gt;Spooky Night&lt;/em&gt;?&#10; &lt;div id="what-is-spooky-night" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-spooky-night" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;Spooky Night&lt;/em&gt; is an online &lt;strong&gt;social deduction game&lt;/strong&gt; of teamwork, bluffing, and betrayal.&lt;br&gt;&#10;Villagers must uncover the Hunters (formerly known as werewolves) hiding among them, while the Hunters try to eliminate the innocent one by one.&lt;/p&gt;&#10;&lt;p&gt;Talk, deceive, vote, and survive. Every night brings new twists, and no two games are ever the same.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Play Now on Steam and Itch.io&#10; &lt;div id="play-now-on-steam-and-itchio" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#play-now-on-steam-and-itchio" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;You can jump into the full release today on both platforms:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://store.steampowered.com/app/3443650/Spooky_Night" target="_blank" rel="noreferrer"&gt;Play on Steam&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://ozbem.itch.io/spooky-night" target="_blank" rel="noreferrer"&gt;Play on Itch.io&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;iframe src="https://store.steampowered.com/widget/3443650/" frameborder="0" width="100%" height="190"&gt;&lt;/iframe&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/3198388?border_width=0&amp;amp;bg_color=1d0923&amp;amp;fg_color=ffffff&amp;amp;link_color=206d2c&amp;amp;border_color=ffffff" width="100%" height="190"&gt;&lt;a href="https://ozbem.itch.io/spooky-night"&gt;Spooky Night by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;&lt;p&gt;Both versions offer &lt;strong&gt;cross-platform multiplayer&lt;/strong&gt;, so you can play with your friends no matter where they’re haunting from.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;What’s Included in the Release&#10; &lt;div id="whats-included-in-the-release" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#whats-included-in-the-release" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;20+ &lt;strong&gt;Unique Roles&lt;/strong&gt; with distinct abilities and strategies&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Multiplayer lobbies&lt;/strong&gt; (Casual &amp;amp; Private) for up to 16 players&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Match rewards system&lt;/strong&gt; with free skins and gold&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Character customization&lt;/strong&gt; with hundreds of unlockable cosmetics&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Support for 11 languages&lt;/strong&gt;, making the experience accessible worldwide&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;No pay-to-win mechanics&lt;/strong&gt;, everyone plays on equal ground&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Fair and Transparent Model&#10; &lt;div id="fair-and-transparent-model" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#fair-and-transparent-model" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;Spooky Night&lt;/em&gt; follows a &lt;strong&gt;completely free-to-play&lt;/strong&gt; model.&lt;br&gt;&#10;Everyone gets full access to all features, with optional VIP tiers for players who want to support development and earn extra cosmetics.&lt;br&gt;&#10;No subscriptions, no hidden fees, and no microtransactions.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Join the Community&#10; &lt;div id="join-the-community" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#join-the-community" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Our players are the heart of this project, and your feedback has shaped every part of the game.&lt;br&gt;&#10;Join the conversation, share your experiences, and help us make &lt;em&gt;Spooky Night&lt;/em&gt; even better:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://discord.gg/HH8RFT68DZ" target="_blank" rel="noreferrer"&gt;Join our Discord&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://x.com/OzbemSoftware" target="_blank" rel="noreferrer"&gt;Follow us on X (Twitter)&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;Contact us: &lt;a href="mailto:ozbem.software@gmail.com" &gt;ozbem.software@gmail.com&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Thank You&#10; &lt;div id="thank-you" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#thank-you" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;From the entire development team: &lt;strong&gt;thank you&lt;/strong&gt;.&#10;Your enthusiasm, ideas, and patience have brought &lt;em&gt;Spooky Night&lt;/em&gt; to life.&#10;This release is just the beginning, we have many updates, features, and surprises planned for the future.&lt;/p&gt;&#10;&lt;p&gt;So gather your friends, light your lanterns, and step into the shadows.&lt;/p&gt;&#10;&lt;p&gt;The night has begun&amp;hellip; and no one is safe.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ebeem&lt;/em&gt;&lt;/p&gt;&#10;</description></item><item><title>The Road Ahead for Spooky Night</title><link>https://www.ozbem.com/posts/games/spooky-night/roadmap/</link><pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/roadmap/</guid><description>&lt;p&gt;Greetings, mortals!&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Spooky Night Vision&#10; &lt;div id="spooky-night-vision" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#spooky-night-vision" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;Spooky Night&lt;/em&gt; has always been about bringing players together for a fun, strategic, and engaging experience. From the very beginning, we set out to create a game that belongs to the community no pay-to-win mechanics, no predatory monetization, just a game built with and for its players.&lt;/p&gt;&#10;&lt;p&gt;Our vision is simple: to continuously evolve &lt;em&gt;Spooky Night&lt;/em&gt; based on player feedback, community contributions, and fair design principles. This roadmap outlines our plans and how you can be a part of shaping the game&amp;rsquo;s future.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;The Roadmap&#10; &lt;div id="the-roadmap" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-roadmap" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&lt;h3 class="relative group"&gt;&lt;strong&gt;Phase 1 (Q1 - Q2 2025)&lt;/strong&gt;&#10; &lt;div id="phase-1-q1---q2-2025" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#phase-1-q1---q2-2025" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;Early Access &amp;amp; Core Gameplay (Q1 - Q2 2025)&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Steam Next Fest &amp;amp; Public Playtesting&lt;/strong&gt; – We invite players to test the game, provide feedback, and help us fine-tune the balance and mechanics.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Community Server Expansion&lt;/strong&gt; – Our Discord server will be the central hub for discussions, suggestions, and community engagement.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Role &amp;amp; Balance Tweaks&lt;/strong&gt; – Based on player feedback, we&amp;rsquo;ll refine roles, abilities, and game mechanics to ensure a fair and exciting experience.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Content Creators &amp;amp; Events&lt;/strong&gt; – We plan to collaborate with content creators and host events to spread the word about &lt;em&gt;Spooky Night&lt;/em&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Game Localization&lt;/strong&gt; – The game will be localized into 11 languages, with the goal of making &lt;em&gt;Spooky Night&lt;/em&gt; accessible to a global audience.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Match Rewards System&lt;/strong&gt; – Post-match rewards system will allow players to earn cosmetic items by simply playing the game. This will be part of our free-to-play progression model.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Character Customization &amp;amp; Skins&lt;/strong&gt; – Players will be able to personalize their characters with various skins and outfits. More options will be added over time.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;20+ Unique Roles&lt;/strong&gt; – Early access will launch with over 20 roles, each offering different strategic opportunities. These roles will continue to evolve as we test and refine the meta.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Multiplayer Lobbies (Casual &amp;amp; Private)&lt;/strong&gt; – Both casual matchmaking and private lobbies will be supported. We&amp;rsquo;re working on improving stability, UI, and features to make hosting and joining games as smooth as possible.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h3 class="relative group"&gt;&lt;strong&gt;Phase 2 (Q3 - Q4 2025)&lt;/strong&gt;&#10; &lt;div id="phase-2-q3---q4-2025" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#phase-2-q3---q4-2025" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;Expanding the Game (Q3 - Q4 2025)&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;New Roles &amp;amp; Abilities&lt;/strong&gt; – Inspired by community suggestions, we&amp;rsquo;ll introduce fresh roles to add depth and variety to the gameplay.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Custom Lobbies &amp;amp; Mods&lt;/strong&gt; – Players will gain the ability to create and customize their own game modes and rules.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;More Skins &amp;amp; Cosmetics (All Free, No Paywall!)&lt;/strong&gt; – Unlockable purely through gameplay, with no real-money transactions.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Localization &amp;amp; Accessibility&lt;/strong&gt; – Expanding &lt;em&gt;Spooky Night&lt;/em&gt; to a global audience with additional language support and accessibility features.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h3 class="relative group"&gt;&lt;strong&gt;Phase 3 (Beyond 2025)&lt;/strong&gt;&#10; &lt;div id="phase-3-beyond-2025" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#phase-3-beyond-2025" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;The Future of Spooky Night (Beyond 2025)&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;New Game Modes&lt;/strong&gt; – Exploring fresh ways to play beyond the core experience.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Community-Driven Events &amp;amp; Tournaments&lt;/strong&gt; – Competitive and casual events to keep the game engaging.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Open Contribution Model&lt;/strong&gt; – We aim to allow community members to contribute directly to the game’s development, including code, art, and features.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;And More&amp;hellip;&lt;/strong&gt; – The game&amp;rsquo;s future will be shaped by player feedback and innovation.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;We are committed to keeping &lt;em&gt;Spooky Night&lt;/em&gt; a game that is &lt;strong&gt;fair, fun, and community-driven&lt;/strong&gt;. There will be no microtransactions, no pay-to-win mechanics only skill, strategy, and social deduction.&lt;/p&gt;&#10;&lt;p&gt;This game is shaped by you, the players. Your ideas, your feedback, and your creativity are what will define &lt;em&gt;Spooky Night’s&lt;/em&gt; future.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;&lt;strong&gt;Join the Community&lt;/strong&gt;&#10; &lt;div id="join-the-community" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#join-the-community" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://store.steampowered.com/app/3443650" target="_blank" rel="noreferrer"&gt;Wishlist Spooky Night on Steam&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://discord.gg/HH8RFT68DZ" target="_blank" rel="noreferrer"&gt;Join our Discord&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://twitter.com/ozbemsoftware" target="_blank" rel="noreferrer"&gt;Follow us on Twitter&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Let&amp;rsquo;s build something great together!&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;strong&gt;The Spooky Night Development Team&lt;/strong&gt;&lt;/p&gt;&#10;</description></item><item><title>What is Spooky Night?</title><link>https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/</link><pubDate>Mon, 24 Feb 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/</guid><description>&lt;p&gt;Greetings, mortals!&lt;/p&gt;&#10;&lt;p&gt;Welcome to the eerie world of &lt;em&gt;Spooky Night&lt;/em&gt;, an online social deduction game where teamwork and betrayal intertwine. Your mission: unmask the werewolves lurking among you before they decimate the village. Here&amp;rsquo;s a quick guide to help you navigate the shadows and survive the night.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Trailer &amp;amp; Gameplay&#10; &lt;div id="trailer--gameplay" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#trailer--gameplay" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;▶ &lt;strong&gt;Watch the Official Trailer:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;lite-youtube videoid="i6ovTDjimoY" playlabel="i6ovTDjimoY" params=""&gt;&lt;/lite-youtube&gt;&#10;&#10;&lt;hr&gt;&#10;&lt;p&gt;You can checkout out our &lt;a href="https://www.ozbem.com/posts/games/spooky-night/presskit/" title="presskit"&gt;presskit&lt;/a&gt;&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;How to Play&#10; &lt;div id="how-to-play" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-to-play" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Day Phase&lt;/strong&gt;: Engage in discussions with fellow players to identify the werewolves. Vote to eliminate the most suspicious individual.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="./screenshots/chat.gif" loading="lazy" alt="an animated gif of villagers accusing each others in the social deduction game spooky night" /&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;End of Day&lt;/strong&gt;: The player receiving the majority of votes is eliminated, revealing their true role.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="./screenshots/eliminate.gif" loading="lazy" alt="an animated gif showing a villager being struck by lightning in the social deduction game spooky night" /&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;Night Phase&lt;/strong&gt;: Under the cover of darkness, werewolves choose their victims, while villagers and other roles secretly employ their unique abilities to protect, investigate, or take decisive actions.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="./screenshots/wolves.gif" loading="lazy" alt="an animated gif showing a wolf attacking a villager at night in the social deduction game spooky night" /&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;&lt;strong&gt;Win Conditions&lt;/strong&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Villagers&lt;/strong&gt;: Prevail by eliminating all werewolves.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Werewolves&lt;/strong&gt;: Conquer when they equal or outnumber the remaining villagers.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="./screenshots/intro.gif" loading="lazy" alt="an animated gif showing grim reaper fate in the social deduction game spooky night striking with his purple thunder" /&gt;&#10;&#10;&lt;h2 class="relative group"&gt;MORE SCREENSHOTS&#10; &lt;div id="more-screenshots" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#more-screenshots" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&#10;&#10; &#10; &#10; &#10; &#10; &lt;div class="width-patch"&gt;&lt;/div&gt;&#10;&lt;div id="gallery-40d2db390c5491363072c8ef76aae0f0" class="gallery"&gt;&#10; &#10; &lt;img src="https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/screenshots/1-1920x1080.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/screenshots/2-1920x1080.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/screenshots/3-1920x1080.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/screenshots/4-1920x1080.png" class="grid-w33" /&gt;&#10; &lt;img src="https://www.ozbem.com/posts/games/spooky-night/what-is-spooky-night/screenshots/5-1920x1080.png" class="grid-w33" /&gt;&#10;&lt;/div&gt;&#10;&#10;&#10;&lt;h2 class="relative group"&gt;Why You&amp;rsquo;ll Love &lt;em&gt;Spooky Night&lt;/em&gt;&#10; &lt;div id="why-youll-love-spooky-night" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-youll-love-spooky-night" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Each session offers a fresh and unpredictable experience. With a diverse array of roles and limitless strategic possibilities, no two games are alike. Forge alliances, sow seeds of doubt, and immerse yourself in the thrill of deception.&lt;/p&gt;&#10;&lt;p&gt;Best of all, &lt;em&gt;Spooky Night&lt;/em&gt; is entirely free to play! Earn rewards after every match and unlock a plethora of character customizations. Opting to purchase the game accelerates your access to skins and expands your inventory.&lt;/p&gt;&#10;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: As the game is in its early stages, the player base is limited. For the best experience, gather a group of at least 8 friends to join a lobby (minimum 4 players required). Casual matchmaking necessitates 10 players.&lt;/p&gt;&#10;&lt;/blockquote&gt;&lt;p&gt;Stay vigilant, trust sparingly, and may you survive the &lt;em&gt;Spooky Night&lt;/em&gt;.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ebeem&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Wishlist the game on STEAM to stay updated!&lt;/p&gt;&#10;&lt;iframe src="https://store.steampowered.com/widget/3443650/" frameborder="0" width="100%" height="190"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;You can also check out our itch.io page&lt;/p&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/3198388?border_width=0&amp;amp;bg_color=1d0923&amp;amp;fg_color=ffffff&amp;amp;link_color=206d2c&amp;amp;border_color=ffffff" width="100%" height="190"&gt;&lt;a href="https://ozbem.itch.io/spooky-night"&gt;Spooky Night by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;</description></item><item><title>Spooky Night Joins Steam Next Fest</title><link>https://www.ozbem.com/posts/games/spooky-night/steam-next-fest-announcement/</link><pubDate>Fri, 21 Feb 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/steam-next-fest-announcement/</guid><description>&lt;p&gt;Greetings, mortals!&lt;/p&gt;&#10;&lt;p&gt;Prepare yourselves for an otherworldly adventure as &lt;em&gt;Spooky Night&lt;/em&gt; descends upon the &lt;a href="https://store.steampowered.com/sale/nextfest" target="_blank" rel="noreferrer"&gt;Steam Next Fest&lt;/a&gt; from &lt;strong&gt;February 24 to March 3, 2025&lt;/strong&gt;. This week-long celebration offers you a chance to delve into the eerie realms we&amp;rsquo;ve conjured, all from the (relative) safety of your own abode.&lt;/p&gt;&#10;&lt;p&gt;Mark your calendars, summon your courage, and prepare to face the unknown. The witching hour approaches, and &lt;em&gt;Spooky Night&lt;/em&gt; awaits your presence.&lt;/p&gt;&#10;&lt;p&gt;Stay spooky, my friends.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ebeem&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;Wishlist the game on STEAM to stay updated!&lt;/p&gt;&#10;&lt;iframe src="https://store.steampowered.com/widget/3443650/" frameborder="0" width="100%" height="190"&gt;&lt;/iframe&gt;&#10;&lt;p&gt;You can also check out our itch.io page&lt;/p&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/3198388?border_width=0&amp;amp;bg_color=1d0923&amp;amp;fg_color=ffffff&amp;amp;link_color=206d2c&amp;amp;border_color=ffffff" width="100%" height="190"&gt;&lt;a href="https://ozbem.itch.io/spooky-night"&gt;Spooky Night by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;</description></item><item><title>Spooky Night Press Kit</title><link>https://www.ozbem.com/posts/games/spooky-night/presskit/</link><pubDate>Sun, 26 Jan 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/presskit/</guid><description>&#10;&lt;h1 class="relative group"&gt;🎃 Spooky Night - Press Kit 🎃&#10; &lt;div id="-spooky-night---press-kit-" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#-spooky-night---press-kit-" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;Welcome to the official press kit for &lt;strong&gt;Spooky Night&lt;/strong&gt;, the ultimate game of deception and doom! Here, you&amp;rsquo;ll find all the assets, descriptions, and details you need for articles, videos, and promotions.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Game Overview&#10; &lt;div id="game-overview" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#game-overview" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Title:&lt;/strong&gt; Spooky Night&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Developer:&lt;/strong&gt; Ozbem&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Publisher:&lt;/strong&gt; Ozbem&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Release Date:&lt;/strong&gt; Demo released, full game Q2, 2025&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Platforms:&lt;/strong&gt; PC (Windows, Linux, OSX), IOS, Android&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Price:&lt;/strong&gt; Free to play&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Genre:&lt;/strong&gt; Social Deduction&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Players:&lt;/strong&gt; 4-16 players per match&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Website:&lt;/strong&gt; ozbem.com&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Steam Page:&lt;/strong&gt; &lt;a href="https://store.steampowered.com/app/3443650" target="_blank" rel="noreferrer"&gt;https://store.steampowered.com/app/3443650&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h3 class="relative group"&gt;&lt;strong&gt;Short Description&lt;/strong&gt;&#10; &lt;div id="short-description" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#short-description" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Spooky Night&lt;/strong&gt; is an online &lt;strong&gt;social deduction&lt;/strong&gt; game of teamwork and betrayal! Uncover the &lt;strong&gt;werewolves among you&lt;/strong&gt; before they wipe out the village. During the day, chat, deceive, and vote to eliminate a suspect. At night, use your role’s abilities to gather insights or strike. Can you survive?&lt;/p&gt;&#10;&#10;&lt;h3 class="relative group"&gt;&lt;strong&gt;Long Description&lt;/strong&gt;&#10; &lt;div id="long-description" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#long-description" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Spooky Night&lt;/strong&gt; is an online multiplayer social deduction game where deception, teamwork, and strategy determine your survival. Set in a haunted village, players are assigned secret roles: either as innocent villagers or as devious werewolves lurking in the shadows. Your mission? Unmask the threats before they eliminate you.&lt;/p&gt;&#10;&#10;&lt;h4 class="relative group"&gt;The Day Phase&#10; &lt;div id="the-day-phase" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-day-phase" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;p&gt;Each round begins with a tense day phase, where players communicate, strategize, and attempt to uncover the truth. Who can you trust? Who is lying? Engage in discussions, defend yourself from accusations, and cast your vote to decide who will face Fate’s judgment. The Grim Reaper watches over the village, ready to strike down the chosen suspect with a bolt of purple lightning. But did the villagers make the right call? Or did they just eliminate an innocent soul?&lt;/p&gt;&#10;&#10;&lt;h4 class="relative group"&gt;The Night Phase&#10; &lt;div id="the-night-phase" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-night-phase" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;p&gt;As the night falls, the village plunges into eerie silence. This is when players use their role’s abilities: gathering intelligence, forming secret alliances, or launching deadly attacks. Werewolves prowl in the darkness, choosing their next victim. Meanwhile, protective roles like the Knight can shield players, and investigative roles like the Seer can unveil hidden identities. The right move can change the fate of the village, but one wrong choice could mean your doom.&lt;/p&gt;&#10;&#10;&lt;h4 class="relative group"&gt;Infinite Strategies&#10; &lt;div id="infinite-strategies" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#infinite-strategies" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h4&gt;&#10;&lt;p&gt;Beyond villagers and werewolves, Spooky Night introduces a vast array of unique roles with special abilities that keep every match unpredictable. Will you be a Sentry, tracking footsteps to catch a killer? A Mayor, wielding extra voting power? Or a Trickster, throwing chaos into every decision? With multiple roles and randomized setups, no two games are ever the same.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Key Features&#10; &lt;div id="key-features" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#key-features" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Social Deduction Chaos&lt;/strong&gt; – Play mind games with friends (or enemies) in this high-stakes survival match.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Unique Role Abilities&lt;/strong&gt; – Each role has &lt;strong&gt;game-changing powers&lt;/strong&gt; that add depth to every match.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Cartoonish Spooky Aesthetic&lt;/strong&gt; – A &lt;strong&gt;Halloween-themed 2D world&lt;/strong&gt; filled with eerie yet funny characters.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Vote &amp;amp; Execute&lt;/strong&gt; – Villagers &lt;strong&gt;vote during the day&lt;/strong&gt;, and Fate (the Grim Reaper) &lt;strong&gt;strikes with thunder at night&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Replayability&lt;/strong&gt; – Each match is different, with a &lt;strong&gt;large variety of roles &amp;amp; random interactions&lt;/strong&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Trailer &amp;amp; Gameplay&#10; &lt;div id="trailer--gameplay" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#trailer--gameplay" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;▶ &lt;strong&gt;Watch the Official Trailer:&lt;/strong&gt;&lt;/p&gt;&#10; &lt;iframe &#10; src="https://youtube.com/embed/i6ovTDjimoY?si=eyc6sLkmma_ft2kK"&#10; title="Spooky Night Trailer: The Ultimate Game of Deception &amp; Doom!"&#10; frameborder="0"&#10; allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"&#10; referrerpolicy="strict-origin-when-cross-origin"&#10; allowfullscreen&#10; style="width: 100%; aspect-ratio: 16 / 9;"&gt;&#10; &lt;/iframe&gt;&#10;&lt;!-- **Gameplay Footage:** --&gt;&#10;&lt;!-- - Download high-quality gameplay clips: [PLACEHOLDER_GAMEPLAY_VIDEO_LINK] --&gt;&#10;&lt;!-- - Stream-safe soundtrack: [PLACEHOLDER_SOUNDTRACK_LINK] --&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Logos &amp;amp; Branding&#10; &lt;div id="logos--branding" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#logos--branding" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Download Official Assets:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Game Logo (PNG)&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Social Media Banners&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;High-Resolution Key Art&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;a&#10; class="!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700"&#10; href="presskit-assets.zip"&#10; target="_self"&#10; &#10; role="button"&gt;&#10; &#10;Download&#10;&#10;&lt;/a&gt;&#10;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Screenshots &amp;amp; GIFs&#10; &lt;div id="screenshots--gifs" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#screenshots--gifs" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;High-quality in-game screenshots:&lt;/strong&gt;&lt;br&gt;&#10;&lt;img loading="lazy" src="screenshots/1-1920x1080.png" class="grid-w100" alt="A screenshot of spooky night, a werewolf one night based game. The screenshot shows villagers accusing each other in the chat during the day phase" class="screenshot" data-screenshot_id="19846522"&gt;&#10;&lt;img loading="lazy" src="screenshots/2-1920x1080.png" class="grid-w100" alt="A screenshot of spooky night, a werewolf one night based game. The screenshot shows villagers voting each other during the day phase" class="screenshot" data-screenshot_id="19846522"&gt;&#10;&lt;img loading="lazy" src="screenshots/3-1920x1080.png" class="grid-w100" alt="A screenshot of spooky night, a werewolf one night based game. The screenshot shows a villager struck by fate the grim reaper's purple thunder/lightning" class="screenshot" data-screenshot_id="19846522"&gt;&#10;&lt;img loading="lazy" src="screenshots/4-1920x1080.png" class="grid-w100" alt="A screenshot of spooky night, a werewolf one night based game. The screenshot shows a villager in their house at night" class="screenshot" data-screenshot_id="19846522"&gt;&#10;&lt;img loading="lazy" src="screenshots/5-1920x1080.png" class="grid-w100" alt="A screenshot of spooky night, a werewolf one night based game. The screenshot shows the character customization of spooky night" class="screenshot" data-screenshot_id="19846522"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Short Clips:&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;video src="game-sample.mp4" class="grid-w100" controls="true"&gt;&lt;/video&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Game Quick Guide&#10; &lt;div id="game-quick-guide" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#game-quick-guide" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Day Phase&lt;/strong&gt;: Engage in discussions with fellow players to identify the werewolves. Vote to eliminate the most suspicious individual.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="chat.gif" loading="lazy" alt="an animated gif of villagers accusing each others in the social deduction game spooky night" /&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;&lt;strong&gt;End of Day&lt;/strong&gt;: The player receiving the majority of votes is eliminated, revealing their true role.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="eliminate.gif" loading="lazy" alt="an animated gif showing a villager being struck by lightning in the social deduction game spooky night" /&gt;&#10;&lt;ol start="3"&gt;&#10;&lt;li&gt;&lt;strong&gt;Night Phase&lt;/strong&gt;: Under the cover of darkness, werewolves choose their victims, while villagers and other roles secretly employ their unique abilities to protect, investigate, or take decisive actions.&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="wolves.gif" loading="lazy" alt="an animated gif showing a wolf attacking a villager at night in the social deduction game spooky night" /&gt;&#10;&lt;ol start="4"&gt;&#10;&lt;li&gt;&lt;strong&gt;Win Conditions&lt;/strong&gt;:&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Villagers&lt;/strong&gt;: Prevail by eliminating all werewolves.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Werewolves&lt;/strong&gt;: Conquer when they equal or outnumber the remaining villagers.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10; &lt;img loading="lazy" src="intro.gif" loading="lazy" alt="an animated gif showing grim reaper fate in the social deduction game spooky night striking with his purple thunder" /&gt;&#10;&lt;hr&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Contact &amp;amp; Social Media&#10; &lt;div id="contact--social-media" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#contact--social-media" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;For &lt;strong&gt;press inquiries, interviews, or review copies&lt;/strong&gt;, please contact:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:info@ozbem.com" &gt;info@ozbem.com&lt;/a&gt;&lt;br&gt;&#10;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://www.ozbem.com" target="_blank" rel="noreferrer"&gt;https://www.ozbem.com&lt;/a&gt;&lt;br&gt;&#10;&lt;strong&gt;Steam Page:&lt;/strong&gt; &lt;a href="https://store.steampowered.com/app/3443650/Spooky_Night/" target="_blank" rel="noreferrer"&gt;https://store.steampowered.com/app/3443650/Spooky_Night/&lt;/a&gt;&lt;br&gt;&#10;&lt;strong&gt;Twitter/X:&lt;/strong&gt; &lt;a href="https://x.com/OzbemSoftware" target="_blank" rel="noreferrer"&gt;https://x.com/OzbemSoftware&lt;/a&gt;&lt;br&gt;&#10;&lt;strong&gt;Discord:&lt;/strong&gt; &lt;a href="https://discord.gg/HH8RFT68DZ" target="_blank" rel="noreferrer"&gt;https://discord.gg/HH8RFT68DZ&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;strong&gt;Thank you for your interest in &lt;em&gt;Spooky Night&lt;/em&gt;!&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;The Spooky Night Development Team&lt;/strong&gt;&lt;/p&gt;&#10;</description></item><item><title>Spooky Night Now Available on Itch.io</title><link>https://www.ozbem.com/posts/games/spooky-night/itchio-page-available/</link><pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/games/spooky-night/itchio-page-available/</guid><description>&lt;p&gt;Greetings, mortals!&lt;/p&gt;&#10;&lt;p&gt;I bring you thrilling news from the shadowy realms: &lt;em&gt;Spooky Night&lt;/em&gt; has emerged from the depths and is now haunting &lt;a href="https://ozbem.itch.io/spooky-night" target="_blank" rel="noreferrer"&gt;Itch.io&lt;/a&gt;! This online social deduction game of teamwork and betrayal is ready for you to experience.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Play &lt;em&gt;Spooky Night&lt;/em&gt;!&#10; &lt;div id="play-spooky-night" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#play-spooky-night" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;In this eerie adventure, you&amp;rsquo;ll step into a haunted village where trust is scarce, and danger lurks in every shadow. Your objectives are clear:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Identify the Werewolves&lt;/strong&gt;: During the day, engage in discussions, deceive, and vote to eliminate those you suspect of lycanthropy.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Survive the Night&lt;/strong&gt;: As darkness falls, werewolves strike, and villagers must use their unique abilities to protect, gather clues, or take action.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Each round offers a fresh, unpredictable experience with a variety of unique roles and endless player strategies. No two games are ever the same. Build trust or shatter it as you navigate this treacherous landscape.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Why Itch.io?&#10; &lt;div id="why-itchio" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-itchio" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Free to Play&lt;/strong&gt;: Dive into the game without spending a dime. Earn rewards after every match and unlock a wide range of character customizations.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Early Access&lt;/strong&gt;: Be among the first to experience &lt;em&gt;Spooky Night&lt;/em&gt; and witness its evolution.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Community Engagement&lt;/strong&gt;: Join our growing community, share your experiences, and provide feedback to help shape the game&amp;rsquo;s future.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The game is currently in its early stages, and the number of players is limited. Gather your friends to join a lobby; the game requires at least 4 players but is most enjoyable with 8 or more. Casual game matchmaking requires 10 players.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;Join Us Today&#10; &lt;div id="join-us-today" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#join-us-today" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Ready to face the unknown? Download &lt;em&gt;Spooky Night&lt;/em&gt; now on &lt;a href="https://ozbem.itch.io/spooky-night" target="_blank" rel="noreferrer"&gt;Itch.io&lt;/a&gt; and step into the shadows.&lt;/p&gt;&#10;&lt;p&gt;Stay spooky, my friends.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ebeem&lt;/em&gt;&lt;/p&gt;&#10;&lt;iframe frameborder="0" src="https://itch.io/embed/3198388?border_width=0&amp;amp;bg_color=1d0923&amp;amp;fg_color=ffffff&amp;amp;link_color=206d2c&amp;amp;border_color=ffffff" width="100%" height="190"&gt;&lt;a href="https://ozbem.itch.io/spooky-night"&gt;Spooky Night by Ozbem&lt;/a&gt;&lt;/iframe&gt;&#10;</description></item><item><title>River Protocol &amp; Architecture</title><link>https://www.ozbem.com/posts/tech/river/protocol/</link><pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/river/protocol/</guid><description>&#10;&lt;p&gt;&#10;I’m currently studying &lt;code&gt;River&lt;/code&gt; in the hope of crafting a &lt;code&gt;guile&lt;/code&gt; scheme based window manager, &lt;code&gt;River&lt;/code&gt; uses a unique non-monolithic approach, unlike the &amp;#34;all-in-one&amp;#34; approach seen in many compositors, it splits the responsibilities of rendering and window management.&lt;/p&gt;&#10;&lt;p&gt;&#10;I am using this post as a living document to log my notes and findings as I study the &lt;code&gt;river-window-management-v1&lt;/code&gt; protocol. One done, it should be a great foundation for those who want to understand my window manager or write their own based on &lt;code&gt;River&lt;/code&gt;.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;interfaces&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;river_window_manager_v1&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Window management state influences the communication between the compositor&#10;and individual windows (e.g. xdg_toplevels). Window management state&#10;includes window dimensions, fullscreen state, keyboard focus, keyboard&#10;bindings, and more.Only one window management client may be active at a&#10;time. The compositor should use the unavailable event if necessary to&#10;enforce this.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-4"&gt;&#10;&lt;h4 id="headline-3"&gt;&#10;Requests&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-4"&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-5"&gt;&#10;&lt;h5 id="headline-4"&gt;&#10;(2) stop&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to stop/close&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing, wait for &lt;code&gt;finished&lt;/code&gt; event to proceed with killing the process&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-5"&gt;&#10;&lt;h5 id="headline-5"&gt;&#10;(4) destroy()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: should be called after the &lt;code&gt;finished&lt;/code&gt; event has been received.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: clear anything that&amp;#39;s still references and &lt;strong&gt;terminate&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-5"&gt;&#10;&lt;h5 id="headline-6"&gt;&#10;(6) manage_finish()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client has made all changes to window management state after&#10;receiving the &lt;code&gt;manage_start&lt;/code&gt; event&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing, don&amp;#39;t send any requests to change window management state&#10;unless you receive another &lt;code&gt;manage_start&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-5"&gt;&#10;&lt;h5 id="headline-7"&gt;&#10;(7) manage_dirty()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that a &lt;code&gt;manage_sequence&lt;/code&gt; events is needed to reflect&#10;some new state changes&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing, you will receive a &lt;code&gt;manage_start&lt;/code&gt; soon to make the changes&#10;as before&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-5"&gt;&#10;&lt;h5 id="headline-8"&gt;&#10;(9) render_finish()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client has made all changes to rendering state after receiving&#10;the &lt;code&gt;render_start&lt;/code&gt; event&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing, don&amp;#39;t send any requests to change render state unless you&#10;receive another &lt;code&gt;manage_start&lt;/code&gt; or &lt;code&gt;manage_render&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-9" class="outline-5"&gt;&#10;&lt;h5 id="headline-9"&gt;&#10;(15) get_shell_surface(surface: wl_surface) -&amp;gt; id: river_shell_surface_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-9" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to create a new shell surface and assign&#10;&lt;code&gt;river_shell_surface_v1&lt;/code&gt; role to provided &lt;code&gt;surface&lt;/code&gt;, it can be used to draw&#10;status bars, menus, tab bar, etc.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-10" class="outline-5"&gt;&#10;&lt;h5 id="headline-10"&gt;&#10;(16) exit_session()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-10" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to terminal the wayland session, this will close&#10;all clients and the compositor&lt;/p&gt;&#10;&lt;p&gt;&#10;task: Nothing&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-11" class="outline-4"&gt;&#10;&lt;h4 id="headline-11"&gt;&#10;Events&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-11" class="outline-text-4"&gt;&#10;&lt;div id="outline-container-headline-12" class="outline-5"&gt;&#10;&lt;h5 id="headline-12"&gt;&#10;(1) unavailable()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-12" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that window management is unavailable, most likely&#10;due to another window management client already running&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should clear everything in this case and &lt;strong&gt;terminate&lt;/strong&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-13" class="outline-5"&gt;&#10;&lt;h5 id="headline-13"&gt;&#10;(3) finished()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-13" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the server will send no longer events&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should clear everything in this case and send &lt;code&gt;destroy&lt;/code&gt;&#10;request&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-14" class="outline-5"&gt;&#10;&lt;h5 id="headline-14"&gt;&#10;(5) manage_start()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-14" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the server has sent events indicating new state&#10;changes&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should send all requesting modfying the window management&#10;state then make a &lt;code&gt;manage_finish&lt;/code&gt; request&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-15" class="outline-5"&gt;&#10;&lt;h5 id="headline-15"&gt;&#10;(8) render_start()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-15" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the server has sent events indicating window&#10;positions and dimensions changes in the interface &lt;code&gt;river_window_v1&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should send all requesting modfying the rendering state&#10;then make a &lt;code&gt;render_finish&lt;/code&gt; request&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-16" class="outline-5"&gt;&#10;&lt;h5 id="headline-16"&gt;&#10;(10) session_locked()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-16" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the session has been locked&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should most likely may restrict the available keybindings&#10;or call a lock screen application&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-17" class="outline-5"&gt;&#10;&lt;h5 id="headline-17"&gt;&#10;(11) session_unlocked()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-17" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the session has been unlocked&lt;/p&gt;&#10;&lt;p&gt;&#10;task: The client should most likely may reinitiate the available keybindings&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-18" class="outline-5"&gt;&#10;&lt;h5 id="headline-18"&gt;&#10;(12) window() -&amp;gt; id: river_window_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-18" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that a new has been created.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the id/proxy and mapping for further use&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-19" class="outline-5"&gt;&#10;&lt;h5 id="headline-19"&gt;&#10;(13) output() -&amp;gt; id: river_output_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-19" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that a output has been created (monitor plugged)&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the id/proxy and mapping for further use&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-20" class="outline-5"&gt;&#10;&lt;h5 id="headline-20"&gt;&#10;(14) seat() -&amp;gt; id: river_seat_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-20" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that a seat/input has been created&#10;(keyboard/mouse/touchscreen plugged)&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the id/proxy and mapping for further use&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-21" class="outline-3"&gt;&#10;&lt;h3 id="headline-21"&gt;&#10;river_window_v1&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-21" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Logical window. For example, a window may correspond to an xdg_toplevel or&#10;Xwayland window. A newly created window will not be displayed until the&#10;window manager makes a propose_dimensions or fullscreen request as part of&#10;a &lt;code&gt;render_sequence&lt;/code&gt;&lt;/p&gt;&#10;&lt;div id="outline-container-headline-22" class="outline-4"&gt;&#10;&lt;h4 id="headline-22"&gt;&#10;Requests&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-22" class="outline-text-4"&gt;&#10;&lt;div id="outline-container-headline-23" class="outline-5"&gt;&#10;&lt;h5 id="headline-23"&gt;&#10;(1) close()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-23" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client want the window to be closed, window may ignore this&#10;request&lt;/p&gt;&#10;&lt;p&gt;&#10;task: wait for &lt;code&gt;closed&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-24" class="outline-5"&gt;&#10;&lt;h5 id="headline-24"&gt;&#10;(3) destroy()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-24" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client cleaned window object and it can be safely destroyed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: nothing&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-25" class="outline-5"&gt;&#10;&lt;h5 id="headline-25"&gt;&#10;(4) get_node() -&amp;gt; id: river_node_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-25" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to know the node that corresponds to the window,&#10;this can only be called once per node, so it should be cached after first&#10;call.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store it as metadata of the window record/object&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-26" class="outline-5"&gt;&#10;&lt;h5 id="headline-26"&gt;&#10;(7) propose_dimensions(width: int, height: int)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-26" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client proposes dimensions for the window.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;manage_sequence&lt;/code&gt; as it modifies the window management&#10;state, wait for &lt;code&gt;dimensions&lt;/code&gt; event for confirmation about the update&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-27" class="outline-5"&gt;&#10;&lt;h5 id="headline-27"&gt;&#10;(8) hide()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-27" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to hide a window (newly created windows are shown&#10;by default).&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;render_sequence&lt;/code&gt; as it modifies the rendering state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-28" class="outline-5"&gt;&#10;&lt;h5 id="headline-28"&gt;&#10;(9) show()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-28" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to show a window, care about windows that are&#10;placed on top of it as they will not make the target window visible.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;render_sequence&lt;/code&gt; as it modifies the rendering state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-29" class="outline-5"&gt;&#10;&lt;h5 id="headline-29"&gt;&#10;(15) use_csd()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-29" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: client wants to use client side decoration (default).&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;manage_sequence&lt;/code&gt; as it modifies the window management&#10;state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-30" class="outline-5"&gt;&#10;&lt;h5 id="headline-30"&gt;&#10;(16) use_ssd()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-30" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: tell the client to use server side decoration&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;manage_sequence&lt;/code&gt; as it modifies the window management&#10;state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-31" class="outline-5"&gt;&#10;&lt;h5 id="headline-31"&gt;&#10;(17) set_borders(edges: uint, width: int, r: uint, g: uint, b: uint,&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-31" class="outline-text-5"&gt;&#10;&lt;p&gt;a:uint)&lt;/p&gt;&#10;&lt;p&gt;&#10;description: decorates the window with borders drawn by the compositor&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;render_sequence&lt;/code&gt; as it modifies the rendering state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-32" class="outline-5"&gt;&#10;&lt;h5 id="headline-32"&gt;&#10;(18) set_tiled(edges: uint)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-32" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: inform the window that it is part of a tiled layout&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;manage_sequence&lt;/code&gt; as it modifies the window management&#10;state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-33" class="outline-5"&gt;&#10;&lt;h5 id="headline-33"&gt;&#10;(19) get_decoration_above(surface: wl_surface) -&amp;gt; id: river_decoration_v1&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-33" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: inform the window that it is part of a tiled layout&lt;/p&gt;&#10;&lt;p&gt;&#10;task: only send in &lt;code&gt;manage_sequence&lt;/code&gt; as it modifies the window management&#10;state.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-34" class="outline-4"&gt;&#10;&lt;h4 id="headline-34"&gt;&#10;Events&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-34" class="outline-text-4"&gt;&#10;&lt;div id="outline-container-headline-35" class="outline-5"&gt;&#10;&lt;h5 id="headline-35"&gt;&#10;(2) closed()&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-35" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates that the window has been closed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: clean window and send &lt;code&gt;destroy&lt;/code&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-36" class="outline-5"&gt;&#10;&lt;h5 id="headline-36"&gt;&#10;(5) dimensions_hint(min_width: int, min_height: int, max_width: int,&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-36" class="outline-text-5"&gt;&#10;&lt;p&gt;max_height: int)&lt;/p&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s preferred min/max dimensions (excluding&#10;borders and decorations). The window manager is free to propose other&#10;dimensions for layouts that require it like tiling.&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the preferred dimensions in window object/record for further&#10;use. This event will be followed by &lt;code&gt;manage_start&lt;/code&gt; and state changes should&#10;be made there.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-37" class="outline-5"&gt;&#10;&lt;h5 id="headline-37"&gt;&#10;(6) dimensions(width: int, height: int)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-37" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s dimensions (excluding borders and&#10;decorations). This event is sent as part of the &lt;code&gt;render_sequence&lt;/code&gt; due to&#10;&lt;code&gt;propose_dimensions&lt;/code&gt; or &lt;code&gt;fullscreen&lt;/code&gt; request&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the dimensions in window object/record for further use. This&#10;event will be followed by &lt;code&gt;render_start&lt;/code&gt; and state changes should be made&#10;there.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-38" class="outline-5"&gt;&#10;&lt;h5 id="headline-38"&gt;&#10;(10) app_id(app_id: string?)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-38" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s application id was changed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the &lt;code&gt;app_id&lt;/code&gt; in window object/record for further use. This will&#10;be followed by a &lt;code&gt;manage_sequence&lt;/code&gt; in case state changes need to be made.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-39" class="outline-5"&gt;&#10;&lt;h5 id="headline-39"&gt;&#10;(11) title(title: string?)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-39" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s title was changed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the &lt;code&gt;title&lt;/code&gt; in window object/record for further use. This will&#10;be followed by a &lt;code&gt;manage_sequence&lt;/code&gt; in case state changes need to be made.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-40" class="outline-5"&gt;&#10;&lt;h5 id="headline-40"&gt;&#10;(12) parent(parent: river_window_v1?)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-40" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s parent was changed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the &lt;code&gt;parent&lt;/code&gt; in window object/record for further use. This will&#10;be followed by a &lt;code&gt;manage_sequence&lt;/code&gt; in case state changes need to be made.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-41" class="outline-5"&gt;&#10;&lt;h5 id="headline-41"&gt;&#10;(13) decoration_hint(hint: uint)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-41" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s parent was changed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the &lt;code&gt;hint&lt;/code&gt; in window object/record for further use. This will&#10;be followed by a &lt;code&gt;manage_sequence&lt;/code&gt; in case state changes need to be made.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-42" class="outline-5"&gt;&#10;&lt;h5 id="headline-42"&gt;&#10;(14) decoration_hint(hint: uint)&#10;&lt;/h5&gt;&#10;&lt;div id="outline-text-headline-42" class="outline-text-5"&gt;&#10;&lt;p&gt;&#10;description: indicates the window&amp;#39;s parent was changed&lt;/p&gt;&#10;&lt;p&gt;&#10;task: store the &lt;code&gt;hint&lt;/code&gt; in window object/record for further use. This will&#10;be followed by a &lt;code&gt;manage_sequence&lt;/code&gt; in case state changes need to be made.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Wayland Protocol &amp; Architecture</title><link>https://www.ozbem.com/posts/tech/wayland/archeticture/</link><pubDate>Thu, 18 Apr 2024 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/tech/wayland/archeticture/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-3"&gt;&#10;&lt;h3 id="headline-1"&gt;&#10;Introduction&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;&lt;code&gt;Wayland&lt;/code&gt; is a modern, secure display server protocol for Linux and Unix-like operating systems. It is a replacement for the older &lt;code&gt;X11&lt;/code&gt; system and it manages how applications render graphics and windows to your screen.&lt;/p&gt;&#10;&lt;p&gt;&#10;In a &lt;code&gt;Wayland&lt;/code&gt; desktop, you have two components:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Wayland Client&lt;/code&gt; (The Application): This is the individual program (like your web browser or text editor). It draws its own interface and sends the finished pixels to the &lt;code&gt;compositor&lt;/code&gt; to be displayed.&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Wayland Compositor&lt;/code&gt; (The Server/Manager): This is the manager, it handles all hardware input (mouse, keyboard) and forwards it to the proper &lt;code&gt;client&lt;/code&gt; (application like your focused browser), and combines all the individual windows rendered by the clients into the final image you see on your screen.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;Wayland Package&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;Installing the &lt;code&gt;wayland&lt;/code&gt; package (preinstalled on most modern distros) provides the official &lt;code&gt;freedesktop.org&lt;/code&gt; implementation of the protocol. This includes:&lt;/p&gt;&#10;&lt;p&gt;&#10; &lt;code&gt;wayland.xml&lt;/code&gt;: A high-level &lt;code&gt;XML&lt;/code&gt; interface defining the core &lt;code&gt;Wayland&lt;/code&gt; specifications (requests and events). All &lt;code&gt;Wayland&lt;/code&gt; protocols (core and extensions) use this format.&lt;/p&gt;&#10;&lt;p&gt;&#10; &lt;code&gt;wayland-scanner&lt;/code&gt;: A tool that generates &lt;code&gt;C&lt;/code&gt; headers and glue code from &lt;code&gt;XML&lt;/code&gt; protocol files. Many scanners exist in other languages like &lt;code&gt;rust&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10; &lt;code&gt;libwayland-client&lt;/code&gt; &amp;amp; &lt;code&gt;libwayland-server&lt;/code&gt;: C libraries that implement the wire protocol for both components and offer common utilities for handling &lt;code&gt;Wayland&lt;/code&gt; data structures.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;Wayland Protocol&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;p&gt;&#10;The &lt;code&gt;wayland&lt;/code&gt; protocol is actually easy to understand and very elegant. I will explain the &lt;code&gt;interfaces&lt;/code&gt; first and then I will go over the &lt;code&gt;wiring protocol&lt;/code&gt; and it will start to click.&lt;/p&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-4"&gt;&#10;&lt;h4 id="headline-4"&gt;&#10;Interfaces (XML files)&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;&#10;&lt;p&gt;&#10;We discussed earlier that there is an &lt;code&gt;xml&lt;/code&gt; file which is &lt;code&gt;wayland.xml&lt;/code&gt; (we call it &lt;code&gt;core&lt;/code&gt;). There are so many other &lt;code&gt;xml&lt;/code&gt; files as well which we call extensions to &lt;code&gt;wayland&lt;/code&gt;, like &lt;code&gt;xdg-shell&lt;/code&gt; which is defines the functionality needed to create windows that can be dragged, resized, etc, in a &lt;code&gt;wayland&lt;/code&gt; desktop. You can browse these &lt;code&gt;xml&lt;/code&gt; files locally, they will be usually in &lt;code&gt;/usr/share/wayland-protocols/&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;I find it sometimes very helpful to peak at &lt;a href="https://wayland.app/protocols/"&gt;Wayland Protocols Explorer&lt;/a&gt;, it&amp;#39;s very elegant and it shows all popular &lt;code&gt;Wayland&lt;/code&gt; protocols. I know there are so many protocols, but nobody is expecting you to know them all. You should just be able to read the documentation and know how to use it.&lt;/p&gt;&#10;&lt;p&gt;&#10;You might notice that there are labels to these protocols, and they are listed under a certain subdirectories in the &lt;code&gt;wayland-prtocols&lt;/code&gt; directory locally.&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Core: this is the core &lt;code&gt;wayland&lt;/code&gt; protocols&lt;/li&gt;&#10;&lt;li&gt;Stable: [TODO]&lt;/li&gt;&#10;&lt;li&gt;Staging: [TODO]&lt;/li&gt;&#10;&lt;li&gt;Unstable: [TODO]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The &lt;code&gt;XML&lt;/code&gt; file format defines &lt;code&gt;interfaces&lt;/code&gt;, each &lt;code&gt;interface&lt;/code&gt; has many &lt;code&gt;requests&lt;/code&gt;, and &lt;code&gt;events&lt;/code&gt;. Let&amp;#39;s explain this with an example form the core &lt;code&gt;wayland.xml&lt;/code&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;There are many interfaces, one of them is &lt;code&gt;wl_surface&lt;/code&gt;, below is the code truncated.&lt;/p&gt;&#10;&lt;div class="src src-xml"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;protocol&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;wayland&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;interface&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;wl_display&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ....&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;interface&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;wl_surface&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9;&lt;span class="nt"&gt;&amp;lt;description&lt;/span&gt; &lt;span class="na"&gt;summary=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;an onscreen surface&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9; A surface is a rectangular area that may be displayed on zero&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9; or more outputs, and shown any number of times at the compositor&amp;#39;s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9; ....&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9;&lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;enum&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;error&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;description&lt;/span&gt; &lt;span class="na"&gt;summary=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;wl_surface error values&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; These errors can be emitted in response to wl_surface requests.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;entry&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;invalid_scale&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;summary=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;buffer scale value is invalid&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#9; ....&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/enum&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/interface&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/protocol&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>I am leaving StumpWM and X11</title><link>https://www.ozbem.com/posts/software/guile-swayer/leaving-x11-and-stumpwm/</link><pubDate>Fri, 12 Apr 2024 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/posts/software/guile-swayer/leaving-x11-and-stumpwm/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;Lisp-Based Tools&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;If you have spent any significant time in the world of Lisp-based tools, you know that once you invest in tweaking them, you simply can&amp;#39;t quit. I have spent years living in &lt;code&gt;Emacs&lt;/code&gt; and &lt;code&gt;StumpWM&lt;/code&gt;, addicted to the idea that my environment shouldn&amp;#39;t just be &amp;#34;configurable,&amp;#34; but truly &lt;strong&gt;extensible&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;&#10;In &lt;code&gt;StumpWM&lt;/code&gt; and &lt;code&gt;EXWM&lt;/code&gt;, the line between &amp;#34;user&amp;#34; and &amp;#34;developer&amp;#34; is paper-thin. If you want a new feature, you don’t submit a feature request; you open a REPL and redefine a function on the fly. However, with X11 nearing its end-of-life and the beauty of modern &lt;code&gt;Hyprland&lt;/code&gt; setups I am seeing, I feel it&amp;#39;s time to begin my transition to &lt;code&gt;Wayland&lt;/code&gt;.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-2"&gt;&#10;&lt;h2 id="headline-2"&gt;&#10;Emacs as a Window Manager&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-2"&gt;&#10;&lt;p&gt;I experimented with &lt;code&gt;EXWM&lt;/code&gt; (the Emacs X Window Manager), and initially, I was shocked, I couldn&amp;#39;t believe such a feat was even possible. But then again, it’s &lt;code&gt;Emacs&lt;/code&gt;; everything is possible. However, the experience highlighted a critical flaw: if Emacs froze or crashed, my entire session vanished. &lt;/p&gt;&#10;&lt;p&gt;&#10;I&amp;#39;ve come to realize that I don&amp;#39;t want to assign &lt;code&gt;Emacs&lt;/code&gt; heavy-duty system tasks like window management. I prefer using &lt;code&gt;Emacs&lt;/code&gt; as the interface between myself and other specialized utilities. Much like how &lt;code&gt;dired&lt;/code&gt; can act as a frontend for &lt;code&gt;ls&lt;/code&gt;, I believe a window manager should be assisted by a dedicated compositor written in a systems language like &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;Rust&lt;/code&gt;, or &lt;code&gt;Zig&lt;/code&gt;. Entrusting the entire desktop session to a single-threaded Lisp interpreter is, in my view, a bottleneck for stability.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-2"&gt;&#10;&lt;h2 id="headline-3"&gt;&#10;Creating a Lisp-Based Scripting Environment&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-2"&gt;&#10;&lt;p&gt;I believe a window manager should apply the &amp;#34;Emacs Principle&amp;#34; because everyone&amp;#39;s workflow is unique. I have seen people using Emacs setups so personalized that I couldn&amp;#39;t even tell it was Emacs. &lt;/p&gt;&#10;&lt;p&gt;&#10;In my case, I have a specific workflow requirement: &lt;strong&gt;&lt;strong&gt;extending workspaces across multiple monitors&lt;/strong&gt;&lt;/strong&gt;. Assuming I have 2 monitors &lt;code&gt;ot#1&lt;/code&gt; and &lt;code&gt;ot#2&lt;/code&gt;. I want each to have its dedicated workspaces, let&amp;#39;s say each will have 3 workspaces. Whenever the workspace of &lt;code&gt;ot#1&lt;/code&gt; changes to workspace number 2, the workspace of &lt;code&gt;ot#2&lt;/code&gt; should also change to workspace number 2 (syncing).&lt;/p&gt;&#10;&lt;div class="src src-text"&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | ws#1 | ws#2 |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |-----------------------------------------------------|&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | ws#1-1 &amp;amp; ws#1-2 &amp;amp; ws#1-3 | ws#2-1 &amp;amp; ws#2-2 &amp;amp; ws#2-3 |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&#10;I tried implementing this in &lt;code&gt;Sway&lt;/code&gt; and &lt;code&gt;Hyprland&lt;/code&gt; using their standard configuration languages, but I hit a wall. I could bind a key to switch multiple workspaces simultaneously, which worked temporarily, until a window stole focus or an unexpected workspace change occurred. This inevitably caused the monitors to get out of sync. &lt;/p&gt;&#10;&lt;p&gt;&#10;To solve this properly, I can&amp;#39;t just rely on simple keybindings; I need a persistent &lt;strong&gt;&lt;strong&gt;event listener&lt;/strong&gt;&lt;/strong&gt;. I need the environment to watch for workspace changes and programmatically sync the other monitors accordingly. This requires a level of logic that static config files simply cannot handle.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-2"&gt;&#10;&lt;h2 id="headline-4"&gt;&#10;The Way Forward&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-2"&gt;&#10;&lt;p&gt;I need a compositor that is stable but provides a &amp;#34;hook&amp;#34; for high-level logic preferably with a lisp-based language like &lt;code&gt;guile&lt;/code&gt;. My next step is to experiment with a both &lt;code&gt;Sway&lt;/code&gt; and &lt;code&gt;Hyprland&lt;/code&gt; to see how far I can push the implementation of custom window management logic without sacrificing the stability of the underlying Wayland compositor.&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>Privacy Policy</title><link>https://www.ozbem.com/pages/privacy-policy/</link><pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate><author>info@ozbem.com (ebeem)</author><guid>https://www.ozbem.com/pages/privacy-policy/</guid><description>&#10;&lt;h1 class="relative group"&gt;Privacy Policy&#10; &lt;div id="privacy-policy" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#privacy-policy" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h1&gt;&#10;&lt;p&gt;&lt;strong&gt;Effective Date:&lt;/strong&gt; 12/01/2024&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;1. Information We Collect&#10; &lt;div id="1-information-we-collect" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1-information-we-collect" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;We collect the following information to manage your account and enhance gameplay:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Personal Information&lt;/strong&gt;: Name, email address, and IP address.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Device Information&lt;/strong&gt;: Operating system and hardware details.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;In-Game Activity&lt;/strong&gt;: Player interactions (e.g., chat messages) may be tracked to monitor and control chat abuse.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;2. Purpose of Data Collection&#10; &lt;div id="2-purpose-of-data-collection" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2-purpose-of-data-collection" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Your data is collected to:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Create and manage user accounts.&lt;/li&gt;&#10;&lt;li&gt;Improve the gameplay experience.&lt;/li&gt;&#10;&lt;li&gt;Perform analytics and technical troubleshooting.&lt;/li&gt;&#10;&lt;li&gt;Serve advertisements through third-party networks.&lt;/li&gt;&#10;&lt;li&gt;Integrate social media features.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;3. User Accounts&#10; &lt;div id="3-user-accounts" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#3-user-accounts" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Players can create accounts with their email and username. This information is used to personalize and manage your account.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;4. Data Storage and Security&#10; &lt;div id="4-data-storage-and-security" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#4-data-storage-and-security" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;Your data is securely stored on our private servers, with the following measures:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Passwords are encrypted for added security.&lt;/li&gt;&#10;&lt;li&gt;Access to user data is strictly controlled and monitored.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10;&lt;h2 class="relative group"&gt;5. Third-Party Services&#10; &lt;div id="5-third-party-services" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#5-third-party-services" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;We utilize third-party services for:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Advertising:&lt;/strong&gt; Displaying relevant ads based on device information.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Social Media Integration:&lt;/strong&gt; Enabling content sharing and connections.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;These services operate under their own privacy policies.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;6. Your Rights&#10; &lt;div id="6-your-rights" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#6-your-rights" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;You have the right to:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Access and modify your account information.&lt;/li&gt;&#10;&lt;li&gt;Request deletion of your account and associated data (accessible from the in-game settings interface).&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;To exercise these rights, contact us at &lt;a href="mailto:info@ozbem.com" &gt;info@ozbem.com&lt;/a&gt;.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;7. Children&amp;rsquo;s Privacy&#10; &lt;div id="7-childrens-privacy" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#7-childrens-privacy" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;Spooky Night&lt;/em&gt; is not intended for children under 13. We do not knowingly collect data from children. If such data is found, it will be promptly deleted.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;8. Changes to This Policy&#10; &lt;div id="8-changes-to-this-policy" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#8-changes-to-this-policy" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;We may update this Privacy Policy. Any changes will be posted here with an updated effective date.&lt;/p&gt;&#10;&#10;&lt;h2 class="relative group"&gt;9. Contact Us&#10; &lt;div id="9-contact-us" class="anchor"&gt;&lt;/div&gt;&#10; &#10; &lt;span&#10; class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;&#10; &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#9-contact-us" aria-label="Anchor"&gt;#&lt;/a&gt;&#10; &lt;/span&gt;&#10; &#10;&lt;/h2&gt;&#10;&lt;p&gt;If you have any questions or concerns, please reach out to us:&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:info@ozbem.com" &gt;info@ozbem.com&lt;/a&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;© 2024 Spooky Night. All rights reserved.&lt;/p&gt;&#10;</description></item></channel></rss>