What is it?
A fun way to share a digital library with visitors to your home. Basically, it’s a piece of paper with the book cover and a QR code. Anyone connected to the local wifi can scan the code and download the book.
Here’s a demo video:
It doesn’t have to be books — this works with any kind of digital content like albums, playlists or videos.
Why make this?
Physical books take up a lot of space and are hard to search. But a bookshelf is a great conversation starter, and I’ve always loved cover art. I wanted to recreate the fun of browsing a friend’s bookshelf with the convenience of digital technology.
How does it work?
There are two parts — the QR code, and the server.
Each QR code contains a link that looks something like this: “https://book/123”. This is a fake domain that will be resolved to a local server using a local DNS setup. If you don’t want to mess with DNS, you can also hardcode your server’s local IP address here.
For the server I used a Raspberry Pi that I had laying around. I uploaded the books I wanted to share to the Pi, set up Apache to serve the books, and configured UFW firewall to make the server accessible only over the local network.
Finally, I set up a local DNS server on the Pi and changed my router’s DHCP configuration to point to it.
Designing the covers
This was the fun part. I picked out some of my favorite public domain books from Project Gutenberg and downloaded them in epub format. Unfortunately I don’t have any artistic talent, so I ended up using Midjourney to create the background cover art.
For designing the layout, I used Figma. Everything was done with the built in tooling except for the QR codes, for which I used the “QR Code Generator” plugin by Dave Williames.
For the physical printing, I decided to put four covers on a sheet of paper. This way they’re small enough that they don’t take up too much space when I hang them on the wall, but not so small that you can’t scan the QR code. All of the design work is published publicly here.
![](https://dennisyelizarov.com/wp-content/uploads/2023/06/combined_no_margin-791x1024.png)
I did the printing at Staples using their “Professional Print” document printing with 8.5 x 11 inch “Heavyweight Matte Cover” paper for a cost of $1.35 per page.
Server Setup
There’s nothing fancy on the server side. Apache serves the book files with a simple configuration that redirects numeric URL paths like “/001” to the file on disk. dnsmasq redirects requests for the “book” URL to the Raspberry Pi’s static IP.
And that’s all there is to it. One wrinkle is that Google Pixel phones don’t appear to use the local DNS server unless you turn off “Private DNS” in the settings, so the QR codes fail to work by default. Is there a way to get resolution to work without having to hardcode the server’s IP? If anyone knows, please drop a comment below. (iPhones and other Android phones work fine, from my limited testing.)
Ideas for improvements
- As the book collection grows, it’ll be hard to store on the wall. Maybe some kind of “book jukebox” to allow flipping through the covers while remaining compact?
- Instead of linking directly to epub files, have an intermediate webpage that explains what the format is and how to open it, along with the download link.
- Integrate with ClipSurf to allow for sharing photo albums.
Leave a Reply