<?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>Forem: Asher Buk</title>
    <description>The latest articles on Forem by Asher Buk (@ashbuk).</description>
    <link>https://forem.com/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>Forem: Asher Buk</title>
      <link>https://forem.com/ashbuk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashbuk"/>
    <language>en</language>
    <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://forem.com/ashbuk/system-wide-stt-for-linux-speak-to-ai-2f63</link>
      <guid>https://forem.com/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://forem.com/ashbuk/software-craftsmanship-the-three-hidden-pillars-pee</link>
      <guid>https://forem.com/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://forem.com/ashbuk/hyprland-0530-for-fedora-1afm</link>
      <guid>https://forem.com/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://forem.com/ashbuk/screen-sharing-for-hyprland-on-fedora-43-1di</link>
      <guid>https://forem.com/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://forem.com/ashbuk/hyprland-0522-for-fedora-clean-copr-build-24hm</link>
      <guid>https://forem.com/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://forem.com/ashbuk/got-my-first-open-source-donation-recently-24md</link>
      <guid>https://forem.com/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://forem.com/ashbuk/stop-hunting-start-typing-fingergo-typing-trainer-3ogp</link>
      <guid>https://forem.com/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://forem.com/ashbuk/go-learning-journey-through-algorithms-47lg</link>
      <guid>https://forem.com/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://forem.com/ashbuk/building-spark-slider-from-ai-startup-to-open-source-21i4</link>
      <guid>https://forem.com/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://forem.com/ashbuk/the-cherry-on-top-of-the-deadline-4glb</link>
      <guid>https://forem.com/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>
    <item>
      <title>I Built an Offline Voice Typing App for Linux - Speak to AI</title>
      <dc:creator>Asher Buk</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:47:07 +0000</pubDate>
      <link>https://forem.com/ashbuk/i-built-an-offline-voice-typing-app-for-linux-speak-to-ai-3ab5</link>
      <guid>https://forem.com/ashbuk/i-built-an-offline-voice-typing-app-for-linux-speak-to-ai-3ab5</guid>
      <description>
  


&lt;p&gt;&lt;a href="https://github.com/AshBuk/speak-to-ai" rel="noopener noreferrer"&gt;https://github.com/AshBuk/speak-to-ai&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Despite the existence of various voice-to-text applications, I couldn't find a suitable solution for my daily use on my Linux OS. Therefore, I decided to create and share my open-source project with the community. &lt;strong&gt;Speak to AI is&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;100% offline&lt;/strong&gt; — uses Whisper locally, no cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works everywhere&lt;/strong&gt; — editors, browsers, terminals, AI chats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global hotkeys&lt;/strong&gt; — press, speak, release&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Linux&lt;/strong&gt; — supports X11 and Wayland&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppImage&lt;/strong&gt; — download and run, no installation&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Go for the core app (fast, small binary)&lt;/li&gt;
&lt;li&gt;whisper.cpp for speech recognition (via CGO)&lt;/li&gt;
&lt;li&gt;evdev/D-Bus for global hotkeys&lt;/li&gt;
&lt;li&gt;xdotool/ydotool for keyboard simulation&lt;/li&gt;
&lt;li&gt;PulseAudio/PipeWire for audio capture&lt;/li&gt;
&lt;li&gt;WebSocket API for integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Hard Parts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;X11 vs Wayland:&lt;/strong&gt; Different typing mechanisms. Solution: detect environment and use appropriate method.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audio permissions:&lt;/strong&gt; Global hotkeys need &lt;code&gt;input&lt;/code&gt; group membership. Clear docs help users set this up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model size:&lt;/strong&gt; Whisper models are big. Using quantized &lt;code&gt;small quantize&lt;/code&gt; model balances speed and accuracy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Storage: 277.2MB (whisper small q5 model, dependencies, go-binary)&lt;/li&gt;
&lt;li&gt;Memory: ~300MB RAM during operation&lt;/li&gt;
&lt;li&gt;&amp;lt;1s latency for short phrases&lt;/li&gt;
&lt;li&gt;90%+ accuracy for clear speech&lt;/li&gt;
&lt;li&gt;Works across different Linux DEs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In-depth look at system design and technical hurdles: &lt;a href="https://ashbuk.hashnode.dev/an-offline-voice-to-text-solution-for-linux-users-using-whispercpp-and-go" rel="noopener noreferrer"&gt;AshBuk.hashnode.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/AshBuk/speak-to-ai" rel="noopener noreferrer"&gt;https://github.com/AshBuk/speak-to-ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>privacy</category>
      <category>go</category>
    </item>
  </channel>
</rss>
