<?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: Dev Bhamaria</title>
    <description>The latest articles on DEV Community by Dev Bhamaria (@burthcer).</description>
    <link>https://dev.to/burthcer</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%2F4177053%2F47c3136e-7bd2-4e8e-913a-f62a69a80be0.jpg</url>
      <title>DEV Community: Dev Bhamaria</title>
      <link>https://dev.to/burthcer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/burthcer"/>
    <language>en</language>
    <item>
      <title>I built a way to send files from a PC to a phone with no internet</title>
      <dc:creator>Dev Bhamaria</dc:creator>
      <pubDate>Wed, 04 Nov 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/burthcer/i-built-a-way-to-send-files-from-a-pc-to-a-phone-with-no-internet-5c8g</link>
      <guid>https://dev.to/burthcer/i-built-a-way-to-send-files-from-a-pc-to-a-phone-with-no-internet-5c8g</guid>
      <description>&lt;p&gt;In my college lab, some PCs had no internet. I would finish a file on one PC, then find I could not get it to my phone. The only way out was to move to another PC and do the work again. That is why I added Share to phone to IHatePDF.&lt;/p&gt;

&lt;p&gt;It sends files, or whole folders, from the PC to a phone. Nothing is uploaded anywhere and no app is needed on the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;You add files or folders, pick how the phone connects, and scan a QR code. There are three ways to connect:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Same Wi-Fi&lt;/th&gt;
&lt;th&gt;PC hotspot (offline)&lt;/th&gt;
&lt;th&gt;Bluetooth (offline)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;When to use it&lt;/td&gt;
&lt;td&gt;PC and phone are on the same network (internet not needed)&lt;/td&gt;
&lt;td&gt;No Wi-Fi network at all: the PC's Wi-Fi card makes a private hotspot&lt;/td&gt;
&lt;td&gt;No Wi-Fi at all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;On the phone&lt;/td&gt;
&lt;td&gt;Scan one QR code, tap Download&lt;/td&gt;
&lt;td&gt;Scan a QR code to join the hotspot, then one to download&lt;/td&gt;
&lt;td&gt;Make Bluetooth visible, pick the phone in the app, tap Accept&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phones&lt;/td&gt;
&lt;td&gt;Any (Android, iPhone)&lt;/td&gt;
&lt;td&gt;Any (Android, iPhone)&lt;/td&gt;
&lt;td&gt;Android only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Size limit&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;4 GB, and slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Folders&lt;/td&gt;
&lt;td&gt;Download as a .zip&lt;/td&gt;
&lt;td&gt;Download as a .zip&lt;/td&gt;
&lt;td&gt;Sent as one .zip&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Needs&lt;/td&gt;
&lt;td&gt;A network&lt;/td&gt;
&lt;td&gt;A PC with Wi-Fi&lt;/td&gt;
&lt;td&gt;Bluetooth on the PC and the phone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hotspot is the one that matters for a lab with no internet. The PC makes its own Wi-Fi network, the phone joins it by scanning a QR code, and a second scan opens the download page.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzbr63ohei02eeipws2z.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzbr63ohei02eeipws2z.png" alt="Choosing a folder and a file, and picking PC hotspot" width="800" height="592"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ip7js8phf92xph8b0fg.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ip7js8phf92xph8b0fg.png" alt="QR code with a countdown" width="799" height="562"&gt;&lt;/a&gt;&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fht3kzcgygprjywj6yl5y.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fht3kzcgygprjywj6yl5y.png" alt="Download page on the phone" width="564" height="906"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying safe
&lt;/h2&gt;

&lt;p&gt;The QR code stays active for 1, 5 or 10 minutes, and changing the time restarts the countdown. The link stops working when time runs out, when you press Stop sharing, or when you close the app. If the app turned the hotspot on, it turns it off again. For Bluetooth the app never picks a phone for you. You choose it from the phones it finds nearby.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9j2neoi8l6eas09t5ly2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9j2neoi8l6eas09t5ly2.png" alt="Bluetooth mode looking for nearby phones" width="799" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I have not tested it with an iPhone. The same Wi-Fi and hotspot modes are a plain web page, so an iPhone should work, but I have not checked. Bluetooth is Android only, because iPhones cannot receive files over Bluetooth. Share to phone is only in the Windows app. A browser tab cannot run it.&lt;/p&gt;

&lt;p&gt;Code and install: &lt;a href="https://github.com/Burthcer/IHatePDF" rel="noopener noreferrer"&gt;https://github.com/Burthcer/IHatePDF&lt;/a&gt; (MIT)&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>windows</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I ran my PDF tools on a 5 GB file and a 10,000-page file. Here is what worked and what did not.</title>
      <dc:creator>Dev Bhamaria</dc:creator>
      <pubDate>Wed, 28 Oct 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/burthcer/i-ran-my-pdf-tools-on-a-5-gb-file-and-a-10000-page-file-here-is-what-worked-and-what-did-not-447a</link>
      <guid>https://dev.to/burthcer/i-ran-my-pdf-tools-on-a-5-gb-file-and-a-10000-page-file-here-is-what-worked-and-what-did-not-447a</guid>
      <description>&lt;p&gt;My last article tested IHatePDF on small PCs. This one goes the other way: very big files. I wanted to know where the tools stop working. I had huge files I wanted to compress, and the online tools I found had a size limit. I wanted to be sure my offline tool did not.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two files
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A 5.0 GB PDF of 1,436 scanned pages (300 dpi JPEG, every page different).&lt;/li&gt;
&lt;li&gt;A 10,000-page text PDF, only 14.6 MB: a heading, 40 lines and a small table on every page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both ran in the Windows app, using the app's own memory budget. The 10,000-page run was on Windows 11 with 32 GB of RAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 5 GB file
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Most memory used by the app&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Watermark&lt;/td&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;86 s&lt;/td&gt;
&lt;td&gt;924 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page numbers&lt;/td&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;56 s&lt;/td&gt;
&lt;td&gt;1.0 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge (+ 20 pages)&lt;/td&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;65 s&lt;/td&gt;
&lt;td&gt;1.0 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protect (AES-256)&lt;/td&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;62 s&lt;/td&gt;
&lt;td&gt;990 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF/A&lt;/td&gt;
&lt;td&gt;finished&lt;/td&gt;
&lt;td&gt;71 s&lt;/td&gt;
&lt;td&gt;983 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compress&lt;/td&gt;
&lt;td&gt;finished, every image recompressed&lt;/td&gt;
&lt;td&gt;743 s&lt;/td&gt;
&lt;td&gt;2.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five of these tools used about 1 GB of memory or less on a 5 GB file. Compress is the heavy one: about 12 minutes and 2.1 GB.&lt;/p&gt;

&lt;h2&gt;
  
  
  What did not work: previews over 2 GB
&lt;/h2&gt;

&lt;p&gt;Tools that show page thumbnails could not open the 5 GB file at all. Rotate sat on "Loading pages…" with no thumbnail for 10 minutes.&lt;/p&gt;

&lt;p&gt;The cause is a limit in the page engine: it cannot allocate a block of memory of 2 GB or more (&lt;code&gt;new Uint8Array(2 GB)&lt;/code&gt; fails, in the page and in workers), and the PDF viewer library keeps one the size of the file. So page previews cannot open files over 2 GB. The app now says so: "This PDF is 5.0 GB. Page previews work up to 2 GB." It also lists the tools that still work, and Split, which needs previews, shows the same message.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10,000-page file
&lt;/h2&gt;

&lt;p&gt;All 14 tools finished.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Most memory used by the app&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Watermark&lt;/td&gt;
&lt;td&gt;6 s&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rotate&lt;/td&gt;
&lt;td&gt;4 s&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page numbers&lt;/td&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merge (+ 20 pages)&lt;/td&gt;
&lt;td&gt;3 s&lt;/td&gt;
&lt;td&gt;0.9 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organize (reverse order)&lt;/td&gt;
&lt;td&gt;4 s&lt;/td&gt;
&lt;td&gt;1.2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split (every page to ZIP)&lt;/td&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;1.3 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protect (AES-256)&lt;/td&gt;
&lt;td&gt;4 s&lt;/td&gt;
&lt;td&gt;0.9 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compress&lt;/td&gt;
&lt;td&gt;17 s&lt;/td&gt;
&lt;td&gt;1.7 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF/A&lt;/td&gt;
&lt;td&gt;4 s&lt;/td&gt;
&lt;td&gt;0.9 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF to Markdown&lt;/td&gt;
&lt;td&gt;32 s&lt;/td&gt;
&lt;td&gt;2.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF to Word&lt;/td&gt;
&lt;td&gt;9 s&lt;/td&gt;
&lt;td&gt;4.1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF to Excel&lt;/td&gt;
&lt;td&gt;67 s&lt;/td&gt;
&lt;td&gt;2.0 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redact (a word on every page)&lt;/td&gt;
&lt;td&gt;63 min&lt;/td&gt;
&lt;td&gt;1.7 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edit PDF (open and retype a paragraph)&lt;/td&gt;
&lt;td&gt;3 s&lt;/td&gt;
&lt;td&gt;1.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Twelve of the fourteen finished in 32 seconds or less. Two things to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PDF to Word on 10,000 pages needs about 4 GB of RAM.&lt;/strong&gt; On a 4 GB lab PC the memory limit would slow it down or stop it, so split such a file first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redact on every one of 10,000 pages takes about an hour.&lt;/strong&gt; It redraws each page. That is fine for a few pages and slow for all of them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I would change
&lt;/h2&gt;

&lt;p&gt;What surprised me most was how unoptimised IHatePDF was at the start. In the early version, a file of about 100 MB used roughly 5 to 7 times its own size in RAM. I had to optimise it. (The 5 to 7 times figure is from my own early testing, not from the test report.)&lt;/p&gt;

&lt;p&gt;Code and the full test report: &lt;a href="https://github.com/Burthcer/IHatePDF" rel="noopener noreferrer"&gt;https://github.com/Burthcer/IHatePDF&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>testing</category>
      <category>opensource</category>
      <category>pdf</category>
    </item>
    <item>
      <title>I didn't want to pay a monthly subscription for dictation, so I built one that runs on my GPU</title>
      <dc:creator>Dev Bhamaria</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/burthcer/i-didnt-want-to-pay-a-monthly-subscription-for-dictation-so-i-built-one-that-runs-on-my-gpu-20e1</link>
      <guid>https://dev.to/burthcer/i-didnt-want-to-pay-a-monthly-subscription-for-dictation-so-i-built-one-that-runs-on-my-gpu-20e1</guid>
      <description>&lt;p&gt;I wanted to dictate on my PC without paying for a subscription. So I built Wisperno: hold a hotkey, speak, release, and the text is pasted into whatever app has focus.&lt;/p&gt;

&lt;p&gt;It runs fully offline. Whisper &lt;code&gt;large-v3-turbo&lt;/code&gt; transcribes on the GPU, and a small quantized language model cleans up the text. There are no network calls once the models are on disk, so no audio or text leaves the PC.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;There are two ways to dictate. Direct Dictation uses no language model at all. A rule-based formatter capitalises pronouns, strips filler words and detects lists in well under 10 ms. Polish sends the text through the local model to fix grammar and filler. You pick per hotkey: tap &lt;code&gt;Ctrl+Alt&lt;/code&gt; for direct dictation, &lt;code&gt;Alt+C&lt;/code&gt; for polish.&lt;/p&gt;

&lt;p&gt;A long pause (1.3 seconds or more) starts a new paragraph. I first tried segment-level timestamps from Whisper to detect the pause, and they could not see it at all. Word-level timestamps can.&lt;/p&gt;

&lt;h2&gt;
  
  
  How fast is it
&lt;/h2&gt;

&lt;p&gt;I measured it on my laptop (RTX 4070 Laptop GPU, 8 GB) with &lt;code&gt;tests/benchmark_models.py&lt;/code&gt;. Whisper stays loaded the whole time, so the VRAM numbers match the real app.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd8z93r5xifxtnoor6vld.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd8z93r5xifxtnoor6vld.png" alt="Wisperno benchmark table: four presets with VRAM, decode speed and 100-word latency" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Preset&lt;/th&gt;
&lt;th&gt;VRAM&lt;/th&gt;
&lt;th&gt;Decode speed&lt;/th&gt;
&lt;th&gt;100 words&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Turbo Flagship (default)&lt;/td&gt;
&lt;td&gt;3491 MB&lt;/td&gt;
&lt;td&gt;113.8 tok/s&lt;/td&gt;
&lt;td&gt;0.82 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eco&lt;/td&gt;
&lt;td&gt;3621 MB&lt;/td&gt;
&lt;td&gt;103.3 tok/s&lt;/td&gt;
&lt;td&gt;0.89 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard&lt;/td&gt;
&lt;td&gt;3691 MB&lt;/td&gt;
&lt;td&gt;91.7 tok/s&lt;/td&gt;
&lt;td&gt;1.04 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flagship&lt;/td&gt;
&lt;td&gt;5119 MB&lt;/td&gt;
&lt;td&gt;63.1 tok/s&lt;/td&gt;
&lt;td&gt;1.48 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The smaller presets are faster and use less memory. The bigger ones keep a little more fidelity: 97.6% for the two smallest, 98.8% for the two 3B models, measured on raw model output.&lt;/p&gt;

&lt;p&gt;Upgrading &lt;code&gt;llama-cpp-python&lt;/code&gt; from 0.2.90 to 0.3.26 made every preset about 20 to 30% faster with the same output. For the default preset that was 89.3 to 113.8 tokens per second. VRAM did not change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making a small model behave
&lt;/h2&gt;

&lt;p&gt;A cleanup model can answer your dictation instead of cleaning it. If you say a question, it may reply to it. So the app runs every result through a guardrail (&lt;code&gt;sanity_check()&lt;/code&gt;), and I wrote a suite of adversarial prompts meant to make the model answer back. With the guardrail on, that suite passes 100% on every preset.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bug my own tests found
&lt;/h2&gt;

&lt;p&gt;Live Transcription is a separate mode for meetings and lectures. My first design re-decoded only a sliding window of the latest audio. The test suite showed it silently dropped real words. The current version re-decodes the whole unconfirmed audio buffer every 0.6 seconds. It runs about 13.5 times faster than real time (RTF 0.074), with no second model loaded.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it cannot do
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Windows only, and it needs an NVIDIA GPU. Below about 2 GB of VRAM it falls back to a slow CPU mode.&lt;/li&gt;
&lt;li&gt;It is a source install. The packaged build is about 4.7 GB, too big for GitHub.&lt;/li&gt;
&lt;li&gt;The fidelity scores above are on raw model output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code, benchmarks and install steps: &lt;a href="https://github.com/Burthcer/Wisperno" rel="noopener noreferrer"&gt;https://github.com/Burthcer/Wisperno&lt;/a&gt; (MIT; the models keep their own licences).&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>python</category>
      <category>ai</category>
      <category>windows</category>
    </item>
    <item>
      <title>Samsung Internet's dark mode turned my orange buttons dark red. My fix is only partial.</title>
      <dc:creator>Dev Bhamaria</dc:creator>
      <pubDate>Wed, 14 Oct 2026 13:30:00 +0000</pubDate>
      <link>https://dev.to/burthcer/samsung-internets-dark-mode-turned-my-orange-buttons-dark-red-my-fix-is-only-partial-4f3k</link>
      <guid>https://dev.to/burthcer/samsung-internets-dark-mode-turned-my-orange-buttons-dark-red-my-fix-is-only-partial-4f3k</guid>
      <description>&lt;p&gt;My portfolio uses one accent colour: orange, &lt;code&gt;#ff5714&lt;/code&gt;, which is RGB 255, 87, 20. On a friend's phone the orange buttons showed up dark red.&lt;/p&gt;

&lt;p&gt;I first noticed it when a friend sent me a screenshot. Then I tested it on my own phone and saw the same thing.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsgoxad8lekxfrxw304d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsgoxad8lekxfrxw304d.png" alt="Friend's phone in Samsung Internet: the orange buttons on my old site are dark red" width="738" height="1354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cause was Samsung Internet's dark mode for web pages (that is the name I know it by). I only saw it in Samsung Internet on phones. I did not see it on PC browsers. My page already says it is dark (&lt;code&gt;color-scheme: dark&lt;/code&gt; in the CSS and a &lt;code&gt;color-scheme&lt;/code&gt; meta tag), and the browser still changed the colours.&lt;/p&gt;

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

&lt;p&gt;I made a test page that paints the same orange eight ways and opened it on my phone (Samsung Internet 30.0, which reports Chromium 143). I measured the colours from screenshots.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclyg2ume7z2obb7ggiy3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fclyg2ume7z2obb7ggiy3.png" alt="Test page on my phone: the same orange painted eight ways; only the small image tile, the text and the canvas stay orange" width="800" height="1419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;How the orange was painted&lt;/th&gt;
&lt;th&gt;Intended&lt;/th&gt;
&lt;th&gt;Seen on my phone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plain CSS fill&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;143, 0, 2 (dark red)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSS gradient&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;72, 0, 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inline SVG&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;183, 12, 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Box shadow or border&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;204, 34, 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image stretched to fit&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;91, 10, 4 up to 129, 43, 13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Small image tile at natural size&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;255, 110, 42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canvas&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;255, 86, 21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orange text&lt;/td&gt;
&lt;td&gt;255, 87, 20&lt;/td&gt;
&lt;td&gt;255, 119, 53&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Form6pulj9ppzo1lw9g6p.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Form6pulj9ppzo1lw9g6p.png" alt="Chart of the measured colours compared with the intended orange" width="799" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only the canvas came out right. A small, unscaled image tile came out close.&lt;/p&gt;

&lt;p&gt;Things I tried that did nothing: &lt;code&gt;color-scheme: light&lt;/code&gt; on the element, &lt;code&gt;forced-color-adjust: none&lt;/code&gt;, &lt;code&gt;isolation: isolate&lt;/code&gt; with &lt;code&gt;will-change: transform&lt;/code&gt;, &lt;code&gt;print-color-adjust: exact&lt;/code&gt;, a &lt;code&gt;color-scheme&lt;/code&gt; meta tag with both values, and &lt;code&gt;prefers-color-scheme&lt;/code&gt; media queries. The phone also told the page that dark mode was not on, and still changed the colours.&lt;/p&gt;

&lt;p&gt;I don't know Samsung's actual algorithm and couldn't find documentation for it. The table is a pattern from my tests, not a proof.&lt;/p&gt;

&lt;p&gt;I also tried Chromium's own forced dark mode on desktop (Edge with &lt;code&gt;WebContentsForceDark&lt;/code&gt;). It did not reproduce the problem: plain fills stayed correct. So Samsung's behaviour is different, and desktop Chrome is not a good stand-in for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Since a small unscaled image survived, I paint the orange as a 10 by 10 pixel SVG that repeats at its own size, instead of as a CSS colour:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;--acc-tile&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10'%3E%3Crect width='10' height='10' fill='%23ff5714'/%3E%3C/svg%3E"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;--acc-fill&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;var&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nt"&gt;--acc-tile&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;repeat&lt;/span&gt; &lt;span class="nt"&gt;border-box&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then 25 rules that said &lt;code&gt;background: var(--acc)&lt;/code&gt; now say &lt;code&gt;background: var(--acc-fill)&lt;/code&gt;, with &lt;code&gt;border-color: transparent&lt;/code&gt; so no dark red outline appears. A few other things had to change too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The email underline was a gradient. It is now a separate strip, and the hover effect uses &lt;code&gt;clip-path&lt;/code&gt; instead of resizing, because resizing would scale the image.&lt;/li&gt;
&lt;li&gt;The play triangle in the Auto-scroll button was a CSS border triangle. It is now a filled box cropped with &lt;code&gt;clip-path&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The university logo is a white PNG on a white CSS plate, and the phone turned both grey. A small script now draws the plate and logo on a canvas, with an &lt;code&gt;aria-label&lt;/code&gt; for screen readers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On desktop browsers the orange still measures exactly 255, 87, 20, so normal visitors see no difference. On my phone, after the fix:&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiv2xu82nyv8fjvyhnd6t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiv2xu82nyv8fjvyhnd6t.png" alt="My phone after the fix: the buttons are orange again, but a lighter orange than intended" width="800" height="1419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the fix does not solve
&lt;/h2&gt;

&lt;p&gt;This is much better, not solved.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The orange is lighter.&lt;/strong&gt; The buttons now measure 255, 110, 42, a bit peachy. I tried darker tiles (seven different oranges) and all of them came out at almost the same colour, so I can't compensate that way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orange text is still lighter&lt;/strong&gt; (255, 119, 53). I didn't fix it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The page background is still darkened&lt;/strong&gt;, from 12, 12, 11 to about 2, 2, 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some plain orange is still used&lt;/strong&gt; for borders, outlines and hover states. I haven't checked each of them on the phone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The light resume sheet can't stay light.&lt;/strong&gt; A white sheet became dark grey, and nothing I tried stopped it. So the resume page now shows a short note to Samsung Internet users, based on the browser's user agent string. If Samsung changes that string, the note disappears. I tested the note on my own phone in Samsung Internet and it shows there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chrome's own forced dark mode would make the fix darker.&lt;/strong&gt; In the desktop simulation, my tile became 217, 51, 0.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The code is harder to read.&lt;/strong&gt; The orange is now an image behind two CSS variables, and the logo needs JavaScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I haven't tested
&lt;/h2&gt;

&lt;p&gt;Chrome on Android with its auto dark mode flag, Firefox, Safari, and Samsung Internet on desktop. I also haven't checked whether the dark mode alters the project screenshots.&lt;/p&gt;

&lt;h2&gt;
  
  
  If it happens to you
&lt;/h2&gt;

&lt;p&gt;Try your site in different browsers before you ship it. I only found this because a friend happened to use Samsung Internet.&lt;/p&gt;

&lt;p&gt;The fix is in the commit history of my portfolio repo: &lt;a href="https://github.com/Burthcer/portfolio" rel="noopener noreferrer"&gt;https://github.com/Burthcer/portfolio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you know how Samsung Internet decides what to darken, I'd like to hear it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>android</category>
      <category>debugging</category>
    </item>
    <item>
      <title>What happened when I ran my PDF tools on a PC with 1 GB of memory</title>
      <dc:creator>Dev Bhamaria</dc:creator>
      <pubDate>Sun, 11 Oct 2026 13:18:50 +0000</pubDate>
      <link>https://dev.to/burthcer/what-happened-when-i-ran-my-pdf-tools-on-a-pc-with-1-gb-of-memory-3in7</link>
      <guid>https://dev.to/burthcer/what-happened-when-i-ran-my-pdf-tools-on-a-pc-with-1-gb-of-memory-3in7</guid>
      <description>&lt;p&gt;IHatePDF is a free, open-source set of 28 PDF tools that runs on your own machine. Nothing is uploaded. That also means it has to live with whatever memory your PC has, and scanned PDFs get big fast. So I tested what happens on small machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  The test
&lt;/h2&gt;

&lt;p&gt;I generated dummy scans: 300 dpi JPEGs of 10, 50, 150 and 500 MB (the 500 MB one is 144 pages). I ran Compress, Watermark, Merge, Rotate, Page numbers and PDF to Word on all of them. To pretend to be a smaller PC, I forced a memory budget for the app: 624 MB (a 4 GB PC with some margin), 1 GB (4 GB), 3 GB (6 GB), 4 GB (8 GB), 8 GB (16 GB), and no limit. The test machine is a Windows 11 laptop with 32 GB of RAM, running the installed app, not a dev build.&lt;/p&gt;

&lt;p&gt;I wanted to test low memory because I want this to run on laptops and college PCs, not just on my own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1.3.0 failed
&lt;/h2&gt;

&lt;p&gt;At a 1 GB budget, Compress stopped on every scan, even the 10 MB one, within a second or two. Watermark on the 500 MB scan stopped too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1.3.1
&lt;/h2&gt;

&lt;p&gt;Same machine, same 1 GB budget:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scan&lt;/th&gt;
&lt;th&gt;Compress result&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 MB&lt;/td&gt;
&lt;td&gt;831 KB&lt;/td&gt;
&lt;td&gt;2.9 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 MB&lt;/td&gt;
&lt;td&gt;4.04 MB&lt;/td&gt;
&lt;td&gt;10.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150 MB&lt;/td&gt;
&lt;td&gt;11.7 MB&lt;/td&gt;
&lt;td&gt;31.3 s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 MB&lt;/td&gt;
&lt;td&gt;38.4 MB&lt;/td&gt;
&lt;td&gt;120.6 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Watermark on the 500 MB scan took 2.6 s, with the whole app peaking at 1.1 GB.&lt;/p&gt;

&lt;p&gt;Across all six tools and all six budgets, nothing failed outright on the 6 GB, 8 GB and 16 GB budgets. At the tightest budgets some jobs slowed down but finished, and none of the 144 scan runs or 56 student-file runs was stopped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it still breaks
&lt;/h2&gt;

&lt;p&gt;I wrote the limits into the report as well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compress can stop with "Windows is almost out of memory" when Windows itself is within about 160 MB of the memory it keeps free. Other tools slow down and finish.&lt;/li&gt;
&lt;li&gt;PDF to Word leaves out sideways (rotated) text, in any language.&lt;/li&gt;
&lt;li&gt;Page previews are about 8 times slower at a 1 GB budget.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app now refuses a single 300-megapixel image before starting (0.4 s), and stops a running job in about 2.4 s if Windows is down to 300 MB free. It stays usable afterwards.&lt;/p&gt;

&lt;p&gt;What surprised me was how much memory the app used. If I did it again, I would design for low memory from the first day, instead of changing the structure of the code later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code and test report: &lt;a href="https://github.com/Burthcer/IHatePDF" rel="noopener noreferrer"&gt;https://github.com/Burthcer/IHatePDF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Me: &lt;a href="https://devbhamaria.com" rel="noopener noreferrer"&gt;https://devbhamaria.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you test offline or local-first tools on small machines, I'd like to know how you test them.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>testing</category>
      <category>pdf</category>
    </item>
  </channel>
</rss>
