Generate, Customize, Download and Scan QR codes — Entirely in your browser. No account. No expiry. No server.
- Overview
- Key Features
- User Flow
- Architecture
- Tech Stack
- Quick Start
- QR Content Types
- Project Structure
- Available Scripts
- Deployment
- How Static QR Codes Work
- Privacy
- License
Free QR Code Generator is a production-ready, client-side web app for creating static QR codes — the kind that encode your data directly and never depend on a redirect service or subscription.
Pick from 12+ content types (URL, vCard, Wi-Fi, phone, email, PDF, menu, app links, and more), walk through a simple 3-step wizard, customize colors, frames, and logos, then download as PNG, SVG, PDF, or JPG. A built-in camera scanner reads any QR code in the browser, and your recent designs are saved locally so you can restore them anytime.
Everything runs in the browser. Nothing is uploaded to a backend.
- 100% static QR codes — content is encoded directly; codes never expire and work offline after download
- 12+ content types — URL, vCard, PDF, images, social, video, text, Wi-Fi, app, menu, phone, email
- 3-step creation wizard — choose type → add content → customize design
- Live preview — instant updates as you edit content or styling
- Rich customization — foreground/background colors, size, error correction (L/M/Q/H), center logo, 6 frame styles
- Multi-format export — PNG, SVG, PDF, JPG with custom filenames
- Built-in QR scanner — camera scan or image upload via
html5-qrcode; nothing leaves your device - Local history — last 24 QR codes stored in
localStoragewith one-click restore - Social sharing — WhatsApp, Facebook, X, LinkedIn, Telegram, email
- Mobile-first UI — responsive layout, safe-area support, touch-friendly controls
- Accessible — semantic HTML, ARIA labels, keyboard-friendly forms
- Zero signup — no accounts, no API keys required for end users
flowchart TD
A[Open Free QR Generator] --> B[Homepage]
B --> C{What do you want?}
C -->|Create| D[Choose QR type]
D --> E[Step 2: Add content]
E --> F[Step 3: Customize design]
F --> G[Download PNG / SVG / PDF / JPG]
F --> H[Share or copy content]
G --> I[Saved to local history]
C -->|Scan| J[Open built-in scanner]
J --> K{Camera or upload?}
K -->|Camera| L[Live scan]
K -->|Upload| M[Decode from image]
L --> N[Show result + open link if URL]
M --> N
I --> O[Restore from Recent QR Codes]
O --> E
The app is a single-page React application with no backend. QR generation, encoding, rendering, export, scanning, and history all happen in the browser.
flowchart LR
subgraph Browser[Browser — React 19 SPA]
UI[Marketing + Wizard UI]
Encoder[qrEncoder.ts]
Styling[qr-code-styling]
Export[download.ts — PNG/SVG/PDF/JPG]
Scanner[html5-qrcode]
History[localStorage — 24 items]
end
UI --> Encoder
Encoder --> Styling
Styling --> Export
UI --> Scanner
UI --> History
History --> UI
| Concern | Approach |
|---|---|
| Routing | React Router — / homepage, /create/:slug wizard |
| State | React hooks + QrHistoryContext |
| QR rendering | qr-code-styling canvas/SVG output |
| PDF export | jsPDF + canvas rasterization |
| Persistence | localStorage only — no database |
| Hosting | Static files on Vercel or Netlify (SPA rewrites) |
| Layer | Technology |
|---|---|
| Framework | React 19 + TypeScript 5.8 |
| Build | Vite 6 |
| Routing | React Router 7 |
| Styling | Tailwind CSS 3 + Inter font |
| QR engine | qr-code-styling |
| Scanner | html5-qrcode |
| PDF export | jsPDF |
| Icons | Lucide React |
| Deployment | Vercel (primary) · Netlify supported |
- Node.js 18+ (20+ recommended)
- npm 9+
git clone https://github.com/LakiyaDev/FreeQrCodeGenerator.git
cd FreeQrCodeGenerator
npm install
npm run devnpm run build
npm run preview # serve dist/ locallyOutput is written to dist/.
| Type | Route slug | Encoded as |
|---|---|---|
| Website URL | website-url |
https://… |
| vCard | vcard |
vCard contact string |
pdf |
URL to hosted PDF | |
| Images | images |
URL to image gallery |
| Social Media | social-media |
Profile or link page URL |
| Video | video |
YouTube, Vimeo, or other video URL |
| Simple Text | text |
Plain text message |
| Wi-Fi | wifi |
WIFI:T:…;S:…;P:…;; |
| App | app |
App Store / Google Play URLs |
| Menu | menu |
Digital restaurant menu URL |
| Phone | phone |
tel:+… |
email |
mailto:…?subject=…&body=… |
Unlike dynamic QR services that use short redirect URLs, every code above embeds the payload directly — so it keeps working even if this website goes offline.
.
├── public/
│ ├── favicon.svg
│ └── hero-scan-me-qr.png
├── src/
│ ├── components/
│ │ ├── actions/ # Download, share, copy buttons
│ │ ├── generator/ # Wizard, forms, preview, customization
│ │ ├── history/ # Recent QR codes grid
│ │ ├── layout/ # Header, footer
│ │ ├── marketing/ # Hero, features, FAQ, how-it-works
│ │ ├── scanner/ # Camera + upload scanner
│ │ └── ui/ # Button, Input, Accordion
│ ├── config/
│ │ └── contentTypes.ts # 12 QR type definitions + slugs
│ ├── context/
│ │ └── QrHistoryContext.tsx
│ ├── hooks/
│ │ ├── useDarkMode.ts
│ │ └── useQrHistory.ts
│ ├── lib/
│ │ ├── qrEncoder.ts # Validation + payload encoding
│ │ ├── download.ts # PNG, SVG, PDF, JPG export
│ │ └── share.ts # Social share URLs + history helpers
│ ├── pages/
│ │ ├── HomePage.tsx
│ │ └── CreateQrPage.tsx # 3-step wizard
│ ├── types/
│ ├── App.tsx
│ └── main.tsx
├── index.html
├── netlify.toml # Netlify SPA config
├── vercel.json # Vercel SPA rewrites
└── package.json
| Command | Description |
|---|---|
npm run dev |
Start Vite dev server (port 5173) |
npm run build |
Type-check + production build → dist/ |
npm run preview |
Preview production build locally |
npm run lint |
Run ESLint |
The live site is deployed at freeqrcodegen.vercel.app.
| Setting | Value |
|---|---|
| Import | vercel.com/new — connect GitHub repo |
| Build command | npm run build |
| Output directory | dist |
| SPA routing | Handled by vercel.json |
| CLI deploy | npx vercel |
| Setting | Value |
|---|---|
| Import | app.netlify.com — connect GitHub repo |
| Build command | npm run build |
| Publish directory | dist |
| SPA routing | Handled by netlify.toml |
Dynamic QR services route scans through their servers with expiring short links. This app does the opposite:
- You enter content (URL, phone number, Wi-Fi credentials, etc.)
- The payload is encoded into the QR matrix on your device
- The downloaded image is self-contained — scanners read the data directly
Once generated, your QR code works forever without depending on Free QR Generator.
| Topic | Policy |
|---|---|
| Accounts | No signup required — nothing to register for |
| Data uploads | Generation and scanning happen entirely client-side |
| Analytics | No mandatory tracking in the core app |
| History | Stored in browser localStorage; clearable anytime |
| Camera | Requested only when the scanner is opened; revocable in browser settings |
© LakiyaDeV. All rights reserved.
For licensing questions, open an issue on the repository.