<?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: Jeremy Nobel</title>
    <description>The latest articles on DEV Community by Jeremy Nobel (@nobelc).</description>
    <link>https://dev.to/nobelc</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%2F3832279%2F4ac96b30-69d1-40b8-a568-37829dd56727.png</url>
      <title>DEV Community: Jeremy Nobel</title>
      <link>https://dev.to/nobelc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nobelc"/>
    <language>en</language>
    <item>
      <title>From KRON to KLS: Evolution, Technical Failures, and the Art of Reinventing the Wheel in Linux</title>
      <dc:creator>Jeremy Nobel</dc:creator>
      <pubDate>Sat, 27 Jun 2026 02:01:57 +0000</pubDate>
      <link>https://dev.to/nobelc/from-kron-to-kls-evolution-technical-failures-and-the-art-of-reinventing-the-wheel-in-linux-2dn4</link>
      <guid>https://dev.to/nobelc/from-kron-to-kls-evolution-technical-failures-and-the-art-of-reinventing-the-wheel-in-linux-2dn4</guid>
      <description>&lt;p&gt;On March 23rd, I updated KRON for the last time. Today, the project not only has a new name, but a completely refined vision.&lt;/p&gt;

&lt;p&gt;Initially, KRON was conceived as a toolkit of basic Linux utilities modified with a strict focus on security and auditing. While I have kept that security core, the idea of building a massive toolkit is gone. I chose instead to embrace the old Unix philosophy: Do one thing, and do it well.&lt;/p&gt;

&lt;p&gt;That is how KRON transformed into KLS, a listener (in the style of the ls command) focused exclusively on directory auditing.&lt;br&gt;
The Current Focus and the Performance Headache&lt;/p&gt;

&lt;p&gt;Currently, KLS is responsible for scanning directories to detect file alerts with SUID/SGID permissions and Linux Capabilities. It is 100% designed for Linux (I am not ruling out a Windows adaptation in the future, but it is not the priority right now).&lt;/p&gt;

&lt;p&gt;My current plan splits into two fronts: improving the tool's professional viability and optimizing its performance. The latter has been, without a doubt, the most expensive and difficult part. Making the tool useful in terms of information is one thing; making it fast is a whole different beast.&lt;/p&gt;

&lt;p&gt;In my quest for optimal performance, I went through several stages and experiments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Classic Single-Threaded Model: Way too slow for massive file systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Direct getdents64: I tried gathering entries directly into a buffer using the native syscall to bypass the overhead of higher-level C/C++ standard library functions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Failed Attempt with io_uring: This was a catastrophic failure. I was exploring advanced asynchronous concepts in a way I had never programmed before. I made the mistake of copying code and trying to guess what the AI was doing without truly understanding it. I broke my own rule of understanding every single line.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the stumble with io_uring, I decided to step back into a territory I actually master: a multithreaded Producer-Consumer model. Performance improved significantly, though I admit it is still far from where I want it to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Next Step: Viability and Clean Code&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Before I continue obsessing over micro-optimization, I have decided to shift my strategy. My immediate goal is to make KLS an attractive, observable option for the real world—so that a security auditor looks at it and thinks: &lt;em&gt;"This is actually useful for my day-to-day work."&lt;/em&gt; To achieve this, I am focusing on cleaning, refactoring, and documenting the codebase, ensuring it is clear enough for the community to understand and contribute to.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Reflection on University and Curiosity&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building this project has taught me more than I have learned in three years of university. I am not discounting academia, but university only gives you the general foundation; it is personal curiosity and the hunger to tackle genuinely challenging projects that actually make you an engineer.&lt;/p&gt;

&lt;p&gt;Developing KLS has been a mental catalyst. In fact, while I fight with threads and Linux capabilities, my mind keeps racing with new ideas...&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Tech Corner: Squeezing Performance out of Linux (And seeking advice)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since I know there are true systems experts on dev.to, I want to open up a discussion and ask for advice in two areas I am currently focusing on to take KLS to the next level:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tips for Optimizing Directory Entry Retrieval (I/O)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Right now, the bottleneck is the file system traversal. While the Producer-Consumer model helped, disk contention or syscall overhead when calling stat / getxattr for capabilities is still costing me dearly.&lt;/p&gt;

&lt;p&gt;Is it worth structuring a thread pool where a master thread only lists directories and worker threads process the metadata, or is it better for each thread to autonomously own specific subtrees?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Looking for Literature: What books do you recommend to master real async and low-level programming?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My failure with io_uring made it clear that I don't want to use abstractions I don't understand. I want to build the proper theoretical foundations. What books do you recommend for mastering async programming, advanced concurrency, and Linux Kernel internals?&lt;/p&gt;

&lt;p&gt;I currently have my eyes on classics like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The Linux Programming Interface (Michael Kerrisk)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Linux System Programming (Robert Love).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What other books do you consider indispensable for truly understanding concurrency patterns, the Linux I/O subsystem, or modern low-level async frameworks?&lt;/p&gt;

&lt;p&gt;I'd love to read your thoughts in the comments! If you want to take a look at the code (and constructively tear it apart), here is the repository: &lt;a href="https://github.com/NobelC/kls" rel="noopener noreferrer"&gt;https://github.com/NobelC/kls&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>linux</category>
      <category>cli</category>
      <category>programming</category>
    </item>
    <item>
      <title>Kron Devlog #2: copy is done — threads, syscalls and a performance problem I haven't solved yet</title>
      <dc:creator>Jeremy Nobel</dc:creator>
      <pubDate>Mon, 23 Mar 2026 01:52:19 +0000</pubDate>
      <link>https://dev.to/nobelc/kron-devlog-2-copy-is-done-threads-syscalls-and-a-performance-problem-i-havent-solved-yet-1me4</link>
      <guid>https://dev.to/nobelc/kron-devlog-2-copy-is-done-threads-syscalls-and-a-performance-problem-i-havent-solved-yet-1me4</guid>
      <description>&lt;p&gt;Compared to previous commands, copy was relatively straightforward to build. The options — recursive, force, dry-run, verbose, skip-existing, no-overwrite, pattern filtering — all came together without major friction. Testing was clean. No dramatic bugs this time.&lt;/p&gt;

&lt;p&gt;The real challenge was the threading model.&lt;br&gt;
The original implementation had a fundamental flaw: threads would exit their loop as soon as the work queue was empty, even if other threads were still discovering new directories to process. In practice, almost everything was running on a single thread. The fix required rethinking the entire approach — instead of threads dying prematurely, they now wait intelligently using condition variables and notifications. They only exit when there's genuinely nothing left to do. A whole new layer of complexity, but the right kind.&lt;/p&gt;

&lt;p&gt;The bigger unsolved problem is performance on large directories. Unlike list or inspect, copy can't cache anything — every file operation requires constant syscalls, and syscalls are expensive. The more files, the more it hurts. I have some ideas for specific cases, but I'm not interested in point solutions. I want something more fundamental before I consider the problem addressed.&lt;/p&gt;

&lt;p&gt;--preserve is intentionally not implemented yet. Preserving metadata means more syscalls, and adding that on top of an already expensive operation didn't make sense until I find a way to reduce that cost first.&lt;/p&gt;

&lt;p&gt;Kron is still being built from the void.&lt;br&gt;
github.com/TheNobelVoid/kron&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>linux</category>
      <category>devplusplus</category>
      <category>devops</category>
    </item>
    <item>
      <title>Kron Devlog #1: A Simple Flag Bug, a New Command, and a Performance Problem</title>
      <dc:creator>Jeremy Nobel</dc:creator>
      <pubDate>Sat, 21 Mar 2026 00:57:00 +0000</pubDate>
      <link>https://dev.to/nobelc/kron-devlog-1-a-simple-flag-bug-a-new-command-and-a-performance-problem-23hg</link>
      <guid>https://dev.to/nobelc/kron-devlog-1-a-simple-flag-bug-a-new-command-and-a-performance-problem-23hg</guid>
      <description>&lt;p&gt;There's a certain kind of bug that doesn't make you feel stupid because it's complex. It makes you feel stupid precisely because it isn't.&lt;br&gt;
That was my day today.&lt;/p&gt;

&lt;p&gt;I'm building Kron — a multifunctional CLI tool for file inspection and manipulation, written in C++20 with zero external dependencies. I'm currently working on a new command: copy. But before I could write a single line of it, I had to deal with the global --version and --help flags first.&lt;/p&gt;

&lt;p&gt;The flag bug&lt;br&gt;
The logic was simple: --version and --help need to be handled before any command is dispatched. If someone runs kron --version alone, the program should print the version and exit — not throw an error because no command was provided.&lt;/p&gt;

&lt;p&gt;I overcomplicated it at first, trying to figure out the right place to intercept these flags in the pipeline. Eventually I found it: right after options are normalized, before command processing begins. That way the flow gets cut early and nothing downstream runs.&lt;/p&gt;

&lt;p&gt;--help was similar, with one extra condition: if a command is provided alongside --help, it should print that command's help and stop execution. Clean, simple.&lt;/p&gt;

&lt;p&gt;Then I spent way too long debugging why a command with no options wasn't executing at all. The culprit? A stray else in the dispatch logic that should have been removed. It was blocking execution entirely for commands called without options. Classic.&lt;/p&gt;

&lt;p&gt;The copy command&lt;br&gt;
The core data extraction logic in copy is similar to what inspect already uses, which made the foundation straightforward. The standard functionality is all there — recursive copy, force overwrite, skip existing files, preserve metadata, dry run, verbose output.&lt;/p&gt;

&lt;p&gt;But I want copy to do something the traditional tool doesn't: filter what gets copied. By extension, by file size, by date, by permissions. So instead of blindly copying everything, you can tell Kron exactly what you want moved and what should stay behind. More control, less cleanup.&lt;/p&gt;

&lt;p&gt;The performance problem&lt;br&gt;
list and inspect already use multithreading for data collection, and the filtering logic is as optimized as my current knowledge allows. Both commands handle simple workloads well.&lt;/p&gt;

&lt;p&gt;The bottleneck is printing. When dealing with large volumes of data, output slows down noticeably. I haven't solved this yet — but it's on the table. If anyone has dealt with high-volume terminal output in C++ and has ideas, I'm genuinely open to them. Drop a comment or open issue #3 on GitHub.&lt;/p&gt;

&lt;p&gt;Hoping to have copy ready before the end of the week.&lt;br&gt;
github.com/TheNobelVoid/kron&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>linux</category>
      <category>devplusplus</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why I Build CLI Tools with Zero External Dependencies</title>
      <dc:creator>Jeremy Nobel</dc:creator>
      <pubDate>Fri, 20 Mar 2026 02:56:45 +0000</pubDate>
      <link>https://dev.to/nobelc/why-i-build-cli-tools-with-zero-external-dependencies-16f6</link>
      <guid>https://dev.to/nobelc/why-i-build-cli-tools-with-zero-external-dependencies-16f6</guid>
      <description>&lt;p&gt;For a long time I wasn't really programming. My university degree covered a lot of things — but actual building wasn't one of them. Professors mentioned AI, algorithms, low-level concepts. They'd describe what something did, roughly how it worked underneath. But nobody told you the truth: building it isn't just calling a couple of functions and moving on. &lt;br&gt;
There was always something deeper below.&lt;/p&gt;

&lt;p&gt;At some point I decided to stop waiting and start digging.&lt;br&gt;
I want to be clear about something: this isn't about dismissing other languages or tools. If I'm working on a company project or something with deadlines and other people depending on it, I'll adapt. I'll use whatever makes sense. But when the project is mine — when nobody is waiting, when the only requirement is that I understand every single line — I build from scratch.&lt;/p&gt;

&lt;p&gt;Everything. My own tokenizer. My own CLI parser. My own command executor. Not because libraries don't exist. They do, and some of them are excellent. But because there's a difference between using a tool and understanding what the tool is made of.&lt;/p&gt;

&lt;p&gt;I do make one exception: the C++ STL. And honestly, if I followed my own logic all the way down I'd end up punching cards or writing assembly. There's a floor somewhere. The STL is mine.&lt;/p&gt;

&lt;p&gt;The real reason I build this way has nothing to do with efficiency or philosophy. It's simpler than that.&lt;/p&gt;

&lt;p&gt;Kron — my CLI tool for file inspection and manipulation — made me suffer. It kept me awake. I'd lie down and instead of sleeping I'd be running solutions in my head, thinking about architecture, about what I'd broken, about what I could do better. It gave me something that years of coursework never did: the feeling that I was actually building something.&lt;/p&gt;

&lt;p&gt;It brought me back to programming.&lt;br&gt;
Kron is just the beginning.&lt;/p&gt;

&lt;p&gt;Do you build from scratch or prefer existing tools? What made you choose your approach?&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>linux</category>
      <category>beginners</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
