<?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: Aarav Maloo</title>
    <description>The latest articles on DEV Community by Aarav Maloo (@aaravmaloo).</description>
    <link>https://dev.to/aaravmaloo</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%2F3390261%2F8fb3fd10-ed4e-475e-9c5f-36e4ab81a4b2.jpg</url>
      <title>DEV Community: Aarav Maloo</title>
      <link>https://dev.to/aaravmaloo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aaravmaloo"/>
    <language>en</language>
    <item>
      <title>cmdutils available to download via winget</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Fri, 31 Jul 2026 16:09:26 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/cmdutils-available-to-download-via-winget-24fp</link>
      <guid>https://dev.to/aaravmaloo/cmdutils-available-to-download-via-winget-24fp</guid>
      <description>&lt;p&gt;Excited to share that cmdutils is now downloadable via winget! 🚀&lt;/p&gt;

&lt;p&gt;cmdutils is a zero-bloat CLI tool written in pure Rust that provides everyday utilities like image conversion, compression, metadata extraction, and more.&lt;/p&gt;

&lt;p&gt;It follows a clean structure: each category is a "subnet" (like image), and each command inside is a "util" (convert, compress, resize, etc).&lt;/p&gt;

&lt;p&gt;It's still early and pretty basic, but I plan to extend it significantly over time.&lt;/p&gt;

&lt;p&gt;I already maintain a Homebrew tap for macOS users, and now it's live on winget for Windows. AUR support is next on the roadmap.&lt;/p&gt;

&lt;p&gt;Would love for you to check it out and share any feedback!&lt;br&gt;
Github 🔗: &lt;a href="https://github.com/aaravmaloo/cmdutils" rel="noopener noreferrer"&gt;https://github.com/aaravmaloo/cmdutils&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>rust</category>
      <category>cli</category>
    </item>
    <item>
      <title>Publishing APM@v11.0.0</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:32:21 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/publishing-apmv1100-296n</link>
      <guid>https://dev.to/aaravmaloo/publishing-apmv1100-296n</guid>
      <description>&lt;p&gt;APM v11.0.0 is finally live. This one took 4 months, and most of that time was spent undoing my own decisions.&lt;/p&gt;

&lt;p&gt;Here's the honest version of how this release went.&lt;/p&gt;

&lt;p&gt;I spent 3 months building a full GUI for APM, on top of the existing CLI. Somewhere in there I realised maintaining both at once was more than I could sustain, so I shelved the GUI entirely.&lt;/p&gt;

&lt;p&gt;Around the same time, I decided to port the whole codebase to Rust. The reason was oddly specific: FaceID was too slow. Instead of asking why it was slow, I jumped straight to a full rewrite.&lt;/p&gt;

&lt;p&gt;Turns out the real fix was much simpler. I didn't need a custom FaceID framework at all. The OS already has native biometric authentication that's faster, better tested, and more secure than anything I could build myself. So I ripped my framework out completely and switched to that instead.&lt;/p&gt;

&lt;p&gt;By the time I realized all this, I'd made enough changes that I couldn't touch the codebase without something breaking. I had to stop, sit with it, and slowly work my way back to something stable. That's really what this release is: 4 months of course correction, finally shipped.&lt;/p&gt;

&lt;p&gt;What's actually in v11.0.0:&lt;/p&gt;

&lt;p&gt;Removed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom FaceID framework, completely, replaced by OS-native biometric auth&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vocab&lt;/code&gt;, it never fit what APM was supposed to do&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;brutetest&lt;/code&gt;, unused and not worth keeping&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;audit&lt;/code&gt;, replaced by a much stronger command below&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native TouchID support on macOS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lgit&lt;/code&gt;, a proper mini-git for your vault. Supports signing, log view, and options &lt;code&gt;audit&lt;/code&gt; never had&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cleanup&lt;/code&gt;, a command that scans your vault for unused, deprecated, or unrecognized entries and asks permission before fixing them&lt;/li&gt;
&lt;li&gt;Automatic vault repair. If APM detects a corrupted or outdated vault while decrypting, it now offers to fix it right there instead of failing silently&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also made APM installable using homebrew. Next is AUR on the package manager checklist.&lt;/p&gt;

&lt;p&gt;If there's one thing I'm taking from this release, it's that removing the wrong decision is sometimes more valuable than shipping the next feature. Half of v11.0.0 is things I took out, not things I added, and the tool is better for it.&lt;/p&gt;

&lt;p&gt;🔗 Full changelog: &lt;a href="https://lnkd.in/dwAtkgrS" rel="noopener noreferrer"&gt;https://lnkd.in/dwAtkgrS&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  buildinpublic #opensource #passwordmanager
&lt;/h1&gt;

</description>
      <category>buildinpublic</category>
      <category>passwordmanager</category>
      <category>go</category>
    </item>
    <item>
      <title>Shipping blob v1.3.0</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Wed, 29 Jul 2026 15:29:53 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/shipping-blob-v130-263j</link>
      <guid>https://dev.to/aaravmaloo/shipping-blob-v130-263j</guid>
      <description>&lt;p&gt;Shipped v1.3.0 of blob, my terminal note manager written in C 🚀.&lt;/p&gt;

&lt;p&gt;The main thing I wanted to fix this release: plugin keybind conflicts were annoying. If two plugins wanted the same key, you had to manually dig through configs to fix it.&lt;/p&gt;

&lt;p&gt;Now it's built into the plugin manager itself. See a [key conflict] tag, hit ENTER, and an interactive flow lets you assign a new key right there. No separate helper plugin required anymore.&lt;/p&gt;

&lt;p&gt;Also added:&lt;br&gt;
→ Undo (u) for destructive actions like trash, delete, rename&lt;br&gt;
→ A full keybinding editor (Ctrl+K) for every keybind in the app&lt;br&gt;
→ An auto-save plugin for notes&lt;br&gt;
→ Expanded help views (Ctrl+O, Ctrl+M) so you can actually see what every key does&lt;/p&gt;

&lt;p&gt;blob is zero-dependency, has its own plugin system, and is available to download via homebrew (I maintain my own tap), winget, and AUR.&lt;/p&gt;

&lt;p&gt;Still building this solo alongside a couple other projects, learning a ton about plugin architecture design along the way.&lt;/p&gt;

&lt;h1&gt;
  
  
  buildinpublic #opensource #c
&lt;/h1&gt;

</description>
      <category>buildinpublic</category>
      <category>opensource</category>
      <category>c</category>
    </item>
    <item>
      <title>I'm now a maintainer of toofan, here's what I shipped</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Sun, 26 Jul 2026 13:43:23 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/im-now-a-maintainer-of-toofan-heres-what-i-shipped-18ng</link>
      <guid>https://dev.to/aaravmaloo/im-now-a-maintainer-of-toofan-heres-what-i-shipped-18ng</guid>
      <description>&lt;p&gt;toofan is Monkeytype, but for your terminal. Minimal, lightweight, zero telemetry, everything stays local. It's sitting at 300+ stars and was recently featured on Terminal Trove.&lt;/p&gt;

&lt;p&gt;I recently became a maintainer, and wanted to write up what I've contributed so far and what I learned building it.&lt;/p&gt;

&lt;p&gt;PR #50: Multiplayer support&lt;br&gt;
toofan was singleplayer-only until now. I reached out to Amit (vyrx-dev), the creator and owner, and he was on board with adding multiplayer, as long as it didn't compromise the core philosophy of the project: minimal, fast, and local-first.&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;br&gt;
** Protocol and hosting **&lt;br&gt;
I used an SSE-based protocol and self-hosted the server myself, listening on port 8525.&lt;/p&gt;

&lt;p&gt;** Server logic (Go) **&lt;br&gt;
When a player joins a room, the server tracks it. Once enough players have joined based on what the host selected, the match starts automatically.&lt;/p&gt;

&lt;p&gt;** Anti-cheat **&lt;br&gt;
The server owns and distributes the word list for every race. Clients never generate or supply their own words, this closes off the obvious vector for injecting an easier list to fake a high WPM.&lt;/p&gt;

&lt;p&gt;** Client integration **&lt;br&gt;
Wired all of this into the existing toofan TUI so multiplayer feels native, not bolted on.&lt;/p&gt;

&lt;p&gt;** AI ghost racers (also in PR #50) **&lt;br&gt;
When no one's online, you can race bots instead. Their progress renders as ghost carets on your screen in real time, and you can race against multiple bots simultaneously, not capped at one.&lt;/p&gt;

&lt;p&gt;** PR #51: Storage consolidation **&lt;br&gt;
Consolidated how race results were being stored into a more efficient format. This closed an issue Amit had opened himself (#55).&lt;/p&gt;

&lt;p&gt;** PR #52: Race your past self **&lt;br&gt;
Every race gets logged to a single races.txt. A ghost caret renders your previous attempt alongside your current one, so you can literally race your own growth over time and see if you're actually improving.&lt;/p&gt;

&lt;p&gt;** What I learned: **&lt;br&gt;
Contributing to toofan pushed me into a few areas I hadn't gone deep on before:&lt;br&gt;
Real-time networking (SSE, connection handling, race-state sync)&lt;br&gt;
Self-hosting and running a small always-on server&lt;br&gt;
UX design for a TUI, this is a different medium than web, spacing and real-time feedback matter a lot more&lt;br&gt;
Maintaining someone else's philosophy for a project while still shipping meaningful features&lt;/p&gt;

&lt;p&gt;Planning to stay on as a long-term contributor. If you're into terminal tools, Go, or just want to race your friends at typing, check it out: &lt;a href="https://github.com/vyrx-dev/toofan" rel="noopener noreferrer"&gt;repo link&lt;/a&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>go</category>
      <category>opensource</category>
    </item>
    <item>
      <title>blob - A minimal notes manager written in C</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Sun, 19 Jul 2026 13:41:16 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/blob-a-minimal-notes-manager-written-in-c-3l6i</link>
      <guid>https://dev.to/aaravmaloo/blob-a-minimal-notes-manager-written-in-c-3l6i</guid>
      <description>&lt;p&gt;I built &lt;strong&gt;blob&lt;/strong&gt;, a minimal, keyboard-driven note manager that lives inline in your terminal — not a fullscreen TUI app, just a fast selector that gets out of your way the moment you're done.&lt;/p&gt;

&lt;p&gt;Some of what's under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~2,600 lines of pure C11, zero runtime dependencies&lt;/li&gt;
&lt;li&gt;Full note lifecycle: create, rename, search, trash/restore, and permanent delete, all with live search and relative timestamps&lt;/li&gt;
&lt;li&gt;A command palette and a real plugin system — plugins declare their own API version, permissions, and run mode, and blob checks compatibility and warns on conflicts before loading them&lt;/li&gt;
&lt;li&gt;11 built-in plugins so far: encryption (lock), git-sync, tagging, fuzzy search, stats, pin, archive, export to HTML/PDF/DOCX, timed reminders, and more&lt;/li&gt;
&lt;li&gt;A cross-platform Makefile (Linux/macOS/Windows via MinGW) with a proper test suite&lt;/li&gt;
&lt;li&gt;Packaged and shipping through real distribution channels — AUR (yay -S blob-bin) and winget (winget install aaravmaloo.blob), on top of GitHub Releases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Blob is extendable using plugins. Each plugin uses a manifest (v2) that defines the permissions it needs and blob, at runtime compiles the plugin's code and stores the binary in its directory. That binary is then used to run that plugin independently.&lt;/p&gt;

&lt;p&gt;The hardest part wasn't the note-taking logic; it was designing the plugin architecture so third-party plugins can't silently do anything dangerous, and getting the packaging right for two completely different platform ecosystems.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/aaravmaloo/blob" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
AUR package: &lt;a href="https://aur.archlinux.org/packages/blob-bin" rel="noopener noreferrer"&gt;AUR page&lt;/a&gt;&lt;br&gt;
Winget PR: &lt;a href="https://github.com/microsoft/winget-pkgs/pull/384242" rel="noopener noreferrer"&gt;PR&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>c</category>
      <category>opensource</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Releasing revera@1.0.0</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Sat, 18 Jul 2026 11:10:37 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/releasing-revera100-2llo</link>
      <guid>https://dev.to/aaravmaloo/releasing-revera100-2llo</guid>
      <description>&lt;p&gt;Today I launched &lt;a href="mailto:revera@1.0.0"&gt;revera@1.0.0&lt;/a&gt;, upgrading from 0.1.0 to stable.&lt;br&gt;
revera is a CLI that scores npm packages for security risk before you install them. The 1.0.0 rewrite replaces fixed weights with a Bayesian evidence engine: every package becomes a node in its dependency graph, gets scored across 8 categories from real signals (vuln feeds, publisher trust, GitHub activity, typosquat detection), and risk propagates bottom-up through the whole dependency tree, not just the top-level package.&lt;br&gt;
Previously it used pre-defined weights. Now it decides its own weights from the evidence.&lt;br&gt;
npm install revera&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>I made revera, a tool that scores NPM packages before you blindly install them</title>
      <dc:creator>Aarav Maloo</dc:creator>
      <pubDate>Sun, 05 Jul 2026 18:22:06 +0000</pubDate>
      <link>https://dev.to/aaravmaloo/i-made-revera-a-tool-that-scores-npm-packages-before-you-blindly-install-them-2mf6</link>
      <guid>https://dev.to/aaravmaloo/i-made-revera-a-tool-that-scores-npm-packages-before-you-blindly-install-them-2mf6</guid>
      <description>&lt;p&gt;Ever installed an npm package without really knowing what you were pulling into your project? I did too, and it bugged me enough that I built Revera.&lt;br&gt;
Revera scores any npm package using a weighted algorithm across maintainability, trust signals, release history, download trends, and more, giving you a single, explainable score before you npm install blindly.&lt;br&gt;
Some of the features I'm proud of:&lt;/p&gt;

&lt;p&gt;🔍 why breaks down exactly why a package scored the way it did&lt;br&gt;
🩺 doctor checks that your setup is healthy&lt;br&gt;
⚡ 24h local caching for speed&lt;br&gt;
🔐 GitHub login for higher rate limits&lt;br&gt;
⚙️ Fully customizable scoring config&lt;br&gt;
📂 audit scans your working directory and scores everything at once&lt;/p&gt;

&lt;p&gt;It's still evolving, though, the algorithm isn't perfect yet, but it's getting close, and every bit of feedback (good or brutal) helps me improve it.&lt;br&gt;
Would genuinely love for you to try it out:&lt;br&gt;
📦 npm: &lt;a href="https://www.npmjs.com/package/@aaravmaloo/revera" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@aaravmaloo/revera&lt;/a&gt;&lt;br&gt;
💻 GitHub: &lt;a href="https://github.com/aaravmaloo/revera" rel="noopener noreferrer"&gt;https://github.com/aaravmaloo/revera&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>cli</category>
      <category>npm</category>
    </item>
  </channel>
</rss>
