The free, open-source QR code generator that doesn't suck.
No sign-up. No watermarks. No tracking. No BS.
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.
- 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
- 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.
- 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
- 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
- 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
Visit deadboy18.github.io/qr-studio β that's it.
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
- Fork this repository
- Go to Settings β Pages
- Under Source, select
mainbranch and/ (root)folder - Click Save
- Your QR Studio is live at
https://<your-username>.github.io/qr-studio
| 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. |
| 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 |
mailto:hi@example.com?subject=... |
Pre-filled emails | |
| Phone | tel:+15551234567 |
Click-to-call |
| SMS | sms:+15551234567?body=... |
Pre-filled text messages |
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'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).
- Sign up at workers.cloudflare.com (free)
- Click Create Worker β Start with Hello World!
- Name it
qr-proxy - Click Edit Code, delete everything, paste the contents of
worker.js - Click Deploy
- Test it β visit your worker URL with a test favicon:
You should see the Google favicon image.
https://qr-proxy.YOUR-SUBDOMAIN.workers.dev/?url=https://www.google.com/favicon.ico - 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';
- Push to GitHub β done. ChromaCode favicon fetching now works for any site.
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.
Contributions are welcome! If you have ideas for new features, find bugs, or want to improve the code:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-thing) - Commit your changes (
git commit -m 'Add amazing thing') - Push to the branch (
git push origin feature/amazing-thing) - 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.
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 β€οΈ
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 β