<?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: Igor Giamoniano</title>
    <description>The latest articles on DEV Community by Igor Giamoniano (@igorgbr).</description>
    <link>https://dev.to/igorgbr</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F641821%2F4cc36f3d-9e91-42fc-87fe-a5af8a741178.jpeg</url>
      <title>DEV Community: Igor Giamoniano</title>
      <link>https://dev.to/igorgbr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/igorgbr"/>
    <language>en</language>
    <item>
      <title>I built a Pix library for Elixir (and one cent proved it works)</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Tue, 29 Sep 2026 00:31:02 +0000</pubDate>
      <link>https://dev.to/igorgbr/i-built-a-pix-library-for-elixir-and-one-cent-proved-it-works-41p2</link>
      <guid>https://dev.to/igorgbr/i-built-a-pix-library-for-elixir-and-one-cent-proved-it-works-41p2</guid>
      <description>&lt;p&gt;Over the last few months I became a bit of a compulsive open source contributor. Translating Linux kernel documentation into Portuguese, a merged PR in &lt;a href="https://github.com/uutils/coreutils" rel="noopener noreferrer"&gt;uutils/coreutils&lt;/a&gt;, a few fixes in Elixir libraries I had used before. Always the same routine: find a problem in someone else's project, understand it, fix it, wait for review.&lt;/p&gt;

&lt;p&gt;Then a different itch showed up: instead of fixing other people's libraries, build my own.&lt;/p&gt;

&lt;p&gt;This post is about that. How I built &lt;code&gt;pix_brcode&lt;/code&gt;, a Pix library for Elixir, over a weekend, tested it with real money (R$ 0.01, don't judge me) and published it on Hex. And about the bug that only showed up once a real bank got involved.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2f9wtjd27qzeh8rvkcc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe2f9wtjd27qzeh8rvkcc.png" alt="Github print" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Pix, and why a library for it
&lt;/h2&gt;

&lt;p&gt;If you're not from Brazil, you've probably never heard of Pix. It's the instant payment system created by Brazil's Central Bank in 2020, and it took over the country: it's free for individuals, settles in seconds, works 24/7, and today it's how Brazilians pay for everything from coffee to rent.&lt;/p&gt;

&lt;p&gt;Most Pix payments start with a QR code, or with its text version, the &lt;em&gt;"copia e cola"&lt;/em&gt; (copy and paste) code: a long string starting with &lt;code&gt;000201&lt;/code&gt; that you paste into your bank app. Everyone uses it every day, and almost nobody knows what's inside it.&lt;/p&gt;

&lt;p&gt;In the JavaScript world this is a solved problem: &lt;a href="https://www.npmjs.com/package/pix-utils" rel="noopener noreferrer"&gt;&lt;code&gt;pix-utils&lt;/code&gt;&lt;/a&gt; on npm generates and parses Pix codes and gets over 60k downloads a month. I went looking for the equivalent on &lt;a href="https://hex.pm" rel="noopener noreferrer"&gt;Hex&lt;/a&gt;, Elixir's package manager, and couldn't find a maintained one.&lt;/p&gt;

&lt;p&gt;So I put the two things together: a big, mature library to use as a reference, and an empty spot in the ecosystem I wanted to fill. I decided to build a "pix-utils" for Hex, or, as I preferred to call it, &lt;code&gt;pix_brcode&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside a Pix code
&lt;/h2&gt;

&lt;p&gt;That string is a &lt;strong&gt;BR Code&lt;/strong&gt;: an international payment QR code standard (EMVCo's QR Code Specification, Merchant-Presented Mode) with Pix-specific fields.&lt;/p&gt;

&lt;p&gt;The structure is simpler than it looks. Everything is &lt;strong&gt;TLV&lt;/strong&gt;: a 2-digit ID, a 2-digit length, then the value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00 02 01                       → payload format: "01"
26 58 0014br.gov.bcb.pix0136…  → Pix account (with subfields inside!)
52 04 0000                     → merchant category
53 03 986                      → currency: Brazilian real
54 04 0.01                     → amount
58 02 BR                       → country
59 04 Igor                     → receiver name
60 09 Sao Paulo                → city
62 07 0503***                  → txid (transaction id)
63 04 F6CE                     → CRC16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at field &lt;code&gt;26&lt;/code&gt;: its value is &lt;strong&gt;another TLV&lt;/strong&gt;, holding the Pix identifier (&lt;code&gt;br.gov.bcb.pix&lt;/code&gt;) and the key. TLV inside TLV.&lt;/p&gt;

&lt;p&gt;And the last field, &lt;code&gt;63&lt;/code&gt;, is a &lt;strong&gt;CRC16&lt;/strong&gt;: a checksum over everything before it. If someone copies the code missing one character, the CRC doesn't match and the bank app rejects it.&lt;/p&gt;

&lt;p&gt;(Important side note: a CRC is not security. It catches accidental errors, not fraud. Anyone can recompute it.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The decisions that made the weekend worth it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Zero dependencies
&lt;/h3&gt;

&lt;p&gt;Installing &lt;code&gt;pix_brcode&lt;/code&gt; pulls in nothing else. That had a cost: Erlang only ships CRC32, so the CRC16 was written by hand in about 20 lines, using Elixir's binary pattern matching:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;crc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;binary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Enum&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bxor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;byte&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;crc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;defp&lt;/span&gt; &lt;span class="n"&gt;crc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;acc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding a dependency for 20 lines would be trading a small problem for a permanent one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Money is never a float
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;pix-utils&lt;/code&gt; takes the amount as a JavaScript &lt;code&gt;number&lt;/code&gt;, which is a float. And floats with money are how you end up seeing &lt;code&gt;0.1 + 0.2 = 0.30000000000000004&lt;/code&gt; on someone's bill.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;pix_brcode&lt;/code&gt;, the amount is either an &lt;strong&gt;integer in cents&lt;/strong&gt; (&lt;code&gt;1050&lt;/code&gt; becomes &lt;code&gt;"10.50"&lt;/code&gt;) or an exact string (&lt;code&gt;"10.50"&lt;/code&gt;). The conversion is done on text, with no division at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strict in what you send, liberal in what you accept
&lt;/h3&gt;

&lt;p&gt;When generating, the library is strict: a name longer than 25 characters is an error instead of being silently truncated (imagine the payer's bank app showing the wrong name). When parsing, it accepts whitespace and line breaks around the code, because real copy-and-paste comes dirty from WhatsApp.&lt;/p&gt;

&lt;p&gt;That principle has a name, Postel's law. And it was about to be tested sooner than I expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The moment of truth: real money
&lt;/h2&gt;

&lt;p&gt;Tests passing, Credo clean, docs generated. Only one test left that really matters: &lt;strong&gt;a bank app accepting the code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The first try failed in all three banks I tested. Itaú, Nubank and Mercado Pago: "Invalid QR Code".&lt;/p&gt;

&lt;p&gt;For a minute I thought the weekend was wasted. It wasn't: I had used a made-up Pix key. When you paste a static Pix code, the app looks the key up in the Central Bank's directory. Unknown key, rejected code. The test was wrong, not the library.&lt;/p&gt;

&lt;p&gt;I generated it again with my real Itaú random key and an amount of one cent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="no"&gt;PixBrcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(%{&lt;/span&gt;&lt;span class="ss"&gt;key:&lt;/span&gt; &lt;span class="s2"&gt;"my-real-key"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;amount:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="ss"&gt;merchant_name:&lt;/span&gt; &lt;span class="s2"&gt;"Igor"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;merchant_city:&lt;/span&gt; &lt;span class="s2"&gt;"Sao Paulo"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pasted it into Nubank. My name showed up, R$ 0.01. Paid. It landed in my Itaú account instantly.&lt;/p&gt;

&lt;p&gt;The best-invested cent of my life.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug no test caught
&lt;/h2&gt;

&lt;p&gt;The reverse path was still missing: generate a code &lt;strong&gt;in the bank app&lt;/strong&gt; and parse it with the library. Pix &amp;gt; Receive on Nubank, copy, paste into the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;PixBrcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"00020126580014BR.GOV.BCB.PIX0136…"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:invalid_gui&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;BR.GOV.BCB.PIX&lt;/code&gt;. In uppercase.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.bcb.gov.br/estabilidadefinanceira/pix" rel="noopener noreferrer"&gt;Central Bank's manual&lt;/a&gt; writes &lt;code&gt;br.gov.bcb.pix&lt;/code&gt; in lowercase, and the library compared the exact text. Nubank sends it uppercase. So does Itaú. All my tests passed because they all followed the manual to the letter, and the banks don't.&lt;/p&gt;

&lt;p&gt;The fix was one line: compare case-insensitively when parsing, and keep generating lowercase, as the manual says. Postel again: strict in what you send, liberal in what you accept.&lt;/p&gt;

&lt;p&gt;The real codes showed other differences too: Nubank includes the postal code (field &lt;code&gt;61&lt;/code&gt;) and puts part of the account holder's tax ID in the receiver name; Itaú doesn't. The library's tests now use payloads with the same layout as the real ones, but with fake data. (Your partial tax ID in a public repo is not a great idea, and I learned that before making the mistake.)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; the spec is the minimum. Real systems have variations that only show up with real data.&lt;/p&gt;

&lt;h2&gt;
  
  
  A second opinion before publishing
&lt;/h2&gt;

&lt;p&gt;Before pushing to Hex, I had an AI agent do an independent code review: a fresh session, with no context from the development, reading everything from scratch. Nothing blocked the release, but it came back with four good findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the amount field didn't enforce the spec's 13-character limit;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;decode(nil)&lt;/code&gt; raised an exception, while the README promised always &lt;code&gt;{:ok, _}&lt;/code&gt; or &lt;code&gt;{:error, _}&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;text with invalid bytes also crashed the library;&lt;/li&gt;
&lt;li&gt;emoji in the name got through, and since each emoji takes several bytes, the length declared in the TLV was wrong for other parsers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four were fixed before v0.1.0. Name, city and description must now be ASCII after removing accents (&lt;code&gt;São João&lt;/code&gt; becomes &lt;code&gt;Sao Joao&lt;/code&gt;, and ☕ is an error).&lt;/p&gt;

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

&lt;p&gt;v0.1.0 generates and parses static and dynamic Pix codes, validates keys (tax IDs, phone, e-mail, random key) and runs CI on three Elixir versions. Next on the list: typespecs, more tolerant key parsing and a CHANGELOG. And there's another idea in the queue: Brazilian &lt;em&gt;boleto&lt;/em&gt; bank slips, which also have no package on Hex.&lt;/p&gt;

&lt;p&gt;If you work with Elixir and Pix, try the library and tell me what breaks. Issues and PRs are very welcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hex: &lt;a href="https://hex.pm/packages/pix_brcode" rel="noopener noreferrer"&gt;hex.pm/packages/pix_brcode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://hexdocs.pm/pix_brcode" rel="noopener noreferrer"&gt;hexdocs.pm/pix_brcode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/igorgbr/pix_brcode" rel="noopener noreferrer"&gt;github.com/igorgbr/pix_brcode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixing other people's libraries taught me to read code. Building my own taught me that the manual is only the start of the conversation.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post was originally published in Portuguese on &lt;a href="https://coisadedevacademy.com.br/biblioteca-pix-elixir-pix-brcode/" rel="noopener noreferrer"&gt;Coisa de Dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>elixir</category>
      <category>opensource</category>
      <category>payments</category>
      <category>showdev</category>
    </item>
    <item>
      <title>The bug nobody fixed for 4 years (and how it got me my first Contributor badge)</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Tue, 01 Sep 2026 22:35:52 +0000</pubDate>
      <link>https://dev.to/igorgbr/the-bug-nobody-fixed-for-4-years-and-how-it-got-me-my-first-contributor-badge-4b8f</link>
      <guid>https://dev.to/igorgbr/the-bug-nobody-fixed-for-4-years-and-how-it-got-me-my-first-contributor-badge-4b8f</guid>
      <description>&lt;p&gt;Have you ever opened the issues tab of an open source project, stared at the list, and closed it?&lt;/p&gt;

&lt;p&gt;I have. More than once.&lt;/p&gt;

&lt;p&gt;The feeling is always the same: "this is for grown-ups, I'm not good enough to touch it". So you close the tab, go back to your side project, and contributing becomes something you'll do when you're "ready".&lt;/p&gt;

&lt;p&gt;Spoiler: you'll never be ready. I started by fixing a footer that broke on mobile.&lt;/p&gt;




&lt;h2&gt;
  
  
  The project and the bug
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjwug3qmlysqq5x8jj58w.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjwug3qmlysqq5x8jj58w.png" alt="TimeConv Banner" width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ArjunSharda/TimeConv" rel="noopener noreferrer"&gt;TimeConv&lt;/a&gt; is a simple time converter: you give it a date and it hands you back UTC, seconds, or whatever timezone you asked for. Static site, hand-written HTML and CSS, no framework.&lt;/p&gt;

&lt;p&gt;Issue &lt;a href="https://github.com/ArjunSharda/TimeConv/issues/41" rel="noopener noreferrer"&gt;#41&lt;/a&gt; said the footer broke on mobile. Opened in &lt;strong&gt;August 2022&lt;/strong&gt;. Four people passed through it over the years, diagnosed the problem, agreed with the diagnosis...&lt;/p&gt;

&lt;p&gt;And not one of them opened a PR.&lt;/p&gt;

&lt;p&gt;That's the kind of issue I recommend if you're starting out: old, already diagnosed by other people, and with nobody working on it. Half the work is done and the odds of duplicating someone's effort are low.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CSS bug that wasn't a CSS bug
&lt;/h2&gt;

&lt;p&gt;The original code did this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;footer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;absolute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15vh&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Absolutely positioned footer, pinned to the bottom. Works beautifully — until the page has enough content to scroll. Then the footer floats in the middle of your text, because &lt;code&gt;bottom: 0&lt;/code&gt; is relative to the viewport, not to the content.&lt;/p&gt;

&lt;p&gt;The modern fix is the flexbox sticky footer: make &lt;code&gt;body&lt;/code&gt; a flex column with &lt;code&gt;min-height: 100vh&lt;/code&gt;, and give the footer &lt;code&gt;margin-top: auto&lt;/code&gt;, which pushes it into whatever space is left over.&lt;/p&gt;

&lt;p&gt;I swapped it, tested it, and... two pages didn't budge.&lt;/p&gt;

&lt;p&gt;Here's the part I didn't see coming, and the most useful thing I took from this contribution: &lt;strong&gt;&lt;code&gt;margin-top: auto&lt;/code&gt; only pushes an element if it's a direct child of the flex container.&lt;/strong&gt; In &lt;code&gt;credits.html&lt;/code&gt; the footer sat four levels deep inside a &lt;code&gt;.row&lt;/code&gt; — which is a horizontal flex container. And in &lt;code&gt;utcsecondstodatetime.html&lt;/code&gt; it was literally outside &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So I opened the HTML of those two files and found a duplicated &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;, orphan &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;s, and tags closing out of order. The file was broken badly enough that &lt;code&gt;prettier&lt;/code&gt; couldn't even parse it.&lt;/p&gt;

&lt;p&gt;Which means: the issue was filed as a CSS bug, and no amount of CSS was ever going to fix it without touching the HTML. That's why four people diagnosed it and nobody shipped — the diagnosis was only half right.&lt;/p&gt;

&lt;p&gt;Final PR: &lt;strong&gt;7 files, 175 lines added, 174 removed.&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmu4prbdfa9hyj9r6k5kn.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmu4prbdfa9hyj9r6k5kn.png" alt="github PR" width="768" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The red check that almost killed it
&lt;/h2&gt;

&lt;p&gt;PR opened, and CI lights up: &lt;code&gt;Lint Code Base&lt;/code&gt; failed.&lt;/p&gt;

&lt;p&gt;The beginner reflex (mine included) is to run &lt;code&gt;prettier --write&lt;/code&gt; across the repo and push everything green. Don't. That would have added ~138 lines of reindentation to a 7-file PR, and the reviewer would have had to separate the fix from the formatting.&lt;/p&gt;

&lt;p&gt;What I did instead was pull the original files from &lt;code&gt;main&lt;/code&gt; and run the linter against them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx prettier &lt;span class="nt"&gt;--check&lt;/span&gt; docs/
npx htmlhint docs/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: the &lt;strong&gt;original&lt;/strong&gt; files already failed. And &lt;code&gt;utcsecondstodatetime.html&lt;/code&gt; on &lt;code&gt;main&lt;/code&gt; didn't even parse. htmlhint reported 18 errors on the original versus 0 on mine.&lt;/p&gt;

&lt;p&gt;I posted that in the PR, with the output from both sides. That is precisely what unblocked the merge — the maintainer could see the red was inherited instead of taking my word for it.&lt;/p&gt;

&lt;p&gt;It's a rule for me now:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An inherited red check gets explained with reproduced evidence, not fixed by growing the PR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three weeks after opening it (and one polite ping along the way, because maintainers of small projects do go quiet), I got an "Awesome, LGTM!" and the merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands on: test a static site in 30 seconds
&lt;/h2&gt;

&lt;p&gt;No Node, no build step, nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ArjunSharda/TimeConv.git
&lt;span class="nb"&gt;cd &lt;/span&gt;TimeConv/docs
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;http://localhost:8000&lt;/code&gt;, hit F12, turn on the device toolbar and test at 320, 375 and 768 pixels wide. Test one short page and one long page — a footer bug only shows up in one of them.&lt;/p&gt;

&lt;p&gt;That's the entire test loop for a static-site contribution. Really.&lt;/p&gt;

&lt;h2&gt;
  
  
  "But that's just CSS, it doesn't count"
&lt;/h2&gt;

&lt;p&gt;It counts. And let me lay out both sides, because this choice is yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small project.&lt;/strong&gt; Upside: the maintainer actually reads your PR, the codebase fits in your head, and you get to close the full issue → PR → merge loop, which is where the learning lives. Downside: little reach, sometimes an inactive maintainer, and a process too informal to teach you rigor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Large project.&lt;/strong&gt; Upside: serious CI, hard review, documented conventions — you learn the craft. Downside: long review queues, and a real chance someone fixes the bug before you do (that happened to me on another project, and it's an article of its own).&lt;/p&gt;

&lt;p&gt;I don't think there's a right side. I think starting small and moving up is kinder to your motivation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;Seven files, 175 lines added, zero lines of complex logic. Result: a Contributor badge and a four-year-old issue closed.&lt;/p&gt;

&lt;p&gt;What was blocking that issue wasn't technical difficulty. It was that nobody had opened the HTML.&lt;/p&gt;

&lt;p&gt;Your turn: open the issues tab of a project you actually use, filter by &lt;code&gt;is:issue is:open sort:created-asc&lt;/code&gt;, and look at the oldest ones. One of them is waiting for somebody to open the file.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7tax5pvxiqn5te0321w.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft7tax5pvxiqn5te0321w.png" alt="Github query" width="767" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you do it, brace yourself for one thing: &lt;strong&gt;the merge isn't the end.&lt;/strong&gt; After mine landed I got excited and kept poking around the site — and while testing the pages in the browser, I noticed the converters only worked once. A second conversion needed a page reload.&lt;/p&gt;

&lt;p&gt;There were two bugs. They hid each other, with a side effect that pushed whatever the user typed straight into their browser history.&lt;/p&gt;

&lt;p&gt;That's the next article.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Author's note:&lt;/strong&gt; this was my first contribution to TimeConv, merged in August 2026. I'm documenting every open source contribution I make in this series. If you contribute to open source too, I'd like to hear about it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ArjunSharda/TimeConv" rel="noopener noreferrer"&gt;TimeConv on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ArjunSharda/TimeConv/issues/41" rel="noopener noreferrer"&gt;Issue #41 — Website is not responsive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ArjunSharda/TimeConv/pull/63" rel="noopener noreferrer"&gt;PR #63 — make footer sticky and layout responsive on mobile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_flexible_box_layout/Basic_concepts_of_flexbox" rel="noopener noreferrer"&gt;MDN — Basic concepts of flexbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://css-tricks.com/couple-takes-sticky-footer/" rel="noopener noreferrer"&gt;CSS Tricks — Sticky footer, five ways&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>css</category>
    </item>
    <item>
      <title>Cava segfaulting inside WezTerm (Flatpak)? Diagnosis and fix in one command</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Fri, 12 Jun 2026 18:06:04 +0000</pubDate>
      <link>https://dev.to/igorgbr/cava-segfaulting-inside-wezterm-flatpak-diagnosis-and-fix-in-one-command-2h6m</link>
      <guid>https://dev.to/igorgbr/cava-segfaulting-inside-wezterm-flatpak-diagnosis-and-fix-in-one-command-2h6m</guid>
      <description>&lt;p&gt;&lt;code&gt;cava&lt;/code&gt; runs fine in any terminal — but inside WezTerm installed via Flatpak it crashes with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Segmentation fault (core dumped)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that's what brought you here, the quick fix is right below. The full diagnosis comes after, for those who want to understand why.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ TL;DR — Fix in two commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak update org.wezfurlong.wezterm
flatpak override &lt;span class="nt"&gt;--user&lt;/span&gt; org.wezfurlong.wezterm &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close &lt;strong&gt;all&lt;/strong&gt; WezTerm windows and reopen it. &lt;code&gt;cava&lt;/code&gt; should work normally now.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Security tradeoff:&lt;/strong&gt; &lt;code&gt;--device=all&lt;/code&gt; grants WezTerm access to &lt;em&gt;all&lt;/em&gt; system devices — including camera and microphone, not just audio. If that's a concern in your environment, the safer alternative is to use the native WezTerm build, which doesn't have this restriction by design.&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%2Fvo9r00rlh0tl6dfbx8j1.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%2Fvo9r00rlh0tl6dfbx8j1.png" alt="WezTerm with Cava Working" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 What's happening under the hood
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does WezTerm Flatpak cause the crash?
&lt;/h3&gt;

&lt;p&gt;Flatpak runs WezTerm inside a sandbox that isolates the process from the host system. &lt;code&gt;cava&lt;/code&gt; tries to enumerate available audio devices (ALSA/PipeWire) right at startup — without access to those device nodes, it receives an invalid pointer and segfaults.&lt;/p&gt;

&lt;p&gt;That's why other terminals (GNOME Terminal, Kitty, etc.) don't have this problem: they have unrestricted access to the system. &lt;code&gt;--device=all&lt;/code&gt; fixes exactly that: it grants access to the audio device nodes &lt;code&gt;cava&lt;/code&gt; needs to initialize.&lt;/p&gt;

&lt;p&gt;As a secondary hypothesis (not directly confirmed), the sandbox may also modify environment variables that &lt;code&gt;cava&lt;/code&gt; uses to detect the audio backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirming with GDB
&lt;/h3&gt;

&lt;p&gt;Want to see the full backtrace? Expand here.&lt;/p&gt;

&lt;p&gt;Inside WezTerm, run:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gdb cava
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;When prompted, accept debuginfod with &lt;code&gt;y&lt;/code&gt;. Then:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;(gdb) run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;When the crash occurs:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;(gdb) bt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The output should look something like this:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Program received signal SIGSEGV, Segmentation fault.
__strncmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:283
283             VMOVU   (%rdi), %ymm0
(gdb) bt
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;0  __strncmp_avx2 &lt;span class="o"&gt;()&lt;/span&gt; at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:283
&lt;span class="gp"&gt;#&lt;/span&gt;1  0x0000555555559cfe &lt;span class="k"&gt;in &lt;/span&gt;main &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;argc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;, &lt;span class="nv"&gt;argv&lt;/span&gt;&lt;span class="o"&gt;=)&lt;/span&gt;
&lt;span class="go"&gt;    at /usr/src/debug/cava-0.10.2-7.fc44.x86_64/cava.c:297
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The crash happens inside &lt;code&gt;__strncmp_avx2&lt;/code&gt; — a glibc string comparison function — called by &lt;code&gt;cava&lt;/code&gt; at line 297. The pointer passed in is null or points to invalid memory, which indicates that &lt;code&gt;cava&lt;/code&gt; failed to retrieve valid information about the audio devices and segfaulted when trying to use it.&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%2Fr4dupdue2m28h6xb026b.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%2Fr4dupdue2m28h6xb026b.png" alt="gdb output" width="787" height="458"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Step-by-step fix
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Update your packages
&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 upgrade cava          &lt;span class="c"&gt;# Fedora&lt;/span&gt;
flatpak update org.wezfurlong.wezterm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Grant device access
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak override &lt;span class="nt"&gt;--user&lt;/span&gt; org.wezfurlong.wezterm &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Fully restart WezTerm
&lt;/h3&gt;

&lt;p&gt;Close all windows and reopen. &lt;code&gt;Ctrl+Shift+R&lt;/code&gt; &lt;strong&gt;is not enough&lt;/strong&gt; — Flatpak permission changes only take effect after a full restart.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test it
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cava
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Working? You're done. If not, see the alternatives below.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖱️ Alternative: Flatseal
&lt;/h2&gt;

&lt;p&gt;Prefer a GUI for managing Flatpak permissions?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak &lt;span class="nb"&gt;install &lt;/span&gt;flathub com.github.tchx84.Flatseal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open Flatseal → select &lt;strong&gt;WezTerm&lt;/strong&gt; → go to the &lt;strong&gt;Device&lt;/strong&gt; section → enable &lt;strong&gt;All devices&lt;/strong&gt; → restart WezTerm. The result is identical to the command above.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ If it still doesn't work
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Audio service not running:&lt;/strong&gt; check if PipeWire is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; status pipewire
&lt;span class="c"&gt;# If inactive:&lt;/span&gt;
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; start pipewire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rendering issue:&lt;/strong&gt; add this to your &lt;code&gt;~/.wezterm.lua&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Software"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ This option may cause slowness or even prevent WezTerm from opening on some systems. Use with caution.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔄 Last resort: native WezTerm
&lt;/h2&gt;

&lt;p&gt;If nothing works — or if the &lt;code&gt;--device=all&lt;/code&gt; tradeoff isn't acceptable — the native build solves it definitively: no sandbox, no device restrictions.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://wezterm.org/install/linux.html#__tabbed_1_2" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; covers all options: AppImage, &lt;code&gt;.deb&lt;/code&gt;/&lt;code&gt;.rpm&lt;/code&gt; packages, and building from source.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Keeps Flatpak?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flatpak override --device=all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⭐ Low&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flatseal (GUI)&lt;/td&gt;
&lt;td&gt;⭐ Low&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Check PipeWire&lt;/td&gt;
&lt;td&gt;⭐⭐ Medium&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;front_end = "Software"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐ Medium&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install native build&lt;/td&gt;
&lt;td&gt;⭐⭐ Medium&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The root cause is the Flatpak sandbox blocking &lt;code&gt;cava&lt;/code&gt;'s access to audio device nodes at startup. Releasing that access with &lt;code&gt;--device=all&lt;/code&gt; resolves it in almost every case — and you keep all the benefits of Flatpak.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;📝 Based on real experience on Fedora 44+ with WezTerm (Flatpak) and cava 0.10.2.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>linux</category>
      <category>tooling</category>
      <category>terminal</category>
      <category>flatpak</category>
    </item>
    <item>
      <title>Cava com segfault no WezTerm (Flatpak)? Diagnóstico e solução em um comando</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Fri, 12 Jun 2026 17:49:28 +0000</pubDate>
      <link>https://dev.to/igorgbr/cava-com-segfault-no-wezterm-flatpak-diagnostico-e-solucao-em-um-comando-5g7o</link>
      <guid>https://dev.to/igorgbr/cava-com-segfault-no-wezterm-flatpak-diagnostico-e-solucao-em-um-comando-5g7o</guid>
      <description>&lt;p&gt;O &lt;code&gt;cava&lt;/code&gt; roda normalmente em qualquer terminal — mas dentro do WezTerm instalado via Flatpak ele morre com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Segmentation fault (core dumped)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você chegou aqui com esse problema, a solução rápida está logo abaixo. O diagnóstico detalhado vem depois, para quem quiser entender o porquê.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ TL;DR — Solução em dois comandos
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak update org.wezfurlong.wezterm
flatpak override &lt;span class="nt"&gt;--user&lt;/span&gt; org.wezfurlong.wezterm &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 O que está acontecendo por baixo dos panos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Por que o WezTerm Flatpak causa o crash?
&lt;/h3&gt;

&lt;p&gt;O Flatpak roda o WezTerm dentro de um sandbox que isola o processo do sistema hospedeiro. O &lt;code&gt;cava&lt;/code&gt; tenta enumerar os dispositivos de áudio disponíveis (ALSA/PipeWire) logo na inicialização — sem acesso a esses nós de dispositivo, recebe um ponteiro inválido e segfaulta.&lt;/p&gt;

&lt;p&gt;É por isso que outros terminais (GNOME Terminal, Kitty, etc.) não têm o problema: eles têm acesso irrestrito ao sistema. O &lt;code&gt;--device=all&lt;/code&gt; resolve exatamente isso: libera o acesso aos dispositivos de áudio que o &lt;code&gt;cava&lt;/code&gt; precisa para inicializar.&lt;/p&gt;

&lt;p&gt;Como hipótese secundária (não confirmada diretamente), o sandbox também pode modificar variáveis de ambiente que o &lt;code&gt;cava&lt;/code&gt; usa para detectar o backend de áudio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Confirmando com GDB
&lt;/h3&gt;

&lt;p&gt;Quer ver o backtrace completo? Expanda aqui.&lt;/p&gt;

&lt;p&gt;Dentro do WezTerm, execute:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gdb cava
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Quando aparecer a pergunta, aceite o debuginfod com &lt;code&gt;y&lt;/code&gt;. Depois:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;(gdb) run
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Ao ocorrer a falha:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;(gdb) bt
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;A saída deve ser parecida com esta:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Program received signal SIGSEGV, Segmentation fault.
__strncmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:283
283             VMOVU   (%rdi), %ymm0
(gdb) bt
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;0  __strncmp_avx2 &lt;span class="o"&gt;()&lt;/span&gt; at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:283
&lt;span class="gp"&gt;#&lt;/span&gt;1  0x0000555555559cfe &lt;span class="k"&gt;in &lt;/span&gt;main &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;argc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;, &lt;span class="nv"&gt;argv&lt;/span&gt;&lt;span class="o"&gt;=)&lt;/span&gt;
&lt;span class="go"&gt;    at /usr/src/debug/cava-0.10.2-7.fc44.x86_64/cava.c:297
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;O crash ocorre em &lt;code&gt;__strncmp_avx2&lt;/code&gt; — uma função de comparação de strings da glibc — chamada pelo &lt;code&gt;cava&lt;/code&gt; na linha 297. O ponteiro passado é nulo ou aponta para memória inválida, o que indica que &lt;code&gt;cava&lt;/code&gt; não conseguiu obter informações válidas sobre os dispositivos de áudio e segfaultou ao tentar usá-las.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Solução passo a passo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Atualize os pacotes
&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 upgrade cava          &lt;span class="c"&gt;# Fedora&lt;/span&gt;
flatpak update org.wezfurlong.wezterm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Conceda acesso a dispositivos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak override &lt;span class="nt"&gt;--user&lt;/span&gt; org.wezfurlong.wezterm &lt;span class="nt"&gt;--device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Reinicie o WezTerm completamente
&lt;/h3&gt;

&lt;p&gt;Feche todas as janelas e reabra. &lt;code&gt;Ctrl+Shift+R&lt;/code&gt; &lt;strong&gt;não&lt;/strong&gt; é suficiente — a permissão do Flatpak só entra em vigor com um reinício completo.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Teste
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cava
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🎉 Funcionou? Pronto. Se não, veja as alternativas abaixo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🖱️ Alternativa: Flatseal
&lt;/h2&gt;

&lt;p&gt;Prefere uma interface gráfica para gerenciar permissões do Flatpak?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flatpak &lt;span class="nb"&gt;install &lt;/span&gt;flathub com.github.tchx84.Flatseal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abra o Flatseal → selecione &lt;strong&gt;WezTerm&lt;/strong&gt; → seção &lt;strong&gt;Device&lt;/strong&gt; → ative &lt;strong&gt;All devices&lt;/strong&gt; → reinicie o WezTerm. O resultado é idêntico ao comando anterior.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Se ainda não funcionar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Serviço de áudio inativo:&lt;/strong&gt; verifique se o PipeWire está rodando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; status pipewire
&lt;span class="c"&gt;# Se inativo:&lt;/span&gt;
systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; start pipewire
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Problema de renderização:&lt;/strong&gt; adicione ao &lt;code&gt;~/.wezterm.lua&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight lua"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Software"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Esta opção pode causar lentidão ou impedir o WezTerm de abrir em alguns sistemas. Use com cautela.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔄 Último recurso: versão nativa do WezTerm
&lt;/h2&gt;

&lt;p&gt;Se nada funcionar — ou se o tradeoff do &lt;code&gt;--device=all&lt;/code&gt; não for aceitável — a versão nativa resolve definitivamente: sem sandbox, sem restrições de dispositivo.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://wezterm.org/install/linux.html#__tabbed_1_2" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; cobre todas as opções: AppImage, pacotes &lt;code&gt;.deb&lt;/code&gt;/&lt;code&gt;.rpm&lt;/code&gt; e compilação do fonte.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Resumo
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Solução&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;th&gt;Mantém Flatpak?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;flatpak override --device=all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⭐ Baixa&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flatseal (GUI)&lt;/td&gt;
&lt;td&gt;⭐ Baixa&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verificar PipeWire&lt;/td&gt;
&lt;td&gt;⭐⭐ Média&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;front_end = "Software"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;⭐⭐ Média&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instalar versão nativa&lt;/td&gt;
&lt;td&gt;⭐⭐ Média&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A causa é o sandbox do Flatpak bloqueando o acesso do &lt;code&gt;cava&lt;/code&gt; aos dispositivos de áudio na inicialização. Liberar esse acesso com &lt;code&gt;--device=all&lt;/code&gt; resolve em quase todos os casos — e você mantém todas as vantagens do Flatpak.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;📝 Tutorial baseado em experiência real no Fedora 44+ com WezTerm (Flatpak) e cava 0.10.2.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>linux</category>
      <category>terminal</category>
      <category>flatpak</category>
      <category>fedora</category>
    </item>
    <item>
      <title>How to Remove Orphan Linux Boot Entries from Windows 11 UEFI</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Tue, 14 Apr 2026 14:06:05 +0000</pubDate>
      <link>https://dev.to/igorgbr/how-to-remove-orphan-linux-boot-entries-from-windows-11-uefi-6d</link>
      <guid>https://dev.to/igorgbr/how-to-remove-orphan-linux-boot-entries-from-windows-11-uefi-6d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Level:&lt;/strong&gt; Intermediate&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Estimated Time:&lt;/strong&gt; 15–20 minutes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Operating System:&lt;/strong&gt; Windows 11 (UEFI systems)&lt;/p&gt;


&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;After replacing a Linux installation (such as Pop!_OS, Ubuntu, or Arch Linux) with Windows 11, old boot entries may remain visible in UEFI firmware.&lt;/p&gt;

&lt;p&gt;This happens because UEFI boot configuration is stored in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EFI System Partition (ESP)
&lt;/li&gt;
&lt;li&gt;UEFI NVRAM boot entries
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both must be cleaned.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Before you start&lt;/strong&gt;: Backup your data. Modifying the EFI partition or NVRAM entries can make your system unbootable if done incorrectly.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Technical Background
&lt;/h2&gt;
&lt;h3&gt;
  
  
  EFI System Partition (ESP)
&lt;/h3&gt;

&lt;p&gt;The EFI System Partition (ESP) is a FAT32-formatted partition that stores the bootloaders for all installed operating systems. On Windows systems, it typically ranges from 100–500 MB in size and is labeled as "System".&lt;/p&gt;

&lt;p&gt;Typical structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EFI/
├── Microsoft/
├── Boot/
├── pop_os/
├── systemd/
├── ubuntu/
└── linux/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Do NOT remove:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft/&lt;/li&gt;
&lt;li&gt;Boot/&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  NVRAM Boot Entries
&lt;/h3&gt;

&lt;p&gt;UEFI firmware stores boot entries in non-volatile memory.&lt;/p&gt;

&lt;p&gt;Each entry contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GUID identifier&lt;/li&gt;
&lt;li&gt;Description&lt;/li&gt;
&lt;li&gt;Path to EFI loader&lt;/li&gt;
&lt;li&gt;Device reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Removing EFI files does not remove NVRAM entries.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Mount EFI Partition
&lt;/h2&gt;

&lt;p&gt;Open Command Prompt as Administrator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diskpart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;list disk
select disk 0
list partition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Replace &lt;code&gt;0&lt;/code&gt; with your system disk number.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;select partition 1
assign letter=Z
exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Replace &lt;code&gt;1&lt;/code&gt; with the EFI partition (~100–500 MB, Type: System)&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 2 — Remove Linux Bootloader Files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Z:
cd \EFI
dir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remove Linux folders:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rmdir /s /q systemd
rmdir /s /q pop_os
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/s&lt;/code&gt; → removes directories recursively&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/q&lt;/code&gt; → quiet mode (no confirmation)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Permission Errors
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;takeown /f systemd /r /d y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/f&lt;/code&gt; → target folder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/r&lt;/code&gt; → recursive&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/d y&lt;/code&gt; → auto confirm&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 On Portuguese Windows, use &lt;code&gt;/d s&lt;/code&gt; instead of &lt;code&gt;/d y&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;icacls systemd /grant Administrators:F /t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rmdir /s /q systemd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3 — Remove NVRAM Boot Entries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 List firmware entries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bcdedit /enum firmware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Firmware Application (101fffff)
-------------------------------
identifier              {29c75bf6-3303-11f1-b7f4-e7fe7d8485ec}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\systemd\systemd-bootx64.efi
description             Pop!_OS

Firmware Application (101fffff)
-------------------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Identify entries to remove
&lt;/h3&gt;

&lt;p&gt;Remove entries that reference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;systemd&lt;/li&gt;
&lt;li&gt;pop_os&lt;/li&gt;
&lt;li&gt;ubuntu&lt;/li&gt;
&lt;li&gt;linux&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3 Delete orphan entry
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bcdedit /delete {29c75bf6-3303-11f1-b7f4-e7fe7d8485ec} /f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/f&lt;/code&gt; → force deletion without confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ NEVER delete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{bootmgr}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{current}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 4 — Remove drive letter
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;diskpart
select disk 0
select partition 1
remove letter=Z
exit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem 1 — Access denied
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;takeown /f systemd /r /d y
icacls systemd /grant Administrators:F /t
rmdir /s /q systemd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Problem 2 — delete fails
&lt;/h3&gt;

&lt;p&gt;Possible causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entry already removed&lt;/li&gt;
&lt;li&gt;firmware protected entry&lt;/li&gt;
&lt;li&gt;invalid reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reboot&lt;/li&gt;
&lt;li&gt;remove EFI files first&lt;/li&gt;
&lt;li&gt;run again&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Problem 3 — entry still appears
&lt;/h3&gt;

&lt;p&gt;Possible causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;firmware cache&lt;/li&gt;
&lt;li&gt;fallback recreated&lt;/li&gt;
&lt;li&gt;BIOS bug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solutions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reboot twice&lt;/li&gt;
&lt;li&gt;load BIOS defaults&lt;/li&gt;
&lt;li&gt;update BIOS&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Problem 4 — Windows does not boot
&lt;/h3&gt;

&lt;p&gt;Method 1 — Startup Repair&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Boot Windows installer USB
&lt;/li&gt;
&lt;li&gt;Repair your computer
&lt;/li&gt;
&lt;li&gt;Startup Repair
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Method 2 — Recovery Command Prompt&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bcdboot C:\Windows /s Z: /f UEFI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Commands Used
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Documentation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;diskpart&lt;/td&gt;
&lt;td&gt;Disk and partition management&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-server/administration/windows-commands/diskpart" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-server/administration/windows-commands/diskpart&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bcdedit&lt;/td&gt;
&lt;td&gt;Manage firmware boot entries&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-hardware/drivers/devtest/bcdedit" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-hardware/drivers/devtest/bcdedit&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;takeown&lt;/td&gt;
&lt;td&gt;Take ownership of files&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-server/administration/windows-commands/takeown" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-server/administration/windows-commands/takeown&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;icacls&lt;/td&gt;
&lt;td&gt;Modify permissions&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-server/administration/windows-commands/icacls" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-server/administration/windows-commands/icacls&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rmdir&lt;/td&gt;
&lt;td&gt;Remove directories&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-server/administration/windows-commands/rmdir" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-server/administration/windows-commands/rmdir&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bcdboot&lt;/td&gt;
&lt;td&gt;Rebuild Windows bootloader&lt;/td&gt;
&lt;td&gt;&lt;a href="https://learn.microsoft.com/windows-hardware/manufacture/desktop/bcdboot-command-line-options" rel="noopener noreferrer"&gt;https://learn.microsoft.com/windows-hardware/manufacture/desktop/bcdboot-command-line-options&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Version Notes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Changes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Initial procedure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.1&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Added EFI explanation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Added NVRAM cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.3&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Added troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Added command table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Added recovery section&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;April 2026&lt;/td&gt;
&lt;td&gt;Safety and locale improvements&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;✅ Quick Checklist (click to expand)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Backup completed&lt;/li&gt;
&lt;li&gt;[ ] Disk/Partition numbers verified&lt;/li&gt;
&lt;li&gt;[ ] Microsoft/ and Boot/ preserved&lt;/li&gt;
&lt;li&gt;[ ] {bootmgr} and {current} not deleted&lt;/li&gt;
&lt;li&gt;[ ] Drive letter removed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tested Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows 11 24H2&lt;/li&gt;
&lt;li&gt;UEFI firmware&lt;/li&gt;
&lt;li&gt;GPT disk&lt;/li&gt;
&lt;li&gt;Pop!_OS systemd-boot&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;Backup before modifying EFI partition.&lt;br&gt;
Verify disk and partition numbers carefully.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Diagnosing Multiple GPUs on Linux: How to Detect and Monitor Integrated and Dedicated GPUs</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Sun, 15 Mar 2026 00:13:40 +0000</pubDate>
      <link>https://dev.to/igorgbr/diagnosing-multiple-gpus-on-linux-how-to-detect-and-monitor-integrated-and-dedicated-gpus-47c3</link>
      <guid>https://dev.to/igorgbr/diagnosing-multiple-gpus-on-linux-how-to-detect-and-monitor-integrated-and-dedicated-gpus-47c3</guid>
      <description>&lt;p&gt;If you run Linux on a system with both an &lt;strong&gt;integrated GPU&lt;/strong&gt; and a &lt;strong&gt;dedicated GPU&lt;/strong&gt;, you may have noticed something strange: some monitoring tools only show one GPU.&lt;/p&gt;

&lt;p&gt;This situation is common on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;laptops with hybrid graphics&lt;/li&gt;
&lt;li&gt;desktops with iGPU + dedicated GPU&lt;/li&gt;
&lt;li&gt;systems using different driver stacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a monitoring tool like &lt;strong&gt;btop&lt;/strong&gt; might show your AMD integrated GPU but completely ignore your NVIDIA card.&lt;/p&gt;

&lt;p&gt;In this article we will walk through how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detect all GPUs installed in your system&lt;/li&gt;
&lt;li&gt;verify that the correct drivers are loaded&lt;/li&gt;
&lt;li&gt;identify which GPU is rendering your desktop&lt;/li&gt;
&lt;li&gt;monitor usage for each GPU&lt;/li&gt;
&lt;li&gt;automate the entire diagnostic process with a small script&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Linux systems with multiple GPUs may behave differently depending on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;installed drivers (open source vs proprietary)&lt;/li&gt;
&lt;li&gt;kernel configuration&lt;/li&gt;
&lt;li&gt;which GPU is configured as the primary renderer&lt;/li&gt;
&lt;li&gt;monitoring tool capabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example setup used in this article:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AMD Vega (integrated)&lt;/strong&gt; — Ryzen 5 5600G
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA GTX 1050 Ti (dedicated)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this configuration, &lt;code&gt;btop&lt;/code&gt; showed only the AMD GPU while the NVIDIA card remained invisible in the default monitoring view.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1 — Check if Both GPUs Are Detected
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 List GPUs via PCI
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; vga
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti]
09:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If two entries appear, your &lt;strong&gt;hardware is being detected correctly&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1.2 Check Loaded Drivers
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lsmod | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'nvidia|amdgpu|radeon'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical modules:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;GPU&lt;/th&gt;
&lt;th&gt;Kernel Module&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVIDIA&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;nvidia&lt;/code&gt;, &lt;code&gt;nvidia_drm&lt;/code&gt;, &lt;code&gt;nvidia_modeset&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD (modern)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;amdgpu&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD (legacy)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;radeon&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If the modules appear, the &lt;strong&gt;drivers are loaded by the kernel&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  1.3 Check Which GPU Is Rendering Your Desktop
&lt;/h3&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;glxinfo | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"OpenGL renderer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OpenGL renderer string: NVIDIA GeForce GTX 1050 Ti
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If &lt;code&gt;glxinfo&lt;/code&gt; is missing, install it.&lt;/p&gt;

&lt;p&gt;Ubuntu / Debian:&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="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;mesa-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Arch Linux:&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="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; mesa-utils
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This command reveals &lt;strong&gt;which GPU is rendering the graphical session&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In hybrid setups, the integrated GPU often renders the desktop while the dedicated GPU activates only for demanding workloads.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2 — Monitoring Each GPU
&lt;/h2&gt;
&lt;h3&gt;
  
  
  2.1 Integrated GPU (AMD / Intel) — Using btop
&lt;/h3&gt;

&lt;p&gt;Launch:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;btop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Inside &lt;code&gt;btop&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;press &lt;strong&gt;g&lt;/strong&gt; to toggle GPU views&lt;/li&gt;
&lt;li&gt;press &lt;strong&gt;5 / 6 / 7&lt;/strong&gt; for specific GPU panels&lt;/li&gt;
&lt;li&gt;configure via &lt;strong&gt;F2 → Options → CPU box → Show GPU info&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2.2 NVIDIA Dedicated GPU — Using nvidia-smi
&lt;/h2&gt;

&lt;p&gt;For NVIDIA GPUs the official tool is the most reliable:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;watch &lt;span class="nt"&gt;-n&lt;/span&gt; 1 nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This updates every second and displays:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPU utilization&lt;/li&gt;
&lt;li&gt;memory usage&lt;/li&gt;
&lt;li&gt;running processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Structured output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvidia-smi &lt;span class="nt"&gt;--query-gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;name,memory.used,memory.total,utilization.gpu &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv &lt;span class="nt"&gt;-l&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Automating GPU Diagnostics
&lt;/h2&gt;

&lt;p&gt;Create a script called:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;check_gpus.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Script:&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;#!/bin/bash&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== GPUs Detected ==="&lt;/span&gt;
lspci | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"VGA|3D"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;=== Loaded Drivers ==="&lt;/span&gt;
lsmod | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"nvidia|amdgpu|radeon"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;=== NVIDIA GPU ==="&lt;/span&gt;
nvidia-smi &lt;span class="nt"&gt;--query-gpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;name,memory.total &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;csv 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NVIDIA not detected"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;=== Rendering GPU ==="&lt;/span&gt;
glxinfo | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"OpenGL renderer"&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"glxinfo not available"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;=== DRM Devices ==="&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; /sys/class/drm | &lt;span class="nb"&gt;grep &lt;/span&gt;card
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Make executable:&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="nb"&gt;chmod&lt;/span&gt; +x check_gpus.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./check_gpus.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This quickly shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;detected GPUs&lt;/li&gt;
&lt;li&gt;active drivers&lt;/li&gt;
&lt;li&gt;rendering GPU&lt;/li&gt;
&lt;li&gt;NVIDIA status&lt;/li&gt;
&lt;li&gt;DRM device nodes&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Recommended Tools Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;GPU Type&lt;/th&gt;
      &lt;th&gt;Recommended Tool&lt;/th&gt;
      &lt;th&gt;Command&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;AMD / Intel (integrated)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;btop&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;btop&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;NVIDIA (dedicated)&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;watch -n 1 nvidia-smi&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Hardware detection&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;lspci&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;lspci | grep -i vga&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Rendering check&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;glxinfo&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;&lt;code&gt;glxinfo | grep "OpenGL renderer"&lt;/code&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Working with multiple GPUs on Linux doesn't have to be confusing.&lt;/p&gt;

&lt;p&gt;Using the commands shown above you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verify hardware detection&lt;/li&gt;
&lt;li&gt;confirm driver loading&lt;/li&gt;
&lt;li&gt;identify which GPU renders your desktop&lt;/li&gt;
&lt;li&gt;monitor GPU usage in real time&lt;/li&gt;
&lt;li&gt;automate diagnostics with a small script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different GPU stacks require different tools, but combining a few commands provides &lt;strong&gt;full visibility into your graphics subsystem&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Additional Resources
&lt;/h1&gt;

&lt;p&gt;btop documentation&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/aristocratos/btop" rel="noopener noreferrer"&gt;https://github.com/aristocratos/btop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NVIDIA System Management Interface&lt;br&gt;&lt;br&gt;
&lt;a href="https://developer.nvidia.com/nvidia-system-management-interface" rel="noopener noreferrer"&gt;https://developer.nvidia.com/nvidia-system-management-interface&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arch Linux Wiki — NVIDIA&lt;br&gt;&lt;br&gt;
&lt;a href="https://wiki.archlinux.org/title/NVIDIA" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/NVIDIA&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Rescuing Legacy Hardware: Installing Linux on Early UEFI Systems (Debian 13 Case Study)</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Sat, 31 Jan 2026 02:36:03 +0000</pubDate>
      <link>https://dev.to/igorgbr/rescuing-legacy-hardware-installing-linux-on-early-uefi-systems-debian-13-case-study-e3e</link>
      <guid>https://dev.to/igorgbr/rescuing-legacy-hardware-installing-linux-on-early-uefi-systems-debian-13-case-study-e3e</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Modern Linux installers increasingly assume fully compliant UEFI firmware. On early-generation UEFI systems (circa 2011–2013), this assumption often breaks. This article documents a real-world case where Debian 13, installed in Legacy (MBR + GRUB i386-pc) mode, proved to be the most reliable solution.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Context: When a Simple Reinstall Fails
&lt;/h2&gt;

&lt;p&gt;A Lenovo QiTian M435E (2012), equipped with a Kingston SV300S3 SSD and early-generation UEFI firmware, suffered an OS corruption after an electrical incident. The expected fix — reinstalling Linux — turned into a multi-distro debugging session.&lt;/p&gt;

&lt;p&gt;Several modern distributions completed installation successfully but failed to boot afterward, even when configuration steps appeared correct.&lt;/p&gt;




&lt;h2&gt;
  
  
  Early UEFI Is Not Modern UEFI
&lt;/h2&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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D9119999155364460438" 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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D9119999155364460438" alt="QiTian M435E" width="900" height="879"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The QiTian M435E provides firmware options labeled "UEFI Only" and "Legacy Only". However, this system uses an early UEFI implementation common in pre-2014 corporate hardware.&lt;/p&gt;

&lt;p&gt;Characteristics of this class of firmware include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partial or unstable EFI variable (NVRAM) support&lt;/li&gt;
&lt;li&gt;Inconsistent handling of GPT + EFI System Partitions&lt;/li&gt;
&lt;li&gt;Unreliable interaction with modern GRUB EFI targets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, systems may technically support UEFI while failing to boot reliably with contemporary Linux installers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Several Modern Distros Failed
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ubuntu 24.04 / Linux Mint 22 / Zorin OS 17
&lt;/h3&gt;

&lt;p&gt;These distributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Default to GPT partitioning&lt;/li&gt;
&lt;li&gt;Assume a functional EFI System Partition&lt;/li&gt;
&lt;li&gt;Install GRUB primarily in x86_64-efi mode&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On early UEFI systems, this results in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing or ignored boot entries&lt;/li&gt;
&lt;li&gt;Firmware failing to locate EFI binaries&lt;/li&gt;
&lt;li&gt;Systems reporting "No operating system found"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This behavior is not a bug but a consequence of architectural assumptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Debian 13 Worked
&lt;/h2&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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D5813726813604479930" 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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D5813726813604479930" alt="Debian 13 (Trixie)" width="900" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Debian 13 (Trixie) maintains robust support for legacy boot paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Honors MBR (msdos) partition tables when disks are clean&lt;/li&gt;
&lt;li&gt;Installs GRUB using the i386-pc target when booted in Legacy mode&lt;/li&gt;
&lt;li&gt;Does not require an EFI System Partition in BIOS/Legacy setups&lt;/li&gt;
&lt;li&gt;Explicitly asks where GRUB should be installed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This results in a predictable, firmware-compatible boot chain.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tested Installation Procedure (Legacy Mode)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.debian.org/download" rel="noopener noreferrer"&gt;debian-13.x-amd64-netinst.iso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Firmware set to Legacy Only&lt;/li&gt;
&lt;li&gt;Secure Boot and UEFI disabled&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disk Preparation
&lt;/h3&gt;

&lt;p&gt;Ensure the disk uses MBR, not GPT:&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="nb"&gt;sudo &lt;/span&gt;wipefs &lt;span class="nt"&gt;-a&lt;/span&gt; /dev/sda
&lt;span class="nb"&gt;sudo &lt;/span&gt;parted /dev/sda mklabel msdos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installation
&lt;/h3&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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D8590496137216518818" 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%2Fcoderlegion.com%2F%3Fqa%3Dblob%26qa_blobid%3D8590496137216518818" alt="Guided – use entire disk" width="900" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose: Guided – use entire disk&lt;/li&gt;
&lt;li&gt;Filesystem: ext4&lt;/li&gt;
&lt;li&gt;Avoid separate /boot partitions&lt;/li&gt;
&lt;li&gt;Confirm GRUB installation to /dev/sda (not /dev/sda1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Internally, Debian executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;grub-install &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;i386-pc &lt;span class="nt"&gt;--boot-directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/boot /dev/sda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Technical Takeaway
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Debian 13&lt;/th&gt;
&lt;th&gt;Modern Ubuntu-based Distros&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Partition table&lt;/td&gt;
&lt;td&gt;Respects MBR&lt;/td&gt;
&lt;td&gt;Defaults to GPT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GRUB target&lt;/td&gt;
&lt;td&gt;i386-pc&lt;/td&gt;
&lt;td&gt;x86_64-efi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EFI requirement&lt;/td&gt;
&lt;td&gt;Not required&lt;/td&gt;
&lt;td&gt;Assumed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firmware tolerance&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low on early UEFI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Legacy and early-UEFI systems are not obsolete — they are underserved. Debian 13 remains one of the few mainstream distributions that still treats non-modern firmware as a first-class scenario rather than an edge case.&lt;/p&gt;

&lt;p&gt;For environments with pre-2014 hardware, predictability often matters more than novelty.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.debian.org/devel/debian-installer/" rel="noopener noreferrer"&gt;Debian Installer Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.gnu.org/software/grub/manual/grub/grub.html" rel="noopener noreferrer"&gt;GNU GRUB Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/System_time" rel="noopener noreferrer"&gt;Arch Linux Wiki — System Time &amp;amp; Boot Modes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>debian</category>
      <category>opensource</category>
      <category>learning</category>
    </item>
    <item>
      <title>🛡️ Securing Clawdbot (Moltbot): Essential Hardening for AI Agents with System Access</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Wed, 28 Jan 2026 19:08:52 +0000</pubDate>
      <link>https://dev.to/igorgbr/securing-clawdbot-moltbot-essential-hardening-for-ai-agents-with-system-access-3cha</link>
      <guid>https://dev.to/igorgbr/securing-clawdbot-moltbot-essential-hardening-for-ai-agents-with-system-access-3cha</guid>
      <description>&lt;h2&gt;
  
  
  ⚠️ Why Security Is Non-Negotiable with Agentic AI
&lt;/h2&gt;

&lt;p&gt;Unlike chatbots, Clawdbot (now Moltbot) runs &lt;strong&gt;locally with direct system access&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
That means it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read and write files
&lt;/li&gt;
&lt;li&gt;Execute shell commands
&lt;/li&gt;
&lt;li&gt;Control browsers and sessions
&lt;/li&gt;
&lt;li&gt;Access credentials and tokens
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns it into an &lt;strong&gt;AI-powered automation layer over your entire machine&lt;/strong&gt; — which is powerful, but also extremely risky if misconfigured.&lt;/p&gt;

&lt;p&gt;Think of it less like “installing an app” and more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Adding a new sysadmin to your system that never sleeps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article covers &lt;strong&gt;practical steps to reduce attack surface and prevent full system compromise.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ 1. Use a Separate Machine or Environment
&lt;/h2&gt;

&lt;p&gt;Never install Clawdbot on your main personal computer.&lt;/p&gt;

&lt;p&gt;Recommended options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud VPS (AWS, Hetzner, DigitalOcean)
&lt;/li&gt;
&lt;li&gt;Old laptop used only for automation
&lt;/li&gt;
&lt;li&gt;Mini PC / home lab server
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If the agent is compromised, your personal data, banking info and passwords stay isolated.&lt;/p&gt;

&lt;p&gt;Treat it like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Work phone vs personal phone&lt;br&gt;&lt;br&gt;
Dev server vs production workstation&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  ✅ 2. Create Separate Accounts for the Bot
&lt;/h2&gt;

&lt;p&gt;Never reuse your personal accounts.&lt;/p&gt;

&lt;p&gt;Create new:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email address
&lt;/li&gt;
&lt;li&gt;Telegram account
&lt;/li&gt;
&lt;li&gt;WhatsApp account (if used)
&lt;/li&gt;
&lt;li&gt;API keys and service accounts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Even if the bot leaks credentials, it cannot pivot into your real digital identity.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ 3. Restrict Who Can Message the Bot
&lt;/h2&gt;

&lt;p&gt;When setting up chat integrations, choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Pairing mode (manual approval)
&lt;/li&gt;
&lt;li&gt;or at least ✅ Allowlist
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;❌ Never use &lt;strong&gt;Open mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents strangers from sending commands
&lt;/li&gt;
&lt;li&gt;Blocks prompt injection through chat platforms
&lt;/li&gt;
&lt;li&gt;Reduces social engineering attack vectors
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chat is an input surface — treat it like an API endpoint.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ 4. Lock Down the Gateway WebSocket (Local Auth)
&lt;/h2&gt;

&lt;p&gt;Clawdbot exposes a local control panel via WebSocket.&lt;/p&gt;

&lt;p&gt;Set authentication:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;gateway&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;token"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then generate a token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot doctor &lt;span class="nt"&gt;--generate-gateway-token&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;This protects:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control dashboard
&lt;/li&gt;
&lt;li&gt;Settings modification
&lt;/li&gt;
&lt;li&gt;Plugin configuration
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this, anyone on your network could potentially access the agent interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 5. Enable Logging and Redact Sensitive Data
&lt;/h2&gt;

&lt;p&gt;Turn on logging — but safely.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;logging&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redactSensitive&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools"&lt;/span&gt;
  &lt;span class="na"&gt;redactPatterns&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;API_KEY=.*"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization:.*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor what the agent is doing
&lt;/li&gt;
&lt;li&gt;Investigate abnormal behavior
&lt;/li&gt;
&lt;li&gt;Avoid leaking secrets into log files
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Never log raw prompts and outputs without redaction in production-like setups.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 6. Include Security Rules in the System Prompt
&lt;/h2&gt;

&lt;p&gt;Add explicit behavioral constraints in the agent system prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Security Rules
- Never share directory listings or file paths with strangers
- Never reveal API keys, credentials, or infrastructure details
- Verify requests that modify system configuration with the owner
- When in doubt, ask before acting
- Private info stays private, even from "friends"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This helps reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt injection impact
&lt;/li&gt;
&lt;li&gt;Accidental dangerous actions
&lt;/li&gt;
&lt;li&gt;Overly autonomous decisions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security should be layered: &lt;strong&gt;config + prompt + infrastructure&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 7. Run the Built-In Security Audit
&lt;/h2&gt;

&lt;p&gt;Clawdbot includes a security scanner.&lt;/p&gt;

&lt;p&gt;Run regularly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot security audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To automatically apply fixes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;clawdbot security audit &lt;span class="nt"&gt;--fix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It checks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway exposure
&lt;/li&gt;
&lt;li&gt;Browser control exposure
&lt;/li&gt;
&lt;li&gt;Dangerous permissions
&lt;/li&gt;
&lt;li&gt;Weak allowlists
&lt;/li&gt;
&lt;li&gt;Filesystem access scope
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This should be part of your maintenance routine.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 8. Keep Models and Plugins Up to Date
&lt;/h2&gt;

&lt;p&gt;Use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latest supported models
&lt;/li&gt;
&lt;li&gt;Updated plugins only
&lt;/li&gt;
&lt;li&gt;Remove unused integrations
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why newer models matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better resistance to prompt injection
&lt;/li&gt;
&lt;li&gt;Improved tool-use boundaries
&lt;/li&gt;
&lt;li&gt;Fewer jailbreak patterns
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outdated models are easier to exploit.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚨 Warning Signs Your System May Be Compromised
&lt;/h2&gt;

&lt;p&gt;Watch for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bot performing actions you didn’t request
&lt;/li&gt;
&lt;li&gt;Files disappearing or changing
&lt;/li&gt;
&lt;li&gt;Messages sent you didn’t write
&lt;/li&gt;
&lt;li&gt;Strange shell history entries
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stop the bot immediately
&lt;/li&gt;
&lt;li&gt;Rotate all credentials
&lt;/li&gt;
&lt;li&gt;Audit accessed files
&lt;/li&gt;
&lt;li&gt;Rebuild environment if needed
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With full system access, recovery must be treated seriously.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Agentic AI is incredibly powerful — but we are effectively giving software:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shell access
&lt;/li&gt;
&lt;li&gt;Memory
&lt;/li&gt;
&lt;li&gt;Autonomy
&lt;/li&gt;
&lt;li&gt;Network connectivity
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not casual tooling.&lt;/p&gt;

&lt;p&gt;If configured properly, Clawdbot can be a game‑changing automation platform.&lt;br&gt;&lt;br&gt;
If misconfigured, it can become a &lt;strong&gt;single‑point‑of‑failure for your entire digital life&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the next article, we’ll walk through:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Installing Clawdbot + Telegram integration + DeepSeek API step by step in a safer setup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Stay safe and automate responsibly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>security</category>
    </item>
    <item>
      <title>🚨 ClawdBot (Moltbot): Powerful AI Agents, Real Automation… and Real Risks</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Wed, 28 Jan 2026 17:42:16 +0000</pubDate>
      <link>https://dev.to/igorgbr/clawdbot-moltbot-powerful-ai-agents-real-automation-and-real-risks-1155</link>
      <guid>https://dev.to/igorgbr/clawdbot-moltbot-powerful-ai-agents-real-automation-and-real-risks-1155</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Open-source AI agents that can actually &lt;em&gt;do things&lt;/em&gt; are finally here.&lt;br&gt;&lt;br&gt;
And that changes everything — for better &lt;strong&gt;and&lt;/strong&gt; for worse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the last few months, a project originally called &lt;strong&gt;ClawdBot&lt;/strong&gt; — now renamed to &lt;strong&gt;Moltbot&lt;/strong&gt; — has gone viral across tech communities.&lt;/p&gt;

&lt;p&gt;People are using it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send emails automatically&lt;/li&gt;
&lt;li&gt;Interact with Telegram and WhatsApp&lt;/li&gt;
&lt;li&gt;Control browsers&lt;/li&gt;
&lt;li&gt;Run shell commands&lt;/li&gt;
&lt;li&gt;Manage files and workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: this is not just another chatbot.&lt;br&gt;&lt;br&gt;
This is an &lt;strong&gt;autonomous AI agent with full system access&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that is both incredible… and dangerous.&lt;/p&gt;

&lt;p&gt;Let’s break down why.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is ClawdBot / Moltbot?
&lt;/h2&gt;

&lt;p&gt;ClawdBot (now Moltbot) is an &lt;strong&gt;open‑source AI agent framework&lt;/strong&gt; designed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run locally on your machine or server&lt;/li&gt;
&lt;li&gt;Maintain long‑term context&lt;/li&gt;
&lt;li&gt;Execute real actions instead of just generating text&lt;/li&gt;
&lt;li&gt;Integrate with messaging apps like Telegram and WhatsApp&lt;/li&gt;
&lt;li&gt;Control browsers, files, and system commands&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project’s tagline is literally:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The AI that actually does things.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And it delivers on that promise.&lt;/p&gt;

&lt;p&gt;Unlike traditional chatbots, Moltbot can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read and write files&lt;/li&gt;
&lt;li&gt;Execute shell commands&lt;/li&gt;
&lt;li&gt;Open websites&lt;/li&gt;
&lt;li&gt;Send messages on your behalf&lt;/li&gt;
&lt;li&gt;Chain multiple actions together autonomously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it extremely powerful for automation, productivity, and experimentation with agentic AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Did It Go Viral?
&lt;/h2&gt;

&lt;p&gt;Most AI tools today are still limited by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API boundaries&lt;/li&gt;
&lt;li&gt;Sandbox environments&lt;/li&gt;
&lt;li&gt;Strict permission models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moltbot removes many of those barriers by design.&lt;/p&gt;

&lt;p&gt;It behaves more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a digital assistant living inside your computer&lt;br&gt;&lt;br&gt;
than a chatbot living inside a browser tab.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For developers and power users, that is incredibly appealing.&lt;/p&gt;

&lt;p&gt;You can build agents that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitor systems&lt;/li&gt;
&lt;li&gt;Interact with services&lt;/li&gt;
&lt;li&gt;Perform multi‑step tasks&lt;/li&gt;
&lt;li&gt;React to real‑world events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It feels like the future of AI agents — and in many ways, it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  But Here’s the Problem: Full System Access
&lt;/h2&gt;

&lt;p&gt;Moltbot doesn’t just &lt;em&gt;simulate&lt;/em&gt; actions.&lt;/p&gt;

&lt;p&gt;It can have access to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your filesystem&lt;/li&gt;
&lt;li&gt;Your terminal&lt;/li&gt;
&lt;li&gt;Your browser with saved sessions&lt;/li&gt;
&lt;li&gt;Your environment variables&lt;/li&gt;
&lt;li&gt;Your credentials&lt;/li&gt;
&lt;li&gt;Your personal messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Security researchers and engineers have been very clear about this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Running an AI agent with shell access on your machine is… spicy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that’s not fear‑mongering — it’s basic threat modeling.&lt;/p&gt;

&lt;p&gt;If something goes wrong, the blast radius is &lt;strong&gt;your entire system&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Could Go Wrong?
&lt;/h2&gt;

&lt;p&gt;Here are some realistic risk scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔓 Prompt Injection
&lt;/h3&gt;

&lt;p&gt;If your agent receives malicious instructions through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messages&lt;/li&gt;
&lt;li&gt;Websites&lt;/li&gt;
&lt;li&gt;Files&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It may execute commands you never explicitly approved.&lt;/p&gt;

&lt;h3&gt;
  
  
  🗝️ Credential Exposure
&lt;/h3&gt;

&lt;p&gt;If the agent can read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Config files&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Browser sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An exploit could leak:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys&lt;/li&gt;
&lt;li&gt;Tokens&lt;/li&gt;
&lt;li&gt;Passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📂 File System Damage
&lt;/h3&gt;

&lt;p&gt;Misconfigured agents could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete files&lt;/li&gt;
&lt;li&gt;Modify configs&lt;/li&gt;
&lt;li&gt;Corrupt projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not out of malice — but due to flawed instructions or bugs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Network Abuse
&lt;/h3&gt;

&lt;p&gt;If connected to external services, compromised agents could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send spam&lt;/li&gt;
&lt;li&gt;Participate in attacks&lt;/li&gt;
&lt;li&gt;Expose your IP or infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This turns your machine into part of someone else’s problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Experts Are Not Saying “Don’t Use It”
&lt;/h2&gt;

&lt;p&gt;Interestingly, most security professionals are &lt;strong&gt;not&lt;/strong&gt; saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Avoid this project.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They are saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Use it responsibly, with strong isolation and safeguards.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The technology itself is impressive.&lt;/p&gt;

&lt;p&gt;The danger comes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running it on personal machines&lt;/li&gt;
&lt;li&gt;Giving it broad permissions&lt;/li&gt;
&lt;li&gt;Skipping security configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which, unfortunately, many people do when testing new tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Name Change: ClawdBot → Moltbot
&lt;/h2&gt;

&lt;p&gt;You may see the project referenced under two names.&lt;/p&gt;

&lt;p&gt;The creator recently renamed it to &lt;strong&gt;Moltbot&lt;/strong&gt; due to trademark concerns after contact from Anthropic.&lt;/p&gt;

&lt;p&gt;Same project.&lt;br&gt;&lt;br&gt;
Same mission.&lt;br&gt;&lt;br&gt;
Same capabilities.&lt;/p&gt;

&lt;p&gt;Just a new shell — like a lobster molting.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… Should You Use It?
&lt;/h2&gt;

&lt;p&gt;If you are a developer, researcher, or power user:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, it’s an exciting platform to explore agentic workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But you should treat it like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;running experimental infrastructure software, not a casual desktop app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It deserves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated environments&lt;/li&gt;
&lt;li&gt;Isolated machines or VMs&lt;/li&gt;
&lt;li&gt;Careful configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Which brings us to the most important part.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Step: How to Use Moltbot Safely
&lt;/h2&gt;

&lt;p&gt;In this article we focused on &lt;strong&gt;what it is&lt;/strong&gt; and &lt;strong&gt;why it’s risky&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In the next post, we’ll go into &lt;strong&gt;practical security configuration&lt;/strong&gt;, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using separate machines or cloud instances&lt;/li&gt;
&lt;li&gt;Locking down gateway authentication&lt;/li&gt;
&lt;li&gt;Enabling logging with sensitive data redaction&lt;/li&gt;
&lt;li&gt;Running built‑in security audits&lt;/li&gt;
&lt;li&gt;Hardening system prompts and permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you plan to test this tool, those steps are &lt;strong&gt;not optional&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They are the difference between:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;experimenting safely&lt;br&gt;&lt;br&gt;
and&lt;br&gt;&lt;br&gt;
exposing your entire digital life to unnecessary risk.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;AI agents that can actually act on the world are not science fiction anymore.&lt;/p&gt;

&lt;p&gt;They are here.&lt;br&gt;&lt;br&gt;
They are powerful.&lt;br&gt;&lt;br&gt;
And they demand a much higher level of operational security than chatbots ever did.&lt;/p&gt;

&lt;p&gt;The future of AI is not just about smarter models —&lt;br&gt;&lt;br&gt;
it’s about &lt;strong&gt;responsible deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that responsibility now sits with developers too.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>productivity</category>
      <category>security</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Build *The Rust Programming Language* Book Locally on Linux</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Sat, 17 Jan 2026 14:18:04 +0000</pubDate>
      <link>https://dev.to/igorgbr/how-to-build-the-rust-programming-language-book-locally-on-linux-3hn7</link>
      <guid>https://dev.to/igorgbr/how-to-build-the-rust-programming-language-book-locally-on-linux-3hn7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you prefer learning from &lt;strong&gt;books and documentation instead of videos&lt;/strong&gt;, Rust offers one of the best learning resources available:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;The Rust Programming Language&lt;/strong&gt;, also known as &lt;em&gt;The Rust Book&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;The book is open source, maintained by the community, and available in several languages — including &lt;strong&gt;Portuguese (pt-BR)&lt;/strong&gt; and other community translations.&lt;/p&gt;

&lt;p&gt;In this tutorial, you will learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Rust on your system
&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;mdbook&lt;/code&gt;, the tool used to build the book
&lt;/li&gt;
&lt;li&gt;Build the book locally on your machine
&lt;/li&gt;
&lt;li&gt;Open the full documentation in your browser, offline
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a bonus, you will already have part of your Rust development environment set up.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This guide focuses on &lt;strong&gt;Linux&lt;/strong&gt;, but the process is very similar on other operating systems.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Why Build the Book Locally?
&lt;/h2&gt;

&lt;p&gt;Reading the book online is perfectly fine, but building it locally has some advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offline access
&lt;/li&gt;
&lt;li&gt;Faster navigation between chapters
&lt;/li&gt;
&lt;li&gt;Easy access to the source files
&lt;/li&gt;
&lt;li&gt;Possibility to contribute with fixes and improvements
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you enjoy learning by exploring real project structures, this is a great way to start.&lt;/p&gt;

&lt;p&gt;Official online version of the book:&lt;br&gt;&lt;br&gt;
&lt;a href="https://doc.rust-lang.org/stable/book/" rel="noopener noreferrer"&gt;https://doc.rust-lang.org/stable/book/&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%2Fih7o4yknu668ooq31fxr.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%2Fih7o4yknu668ooq31fxr.png" alt="Book running on online oficial doc" width="799" height="384"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Installing Rust
&lt;/h2&gt;

&lt;p&gt;To build the book, we first need to install Rust and its package manager, &lt;strong&gt;Cargo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The official and recommended way to install Rust is using &lt;strong&gt;rustup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Run the following command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything goes well, you should see a message similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rust is installed now. Great!
To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Reload Your Environment Variables
&lt;/h3&gt;

&lt;p&gt;To make sure Cargo is available in your current terminal session, run:&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="nb"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cargo/env"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rustc &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rustc 1.84.1 (e71f9a9a9 2025-01-27)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Installing mdBook
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mdbook&lt;/code&gt; is the tool used to build and serve the Rust Book.&lt;/p&gt;

&lt;p&gt;Install it using Cargo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;mdbook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can confirm installation with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mdbook &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Official mdBook documentation:&lt;br&gt;&lt;br&gt;
&lt;a href="https://rust-lang.github.io/mdBook/" rel="noopener noreferrer"&gt;https://rust-lang.github.io/mdBook/&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Cloning the Book Repository
&lt;/h2&gt;

&lt;p&gt;Now clone the book repository.&lt;/p&gt;

&lt;p&gt;For the Brazilian Portuguese translation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rust-br/rust-book-pt-br.git
&lt;span class="nb"&gt;cd &lt;/span&gt;rust-book-pt-br
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the original English version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rust-lang/book.git
&lt;span class="nb"&gt;cd &lt;/span&gt;book
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose the version that best fits your learning needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Building the Book
&lt;/h2&gt;

&lt;p&gt;Inside the project directory, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mdbook build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the build finishes, the generated site will be inside the &lt;code&gt;book/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;Open it in your browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xdg-open book/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;firefox book/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your terminal cannot open the browser, you can also navigate manually using your file manager and open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;book/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ffafeozgfhc6dqd3p7wf9.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%2Ffafeozgfhc6dqd3p7wf9.png" alt="Book running in HTML" width="799" height="384"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: (Optional) Running a Local Server
&lt;/h2&gt;

&lt;p&gt;Instead of opening static files, you can also run a local server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mdbook serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful if you want live reload while editing files or exploring the structure.&lt;/p&gt;

&lt;h2&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%2F279j83m1hukuzj2fp9ie.png" alt="Book running in local server" width="799" height="414"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building the Rust Book locally may look unnecessary at first, but it helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Rust properly
&lt;/li&gt;
&lt;li&gt;Learn how Cargo works
&lt;/li&gt;
&lt;li&gt;Understand how Rust documentation is structured
&lt;/li&gt;
&lt;li&gt;Get closer to the open-source ecosystem
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning a language becomes much easier when you actively explore its tools and community.&lt;/p&gt;

&lt;p&gt;If you're starting your Rust journey and prefer documentation over videos, this is an excellent first step.&lt;/p&gt;

&lt;p&gt;Happy coding 🦀&lt;/p&gt;

</description>
      <category>rust</category>
      <category>beginners</category>
      <category>documentation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Understanding Web3 and Solana: Foundations Before Your First Smart Contract</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Fri, 16 Jan 2026 04:35:55 +0000</pubDate>
      <link>https://dev.to/igorgbr/understanding-web3-and-solana-foundations-before-your-first-smart-contract-55fk</link>
      <guid>https://dev.to/igorgbr/understanding-web3-and-solana-foundations-before-your-first-smart-contract-55fk</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In recent years, Web3 and blockchain have moved far beyond investment&lt;br&gt;
hype and have become part of real-world software development.\&lt;br&gt;
However, many tutorials jump straight into code without explaining the&lt;br&gt;
&lt;strong&gt;mental model required to build applications correctly on a&lt;br&gt;
blockchain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before writing any Rust code or using frameworks like Anchor, it is&lt;br&gt;
essential to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What Web3 really means for developers\&lt;/li&gt;
&lt;li&gt;  How blockchains work under the hood\&lt;/li&gt;
&lt;li&gt;  What smart contracts are and how Solana treats this concept\&lt;/li&gt;
&lt;li&gt;  Why Solana's architecture is fundamentally different&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article is fully conceptual.\&lt;br&gt;
In the next part, we will move into practice with environment setup and&lt;br&gt;
your first Solana program.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Web3 Really Means for Developers
&lt;/h2&gt;

&lt;p&gt;For developers, Web3 is not about speculation or tokens.\&lt;br&gt;
It is about &lt;strong&gt;who controls the state of the application&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In traditional applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  The backend controls the database\&lt;/li&gt;
&lt;li&gt;  The company defines the rules\&lt;/li&gt;
&lt;li&gt;  Users must trust the server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Web3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Critical application state lives on a public blockchain\&lt;/li&gt;
&lt;li&gt;  Rules are enforced by on-chain code\&lt;/li&gt;
&lt;li&gt;  Anyone can verify how the system behaves&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;User interfaces, APIs, and indexers still exist, but they become&lt;br&gt;
&lt;strong&gt;support layers&lt;/strong&gt;, not the source of truth.&lt;/p&gt;

&lt;p&gt;This architectural shift is what enables truly decentralized&lt;br&gt;
applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Blockchain as a Distributed State Machine
&lt;/h2&gt;

&lt;p&gt;A technical way to view a blockchain is as a &lt;strong&gt;global, distributed state&lt;br&gt;
machine&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each transaction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Reads the current state\&lt;/li&gt;
&lt;li&gt;  Executes deterministic logic\&lt;/li&gt;
&lt;li&gt;  Produces a new state validated by the network&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All validators execute the same logic and reach the same result,&lt;br&gt;
ensuring the ledger remains &lt;strong&gt;immutable and verifiable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Unlike traditional databases, you cannot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Freely update records\&lt;/li&gt;
&lt;li&gt;  Delete historical data\&lt;/li&gt;
&lt;li&gt;  Manually fix inconsistencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every change must happen through a valid, signed, and verified&lt;br&gt;
transaction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Smart Contracts vs Programs on Solana
&lt;/h2&gt;

&lt;p&gt;On many blockchains, such as Ethereum, smart contracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Contain code\&lt;/li&gt;
&lt;li&gt;  Store their own state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solana uses a different model.&lt;/p&gt;

&lt;p&gt;Smart contracts are called &lt;strong&gt;programs&lt;/strong&gt;, and they:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Contain only logic\&lt;/li&gt;
&lt;li&gt;  Do not store state internally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All persistent data lives in separate structures called &lt;strong&gt;Accounts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Programs receive these accounts as inputs, validate them, and modify&lt;br&gt;
their data when allowed.&lt;/p&gt;

&lt;p&gt;This separation between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Code (programs)\&lt;/li&gt;
&lt;li&gt;  Data (accounts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;is one of Solana's most important architectural differences and strongly&lt;br&gt;
affects application design.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Solana Is Architecturally Different
&lt;/h2&gt;

&lt;p&gt;Solana was designed around &lt;strong&gt;parallel transaction execution&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To make this possible, the network must know in advance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Which accounts a transaction will read\&lt;/li&gt;
&lt;li&gt;  Which accounts a transaction will write&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If two transactions do not touch the same accounts, they can run at the&lt;br&gt;
same time.&lt;/p&gt;

&lt;p&gt;This model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Greatly increases throughput\&lt;/li&gt;
&lt;li&gt;  Requires developers to explicitly declare all data dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why, when writing Solana programs, every account involved in an&lt;br&gt;
instruction must be listed explicitly.&lt;/p&gt;

&lt;p&gt;Nothing is accessed implicitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Role of Accounts in Application Design
&lt;/h2&gt;

&lt;p&gt;Accounts are the real database of Solana.&lt;/p&gt;

&lt;p&gt;They can store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Custom data structures\&lt;/li&gt;
&lt;li&gt;  Token balances\&lt;/li&gt;
&lt;li&gt;  NFT metadata\&lt;/li&gt;
&lt;li&gt;  Protocol configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each account has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  An address\&lt;/li&gt;
&lt;li&gt;  An owner (usually a program)\&lt;/li&gt;
&lt;li&gt;  Persistent binary data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A program can only modify accounts that it owns.&lt;/p&gt;

&lt;p&gt;This creates a very explicit and predictable security model.&lt;/p&gt;

&lt;p&gt;For developers, this means application design often starts with&lt;br&gt;
&lt;strong&gt;account design&lt;/strong&gt;, not with function logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Anchor Is and Why It Matters
&lt;/h2&gt;

&lt;p&gt;Developing directly on Solana's runtime in Rust is possible, but&lt;br&gt;
extremely verbose.&lt;/p&gt;

&lt;p&gt;Anchor is a framework that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Automates data serialization\&lt;/li&gt;
&lt;li&gt;  Validates accounts automatically\&lt;/li&gt;
&lt;li&gt;  Reduces repetitive boilerplate\&lt;/li&gt;
&lt;li&gt;  Integrates TypeScript testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Anchor, developers describe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Which accounts an instruction expects\&lt;/li&gt;
&lt;li&gt;  Which constraints must be enforced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the framework generates most of the validation logic.&lt;/p&gt;

&lt;p&gt;This allows developers to focus on &lt;strong&gt;protocol logic instead of low-level&lt;br&gt;
runtime details&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For this reason, most professional Solana projects today use Anchor.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Should Understand Before Writing Code
&lt;/h2&gt;

&lt;p&gt;Before moving into hands-on development, it is important to understand&lt;br&gt;
that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Programs do not store state\&lt;/li&gt;
&lt;li&gt;  Accounts are the actual storage layer\&lt;/li&gt;
&lt;li&gt;  Transactions must declare all accounts they use\&lt;/li&gt;
&lt;li&gt;  Execution is deterministic and globally validated\&lt;/li&gt;
&lt;li&gt;  Compute costs always matter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These principles explain why Solana development feels different from&lt;br&gt;
both Web2 systems and EVM-based blockchains.&lt;/p&gt;

&lt;p&gt;With the correct mental model, the code will stop feeling strange and&lt;br&gt;
start making sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Step: Hands-On Development
&lt;/h2&gt;

&lt;p&gt;In the next article of this series, we will move into practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Setting up the full development environment\&lt;/li&gt;
&lt;li&gt;  Creating a local development wallet\&lt;/li&gt;
&lt;li&gt;  Initializing an Anchor project\&lt;/li&gt;
&lt;li&gt;  Implementing a simple counter program using a PDA\&lt;/li&gt;
&lt;li&gt;  Testing everything locally with &lt;code&gt;solana-test-validator&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to move directly from theory into a real professional&lt;br&gt;
development workflow.&lt;/p&gt;




</description>
      <category>web3</category>
      <category>beginners</category>
      <category>basic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>BTOP++: The Resource Monitor I Didn’t Know I Needed</title>
      <dc:creator>Igor Giamoniano</dc:creator>
      <pubDate>Sat, 03 Jan 2026 03:07:00 +0000</pubDate>
      <link>https://dev.to/igorgbr/btop-the-resource-monitor-i-didnt-know-i-needed-389d</link>
      <guid>https://dev.to/igorgbr/btop-the-resource-monitor-i-didnt-know-i-needed-389d</guid>
      <description>&lt;p&gt;Today is &lt;strong&gt;January 1st, 2026&lt;/strong&gt;. The holidays are over, keyboards are warming up again, and it’s time to get back to building things.&lt;/p&gt;

&lt;p&gt;There’s been a lot of talk about **2026 being “the year of Linux.” **Steam even kicked off the year with a banner suggesting exactly that. Will it actually be? I honestly don’t know.&lt;/p&gt;

&lt;p&gt;What I do know is that 2025 was the year of Linux for me. After four years working as a developer and using Linux only sporadically, things finally clicked at the end of last year — and since then, the penguin has completely taken over my workflow.&lt;/p&gt;

&lt;p&gt;My wife can confirm it.&lt;br&gt;
&lt;strong&gt;Even with the Brazilian summer heat, we don’t use Windows at home.&lt;/strong&gt;😄&lt;/p&gt;

&lt;p&gt;With that in mind, this post is both a small New Year wish — and a quick, practical introduction to a resource monitor I genuinely didn’t know I needed: BTOP++.&lt;/p&gt;


&lt;h2&gt;
  
  
  BTOP++ vs HTOP
&lt;/h2&gt;

&lt;p&gt;First of all, this is &lt;strong&gt;not&lt;/strong&gt; an attack on HTOP.&lt;/p&gt;

&lt;p&gt;On the contrary: &lt;strong&gt;HTOP is an amazing tool&lt;/strong&gt;, created by my fellow countryman &lt;strong&gt;Hisham Muhammad&lt;/strong&gt;, written in C, and known for being extremely efficient. It earned its place in the Linux community and even in &lt;a href="https://htop.dev/sightings.html" rel="noopener noreferrer"&gt;hacker pop culture&lt;/a&gt; for a reason.&lt;/p&gt;

&lt;p&gt;Many of the features I’ll mention for BTOP++ already exist in HTOP.&lt;/p&gt;

&lt;p&gt;So the real question is:&lt;/p&gt;
&lt;h3&gt;
  
  
  Why consider BTOP++?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;BTOP++&lt;/strong&gt; is the natural evolution of the HTOP idea.&lt;/p&gt;

&lt;p&gt;It is inspired by HTOP but written in &lt;strong&gt;C++&lt;/strong&gt;, which allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More information displayed at once in the same terminal&lt;/li&gt;
&lt;li&gt;Integrated graphs for CPU, memory, disk, and network&lt;/li&gt;
&lt;li&gt;A more modern and polished look&lt;/li&gt;
&lt;li&gt;Extra visual context without a noticeable performance hit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those visuals make a real difference when you’re trying to understand resource usage patterns.&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%2F6knt2c7h963afnpoiizi.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%2F6knt2c7h963afnpoiizi.png" alt="BTop Interface" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Should You Switch?
&lt;/h2&gt;

&lt;p&gt;As always in tech, there’s &lt;strong&gt;no silver bullet&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;HTOP is still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal&lt;/li&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Extremely reliable&lt;/li&gt;
&lt;li&gt;Perfect for SSH sessions and servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BTOP++, on the other hand, is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More complete&lt;/li&gt;
&lt;li&gt;Visually rich&lt;/li&gt;
&lt;li&gt;Modern&lt;/li&gt;
&lt;li&gt;Ideal for desktops and workstations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTOP&lt;/strong&gt; → minimal, fast, reliable, great for servers
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BTOP++&lt;/strong&gt; → complete, beautiful, modern, great for desktop/workstation
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both tools can easily coexist.&lt;/p&gt;


&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Big Linux / Arch / Manjaro
&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;pacman &lt;span class="nt"&gt;-Syu&lt;/span&gt;   &lt;span class="c"&gt;# update the system&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; btop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After installation, just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;btop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Ubuntu 22.10 or newer
&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;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;btop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Ubuntu 22.04 LTS or older
&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;snap &lt;span class="nb"&gt;install &lt;/span&gt;btop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Useful Shortcuts
&lt;/h2&gt;

&lt;p&gt;Inside BTOP++:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ESC&lt;/code&gt; or &lt;code&gt;M&lt;/code&gt; → open the menu
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;↑&lt;/code&gt; / &lt;code&gt;↓&lt;/code&gt; → navigate processes
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;F&lt;/code&gt; → filter processes by name
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;K&lt;/code&gt; → kill the selected process
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find all available shortcuts under &lt;strong&gt;Help&lt;/strong&gt; inside the menu.&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%2Fv5xp6h3iu3dpl2d006wd.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%2Fv5xp6h3iu3dpl2d006wd.png" alt="BTop Keys" width="800" height="579"&gt;&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%2Fm9hxzd1sw8m9oubviit1.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%2Fm9hxzd1sw8m9oubviit1.png" alt="BTop Menu" width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;That’s it.&lt;br&gt;&lt;br&gt;
Long live Linux — and happy hacking 🐧&lt;/p&gt;

</description>
      <category>linux</category>
      <category>archlinux</category>
      <category>resources</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
