<?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: Hovsep Arakelyan</title>
    <description>The latest articles on DEV Community by Hovsep Arakelyan (@pub404).</description>
    <link>https://dev.to/pub404</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%2F4219480%2Faec76adf-a6dd-4625-af44-bf72cbe2ce4e.jpg</url>
      <title>DEV Community: Hovsep Arakelyan</title>
      <link>https://dev.to/pub404</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pub404"/>
    <language>en</language>
    <item>
      <title>My "Free" QR Code Stopped Working, So I Built My Own</title>
      <dc:creator>Hovsep Arakelyan</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:05:08 +0000</pubDate>
      <link>https://dev.to/pub404/my-free-qr-code-stopped-working-so-i-built-my-own-5fn2</link>
      <guid>https://dev.to/pub404/my-free-qr-code-stopped-working-so-i-built-my-own-5fn2</guid>
      <description>&lt;p&gt;A while ago I needed a simple QR code that opened a website. I found a free generator on Google, pasted my URL, downloaded the image and started using it.&lt;/p&gt;

&lt;p&gt;A few days later, the code stopped working.&lt;/p&gt;

&lt;p&gt;That made no sense to me at first. A QR code is just a picture of some data. How can a picture stop working?&lt;/p&gt;

&lt;h2&gt;
  
  
  The code never contained my URL
&lt;/h2&gt;

&lt;p&gt;When I checked, I found the code didn't point to my website at all. It pointed to the generator's own short URL, which redirected people to my site.&lt;/p&gt;

&lt;p&gt;So the service controlled the redirect, and it could turn that redirect off. Then came the catch: &lt;strong&gt;they wanted me to pay to keep it working.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Static vs dynamic QR codes
&lt;/h2&gt;

&lt;p&gt;This is the difference that caught me out:&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;Static QR code&lt;/th&gt;
&lt;th&gt;Dynamic QR code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What the pattern stores&lt;/td&gt;
&lt;td&gt;Your actual content&lt;/td&gt;
&lt;td&gt;A short link to someone's server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Depends on a third party&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can be changed after printing&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Can track scans&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stops if the service stops&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dynamic codes are useful when you really need scan stats or want to change the destination after printing. But if all you want is a code that opens a URL, there's no reason for a server to sit in the middle.&lt;/p&gt;

&lt;h2&gt;
  
  
  A static code takes a few lines
&lt;/h2&gt;

&lt;p&gt;As a software engineer, I found it hard to justify paying a subscription for this. Generating a static code is a small job. Here's a working example with the &lt;a href="https://www.npmjs.com/package/qrcode-generator" rel="noopener noreferrer"&gt;&lt;code&gt;qrcode-generator&lt;/code&gt;&lt;/a&gt; npm package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;qrcode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;qrcode-generator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 0 picks the smallest version that fits; 'M' is the error correction level&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;qrcode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;M&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;svg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;qr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createSvgTag&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;cellSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;scalable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL is written straight into the pattern. No server, no redirect, and nothing that can be switched off later. The link only stops working if the website itself goes away.&lt;/p&gt;

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

&lt;p&gt;First I made an &lt;a href="https://play.google.com/store/apps/details?id=com.free.qr&amp;amp;hl=en" rel="noopener noreferrer"&gt;Android QR code generator&lt;/a&gt;, so people could generate and customize codes without unexpected payments.&lt;/p&gt;

&lt;p&gt;Then I thought: why should anyone install an app just to make a QR code? So I built a web version too, as a &lt;a href="https://quickconvertonline.com/tools/qr-code-generator" rel="noopener noreferrer"&gt;free QR code generator&lt;/a&gt; and a &lt;a href="https://quickconvertonline.com/tools/bulk-qr" rel="noopener noreferrer"&gt;bulk QR generator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The rule for both is simple: &lt;strong&gt;your QR code should point directly to your URL, without depending on someone else's redirect service.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It grew from there
&lt;/h2&gt;

&lt;p&gt;Later I started adding tools for PDFs, images, video and audio, and that became &lt;a href="https://quickconvertonline.com/" rel="noopener noreferrer"&gt;QuickConvertOnline&lt;/a&gt;. I'm still improving it and adding features.&lt;/p&gt;

&lt;p&gt;The funny part is that all of this started because I just wanted one free QR code. 😄&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you print one:&lt;/strong&gt; scan it and look at the URL it opens. If it goes through a domain you don't recognize, your code depends on that service staying online and staying free.&lt;/p&gt;

&lt;p&gt;Have you been caught out by a "free" tool like this? I'd like to hear about it in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>showdev</category>
      <category>android</category>
    </item>
  </channel>
</rss>
