I'm sending this quick product update before our team gathers tomorrow in Buenos Aires, Argentina for our third team offsite since Covid lifted.

We have a lot of updates in the final stage of testing that, candidly, I thought I'd be including in this newsletter such as the second half of Home Screen, reflowable PDFs, and a Feed UX overhaul. But unfortunately we'll need to wait until after Argentina to ship.

That said, this newsletter still contains many fun updates including a preview of GPT-3 copilot baked into the reading experience (codename: Ghostreader), a new RSS Discovery flow, the first implementation of document-level notes, the full-fledged Safari extension, and a new Reader 202 video on filtered views produced by our very own Erin.

Let's get into it!

Ghostreader: "Copilot of Reading" Preview 👻🤓

This is a gnarly feature so I wrote quite a bit, but the tl;dr is:

You can now preview using GPT-3 throughout the Reader web app to perform actions such as defining words in context, looking up encyclopedia entries, translating to other languages, explaining complex language in simpler terms, summarizing, tl;dring, generating flashcards, writing permanent notes, asking the document a question, and more. We've even provided a flexible templating language that enables you to construct document-level prompts simply not possible in vanilla GPT-3 Playground. The only limit is your imagination.

Background:

Unless you've been living under a rock the past six months, you've probably heard about this new generative AI revolution catalyzed by large language models (LLMs) such as OpenAI's GPT-3 and DALL·E 2.

I'll not digress into LLMs here except to say that the best real world product using this innovation (so far) is Github Copilot, which suggests code as you type inside your code editor. Most engineers report something like a 40% to 100% boost in coding productivity, which is unheard of for a first generation AI product leading to reactions like the co-founder of Instagram saying, "This is the single most mind-blowing application of machine learning I’ve ever seen."

The usefulness of Github Copilot has led to the (probably accurate) prediction that we'll soon see Copilots of everything including:

  • Copilot(s) of writing (there's actually like 50 of these already popping up around various writing verticals, but you might be most interested in learning about Lex made by our friends at Every)
  • Copilot of spreadsheets (epic proof of concept)
  • Copilot of design

And so on...

As purveyors of fine reading software, the moment we noticed this trend we thought to ourselves, "What about the Copilot of reading?"

Fortunately, we were in position to explore this question because we're lucky enough to be joined by an itinerant Simon Eskildsen this quarter. You might know Simon from some of his viral articles such as How to Make Yourself Into a Learning Machine or How I Read. He was a principal engineer at Shopify for ~8 years, but now he takes on random technical projects for companies where he has friends such as Readwise.

Simon is helping us scale our infrastructure so that our servers don't catch on fire when we launch, but he also wanted to hack on LLMs within the context of Reader for fun. We sure as heck weren't going to say no.

I won't bore you with the professional narcissism of all the twists & turns and failed experiments that led to this Ghostreader alpha, but let's just say I think we've finally found some use cases with promise. At least, I hope we have.

We're calling this release a preview because Ghostreader isn't fully built out with consumer-grade UX across all platforms, but it's advanced enough that we can put it in your hands to hopefully start the feedback loop. Using generative AI to write for you is obvious; using generative AI to enhance your reading experience is less so. We're hoping we can explore the latent space of possibilities here together.

Second, we're probably going to pull down Ghostreader when we get back from Buenos Aires to resume work on it.

For now, Ghostreader only works in the web app as opposed to the mobile app or browser extensions. Let me show you how to use it.

Dictionary Define

This is the dictionary use case. Select any word or phrase, open the context menu and select Invoke Ghostreader or use the keyboard shortcut G, and select Define from the Prompt Menu.

It may take longer for GPT to send a response. YMMV.

Life-changing? Not really. Lots of reading apps have dictionary lookups. iOS even has a version of this built-in. But it is cool to get the right definition for "cords" as in a "cord of firewood" off the bat. I also engineered this prompt to include some spicy emojis 🤓

You could maybe engineer this define prompt to return a flashcard for vocabulary learning and/or a text-to-image prompt for DALL·E 2 or Stable Diffusion to help you visualize the meaning.

Encyclopedia Lookup

This is the encyclopedia use case. Select any word or phrase, open the context menu and select Invoke Ghostreader or use the keyboard shortcut G, and select Encyclopedia Lookup from the Prompt Menu.

It may take longer for GPT to send a response. YMMV.

This prompt works best when dealing with the kind of person, place, or concept you'd be able to find in an external encyclopedia such as Wikipedia. For internally defined terms, see Term Lookup below.

Translate

This use case is self-explanatory. GPT-3 is pretty good at translating from one language to another, but your mileage will vary based on the particular language. GPT can even translate to dialects. For laughs, try translating a passage to Jar Jar Binks.

I could have used the hotkey G to launch the Prompt Menu on this paragraph.

Like dictionary and encyclopedia lookups, translation isn't that head exploding in the modern era, but now we're ready to go over some completely new use cases.

Term Lookup

Now we're getting into innovative territory. If you start studying the art and practice of reading, it won't be long before you come across the concept of coming to terms. What this means is that words can take on many meanings and it is your job as a reader to "come to terms" with the author's usage of language. Matter of fact, you and I just came to terms on the meaning of come to terms.

You will find that your comprehension of any book will be enormously increased if you only go to the trouble of finding its important words, identifying their shifting meanings, and coming to terms. Seldom does such a small change in a habit have such a large effect.
(How to Read a Book, Mortimer Adler)

Term Lookup will help you here!

We named this feature to Ghostreader while I was writing this newsletter which is why many of these GIFs say Prompt GPT.

If you've ever heard of the book Seeing Like a State, you'll instantly note that GPT nailed a simple explanation of its key term legibility. Venkatesh Rao (A Big Little Idea Called Legibility) and Scott Alexander (Book Review: Seeing Like A State) have written about its meaning.

Explain 👀

Personally, Explain is my favorite of our pre-engineered prompts. It will take a complicated piece of text and rewrite it in simpler terms.

Of course all this GPT stuff works on PDFs out of the box 🤓

Explain won't do much if you're reading low information density content such as news articles, blog posts, Twitter threads, etc, but if you're reading something dense such as a research paper, internal memo, or challenging nonfiction book, it's incredible.

Summarize

Anyone just entering the Copilot of Reading idea maze is going to be drawn to the use case of summarization. After all, if some creator is tapping +++ in his word processor to spew forth the next three paragraphs, shouldn't we readers be able to tap `---` to go in the opposite direction?

Might summarization be the solution to the problem of content overload which is now just going to get exponentially worse with all this AI-based writing?

For reasons I'm not going to get into here, summarization as a substitute for reading is (generally speaking) lame. That said, summarization as an aid to reading can be cool.

Our favorite use of summarization is on the section-level. We've built it so that when you invoke Ghostreader with a heading focused (or all text selected in the heading), the prompt will operate on all the text in that section. This leads to a particularly pleasant experience whenever you're reading a well-organized document with a logical hierarchy.

How annoying is it now when someone writes a long-form essay without proper headings?

If you insist, you can also summarize at the document-level too. Hit Shift + G to open the document-level prompt and change the prepopulated custom prompt to something along the lines of:

Summarize the document below entitled "{{ document.title }}": """ {% if (document.content | count_tokens) > 1000 %} {{ document.content | central_sentences | join('\n\n') }} {% else %} {{ document.content }} {% endif %} """
This shows invoking Ghostreader at the document-level.

We've built a whole templating system for ourselves and for power users wanting to experiment with engineering powerful prompts within Reader. I'll explain the variables below, but the takeaway here is to please feel free to play with these prompts to see if you can come up with something better.

Whimsical Prompts

In addition the specific use cases described above, we've baked in a handful of whimsical prompts to our Prompt Menu. Not so much because they're particularly useful, but because we want to help folks learn how to ride this bicycle for the mind. These include:

  • Haiku – Turn selected passage into a haiku poem. For some odd reason, this prompt often achieves levels of compression exceeding more explicit prompts such as "summarize" or "tl;dr". I suppose it has something to do with the strict constraints learned by GPT-3.
  • Emojify – Turn selected passage into a series of emojis. Adding emojis actually does have utility when sharing your annotated documents because prepending emojis to annotations can make them far more delightful for your friends, family, and colleagues to read. Emojis can even enhance your own notes for your future self 💪
  • TL;DR – Turn any selected passage into a very short string of words. GPT can be a little temperamental on this one. YMMV.

Flashcard

As another whimsical prompt meant to demonstrate the potential of Ghostreader, you can convert any arbitrary highlight into a question & answer pair while you read.

Long before citizen scientists were experimenting with spaced repetition inside textbooks, we were pioneering the practice of converting your nonfiction/self-help highlights to flashcards to facilitate personal betterment. At the time, we were questioned for the use of a simplistic application of active recall known as "cloze deletion" (in contrast to the gold standard question & answer pair). Ironically, I think cloze deletion will be vindicated by large language models, which are super advanced intelligences literally trained on fill in the blank exercises, but I digress.

Optional: Custom Prompts with Templating

All the examples were pre-engineered prompts built into a Prompt Menu. In addition to these, you can also use your own custom prompts with Ghostreader.

To flexibly incorporate document content into your prompts, we've embedded Jinja templating into the interface. Here are some of the primary variables:

  • {{ selection.raw }} – Whatever text was selected, focused, or highlighted when you invoked Ghostreader.
  • {{ selection.sentence }} – If you had less than a sentence selected (eg just a word), this will expand to the surrounding sentence.
  • {{ selection.paragraph }} – If you had less than a paragraph selected (eg just a sentence), this will expand to the surrounding paragraph.
  • {{ document.content }} – The full content of the document.
  • {{ document.title }} – The title of the document.

Examples:

  • What is the definition of {{ selection.raw }}?
  • What is the definition of "{{ selection.raw }}" as used in the sentence "{{ selection.sentence }}"?

If you've explored GPT-3 at all then you probably know that it has surprisingly restrictive text limitations. You can't just pass it 10 pages of text. Or even 5 pages. For this reason, we've added various truncating methods. The methods you'll most likely be interested in are central_sentences and most_similar filters which you can apply to any of the variables listed above.

You already saw this action when I showed a sample prompt summarizing an entire document above:

Summarize the document below entitled "{{ document.title }}": """ {% if (document.content | count_tokens) > 1000 %} {{ document.content | central_sentences | join('\n\n') }} {% else %} {{ document.content }} {% endif %} """

The first IF statement checks to see if the document is longer than 1,000 tokens (a token is a language model concept). If it is, then it reduces the document content to the max allowable tokens by extracting an array of key sentences (central_sentences, which uses more AI voodoo magic) from the text and then concatenating them into a single string (join('\n\n')). If it's not too long, then the whole document content is passed.

I'll demo most_similar in some of the next example ("Ask Document a Question") which reduces the content by searching the document itself for relevant sentences.

Now that you understand that you can use control structures with Jinja, another powerful variable you're only going to find in Reader is {{ highlights }}.

We haven't pre-engineered a prompt on highlights yet, but we can already imagine lots of use cases. For example, maybe you have a weekly newsletter where you share interesting articles you read over the past week. Maybe rather than summarizing the article as a substitute for actually reading it (first order), you can generate a summary based on your personal highlights after reading it (second order).

I just read an article entitled {{ document.title }} and made the following highlights: {% for highlight in highlights %} {{ highlight.content }} {% endfor %} Summarize the article based on my highlights above.

Maybe you want to not only summarize based on your highlights, but also weave in a "hot take" so that when you start composing your newsletter, you're already equipped with a pithy paragraph to populate your listicle.

{% set hot_take = "INSERT HOT TAKE HERE" %} I just read an article entitled {{ document.title }} and made the following highlights: {% for highlight in highlights %} {{ highlight.content }} {% endfor %} The main takeaway of the article in my opinion was {{ hot_take }}. Help me write a "hot take".

I don't know if the above will actually work to generate a hot take (maybe GPT doesn't even know what a "hot take" is), but maybe you'll find a prompt that works!

Prompting isn't for the faint of heart to begin with. We recognize that this templating language takes the complexity to a whole new level. But we know we have many power users in this private beta so we hope some of you can enjoy it. Speaking of which, if you craft a custom prompt that blows your mind, pleeeeease let us know. We'll gladly add it to our Prompt Menu for everyone else to enjoy and give you lots of credit 🤓

We're going to make a new channel in our Discord server for folks to discuss prompting techniques.

Ask Document a Question

The final use case of Ghostreader we're playing with is asking a document a question. When you invoke Ghostreader at the document-level, you'll even notice a prepopulated custom prompt to that effect.

{% set query = "INSERT A QUESTION HERE?" %} I examined the document for passages that might answer the question "{{ query }}" and gathered them below: """ {{ document.content | most_similar(query) | join("\n\n") }} """ Based on the sentences above, {{ query }}

Note that set is setting a variable named query to "INSERT A QUESTION HERE? by default. Once you set your own question, the variable query will be reused throughout the prompt to find relevant sentences and then prompt GPT to write an answer. Another cool use of Jinja!

The response here is going into the new document-level note (see below).

Note that this prompting technique will not work on general questions such as "What are the takeaways of this article?" or "What are the key terms mentioned by the author?" Instead, it will only yield useful answers when you use language and terminology specific to the document. But please feel free to experiment with your own prompts!

Serious serious props to Simon for building Ghostreader almost entirely by himself. Giga shape rotator energy. Depending on user feedback, our likely next steps here are to make an annotation that isn't attached to a highlight and to port to mobile and the browser extensions (among other things).

We welcome any and all feedback on this 🤗

(You might be wondering why Ghostreader? Jesse came up with the name and I instantly loved it because I grew up watching a pseudo-educational show on PBS called Ghostwriter in which a band of city kids solve crimes with the help of a mysterious intelligence locked away in a desktop computer.)

Obscure reference but it fits 👌

RSS Discovery 🕵️

Whenever you save a document, Reader scans its base domain for the presence of an RSS feed. If an RSS feed is detected, you'll see a Subscribe button in the right sidebar. We've now centralized all these RSS feeds into a single place enabling you to subscribe en masse.

You'll notice that we've bifurcated the feeds into high signal and low signal using some heuristics based on (1) how many documents you've saved from that source and (2) how frequently it posts. If you're not already an RSS power user, we generally recommend yoloing the high signal feeds and subscribing to all in one fell swoop. From there, you can progressively prune the annoying feeds (using the same subscribe/unsubscribe button in the right sidebar mentioned above) to dial in a delightful Feed experience. Trust me: it works.

Here's a Loom video I shared in the Discord explaining RSS Discovery in a little more depth.

Props to Tadek for leading this feature from backend to frontend. He is now officially full-stack.

Customizable Swipes 📱

Here's a fun feature that our engaged users are sure to love, but won't necessarily help us get to product-market fit: You can now customize the swipe actions in the mobile app.

Find the Customize swipes action on the Settings tab of the mobile app.

Two use cases are particularly popular: Deleting (in general) and Marking all above as seen (in Feed).

Props to Jesse for spearheading this potentially complex UX design.

Document Notes 📝

One of our most requested features has been the ability to add notes at the document rather than highlight level. We've begun implementing, and you can now take document notes in the web app.

Use Shift + N to enter the document note dialog on the web app.

For better or worse, Reader has massive surface area so it will take us a couple weeks to extend document notes to the browser extensions and mobile apps, but we're on it!

Props to Mati for leading this implementation.

Safari Extension 🍎

Last update, I lamented that an unnamed app store was putting roadblocks in the way of a new browser extension. The demands were so steep that we thought it might take us literal months to work through them all. Well, lo and behold, not two days after I hit Publish, our Safari extension got approved.

In case you missed it, update your Safari extension here.

Props to Adam for shouldering this burden like a champ.

Mobile Note Bug Squashed 🐛🔫

If you've been using Reader for a while, you may have noticed an intermittent bug where when typing a note on mobile, your typing would spontaneously delete. It was super annoying from both a user perspective and a developer perspective (because it was so hard to recreate). Finally, at last, Adam and Artem teamed up like Seal Team 6 to hunt down and squash this bug. Hallelujah!

I (read: Erin) will be muling a $400 bottle of single malt scotch to Argentina as a bug bounty.

Filtered Views Walkthrough Video 📼

As part of preparing for broader release, Erin has started producing amazing videos on how to get the most out of Reader.

Many of you probably onboarded to Reader with the help of her introductory video. Last update I shared a Reader 201 deep dive on how to setup and get the most out of your Feed section. This update I'm sharing her Reader 202 deep dive on how to organize and customize your Reader using filtered views.

Reader 202: Using Filtered Views

In case the animated gif doesn't hyperlink properly, here's the link to the Loom video.

If you're still new to Reader, our concept of "Filtered Views" are how you organize your Reader experience, from creating simple folders of documents to groups of RSS feeds and much, much more.

Creator Content 📼

In addition to Erin, lots of our private beta users have started producing amazing content to help folks get the most out of Reader. I'm going to mention new videos in these newsletters going forward, but because this is my first, I'm going backwards a bit.

Nicole van der Hoeven

Shoutout to Nicole van der Hoeven for making the first in-depth overview of Reader! Her comment section helped inspire our annotated documents feature.

Kara Monroe

If you’ve been recently onboarded to Reader and are still looking for workflow inspiration, checkout Kara Monroe’s video.

Dr. Yusef Smith

Yusef’s YouTube channel speaks for itself: he’s a prolific creator, business owner, and coach. In his latest video, he shares how Reader fits into his workflow.

Aidan Helfant

If you’re a college student looking to streamline your academic reading and maximize your time walking across campus, checkout Aidan Helfant’s latest video.

Minor Improvements 🦐

  • Added Find in PDFs (in-document search) on both mobile and web
  • Improved confirmation flow for Gmail auto-email forwarding
  • Added back bulk actions to filtered views on mobile
  • Improved performance of RSS fetching on backend
  • Added confirmation for bulk deletions on mobile
  • Added has:notes parameter for filtering documents with document notes
  • Heptabase added an export integration

Bug Fixes 🐛

  • Fixed bug on web where deleting a document would cause a blank screen
  • Reduced “jump” of mobile content when documents are opened on a slow internet connection
  • Fixed more parsing issues with Wikipedia
  • Fixed parsing issues on FT.com
  • Fixed parsing issue with some more Substack-hosted blogs
  • Fixed bug where swiping on the Seen section did the wrong thing
  • Fixed bug where some actions weren’t undoable in the mobile app

Coming Up 🔜

  • Home Screen
  • Reflowable PDFs
  • Feed UX
  • Document Notes everywhere
  • Daily habit feature
  • More robust parsing solution for your paywalled subscriptions
  • Onboarding, onboarding, onboarding

Farewell 🏔️

Yikes. This update got a little longer than I imagined when I sat down to write 🥵

As mentioned in the intro, the entire team is already in or headed to Argentina for the week where Romi and Mati will show us a good time so you should probably expect us to fall behind on email, Discord, and Twitter. But we'll do our best!

And as a final reminder, we're almost done with the private beta phase of Reader so feel free to refer your friends, family, or colleagues our way (Cmd + KRefer friend) or mention Reader wherever.

Thank you again for your continuing support and please reach out any time 🙏

– Dan, Tristan, & the Readwise team