Modern QR code generator for permanent QR codes that never expire — fully client-side, no backend and no tracking.
- Node.js 24+ (Download)
- IDE (VS Code, WebStorm, ...)
- Package manager (pnpm (recommended), npm, ...)
- Optional: Docker (to run the app in a container)
- 7 content types — URL, text, WiFi, email, phone, SMS and contact (vCard)
- Live preview that updates as you type
- Permanent codes — the data is encoded directly into the QR, so it never expires
- Privacy-first — everything is generated in your browser, nothing is sent to a server
- Export to PNG and vector SVG, or copy straight to the clipboard
- Selectable export size (256 – 2048 px) and error correction level, with the resulting module count and pixels-per-square shown live
- Logo page (
/logo) — download the app logo as a vector SVG - SEO ready — OpenGraph/Twitter cards with a generated OG image, JSON-LD, manifest, robots, sitemap
- Clone the repository and navigate to the root:
cd qr-generator/ - Install all dependencies:
pnpm install
- Development mode:
pnpm dev - Production mode:
pnpm build && pnpm start - Lint:
pnpm lint - Type check:
pnpm typecheck - Format:
pnpm format
The app ships a multi-stage Dockerfile (Next.js standalone output, non-root user) and a
docker-compose.yml.
cp .env.example .env # optional — defaults work for localhost
docker compose up -d --build # http://localhost:3000
docker compose logs -f qr-generator
docker compose downWithout compose:
docker build -t qr-generator --build-arg APP_URL=https://qr.example.com .
docker run --rm -p 3000:3000 -e APP_URL=https://qr.example.com qr-generatorAPP_URL is inlined at build time — it feeds the prerendered canonical / OpenGraph / robots /
sitemap URLs and enables the Strict-Transport-Security header when it is an https:// origin — so
pass it as a build arg for any non-localhost deployment, and keep the runtime value identical.
Request headers (X-Forwarded-Host) are deliberately not trusted: they are client-supplied, and
honoring them would let anyone put a foreign domain into the app's own canonical/OpenGraph URLs.
The compose file binds the published port to 127.0.0.1 (the container is meant to sit behind a
reverse proxy on the same host); drop that prefix to expose it on the network directly.
| Description | Values |
|---|---|
| Port: | 3000 |
| Technologies: | Next.js, React, Tailwind CSS |
| URL: | http://localhost:3000 |
| Health check: | http://localhost:3000/api/health |
| Env: | APP_URL (public origin), APP_PORT (compose) |
This software is developed by Petr Kašpar and is licensed under the MIT License.
For more details, please refer to the LICENSE file.