<?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: Klicktools</title>
    <description>The latest articles on DEV Community by Klicktools (@klicktools).</description>
    <link>https://dev.to/klicktools</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%2F4088524%2Fcd63f8f0-1f71-4eb8-951e-cd8a9cf825a4.png</url>
      <title>DEV Community: Klicktools</title>
      <link>https://dev.to/klicktools</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/klicktools"/>
    <language>en</language>
    <item>
      <title>Why I Built a No-Signup QR &amp; URL Utility Platform (And How to Use the API)</title>
      <dc:creator>Klicktools</dc:creator>
      <pubDate>Fri, 21 Aug 2026 15:32:06 +0000</pubDate>
      <link>https://dev.to/klicktools/why-i-built-a-no-signup-qr-url-utility-platform-and-how-to-use-the-api-3lef</link>
      <guid>https://dev.to/klicktools/why-i-built-a-no-signup-qr-url-utility-platform-and-how-to-use-the-api-3lef</guid>
      <description>&lt;p&gt;We've all been there: a client needs a quick QR code for a print campaign, or a short link for social media. You search Google, click the first result, and realize you need to create an account, verify your email, and potentially pay after 14 days.&lt;/p&gt;

&lt;p&gt;To solve this friction, we built &lt;a href="https://klick.tools" rel="noopener noreferrer"&gt;klick.tools&lt;/a&gt;. It's a collection of simple web tools that just work - no signup, no expiration dates, and full GDPR compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's inside?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;QR code generator:&lt;/strong&gt; 7 content types (URL, text, WiFi, vCard, email, phone, geo), custom colors and module shapes, automatic WCAG contrast check, and clean export as PNG, SVG or PDF. Rendering happens in the browser, so the payload never leaves the device.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL shortener:&lt;/strong&gt; shorten a link in seconds, see click stats, and change the target later without reprinting anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The developer API
&lt;/h2&gt;

&lt;p&gt;We didn't want to build just another consumer site, so everything is backed by a REST API. Base URL: &lt;code&gt;https://klick.tools/api/v1&lt;/code&gt;. Responses are always JSON - lists as &lt;code&gt;{ data, count }&lt;/code&gt;, writes as &lt;code&gt;{ message, data }&lt;/code&gt;, errors as &lt;code&gt;{ error }&lt;/code&gt; with a stable machine-readable &lt;code&gt;code&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Creating a short link is a single POST, and it works without an account at all (rate-limited per IP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://klick.tools/api/v1/links &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"targetUrl": "https://example.com/a-very-long-campaign-url"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With an API key (&lt;code&gt;kt_live_...&lt;/code&gt;, generated in your account) the link is bound to you, so you get click counts, editing and higher quotas. Pass it as a Bearer token or via &lt;code&gt;x-api-key&lt;/code&gt;:&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://klick.tools/api/v1/links&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;KLICK_TOOLS_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;targetUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com/landing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Summer campaign&lt;/span&gt;&lt;span class="dl"&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;shortUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clickCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The same pattern covers QR codes via &lt;code&gt;/api/v1/qr&lt;/code&gt; - create, list, patch and delete, including the scan history per code.&lt;/p&gt;

&lt;h2&gt;
  
  
  On privacy
&lt;/h2&gt;

&lt;p&gt;The QR generator runs client-side, so nothing you type into it is uploaded. For the shortener we don't log IP addresses and we don't set tracking cookies, and the whole thing is hosted in Germany. GDPR compliance was a design constraint from day one, not a banner we bolted on later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;We are currently working on a browser-side file converter that processes files locally, without the usual upload-and-wait marathon.&lt;/p&gt;

&lt;p&gt;Check it out at &lt;a href="https://klick.tools" rel="noopener noreferrer"&gt;klick.tools&lt;/a&gt; and let me know in the comments: what small web workflow drives you crazy that we should automate next?&lt;/p&gt;

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