<?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: changelogHW</title>
    <description>The latest articles on DEV Community by changelogHW (@changelog_hw).</description>
    <link>https://dev.to/changelog_hw</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%2F4006955%2Fce932083-a029-4bff-88fe-c5b9f3cecdb1.png</url>
      <title>DEV Community: changelogHW</title>
      <link>https://dev.to/changelog_hw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/changelog_hw"/>
    <language>en</language>
    <item>
      <title>I Tried Textual for a Weekend. Here's Why I'm Not Going Back to Plain CLI Output</title>
      <dc:creator>changelogHW</dc:creator>
      <pubDate>Tue, 28 Jul 2026 00:54:39 +0000</pubDate>
      <link>https://dev.to/changelog_hw/i-tried-textual-for-a-weekend-heres-why-im-not-going-back-to-plain-cli-output-59gf</link>
      <guid>https://dev.to/changelog_hw/i-tried-textual-for-a-weekend-heres-why-im-not-going-back-to-plain-cli-output-59gf</guid>
      <description>&lt;p&gt;I've been writing Python CLI tools for years the same way: &lt;code&gt;print()&lt;/code&gt; statements, maybe some &lt;code&gt;argparse&lt;/code&gt;, and if I was feeling fancy, &lt;code&gt;rich&lt;/code&gt; for colored output. Then I actually sat down and built something with &lt;strong&gt;Textual&lt;/strong&gt;, and it changed how I think about terminal apps.&lt;/p&gt;

&lt;p&gt;If you haven't heard of it, &lt;a href="https://textual.textualize.io/" rel="noopener noreferrer"&gt;Textual&lt;/a&gt; is a Python framework (from the same team behind &lt;code&gt;rich&lt;/code&gt;) for building full TUI (Terminal User Interface) apps --- think dashboards, forms, file browsers, all running inside your terminal, but with actual layout, widgets, mouse support, and CSS-like styling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why I picked it up
&lt;/h3&gt;

&lt;p&gt;I wanted a quick internal tool to monitor some background jobs --- nothing worth a full web dashboard, but plain log output wasn't cutting it either. Textual felt like the middle ground I didn't know I needed.&lt;/p&gt;

&lt;p&gt;So instead of just reading docs, I built something real with it: a &lt;strong&gt;command-logging utility&lt;/strong&gt; --- a TUI where you can log commands you run (with context/notes attached) without breaking flow to open a separate notes app. Code's on &lt;a href="https://github.com/HiraWaheed/Command-Note" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting it up
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;textual textual-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No extra system dependencies, no weird terminal config. &lt;code&gt;textual-dev&lt;/code&gt; gives you a live console for debugging, which honestly saved me a lot of guesswork and the devtools lets you serve an app launched directly from a Python file.&lt;/p&gt;

&lt;h3&gt;
  
  
  The part that surprised me: CSS
&lt;/h3&gt;

&lt;p&gt;Yes, actual CSS. You style widgets with &lt;code&gt;.tcss&lt;/code&gt; files:&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;Screen&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="n"&gt;surface&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;#sidebar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="no"&gt;green&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;Coming from years of manually padding strings to "layout" a CLI, this felt like cheating. Widgets snap into place, you get flexbox-like sizing, and you're not fighting with &lt;code&gt;\n&lt;/code&gt; and spaces to align things.&lt;/p&gt;

&lt;h3&gt;
  
  
  A minimal example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;textual.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ComposeResult&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;textual.widgets&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Footer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Static&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DemoApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;CSS_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;demo.tcss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ComposeResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nc"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nc"&gt;Static&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from Textual&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nc"&gt;Footer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nc"&gt;DemoApp&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it, and you already get a header, footer with keybindings, and a styled body. No boilerplate hell.&lt;/p&gt;

&lt;h3&gt;
  
  
  What actually impressed me
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reactive attributes&lt;/strong&gt; : change a variable, and the UI updates automatically. No manual redraw logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in widgets&lt;/strong&gt; : DataTable, Tree, ListView, Input, all ready to use. I didn't have to build a table renderer from scratch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works over SSH&lt;/strong&gt; : since it's still a terminal app, no port forwarding or browser needed. That alone makes it worth it for remote/server tooling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hot reload&lt;/strong&gt; : &lt;code&gt;textual run --dev app.py&lt;/code&gt; and CSS changes reflect instantly without restarting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where it got tricky
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Debugging layout issues (widgets not sizing how you expect) took some trial and error — the docs help, but you'll spend time in the CSS live-reload loop.&lt;/li&gt;
&lt;li&gt;Testing TUI apps isn't as straightforward as testing a normal script; Textual has a test harness (&lt;code&gt;Pilot&lt;/code&gt;), but it's a different mental model.&lt;/li&gt;
&lt;li&gt;Quitting the application (Ctrl+q) is sometimes tricky due to some similar key bindings. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The project: a command-logging utility
&lt;/h3&gt;

&lt;p&gt;The idea was simple; I run a lot of one-off commands (debugging, ops, random scripts) and kept losing track of &lt;em&gt;why&lt;/em&gt; I ran them. So I built a small Textual app that lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log a command + a quick note in one input&lt;/li&gt;
&lt;li&gt;Browse past entries in a scrollable list&lt;/li&gt;
&lt;li&gt;Delete entries without leaving the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing groundbreaking, but it's exactly the kind of tool that's annoying to build with plain &lt;code&gt;print()&lt;/code&gt; and perfect for Textual's widget set: &lt;code&gt;Input&lt;/code&gt; for capture, and reactive state to keep the list in sync as you add entries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should you use it?
&lt;/h3&gt;

&lt;p&gt;If you're building anything more than a script that prints and exits — a monitoring tool, an admin utility, a game --- Textual is worth the few hours it takes to get comfortable. It's actively maintained, the community's responsive, and it makes terminal apps feel like a legitimate UI surface instead of an afterthought.&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%2Ff9jzdzys14kao58komft.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%2Ff9jzdzys14kao58komft.PNG" alt="Terminal Screenshot of Textual Serve devtool" width="614" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: I'm not affiliated with Rich/Textual in any way and these are my personal opinions.&lt;/p&gt;

</description>
      <category>python</category>
      <category>tui</category>
      <category>textual</category>
    </item>
    <item>
      <title>Map out of the IDE: My DevRel Transition Roadmap</title>
      <dc:creator>changelogHW</dc:creator>
      <pubDate>Sun, 05 Jul 2026 00:18:14 +0000</pubDate>
      <link>https://dev.to/changelog_hw/map-out-of-the-ide-my-devrel-transition-roadmap-36kd</link>
      <guid>https://dev.to/changelog_hw/map-out-of-the-ide-my-devrel-transition-roadmap-36kd</guid>
      <description>&lt;p&gt;After staring at the &lt;a href="https://dev.to/changelog_hw/deconstructing-the-devrel-job-description-a-swes-perspective-5dld"&gt;JDs of Developer Relations(DevRel) Engineers&lt;/a&gt; for hours and doing a quick check of my own transferable skills, I started this week researching into specific DevRel roadmaps and resources.&lt;/p&gt;




&lt;p&gt;Out of the 4+1 DevRel key responsibility areas (Advocacy, Education, Community Support, Content Creation and Feedback Loop), I selected the following core pillars to focus on first:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pillar#1. Technical Writing:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Documentations, articles or blog posts;&lt;/em&gt; Like how you would learn to write the first 'hello world' in any programming language, I started to build a consistent writing habit in developer-centric language. &lt;br&gt;
Whether it's Developer Education or Content Creation, knowing this always helps. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pillar#2. Public Speaking:&lt;/strong&gt;&lt;br&gt;
Whether you're making a tutorial, giving a quick demo or presenting your  product to developers - knowing presentation techniques like storytelling, engaging your audience through a 'hook' and handling Q&amp;amp;A helps you communicate your message effectively in public settings and is a very important part of DevRel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pillar#3. Community Metrics:&lt;/strong&gt;&lt;br&gt;
Instead of measuring system performance or uptime like a Software Engineer, this pillar is learning how to measure 'human interaction'. This is the part that gives you accountability with leadership. This may involve tracking things like &lt;em&gt;community growth&lt;/em&gt; through retention rates, &lt;em&gt;developer engagement&lt;/em&gt; through forum participation and &lt;em&gt;content impact&lt;/em&gt; through views on technical tutorials or documentation.&lt;/p&gt;




&lt;p&gt;If you're just starting like me, here are some of &lt;strong&gt;the resources&lt;/strong&gt; I found really helpful:&lt;/p&gt;

&lt;h3&gt;
  
  
  Courses/Guides
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://roadmap.sh/devrel" rel="noopener noreferrer"&gt;DevRel Roadmap &lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://alison.com/topic/learn/173269/understanding-developer-relations" rel="noopener noreferrer"&gt;Allison's Introduction to Developer Relations&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://developers.google.com/tech-writing" rel="noopener noreferrer"&gt;Google's Technical Writing Course&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/devrelcollective/awesome-devrel" rel="noopener noreferrer"&gt;awesome-devrel's Github Repository&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Communities
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Developer Relations Foundation on &lt;a href="https://www.linkedin.com/company/devrel-foundation/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devrelcollective.fun/" rel="noopener noreferrer"&gt;DevRel Collective&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any other pivoting engineers who are also going through a similar experience, feel free to share any resources or follow along as I write while I learn.  &lt;/p&gt;

</description>
      <category>devrel</category>
      <category>documentation</category>
      <category>career</category>
    </item>
    <item>
      <title>Deconstructing the DevRel Job Description: A SWE’s Perspective</title>
      <dc:creator>changelogHW</dc:creator>
      <pubDate>Sun, 28 Jun 2026 23:16:50 +0000</pubDate>
      <link>https://dev.to/changelog_hw/deconstructing-the-devrel-job-description-a-swes-perspective-5dld</link>
      <guid>https://dev.to/changelog_hw/deconstructing-the-devrel-job-description-a-swes-perspective-5dld</guid>
      <description>&lt;p&gt;As a software engineer, my comfort zone is a dark terminal, a green test suite, and a predictable compiler. Compilers are great. They don't have feelings, and they tell you exactly why they are mad at you.&lt;/p&gt;

&lt;p&gt;So, naturally, I decided to look into &lt;strong&gt;Developer Relations (DevRel)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you have ever thought about trading your Jira tickets for developer advocacy, you have probably opened a few job descriptions (JDs) and felt immediate whiplash. I spent the last week auditing modern DevRel JDs to see what it actually takes to bridge the gap.&lt;/p&gt;

&lt;p&gt;Here is the breakdown of what I found, minus the corporate buzzwords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Catalyst: Why look outside the IDE?&lt;/strong&gt;&lt;br&gt;
Let’s be honest. Building features is fun, but sometimes you realize you enjoy talking about the technology just as much as writing it. I noticed my favorite part of a sprint was explaining a complex system architecture to a junior developer or writing the internal documentation. That spark is usually the first sign of a DevRel pivot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Tech Stack vs. The People Stack&lt;/strong&gt;&lt;br&gt;
When an engineer reads a standard SWE description, we look for languages and frameworks. When you look at a DevRel description, the requirements look a bit different:&lt;/p&gt;

&lt;p&gt;What we expect: "Must have 5 years of production Python experience." &lt;/p&gt;

&lt;p&gt;The reality: "Must be able to build a quick API demo, write a tutorial about it, and present it without sweating through your shirt." &lt;/p&gt;

&lt;p&gt;The technical depth is still required, but the output shifts from production-grade code to educational collateral. You aren't shipping enterprise software; you are shipping understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The "Aha!" Moment&lt;/strong&gt;&lt;br&gt;
The biggest takeaway from analyzing these roles is that DevRel is not a marketing job &lt;em&gt;masquerading&lt;/em&gt; as engineering. It is a &lt;em&gt;translation layer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Your job is to look at a product through a developer's eyes, find where it hurts, and help them fix it. You are an engineer whose primary debugging tool is empathy and communication, rather than a linter.&lt;br&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%2Fhteivpp8a2t8jnvs33ui.jpg" 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%2Fhteivpp8a2t8jnvs33ui.jpg" alt="Image of a checklist notepad" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Image credits: &lt;a href="https://www.magnific.com" rel="noopener noreferrer"&gt;designed by Freepik-Magnific.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To keep myself accountable, I did a quick inventory of my own toolkit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What transfers immediately:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The technical foundation:&lt;/em&gt; Knowing how developer tools work because I use them daily.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Empathy&lt;/em&gt;: I know exactly what makes a developer close a tab in frustration (looking at you, broken documentation).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The immediate gaps to bridge:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Public proof of work&lt;/em&gt;: It is one thing to write clean code for a private repository. It is another thing to write an engaging public article or record a video walkthrough that keeps a developer's attention for more than 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The next step:&lt;/strong&gt;&lt;br&gt;
Instead of just waiting until I magically feel ready, I am treating this transition like a engineering sprint. I found some roadmaps, joined the right communities, and I am going to build my way into the role by doing the actual work in public.&lt;/p&gt;

&lt;p&gt;If you are an engineer who has successfully made the jump, or if you are currently staring at the same JDs I am, let me know what your biggest roadblock has been!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
