Turn the Wi-Fi you're on into a QR code your guests scan to join — no reading passwords aloud, no typing.
One click reads your current network, or print a poster / a sheet of cut-out cards for the wall or the front desk.
Everything runs on your device and nothing is ever uploaded.
wifi2qr.app · macOS · Windows · Linux · Web · 16 languages · free & open-source
No install (any device): open wifi2qr.app in a browser — available in 16 languages (auto-detects yours), works offline, installs as a PWA.
Desktop app (auto-reads your current Wi-Fi, prints posters/cards) — all builds on the releases page:
| Platform | Installer |
|---|---|
| macOS (Universal — Intel + Apple Silicon) — signed & notarized (opens with no Gatekeeper warning) | Wi-Fi2QR_1.0.6_macOS_universal.dmg |
| Windows (x64) | signed, auto-updates, all 16 languages |
| Linux · Debian/Ubuntu | Wi-Fi2QR_1.0.6_amd64.deb |
| Linux · Fedora/RHEL | Wi-Fi2QR-1.0.6-1.x86_64.rpm |
Every release ships a signed checksum manifest + build-provenance statement so you can verify a download matches this source — see Verify your download.
Modern Wi-Fi passwords are long, random, and a pain to read aloud or thumb-type on a phone. A Wi-Fi QR fixes that — point a camera at it and the device joins, no typing and no mistakes. It's genuinely useful when:
- Guests arrive. Friends, family, clients, contractors scan and they're on — without you reciting
xK7$mq…character by character or scribbling it on a whiteboard. - You run a café, studio, clinic, Airbnb or rental. Generate the QR once, print a poster for the wall or a sheet of cut-out cards for the front desk, and every visitor self-serves. No staff time, no password on a sticky note by the till.
- Hotels & events. Print a sheet of cut-out cards — one per room, or a stack to hand out at reception.
- You're onboarding a new device. Phone, tablet, laptop, smart TV, printer, or any IoT gadget with a camera or companion app — scan to join instead of pecking at an on-screen keyboard with a remote.
- You never memorised the password. macOS saved it years ago and you've no idea what it is. This reads it from your keychain and turns it into a QR without ever showing the plaintext to you or anyone.
- Meetings & events. Share the room's network with everyone at once — throw the QR up on the projector.
- You switch networks often. Hit Refresh after joining a different one and it regenerates instantly.
It's the same convenience iPhones have for sharing Wi-Fi to nearby Apple devices — but as a plain QR that anything with a camera can scan, generated on demand, completely offline.
Both the desktop apps and the web app turn the code into something you can put up or hand out:
- A full-page "Join the Wi-Fi" poster — for a wall, a door, or a meeting-room projector.
- A sheet of cut-out cards — one per hotel room, or a stack for the reception desk or an event.
The heading is localized into your language, the password can be shown or hidden, and the QR keeps the little Wi-Fi glyph in the centre while staying fully scannable. It prints straight to paper or Save as PDF — no design tool, no upload.
1. Web app — runs on any device (web/). A tiny browser app: type or paste a network name +
password and it draws the QR instantly, entirely client-side — no upload, works offline, and installs
as a PWA (Add to Home Screen). Open web/index.html directly, or host the web/ folder anywhere static.
This is what covers iPhone, iPad, Android, GrapheneOS, Windows, Linux, ChromeOS — anything with a browser.
The QR engine is Project Nayuki's MIT encoder (vendored, verified by an encode→decode round-trip). The UI is
localized into 16 languages (including right-to-left Arabic) across the web app and all three desktop
apps, driven from one shared string catalog (i18n/).
2. Desktop apps — one-click auto-read + printing. On macOS, Windows and Linux the app reads this
machine's current Wi-Fi (SSID + saved password) and shows the QR with no typing, and prints the poster/cards
above. macOS is a native SwiftUI app (Sources/); Windows and Linux are a Tauri app (desktop/)
that reuses the same web frontend. See Build & run below.
Why not auto-read on phones? Reading the live Wi-Fi password is an OS-privileged operation only desktop OSes (macOS/Windows/Linux) allow. iOS/iPadOS forbid it entirely and Android/GrapheneOS block it without root — which is why phones ship their own Wi-Fi-QR sharing in Settings. So the auto-read app is desktop-only; the web app (manual entry) is the universal path.
launch → [grant Location] → [approve keychain] → QR shown, ready to scan / print
| Permission | Why | Who asks |
|---|---|---|
| Location | On macOS 10.15+, the OS only tells an app the name (SSID) of the Wi-Fi you're on if it has Location access. (Apple classes "which Wi-Fi you're near/on" as location data.) | System dialog on first launch |
| Keychain | The Wi-Fi password lives in your keychain. The app reads it with the same /usr/bin/security tool Keychain Access uses, which shows the standard "allow / always allow" authorization dialog. |
System dialog when it reads the password |
Both are the user's to grant — the app can't (and doesn't try to) bypass either. The password is used only to build the QR payload in memory; it is never written to disk, logged, or sent anywhere.
The macOS app is pure SwiftUI + system frameworks, no third-party dependencies:
| File | Responsibility |
|---|---|
Sources/WiFi2QRApp.swift |
@main app + window |
Sources/LocationAuth.swift |
Requests/observes Location authorization (CoreLocation) — the gate that unlocks the SSID |
Sources/WiFiInfo.swift |
Reads the SSID (CoreWLAN) and the password (shells out to security, triggering the keychain prompt) |
Sources/QRCode.swift |
Builds the standard WIFI:T:WPA;S:…;P:…;; payload (with proper escaping) and renders it with CoreImage's CIQRCodeGenerator |
Sources/PrintCard.swift |
Draws the printable full-page poster and the sheet of cut-out cards |
Sources/ContentView.swift |
The one-click flow + UI: shows the current network, reads the password on demand, renders the QR, with Save PNG / Print (Poster / Cards) / Copy / Refresh |
The Wi-Fi provisioning payload is the cross-platform standard camera apps understand:
WIFI:T:WPA;S:<ssid>;P:<password>;; # H:true; appended for hidden networks
\ ; , : " in the SSID/password are backslash-escaped per the spec. Security type defaults to WPA
(covers WPA/WPA2/WPA3); a network with no saved password is emitted as T:nopass (open).
Requirements: macOS 13+ and the Xcode Command Line Tools (xcode-select --install). No full Xcode
or Xcode project needed — it builds with swiftc + codesign.
./install.sh # builds (if needed) and installs into /Applications, then opens it
# or, to just build without installing:
./build.sh && open build/WiFi2QR.appinstall.sh drops WiFi2QR.app into /Applications (falls back to ~/Applications). build.sh compiles
the sources, assembles WiFi2QR.app, and ad-hoc code-signs it (a stable identity so macOS can attach the
Location/keychain permissions). It builds for the host architecture by default; for an Intel build run
ARCH_OVERRIDE=x86_64 ./build.sh.
Because you built it locally, macOS Gatekeeper opens it without fuss. If you ever copy it to another Mac
(so it carries a download quarantine flag), open it the first time with right-click → Open, or clear the
flag: xattr -dr com.apple.quarantine /path/to/WiFi2QR.app.
cd desktop
npm install
npm run tauri dev # run from source
npm run tauri build # produce installers (.deb/.rpm on Linux, .msix on Windows)Nothing to build — open web/index.html, or host the web/ folder on any static host. After editing the
string catalog, regenerate the embedded bundle with python3 i18n/bundle.py.
Every release carries a signed checksum manifest and a build-provenance statement, so you can confirm a binary is the exact artifact this project's CI built from a specific public git commit:
| File on the release | What it is |
|---|---|
SHA256SUMS (+ .minisig) |
SHA-256 of every artifact, signed with minisign |
provenance.json (+ .minisig) |
in-toto / SLSA v1 statement linking each digest to the source commit + CI run |
minisign.pub |
the public key (also at https://wifi2qr.app/minisign.pub) |
# public key (never changes — pin it once):
PUB=RWSkY/1m7/T4kf6WOuu3z80TCFO962ckT7af0cuenWGkNMlcRIS4fj1L
minisign -Vm SHA256SUMS -P "$PUB" # -> "Signature and comment signature verified"
# trusted comment shows the source commit
sha256sum -c SHA256SUMS # your download matches the manifest (shasum -a 256 -c on macOS)Full details, plus the honest limits of what this proves (and the reproducible-build path), are in SECURITY.md. This is separate from — and on top of — the platform identity signing (Apple Developer ID notarization on macOS, the signed Store MSIX on Windows).
- Approve "WiFi2QR would like to use your location." → the app reads the current network name.
- Approve the keychain dialog for the Wi-Fi password (tick Always Allow to skip it next time).
- The QR appears with the network name under it — point another device's camera at it to join, or hit Print for a poster / sheet of cut-out cards.
- "Location access is off" — click Open Settings, enable Location for WiFi2QR, then Continue. Or click Enter name manually and type the SSID; the password step still works.
- Network name not detected — you're on Ethernet, Wi-Fi is off, or Location isn't granted. Type the name in the manual field.
- "No saved password found" — the network is open, enterprise (802.1X, no simple password), or was never joined on this Mac. Open networks still produce a valid (password-less) QR.
- Keychain prompt every time — tick Always Allow in the dialog.
- Not sandboxed (macOS). The app shells out to
/usr/bin/securityto read the Wi-Fi password, which the App Sandbox would block. It ships as a Developer ID–signed utility (direct download / notarized.dmg), appropriate for this kind of tool rather than the Mac App Store. - The released
.dmgis signed + notarized. Signed with the mineracks Developer ID and notarized + stapled by Apple, so it opens on any Mac with no Gatekeeper warning. A local./build.shis ad-hoc-signed instead (perfectly fine for building and running from source on your own Mac). - No network code, no analytics, no persistence. MIT licensed.
- Icon is generated from code — no image assets.
icon/makeicon.swiftdraws a QR code's three finder "eyes" with a Wi-Fi fan in the fourth corner on a blue→cyan squircle;./icon/makeicon.shrenders it toResources/AppIcon.icns(all sizes), whichbuild.shbundles.
MIT — see LICENSE.
