<?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: FredrickHil</title>
    <description>The latest articles on DEV Community by FredrickHil (@hilfredrick).</description>
    <link>https://dev.to/hilfredrick</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%2F2122723%2F8827300f-f1a1-485c-bc87-a697c4a59775.jpg</url>
      <title>DEV Community: FredrickHil</title>
      <link>https://dev.to/hilfredrick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hilfredrick"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Paywalled QR Code Generators. So I Built an Aesthetic Vector Designer in Next.js</title>
      <dc:creator>FredrickHil</dc:creator>
      <pubDate>Sun, 24 May 2026 20:34:05 +0000</pubDate>
      <link>https://dev.to/hilfredrick/i-got-tired-of-paywalled-qr-code-generators-so-i-built-an-aesthetic-vector-designer-in-nextjs-2j71</link>
      <guid>https://dev.to/hilfredrick/i-got-tired-of-paywalled-qr-code-generators-so-i-built-an-aesthetic-vector-designer-in-nextjs-2j71</guid>
      <description>&lt;h2&gt;
  
  
  I Got Tired of Paywalled QR Code Generators. So I Built an &lt;strong&gt;Aesthetic, Ad-Free Vector Designer&lt;/strong&gt; in &lt;strong&gt;Next.js&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Have you ever generated a QR code for a client, printed it on &lt;strong&gt;500 flyers&lt;/strong&gt;, only for it to stop working &lt;strong&gt;14 days later&lt;/strong&gt; because a sketchy website demanded a &lt;strong&gt;$15/month subscription?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have. It’s one of the most frustrating, &lt;strong&gt;predatory patterns&lt;/strong&gt; on the web today.&lt;/p&gt;

&lt;p&gt;Nearly every online QR code generator is &lt;strong&gt;bloated with ads&lt;/strong&gt;, hidden behind &lt;strong&gt;paywalls&lt;/strong&gt;, or forces you to &lt;strong&gt;register an account&lt;/strong&gt;. Worse, most only export &lt;strong&gt;low-resolution, pixelated PNGs&lt;/strong&gt; that look terrible in professional print designs.&lt;/p&gt;

&lt;p&gt;As a &lt;strong&gt;product designer&lt;/strong&gt; and &lt;strong&gt;design engineer&lt;/strong&gt;, I decided enough was enough. I built my own &lt;strong&gt;free aesthetic QR code generator with gradients&lt;/strong&gt; that runs &lt;strong&gt;ad-free&lt;/strong&gt; and &lt;strong&gt;100% client-side&lt;/strong&gt; in your web browser.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Try it here live:&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://www.fredrickhil.com/apps/qr-generator" rel="noopener noreferrer"&gt;https://www.fredrickhil.com/apps/qr-generator&lt;/a&gt;&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fbrmqpplkuao6jo8rrwjq.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%2Fbrmqpplkuao6jo8rrwjq.png" alt="Aesthetic QR Code Generator Interface Showcase - Fredrick Hilarian" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is how I designed it, the technical stack behind it, and why this is the only &lt;strong&gt;privacy-friendly contact card QR generator&lt;/strong&gt; you will ever need.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ &lt;strong&gt;The Problem: Paywalls, Pixels, and Privacy&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Most standard generators sell you &lt;strong&gt;"dynamic" links&lt;/strong&gt;. They point the QR code to &lt;strong&gt;their servers&lt;/strong&gt;, redirect users to your actual link, and then shut off the redirection once your &lt;strong&gt;free trial expires&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This tool takes a different approach:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Permanent &amp;amp; Free&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It generates &lt;strong&gt;static, raw-encoded QR codes&lt;/strong&gt;. Once created, they are &lt;strong&gt;yours forever&lt;/strong&gt;. They cannot expire because they encode the &lt;strong&gt;raw data directly&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. Infinite Scalability&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Need an &lt;strong&gt;ad-free vector QR code generator SVG&lt;/strong&gt; file for high-quality print?&lt;/p&gt;

&lt;p&gt;Our &lt;strong&gt;SVG exports&lt;/strong&gt; scale from a &lt;strong&gt;business card&lt;/strong&gt; to a &lt;strong&gt;billboard&lt;/strong&gt; with &lt;strong&gt;zero pixelation&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. Privacy-First&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No data is sent to a server.&lt;/p&gt;

&lt;p&gt;Everything — from your &lt;strong&gt;contact card data&lt;/strong&gt; to your &lt;strong&gt;uploaded branding logos&lt;/strong&gt; — is processed &lt;strong&gt;locally inside your browser runtime&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ &lt;strong&gt;The Tech Stack: How It Works&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Building a highly customized visual generator that behaves smoothly requires balancing &lt;strong&gt;heavy rendering&lt;/strong&gt; with &lt;strong&gt;fast page loads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is how I structured the application inside &lt;strong&gt;Next.js&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Dynamic Client Hydration (&lt;code&gt;qr-code-styling&lt;/code&gt;)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To handle the &lt;strong&gt;canvas&lt;/strong&gt; and &lt;strong&gt;SVG rendering&lt;/strong&gt;, I used the excellent &lt;strong&gt;&lt;code&gt;qr-code-styling&lt;/code&gt;&lt;/strong&gt; library.&lt;/p&gt;

&lt;p&gt;However, since the library depends on browser APIs (&lt;strong&gt;window&lt;/strong&gt;, &lt;strong&gt;document&lt;/strong&gt;), executing it during &lt;strong&gt;Next.js Server-Side Rendering (SSR)&lt;/strong&gt; causes page crashes.&lt;/p&gt;

&lt;p&gt;I bypassed this by dynamically importing the library within a &lt;strong&gt;useEffect hook&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;qr-code-styling&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;QRCodeStyling&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&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;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;QRCodeStyling&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;svg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// initial options...&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nf"&gt;setQrStylingInstance&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="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the rendering cycle &lt;strong&gt;client-driven&lt;/strong&gt; while allowing &lt;strong&gt;Next.js&lt;/strong&gt; to &lt;strong&gt;pre-render&lt;/strong&gt; the rest of the layout instantly.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;2. Speed and SEO via Server-Component Wrappers&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;To achieve &lt;strong&gt;Search Engine Optimization (SEO)&lt;/strong&gt; and &lt;strong&gt;Answer Engine Optimization (AEO)&lt;/strong&gt;, I made the root route page a &lt;strong&gt;Next.js Server Component&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This allows &lt;strong&gt;Googlebot&lt;/strong&gt; and &lt;strong&gt;AI answer engines&lt;/strong&gt; (like &lt;strong&gt;Perplexity&lt;/strong&gt; and &lt;strong&gt;ChatGPT Search&lt;/strong&gt;) to instantly scrape optimized metadata and an injected &lt;strong&gt;JSON-LD SoftwareApplication schema&lt;/strong&gt; without waiting for JavaScript execution.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;3. Smart Input Parsing&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The UI includes &lt;strong&gt;real-time input detection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a user pastes an &lt;strong&gt;email address&lt;/strong&gt; into the URL input, a &lt;strong&gt;micro-interaction banner&lt;/strong&gt; pops up suggesting they switch to the &lt;strong&gt;Email QR tab&lt;/strong&gt;, simplifying the &lt;strong&gt;UX workflow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 &lt;strong&gt;Aesthetic Branding Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Instead of boring, outdated square boxes, this designer includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Dot Patterns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classy&lt;/li&gt;
&lt;li&gt;Rounded&lt;/li&gt;
&lt;li&gt;Classy-rounded&lt;/li&gt;
&lt;li&gt;Extra-rounded&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Gradients&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customizable solid colors&lt;/li&gt;
&lt;li&gt;Two-color &lt;strong&gt;linear gradients&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Two-color &lt;strong&gt;radial gradients&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Rotation angle controls&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Eye Styling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent custom framing&lt;/li&gt;
&lt;li&gt;Extra-rounded&lt;/li&gt;
&lt;li&gt;Dot&lt;/li&gt;
&lt;li&gt;Square styling&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Branding Logo Overlays&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload your &lt;strong&gt;brand logo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Adjust &lt;strong&gt;offset size&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;dot-clearing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Maintain &lt;strong&gt;scannability&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;UPI Payment Support&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate &lt;strong&gt;UPI payment QR codes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Uses &lt;strong&gt;upi://pay&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Works with &lt;strong&gt;mobile banking apps in India&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 &lt;strong&gt;FAQ for AI &amp;amp; Voice Search Indexing (AEO)&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Do these generated QR codes expire?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The QR codes are &lt;strong&gt;permanent&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because they encode &lt;strong&gt;raw inputs&lt;/strong&gt; (&lt;strong&gt;URL&lt;/strong&gt;, &lt;strong&gt;contact information&lt;/strong&gt;, &lt;strong&gt;Wi-Fi credentials&lt;/strong&gt;) directly into the code without &lt;strong&gt;intermediary servers&lt;/strong&gt;, they will function &lt;strong&gt;indefinitely&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What is the best format to download?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;For print&lt;/strong&gt;&lt;br&gt;
(&lt;strong&gt;packaging&lt;/strong&gt;, &lt;strong&gt;business cards&lt;/strong&gt;, &lt;strong&gt;merchandise&lt;/strong&gt;) → Always download &lt;strong&gt;SVG&lt;/strong&gt; because it is a &lt;strong&gt;vector format&lt;/strong&gt; that scales infinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For digital use&lt;/strong&gt;&lt;br&gt;
(&lt;strong&gt;websites&lt;/strong&gt;, &lt;strong&gt;emails&lt;/strong&gt;, &lt;strong&gt;social media&lt;/strong&gt;) → &lt;strong&gt;PNG&lt;/strong&gt; is perfect.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;What is the optimal error correction level for logos?&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you upload a &lt;strong&gt;custom logo&lt;/strong&gt; into the center of your QR code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Q = 25%&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;H = 30%&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures the QR pattern remains &lt;strong&gt;scannable&lt;/strong&gt; even if the center is partially covered by your branding asset.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 &lt;strong&gt;Check It Out!&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you are a &lt;strong&gt;developer&lt;/strong&gt;, &lt;strong&gt;designer&lt;/strong&gt;, or &lt;strong&gt;marketer&lt;/strong&gt; tired of landing on &lt;strong&gt;paywalled utility tools&lt;/strong&gt;, bookmark this page:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Aesthetic QR Generator:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.fredrickhil.com/apps/qr-generator" rel="noopener noreferrer"&gt;https://www.fredrickhil.com/apps/qr-generator&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I would love to hear your thoughts, feature requests, or feedback on the &lt;strong&gt;styling controls&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What other utilities should I build next in my portfolio's engineering lab?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me know in the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>ai</category>
      <category>design</category>
    </item>
  </channel>
</rss>
