Read the web distraction-free in Raycast.
| Command | Description | Default |
|---|---|---|
| Open in Reader Mode | Main command - opens a URL in reader mode | Enabled |
| Open Clipboard in Reader Mode | Opens URL from clipboard directly | Disabled |
| Open Current Tab in Reader Mode | Opens the current browser tab in reader mode | Disabled |
The clipboard and current tab commands are disabled by default to reduce command clutter. Enable them in Raycast Settings → Extensions → Reader Mode if you prefer dedicated commands over the main command's auto-detection.
Reader Mode uses a multi-layered approach to extract clean article content:
src/extractors/) - Custom extraction logic for complex sitessrc/utils/site-config.ts) - Selector-based configuration for simpler sites| Approach | Use Case | Examples |
|---|---|---|
| Extractors | Sites needing custom DOM traversal and content transformation | Hacker News, GitHub, Reddit |
| Site Config | Sites needing only CSS selector adjustments | Medium, Substack, news sites |
| Readability | Standard article pages | Most blogs and news articles |
For simple sites (just need different selectors), add to src/utils/site-config.ts:
[
/^example\.com$/i,
{
name: "Example",
articleSelector: ".article-body",
removeSelectors: [".ads", ".sidebar"],
},
],
For complex sites (need custom extraction logic), create a new extractor:
src/extractors/mysite.ts extending BaseExtractorcanExtract(), extract(), and get siteName()src/extractors/index.tsexport class MySiteExtractor extends BaseExtractor {
get siteName(): string {
return "My Site";
}
canExtract(): boolean {
return !!this.querySelector(".my-content");
}
extract(): ExtractorResult {
// Custom extraction logic
return { content, textContent, metadata };
}
}
The extension uses a modular configuration system located in src/config/:
ai.ts)Controls which AI model and creativity level is used for each summary style. This allows fine-tuning performance per summary type.
export const AI_SUMMARY_CONFIG: Record<SummaryStyle, AIStyleConfig> = {
overview: { model: AI.Model["OpenAI_GPT-5_nano"], creativity: "low" },
"opposite-sides": { model: AI.Model["OpenAI_GPT-5_nano"], creativity: "low" },
// ...
};
prompts.ts)Contains all summary prompt templates in one place for easy comparison and editing.
export const SUMMARY_PROMPTS: Record<SummaryStyle, PromptConfig> = {
overview: {
label: "Overview",
buildPrompt: (context) => `${context}\n\nSummarize this article...`,
},
// ...
};
Each prompt config includes:
label - Human-readable name shown in the UIbuildPrompt - Function that generates the full prompt from article context| Style | Description |
|---|---|
| Overview | One-liner summary + 3 key bullet points |
| At a Glance | Summary + Key Takeaways in a concise format |
| Comprehensive | Fact-filled bullet points from the author's POV |
| Opposing Sides | Two contrasting viewpoints from the article |
| The 5 Ws | Who, What, Where, When, Why breakdown |
| Explain Like I'm 5 | Simplified explanation using simple language |
| People, Places & Things | Key entities extracted with context |
All summary styles can be generated in your preferred language. Set the Summary Output Language preference to choose from 21 supported languages including English (default), Spanish, French, German, Japanese, Chinese, and more. When a non-English language is selected, summaries will be generated in that language regardless of the article's original language.
Reader Mode integrates with the Raycast browser extension to handle blocked pages and access authenticated content.
Some websites (like Politico, Bloomberg, etc.) use bot detection that prevents direct content fetching. When this happens, Reader Mode automatically offers a browser extension fallback:
How It Works:
Usage:
For paywalled or member-only articles (like Medium member stories), you can re-import content from an authenticated browser session:
When to Use:
How It Works:
Requirements:
This extension's content extraction architecture was inspired by Defuddle, a content extraction library by @kepano. We initially attempted to use Defuddle directly, but found it wasn't well-suited for Raycast's environment:
linkedomInstead, we adopted Defuddle's excellent patterns:
This hybrid approach gives us the best of both worlds: Defuddle's battle-tested extraction patterns with tight Raycast integration.
Square brackets [text] that appear in article content (such as editorial insertions in quotes) are automatically converted to parentheses (text) to prevent Raycast's markdown renderer from interpreting them as LaTeX math notation. This is a workaround for a rendering limitation and means the displayed text may differ slightly from the original source material.
Image alt text and title attributes are automatically stripped to ensure proper rendering in Raycast. Images are displayed as  without descriptive text. This prevents rendering issues where long alt text or title attributes (especially those containing quotes) can break the markdown image syntax.
Additionally, relative image URLs (e.g., /image.jpg) are automatically converted to absolute URLs using the page's base URL to ensure images load properly.