Back to work
2026

DeeplyReader

Read anything aloud, on the web or off it

  • Chrome extension
  • Web reader
  • On-device

Skills

  • Chrome Extensions
  • Supabase Edge Functions
  • IndexedDB
  • Text to Speech

A text-to-speech reader in two halves: a browser extension for whatever is on screen, and a longform reader for the books you already own.


Challenge

Listening to what you read is solved in two places and neither of them talks to the other. Browser readers handle an article and stop at a PDF; book apps handle a library and cannot touch the page you are on. So anyone who wants their reading read aloud ends up running two tools with two voices, two sets of settings and two accounts, and the books they already own are usually the half that gets left out.

Action

I built it as two front ends over one backend. A Chrome MV3 extension (WXT) reads web pages, selected text, images, and screenshots, including Kindle in the browser. A separate Vite and React reader handles longform PDF and EPUB, keeping books on-device in IndexedDB so a personal library never leaves the machine. Both call the same Supabase Edge Functions for OpenAI text-to-speech, which keeps the API key server-side and means one voice pipeline serves both surfaces instead of two implementations drifting apart.

Result

One voice pipeline serves both halves, so the extension and the reader cannot drift apart in the way two separate implementations would. Keeping books in IndexedDB means a personal library stays on the machine it belongs to rather than being uploaded to be read, and holding the API key in an Edge Function rather than the extension bundle is what makes that safe to ship at all.