Inspiration

We've all caught ourselves scrolling through an article, only to realize three paragraphs later that nothing actually sank in. Eyes moving, comprehension not following. Skimming isn't really laziness. It's a byproduct of how we're trained to consume information online: fast, low-friction, and rarely checked.

We wanted something that catches that moment honestly, in real time, on content you're already reading, without having to open another app. Something that just lives right in the browser tab.

What it does

Read Actually is a Chrome extension that:

  • Watches how you actually read a page (dwell time, scroll speed, visibility) using an IntersectionObserver-based tracker
  • Flags skimmed paragraphs with an in-page "sticker," and once enough pile up, surfaces an alert offering to quiz you on everything you glossed over.
  • Sends the skimmed text to a backend that calls Gemini to generate real comprehension questions grounded in what you actually skimmed
  • On a wrong answer, scrolls you back to the exact sentence you missed and highlights it, closing the loop instead of just scoring you.
  • Also works on demand: highlight any passage and hit "Quiz me on this" to test yourself, no skimming required.
  • Ships with a full theming system: three palettes × light/dark and synced live across the popup and the page itself.

How we built it

  • Extension: Manifest V3: a background service worker, injected content scripts, and a popup UI, all vanilla JS to keep it light and fast to iterate on.
  • Text extraction: Readability.js, run against a cloned DOM so the live page is never mutated. Backend: FastAPI + Google's Gemini API, with a verification pass that anchors every AI-generated "source excerpt" back to an exact substring of the original text, with a whitespace-tolerant fallback, and a second LLM repair call if the first anchor attempt fails.
  • Workflow: split the surface area across parallel git branches (skim detection, popup UI, content-script UI, backend, theming) and merged them into one working extension, fixing the interface mismatches that only showed up once independently-built halves actually had to talk to each other.

Challenges we ran into

  • Telling "skimmed" from "idle." Our first dwell-time tracker counted time spent alt-tabbed away as reading time. Fixed by capping the credited interval between observer events.
  • Highlighting real text is harder than it looks. DOM ranges that cross multiple sibling elements broke naive range-wrapping and separately, the LLM's "verbatim" excerpt couldn't always be trusted to actually be verbatim, so the backend anchors and repairs it before ever returning it.

Accomplishments that we're proud of

  • A skim detector that's actually reliable, verified end-to-end against real fast-scroll vs. slow-read behavior on a live article, not just unit-tested in isolation.
  • A genuinely working AI loop: real skimmed text in, a real Gemini-generated quiz out, with source excerpts verifiably grounded in what you skimmed.
  • A full six-way theme system that live-syncs across the whole extension with no reload. Independently-built pieces coming together into one coherent product under real time pressure.

What we learned

  • Behavioral signals (scroll speed, dwell time, visibility ratio) are a surprisingly effective, low-friction proxy for engagement, no special hardware needed.

What's next for Read Actually

  • Webcam-based gaze tracking as an optional, opt-in upgrade to our current scroll/dwell-time proxy and actual eye movement would catch skimming our current heuristic can miss (e.g., eyes darting without scrolling) and could measure re-reading/regression patterns directly.
  • Adaptive quiz difficulty and questions that get harder or easier based on how you've been scoring, instead of a flat difficulty every time.
  • Reading analytics over time, a dashboard tracking focus/skim rate across sessions and sites, so you can actually see whether your reading habits are improving.

Built With

Share this project:

Updates

Submission history