QR codes for links, Wi-Fi, contacts and more. The encoder is my own, written from the spec.
Higher levels survive scratches and a logo, but need more squares.
Your text is turned into bytes, padded, then split into blocks. Each block gets Reed-Solomon error correction bytes computed over GF(256), so the code still scans with part of it missing. The bytes are woven into the grid in the standard zig-zag, and all eight mask patterns are tried. The one with the lowest penalty score (no long runs, no fake finder patterns, close to half dark) wins.