Skip to content

deadboy18/qr-studio

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

15 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

QR Studio
The free, open-source QR code generator that doesn't suck.
No sign-up. No watermarks. No tracking. No BS.

Live Demo Β  License Β  Stars Β  Dependencies


What is QR Studio?

QR Studio is a professional-grade QR code generator that runs entirely in your browser. It supports 11 data types (including πŸ‡²πŸ‡Ύ DuitNow), ChromaCode image-blended mosaic codes, a full QR scanner with DuitNow EMV breakdown, live preview, and exports to PNG & SVG β€” all from a single HTML file with zero backend.

Most QR generators are bloated SaaS tools that paywall basic features, plaster watermarks on your codes, or require accounts just to download a PNG. QR Studio does none of that.


Features

Standard Mode

  • 11 Data Types β€” URL, Text, WiFi, Email, Phone, SMS, WhatsApp, Location, Calendar Event, vCard, πŸ‡²πŸ‡Ύ DuitNow
  • Live Preview β€” QR code updates instantly as you type, no "Generate" button needed
  • Full Customization β€” foreground/background colors, 7 presets, contrast warnings
  • Center Logo Overlay β€” upload any image as a center logo with automatic padding
  • Stroke & Outline β€” adjustable quiet zone and border options
  • Holiday Templates β€” Christmas, Halloween, New Year, Easter, Valentine's, St. Patrick's, Birthday frames
  • WiFi Credential Display β€” optionally bake SSID, password, and encryption type directly into the exported image
  • Copyable Encoded Data β€” every QR type shows the raw encoded string (mailto:, tel:, geo:, etc.) with a copy button
  • 180+ Country Codes β€” flag emoji dropdowns on all phone fields with full international dialing codes
  • Input Validation β€” real-time validation on every field with clear error messages
  • Resolution Control β€” export at 256px, 512px, 1024px, or 2048px
  • SVG Export β€” infinitely scalable vector output for print

πŸ‡²πŸ‡Ύ DuitNow QR Generator

  • EMV QR String Builder β€” generates structurally valid DuitNow EMV QR codes per PayNet QR Spec v1.5
  • 70 Acquirers β€” full dropdown of all banks, e-wallets, and payment providers from PayNet's official registry
  • Auto CRC-16 β€” checksum calculated per ISO/IEC 13239, verified against all 4 PayNet spec examples
  • DuitNow Branded Output β€” renders in the official pink frame with "MALAYSIA NATIONAL QR" banner
  • Static / Dynamic Toggle β€” choose between reusable (11) or one-time (12) QR codes
  • MCC Categories β€” 25+ common merchant category codes
  • Additional Data Fields β€” reference label, terminal, bill number, store label

⚠️ Note: Generated QR codes have correct EMV format and CRC but won't process real payments β€” the Merchant/QR ID must be registered with an acquirer bank through PayNet. This is useful for developers testing EMV parsers or learning how DuitNow QR is structured. See natsu90's research.

ChromaCode Mode

  • Image-Blended Mosaic QR β€” QR codes that visually incorporate a brand image while remaining scannable
  • Auto Favicon Fetch β€” enter a URL and ChromaCode automatically pulls the site's favicon
  • Upload or Image URL β€” use any image as the brand source
  • 5 Version Carousel β€” preview and compare QR versions 7, 10, 13, 15, and 18
  • Advanced Tuning β€” dot shape (circle/rounded/square), dark dot range, ghost strength, ghost threshold
  • Auto-Tune β€” intelligently adjusts parameters based on image characteristics
  • Palette Extraction β€” extracts and displays the dominant colors from the source image

πŸ‡²πŸ‡Ύ Scanner β€” DuitNow QR Breakdown

  • Camera, File & Paste β€” scan QR codes via camera, image upload, or clipboard paste
  • DuitNow EMV Decoder β€” full field-by-field breakdown of DuitNow and JomPAY QR codes
  • 70 Acquirer Lookup β€” identifies banks/wallets by Acquirer ID from PayNet's official list
  • CRC-16 Verification β€” validates checksum with βœ“ Valid / βœ• Invalid and expected value on mismatch
  • 300+ MCC Codes β€” human-readable merchant category labels
  • JomPAY Detection β€” identifies JomPAY QR codes (acquirer 898989) and shows Biller Code
  • Tip & Convenience Fee β€” decodes EMV IDs 55, 56, 57
  • Merchant Channel Decoding β€” decodes the 3-character field (ID 62.11) into media type, transaction location, and merchant presence per PayNet Tables 3–5
  • Data Integrity Check β€” displays SHA-256 hash (ID 82) when present
  • Language Template β€” shows alternate language merchant name/city (ID 64)
  • Additional Data Fields β€” bill number, mobile, store label, loyalty, reference, customer label, terminal, purpose, consumer data request, merchant tax ID, RRN (Ref-1/Ref-2), geo coordinates
  • 22 Currency Codes β€” MYR, USD, SGD, THB, IDR, CNY, GBP, EUR, JPY, AUD, HKD, KRW, and more
  • Regenerate Clean QR β€” rebuild a scannable DuitNow-branded QR from decoded data with adjustable print sizes (sticker β†’ A4) and font size controls for merchant name & bank
  • QR Safety Analysis β€” flags suspicious URLs, warns on open WiFi, crypto addresses, and payment QR codes

General

  • Dark / Light Theme β€” with persistent preference
  • Mobile-First Responsive β€” works perfectly on phones, tablets, and desktops
  • Share API β€” native sharing on supported devices
  • Single HTML File β€” the entire app is one file, no build step, no framework, no node_modules
  • Privacy-First β€” everything runs client-side; your data never leaves your browser
  • Easter Eggs β€” πŸ‘€ open the console if you're curious

Quick Start

Option 1: Just use it

Visit deadboy18.github.io/qr-studio β€” that's it.

Option 2: Self-host

git clone https://github.com/deadboy18/qr-studio.git
cd qr-studio
# Open index.html in any browser. Done.

No dependencies to install. No build step. No configuration.

qr-studio/
β”œβ”€β”€ index.html     ← the entire app (single file)
β”œβ”€β”€ worker.js      ← Cloudflare Worker for ChromaCode favicon proxy (optional)
β”œβ”€β”€ README.md
└── LICENSE

Option 3: Deploy to GitHub Pages

  1. Fork this repository
  2. Go to Settings β†’ Pages
  3. Under Source, select main branch and / (root) folder
  4. Click Save
  5. Your QR Studio is live at https://<your-username>.github.io/qr-studio

Tech Stack

Layer Technology
Markup & Logic Vanilla HTML, CSS, JavaScript
QR Engine qrcode-generator (1.4.4)
QR Scanner jsQR (1.4.0, lazy-loaded)
ChromaCode Algorithm Toms Nimanis / IT Linden
DuitNow EMV Spec PayNet QR Spec v1.5
DuitNow Research natsu90
Typography DM Sans + JetBrains Mono (Google Fonts)
Build System None. It's one file.
Backend None. It's client-side.
CORS Proxy Cloudflare Worker (optional, for ChromaCode favicons)
Tracking None. We respect your privacy.

Supported QR Types

Type Encoded Format Example
URL https://example.com Website links
Text Raw text Messages, notes
WiFi WIFI:T:WPA;S:MyNet;P:pass123;; Auto-connect to networks
Email mailto:hi@example.com?subject=... Pre-filled emails
Phone tel:+15551234567 Click-to-call
SMS sms:+15551234567?body=... Pre-filled text messages
WhatsApp https://wa.me/15551234567?text=... Direct WhatsApp chats
Location geo:48.8584,2.2945 Maps & coordinates
Calendar iCalendar (.ics) format Events with time, location
vCard vCard 3.0 format Full contact cards
πŸ‡²πŸ‡Ύ DuitNow EMV QR (TLV) format DuitNow payment QR codes

ChromaCode Favicon Proxy (Optional)

ChromaCode's Favicon tab auto-fetches site icons to blend into the QR code. Because browsers block cross-origin image requests (CORS), this requires a proxy. Without one, the Upload and Image URL tabs still work perfectly.

A free Cloudflare Worker acts as your own personal CORS proxy (100,000 requests/day free).

Setup (2 minutes)

  1. Sign up at workers.cloudflare.com (free)
  2. Click Create Worker β†’ Start with Hello World!
  3. Name it qr-proxy
  4. Click Edit Code, delete everything, paste the contents of worker.js
  5. Click Deploy
  6. Test it β€” visit your worker URL with a test favicon:
    https://qr-proxy.YOUR-SUBDOMAIN.workers.dev/?url=https://www.google.com/favicon.ico
    
    You should see the Google favicon image.
  7. Open index.html, find this line and set your worker URL:
    const MY_PROXY = ''; // ← paste your worker URL here
    const MY_PROXY = 'https://qr-proxy.YOUR-SUBDOMAIN.workers.dev';
  8. Push to GitHub β€” done. ChromaCode favicon fetching now works for any site.

Without the proxy

Public CORS proxies (allorigins.win, codetabs.com) are used as fallbacks. They work for most sites but may be slow or block certain domains. The Upload tab always works regardless.


Contributing

Contributions are welcome! If you have ideas for new features, find bugs, or want to improve the code:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-thing)
  3. Commit your changes (git commit -m 'Add amazing thing')
  4. Push to the branch (git push origin feature/amazing-thing)
  5. Open a Pull Request

Since the entire app is a single HTML file, contributing is as simple as editing one file β€” no complex project structure to navigate.


Credits

Created by deadboy18

ChromaCode algorithm by Toms Nimanis / IT Linden

DuitNow EMV research by natsu90 Β· Acquirer data from PayNet QR Spec v1.5 Β· PayNet Developer Docs

Special thanks to VenimK ❀️


License

This project is open source and available under the MIT License.


If this tool saved you from paying $15/month for a QR code generator, consider giving it a ⭐

Releases

No releases published

Packages

 
 
 

Contributors