<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/rss/atom-styles.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Monawwar Abdullah</title>
  <subtitle>Building thoughtful software, developer tools, and open-source products.</subtitle>
  <link href="https://mxv.sh//atom.xml" rel="self" type="application/atom+xml"/>
  <link href="https://mxv.sh/" rel="alternate" type="text/html"/>
  <updated>2026-05-14T11:51:07.409Z</updated>
  <language>en</language>
  <id>https://mxv.sh//</id>
  <author>
    <name>Monawwar Abdullah</name>
    <uri>https://mxv.sh/</uri>
  </author>
  <generator uri="https://github.com/Dnzzk2/Litos" version="5.0">Astro Litos Theme</generator>
  <rights>Copyright © 2026 Monawwar Abdullah</rights>
  
  <entry>
    <title>Using Multiple Claude Code Accounts on One Machine</title>
    <link href="https://mxv.sh//posts/multiple-claude-sessions" rel="alternate" type="text/html"/>
    <id>https://mxv.sh//posts/multiple-claude-sessions</id>
    <updated>2026-03-30T00:00:00.000Z</updated>
    <published>2026-03-30T00:00:00.000Z</published>
    <author>
      <name>Monawwar Abdullah</name>
    </author>
    <summary type="text">A simple way to keep personal and work Claude Code sessions separate.</summary>
    <content type="html"><![CDATA[<img src="https://mxv.sh/_astro/banner.D13ttfOK_9UM5q.webp" alt="Using Multiple Claude Code Accounts on One Machine" style="width: 100%; height: auto; margin-bottom: 1em;" />
<p>If you use Claude Code for both personal and work accounts, logging in and out gets old fast.
The cleaner setup is to give each account its own config directory. Claude stores local auth and session state there, so separate directories act like separate profiles.
The result is simple:</p>
<ul>
<li><code>claude</code> can stay on your default account</li>
<li><code>claude-work</code> can open your work account</li>
<li>no repeated sign-in/sign-out cycle</li>
</ul>
<h2>How it works</h2>
<p>Claude Code can be launched with a custom <code>CLAUDE_CONFIG_DIR</code>.</p>
<p>Example:</p>
<pre><code>CLAUDE_CONFIG_DIR="$HOME/.claude-work" claude
</code></pre>
<p>When you do that, Claude uses <code>~/.claude-work</code> instead of the default config directory. That means auth, session history, and local state stay isolated from your main account.</p>
<h2>Fish setup</h2>
<p>If you use <code>fish</code>, add this to <code>~/.config/fish/config.fish</code>:</p>
<pre><code>function claude-work
    env CLAUDE_CONFIG_DIR="$HOME/.claude-work" claude $argv
end
</code></pre>
<p>Reload your shell:</p>
<pre><code>source ~/.config/fish/config.fish
</code></pre>
<h2>Zsh setup</h2>
<p>If you use <code>zsh</code>, add this to <code>~/.zshrc</code>:</p>
<pre><code>alias claude-work='CLAUDE_CONFIG_DIR="$HOME/.claude-work" claude'
</code></pre>
<p>Reload your shell:</p>
<pre><code>source ~/.zshrc
</code></pre>
<h2>Create the separate profile directory</h2>
<p>Run this once:</p>
<pre><code>mkdir -p ~/.claude-work
</code></pre>
<p>Then start the isolated profile with:</p>
<pre><code>claude-work
</code></pre>
<p>The first time it opens, log into your work account inside that profile.</p>
<h2>What your final workflow looks like</h2>
<p>Once setup is done:</p>
<ul>
<li><code>claude</code> uses your default profile</li>
<li><code>claude-work</code> uses your work profile</li>
</ul>
<p>That gives you clean switching between accounts without cross-contaminating local state.</p>
<h2>Scaling to more than two accounts</h2>
<p>This pattern works for any number of accounts or clients.
Examples:</p>
<pre><code>CLAUDE_CONFIG_DIR="$HOME/.claude-client-a" claude

CLAUDE_CONFIG_DIR="$HOME/.claude-client-b" claude

CLAUDE_CONFIG_DIR="$HOME/.claude-lab" claude
</code></pre>
<p>You can wrap each one in a shell alias or function:</p>
<ul>
<li><code>claude-work</code></li>
<li><code>claude-acme</code></li>
<li><code>claude-prod</code></li>
</ul>
<h2>One useful safety check</h2>
<p>After launching a profile, run <code>/status</code> inside Claude to confirm which account and session you are using.</p>
<img src="./assets/SCR-20260330-krmz.png" alt="SCR-20260330-krmz.png" />
<p>That is the easiest way to avoid doing work in the wrong account.</p>
<h2>Why this setup is worth it</h2>
<ul>
<li>no repeated login/logout flow</li>
<li>separate local state per account</li>
<li>cleaner personal vs work separation</li>
<li>easy to remember and easy to extend</li>
</ul>
<p>If you manage multiple Claude Code identities on one laptop, this is the simplest setup that stays practical.</p>]]></content>
    <category term="claude-code" />
    <category term="productivity" />
    <category term="cli" />
    <category term="workflow" />
  </entry>
  <entry>
    <title>How I built SVGLogo.dev</title>
    <link href="https://mxv.sh//posts/how-i-built-svglogo" rel="alternate" type="text/html"/>
    <id>https://mxv.sh//posts/how-i-built-svglogo</id>
    <updated>2026-03-11T00:00:00.000Z</updated>
    <published>2026-03-11T00:00:00.000Z</published>
    <author>
      <name>Monawwar Abdullah</name>
    </author>
    <summary type="text">Building a browser-based SVG logo maker — canvas experiments, a Reddit launch, six community-driven updates, and a migration to TanStack Start on Cloudflare.</summary>
    <content type="html"><![CDATA[<img src="https://mxv.sh/_astro/banner.dcf-TS0J_24Tvrq.webp" alt="How I built SVGLogo.dev" style="width: 100%; height: auto; margin-bottom: 1em;" />
<p>Every side project needs a logo. Not a designed-by-a-professional logo — just something that says “this has a visual identity.” A favicon, a social card, something to put in the README. The usual solution is to spend 20 minutes in Figma making something barely passable, or pay for a tool that assumes you want to build a Fortune 500 brand.</p>
<p>I wanted neither. I wanted to pick an icon, drop it on a colored background, and export it. Done. That’s <a href="https://svglogo.dev" rel="noopener noreferrer" target="_blank">svglogo.dev</a>.</p>
<h2>What it does</h2>
<p>You search for an icon from the Iconify library — thousands of icons covering every major icon set — pick a background color or gradient, adjust the border radius, set an outline if you want one, and export. SVG, PNG, or ICO. Everything runs in the browser, no server needed for the core logo generation.</p>
<p>The result is a clean icon-based logo mark you can drop into a landing page, a GitHub repo, or a browser tab in under a minute.</p>
<h2>Night one</h2>
<p>The first commit landed at 11&lt;29&gt; PM on March 11. I went with Next.js — familiar, fast to set up, gets out of the way.</p>
<p>By 2 AM I had:</p>
<ul>
<li>Icon search and picker (Iconify’s React component with a searchable grid)</li>
<li>Background color and gradient controls</li>
<li>Border radius slider</li>
<li>Icon outline/border toggle</li>
<li>Randomize button to generate a random logo with one click</li>
<li>Copy/paste support — copy your config as JSON, paste it somewhere else</li>
<li>Animated dice button because a randomize button should feel fun</li>
<li>Tooltips on every control</li>
</ul>
<p>The core loop was working. Pick icon → style it → export it.</p>
<h2>The dock UI</h2>
<p>My first instinct was a canvas-based design — a drag-and-drop editor where you’d position elements and manipulate them directly. I built a rough version. It felt wrong immediately. Too heavy. Too much clicking around to do simple things. The kind of UI that makes you feel like you’re using design software when you just want to change a background color.</p>
<p>I scrapped it and asked myself what the actual interaction was: the user looks at the preview and tweaks controls until it looks right. That’s it. So I put the preview front and center, and built a dock at the bottom of the screen — a fixed bar with every control always visible and one click away.</p>
<p>No panels to open. No tabs to switch. You see the logo, you reach down to the dock, you adjust. The whole thing is instant.</p>
<p>I added undo/redo early. It’s one of those things that feels like polish but is actually table stakes. If you accidentally blow away a gradient you liked, you need to get it back.</p>
<h2>Keyboard shortcuts</h2>
<p>Power users want keyboard shortcuts. I added an <code>InfoFab</code> — a floating button that shows the available shortcuts:</p>
<ul>
<li><code>R</code> — randomize</li>
<li><code>V</code> — paste config from clipboard</li>
<li><code>Ctrl+Z / Ctrl+Shift+Z</code> — undo/redo</li>
</ul>
<p>The shortcut for paste was originally <code>P</code> but I changed it to <code>V</code> since <code>V</code> is the mental model people already have for paste.</p>
<h2>The sharing problem</h2>
<p>A logo tool without sharing is just a local toy. I wanted people to be able to share a logo configuration — a URL that anyone could open and see the same logo.</p>
<p>The implementation is straightforward: serialize the logo config to a JSON object, store it server-side, and return a short ID. The share URL is just <code>/?s=[id]</code> — a query param on the homepage. When someone opens it, the config is fetched and loaded into the editor.</p>
<p>After migrating to Cloudflare, I swapped the storage layer to Cloudflare KV — no separate Redis instance to manage, globally distributed, and the pricing is generous enough that a logo tool never has to think about it.</p>
<h2>Collections</h2>
<p>After sharing, the next obvious feature was saving. People wanted to collect logo variants — try five different color combinations and keep the ones they liked.</p>
<p>Collections are stored in <code>localStorage</code> — no login, no backend, no friction. You click the heart button and the config is saved. Your collection persists across sessions in the same browser.</p>
<p>It’s the right call for a tool like this. A sign-in flow would add complexity and kill the “open and go” experience that makes the tool useful.</p>
<h2>Onboarding</h2>
<p>A tool with a clean UI can still be confusing if you don’t know where to start. I added an onboarding wizard — a short guided tour that highlights the main controls in sequence. It runs on first visit and can be triggered again from the info button.</p>
<p>The tour doesn’t lock you out of the UI while it runs. It just highlights the relevant area and tells you what it does. Then it gets out of the way.</p>
<h2>The migration: Next.js → TanStack Start</h2>
<p>After launch and the Reddit feedback wave, I migrated from Next.js to TanStack Start. The trigger was Cloudflare — TanStack Start deploys to Cloudflare Workers with almost no friction, and the performance difference is noticeable. Faster cold starts, better edge routing, and the app just feels snappier.</p>
<p>Once I started looking at Cloudflare seriously, the full picture clicked. TanStack Start’s routing model also fits the app better than Next.js did.</p>
<p>Speaking of Cloudflare — I moved off Vercel at the same time. Cloudflare Workers gives you unlimited bandwidth with limits that reset daily, and the pricing starts at $5. For a tool that can generate a lot of traffic from a single Reddit post, that’s a much more comfortable place to be than a platform that charges per GB after a free tier.</p>
<h2>Reddit and the feedback loop</h2>
<p>I posted svglogo.dev on Reddit. Real users showed up, and real feedback followed immediately. Six updates shipped directly from what people asked for.</p>
<p><strong>Mobile support.</strong> The desktop-only notice was the first thing people pushed back on. Fair enough — if you’re browsing on your phone and you find a tool you want to use, a wall saying “come back on desktop” is frustrating. I rebuilt the layout to work on smaller screens and removed the notice.</p>
<p><strong>Search all icons on no results.</strong> When a search returned nothing in the current icon set, there was a dead end. Someone suggested a fallback: a button to search across all icon sets at once. Simple addition, much better experience when you can’t find what you’re looking for.</p>
<p><strong>Hex input in the color picker.</strong> The color picker was visual-only. Several people asked for a hex input so they could paste in a brand color directly. Added it.</p>
<p><strong>Multiple gradient stops.</strong> The gradient control started with two stops. People building more complex backgrounds wanted more control — three, four, five stops. Extended the gradient system to support it.</p>
<p><strong>Testimonials.</strong> Someone who used the tool to build a logo for their startup shared it in the thread. Then another. Then a few more. I added a testimonials section to the homepage. Social proof built by the community.</p>
<p><strong>Advanced export.</strong> Power users wanted more control over the PNG export — custom sizes, padding, scale. Added an advanced export panel with those options.</p>
<p>Every one of these came from reading comments and shipping the same week. That feedback loop is worth more than any amount of solo planning.</p>
<h2>What I’d do differently</h2>
<p><strong>Ship the sharing feature earlier.</strong> It unlocked the social side of the tool — the ability to send a logo to someone for feedback, the shareable URLs that spread the tool around. Everything downstream of it would have been cleaner if I’d designed for it from the start.</p>
<p><strong>localStorage was the right call for collections.</strong> I considered adding auth and a real database. I’m glad I didn’t. The tool works without an account. That’s a feature.</p>
<p><strong>Post to Reddit earlier.</strong> The six updates I shipped after the Reddit post were better than anything I came up with building alone. Real users with real use cases find the gaps you don’t. The sooner you get in front of them, the faster the product improves.</p>
<hr />
<p><a href="https://svglogo.dev" rel="noopener noreferrer" target="_blank">svglogo.dev</a> is free and open source. If you need a logo for your next project, give it a try. If you find a bug or have a feature idea, the repo is on GitHub.</p>]]></content>
    <category term="svglogo" />
    <category term="tanstack" />
    <category term="journey" />
    <category term="indie" />
    <category term="tools" />
  </entry>
  <entry>
    <title>Why I built Drivebase</title>
    <link href="https://mxv.sh//posts/why-i-built-drivebase" rel="alternate" type="text/html"/>
    <id>https://mxv.sh//posts/why-i-built-drivebase</id>
    <updated>2026-03-04T00:00:00.000Z</updated>
    <published>2026-03-04T00:00:00.000Z</published>
    <author>
      <name>Monawwar Abdullah</name>
    </author>
    <summary type="text">My journey from building a Telegram file manager to creating a unified storage solution.</summary>
    <content type="html"><![CDATA[
<h2>Little history</h2>
<p>It started back in 2025 when I wanted to upload files to Telegram. I had many files in Saved Messages, but it was becoming difficult to manage them. I didn’t have a structured way to organize my files.</p>
<p>I wanted a place where I could create folders and upload files, while the content would still be saved in Telegram’s Saved Messages. So I built Drivegram, a file manager specifically for Telegram.</p>
<pre><code>App UI
   ↓
Backend
   ↓
Telegram API
   ↓
Saved Messages storage
</code></pre>
<h2>What Drivebase Can Do Today</h2>
<p>Fast forward today, its now been renamed to Drivebase, and supports not only Telegram but major other storage provider, and slowly adding more in the future as the app grows.</p>
<p>Drivebase evolved from a Telegram file hack into a unified storage layer. Instead of juggling multiple storage apps, Drivebase lets you connect them all in one place and manage them through a single interface.</p>
<pre><code>interface StorageProvider {
  upload()
  download()
  list()
  delete()
}
</code></pre>
<p>The experience is intentionally designed to feel like a normal file manager, even though the data may live across completely different providers.</p>
<p>Checkout the <a href="https://drivebase.io" rel="noopener noreferrer" target="_blank">website</a> to get started. Or clone the <a href="https://github.com/drivebase/drivebase" rel="noopener noreferrer" target="_blank">source code</a> from Github.</p>]]></content>
    <category term="open-source" />
    <category term="journey" />
    <category term="storage" />
    <category term="telegram" />
  </entry>
</feed>