Building QuoteIt

A note-taking app that keeps the phone out of the way

9 min read

In the first week of August, a good friend lent me two books, How to be a Games User Researcher and The Secret Science of Games. I’m a UX designer in games, and there’s a certain overlap between what I do and what a user researcher does, so I wanted a refresher. The kind of reading where you want to underline every other page, so you can come back later and refresh your memory from your notes.

Except I couldn’t. They weren’t my books.

That’s a bigger problem for me than it sounds. I’ve always been a messy reader. I take a lot of notes, and most of my books end up full of underlines, highlights, bookmarks and even random sticky notes. They usually look something like this.

A book page covered in handwritten notes and underlines

So I tried the easy version. First I took notes in GoodNotes, then in a separate notebook. Both of them worked, technically. But both detached the notes from the book. A line in my notebook was just a line, without the page it came from or the paragraph around it.

And it wasn’t only borrowed books. I recently moved out of my country, and a huge physical library is not something I can carry around with me. So I started reading a lot more ebooks and borrowing from the library at work, and my notes started scattering. Apple Books lets me highlight and take notes, but unless I open the app, and that particular book, I never see them again. Same with Kindle, even if it syncs my notes to Goodreads. And on top of all that, notes from physical books had to live somewhere else again.

What I wanted was one place for all of it. Easy, right? Not really.

What I built

A bookmarking app for physical books, and for ebooks, PDFs and articles too. Readwise exists (it collects your highlights from Kindle and other apps), and there are other apps like it. But I couldn’t find one that suited what I needed without a lot of effort.

QuoteIt's library: an Inbox row with 6 quotes waiting for a book, above a shelf of book covers The Inbox: quotes captured without a book, each with its note and an Identify button A book page for Seeing Like a State, listing its quotes with their notes and locations

It’s called QuoteIt. Point at the page, tap the paragraph, save. The quote either goes inside its book, or into a temporary place I call the Inbox, until I get time to sort it out.

I started building it while I was still reading those two books. Which is a slightly strange loop, building the tool for the problem while you’re still in the middle of the problem (yes, I know :D).

How I built it

“I’m not good at coding” used to be my reason for not building things. Since AI-assisted coding showed up, that excuse has stopped working. Yes, I know I’m talking about AI, and some of you might be despising it with all your heart, and maybe despising me for writing this. But the reality is, AI is a better coder than I ever was, and it is helping me build the things I want.

Every project of mine starts with writing down what I want to achieve, and for a while now, that writing has mostly happened in Freeform. QuoteIt started as this.

My first Freeform sketch of QuoteIt: what it is, the two ways to capture a quote, the rules for saving one, the screens, and the first steps

What I wanted to achieve was simple, and a bit more straightforward compared to other flows. So I wrote a huge block about the design and the flows, and handed it to Claude Design. It built the design using SwiftUI elements, which was a requirement from me. I wanted QuoteIt to feel native on the iPhone, and to sit properly in the parts of iOS it depends on, like the share sheet, the camera and the widgets.

Then there was usability. The core of the app is scanning a page with the camera, and that is not something you can judge from a screenshot. So I installed a developer build on my personal phone, carried it around and used it every day while I read. That approach helped me a lot in finding and fixing bugs, because I was finding them the same way anyone else would, in the middle of a book.

There were plenty of scanning issues early on, but the one that changed the design was simpler. Opening the app and finding the scanner took too long. So I added a shortcut: long-press the icon on the home screen, and you’re straight into scanning. That’s the first flow in the next section.

The part I didn’t expect to learn was how to standardise design patterns and tokens across a Swift project. I knew how to do that on the web, with colour and type defined once and used everywhere, but I had never done it in Swift. In QuoteIt, every colour now comes from one palette file. The demos on this page use the same colours, which is why they look like the app.

The phone problem

The worst part of digital note-taking, for me, is that it disrupts the reading. QuoteIt disrupts it too, there is no question about that.

But the bigger problem was never the app I was reading in. It was the phone. Taking it out while I’m reading pushes me out of the zone. The moment it’s in my hand, it’s a Pandora’s box of distractions, and the book is suddenly the second most interesting thing in the room.

I couldn’t remove the phone from the process, since that’s where everything lives. So the approach was to make the time it’s in my hand as short as possible, by cutting the steps to take a note down to as few as I could. With a physical book, I long-press the app icon, choose New Quote by Scanning, and tap the paragraph. With an ebook or a PDF, I select the text and share it to QuoteIt. Then the phone goes back and I go back to the book.

When reading a physical book
9:41
QuoteIt
A home screen with the QuoteIt icon.
Playing by itself Step 1 of 5
Long-press the QuoteIt icon on the home screen.
Long-press the icon, choose New Quote by Scanning, tap the paragraph, save.
When reading an ebook
Done walden.pdf
Conclusion
If a man does not keep pace with his companions, perhaps it is because he hears a different drummer. Let him step to the music which he hears, however measured or far away.
However mean your life is, meet it and live it; do not shun it and call it hard names. It is not so bad as you are. It looks poorest when you are richest. The fault-finder will find faults even in paradise. Love your life, poor as it is.
A PDF of Walden open in a reader.
Playing by itself Step 1 of 4
Long-press a line to select it.
In an ebook or a PDF: select the line, share it, pick QuoteIt, save.

Articles work the same way. Anything I can select in a browser, I can share into QuoteIt.

gutenberg.org
Visitors
I think that I love society as much as most, and am ready enough to fasten myself like a bloodsucker for the time to any full-blooded man that comes in my way. I am naturally no hermit, but might possibly sit out the sturdiest frequenter of the bar-room, if my business called me thither.
Copy I had three chairs in my house; one for solitude, two for friendship, three for society. When visitors came in larger and unexpected numbers there was but the third chair for them all, but they generally economized the room by standing up.
A web page with one line selected.
Playing by itself Step 1 of 3
Tap Share on the selected line.
Select a line, share it, pick QuoteIt. The quote lands under the last book you filed to.

The one place it doesn’t work well is Apple Books, which, of course, is one of the apps I read in the most. The share extension I built (the bit that puts QuoteIt in the Share menu) isn’t working when Apple Books is open, and I still need to figure out why.

Sorting it out later

Things 3, a to-do app, has an Inbox where a task can land before you decide where it belongs. I borrowed that idea. Any quote can go into QuoteIt’s Inbox for now, and I can take my time to add it to a book later. The Inbox was crucial for cutting down the time it takes to capture a note while I’m reading.

The Inbox also has one CTA. Everywhere else, a quote card carries a bookmark. In the Inbox it carries “Identify” instead, because the only thing you should be doing there is giving the quote a book.

Demo - How the inbox should function
Quote It
Walden
Meditations
Seeing Like a State
Quote It library. Inbox, 1 waiting.
Playing by itself Step 1 of 3
Open the Inbox. One quote is waiting for a book.
Open the Inbox, then file the quote under a book.
A single quote in the Inbox, set with a large drop cap, an editable note under it, and Share, Identify and Delete buttons The Add a book sheet, offering three ways to identify a book: scan the barcode, type the ISBN, or enter it by hand

Three small decisions

The quote cant be edited, only the note. What I capture is what the book said, word for word. The note under it is mine, and I can change it whenever I want. I didn’t want anyone to guess which is which, so the quote screen says it out loud: “Editable. The quote above is not.”

When I save, the book is usually already picked. The capture sheet pre-fills the last book I filed to. If I’m reading the same book all week, saving is one tap. The Inbox is only for the quotes I chose not to file yet.

The scanner doesn’t guess. An earlier version of the scanner tried to be clever. It skipped the parts that “weren’t quotes”, like the running head (the book title printed at the top of every page), and every now and then it skipped a real quote too. So now it doesn’t guess. It offers every block it finds, even the ones nobody will ever tap. A running head nobody taps costs nothing. Losing the quote I actually wanted is the worst thing that screen can do.

Areas to improve

First, the scanner. Point the camera at a page, and it reads the page back as blocks you can tap. Tap a paragraph to take all of it. Tap it again to narrow it down to one sentence.

For now, Im relying heavily on Apple’s VisionKit (the text recognition built into iOS), and the scanning still isn’t perfect. That’s something I’m working on.

Reading the page…
WALDEN
I went to the woods because I wished to live deliberately, to front only the essential facts of life, and see if I could not learn what it had to teach, and not, when I came to die, discover that I had not lived.
I did not wish to live what was not life, living is so dear; nor did I wish to practise resignation, unless it was quite necessary. I wanted to live deep and suck out all the marrow of life, to live so sturdily and Spartan-like as to put to rout all that was not life, to cut a broad swath and shave close, to drive life into a corner, and reduce it to its lowest terms.
Our life is frittered away by detail. An honest man has hardly need to count more than his ten fingers. Simplify, simplify.
Playing by itself Step 1 of 3
Tap a paragraph to take all of it.
Tap a paragraph. Tap it again to narrow it to one sentence.

The other one is smaller. I always liked the idea of showing each book’s cover, so you can easily remember which book a quote came from. Right now I fetch covers from an open book database, but at times the fetching doesn’t work. So when it doesn’t, QuoteIt makes one. The title and author become the binding, and the colour comes from the title itself. Same title, same colour, every time, in the app, on the widget and in the demo below. Type your own title in and see what it picks.

plum
Playing by itself Step 1 of 2
Tap the other borrowed book. Its colour comes from its title.
Type a title. A book with no cover is bound in a colour that comes from its name.

Widgets

Bookmarking a quote is what feeds the widgets. There is no favourites screen in the app, and that is on purpose, the widget is where favourites live.

The widget gallery entry for QuoteIt, titled Favorite quotes: a quote you bookmarked, changing once a day, previewing the small size The same gallery entry previewing the medium size

Each widget shows one bookmarked quote a day. Which one is worked out from the date, so every QuoteIt widget on your phone shows the same quote, and bookmarking something new doesn’t restart the cycle. The smaller sizes skip quotes that are too long to fit rather than cutting them off mid-sentence.

That’s the “come back later” part I wanted from the start. One quote a day, on the home screen, without opening anything.

The small QuoteIt widget on a home screen, showing one bookmarked quote and the start of its book title The medium QuoteIt widget, showing a bookmarked quote with its book and author along the bottom

The widget is also a way back into the app. Tap the quote and it opens straight to it. Tap the + and it opens a blank quote, for the lines I would rather type than scan.

Tapping the quote
9:41
“The state does not see the land; it sees the map it made of the land.”
Seeing Like a State · James C. Scott
QuoteIt
A home screen with QuoteIt's widget showing today's quote.
Playing by itself Step 1 of 1
Tap the quote on the widget.
Tap the widget and it opens straight to that day's quote.
Tapping the +
9:41
“The state does not see the land; it sees the map it made of the land.”
Seeing Like a State · James C. Scott
QuoteIt
A home screen with QuoteIt's widget.
Playing by itself Step 1 of 3
Tap + on the widget.
The + on the widget opens a blank quote, for the lines you would rather type than scan.

Back to the borrowed books

I finished both books, and they went back to my friend. The quotes stayed with me, and so did what I learnt from them.

QuoteIt isn’t finished in the same way. The text scanning still needs polishing, it isn’t 100% accurate yet, and right now everything lives on my phone. Next is iCloud sync, so the same Inbox and the same shelf can follow me onto an iPad and a Mac.