<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Asher Buk</title>
    <description>The latest articles on DEV Community by Asher Buk (@ashbuk).</description>
    <link>https://dev.to/ashbuk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3554115%2F5b18ff85-2a6a-47dd-bde9-63a2107ad256.jpg</url>
      <title>DEV Community: Asher Buk</title>
      <link>https://dev.to/ashbuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashbuk"/>
    <language>en</language>
    <item>
      <title>Why Hyprland on Fedora Needs Vendored Dependencies (0.55.0 Edition)</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Sun, 10 May 2026 11:13:57 +0000</pubDate>
      <link>https://dev.to/ashbuk/why-hyprland-on-fedora-needs-vendored-dependencies-0550-edition-4alo</link>
      <guid>https://dev.to/ashbuk/why-hyprland-on-fedora-needs-vendored-dependencies-0550-edition-4alo</guid>
      <description>&lt;p&gt;Hyprland 0.55.0 just dropped with a new Lua-based config layer. Cool feature - except it requires Lua 5.5, and Fedora repos still ship Lua 5.4.&lt;/p&gt;

&lt;p&gt;I maintain a &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;COPR&lt;/a&gt; for Hyprland on Fedora that bundles all &lt;code&gt;hypr-*&lt;/code&gt; library dependencies into a single build with zero external COPR deps. This Lua situation is a textbook example of why this approach exists - and why it fits Fedora better.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Hyprland was orphaned after F42 (doesn't exist in official repos). On Fedora 43 and 44 the only way to install it is through COPR repositories or building from source.&lt;/p&gt;

&lt;p&gt;Most Hyprland COPRs for Fedora follow the traditional approach inherited from &lt;a href="https://copr.fedorainfracloud.org/coprs/solopasha/hyprland/" rel="noopener noreferrer"&gt;solopasha's&lt;/a&gt; original repo: every &lt;code&gt;hypr-*&lt;/code&gt; library (&lt;code&gt;libaquamarine&lt;/code&gt;, &lt;code&gt;libhyprlang&lt;/code&gt;, &lt;code&gt;libhyprutils&lt;/code&gt; etc.) is packaged as a separate RPM with its own build cycle.&lt;/p&gt;

&lt;p&gt;That means when you &lt;code&gt;dnf install hyprland&lt;/code&gt;, you pull in 15+ individual packages. Each one is built independently, sometimes days apart. When you &lt;code&gt;dnf upgrade&lt;/code&gt;, each updates on its own schedule. Now add Lua 5.5 to the mix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Atomic (Reproducible) Build Approach
&lt;/h2&gt;

&lt;p&gt;In my COPR, Lua 5.5 is built from source with &lt;code&gt;-fPIC&lt;/code&gt; and linked statically into the Hyprland binary. No new runtime dependency, no conflict with system Lua.&lt;/p&gt;

&lt;p&gt;The same isolation principle applies to every &lt;code&gt;hypr-*&lt;/code&gt; library. Instead of installing &lt;code&gt;libaquamarine&lt;/code&gt;, &lt;code&gt;libhyprlang&lt;/code&gt;, &lt;code&gt;libhyprutils&lt;/code&gt; etc. as separate RPMs into &lt;code&gt;/usr/lib64/&lt;/code&gt;, they're built as shared libraries into a private vendor prefix (&lt;code&gt;/usr/libexec/hyprland/vendor/lib64/&lt;/code&gt;) and resolved via &lt;code&gt;RPATH&lt;/code&gt;. They never touch system library paths, so there are no conflicts with other packages and no duplicates in &lt;code&gt;dnf repoquery --duplicates&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;With the traditional approach, there's always a window where your system is in an inconsistent state. The maintainer rebuilds &lt;code&gt;aquamarine&lt;/code&gt; on Monday, &lt;code&gt;hyprland&lt;/code&gt; on Wednesday - between Monday and Wednesday, users who upgraded have a mismatched ABI. The compositor might crash on launch and the user has no idea why.&lt;/p&gt;

&lt;p&gt;With vendor-clean builds, the update is atomic. One spec file builds the compositor, hyprlock, hypridle, and all library dependencies together. Everything is compiled against the same versions in the same build. It either all works or none of it ships.&lt;/p&gt;

&lt;p&gt;It's the same philosophy behind how Go produces binaries - one static file, all dependencies inside, no dependency hell at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the Traditional Approach Works Fine
&lt;/h2&gt;

&lt;p&gt;On Arch and other rolling release distros where all system libraries stay on the bleeding edge. Hyprland is &lt;a href="https://wiki.hyprland.org/Getting-Started/Installation/" rel="noopener noreferrer"&gt;officially supported on Arch&lt;/a&gt;, and AUR packages are built from source on the user's machine - so they link against whatever library versions are already installed. No version mismatch, no frozen dependencies.&lt;/p&gt;

&lt;p&gt;The problem is specific to point-release distros like Fedora, where system libraries are pinned to a release version. When a bleeding-edge compositor like Hyprland moves faster than the distro's package set, something has to give. On Arch, the distro keeps up. On Fedora, you need to bring the dependencies with you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Not a New Idea
&lt;/h2&gt;

&lt;p&gt;This vendor-clean approach is a well-established pattern across the industry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; is the most obvious example. &lt;code&gt;go build&lt;/code&gt; produces a single statically linked binary with all dependencies compiled in. No shared libraries - deploy one file and it runs. The Go team made this a deliberate design choice, and it's one of the reasons Go dominates in infrastructure tooling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NixOS&lt;/strong&gt; solves the same problem differently but with the same goal. Every package is built in isolation with its exact dependency tree, stored in &lt;code&gt;/nix/store/&lt;/code&gt; with a hash-based path. Two versions of the same library coexist without conflict. Hyprland is &lt;a href="https://wiki.hyprland.org/Nix/" rel="noopener noreferrer"&gt;officially supported on NixOS&lt;/a&gt; precisely because Nix eliminates dependency hell by design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atomic/immutable distros&lt;/strong&gt; like &lt;a href="https://fedoraproject.org/atomic-desktops/" rel="noopener noreferrer"&gt;Fedora Atomic&lt;/a&gt;, &lt;a href="https://universal-blue.org/" rel="noopener noreferrer"&gt;Universal Blue&lt;/a&gt;, and &lt;a href="https://vanillaos.org/" rel="noopener noreferrer"&gt;Vanilla OS&lt;/a&gt; take yet another approach - the entire OS image is built and tested as a unit, then deployed atomically. No partial upgrades, no inconsistent state.&lt;/p&gt;

&lt;p&gt;My COPR applies the same principle at the package level: one build, one atomic unit, all versions locked together. It's close to Nix/Go/Atomic philosophy, but implemented as an RPM spec file for a traditional Fedora install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf copr &lt;span class="nb"&gt;enable &lt;/span&gt;ashbuk/Hyprland-Fedora
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;hyprland

&lt;span class="c"&gt;# Screen sharing support&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;xdg-desktop-portal-hyprland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Source and spec files: &lt;a href="https://github.com/AshBuk/Hyprland-Fedora" rel="noopener noreferrer"&gt;github.com/AshBuk/Hyprland-Fedora&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Vendor-clean Hyprland package for Fedora 43/44, currently serving 2,700+ users.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hyprland</category>
      <category>fedora</category>
      <category>linux</category>
      <category>wayland</category>
    </item>
    <item>
      <title>In the Age of AI, People Still Type With Their Hands</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Wed, 06 May 2026 17:58:05 +0000</pubDate>
      <link>https://dev.to/ashbuk/in-the-age-of-ai-people-still-type-with-their-hands-4dek</link>
      <guid>https://dev.to/ashbuk/in-the-age-of-ai-people-still-type-with-their-hands-4dek</guid>
      <description>&lt;p&gt;About two months ago I submitted my typing trainer &lt;a href="https://github.com/AshBuk/FingerGo" rel="noopener noreferrer"&gt;FingerGo&lt;/a&gt; to &lt;a href="https://flathub.org/en/apps/io.github.AshBuk.FingerGo" rel="noopener noreferrer"&gt;Flathub&lt;/a&gt;. I was genuinely curious - do people still type with their hands in the age of AI? Do they still train touch typing, or are they satisfied with a speech-to-text button and the occasional lazy two-finger hunt for the remaining keys? :D&lt;/p&gt;

&lt;p&gt;Turns out - yes! You'd think a niche tool for desktop Linux wouldn't get much traction, but so far it's pulling 1,000+ installs per month.&lt;/p&gt;

&lt;p&gt;I originally built this for myself. I got a split keyboard and started learning touch typing. As a developer, you &lt;strong&gt;need&lt;/strong&gt; to type, stay in the &lt;strong&gt;flow&lt;/strong&gt;, and &lt;strong&gt;not break focus&lt;/strong&gt;. Also - my wrists started hurting. So I switched to a split keyboard and invested in proper touch typing. Within a few months I hit a comfortable 60 WPM on plain text and ~40 WPM coding. That's a solid average for touch typists - and pretty much unreachable for "hunters." I consider this a true hard skill and one of the best investments for anyone spending most of their day at a computer.&lt;/p&gt;

&lt;p&gt;According to FingerGo's &lt;a href="https://flathub.org/en/apps/io.github.AshBuk.FingerGo" rel="noopener noreferrer"&gt;Flathub&lt;/a&gt;, the top countries interested in touch typing training are: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiftasfi59bm6bsug5cxl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiftasfi59bm6bsug5cxl.png" alt="Flathub country statistics world map showing FingerGo installs across 2,386 total downloads" width="800" height="686"&gt;&lt;/a&gt;&lt;br&gt;
USA (largest desktop Linux user base), Germany (historically strong Linux community plus a culture of privacy and open source), India (growing pool of developers on Linux), and Brazil (active FOSS community).&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>linux</category>
      <category>productivity</category>
      <category>faltpak</category>
    </item>
    <item>
      <title>System-Wide STT for Linux: Speak to AI</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Mon, 16 Mar 2026 14:08:34 +0000</pubDate>
      <link>https://dev.to/ashbuk/system-wide-stt-for-linux-speak-to-ai-2f63</link>
      <guid>https://dev.to/ashbuk/system-wide-stt-for-linux-speak-to-ai-2f63</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3o548ala6d0dmg4xhkpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3o548ala6d0dmg4xhkpt.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Linux speech-to-text landscape has grown a lot — these days you'll find a microphone icon and voice input in pretty much every chat app and code editor. But just a year ago? Almost nothing had decent STT support on Linux.&lt;/p&gt;

&lt;p&gt;That's when I started thinking about a proper solution — and solved the problem at the system level. &lt;strong&gt;&lt;a href="https://github.com/AshBuk/speak-to-ai" rel="noopener noreferrer"&gt;Speak to AI&lt;/a&gt;&lt;/strong&gt; is a voice "keyboard" for any window (chat, terminal, editor, etc.) that works natively and fast. The core workflow is simple: speak → text appears wherever your cursor is. Beyond that, it supports scripts and integrations — next step is turning it into an STT hub for smart home and other automations.&lt;/p&gt;

&lt;p&gt;Works on any Linux distro and any DE. No Electron, no browser tabs, no cloud dependencies — just a lightweight Go binary with whisper.cpp doing all the heavy lifting locally. Privacy first.&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;&lt;a href="https://github.com/AshBuk/speak-to-ai/releases" rel="noopener noreferrer"&gt;Download from Releases&lt;/a&gt;&lt;/strong&gt; — AppImage, ready to run&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arch Linux&lt;/strong&gt; (&lt;a href="https://aur.archlinux.org/packages/speak-to-ai" rel="noopener noreferrer"&gt;AUR&lt;/a&gt;): &lt;code&gt;yay -S speak-to-ai&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fedora&lt;/strong&gt; (&lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/speak-to-ai/" rel="noopener noreferrer"&gt;COPR&lt;/a&gt;): &lt;code&gt;sudo dnf copr enable ashbuk/speak-to-ai &amp;amp;&amp;amp; sudo dnf install speak-to-ai&lt;/code&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>stt</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Software Craftsmanship: The Three Hidden Pillars</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Thu, 15 Jan 2026 16:27:16 +0000</pubDate>
      <link>https://dev.to/ashbuk/software-craftsmanship-the-three-hidden-pillars-pee</link>
      <guid>https://dev.to/ashbuk/software-craftsmanship-the-three-hidden-pillars-pee</guid>
      <description>&lt;p&gt;In this post, I want to briefly talk about how your environment (Linux), your hardware (keyboard &amp;amp; touch typing), and your tooling (shortcuts) form the three pillars of &lt;strong&gt;Software Craftsmanship&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let’s be clear: these are not the &lt;em&gt;most&lt;/em&gt; important skills for a developer, nor are they the primary way to evaluate a grade. They won’t replace business domain knowledge, solid architectural decisions, or problem-solving abilities. However, &lt;strong&gt;"Mastership is not just about WHAT you create, but also HOW you create it."&lt;/strong&gt; By removing the friction between your mind and the screen, you free up space for pure creativity.&lt;/p&gt;

&lt;p&gt;Here are my three pillars:&lt;/p&gt;




&lt;h3&gt;
  
  
  1. The Environment: Linux
&lt;/h3&gt;

&lt;p&gt;Switching to Linux is more than just changing an OS; it’s a transition from being a "consumer of interfaces" to a "creator of systems." In Linux, the boundary between you and the running code fades away. You start to understand how the file system, processes, and networks actually work just by living in the environment.&lt;/p&gt;

&lt;p&gt;For me, moving to Linux was a massive skill bump, even though many friends told me at the start that "the OS doesn't matter." The journey from being afraid of the terminal to confident mastery is incredibly rewarding.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Rule:&lt;/strong&gt; Anything you can do in a GUI (and many things you can't) can be done via the terminal—often much faster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Base:&lt;/strong&gt; Terminal skills are "evergreen." They are portable and don't become obsolete when a new fancy app comes out. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Perks:&lt;/strong&gt; Native containers, Btrfs snapshots, and total control. Once you go Linux, you’ll only keep Windows around for the games that won't run elsewhere!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The Physicality: Split Keyboards &amp;amp; Touch Typing
&lt;/h3&gt;

&lt;p&gt;This is about removing physical bottlenecks. When you don't have to look at your hands, code flows directly from your brain to the editor. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Health Factor:&lt;/strong&gt; A split keyboard is about longevity. Avoiding wrist pain is a professional necessity, not a luxury.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch Typing vs. "Hunt &amp;amp; Peck":&lt;/strong&gt; An office "hunter" might peak at 50 WPM, while the average is closer to 20-30 WPM. A decent touch typist easily hits 60–80 WPM, and pros go well beyond 130–160+ WPM. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Joy:&lt;/strong&gt; Honestly, the biggest win isn't just speed—it's the &lt;strong&gt;feel&lt;/strong&gt;. You start enjoying the process of typing itself. Even 40-50 WPM for plain text makes work remarkably comfortable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Tooling: Shortcuts &amp;amp; Flow
&lt;/h3&gt;

&lt;p&gt;Shortcuts are all about the &lt;strong&gt;Flow State&lt;/strong&gt;. Every time you reach for the mouse, you create a micro-interruption in your train of thought. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A quick disclaimer:&lt;/strong&gt; Don't be a fanatic. If you get frustrated every time you touch a mouse, or if you insist on reading raw Markdown in a terminal just to look "pro"—that’s probably too much. I use VS Code, I don’t mind using the mouse when it makes sense, and I read my emails in a browser. Balance is key.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bonus: My VS Code Navigation Toolkit
&lt;/h2&gt;

&lt;p&gt;As a bonus, here is a snippet from my personal cheat sheet for VS Code navigation:&lt;/p&gt;

&lt;h3&gt;
  
  
  Using F-Keys (via Fn layer)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Standard Binding&lt;/th&gt;
&lt;th&gt;On Split Keyboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Go to Definition&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Fn + =&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go to Implementation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + F12&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Fn + =&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rename Symbol&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F2&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Fn + 2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next Error/Warning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;F8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Fn + 8&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Without F-Keys (The Essentials)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Binding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Go Back&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alt + ←&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go Forward&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alt + →&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick Open (File)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + P&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbol in File&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + O&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Symbol in Workspace&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + T&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go to Line&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + G&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command Palette&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + P&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go to Bracket&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + \&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Typical Workflow
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Ctrl + P&lt;/code&gt; (Open File) → &lt;code&gt;Ctrl + Shift + O&lt;/code&gt; (Find Function) → &lt;code&gt;F12&lt;/code&gt; (Go to Definition) → &lt;code&gt;Alt + ←&lt;/code&gt; (Go Back).&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Additions
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Binding&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Find in Files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + F&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace in Files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + H&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Sidebar&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + B&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toggle Integrated Terminal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + `&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split Editor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + \&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Switch Editor Tab&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Tab&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Close Tab&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + W&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick Fix / Code Action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + .&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trigger Suggest&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Space&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter Hints&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Space&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Craftsmanship is a journey. These tools won't make you a Senior developer overnight, but they will make the road there much more enjoyable and efficient. &lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What does your "craftsman" setup look like? *&lt;/em&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
      <category>linux</category>
      <category>vscode</category>
    </item>
    <item>
      <title>Hyprland 0.53.0 for Fedora</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Thu, 01 Jan 2026 12:57:21 +0000</pubDate>
      <link>https://dev.to/ashbuk/hyprland-0530-for-fedora-1afm</link>
      <guid>https://dev.to/ashbuk/hyprland-0530-for-fedora-1afm</guid>
      <description>&lt;p&gt;Hyprland team bumped the version on December 29th. I didn't wait and updated my &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;COPR repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After a day of driving, I can confirm: life in 2026 hasn't gotten worse — quite the opposite :)&lt;br&gt;
Happy New Year, by the way! 🎉&lt;/p&gt;
&lt;h2&gt;
  
  
  Already a user?
&lt;/h2&gt;

&lt;p&gt;The repo has &lt;strong&gt;150 users&lt;/strong&gt; at the time of posting. If you're among them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Refresh metadata&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf copr &lt;span class="nb"&gt;enable &lt;/span&gt;ashbuk/Hyprland-Fedora &lt;span class="nt"&gt;--refresh&lt;/span&gt;

&lt;span class="c"&gt;# Upgrade&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade hyprland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Considering Hyprland on Fedora?
&lt;/h2&gt;

&lt;p&gt;See &lt;a href="https://dev.to/ashbuk/hyprland-0522-for-fedora-clean-copr-build-24hm"&gt;my previous post&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;Note: this COPR intentionally does not include optional Qt-based GUI helpers (welcome screens, crash dialogs, donation prompts).&lt;/p&gt;

&lt;p&gt;Hyprland works perfectly without them. This aligns with my packaging approach: no extra functionality by default — anything missing can be added consciously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hyprland&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic tiling Wayland compositor (includes &lt;code&gt;Hyprland&lt;/code&gt;, &lt;code&gt;hyprctl&lt;/code&gt;, &lt;code&gt;hyprpm&lt;/code&gt;, &lt;code&gt;start-hyprland&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;xdg-desktop-portal-hyprland&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Portal backend for screen sharing, file dialogs - separate spec&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Hyprland includes a small set of &lt;strong&gt;upstream-vendored libraries&lt;/strong&gt; (as shown on the image cover),&lt;br&gt;
with proper &lt;code&gt;$ORIGIN&lt;/code&gt;-based RUNPATH. No extra bundling beyond upstream defaults.&lt;/p&gt;

&lt;p&gt;If it looks good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable the repo&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf copr &lt;span class="nb"&gt;enable &lt;/span&gt;ashbuk/Hyprland-Fedora

&lt;span class="c"&gt;# Install core compositor&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;hyprland

&lt;span class="c"&gt;# Screen sharing support (recommended)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;xdg-desktop-portal-hyprland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Breaking changes ahead
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Heads up:&lt;/strong&gt; 0.53.0 comes with breaking changes — you'll need to update your config syntax.&lt;br&gt;
&lt;strong&gt;New features:&lt;/strong&gt;&lt;br&gt;
🐕‍🦺 &lt;code&gt;start-hyprland&lt;/code&gt; watchdog binary for crash recovery&lt;br&gt;
🕸️ hyprwire IPC library for improved hyprctl communication&lt;/p&gt;

&lt;p&gt;Review: &lt;a href="https://hypr.land/news/update53/" rel="noopener noreferrer"&gt;Hyprland 0.53.0 Release Notes&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Feedback or issues are welcome on the &lt;a href="https://github.com/AshBuk/Hyprland-Fedora" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;COPR:&lt;/strong&gt; &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;ashbuk/Hyprland-Fedora&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>hyprland</category>
      <category>fedora</category>
      <category>linux</category>
    </item>
    <item>
      <title>Screen Sharing for Hyprland on Fedora 43</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Thu, 25 Dec 2025 21:02:45 +0000</pubDate>
      <link>https://dev.to/ashbuk/screen-sharing-for-hyprland-on-fedora-43-1di</link>
      <guid>https://dev.to/ashbuk/screen-sharing-for-hyprland-on-fedora-43-1di</guid>
      <description>&lt;p&gt;I've already published a &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;clean Hyprland build for Fedora 43&lt;/a&gt; — now I've added &lt;strong&gt;xdg-desktop-portal-hyprland&lt;/strong&gt; to the same COPR repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;xdg-desktop-portal-hyprland&lt;/code&gt; with proper &lt;code&gt;RUNPATH&lt;/code&gt; pointing to the vendored libraries.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf copr &lt;span class="nb"&gt;enable &lt;/span&gt;ashbuk/Hyprland-Fedora
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;hyprland xdg-desktop-portal-hyprland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screen sharing tested in Discord, Google Meet, and other WebRTC apps via Firefox and Chrome.&lt;/p&gt;

&lt;h4&gt;
  
  
  Links
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;COPR repository:&lt;/strong&gt; &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source repository (fork + spec files):&lt;/strong&gt; &lt;a href="https://github.com/AshBuk/Hyprland-Fedora" rel="noopener noreferrer"&gt;https://github.com/AshBuk/Hyprland-Fedora&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyprland tech write-up:&lt;/strong&gt; &lt;a href="https://ashbuk.hashnode.dev/hyprland-fedora" rel="noopener noreferrer"&gt;https://ashbuk.hashnode.dev/hyprland-fedora&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;380+ users now run Hyprland on Fedora 43 through this repository — thank you for trusting the build! If you hit any issues, feel free to open an issue on &lt;a href="https://github.com/AshBuk/Hyprland-Fedora" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>hyperland</category>
      <category>fedora</category>
      <category>wayland</category>
      <category>devops</category>
    </item>
    <item>
      <title>Hyprland 0.52.2+ for Fedora — Clean COPR Build</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Thu, 18 Dec 2025 18:52:07 +0000</pubDate>
      <link>https://dev.to/ashbuk/hyprland-0522-for-fedora-clean-copr-build-24hm</link>
      <guid>https://dev.to/ashbuk/hyprland-0522-for-fedora-clean-copr-build-24hm</guid>
      <description>&lt;h3&gt;
  
  
  I’ve published my own &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;Hyprland COPR&lt;/a&gt; repository for Fedora
&lt;/h3&gt;

&lt;p&gt;This is a &lt;strong&gt;clean, spec-compliant build&lt;/strong&gt;, following Fedora RPM best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correct RPM packaging
&lt;/li&gt;
&lt;li&gt;no duplicated system libraries
&lt;/li&gt;
&lt;li&gt;Hyprland-specific libraries vendored and isolated under
&lt;code&gt;/usr/libexec/hyprland/vendor&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;proper &lt;code&gt;RUNPATH&lt;/code&gt; set at build time (no &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; hacks)
&lt;/li&gt;
&lt;li&gt;runtime verified with &lt;code&gt;ldd&lt;/code&gt;, &lt;code&gt;readelf&lt;/code&gt;, and duplicate checks
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Motivation
&lt;/h2&gt;

&lt;p&gt;The motivation was purely practical.&lt;/p&gt;

&lt;p&gt;Hyprland 0.45 was available in Fedora 42, but it is not currently shipped in Fedora 43 official repositories; upstream is already at 0.52+.&lt;/p&gt;

&lt;p&gt;I needed a &lt;strong&gt;newer compositor with fresh Hyprland features&lt;/strong&gt; to unblock my own experiments — especially around &lt;strong&gt;Wayland and Rust-based tooling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I solved this problem for myself first, and then decided to &lt;strong&gt;share the result with the community&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you care about &lt;strong&gt;clean builds&lt;/strong&gt;, &lt;strong&gt;reproducibility&lt;/strong&gt;, and &lt;strong&gt;no ABI conflicts&lt;/strong&gt;, this repository is for you. (stable recent releases, updated as needed — not automatically tracking every upstream commit)&lt;/p&gt;

&lt;h2&gt;
  
  
  Proofs / Technical Guarantees
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vendor libraries are isolated and do not shadow system libraries
&lt;/li&gt;
&lt;li&gt;No parallel-install conflicts (&lt;code&gt;dnf repoquery --duplicates&lt;/code&gt; is clean)
&lt;/li&gt;
&lt;li&gt;Dynamic linking is deterministic and auditable
&lt;/li&gt;
&lt;li&gt;Build avoids &lt;code&gt;patchelf&lt;/code&gt; (which is known to corrupt ELF headers in this case)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this can be verified directly from the installed package.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install from &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf copr &lt;span class="nb"&gt;enable &lt;/span&gt;ashbuk/Hyprland-Fedora
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;hyprland
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;re-login and verify:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Hyprland &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Hyprland 0.52.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Included
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Hyprland&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dynamic tiling Wayland compositor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hyprctl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CLI control tool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;hyprpm&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Plugin manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bundled libraries&lt;/strong&gt; (in &lt;code&gt;/usr/libexec/hyprland/vendor/&lt;/code&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;libaquamarine 0.10.0&lt;/li&gt;
&lt;li&gt;libhyprlang 0.6.7&lt;/li&gt;
&lt;li&gt;libhyprutils 0.11.0&lt;/li&gt;
&lt;li&gt;libhyprcursor 0.1.13&lt;/li&gt;
&lt;li&gt;libhyprgraphics 0.4.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;COPR repository:&lt;/strong&gt; &lt;a href="https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/" rel="noopener noreferrer"&gt;https://copr.fedorainfracloud.org/coprs/ashbuk/Hyprland-Fedora/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Source repository (specs):&lt;/strong&gt; &lt;a href="https://github.com/AshBuk/Hyprland-Fedora" rel="noopener noreferrer"&gt;https://github.com/AshBuk/Hyprland-Fedora&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Upstream Hyprland:&lt;/strong&gt; &lt;a href="https://github.com/hyprwm/Hyprland" rel="noopener noreferrer"&gt;https://github.com/hyprwm/Hyprland&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;tech write-up:&lt;/strong&gt; &lt;a href="https://ashbuk.hashnode.dev/hyprland-fedora" rel="noopener noreferrer"&gt;https://ashbuk.hashnode.dev/hyprland-fedora&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>hyprland</category>
      <category>wayland</category>
      <category>linux</category>
    </item>
    <item>
      <title>Use what you build, and ship it as open source</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Tue, 09 Dec 2025 11:46:22 +0000</pubDate>
      <link>https://dev.to/ashbuk/got-my-first-open-source-donation-recently-24md</link>
      <guid>https://dev.to/ashbuk/got-my-first-open-source-donation-recently-24md</guid>
      <description>&lt;p&gt;You can use GitHub as a portfolio or a playground for experiments. But real value rarely extends beyond your own boundaries unless you're building something to meet a real need.&lt;/p&gt;

&lt;p&gt;The most natural approach? Solve your own problem.&lt;/p&gt;

&lt;p&gt;I run Fedora Linux with GNOME and Hyperland as my daily drivers.&lt;/p&gt;

&lt;p&gt;But I needed a speech-to-text (STT) tool. An offline, private "voice keyboard" for everyday desktop interaction — chats, terminal, any window.&lt;/p&gt;

&lt;p&gt;So I built my own.&lt;/p&gt;

&lt;p&gt;It turned out other people needed it too.&lt;br&gt;
&lt;a href="https://github.com/AshBuk/speak-to-ai" rel="noopener noreferrer"&gt;Speak to AI&lt;/a&gt; is now finding its place in the community.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If there’s one takeaway, it’s this: build tools for yourself.&lt;br&gt;
Solve real problems you actually have, use what you build, and ship it as open source.&lt;br&gt;
Sometimes that’s enough for it to matter to others too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9rq7n223gdehxo9dlqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj9rq7n223gdehxo9dlqg.png" alt="Diagram showing offline speech-to-text on GNU/Linux acting as a system-wide voice keyboard" width="800" height="400"&gt;&lt;/a&gt;&amp;gt; Cover image via: &lt;a href="https://hear-me.social/@debby/115588019309116671" rel="noopener noreferrer"&gt;https://hear-me.social/@debby/115588019309116671&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>linux</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>FingerGo Typing Trainer (don't hunt, type!)</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Wed, 03 Dec 2025 12:39:25 +0000</pubDate>
      <link>https://dev.to/ashbuk/stop-hunting-start-typing-fingergo-typing-trainer-3ogp</link>
      <guid>https://dev.to/ashbuk/stop-hunting-start-typing-fingergo-typing-trainer-3ogp</guid>
      <description>&lt;h1&gt;
  
  
  Still Hunting for Keys on Your Keyboard?
&lt;/h1&gt;

&lt;p&gt;Real skill acquisition requires practice. And if you work on a computer, your practice almost always involves typing!&lt;/p&gt;

&lt;p&gt;Believe me — as someone who switched from "hunt-and-peck" typing where you're constantly distracted, glancing at the keyboard, with attention continuously fragmenting, and a low typing speed ceiling (which impacts productivity overall)...&lt;/p&gt;

&lt;p&gt;Our brains naturally take the path of least resistance, leading us to adopt incorrect techniques (whether it's keyboard typing or hand positioning when playing a musical instrument). This becomes both a narrow comfort zone and a limitation — sometimes even causing health issues!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you work on a computer and type frequently (coding, for instance) — don't procrastinate. Start your transition to touch typing. It's a worthwhile investment!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built a dedicated application for this: &lt;a href="https://github.com/AshBuk/FingerGo" rel="noopener noreferrer"&gt;FingerGo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xhrubt0z0tgim9o665j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xhrubt0z0tgim9o665j.png" alt=" " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ✨ Key Advantages
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform&lt;/strong&gt; — Works on Linux, macOS, and Windows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lightweight binary&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Designed to improve typing speed and accuracy&lt;/strong&gt; with a user-friendly and intuitive interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eye-friendly Dark/Light themes&lt;/strong&gt; with customization options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical text/code library&lt;/strong&gt; (plain text and code samples)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity features&lt;/strong&gt;: Shortcuts, Zen Mode, keyboard/stats toggle&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎯 Essential Touch-Typing Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time visual keyboard&lt;/strong&gt; with finger mapping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live statistics&lt;/strong&gt;: WPM, CPM, accuracy, per-key mistakes tracking&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🏗️ Tech Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────┐                    ┌────────────────────────┐
│   GUI LAYER          │◄──── Wails ───────►│  INTERNAL LAYER        │
│   HTML/CSS/JS        │      Bridge        │  Go 1.25+              │
└──────────────────────┘                    └────────────────────────┘
         │                                              │
    Event-Driven                                   Repository
         │                                              │
    ┌────┴─────┐                                   ┌────┴─────┐
    │ EventBus │                                   │ Repos    │
    │ (pub/sub)│                                   │ (DI)     │
    └────┬─────┘                                   └────┬─────┘
         │                                              │
    Modular JS                                    Domain Models
                                                         │
                                                         ▼
                                           ┌─────────────────────┐
                                           │ JSON Storage        │
                                           │ ~/.local/share/...  │
                                           └─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; &lt;a href="https://github.com/golang/go" rel="noopener noreferrer"&gt;Go&lt;/a&gt; 1.25+ with Repository Pattern (DI)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bridge:&lt;/strong&gt; &lt;a href="https://github.com/wailsapp/wails" rel="noopener noreferrer"&gt;Wails v2&lt;/a&gt; provides Go↔JS communication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla &lt;a href="https://github.com/tc39/ecma262" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt; (ES6+) with Event-Driven Architecture (pub/sub EventBus)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage:&lt;/strong&gt; JSON files in XDG directories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platforms:&lt;/strong&gt; &lt;a href="https://kernel.org/" rel="noopener noreferrer"&gt;Linux&lt;/a&gt;, &lt;a href="https://www.apple.com/macos/" rel="noopener noreferrer"&gt;macOS&lt;/a&gt;, &lt;a href="https://www.microsoft.com/windows/" rel="noopener noreferrer"&gt;Windows&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  Architecture Dive on &lt;a href="https://ashbuk.hashnode.dev/fingergo" rel="noopener noreferrer"&gt;ashbuk.hashnode.dev&lt;/a&gt;
&lt;/h4&gt;

&lt;h4&gt;
  
  
  Try It &lt;a href="https://github.com/AshBuk/FingerGo" rel="noopener noreferrer"&gt;https://github.com/AshBuk/FingerGo&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Start your journey to effortless touch typing! Your future self (and your productivity) will thank you.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>productivity</category>
      <category>go</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Go: Learning Journey Through Algorithms</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Wed, 12 Nov 2025 10:02:30 +0000</pubDate>
      <link>https://dev.to/ashbuk/go-learning-journey-through-algorithms-47lg</link>
      <guid>https://dev.to/ashbuk/go-learning-journey-through-algorithms-47lg</guid>
      <description>&lt;p&gt;I've been working with Node.js and its ecosystem. Now I'm diving deep into Go and I'm getting huge enjoyment from its approach — on one hand, simplicity and no syntactic sugar (you can get diabetes from all the sugar in JS, it's too sweet🙃), on the other hand, incredible capabilities and a greater sense of being "close to hardware."&lt;/p&gt;

&lt;p&gt;I decided to document my learning notes in an open repo &lt;a href="https://github.com/AshBuk/dsa-golang" rel="noopener noreferrer"&gt;dsa-golang&lt;/a&gt; — specifically, implementations of classic algorithms in Go. This isn't production code, but educational examples with comments and Big O complexity analysis.&lt;/p&gt;

&lt;p&gt;Sure, there are hundreds of similar repos... so what's the value in opening another one? 👇&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Classic solutions to classic CS problems, without over-engineering or language-specific optimizations, for clear understanding of the algorithm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Meaningful semantic naming&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aiming for simple and idiomatic Go code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Breakdowns and diagrams right in the comments&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's included:
&lt;/h2&gt;

&lt;pre&gt;
&lt;strong&gt;algorithms/&lt;/strong&gt;
├── &lt;strong&gt;search/&lt;/strong&gt;
│   ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/binarysearch/binarysearch.go" rel="noopener noreferrer"&gt;Binary&lt;/a&gt;
│   ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/linearsearch/linearsearch.go" rel="noopener noreferrer"&gt;Linear&lt;/a&gt;
│   ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/jumpsearch/jumpsearch.go" rel="noopener noreferrer"&gt;Jump&lt;/a&gt;
│   ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/bfs/filesystem/bfs.go" rel="noopener noreferrer"&gt;BFS Filesystem&lt;/a&gt; · &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/bfs/graph/bfsqueue/bfsqueue.go" rel="noopener noreferrer"&gt;BFS Graph Queue&lt;/a&gt;
│   └── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/dfs/filesystem/dfs.go" rel="noopener noreferrer"&gt;DFS Filesystem&lt;/a&gt; · &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/dfs/graph/dfsrecursive/dfsrecursive.go" rel="noopener noreferrer"&gt;DFS Graph Recursive&lt;/a&gt; · &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/search/dfs/graph/dfsstack/dfsstack.go" rel="noopener noreferrer"&gt;DFS Graph Stack&lt;/a&gt;
├── &lt;strong&gt;selection/&lt;/strong&gt;
│   └── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/selection/quickselect/quickselect.go" rel="noopener noreferrer"&gt;Quickselect&lt;/a&gt;
└── &lt;strong&gt;sort/&lt;/strong&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/bubblesort/bubblesort.go" rel="noopener noreferrer"&gt;Bubble&lt;/a&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/selectionsort/selectionsort.go" rel="noopener noreferrer"&gt;Selection&lt;/a&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/insertionsort/insertionsort.go" rel="noopener noreferrer"&gt;Insertion&lt;/a&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/mergesort/mergesort.go" rel="noopener noreferrer"&gt;Merge&lt;/a&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/quicksort/quicksort.go" rel="noopener noreferrer"&gt;Quick&lt;/a&gt;
    ├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/quicksortinplace/quicksortinplace.go" rel="noopener noreferrer"&gt;Quick In-Place&lt;/a&gt;
    └── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/algorithms/sort/heapsort/heapsort.go" rel="noopener noreferrer"&gt;Heap&lt;/a&gt;

&lt;strong&gt;datastructures/&lt;/strong&gt;
└── &lt;strong&gt;graph/&lt;/strong&gt;
    └── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/datastructures/graph/adjacencylist.go" rel="noopener noreferrer"&gt;Adjacency List&lt;/a&gt;

&lt;strong&gt;leetcode/&lt;/strong&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/leetcode/twosum/twosum.go" rel="noopener noreferrer"&gt;Two Sum #1&lt;/a&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/leetcode/mergesortedarray/mergesortedarray.go" rel="noopener noreferrer"&gt;Merge Sorted Array #88&lt;/a&gt;
└── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/leetcode/ispalidrome/ispalidrome.go" rel="noopener noreferrer"&gt;Valid Palindrome #125&lt;/a&gt;

&lt;strong&gt;interview_exercises/&lt;/strong&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/interview_exercises/reversestring/reversestring.go" rel="noopener noreferrer"&gt;Reverse&lt;/a&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/interview_exercises/removeduplicates/removeduplicates.go" rel="noopener noreferrer"&gt;Duplicates&lt;/a&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/interview_exercises/removewhitespaces/removewhitespaces.go" rel="noopener noreferrer"&gt;Whitespaces&lt;/a&gt;
└── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/interview_exercises/longestword/longestword.go" rel="noopener noreferrer"&gt;Longest&lt;/a&gt;

&lt;strong&gt;informatica/&lt;/strong&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/informatica/factorial/factorial.go" rel="noopener noreferrer"&gt;Factorial&lt;/a&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/informatica/fibonacci/fibonacci.go" rel="noopener noreferrer"&gt;Fibonacci&lt;/a&gt;
├── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/informatica/isprime/isprime.go" rel="noopener noreferrer"&gt;Prime&lt;/a&gt;
└── &lt;a href="https://github.com/AshBuk/dsa-golang/blob/main/informatica/multitable/multitable.go" rel="noopener noreferrer"&gt;Table&lt;/a&gt;
&lt;/pre&gt;




&lt;p&gt;I'm planning to expand it by adding data structures and more LeetCode problems.&lt;br&gt;
If you're also learning Go or algorithms — I'd be happy if this helps you and to hear your feedback!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/AshBuk/dsa-golang" rel="noopener noreferrer"&gt;github.com/AshBuk/dsa-golang&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>algorithms</category>
      <category>datastructures</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building Spark Slider: From AI Startup to Open Source</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Mon, 20 Oct 2025 14:26:41 +0000</pubDate>
      <link>https://dev.to/ashbuk/building-spark-slider-from-ai-startup-to-open-source-21i4</link>
      <guid>https://dev.to/ashbuk/building-spark-slider-from-ai-startup-to-open-source-21i4</guid>
      <description>&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://spark-slider.vercel.app" rel="noopener noreferrer"&gt;spark-slider.vercel.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/AshBuk/framer-motion-spark-slider" rel="noopener noreferrer"&gt;github.com/AshBuk/framer-motion-spark-slider&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📦 &lt;strong&gt;NPM:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/@ashbuk/spark-slider" rel="noopener noreferrer"&gt;@ashbuk/spark-slider&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;When I first shared &lt;strong&gt;Spark Slider&lt;/strong&gt; with friends, the reaction was the same:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Oh, another React slider.”  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s not entirely wrong — but it’s not the full story either.&lt;/p&gt;

&lt;p&gt;I originally built Spark Slider’s core while working at an AI startup. I wanted something &lt;strong&gt;minimal&lt;/strong&gt;, &lt;strong&gt;fast&lt;/strong&gt;, and &lt;strong&gt;visually fluid&lt;/strong&gt; across laptops, phones, and kiosk screens — without the heavy abstractions of existing libraries like Swiper.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What Makes It Different
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framer Motion animations&lt;/strong&gt; — subtle blur, opacity, and depth transitions create natural focus.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precision drag &amp;amp; swipe&lt;/strong&gt; — smooth, momentum-free control.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility-first&lt;/strong&gt; — full keyboard navigation and ARIA support.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pure CSS&lt;/strong&gt; — no Tailwind dependency, uses &lt;code&gt;svh&lt;/code&gt; / &lt;code&gt;svmin&lt;/code&gt; viewport units.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight core&lt;/strong&gt; — ~12 KB gzipped, works with any React environment.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Under the Hood
&lt;/h2&gt;

&lt;p&gt;The library follows a modular architecture with specialized hooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useSparkSlider&lt;/code&gt; — state &amp;amp; index logic
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSparkFullscreen&lt;/code&gt; — fullscreen mode
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSparkKeyboard&lt;/code&gt; — keyboard input
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useSparkTransforms&lt;/code&gt; — dynamic transforms
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All motion and interaction parameters are defined in a single source of truth:&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/AshBuk/framer-motion-spark-slider/blob/main/src/components/SparkSlider/config.ts" rel="noopener noreferrer"&gt;&lt;code&gt;config.ts&lt;/code&gt;&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
Want to change how it feels? Tweak a few constants — and the slider’s behavior instantly adapts.&lt;/p&gt;




&lt;p&gt;💡 A Thought on Open Source&lt;/p&gt;

&lt;p&gt;It’s a valid takeaway — when a business model changes, it’s easy to just shelve the work and move on.&lt;br&gt;
But making it open source gives that effort a second life — helping others build, learn, and create.&lt;/p&gt;

&lt;p&gt;If this project resonates with you:&lt;/p&gt;

&lt;p&gt;⭐ &lt;strong&gt;&lt;a href="https://github.com/AshBuk/framer-motion-spark-slider" rel="noopener noreferrer"&gt;Star it on GitHub&lt;/a&gt;&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Read the full deep dive on my &lt;a href="https://ashbuk.hashnode.dev/high-performance-framework-agnostic-react-carousel-slider-powered-by-framer-motion" rel="noopener noreferrer"&gt;AshBuk.hashnode.dev&lt;/a&gt; blog&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>react</category>
      <category>typescript</category>
    </item>
    <item>
      <title>🍒 The Cherry on Top of The Deadline</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Wed, 15 Oct 2025 19:21:12 +0000</pubDate>
      <link>https://dev.to/ashbuk/the-cherry-on-top-of-the-deadline-4glb</link>
      <guid>https://dev.to/ashbuk/the-cherry-on-top-of-the-deadline-4glb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“No,” Kenoros corrected him. “We have to learn how to do design more efficiently.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This quote is from &lt;em&gt;The Deadline&lt;/em&gt; by &lt;strong&gt;Tom DeMarco&lt;/strong&gt; — one of my favorite books, and this is one of my favorite takeaways from it. That small &lt;em&gt;printer’s ornament&lt;/em&gt; at the bottom of the page is not just decoration — it’s the cherry on top 🍒&lt;/p&gt;

&lt;p&gt;In this scene, Mr. Tompkins meets &lt;em&gt;the first programmer of Morovia&lt;/em&gt;, &lt;strong&gt;Kenoros Aristotle&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
They talk about the process of creating software... and Kenoros looks at it not from the perspective of &lt;em&gt;improving&lt;/em&gt; processes, but from &lt;strong&gt;reduction&lt;/strong&gt; — how to &lt;strong&gt;reduce&lt;/strong&gt; the amount of work while increasing quality and speed.&lt;/p&gt;

&lt;p&gt;The book was written and published in the ’90s, but even in the age of AI this takeaway is absolutely relevant.&lt;br&gt;&lt;br&gt;
Planning software design and crafting &lt;strong&gt;specs&lt;/strong&gt; (digital artifacts) is essential — and discussing them with AI can be both fun and useful.&lt;/p&gt;

&lt;p&gt;Later, Kenoros calls &lt;em&gt;high-level design&lt;/em&gt; just &lt;em&gt;hand-waving&lt;/em&gt;, and suggests doing &lt;strong&gt;real design&lt;/strong&gt; — &lt;em&gt;low-level design&lt;/em&gt; — not “on the fly” while coding, but &lt;strong&gt;during the planning stage&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Otherwise, iterative refactoring and endless debugging are inevitable...&lt;em&gt;(which, to be honest, they usually are anyway)&lt;/em&gt;😄&lt;/p&gt;

&lt;p&gt;Obviously, this level of design skill is possible for engineers who have already planned and built many systems.&lt;br&gt;&lt;br&gt;
As for me, to start forming &lt;em&gt;low-level design&lt;/em&gt; specs, I usually need to sit down with the code that’s already being developed from the &lt;em&gt;high-level spec&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;💭 What about you?&lt;/p&gt;

</description>
      <category>designsystem</category>
      <category>architecture</category>
      <category>software</category>
      <category>books</category>
    </item>
  </channel>
</rss>
