What if every book carried a hidden signature—something as unique as a fingerprint, but generated entirely from its ISBN? That’s the idea behind Dogear: turning numbers into striking, one-of-a-kind bookmark designs that blend maths, art, and a bit of flair.
Dogear is my experiment in turning ISBNs into physical art. Every book gets a unique bookmark design—and for special collections, those designs can carry custom touches.
The idea came to me when I needed a bookmark for a book I was reading in the company makerspace. Having recently given some demos on using our new Cricut Maker 3 I figured I'd just cut a rectangle out of cardboard and call it a day.
I was however quickly nerd sniped by my coworkers, and an idea started taking shape. Why didn't every book come with its own unique bookmark? And so the project escalated, quickly.
The idea grew: not just a rectangle, but a custom outline, a decorative top, a generative art design, and a QR code pointing to an explanation of what it all meant. Naturally, the title and author needed to be plotted with my shiny new pen-plotting tool.
The project earned its name — “Dogear” — a nod to the risk of page-folding it was designed to replace.
Soon it wasn’t just about making a bookmark for myself. I set out to give every book in our tech library its own bookmark. You can see an example on the dogear page listing for Advanced Unix Programming , or read about the design rationale for the Man Tech library.
Each bookmark is built from four vector layers:
- The front layer has a cut-out Voronoi diagram and logo detail, cut from coloured card.
- A mid-layer in a contrasting color, for stiffness and visual pop. This layer is cut to match the M logo on the top.
- A print layer with a QR code and a visually balancing line design, laser printed on plain paper.
- The back layer: pen-plotted author, title and ISBN, which is then cut to match the shape of the front layer.
Creating the design files
Dogear is written in Rust, which I’ve been learning (and thoroughly enjoying). The system has three main parts: book_sniffer, dogear, and bundler.
book_sniffer
book_sniffer handles the data setup—pulling in metadata, creating description files, and generating the webpages each QR code links to. For each book, it:
- Fetches book info from Open Library, including titles, authors, and identifiers.
- Outputs a Rusty Object Notation (RON) file that can regenerate the bookmark at any time.
- Builds the HTML index page via Tera templates by Vincent Prouillet.
Dogear
dogear takes the RON file and outputs all four vector layers. Along the way it:
- Generates the outline and top decoration using the SVG crate by Ivan Ukhov.
- Creates the main design cutout: a Voronoi diagram from the Voronoice crate by Andre Esteve.
- Outputs the mid-layer outline, giving this contrasting layer the logo-inspired cut out at the top.
- Generates a QR code with the qrcode crate by kennytm, and adds a simple line design for visual balance.
- Prepares the back layer: pen-plotted Mistral text turned into SVG curves via the Cosmic-text crate by Pop!_OS and Jeremy Soller. I generate SVG curves instead of just using regular text because I found issues getting the simple approach to work with the Cricut software as it has many deficiencies when it comes to processing SVG files. I use the Zeno crate by Chad Brokaw (dfrg) to rotate, size, and reposition the text. As part of that text, I use the ISBN crate by Jihyeok Seo (limeburst) to format the ISBN properly and pleasingly.
Bundler
Bundler takes a number of bookmark directories, and adds each layer to an A4 page (either in portrait or landscape mode, but landscape uses the card stock most effectively).
This not only cuts down on a lot of manual work placing the bookmarks in the Cricut Design Studio - it also:
- Helps us scale the bookmarks - as the Design Studio interprets our SVGs differently than both Firefox and Inkscape (some may even say it misinterprets the SVGs as a result).
- I insert registation marks that I know makes the loaded shapes 297x210mm, and so I can place the page of bookmarks to cut at 0,0 and size it to the full page size, taking all the guesswork out of the process.
- Deals with the 1/4" (6.25mm) margin that the Cricut inserts on the left and top - thus offsetting any cut from prints! This is an immensely frustrating Cricut Design Studio misfeature that can't be corrected with calibration. The cuts literally have to be offset on an imported page by a known amount in order to be placed on the correct location on an A4 sheet.
Cut, print, and plot
The Cricut Maker made quick work of the intricate cuts, and the Voronoi patterns translated beautifully to paper. A little “weeding” is needed to clear stray pieces, but so far it’s manageable. Ask me again after a hundred bookmarks.
The hardware shines, but the “Cricut Design Space” software… less so. It relentlessly pushes its subscription and tries to sell me things. The cloud-first approach doesn't work for projects like these bookmarks at all. Compounding these issues, it's picky about SVGs, lacks many critical features when reading in vector files, and inserts unreasonable hoops to jump through when creating cuts outside of its own software. My dream of pen-plotting the QR code gave way to laser printing — but honestly, the crisp printed result looks better anyway.
Assembly
Assembly is equal parts spray glue and patience. Glue goes on the back of the front layer only, so the accent color peeks through cleanly. With glue on one side, it takes a day to cure fully. The other layers glue faster. I have make a jig to align the tricky sticky pieces right, and a press to keep things aligned and flat while they're drying — no more warping like I had with PVA glue
Upload step
Finally, rsync ships everything to this site.
Putting it all together
Countless lunchtime Makerspace sessions went into refining the process. But running it now is simple:
$ book_sniffer list newly_scanned_isbns.txt
$ just generate # runs `dogear` on every .ron file in the `new` directory.
$ bundler --orientation=landscape bookmark_dir_1 bookmark_dir 2 ...
$ just upload # triggers rsync on the `new` and `static` dirs.
Other software used
A whole ecosystem of Rust crates helped make Dogear happen:
- Anyhow ¯\_(°ペ)_/¯ by David Tolnay for ergonomic error handling.
- Clap for command-line parsing.
- Nix (by the nix-rust team) and...
- Permissions by João Marcos to deal with filesystem permissions on Linux.
- Rand for randomness.
- Reqwest by Sean McArthur for HTTP requests.
- Serde plus ron for reading and writing the bookmark data.
- Unicode-ellipsis by Clement Tsang for gracefully truncating Unicode strings.
Am I happy with the result?
Absolutely. I’m gearing up for the first big production run, and the prototypes are looking great. Along the way, I’ve had fun learning Rust, exploring crates, and building a system that bridges metadata, maths, and craft.
If you haven’t already, take a look at the example page for Advanced Unix Programming, or read about how the design for the Man Tech company library came together.