Seth Larson hand-drew a functional version 1 QR code on grid paper, splitting cells to fit the 21x21 pixel pattern across a 10x10 grid sheet.
Key Takeaways
Version 1 QR codes are 21x21 modules and can encode up to 17 bytes at error-correction level L, enough for short URLs.
Lowercase URLs consume more bytes; switching to all-caps (e.g., HTTPS://SETHMLARSON.DEV) fits within version 1 limits because the alphanumeric charset includes : and /.
The Python qrcode package with echo -n (no trailing newline) is the quickest path to a reference bitmap for manual drawing.
Drawing position patterns and timing lines first lets a scanner partially recognize the code incrementally as you fill in data modules.
Even with a visible data error, the code scanned successfully at error-correction level L; flat paper or hanging from a monitor helped scanning.