QRENCODER

Every module
a whole pixel.

A local-only QR generator for macOS, Linux and Android. Type or paste, or compose a Wi-Fi record, a vCard, a BIP 21 URI — the symbol is already there, with no Generate button and no network call.

QREncoder’s editor: the payload type TEXT at the top left with a Change key, a payload field, error correction, ink and style controls, the encoded symbol on a white plate in the centre, and modules, contrast, export size and scale in the right margin.
Fig. 1 A Wi-Fi string typed as text, at error correction Q — 41 × 41 modules, 392 px export.
14PAYLOADS, TYPED NOT PASTED
3SYMBOL STYLES
0NETWORK CALLS AT RUNTIME
4MODULE QUIET ZONE, IN EVERY EXPORT

One matrix, three hands

The same encoded data, drawn three ways. Preview, style chip and exported PNG all come from one painting routine, so a style cannot look one way on screen and another in the file.

  1. The default style: near-black square modules separated by a hairline white gap, with square finder eyes.
    Fig. 2 Default

    Default

    A hairline gap opens between modules from 8 px up, so the symbol reads as tiles laid on a grid.

  2. The standard style: plain near-black square modules butted edge to edge, with no gap between them.
    Fig. 3 Standard

    Standard

    Squares, edge to edge, with nothing between them. The flattest and highest-contrast of the three.

  3. The liquid style: neighbouring modules merged into rounded blobs, isolated modules drawn as dots, and the three finder eyes as rounded rings around rounded cores.
    Fig. 4 Liquid

    Liquid

    Modules merge along shared edges, singletons become dots, and the three finder eyes stay unmistakably eyes.

Every style exports at a whole-pixel module scale, quiet zone intact.

Why whole pixels

A QR code is a bitmap, not a picture.

Scale it by 1.37 and every edge blurs; the scanner has to guess where a module ends. QREncoder only ever multiplies — a module is 8 px wide or 16, never 11.4. The grid you see in the preview is the grid that ships.

EXPORT = (MODULES + 8) × SCALE

The exported PNG of a Wi-Fi symbol: the complete code, every module a solid block eight pixels wide, with its four-module white quiet zone intact.
Fig. 5 The file itself — 41 × 41 modules, 8 px each, quiet zone included.

On the screen

The empty editor: a payload field holding the words Type or paste, the error-correction keys L M Q H with Q selected, four ink swatches, the module-scale ladder, three style chips, and an empty square plate.
Fig. 6 Before the first keystroke — the plate waits, sized to the standard.
The same editor in the dark theme: near-black chrome, newsprint text, lime accents, the appearance keys Auto, Light and Dark in the top bar, and a white plate holding the black symbol.
Fig. 7 Dark. The chrome follows the theme; the plate stays white.
The template list open over the editor: fourteen rows from Text to Ethereum, each with the string format it composes, the current one filled in lime.
Fig. 8 The template list, opened from the type line.
The Wi-Fi template with a network name typed: four fields, the compose keys for security and hidden network, the resulting WIFI: string in a monospaced box, and the symbol beside it.
Fig. 9 A Wi-Fi record, composed from its fields and shown underneath.
The editor at phone width: payload field, then the symbol, then error correction, ink, module scale and style controls, with Copy Image and Save PNG pinned to the bottom.
Fig. 10 Phone width — the symbol sits directly under the payload.
The Wi-Fi template at phone width: network name, password, security keys, the composed string, and the symbol below.
Fig. 11 The same form on a phone.

Fourteen payloads

Each payload is a short form that composes its own string, with the result always shown underneath. A Wi-Fi record, a vCard, a BIP 21 URI and an EIP-681 call are built from their parts, not pasted as opaque text.

On Android the app is also a share target: share a link from any app and it opens with the symbol already drawn. A fresh launch always starts on Text, with the caret in the box.

Privacy is the architecture

The Wi-Fi password you type never reaches a socket, a log or a database — because there is no server to reach.

SENT

Nothing. The app makes no network requests at all.

STORED

Your last error-correction level, ink, scale, style and theme. Never the payload.

REQUIRED

No account, no licence key, no sign-in.

Get it

Signed builds for macOS and Android ship from these channels. Linux builds from source.

Signed with the same Android publisher key everywhere — certificate SHA-256 79750fb4…a20b3a24d. You need Flutter 3.47 or newer to build; the macOS window opens at 1440 × 900, and payloads can also arrive on the command line.

flutter pub get

flutter run -d macos
flutter build macos --release

flutter run -d <android-device>
flutter build apk --release

qrencoder "WIFI:T:WPA2;S:…;P:…;;"

About this build

QREncoder 1.1.0 was built by an agent running on free tokens — DeepSeek 4.1 Flash on its free tier — with nothing paid anywhere in the loop. It is not a demo: it is the QR generator its author uses, replacing a Mac app that is no longer maintained.

The experiment, its numbers, and the rougher first build from a pool of free models are written up in Token poverty: can you use freely available AI to do productive work? · slovenská verzia.