Embedding photos in QR codes - practical Art!

We’ve all seen QR codes on flyers, business cards, restaurant tables, and packaging. They’re useful—but often uninspiring. Just black squares on a white background. But what if a QR code could do more than just function? What if it could become a part of the visual identity of what it’s embedded in?
This project was born out of that idea—and inspired by the work of the talented young engineers at Lemiocode, who transform boring QR-codes into expressive, engaging design. Their examples sparked a question: How could I do this myself?
That’s how I started building a small Flask web app that turns ordinary QR codes into practical art.
🎨 What It Does
I tried to build an accessible web-app that lets you:
- Choose whether to embed a URL or your vCard contact information.
- Upload a custom background photo — like a logo, portrait, or artwork.
- Generate a QR code with elegant visual styling, such as soft circular modules instead of harsh square ones.
- Automatically layer the QR code over your image, creating a visually integrated result.
All of this happens locally — nothing is sent to third parties, nothing is saved long-term.
🧭 How It Works
Here's a four step process:
- Chose data template and enter your data. Either an URL / Text or the details for a vCard is supported. In order to make the created QR-code not too large I omitted the "organisation".
- Upload a squared background photo.
- Generate the code. The generated code can be downloaded and used.
🧠 Why Build It?
There are many online QR generators, most of them offer a "free" service but then:
- Track you or watermark the images
- Store your data entered
I wanted to create a small neat application that offer you the opportunity to play around with the possibilities.
🔐 Privacy by Design
This app runs on a self-hosted server (in my case, PythonAnywhere). Data is never logged or stored. Uploaded images and QR codes are deleted after one hour. It’s a small thing — but it’s nice knowing your personal info and images aren’t being siphoned into an invisible database.
🚀 Try It Yourself
You can test the app on https://schoenf.pythonanywhere.com
Tech Stack - in case you are interested
- Flask for the backend logic and form handling
- Bootstrap 5 for a clean, responsive UI
- qrcode and Pillow for QR generation and image processing
- PythonAnywhere for quick deployment without infrastructure headaches