<?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: Roshan</title>
    <description>The latest articles on DEV Community by Roshan (@roshandxt).</description>
    <link>https://dev.to/roshandxt</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%2F4012813%2F28072abf-4215-4e65-9877-e9acda9711be.png</url>
      <title>DEV Community: Roshan</title>
      <link>https://dev.to/roshandxt</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/roshandxt"/>
    <language>en</language>
    <item>
      <title>How I verified that an image resizer processes files locally</title>
      <dc:creator>Roshan</dc:creator>
      <pubDate>Mon, 31 Aug 2026 23:43:20 +0000</pubDate>
      <link>https://dev.to/roshandxt/how-i-verified-that-an-image-resizer-processes-files-locally-4j56</link>
      <guid>https://dev.to/roshandxt/how-i-verified-that-an-image-resizer-processes-files-locally-4j56</guid>
      <description>&lt;p&gt;Many online image tools begin with the same instruction: upload your file.&lt;/p&gt;

&lt;p&gt;That is convenient, but it also means trusting an unfamiliar server with profile photos, identity documents, application images, or private screenshots. When I built &lt;a href="https://shard.tools/" rel="noopener noreferrer"&gt;Shard Tools&lt;/a&gt;, I wanted the image-processing step to happen inside the browser instead.&lt;/p&gt;

&lt;p&gt;I also wanted that claim to be inspectable rather than another privacy slogan.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the resizer does
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://shard.tools/tools/resize-image-to-200x200" rel="noopener noreferrer"&gt;200×200 image resizer&lt;/a&gt; creates an image that is exactly 200 pixels wide and 200 pixels high.&lt;/p&gt;

&lt;p&gt;A rectangular image cannot become square without making a choice. The tool provides two:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Crop to fill&lt;/strong&gt; preserves the aspect ratio and removes the overflow around a centered square.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fit with background&lt;/strong&gt; preserves the complete image and fills the remaining space with a selected background color.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not stretch the width and height independently. That would technically produce a 200×200 file, but faces, logos, circles, and text would be distorted.&lt;/p&gt;

&lt;p&gt;The width and height remain editable for forms that require a different exact size.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens inside the browser
&lt;/h2&gt;

&lt;p&gt;After you choose a file, the browser decodes it locally and reads its visible orientation. This prevents phone photos from being processed sideways.&lt;/p&gt;

&lt;p&gt;Crop-to-fill enlarges the image until it covers the square, then removes the overflow. Fit-with-background scales the complete image into the square and fills the remaining space. Both approaches preserve the original aspect ratio.&lt;/p&gt;

&lt;p&gt;The browser draws the result onto a new 200×200 canvas and creates a temporary download link inside the current tab. The selected image does not need to be sent to Shard Tools for processing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I tested
&lt;/h2&gt;

&lt;p&gt;During the latest release check, I processed a PNG and verified that the generated result reported an actual width and height of &lt;strong&gt;200×200 pixels&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The interface displays dimensions read from the generated output rather than assuming that the requested size was produced. It also reports the output file size before download.&lt;/p&gt;

&lt;p&gt;This test verifies the pixel dimensions. It does not claim that a 200×200 image meets passport or biometric-photo requirements, and it does not guarantee a particular file size in KB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the privacy claim testable
&lt;/h2&gt;

&lt;p&gt;I built a separate &lt;a href="https://shard.tools/privacy-proof" rel="noopener noreferrer"&gt;live privacy-proof page&lt;/a&gt; that performs a real 200×200 resize while measuring data-capable browser requests immediately before and after processing.&lt;/p&gt;

&lt;p&gt;The measurement watches requests initiated through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fetch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;XMLHttpRequest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sendBeacon&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the difference is zero, the image-processing action added no request through those mechanisms that could carry the selected image away.&lt;/p&gt;

&lt;p&gt;You can check this independently:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open your browser’s developer tools.&lt;/li&gt;
&lt;li&gt;Select the Network panel and clear its request list.&lt;/li&gt;
&lt;li&gt;Run the built-in sample or choose an image.&lt;/li&gt;
&lt;li&gt;Inspect any requests added during processing.&lt;/li&gt;
&lt;li&gt;Confirm that the output uses a local &lt;code&gt;blob:&lt;/code&gt; URL rather than an upload response.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  An important limitation
&lt;/h2&gt;

&lt;p&gt;The proof does &lt;strong&gt;not&lt;/strong&gt; claim that the entire webpage makes zero network requests.&lt;/p&gt;

&lt;p&gt;The page still downloads its HTML, JavaScript, CSS, fonts, advertisements, and external directory badges. Those third-party hosts are disclosed in the live page report.&lt;/p&gt;

&lt;p&gt;The narrower claim is the useful one: selecting and processing an image should not add an upload request.&lt;/p&gt;

&lt;p&gt;The request counter is an observable browser measurement, not a formal security proof. That is why the page explains what it measures and encourages visitors to verify the result in the Network panel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this distinction matters
&lt;/h2&gt;

&lt;p&gt;“Runs locally” should describe an observable boundary, not just marketing copy.&lt;/p&gt;

&lt;p&gt;For this tool, selecting, decoding, resizing, previewing, encoding, and creating the download all happen through browser APIs. The server provides the application, but it does not need the selected image to produce the result.&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://shard.tools/tools/resize-image-to-200x200" rel="noopener noreferrer"&gt;200×200 image resizer&lt;/a&gt;, or inspect the process using the &lt;a href="https://shard.tools/privacy-proof" rel="noopener noreferrer"&gt;privacy-proof page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would especially appreciate feedback about the measurement, its limitations, and anything the disclosure should explain more clearly.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I asked 50+ developers what they do when their AI session dies mid-task. Here's what I found.</title>
      <dc:creator>Roshan</dc:creator>
      <pubDate>Thu, 02 Jul 2026 22:15:58 +0000</pubDate>
      <link>https://dev.to/roshandxt/i-asked-50-developers-what-they-do-when-their-ai-session-dies-mid-task-heres-what-i-found-495i</link>
      <guid>https://dev.to/roshandxt/i-asked-50-developers-what-they-do-when-their-ai-session-dies-mid-task-heres-what-i-found-495i</guid>
      <description>&lt;p&gt;Not a product pitch  just research notes from talking to a lot of people.&lt;br&gt;
I've been building in the AI coding tools space and wanted to understand one specific moment: your session hits a limit, gets deleted, or just goes stale. What do you actually do?&lt;/p&gt;

&lt;p&gt;I posted in a bunch of developer communities and talked to people directly. A few things surprised me.&lt;/p&gt;

&lt;p&gt;The power users aren't your best signal&lt;br&gt;
Developers with sophisticated workflows custom handoff skills, AGENTS.md discipline, tmux harnesses — described the pain clearly but had already built their own fix. They're not looking for a tool. They're looking for a better version of what they made.&lt;/p&gt;

&lt;p&gt;The people who described the pain most vividly were non-technical: a tax lawyer doing no-code projects, a school admin. No workaround, no jargon — just "I have to explain everything from scratch and it's exhausting."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nobody trusts the transcript&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Almost everyone said the same thing unprompted: the chat history isn't reliable. It carries old failed attempts, wrong assumptions, things the AI said confidently that turned out to be wrong. The people with the best workflows kept the working state outside the chat — git diff, changed files, a short note about what actually worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The moment that resonates&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"What do you do when your AI session dies mid-task and you have to explain everything to a new tool from scratch?"&lt;/p&gt;

&lt;p&gt;That question got strong reactions every time. Not "context management" or "handoff tooling"  those got polite nods. The specific painful moment got people telling stories.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
