Is Voice In - Voice Typing & Speech-to-Text Dictation safe?
We analyzed Voice In - Voice Typing & Speech-to-Text Dictation version 4.53's actual code and gave it a 57/100 trust score. This is a useful voice-typing…
Bottom line
This is a useful voice-typing extension, but its broad website access and collection of page details, selected text, audio, and tracking identifiers create meaningful privacy and security risk.
What it can access
It can read or change focused fields across every website and use microphone and clipboard access, which is powerful but relevant to voice typing.[Q1][Q2][Q5]
Security weaknesses
Universal page access plus debugger and clipboard powers could expose sensitive text or enable unwanted edits if the extension or its service is compromised.[Q1][Q2][Q16]
Signs of misuse
The extension sends dictated-page URLs, selected text, recordings, and persistent analytics identifiers to publisher services, beyond what many users expect from typing.[Q6][Q12][Q13][Q14]
Code findings
What access does this extension ask for, and does that access make sense for what it claims to do?
It requests all-sites access, tabs, clipboard read/write, debugger, scripting, storage, context menus, and offscreen execution; much of this supports universal voice typing, but the grant is exceptionally powerful.
Declares tabs, contextMenus, storage, clipboardRead, clipboardWrite, debugger, scripting, offscreen, and <all_urls>. — manifest.json:1-56
Uses tabs and scripting for active-tab coordination and Chrome debugger commands for key dispatch and text insertion. — background.js:8
Which websites can it run on, and can it read or change what appears on those pages?
It runs in top-level pages and every frame on all websites and can add its UI, read focused editable content, and change inputs and rich-text editors.
Loads cs_top.js on <all_urls> and cs_all.js in all frames on <all_urls>, including matching about:blank and fallback origins. — manifest.json:27-46
Locates the focused input, textarea, contenteditable, EditContext, iframe, or shadow-root editor and applies multiple insertion strategies. — js/cs/cs_all.js:31-53
Can it see sensitive information you type, such as passwords, payment details, messages, or form entries?
It can access text in the focused field around the cursor and explicitly selected text on any site; AI Transform sends a selected passage to the publisher when invoked.
Reads input values and selections for look-behind formatting, remembers recent trusted keydown characters locally, and reads selected text for AI Transform. — js/cs/cs_all.js:31-53
AI Transform POSTs the selected text and prompt to /voicein/api/transform/. — background.js:8
Can it access private browser data such as cookies, signed-in sessions, browsing history, bookmarks, or downloads?
No evidence of this behavior was found in the reviewed package.
Requests none of cookies, history, bookmarks, or downloads. — manifest.json:8-26
Dictanote account requests may include Dictanote credentials but do not call chrome.cookies or expose cookie values to extension code. — background.js:8
Can it access anything else on your device, such as files, location, camera, microphone, clipboard, or installed applications?
It uses the microphone and can read and replace clipboard contents; it does not access files, location, camera, or installed native applications.
Opens getUserMedia({audio:true}) and starts webkitSpeechRecognition when dictation begins. — player.js:5
Reads existing clipboard items, writes recognized text for a paste operation, and then restores the saved clipboard. — js/cs/cs_all.js:31
AudioScribe opens the microphone and records audio with MediaRecorder. — audioscribe.js:72
Does it send information outside your browser? If so, what information is sent, where does it go, and why?
It sends full dictation-page URLs and analytics identity to hog.dictanote.co, selected AI Transform text and AudioScribe recordings to dictanote.co, and microphone audio through Chrome speech recognition.
The first interim dictation result records V Page View with window.location.hostname, full window.location.href, and focus status. — js/cs/cs_top.js:1-226
Adds account ID, clientID, extension/browser/OS details and POSTs analytics events to https://hog.dictanote.co/capture/. — background.js:8
Uploads a recorded audio file and transcription settings to https://dictanote.co/api/v1/audio-notes/. — audioscribe.js:72
POSTs selected text, prompt, transform name, account code, and version to /voicein/api/transform/. — background.js:8
Does it download or run code, settings, or instructions supplied by a remote server?
The server supplies account state, subscription limits, saved voice commands, transformed text, transcripts, and note content, but no remote response is executed as JavaScript.
Fetches user info and /voicein/vc/get/, merges returned custom voice commands into local storage, and uses transform responses as replacement text. — background.js:8
Loads server-side audio-note lists, titles, summaries, transcripts, tags, and settings as application data. — audioscribe.js:72
Can it take actions without a clear user request, such as opening pages, redirecting searches, downloading files, or sending requests?
After installation and during use it injects content code into open pages, records analytics and license checks, and can continue dictation across tabs for paid users; microphone capture still requires a user start.
On install or update, injects packaged content scripts into eligible existing tabs and periodically validates paid status. — background.js:8
Once started, continuous recognition can restart after normal speech-service endings and routes results to the active or cursor-locked tab. — player.js:5-127
Can it change important browser settings, including your proxy, search engine, homepage, privacy settings, or other extensions?
No evidence of this behavior was found in the reviewed package.
Declares no settings overrides, chrome_url_overrides, proxy, privacy, management, or search-provider capability. — manifest.json:1-91
Is any important behavior difficult to inspect because the code is hidden, heavily obfuscated, dynamically generated, or supplied by third parties?
Most important first-party behavior is compressed into large minified bundles, making manual inspection substantially harder, though names and data flows remain recoverable.
Records 3,393,641 unpacked bytes, including large generated background, content, player, settings, and AudioScribe bundles. — inventory.json:1
The core worker, analytics, debugger, account, transform, and external-message logic is bundled into very long minified lines. — background.js:1-8
Does it use eval(), new Function(), or string-based timers to turn text into executable code?
No evidence of this behavior was found in the reviewed package.
Package-wide sink search found no eval, Function constructor, string timer, or imported remote script. — background.js:1-8
Remote or recognized text is inserted into editors as content rather than evaluated as code. — js/cs/cs_all.js:31-53
Does it track the websites, pages, searches, or links you visit?
It reports the full URL and hostname of pages where a signed-in user begins dictating; it does not report every page merely visited.
Ee sends V Page View with hostname and full href, and So calls it on the first interim result per page. — js/cs/cs_top.js:1-226
Analytics events are sent only when a valid Dictanote uid is loaded, using that uid as distinct_id and adding persistent clientID. — background.js:8
Does it create a persistent ID or browser fingerprint to recognize you?
It creates a persistent random client ID and combines it with the Dictanote account user ID for analytics and license activity.
Generates an eight-character clientID, saves it in chrome.storage.local, adds it to analytics properties, and sends it during license activation. — background.js:8
Uses the stored Dictanote uid as the PostHog distinct_id and includes browser, browser version, OS, and extension version. — background.js:8
Does it send cookies, session details, authentication data, or page contents elsewhere?
Full page URLs, selected field text, recorded audio, account data, and license identifiers can leave the browser through advertised features and analytics; clipboard snapshots are not uploaded in the reviewed code.
Sends analytics, account, license, custom-command, and AI Transform requests to Dictanote services. — background.js:8
Uploads recordings with language, style, word and output-size options under an authenticated audio-note API. — audioscribe.js:72
Clipboard data is held in a local variable only long enough to restore it after insertion; no network call receives those items. — js/cs/cs_all.js:31
Does it record typing, form entries, clipboard contents, or screenshots?
It records microphone audio, temporarily reads clipboard contents, and locally remembers up to 24 recently typed characters for insertion context; it does not capture screenshots.
Uses getUserMedia and continuous webkitSpeechRecognition for dictation. — player.js:5-127
Uses MediaRecorder to collect audio chunks and upload a recording after the user stops. — audioscribe.js:72-73
Snapshots clipboard items during paste insertion and maintains a 24-character rolling keydown context on editor types where direct look-behind is unavailable. — js/cs/cs_all.js:31-50
Can a website or remote server send commands that make the extension take actions?
Approved Dictanote pages and localhost:8000 can externally request the extension version or trigger an account refresh, but cannot invoke its arbitrary internal commands.
externally_connectable allows dictanote.co subdomains and http://localhost:8000. — manifest.json:57-64
onMessageExternal accepts only version, signupSuccess, and upgradePlus; the latter two refresh user state from Dictanote. — background.js:8
Does it alter links, referral codes, advertisements, shopping carts, or search results?
No evidence of this behavior was found in the reviewed package.
Injected UI consists of dictation controls, usage notices, help, and publisher upgrade links. — js/cs/cs_top.js:1-226
Page modifications target the focused editor and extension notifications rather than links or commerce content. — js/cs/cs_all.js:31-53
Does it redirect or modify web traffic, request headers, downloads, or proxy settings?
No evidence of this behavior was found in the reviewed package.
Requests no webRequest, declarativeNetRequest, downloads, or proxy permission. — manifest.json:8-26
The only debugger commands are Input.dispatchKeyEvent and Input.insertText, followed by detach. — background.js:8
Can it communicate with software on the computer or services running on localhost?
A page served from localhost:8000 is allowed to exchange a narrow external message with the extension, but there is no native application bridge or general localhost fetch path exposed to websites.
Lists http://localhost:8000 under externally_connectable. — manifest.json:57-64
The external handler is limited to a version reply or Dictanote account refresh and the manifest has no nativeMessaging permission. — background.js:8
Does it decode, decrypt, or unpack hidden data and then execute or inject it?
No evidence of this behavior was found in the reviewed package.
Custom voice commands and transformation responses are parsed and used as data without a code-execution sink. — background.js:1-8
Audio and note responses are displayed, copied, or saved as user content, not executed. — audioscribe.js:72
Can ordinary websites access privileged extension features through messaging or exposed files?
Dictanote websites and localhost:8000 can access a small external messaging services, while all other ordinary sites cannot call privileged extension features directly.
External messaging is host-restricted; several extension pages and media are web accessible to all sites but are not themselves privileged message bridges. — manifest.json:57-75
The external API only returns version information or refreshes account state from the publisher. — background.js:8
Does suspicious behavior activate only for certain users, websites, dates, or remote settings?
No evidence of this behavior was found in the reviewed package.
Contains explicit domain lists selecting paste, direct-fill, EditContext, preview, and advanced-mode behavior for different web apps. — js/cs/cs_all.js:1-53
Paid status enables cross-tab and AI features, while server-downloaded account voice commands extend the local command map. — background.js:8
Does it perform hidden resource-intensive work, such as cryptocurrency mining?
No evidence of this behavior was found in the reviewed package.
Long-running work is speech recognition, usage accounting, audio cues, and active-tab result delivery. — player.js:1-127
No mining, socket relay, peer-to-peer, or proxy implementation was found. — background.js:1-8
Does it change form fields or where a form sends its information?
Its central purpose is changing the focused form or rich-text field with dictated or transformed text, but it does not submit forms or rewrite their destination.
Uses value changes, selection replacement, beforeinput/input events, execCommand, EditContext, clipboard paste, and debugger insertion to edit the focused field. — js/cs/cs_all.js:31-53
Debugger fallback dispatches requested key events or Input.insertText only; no form submit or action mutation was found. — background.js:8