<?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>Forem: Tools Crazy</title>
    <description>The latest articles on Forem by Tools Crazy (@tools_crazy_e6532397d4aa8).</description>
    <link>https://forem.com/tools_crazy_e6532397d4aa8</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3920366%2F4953affb-3fd4-4778-8930-817c08ae4269.png</url>
      <title>Forem: Tools Crazy</title>
      <link>https://forem.com/tools_crazy_e6532397d4aa8</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tools_crazy_e6532397d4aa8"/>
    <language>en</language>
    <item>
      <title>Building a Multi-Model AI Image Generator as a Chrome Extension</title>
      <dc:creator>Tools Crazy</dc:creator>
      <pubDate>Wed, 13 May 2026 01:57:17 +0000</pubDate>
      <link>https://forem.com/tools_crazy_e6532397d4aa8/building-a-multi-model-ai-image-generator-as-a-chrome-extension-1g6n</link>
      <guid>https://forem.com/tools_crazy_e6532397d4aa8/building-a-multi-model-ai-image-generator-as-a-chrome-extension-1g6n</guid>
      <description>&lt;p&gt;I shipped AI Photo Genie - a Chrome extension that lets you generate images with FLUX, Z-Image, Seedream, and Nano Banana directly from the toolbar. Here are the architectural decisions that made it work.&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.amazonaws.com%2Fuploads%2Farticles%2F8bssverx3cb610najzwd.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.amazonaws.com%2Fuploads%2Farticles%2F8bssverx3cb610najzwd.jpg" alt="AI Photo Genie main interface - Chrome toolbar AI image generator" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;AI image tools require tab-switching. Generate -&amp;gt; download -&amp;gt; upload to editor -&amp;gt; back to work. This takes 2-3 minutes per image. I wanted the full generation loop - prompt -&amp;gt; image -&amp;gt; edit - to happen without leaving the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;Chrome Manifest V3 restrictions shaped every decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background Service Worker for API Calls
&lt;/h3&gt;

&lt;p&gt;The extension popup has strict execution limits (and will be killed if it hangs). Long-running AI API calls must be offloaded to the background service worker. The popup sends a message, the service worker calls the API, and replies back via message passing. The key: return &lt;code&gt;true&lt;/code&gt; from the message listener to keep the channel open asynchronously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unified Model Adapter
&lt;/h3&gt;

&lt;p&gt;FLUX, Z-Image, Seedream, and Nano Banana all have different request formats, authentication patterns, and rate limits. I built a single adapter layer that normalizes them into one interface. The popup never knows which API it is hitting - it just calls &lt;code&gt;generateImage({ model, prompt, width, height })&lt;/code&gt; and gets back a blob URL.&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.amazonaws.com%2Fuploads%2Farticles%2Fkp24b99giq8l188dnrsy.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.amazonaws.com%2Fuploads%2Farticles%2Fkp24b99giq8l188dnrsy.jpg" alt="Model selection and prompt controls in AI Photo Genie" width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Free Credits Without Signup
&lt;/h3&gt;

&lt;p&gt;To eliminate the conversion-killing signup step, I use a device fingerprint tied to the extension install for daily credit tracking. Not bulletproof against determined abusers - but it removes all friction for legitimate users. Install -&amp;gt; generate in under 60 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  PhotoQuill Integration
&lt;/h3&gt;

&lt;p&gt;Generated images open directly in &lt;a href="https://photoquill.com" rel="noopener noreferrer"&gt;PhotoQuill&lt;/a&gt; - our browser-based Photoshop alternative - via &lt;code&gt;chrome.tabs&lt;/code&gt;. No file downloads needed between tools. The extension creates a tab, waits for it to load, then sends the image data via message passing.&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.amazonaws.com%2Fuploads%2Farticles%2Fs23tkygb72savjklbizb.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.amazonaws.com%2Fuploads%2Farticles%2Fs23tkygb72savjklbizb.jpg" alt="One-click export to PhotoQuill for advanced browser-based editing" width="800" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Service workers die after 30s&lt;/strong&gt; - break long operations into smaller chunks with keepalive pings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chrome.storage.local is a sync bottleneck&lt;/strong&gt; - batch reads/writes, do not call on every keystroke&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MV3 has no background page&lt;/strong&gt; - every state you need must be explicitly persisted; do not assume anything survives between events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Different models = different valid aspect ratios&lt;/strong&gt; - build a model capability manifest early, not as an afterthought&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Install -&amp;gt; generate in under 60 seconds, no account required. Free daily credits, no watermarks. Optional paid plans from $4.90/month for heavier usage.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://aiphotogenie.com/?utm_source=devto&amp;amp;utm_medium=directory&amp;amp;utm_campaign=backlink_2026" rel="noopener noreferrer"&gt;AI Photo Genie on Chrome Web Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questions about Chrome extension architecture, MV3 service worker quirks, or multi-model AI routing? Happy to dig in.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Free Browser-Based PBR Texture Generator (No Plugins, No Uploads)</title>
      <dc:creator>Tools Crazy</dc:creator>
      <pubDate>Tue, 12 May 2026 02:50:16 +0000</pubDate>
      <link>https://forem.com/tools_crazy_e6532397d4aa8/building-a-free-browser-based-pbr-texture-generator-no-plugins-no-uploads-38db</link>
      <guid>https://forem.com/tools_crazy_e6532397d4aa8/building-a-free-browser-based-pbr-texture-generator-no-plugins-no-uploads-38db</guid>
      <description>&lt;p&gt;I built NormalMap AI — a free, browser-based tool that generates complete PBR texture sets (Normal, Roughness, AO, Metallic, Height, ORM) from any uploaded image. Here's what I learned building it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo Video
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/H-13KG5UeDY"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2Fln6xtzykevrua954whj7.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.amazonaws.com%2Fuploads%2Farticles%2Fln6xtzykevrua954whj7.png" alt="NormalMap AI — AI Generate panel, real-time 3D sphere preview, and full PBR map set" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Problem&lt;/p&gt;

&lt;p&gt;Game devs and 3D artists have always needed PBR texture maps. The traditional tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Photoshop 3D filter: removed in newer versions, never great&lt;/li&gt;
&lt;li&gt;Substance Painter: $49.99/month per seat — a lot for hobbyists or small studios&lt;/li&gt;
&lt;li&gt;Free desktop tools: slow, require installs, inconsistent results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My goal: make the full PBR workflow free, instant, and browser-native.&lt;/p&gt;

&lt;p&gt;Technical Approach&lt;/p&gt;

&lt;p&gt;Core pipeline: WebGL compute shaders for all map generation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Normal map: Sobel operator on height-converted luminance, GPU-computed&lt;/li&gt;
&lt;li&gt;Roughness: variance + high-frequency detection across local neighborhoods&lt;/li&gt;
&lt;li&gt;AO: SSAO-style hemisphere sampling in screen space&lt;/li&gt;
&lt;li&gt;Height: multi-scale luminance integration with gamma correction&lt;/li&gt;
&lt;li&gt;Metallic: saturation + specular estimation from luminance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Real-time 3D preview uses Three.js + custom HDRI loader, running at 60fps.&lt;/p&gt;

&lt;p&gt;The Seamless Texture Maker&lt;/p&gt;

&lt;p&gt;This was the hard part. Auto seam repair uses a 3-algorithm cascade:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Optimal offset search: finds the best tile offset to minimize edge discontinuity&lt;/li&gt;
&lt;li&gt;Min-cut seam repair: graph-cut algorithm to find the minimum-cost seam path&lt;/li&gt;
&lt;li&gt;Structural patch repair + low-frequency balance: handle remaining artifacts&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Plus clone and healing brushes for manual touch-up, and a delight pass to remove uneven lighting before tiling.&lt;/p&gt;

&lt;p&gt;AI Integration&lt;/p&gt;

&lt;p&gt;Added AI texture generation from text prompts (FLUX + other models via Runware). Users can generate a source texture from a prompt, which automatically feeds the PBR pipeline. Credit-based pricing: 5 free credits/day, paid plans from $19.90/month.&lt;/p&gt;

&lt;p&gt;Results&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The free tier covers 90% of use cases for hobbyists and indie devs&lt;/li&gt;
&lt;li&gt;AI generation is where the revenue comes from&lt;/li&gt;
&lt;li&gt;Biggest surprise: transparent PNG maker (black + white matte removal for VFX) became a top use case I didn't anticipate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: Astro + TypeScript&lt;/li&gt;
&lt;li&gt;Rendering: WebGL / Three.js&lt;/li&gt;
&lt;li&gt;Auth + DB: Supabase&lt;/li&gt;
&lt;li&gt;Payments: Creem&lt;/li&gt;
&lt;li&gt;AI providers: Runware + Kie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questions for IH:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How do you price free-tier limits to convert without annoying power users?&lt;/li&gt;
&lt;li&gt;Anyone else building browser-native GPU tools? What's your WebGL/WebGPU strategy?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try it: &lt;a href="https://normalmap.ai" rel="noopener noreferrer"&gt;https://normalmap.ai&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Try it out here: &lt;a href="https://normalmap.ai/?utm_source=devto&amp;amp;utm_medium=directory&amp;amp;utm_campaign=backlink_2026" rel="noopener noreferrer"&gt;NormalMap AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NormalMap AI main interface: AI Generate panel, real-time 3D sphere preview, and full PBR map thumbnails (Normal, Roughness, AO, Metallic, Height, ORM).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A full-resolution tangent-space normal map (blue-purple) ready for Unity, UE5, or Blender.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Building a Browser-Based Photoshop Alternative with WebGPU</title>
      <dc:creator>Tools Crazy</dc:creator>
      <pubDate>Mon, 11 May 2026 06:52:06 +0000</pubDate>
      <link>https://forem.com/tools_crazy_e6532397d4aa8/building-a-browser-based-photoshop-alternative-with-webgpu-3nne</link>
      <guid>https://forem.com/tools_crazy_e6532397d4aa8/building-a-browser-based-photoshop-alternative-with-webgpu-3nne</guid>
      <description>&lt;p&gt;I spent 14 months building PhotoQuill, a browser-based Photoshop alternative that runs entirely on WebGPU. Launched 2 weeks ago. Here's what I learned.&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.amazonaws.com%2Fuploads%2Farticles%2F106bcr8vbdel2jko702f.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.amazonaws.com%2Fuploads%2Farticles%2F106bcr8vbdel2jko702f.jpg" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why I Built This&lt;/p&gt;

&lt;p&gt;I'm a designer turned developer. Every time I opened Photoshop, I had to wait forever for it to load. Plus, Adobe's $22.99/month subscription felt too expensive for occasional use. I thought: what if there was a browser version that just works, instantly, and for free?&lt;/p&gt;

&lt;p&gt;The Technical Challenge&lt;/p&gt;

&lt;p&gt;I started with Canvas 2D API. Performance was terrible with large images. Then I discovered WebGPU - the new browser GPU API that gives you direct access to graphics hardware.&lt;/p&gt;

&lt;p&gt;Key decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebGPU over WebGL (3-5x performance boost)&lt;/li&gt;
&lt;li&gt;Pure client-side processing (privacy + zero server costs)&lt;/li&gt;
&lt;li&gt;Full PSD compatibility, not just export (hardest part)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three Hardest Technical Problems&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reverse-Engineering PSD Format&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Photoshop's .psd format has no complete public documentation. I spent a month studying the ag-psd library source code to understand layers, masks, blend modes, and data structures. Smart Objects were the worst - they're nested PSD files.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;WebGPU Performance Optimization&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Getting 60fps canvas rendering in a browser required careful GPU memory management:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tile-based rendering (split layers into chunks)&lt;/li&gt;
&lt;li&gt;Only render visible areas&lt;/li&gt;
&lt;li&gt;Compute Shaders for filters (2x faster than Fragment Shaders)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result: smooth editing even with 500MB PSD files.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implementing 27 Blend Modes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Photoshop has 27 layer blend modes (Multiply, Screen, Overlay, Color Dodge, etc.). Each one required writing GLSL shaders and ensuring pixel-perfect match with Photoshop's output. 2000+ lines of shader code.&lt;/p&gt;

&lt;p&gt;What Worked&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ship MVP fast: First version had just layers, brushes, and export. Launched in 2 weeks.&lt;/li&gt;
&lt;li&gt;Build in public on Twitter: Daily progress updates built early audience.&lt;/li&gt;
&lt;li&gt;Focus on one killer feature: Full PSD compatibility. Competitors only do partial support.&lt;/li&gt;
&lt;li&gt;Freemium model: Core editor free forever. AI features are paid add-ons.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What Didn't Work&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trying to build 50 features at once: Took 3 months to realize I should ship with 10 core features first.&lt;/li&gt;
&lt;li&gt;Ignoring mobile: 30% of users are on mobile. Had to rebuild the UI.&lt;/li&gt;
&lt;li&gt;Over-optimization: Spent 2 weeks optimizing a feature only 1% of users touch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current Status (2 weeks post-launch)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;800+ users (no paid ads)&lt;/li&gt;
&lt;li&gt;15% day-1 retention&lt;/li&gt;
&lt;li&gt;First paying customer yesterday&lt;/li&gt;
&lt;li&gt;4.6/5 rating on Product Hunt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: React + TypeScript + Zustand&lt;/li&gt;
&lt;li&gt;Rendering: WebGPU + GLSL Shaders&lt;/li&gt;
&lt;li&gt;PSD parsing: ag-psd (heavily modified)&lt;/li&gt;
&lt;li&gt;Hosting: Cloudflare Pages (free tier)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cost Structure&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server: $0 (static site)&lt;/li&gt;
&lt;li&gt;AI API: ~$50/month (user-paid)&lt;/li&gt;
&lt;li&gt;Domain: $12/year&lt;/li&gt;
&lt;li&gt;Total: Nearly zero operating cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Advice for Indie Hackers&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick the right tech: WebGPU enabled desktop-class performance in a browser.&lt;/li&gt;
&lt;li&gt;Freemium works: Free core attracts users. Premium features convert.&lt;/li&gt;
&lt;li&gt;Build in public: Twitter exposure drove 60% of early traffic.&lt;/li&gt;
&lt;li&gt;Solve real pain: Adobe's price + install requirement + privacy concerns = clear market need.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Open Source Plans&lt;/p&gt;

&lt;p&gt;Planning to open-source the core PSD parser and WebGPU rendering engine under MIT license. Want to help other developers build similar tools.&lt;/p&gt;

&lt;p&gt;Questions for the Community&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What performance bottlenecks have you hit building browser apps?&lt;/li&gt;
&lt;li&gt;Would you consider using WebGPU over Canvas/WebGL?&lt;/li&gt;
&lt;li&gt;Any experience with freemium pricing models?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Try it: &lt;a href="https://photoquill.com" rel="noopener noreferrer"&gt;https://photoquill.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy to answer technical questions about WebGPU, PSD format, or indie development.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Try it out here: &lt;a href="https://photoquill.com/?utm_source=devto&amp;amp;utm_medium=directory&amp;amp;utm_campaign=backlink_2026" rel="noopener noreferrer"&gt;PhotoQuill&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>performance</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
