<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Shreyam's Dev Notes]]></title><description><![CDATA[Shreyam's Dev Notes]]></description><link>https://shreyam1008.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Shreyam&apos;s Dev Notes</title><link>https://shreyam1008.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 15:04:32 GMT</lastBuildDate><atom:link href="https://shreyam1008.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why Solo Developers Keep Fixing Developer Experience]]></title><description><![CDATA[Big technology companies own much of the web. Yet some of the tools I enjoy most come from a solo developer or a tiny team.
That is not because large teams cannot build good software. They have shippe]]></description><link>https://shreyam1008.hashnode.dev/why-solo-developers-keep-fixing-developer-experience</link><guid isPermaLink="true">https://shreyam1008.hashnode.dev/why-solo-developers-keep-fixing-developer-experience</guid><category><![CDATA[developer experience]]></category><category><![CDATA[open source]]></category><category><![CDATA[Bun]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Shreyam Adhikari]]></dc:creator><pubDate>Fri, 18 Sep 2026 09:45:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a9fe4c35480904fe7ef70d3/c14d1092-6f94-483e-b218-4c62583019af.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Big technology companies own much of the web. Yet some of the tools I enjoy most come from a solo developer or a tiny team.</p>
<p>That is not because large teams cannot build good software. They have shipped important foundations: languages, runtimes, databases, browsers, and operating systems. The difference is the feedback loop. A small team often feels one sharp annoyance directly and can decide to fix it without moving through a large product map.</p>
<p>My longer essay, <a href="https://shreyam1008.com.np/log/big-tech-lone-devs/">Big Tech Owns the Web. So Why Do the Best Ideas Still Come From Lone Devs?</a>, is a personal argument about that gap. It is not a measured ranking of every company or independent project.</p>
<h2>Pain is a useful specification</h2>
<p>When a developer is also the user, small problems are hard to ignore:</p>
<ul>
<li>a build that takes too long;</li>
<li>a configuration file that explains nothing;</li>
<li>an API that needs five wrappers before it is pleasant;</li>
<li>a tool that is powerful but makes the first step feel ceremonial.</li>
</ul>
<p>The fix does not need a committee to be valid. It needs to make the next use better.</p>
<p>That is why small tools can feel unusually direct. They are often built around one clear promise instead of ten product lines and several layers of compatibility.</p>
<h2>The newer tool wave</h2>
<p>Bun is an example of a project selling a simpler runtime and toolchain story. Elysia focuses on a clean TypeScript server experience. Effect tries to make difficult application concerns explicit instead of scattering them across libraries.</p>
<p>These projects have different goals and trade-offs. I do not treat them as proof that every older tool is obsolete. I see them as signals: developers keep building new layers because the base experience still leaves room for improvement.</p>
<p>The same pattern appears in open-source editors, database tools, terminal programs, and small deployment utilities. A project can be technically modest and still change how a person works every day.</p>
<h2>What big teams are good at</h2>
<p>Large companies bring resources that small projects do not: compatibility work, security teams, documentation staff, infrastructure, and long maintenance horizons. That work is less visible than a clever new tool, but it matters.</p>
<p>The problem is that scale can also make friction harder to remove. A change that helps one developer may conflict with a platform promise, a partner, an older version, or a business metric. The system becomes stable, but not always pleasant.</p>
<p>Small teams can move faster because they have fewer promises to preserve. They can also break more easily because fewer people are checking the edges.</p>
<h2>The craft is the point</h2>
<p>I am drawn to projects that make a narrow workflow feel considered. Fast startup, a readable error, one fewer configuration step, a command that tells the truth—these details compound.</p>
<p>The lesson is not “always choose the solo project.” It is to notice where the best feedback is coming from. The person closest to the pain may have the clearest idea of what to remove.</p>
<p>Big Tech can build the foundation. A lone developer can still show what the front door should feel like.</p>
<p>This is a short companion to the <a href="https://shreyam1008.com.np/log/big-tech-lone-devs/">full developer-experience essay</a>. Edited with AI assistance.</p>
]]></content:encoded></item><item><title><![CDATA[Why AI Agents Like Linux's Text Surfaces]]></title><description><![CDATA[Linux has always left a lot of its workings in the open: files, commands, logs, services, and configuration. That can feel like poor user experience when a person only wants Wi-Fi to work.
In an AI-as]]></description><link>https://shreyam1008.hashnode.dev/why-ai-agents-like-linux-s-text-surfaces</link><guid isPermaLink="true">https://shreyam1008.hashnode.dev/why-ai-agents-like-linux-s-text-surfaces</guid><category><![CDATA[Linux]]></category><category><![CDATA[ai agents]]></category><category><![CDATA[command line]]></category><category><![CDATA[automation]]></category><dc:creator><![CDATA[Shreyam Adhikari]]></dc:creator><pubDate>Fri, 18 Sep 2026 09:44:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a9fe4c35480904fe7ef70d3/50d32a40-438c-4bb9-ae2b-1d05be4e1b1e.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Linux has always left a lot of its workings in the open: files, commands, logs, services, and configuration. That can feel like poor user experience when a person only wants Wi-Fi to work.</p>
<p>In an AI-assisted workflow, the same surfaces can become useful handles. An agent can inspect a file, call a command, read a service status, compare a configuration, and explain the result without trying to recognize a changing screen.</p>
<p>My full essay, <a href="https://shreyam1008.com.np/log/linux-ai-agent-moment/">Linux Might Finally Have Found Its Moment</a>, is an opinion piece, not a claim that Linux has suddenly become the best desktop for everyone. The narrower idea is that readable system state is valuable when software has to inspect and repair a machine.</p>
<h2>Text is an API-shaped surface</h2>
<p>Suppose the question is “what changed?” A GUI may require opening a settings panel, finding the right page, and remembering which value was there before. A text surface can answer with a file diff or a command result.</p>
<p>These are ordinary examples:</p>
<pre><code class="language-sh">cat /etc/os-release
systemctl --user status
journalctl --user -n 30
wpctl status
</code></pre>
<p>The exact commands depend on the distribution and services installed. They are not magic universal controls. They are readable entry points that an agent can call, parse, and check.</p>
<p>The useful loop is:</p>
<pre><code class="language-text">inspect → change one thing → check the result → explain what happened
</code></pre>
<p>That loop is easier to audit when the system gives you text instead of only a visual state.</p>
<h2>The old weakness becomes a design choice</h2>
<p>Linux did not become approachable because every GUI was rebuilt. Its strength is that many important layers remain scriptable. An agent does not need a perfect settings panel if it can read the state and use a documented command.</p>
<p>That does not mean text is always better. A person may prefer a clear panel for a one-time action. An agent can also make a wrong change very quickly. Good automation needs permissions, a small scope, confirmation for risky operations, and a way to show what changed.</p>
<p>The best interface may be both: a human-friendly control and a text path underneath it.</p>
<h2>Gaming made the platform less abstract</h2>
<p>SteamOS, Proton, and the Steam Deck helped Linux reach people who did not arrive for an operating-system philosophy. They arrived to play a game.</p>
<p>That matters because a platform becomes useful when it meets a real task. The same hidden-system pattern can help with local development, automation, and AI-assisted computing. A readable service file is not exciting, but it is a good place to start when something needs inspection.</p>
<h2>Linux is not a universal answer</h2>
<p>The text-first path can be frustrating. Hardware support, audio stacks, desktop defaults, and distribution differences still make Linux work uneven. Agents do not remove those differences; they need to understand them.</p>
<p>What changed is the value of the underlying handles. Files, logs, commands, and services are not only things a human expert can memorize. They are also data an assistant can inspect and discuss.</p>
<p>That is why I think Linux may have a useful moment in the agent era: not because every GUI is perfect, but because the system underneath has been exposed for a long time.</p>
<p>This is a short companion to the <a href="https://shreyam1008.com.np/log/linux-ai-agent-moment/">full Linux essay</a>. Edited with AI assistance.</p>
]]></content:encoded></item><item><title><![CDATA[Why I Built dbterm: A Small Database Workbench]]></title><description><![CDATA[Most of my database work was the same four things:

Take a backup.
See the data quickly.
Follow one record across related tables.
Run a small query.

I kept opening large tools such as DBeaver or MySQ]]></description><link>https://shreyam1008.hashnode.dev/why-i-built-dbterm-a-small-database-workbench</link><guid isPermaLink="true">https://shreyam1008.hashnode.dev/why-i-built-dbterm-a-small-database-workbench</guid><category><![CDATA[dbterm]]></category><category><![CDATA[SQLite]]></category><dc:creator><![CDATA[Shreyam Adhikari]]></dc:creator><pubDate>Fri, 18 Sep 2026 09:43:05 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a9fe4c35480904fe7ef70d3/a9db1156-32b8-4ff7-a00c-64d6af95119c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most of my database work was the same four things:</p>
<ol>
<li>Take a backup.</li>
<li>See the data quickly.</li>
<li>Follow one record across related tables.</li>
<li>Run a small query.</li>
</ol>
<p>I kept opening large tools such as DBeaver or MySQL Workbench, then used one small corner of them. A five-year-old laptop made the mismatch hard to ignore. I wanted something that opened quickly, stayed keyboard-friendly, and did the useful part without a long ceremony.</p>
<p>That became <a href="https://dbterm.shreyam1008.com.np/">dbterm</a>, a Go database workbench. The <a href="https://github.com/shreyam1008/dbterm">source is on GitHub</a>, and the full <a href="https://shreyam1008.com.np/log/building-dbterm/">Why I Built dbterm</a> log has the interactive demo.</p>
<h2>The useful loop comes first</h2>
<p>The first version was read-focused, not read-only. I wanted to scan a table, sort it, refresh it, copy a key, and move to related rows without losing my place.</p>
<p>That sounds small, but it covers a surprising amount of daily work. A customer row can lead to orders. An order can lead to payments. The important action is often not a large query; it is moving through the data with enough context to ask the next question.</p>
<p>Queries and broader data workflows still matter. The point is to keep the everyday loop small even when the product grows.</p>
<h2>Why Go fit the project</h2>
<p>Go kept the development loop short. Builds were fast, tests were plain, and a single binary made it easier to try the tool on another machine.</p>
<p>The big feature flows came first. Then hundreds of smaller requirements arrived: keyboard paths, empty states, refresh behavior, error messages, backup details, and regression checks. The rhythm was simple:</p>
<pre><code class="language-text">build the path → test the real behavior → merge a small change → repeat
</code></pre>
<p>AI helped with parts of the implementation and editing, but the product still needed actual builds and tests. A generated suggestion is not evidence that a database operation is safe.</p>
<h2>The backup agent grew beside the TUI</h2>
<p>The backup side follows a careful pipeline:</p>
<pre><code class="language-text">source → verify → compress → encrypt → publish
</code></pre>
<p>The source and destination stay independent. dbterm supports PostgreSQL, MySQL and MariaDB, SQLite, Turso, and Cloudflare D1. Backups can move local-to-local, local-to-remote, remote-to-local, or remote-to-remote through the supported destinations.</p>
<p>Restore is deliberately narrower than backup today: PostgreSQL, MySQL and MariaDB, plus local SQLite. dbterm is useful, but it is not a claim that every path is finished or bug-free.</p>
<h2>A small tool should tell the truth</h2>
<p>The goal is not to replace every database client. It is to make the repeated read-and-check work feel lighter, especially on modest hardware.</p>
<p>That also means keeping the limits visible. A terminal UI is not automatically faster for every person. A backup is not complete until its copy and verification path are understood. A small binary is not a guarantee of small queries or fast networks.</p>
<p>I built dbterm because I wanted a calmer database loop. Open it, inspect the data, follow the useful relationship, run the small query, and leave with a backup I can explain.</p>
<p>This is a short companion to the <a href="https://shreyam1008.com.np/log/building-dbterm/">full dbterm article</a>. Edited with AI assistance.</p>
]]></content:encoded></item><item><title><![CDATA[Measuring the Hidden Cost of a Desktop WebView]]></title><description><![CDATA[Every desktop app has a good reason to use resources. The problem is that I run many of them together.
My desktop might have VS Code or Cursor, Discord, WhatsApp, a database client, a music player, an]]></description><link>https://shreyam1008.hashnode.dev/measuring-the-hidden-cost-of-a-desktop-webview</link><guid isPermaLink="true">https://shreyam1008.hashnode.dev/measuring-the-hidden-cost-of-a-desktop-webview</guid><category><![CDATA[desktop apps]]></category><category><![CDATA[webview]]></category><category><![CDATA[Electron]]></category><category><![CDATA[performance]]></category><category><![CDATA[Tauri]]></category><dc:creator><![CDATA[Shreyam Adhikari]]></dc:creator><pubDate>Fri, 18 Sep 2026 09:41:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a9fe4c35480904fe7ef70d3/ac4aea9f-b89b-4b81-a293-20d1f8cb9dad.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every desktop app has a good reason to use resources. The problem is that I run many of them together.</p>
<p>My desktop might have VS Code or Cursor, Discord, WhatsApp, a database client, a music player, and the browser itself. Each app can make a sensible case for its memory and processes. The computer still has one memory pool, one battery, and one fan.</p>
<p>My original essay, <a href="https://shreyam1008.com.np/log/desktop-app-stack-gap-2026/">I just wanted a small desktop app</a>, compares Electron, Tauri, Wails, Electrobun, Flutter, and native toolkits. The practical point is simpler: measure the whole app before deciding that one framework is light or heavy.</p>
<h2>One window can mean several processes</h2>
<p>Electron ships Chromium and Node with the application. A system-WebView app avoids shipping the same browser distribution, but it still needs a web engine. On Windows, WebView2 uses Chromium. On macOS, a normal system path uses WKWebView. On Linux, Tauri commonly uses WebKitGTK.</p>
<p>The host executable is only one part of the picture. A WebView2 group can include a browser process, renderer processes, and helpers such as GPU or audio processes. The exact group depends on the app, the workload, and what else is running on the machine.</p>
<p>That is why a single Task Manager row can mislead. It may undercount the app, while adding every msedgewebview2.exe process on the computer may overcount it.</p>
<h2>A small measurement routine</h2>
<p>Use the same app version and the same workload each time. Let startup settle before recording a number. Compare an idle window, normal work, and the state after quitting.</p>
<p>On Windows, Process Explorer makes the parent-child tree visible. For a WebView2 app, follow the parentage and command line to identify only the helpers belonging to that app. Record both <strong>Private Bytes</strong> and <strong>Working Set</strong>; they answer different questions.</p>
<p>On macOS, Activity Monitor can show all processes hierarchically. Check Memory Pressure and Swap Used as well as the app rows.</p>
<p>On Linux, start with a process tree:</p>
<pre><code class="language-sh">ps -eo pid,ppid,rss,comm --forest
</code></pre>
<p>RSS includes shared resident pages. For a more useful comparison, inspect proportional set size for each identified process:</p>
<pre><code class="language-sh">awk '/^Pss:/ {print $2 " KiB"}' /proc/1234/smaps_rollup
</code></pre>
<p>Replace 1234 with the process ID. PSS apportions shared resident pages, so it is better than blindly adding RSS. It is still a snapshot, not a complete GPU-memory or peak-usage measurement.</p>
<h2>What the numbers can and cannot say</h2>
<p>A smaller installer is a real benefit. A small host process can also be real. Neither number alone tells me what the user pays while the app is open.</p>
<p>The same warning applies to native, Rust, or Go hosts: any of them can do unnecessary work. The useful comparison is the product with its real workload, not a framework slogan.</p>
<p>I still want a small desktop app to open quickly, behave like the rest of the operating system, and leave room for the other nine apps on my screen. Until the perfect answer exists, following the whole process group is a better starting point than arguing from one executable size.</p>
<p>This is a focused companion to the <a href="https://shreyam1008.com.np/log/desktop-app-stack-gap-2026/">full desktop-framework essay</a> and the accepted <a href="https://hackernoon.com/desktop-apps-keep-getting-heavier">HackerNoon version</a>. Edited with AI assistance.</p>
]]></content:encoded></item><item><title><![CDATA[BUI: Why I borrow the browser for local tools]]></title><description><![CDATA[A download can run for hours. I might only need its interface for a minute.
That is the question behind BUI — Browser User Interface: if the work needs a local program, does the interface need its own]]></description><link>https://shreyam1008.hashnode.dev/bui-why-i-borrow-the-browser-for-local-tools</link><guid isPermaLink="true">https://shreyam1008.hashnode.dev/bui-why-i-borrow-the-browser-for-local-tools</guid><dc:creator><![CDATA[Shreyam Adhikari]]></dc:creator><pubDate>Tue, 08 Sep 2026 10:48:26 GMT</pubDate><content:encoded><![CDATA[<p>A download can run for hours. I might only need its interface for a minute.</p>
<p>That is the question behind <strong>BUI — Browser User Interface</strong>: if the work needs a local program, does the interface need its own desktop shell?</p>
<p>I also think of it as <em>Borrowed UI</em>. The app brings the functionality and borrows the browser already on the machine.</p>
<h2>A name for an existing pattern</h2>
<p>There is no new invention here. A local process serves HTML, CSS, and JavaScript. The browser displays the controls. A guarded API connects those controls to the native program doing the work.</p>
<p>It is still a GUI. BUI is simply the label I use for this packaging choice.</p>
<p>The reason I care is practical: I know how to build useful forms, tables, and inspectors with web tools. For some utilities, I would rather spend time making those interactions good than packaging another desktop shell.</p>
<h2>Where ProtoPeek fits</h2>
<p>I build <a href="https://protopeek.shreyam1008.com.np/">ProtoPeek</a>, a local service workbench. Its Go process serves an embedded web interface and handles protocol operations behind it. The page can show a gRPC request form while the backend makes the native gRPC call.</p>
<p>The browser gives me room for searchable lists, request forms, and response inspection. The local process provides the capabilities the page needs.</p>
<p>That separation is useful for a download queue, a database inspector, or a batch-processing tool: open the controls when you need them, while the backend owns the work. Keeping jobs alive, reconnecting, and cancelling them correctly still requires implementation. Closing a tab does not magically provide any of that.</p>
<h2>Why borrow the browser?</h2>
<p>For an occasional utility, distributing another browser engine may be unnecessary. Using the installed browser lets the application ship its own backend and web assets.</p>
<p>But smaller packaging is only one part of the decision. The browser still uses memory. The backend still needs a sensible startup and shutdown story. Native integration, accessibility, and keyboard behavior still matter.</p>
<p>I would measure the backend and the extra browser workload together before claiming a performance win. I would also make a different decision for a tool whose value depends on deep desktop integration.</p>
<h2>The boundary matters</h2>
<p>The browser stays sandboxed. A backend can access files or native libraries because it has its own permissions, not because a web page suddenly gains those powers.</p>
<p>That makes the local API an important boundary: keep operations narrow and authenticated, and treat exposing it beyond the local machine as a separate decision.</p>
<p>BUI is useful to me when the interface is occasional and the local work has a longer life. It gives that familiar choice a short name.</p>
<p>This is a shorter companion to my original essay, <a href="https://shreyam1008.com.np/log/local-web-surfaces">BUI: The UI Solution We Already Had</a>, which includes examples, architecture diagrams, measurements, and trade-offs.</p>
<p><em>Adapted from my original article with AI assistance.</em></p>
]]></content:encoded></item></channel></rss>