<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: wiscer</title>
    <description>The latest articles on DEV Community by wiscer (@wiscer).</description>
    <link>https://dev.to/wiscer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F920132%2F947a98f7-175d-43dd-9def-ced068926b51.png</url>
      <title>DEV Community: wiscer</title>
      <link>https://dev.to/wiscer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wiscer"/>
    <language>en</language>
    <item>
      <title>Screen Reader Experience Mitigation on Gemini</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Sat, 07 Mar 2026 13:35:14 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-mitigation-on-gemini-2all</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-mitigation-on-gemini-2all</guid>
      <description>&lt;p&gt;&lt;em&gt;7 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This article describes how PageLive addresses the barriers identified in the companion &lt;a href="https://dev.to/wiscer/screen-reader-experience-analysis-on-gemini-ac9"&gt;Screen Reader Experience Analysis on Gemini&lt;/a&gt;. PageLive is a Chrome extension that operates at the browser layer, compensating for accessibility gaps without modifying the Gemini application itself. Not all barriers are fully resolved; where PageLive provides only partial mitigation, this is noted explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope
&lt;/h2&gt;

&lt;p&gt;This article corresponds directly to the findings in the Screen Reader Experience Analysis on Gemini. Findings are referenced by their original numbering. Mitigations were tested using NVDA on Chrome on a Windows desktop.&lt;/p&gt;

&lt;p&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Mitigations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive monitors the page for new assistant responses and announces their availability to the screen reader. The user is notified when generation has completed and new content is ready to read, without needing to navigate to the chat area or guess whether output is still in progress.&lt;/p&gt;

&lt;p&gt;For cases where the user wishes to retrieve a response on demand, pressing &lt;code&gt;Ctrl + Shift + Enter&lt;/code&gt; reads the most recent Gemini response without changing navigation context. This is useful when the user has moved focus elsewhere and does not wish to traverse back to the chat area manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Formulas and Symbols Are Not Read by the Screen Reader
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Blocker&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive processes formula and symbol content within Gemini responses and exposes it in a form that the screen reader can read. Without PageLive, these elements are absent from the accessibility tree and produce no output. With PageLive, the user receives the content of formulas and symbols as part of normal response reading.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Dialog Appearance Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive announces when dialogs open or close within Gemini, providing event-driven status feedback. The user is informed that a dialog has appeared without needing to navigate to discover it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 No Means of Reviewing Chat Flow in Long Conversations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive introduces ContentMap, opened with &lt;code&gt;Ctrl + M&lt;/code&gt;, which presents a structured summary of the prompts and responses in the current conversation. The user can navigate the list of items and press &lt;code&gt;Enter&lt;/code&gt; on any entry to jump directly to that position in the chat history.&lt;/p&gt;

&lt;p&gt;This provides an orientation mechanism equivalent in function to what sighted users derive from scanning the visual layout of the conversation, without requiring sequential traversal of the entire chat.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Friction&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive introduces keyboard shortcuts for the actions identified as missing in the analysis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jump to chat input&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Shift + Esc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start a new chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Alt + O&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete the current chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Backspace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announce the last response&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Enter&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Page Info for chat navigation context&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alt + /&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The delete shortcut opens a confirmation dialog, allowing the user to confirm or cancel before the action is completed. The Page Info dialog, opened with &lt;code&gt;Alt + /&lt;/code&gt;, provides active chat metadata and a means of moving focus directly to the current chat in the sidebar list by pressing &lt;code&gt;Enter&lt;/code&gt; on the chat title control.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Mitigations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Analysis Severity&lt;/th&gt;
&lt;th&gt;Mitigation Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;Formulas and symbols not read by screen reader&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;Dialog appearance not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;No means of reviewing chat flow in long conversations&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for Gemini. The findings referenced throughout this article are documented in full in the companion &lt;a href="https://dev.to/wiscer/screen-reader-experience-analysis-on-gemini-ac9"&gt;Screen Reader Experience Analysis on Gemini&lt;/a&gt;. For a full list of keyboard shortcuts and features PageLive provides for Gemini, see the &lt;a href="https://wiscer.org/pagelive/gemini" rel="noopener noreferrer"&gt;PageLive for Gemini documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This article was produced as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, the extension described in this document.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations referenced in this article are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>gemini</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Screen Reader Experience Analysis on Gemini</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Sat, 07 Mar 2026 13:29:21 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-analysis-on-gemini-ac9</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-analysis-on-gemini-ac9</guid>
      <description>&lt;p&gt;&lt;em&gt;7 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This report documents the difficulties a screen reader user encounters when using Gemini. Testing was conducted using NVDA on Chrome on a Windows desktop. While the findings are based on NVDA, the barriers described are expected to affect users of other screen readers, including JAWS, in similar ways. While Gemini is usable with a screen reader, several interactions require significant extra effort or guesswork that sighted users do not face.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope and Testing Environment
&lt;/h2&gt;

&lt;p&gt;This analysis evaluates the screen reader experience on Gemini as encountered during manual testing. The scope is limited to interactions that are part of routine use: composing and reading conversations, navigating between chats, and accessing application controls.&lt;/p&gt;

&lt;p&gt;Findings are not evaluated against WCAG criteria. The focus is on the practical experience of a screen reader user during everyday tasks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Screen Reader&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NVDA 2025.3.3.54605&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chrome 145.0.7632.117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface Tested&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;gemini.google.com web application&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Findings are classified by their impact on task completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blocker&lt;/strong&gt; — The task cannot be completed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Barrier&lt;/strong&gt; — The task can be completed, but requires significant additional effort, guesswork, or repeated keystrokes that are not required of sighted users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friction&lt;/strong&gt; — The task works as expected, but the experience is degraded in a way that compounds over extended use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Gemini finishes generating a response, no announcement is made to the screen reader. The response content is not placed in a live region, so the screen reader does not notify the user that new content is available or that generation has completed.&lt;/p&gt;

&lt;p&gt;As a result, the user has no reliable way to know when it is appropriate to begin reading. The user must manually navigate to the chat area, attempt to locate the new response, and determine through repeated keystrokes whether generation has finished or is still in progress. This interaction occurs on every single exchange, making it the most consequential barrier in routine use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 Formulas and Symbols Are Not Read by the Screen Reader
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Blocker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a Gemini response contains mathematical formulas or symbolic notation, the screen reader does not read these elements. They are invisible in the accessibility tree, meaning the user receives no indication that content is present at those positions in the response.&lt;/p&gt;

&lt;p&gt;A user relying on a screen reader cannot access any part of a response that contains formulas or symbols. For conversations involving mathematics, science, or other notation-heavy topics, this renders significant portions of Gemini's output completely inaccessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Dialog Appearance Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When dialogs open within Gemini, the screen reader does not announce their appearance and focus is not moved into them. The user receives no indication that anything has changed on screen and must discover through navigation that a dialog has appeared.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 No Means of Reviewing Chat Flow and Navigation Within Long Conversations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemini does not provide a structured means for a screen reader user to review the flow of a conversation or navigate directly to a specific prompt or response within a long chat. The user must traverse the entire chat history sequentially to locate a previous exchange, with no mechanism to jump to a known position.&lt;/p&gt;

&lt;p&gt;For sighted users, the visual layout of the conversation provides immediate orientation. For screen reader users, long conversations require a proportionally greater traversal effort with no compensating navigational aid.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Friction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following actions do not have keyboard shortcuts in Gemini:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jump to the chat input field&lt;/li&gt;
&lt;li&gt;Start a new chat&lt;/li&gt;
&lt;li&gt;Delete the current chat&lt;/li&gt;
&lt;li&gt;Announce the last response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these actions is available through the interface but requires the user to locate the relevant control through navigation. For a sighted user, these controls are immediately visible. For a screen reader user, the location of a button is not always remembered between sessions, and finding it requires traversal through surrounding content.&lt;/p&gt;

&lt;p&gt;The absence of shortcuts does not prevent these actions. However, the cumulative effect of repeated traversal meaningfully degrades the experience of extended use.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Findings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;Formulas and symbols not read by screen reader&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;Dialog appearance not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;No means of reviewing chat flow in long conversations&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for Gemini. A companion article, &lt;a href="https://dev.to/wiscer/screen-reader-experience-mitigation-on-gemini-2all"&gt;Screen Reader Experience Mitigation on Gemini&lt;/a&gt;, describes how PageLive addresses the barriers identified above. For a full list of keyboard shortcuts and features PageLive provides for Gemini, see the &lt;a href="https://wiscer.org/pagelive/gemini" rel="noopener noreferrer"&gt;PageLive for Gemini documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This analysis was conducted as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, a Chrome extension that addresses several of the barriers described in this report. A companion Screen Reader Experience Mitigation documents the approaches PageLive applies to each finding.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations in this report are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>gemini</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Screen Reader Experience Mitigation on Grok</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Sat, 07 Mar 2026 12:52:38 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-mitigation-on-grok-35j4</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-mitigation-on-grok-35j4</guid>
      <description>&lt;p&gt;&lt;em&gt;7 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This article describes how PageLive addresses the barriers identified in the companion &lt;a href="https://dev.to/wiscer/screen-reader-experience-analysis-on-grok-3iag"&gt;Screen Reader Experience Analysis on Grok&lt;/a&gt;. PageLive is a Chrome extension that operates at the browser layer, compensating for accessibility gaps without modifying the Grok application itself. Not all barriers are fully resolved; where PageLive provides only partial mitigation, this is noted explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope
&lt;/h2&gt;

&lt;p&gt;This article corresponds directly to the findings in the Screen Reader Experience Analysis on Grok. Findings are referenced by their original numbering. Mitigations were tested using NVDA on Chrome on a Windows desktop.&lt;/p&gt;

&lt;p&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Mitigations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive monitors the page for new assistant responses and announces their availability to the screen reader. The user is notified when generation has completed and new content is ready to read, without needing to navigate to the chat area or guess whether output is still in progress.&lt;/p&gt;

&lt;p&gt;For cases where the user wishes to retrieve a response on demand, pressing &lt;code&gt;Ctrl + Shift + Enter&lt;/code&gt; reads the most recent Grok response without changing navigation context. This is useful when the user has moved focus elsewhere and does not wish to traverse back to the chat area manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The "Show All" Button in the All Chats Dialog Is Not Accessible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Blocker&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Not Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The inaccessibility of the "Show All" button is a limitation of the Grok application itself. PageLive operates at the browser layer and does not reconstruct or replace the All Chats dialog. The actions revealed by this button — including Switch Theme and Change Language — remain inaccessible to screen reader users.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Friction&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive introduces keyboard shortcuts for the actions identified as missing in the analysis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jump to chat input&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Shift + Esc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start a new chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Alt + O&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete the current chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Backspace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Announce the last response&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Enter&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open Page Info for chat navigation context&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Alt + /&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The delete shortcut opens a confirmation dialog, allowing the user to confirm or cancel before the action is completed. The Page Info dialog, opened with &lt;code&gt;Alt + /&lt;/code&gt;, provides active chat metadata and a means of moving focus directly to the current chat in the sidebar list by pressing &lt;code&gt;Enter&lt;/code&gt; on the chat title control.&lt;/p&gt;

&lt;p&gt;Toggle sidebar and open chat list shortcuts are not currently provided by PageLive. Navigation to other chats still requires traversal from the point where focus lands in the sidebar.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Mitigations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Analysis Severity&lt;/th&gt;
&lt;th&gt;Mitigation Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;"Show All" button in All Chats dialog not accessible&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;td&gt;Not Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;td&gt;Partially Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for Grok. The findings referenced throughout this article are documented in full in the companion &lt;a href="https://dev.to/wiscer/screen-reader-experience-analysis-on-grok-3iag"&gt;Screen Reader Experience Analysis on Grok&lt;/a&gt;. For a full list of keyboard shortcuts and features PageLive provides for Grok, see the &lt;a href="https://wiscer.org/pagelive/grok" rel="noopener noreferrer"&gt;PageLive for Grok documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This article was produced as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, the extension described in this document.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations referenced in this article are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>grok</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Screen Reader Experience Analysis on Grok</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Sat, 07 Mar 2026 12:36:49 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-analysis-on-grok-3iag</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-analysis-on-grok-3iag</guid>
      <description>&lt;p&gt;&lt;em&gt;7 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This report documents the difficulties a screen reader user encounters when using Grok. Testing was conducted using NVDA on Chrome on a Windows desktop. While the findings are based on NVDA, the barriers described are expected to affect users of other screen readers, including JAWS, in similar ways. While Grok is usable with a screen reader, several interactions require significant extra effort or guesswork that sighted users do not face.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope and Testing Environment
&lt;/h2&gt;

&lt;p&gt;This analysis evaluates the screen reader experience on Grok as encountered during manual testing. The scope is limited to interactions that are part of routine use: composing and reading conversations, navigating between chats, and accessing application controls.&lt;/p&gt;

&lt;p&gt;Findings are not evaluated against WCAG criteria. The focus is on the practical experience of a screen reader user during everyday tasks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Screen Reader&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NVDA 2025.3.3.54605&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chrome 145.0.7632.117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface Tested&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;grok.com web application&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Findings are classified by their impact on task completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blocker&lt;/strong&gt; — The task cannot be completed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Barrier&lt;/strong&gt; — The task can be completed, but requires significant additional effort, guesswork, or repeated keystrokes that are not required of sighted users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friction&lt;/strong&gt; — The task works as expected, but the experience is degraded in a way that compounds over extended use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When Grok finishes generating a response, no announcement is made to the screen reader. The response content is not placed in a live region, so the screen reader does not notify the user that new content is available or that generation has completed.&lt;/p&gt;

&lt;p&gt;As a result, the user has no reliable way to know when it is appropriate to begin reading. The user must manually navigate to the chat area, attempt to locate the new response, and determine through repeated keystrokes whether generation has finished or is still in progress. This interaction occurs on every single exchange, making it the most consequential barrier in routine use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The "Show All" Button in the All Chats Dialog Is Not Accessible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Blocker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The All Chats dialog in Grok contains a "Show All" button that reveals additional application actions beyond the default view. By default, only the "Create New Chat" action is visible. Activating "Show All" exposes further actions including Switch Theme, Change Language, and others.&lt;/p&gt;

&lt;p&gt;The "Show All" button is neither perceivable nor operable by a screen reader. The button is not exposed in the accessibility tree, meaning the screen reader does not announce its presence and the user has no means of activating it through keyboard navigation.&lt;/p&gt;

&lt;p&gt;As a result, the actions revealed by this button — Switch Theme, Change Language, and any others — are permanently inaccessible to screen reader users. The task of discovering and using these actions cannot be completed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Friction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following actions do not have keyboard shortcuts in Grok:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delete the current chat&lt;/li&gt;
&lt;li&gt;Toggle the sidebar&lt;/li&gt;
&lt;li&gt;Open the chat list to allow chat switching&lt;/li&gt;
&lt;li&gt;Start a new chat&lt;/li&gt;
&lt;li&gt;Announce the last response&lt;/li&gt;
&lt;li&gt;Jump to the chat input field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these actions is available through the interface but requires the user to locate the relevant control through navigation. For a sighted user, these controls are immediately visible. For a screen reader user, the location of a button is not always remembered between sessions, and finding it requires traversal through surrounding content.&lt;/p&gt;

&lt;p&gt;The absence of shortcuts does not prevent these actions. However, the cumulative effect of repeated traversal meaningfully degrades the experience of extended use, particularly given the number of actions affected.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Findings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;"Show All" button in All Chats dialog not accessible&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for Grok. A companion article, &lt;a href="https://dev.to/wiscer/screen-reader-experience-mitigation-on-grok-35j4"&gt;Screen Reader Experience Mitigation on Grok&lt;/a&gt;, describes how PageLive addresses the barriers identified above. For a full list of keyboard shortcuts and features PageLive provides for Grok, see the &lt;a href="https://wiscer.org/pagelive/grok" rel="noopener noreferrer"&gt;PageLive for Grok documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This analysis was conducted as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, a Chrome extension that addresses several of the barriers described in this report. A companion Screen Reader Experience Mitigation documents the approaches PageLive applies to each finding.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations in this report are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>grok</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Screen Reader Experience Mitigation on claude.ai</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Thu, 05 Mar 2026 13:03:30 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-mitigation-on-claudeai-4khl</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-mitigation-on-claudeai-4khl</guid>
      <description>&lt;p&gt;&lt;em&gt;3 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This article describes how PageLive addresses the barriers identified in the companion Screen Reader Experience Analysis on claude.ai. PageLive is a Chrome extension that operates at the browser layer, compensating for accessibility gaps without modifying the claude.ai application itself. Not all barriers are fully resolved; where PageLive provides only partial mitigation, this is noted explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope
&lt;/h2&gt;

&lt;p&gt;This article corresponds directly to the findings in the Screen Reader Experience Analysis on claude.ai. Findings are referenced by their original numbering. Mitigations were tested using NVDA on Chrome on a Windows desktop.&lt;/p&gt;

&lt;p&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Mitigations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive monitors the page for new assistant responses and announces their availability to the screen reader. The user is notified when generation has completed and new content is ready to read, without needing to navigate to the chat area or guess whether output is still in progress.&lt;/p&gt;

&lt;p&gt;For cases where the user wishes to retrieve a response on demand, pressing &lt;code&gt;Ctrl + Shift + Enter&lt;/code&gt; reads the most recent response without changing navigation context. This is useful when the user has moved focus elsewhere and does not wish to traverse back to the chat area manually.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The "Keyboard Shortcuts" Dialog Is Not Accessible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Blocker&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Partially Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2.1 Dialog appearance not announced — Addressed.&lt;/strong&gt; PageLive announces when the Keyboard Shortcuts dialog opens and closes, providing event-driven status feedback. The user is informed that the dialog has appeared without needing to navigate to discover it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2.2 Dialog content not reachable — Not Addressed.&lt;/strong&gt; The underlying inaccessibility of the dialog's content is a limitation of the claude.ai application itself. PageLive operates at the browser layer and does not reconstruct or replace the dialog. The list of keyboard shortcuts within the dialog remains unreachable through the virtual cursor.&lt;/p&gt;

&lt;p&gt;Users who require this information are directed to the &lt;a href="https://wiscer.org/pagelive/claude/" rel="noopener noreferrer"&gt;PageLive for Claude documentation page&lt;/a&gt;, which lists all available shortcuts in an accessible format.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The "More Options" Menu Does Not Announce Its Appearance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Not Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive does not currently intercept the "More Options" popup menu in the chat list sidebar. The menu appearance remains unannounced, and the user still has no confirmation that a menu has appeared after pressing the button.&lt;/p&gt;

&lt;p&gt;This remains an open barrier for screen reader users who need to access per-chat actions such as Star and Rename.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 The Sidebar Lacks Sufficient Landmarks for Direct Navigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Barrier&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Partially Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive provides the Page Info dialog, opened with &lt;code&gt;Alt + /&lt;/code&gt;, which surfaces active chat metadata and quick navigation context. From within the Page Info dialog, pressing &lt;code&gt;Enter&lt;/code&gt; on the chat title control moves focus directly to the current chat in the sidebar list. This provides a reliable, repeatable path to the chat list without requiring the user to traverse the sidebar from the top.&lt;/p&gt;

&lt;p&gt;This mitigation applies specifically to navigating to the currently active chat. Navigating to other chats in the list still requires traversal from the point where focus lands.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Friction&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PageLive introduces keyboard shortcuts for the three actions identified as missing in the analysis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Jump to chat input&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Shift + Esc&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Start a new chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Alt + O&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete the current chat&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl + Shift + Backspace&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The delete shortcut opens a confirmation dialog, allowing the user to confirm or cancel before the action is completed.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.6 Chat List Items Do Not Expose Metadata
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Analysis Severity: Friction&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Mitigation Status: Partially Addressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Page Info dialog, opened with &lt;code&gt;Alt + /&lt;/code&gt;, provides metadata for the currently active chat. This reduces the reliance on the chat title alone when assessing a conversation. Metadata exposure for all items in the chat list, rather than only the active chat, is not currently provided.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Mitigations
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Analysis Severity&lt;/th&gt;
&lt;th&gt;Mitigation Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;Keyboard Shortcuts dialog not accessible&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;td&gt;Partially Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;"More Options" menu appearance not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Not Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;Sidebar lacks landmarks for chat list navigation&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;td&gt;Partially Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;td&gt;Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;Chat list items lack metadata&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;td&gt;Partially Addressed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for claude.ai. The findings referenced throughout this article are documented in full in the companion &lt;a href="https://dev.to/wiscer/screen-reader-experience-analysis-on-claudeai-433a"&gt;Screen Reader Experience Analysis on claude.ai&lt;/a&gt;. For a full list of keyboard shortcuts and features PageLive provides for claude.ai, see the &lt;a href="https://wiscer.org/pagelive/claude" rel="noopener noreferrer"&gt;PageLive for Claude documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This article was produced as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, the extension described in this document.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations referenced in this article are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>claude</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Screen Reader Experience Analysis on claude.ai</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Wed, 04 Mar 2026 07:37:34 +0000</pubDate>
      <link>https://dev.to/wiscer/screen-reader-experience-analysis-on-claudeai-433a</link>
      <guid>https://dev.to/wiscer/screen-reader-experience-analysis-on-claudeai-433a</guid>
      <description>&lt;p&gt;&lt;em&gt;3 March 2026&lt;/em&gt; — &lt;strong&gt;PageLive Project&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This report documents the difficulties a screen reader user encounters when using claude.ai. Testing was conducted using NVDA on Chrome on a Windows desktop. While the findings are based on NVDA, the barriers described are expected to affect users of other screen readers, including JAWS, in similar ways. While claude.ai is usable with a screen reader, several interactions require significant extra effort or guesswork that sighted users do not face.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Scope and Testing Environment
&lt;/h2&gt;

&lt;p&gt;This analysis evaluates the screen reader experience on claude.ai as encountered during manual testing. The scope is limited to interactions that are part of routine use: composing and reading conversations, navigating between chats, and accessing application controls.&lt;/p&gt;

&lt;p&gt;Findings are not evaluated against WCAG criteria. The focus is on the practical experience of a screen reader user during everyday tasks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Screen Reader&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NVDA 2025.3.3.54605&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chrome 145.0.7632.117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Platform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Windows Desktop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interface Tested&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;claude.ai web application&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Findings are classified by their impact on task completion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blocker&lt;/strong&gt; — The task cannot be completed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Barrier&lt;/strong&gt; — The task can be completed, but requires significant additional effort, guesswork, or repeated keystrokes that are not required of sighted users.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friction&lt;/strong&gt; — The task works as expected, but the experience is degraded in a way that compounds over extended use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Findings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Response Completion Is Not Announced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When claude.ai finishes generating a response, no announcement is made to the screen reader. The response content is not placed in a live region, so the screen reader does not notify the user that new content is available or that generation has completed.&lt;/p&gt;

&lt;p&gt;As a result, the user has no reliable way to know when it is appropriate to begin reading. The user must manually navigate to the chat area, attempt to locate the new response, and determine through repeated keystrokes whether generation has finished or is still in progress. This interaction occurs on every single exchange, making it the most consequential barrier in routine use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 The "Keyboard Shortcuts" Dialog Is Not Accessible
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Blocker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The "Keyboard Shortcuts" dialog in claude.ai presents two separate barriers when accessed with a screen reader.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2.1 Dialog appearance is not announced.&lt;/strong&gt; When the dialog is opened, the screen reader does not announce that a dialog has appeared, and focus is not moved into the dialog. The user receives no indication that anything has changed on screen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.2.2 Dialog content is not reachable.&lt;/strong&gt; When the user navigates to the bottom of the page using the virtual cursor, the screen reader reads only the dialog's heading — "Keyboard Shortcuts" — and does not expose the list of shortcuts contained within. The content of the dialog is effectively inaccessible.&lt;/p&gt;

&lt;p&gt;These two barriers combine to make the Keyboard Shortcuts dialog non-functional for screen reader users. The meaningful task — reading the available keyboard shortcuts — cannot be completed. A feature that is specifically intended to support keyboard navigation cannot itself be navigated by keyboard users relying on a screen reader.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.3 The "More Options" Menu in the Chat List Does Not Announce Its Appearance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each item in the chat list sidebar contains a "More Options" button. When activated, a popup menu appears containing actions such as Star, Rename, and others. The menu implements a focus trap, meaning keyboard focus is correctly contained within it once the user is inside. However, the appearance of the menu is not announced by the screen reader, and the user is not informed of how to close it.&lt;/p&gt;

&lt;p&gt;The result is that after pressing the button, the user receives no confirmation that anything has occurred. The user must discover — through navigation — that a menu has appeared, learn its contents, and determine independently that pressing Escape will close it. A sighted user receives immediate visual confirmation of all three.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 The Sidebar Lacks Sufficient Landmarks for Direct Navigation
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Barrier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Navigation between chats requires access to the chat list in the sidebar. The sidebar contains a landmark that allows the user to jump to its top, but no landmark or heading structure is provided to allow direct navigation to the chat list itself.&lt;/p&gt;

&lt;p&gt;Available landmarks during testing were limited to a jump to the top of the sidebar, a banner landmark in the chat section, and a notifications landmark. None of these allow the user to navigate directly to the chat list. A user who wishes to switch chats must traverse through the sidebar from the top, passing over controls unrelated to the chat list on each visit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.5 Missing Keyboard Shortcuts for Frequently Used Actions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Friction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The following actions do not have keyboard shortcuts in claude.ai:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jump to the chat input field&lt;/li&gt;
&lt;li&gt;Start a new chat&lt;/li&gt;
&lt;li&gt;Delete the current chat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these actions is available through the interface but requires the user to locate the relevant control through navigation. For a sighted user, these controls are immediately visible. For a screen reader user, the location of a button is not always remembered between sessions, and finding it requires traversal through surrounding content.&lt;/p&gt;

&lt;p&gt;The absence of shortcuts does not prevent these actions. However, the cumulative effect of repeated traversal — compounded with the other barriers documented above — meaningfully degrades the experience of extended use.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.6 Chat List Items Do Not Expose Metadata
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Severity: Friction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chat list items correctly expose the title of each chat to the screen reader. No additional metadata — such as the number of responses in a conversation, the date of the last message, or the model used — is provided.&lt;/p&gt;

&lt;p&gt;A user who cannot visually scan the chat list must rely on the title alone to identify and select the correct conversation. Additional metadata would reduce the effort required to distinguish between similarly named chats and to assess whether a conversation is worth reopening.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Summary of Findings
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Finding&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;Response completion not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2&lt;/td&gt;
&lt;td&gt;Keyboard Shortcuts dialog not accessible&lt;/td&gt;
&lt;td&gt;Blocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;"More Options" menu appearance not announced&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;Sidebar lacks landmarks for chat list navigation&lt;/td&gt;
&lt;td&gt;Barrier&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;td&gt;Missing keyboard shortcuts for common actions&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;Chat list items lack metadata&lt;/td&gt;
&lt;td&gt;Friction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Further Reading
&lt;/h2&gt;

&lt;p&gt;This article is part of the PageLive project's documentation for claude.ai. A companion article, &lt;a href="https://dev.to/wiscer/screen-reader-experience-mitigation-on-claudeai-4khl"&gt;Screen Reader Experience Mitigation on claude.ai&lt;/a&gt;, describes how PageLive addresses the barriers identified above. For a full list of keyboard shortcuts and features PageLive provides for claude.ai, see the &lt;a href="https://wiscer.org/pagelive/claude" rel="noopener noreferrer"&gt;PageLive for Claude documentation&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;— End of Article —&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimers
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;This analysis was conducted as part of the PageLive project, which develops keyboard shortcut and screen reader support for AI chat interfaces. The author develops PageLive, a Chrome extension that addresses several of the barriers described in this report. A companion Screen Reader Experience Mitigation documents the approaches PageLive applies to each finding.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PageLive can be installed for free on the &lt;a href="https://chromewebstore.google.com/detail/pagelive/kachdjbdcmofjmaoklcfofbcnlakfnbb" rel="noopener noreferrer"&gt;PageLive chrome webstore page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The findings, severity classifications, and testing observations in this report are the author's own, based on manual testing with NVDA on Chrome. AI assistance was used solely to shape the writing style of this document.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>pagelive</category>
      <category>a11y</category>
      <category>claude</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>Auto Hot Key to automate Keystrokes in Windsurf IDE</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Fri, 29 Nov 2024 12:40:25 +0000</pubDate>
      <link>https://dev.to/wiscer/auto-hot-key-to-automate-keystrokes-in-windsurf-ide-2agk</link>
      <guid>https://dev.to/wiscer/auto-hot-key-to-automate-keystrokes-in-windsurf-ide-2agk</guid>
      <description>&lt;h1&gt;
  
  
  Using Keyboard Shortcuts to Enhance Productivity in Windsurf IDE
&lt;/h1&gt;

&lt;p&gt;As a non-visual developer (screen reader user), I rely heavily on keyboard shortcuts and keybindings. This article provides a workaround for inputting keystrokes in the Windsurf IDE.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breadcrumbs in VSCode IDE
&lt;/h2&gt;

&lt;p&gt;I primarily use VSCode IDE because it is highly accessible for screen reader users. One of the shortcuts I use most frequently is &lt;strong&gt;&lt;code&gt;Breadcrumbs Focus&lt;/code&gt;&lt;/strong&gt;.  &lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Shortcut&lt;/dt&gt;
  &lt;dd&gt;
Ctrl + Shift + .
&lt;/dd&gt;
  &lt;dt&gt;Description&lt;/dt&gt;
  &lt;dd&gt;Focus and select breadcrumbs&lt;/dd&gt;
  &lt;dd&gt;&lt;code&gt;breadcrumbs.focusAndSelect&lt;/code&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwiscer-org%2Fdevto-sinedied%2Frefs%2Fheads%2Fmain%2Fassets%2Fimages%2Fvscode-breadcrumbs.png" class="article-body-image-wrapper"&gt;&lt;img alt="Breadcrumbs in VSCode" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwiscer-org%2Fdevto-sinedied%2Frefs%2Fheads%2Fmain%2Fassets%2Fimages%2Fvscode-breadcrumbs.png" width="800" height="500"&gt;&lt;/a&gt;Screenshot of creadcrumbs in VSCode&lt;/p&gt;

&lt;p&gt;Breadcrumbs are located at the upper part of the text editor. I use this shortcut every 5–10 minutes because:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It provides a quick snapshot of the code hierarchy, whether within a class or an HTML tree.
&lt;/li&gt;
&lt;li&gt;It helps navigate between methods within the file efficiently.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Windsurf IDE
&lt;/h2&gt;

&lt;p&gt;Windsurf IDE is an accessible, AI-powered IDE built on top of VSCode, inheriting many of its shortcuts. However, the shortcut for &lt;strong&gt;&lt;code&gt;breadcrumbs.focusAndSelect&lt;/code&gt;&lt;/strong&gt; does not work in Windsurf.  &lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;breadcrumbs.focus&lt;/code&gt; Shortcut
&lt;/h2&gt;

&lt;p&gt;In Windsurf, I discovered an alternative shortcut:  &lt;/p&gt;

&lt;dl&gt;
  &lt;dt&gt;Shortcut&lt;/dt&gt;
  &lt;dd&gt;
Ctrl + Shift + ;
&lt;/dd&gt;
  &lt;dt&gt;Description&lt;/dt&gt;
  &lt;dd&gt;Focus on breadcrumbs&lt;/dd&gt;
  &lt;dd&gt;&lt;code&gt;breadcrumbs.focus&lt;/code&gt;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;However, in Windsurf, this shortcut does not automatically focus on the original breadcrumbs. Instead, it defaults to a new visual element on the right side of the breadcrumbs containing "Explain," "Refactor," and "Add Docstring" links.  &lt;/p&gt;

&lt;p&gt;To replicate the functionality of &lt;code&gt;breadcrumbs.focusAndSelect&lt;/code&gt;, I have to:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl + Shift + ;&lt;/code&gt; to focus on the new links.
&lt;/li&gt;
&lt;li&gt;Use the left arrow to move focus to the original breadcrumbs.
&lt;/li&gt;
&lt;li&gt;Press the down arrow to select and display the code tree.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwiscer-org%2Fdevto-sinedied%2Frefs%2Fheads%2Fmain%2Fassets%2Fimages%2Fwindsurf-breadcrumbs.png" class="article-body-image-wrapper"&gt;&lt;img alt="Breadcrumbs in Windsurf" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fwiscer-org%2Fdevto-sinedied%2Frefs%2Fheads%2Fmain%2Fassets%2Fimages%2Fwindsurf-breadcrumbs.png" width="800" height="500"&gt;&lt;/a&gt;Screenshot of creadcrumbs in VSCode&lt;/p&gt;

&lt;p&gt;Since I frequently use this functionality, automating these steps into a single keystroke would save a lot of hassle.  &lt;/p&gt;

&lt;h2&gt;
  
  
  AutoHotkey: A Solution
&lt;/h2&gt;

&lt;p&gt;To streamline the process, I use &lt;strong&gt;AutoHotkey&lt;/strong&gt;, a free tool for customizing keyboard shortcuts.  &lt;/p&gt;

&lt;p&gt;I mapped the sequence to &lt;code&gt;NumpadIns&lt;/code&gt; followed by the right arrow, as they are conveniently close on my keyboard.  &lt;/p&gt;

&lt;h3&gt;
  
  
  AutoHotkey Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Map NumpadIns + Right Arrow 
; to simulate breadcrumbs.focusAndSelect in Windsurf
NumpadIns &amp;amp; Right::
Send ^+;  ; Send Ctrl+Shift+;
Sleep 100  ; Pause for 100 milliseconds
Send {Left}  
Sleep 100  
Send {Down}  
return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Setup
&lt;/h2&gt;

&lt;p&gt;Follow these steps to set up the shortcut:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download AutoHotkey: &lt;a href="https://www.autohotkey.com/" rel="noopener noreferrer"&gt;Download AHK&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Create a Script File:

&lt;ul&gt;
&lt;li&gt;Open a text editor, such as Notepad.&lt;/li&gt;
&lt;li&gt;Paste the script above.&lt;/li&gt;
&lt;li&gt;Save the file with a &lt;code&gt;.ahk&lt;/code&gt; extension (e.g., &lt;code&gt;breadcrumbs.ahk&lt;/code&gt;). Ensure there is no hidden &lt;code&gt;.txt&lt;/code&gt; suffix.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Run the Script: Double-click the .ahk file to activate the script.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a detailed guide, refer to the AutoHotkey Tutorial.&lt;/p&gt;

&lt;p&gt;This solution significantly simplifies navigating breadcrumbs in Windsurf IDE and enhances accessibility for screen reader users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update on Key Conflict
&lt;/h2&gt;

&lt;p&gt;The assignment of NumPadIns in the AutoHotKey script conflicted with its role as the NVDA modifier key. As a result, when the script runs, NVDA can no longer respond to the NumPadIns key. This happens because AutoHotKey intercepts the NumPadIns key press, preventing NVDA from processing it.&lt;br&gt;
To resolve this issue, I replaced NumPadIns with the NumPadAdd key in the script. Here is the updated script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Map NumpadAdd + Right Arrow 
; to simulate breadcrumbs.focusAndSelect in Windsurf
NumpadAdd &amp;amp; Right::
Send ^+;  ; Send Ctrl+Shift+;
Sleep 100  ; Pause for 100 milliseconds
Send {Left}  
Sleep 100  
Send {Down}  
return
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vscode</category>
      <category>windsurf</category>
      <category>breadcrumbs</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>VSCode shortcuts / keybinding for Non Visual Users</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Fri, 06 Sep 2024 11:27:27 +0000</pubDate>
      <link>https://dev.to/wiscer/vscode-shortcuts-keybinding-for-non-visual-users-3e08</link>
      <guid>https://dev.to/wiscer/vscode-shortcuts-keybinding-for-non-visual-users-3e08</guid>
      <description>&lt;p&gt;In this article, I’ll be sharing a selection of VSCode shortcuts and keybindings that I frequently use and find&lt;br&gt;
particularly useful as a screen reader (non-visual) developer. &lt;/p&gt;

&lt;p&gt;While memorizing every keybinding available in VSCode can&lt;br&gt;
be overwhelming, focusing on a core set of shortcuts can greatly enhance efficiency and ease of use. To make this guide practical, I’ve highlighted keybindings that are most likely to be beneficial for screen reader users. The list below will have marks on shortcuts which I think essential. &lt;/p&gt;

&lt;p&gt;The default keybindings are sourced from the official VSCode documentation as of September 3, 2024. I hope this resource will help you streamline your workflow by focusing on the most useful and frequently used shortcuts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: The essential shortcuts will ended by 👍&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;General&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Ctrl+Shift+P, F1&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Command Palette&lt;/dd&gt;
    &lt;dt&gt;Ctrl+P&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Quick Open, Go to File…&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+N&lt;/dt&gt;
    &lt;dd&gt;New window/instance&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+W&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Close window/instance&lt;/dd&gt;
    &lt;dt&gt;Ctrl+,&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;User Settings&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+S
    &lt;/dt&gt;
&lt;dd&gt;Keyboard Shortcuts&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Basic editing&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Ctrl+X&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Cut line (empty selection)&lt;/dd&gt;
    &lt;dt&gt;Ctrl+C&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Copy line (empty selection)&lt;/dd&gt;
    &lt;dt&gt;Alt+ ↑/↓&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Move line up/down&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+ ↑/↓&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Copy line up/down&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+K&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Delete line&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Enter&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Insert line below&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Enter&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Insert line above&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+\&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Jump to matching bracket&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ ]/[&lt;/dt&gt;
    &lt;dd&gt;Indent/outdent line. This is useful when I want to make sure there is no whitespaces at start.&lt;/dd&gt;
    &lt;dt&gt;Home/End&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to beginning / end of line&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Home&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to beginning of file&lt;/dd&gt;
    &lt;dt&gt;Ctrl+End&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to end of file&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ ↑/↓ &lt;/dt&gt;
    &lt;dd&gt;Scroll line up/down&lt;/dd&gt;
    &lt;dt&gt;Alt+ PgUp/PgDn&lt;/dt&gt;
    &lt;dd&gt;Scroll page up/down&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+[&lt;/dt&gt;
    &lt;dd&gt;Fold (collapse) region&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+]&lt;/dt&gt;
    &lt;dd&gt;Unfold (uncollapse) region&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K&lt;/dt&gt;
    &lt;dd&gt;Ctrl+[ Fold (collapse) all subregions&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K&lt;/dt&gt;
    &lt;dd&gt;Ctrl+] Unfold (uncollapse) all subregions&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+0&lt;/dt&gt;
&lt;dd&gt;Fold (collapse) all regions&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+J&lt;/dt&gt;
&lt;dd&gt;Unfold (uncollapse) all regions&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+C&lt;/dt&gt;
&lt;dd&gt;Add line comment&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+U&lt;/dt&gt;
&lt;dd&gt;Remove line comment&lt;/dd&gt;
    &lt;dt&gt;Ctrl+/&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Toggle line comment&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+A&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Toggle block comment&lt;/dd&gt;
    &lt;dt&gt;Alt+Z&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Toggle word wrap&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Navigation&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Ctrl+T&lt;/dt&gt;
    &lt;dd&gt;Show all Symbols&lt;/dd&gt;
    &lt;dt&gt;Ctrl+G&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to Line...&lt;/dd&gt;
    &lt;dt&gt;Ctrl+P&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to File...&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+O&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to Symbol...&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+M&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Problems panel&lt;/dd&gt;
    &lt;dt&gt;F8&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to next error or warning&lt;/dd&gt;
    &lt;dt&gt;Shift+F8&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to previous error or warning&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Tab&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Navigate editor group history&lt;/dd&gt;
    &lt;dt&gt;Alt+ ←/→&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Go back / forward&lt;/dd&gt;
    &lt;dt&gt;Ctrl+M&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Toggle Tab moves focus&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Search and replace&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Ctrl+F&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Find&lt;/dd&gt;
    &lt;dt&gt;Ctrl+H&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Replace&lt;/dd&gt;
    &lt;dt&gt;F3 / Shift+F3&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Find next/previous&lt;/dd&gt;
    &lt;dt&gt;Alt+Enter&lt;/dt&gt;
    &lt;dd&gt;Select all occurences of Find match&lt;/dd&gt;
    &lt;dt&gt;Ctrl+D&lt;/dt&gt;
    &lt;dd&gt;Add selection to next Find match&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+D&lt;/dt&gt;
    &lt;dd&gt;Move last selection to next Find match&lt;/dd&gt;
    &lt;dt&gt;Alt+ C/R/W&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Toggle case-sensitive / regex / whole word&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Multi-cursor and selection&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Alt+Click&lt;/dt&gt;
    &lt;dd&gt;Insert cursor&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Alt+ ↑/↓&lt;/dt&gt;
    &lt;dd&gt;Insert cursor above / below&lt;/dd&gt;
    &lt;dt&gt;Ctrl+U&lt;/dt&gt;
    &lt;dd&gt;Undo last cursor operation&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+I&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Insert cursor at end of each line selected&lt;/dd&gt;
    &lt;dt&gt;Ctrl+L&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Select current line&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+L&lt;/dt&gt;
    &lt;dd&gt;Select all occurrences of current selection&lt;/dd&gt;
    &lt;dt&gt;Ctrl+F2&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Select all occurrences of current word&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+→&lt;/dt&gt;
    &lt;dd&gt;Expand selection&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+←&lt;/dt&gt;
    &lt;dd&gt;Shrink selection&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt + (drag mouse)&lt;/dt&gt;
    &lt;dd&gt;Column (box) selection&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Alt+ (arrow key)&lt;/dt&gt;
    &lt;dd&gt;Column (box) selection&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Alt+ PgUp/PgDn&lt;/dt&gt;
    &lt;dd&gt;Column (box) selection page up/down&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Rich languages editing&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Ctrl+Space, Ctrl+I&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Trigger suggestion&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Space&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Trigger parameter hints&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+F&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Format document&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+F&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Format selection&lt;/dd&gt;
    &lt;dt&gt;F12&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Go to Definition&lt;/dd&gt;
    &lt;dt&gt;Alt+F12&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Peek Definition&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K F12&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Open Definition to the side&lt;/dd&gt;
    &lt;dt&gt;Ctrl+.&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Quick Fix&lt;/dd&gt;
    &lt;dt&gt;Shift+F12&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show References&lt;/dd&gt;
    &lt;dt&gt;F2&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Rename Symbol&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+X&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
&lt;dd&gt;Trim trailing whitespace&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K M&lt;/dt&gt;
    &lt;dd&gt;Change file language&lt;/dd&gt;
&lt;dl&gt;

&lt;h2&gt;Editor management&lt;/h2&gt;
&lt;dl&gt;
    &lt;dt&gt;Ctrl+F4, Ctrl+W&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Close editor&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K F&lt;/dt&gt;
    &lt;dd&gt;Close folder&lt;/dd&gt;
    &lt;dt&gt;Ctrl+\&lt;/dt&gt;
    &lt;dd&gt;Split editor&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ 1/2/3&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Focus into 1st, 2nd or 3rd editor group. This is most useful for me when I repeatedly jump between specific locations in file/files.&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+ ←/→&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Focus into previous/next editor group&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+ PgUp/PgDn&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Move editor left/right&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K ←/→&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Move active editor group&lt;/dd&gt;
&lt;dl&gt;

&lt;h2&gt;File management&lt;/h2&gt;
&lt;dl&gt;
    &lt;dt&gt;Ctrl+N&lt;/dt&gt;
    &lt;dd&gt;New File&lt;/dd&gt;
    &lt;dt&gt;Ctrl+O&lt;/dt&gt;
    &lt;dd&gt;Open File...&lt;/dd&gt;
    &lt;dt&gt;Ctrl+S&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Save&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+S&lt;/dt&gt;
    &lt;dd&gt;Save As...&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K S&lt;/dt&gt;
    &lt;dd&gt;Save All&lt;/dd&gt;
    &lt;dt&gt;Ctrl+F4&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Close&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Ctrl+W&lt;/dt&gt;
    &lt;dd&gt;Close All&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+T&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Reopen closed editor&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Enter Keep preview mode editor open&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Tab&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Open next&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+Tab&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Open previous&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K P&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Copy path of active file&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K R&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt; 
    &lt;dd&gt;Reveal active file in Explorer&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K O&lt;/dt&gt;
    &lt;dd&gt;Show active file in new window/instance&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Display&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;F11&lt;/dt&gt;
    &lt;dd&gt;Toggle full screen&lt;/dd&gt;
    &lt;dt&gt;Shift+Alt+0&lt;/dt&gt;
    &lt;dd&gt;Toggle editor layout (horizontal/vertical)&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ =/-&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Zoom in/out&lt;/dd&gt;
    &lt;dt&gt;Ctrl+B&lt;/dt&gt;
    &lt;dd&gt;Toggle Sidebar visibility&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+E&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Explorer / Toggle focus&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+F&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Search&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+G&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Source Control&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+D&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Debug&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+X&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show Extensions&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+H&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Replace in files&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+J&lt;/dt&gt;
    &lt;dd&gt;Toggle Search details&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+U&lt;/dt&gt;
    &lt;dd&gt;Show Output panel&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+V&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Open Markdown preview&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K V&lt;/dt&gt;
    &lt;dd&gt;Open Markdown preview to the side&lt;/dd&gt;
    &lt;dt&gt;Ctrl+K Z&lt;/dt&gt;
    &lt;dd&gt;Zen Mode (Esc Esc to exit)&lt;/dd&gt;
&lt;/dl&gt;

&lt;h2&gt;Debug&lt;/h2&gt;

&lt;dl&gt;
&lt;dt&gt;F9&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
&lt;dd&gt;Toggle breakpoint&lt;/dd&gt;
&lt;dt&gt;F5&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
&lt;dd&gt;Start/Continue&lt;/dd&gt;
&lt;dt&gt;Shift+F5&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
&lt;dd&gt;Stop&lt;/dd&gt;
&lt;dt&gt;F11 / Shift+F11&lt;dt&gt;
&lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Step into/out&lt;/dd&gt;
&lt;dt&gt;F10&lt;/dt&gt;
&lt;dd&gt;Step over&lt;/dd&gt;
&lt;dt&gt;Ctrl+K Ctrl+I&lt;/dt&gt;
&lt;dd&gt;Show hover&lt;/dd&gt;
&lt;dl&gt;

&lt;h2&gt;Integrated terminal&lt;/h2&gt;
&lt;dl&gt;
    &lt;dt&gt;Ctrl+`&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Show integrated terminal&lt;/dd&gt;
    &lt;dt&gt;Ctrl+Shift+`&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Create new terminal&lt;/dd&gt;
    &lt;dt&gt;Ctrl+C&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Copy selection&lt;/dd&gt;
    &lt;dt&gt;Ctrl+V&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Paste into active terminal&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ ↑/↓ &lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Scroll up/down&lt;/dd&gt;
    &lt;dt&gt;Shift+ PgUp/PgDn&lt;span&gt; 👍&lt;/span&gt;
&lt;/dt&gt;
    &lt;dd&gt;Scroll page up/down&lt;/dd&gt;
    &lt;dt&gt;Ctrl+ Home/End&lt;dt&gt;
    &lt;/dt&gt;
&lt;/dt&gt;
&lt;dd&gt;Scroll to top/bottom&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Other operating systems’ keyboard shortcuts and additional unassigned shortcuts available at &lt;a href="//aka.ms/vscodekeybindings"&gt;aka.ms/vscodekeybindings&lt;/a&gt;&lt;/p&gt;


&lt;/dl&gt;
&lt;br&gt;
&lt;/dl&gt;
&lt;br&gt;
&lt;/dl&gt;
&lt;br&gt;
&lt;/dl&gt;
&lt;br&gt;
&lt;/dl&gt;
&lt;br&gt;
&lt;/dl&gt;

</description>
      <category>vscode</category>
      <category>keybindings</category>
      <category>withscreenreader</category>
    </item>
    <item>
      <title>Windows Terminal with Screen Reader</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Mon, 08 Jul 2024 04:53:25 +0000</pubDate>
      <link>https://dev.to/wiscer/windows-terminal-with-screen-reader-49fp</link>
      <guid>https://dev.to/wiscer/windows-terminal-with-screen-reader-49fp</guid>
      <description>&lt;p&gt;When I first started using a screen reader, one of the biggest challenges I faced was operating terminal applications like Powershell. It took me quite some time to become comfortable navigating and using these terminal apps.&lt;/p&gt;

&lt;p&gt;This article shares tips on operating Powershell and other terminal applications using the NVDA screen reader (Desktop keyboard layout), based on my personal experience. It is a work-in-progress article that will be updated over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading Text in the Terminal
&lt;/h2&gt;

&lt;p&gt;In the terminal, the cursor is always at the bottom. To read text, use the Navigator Object. For example, to read the previous line use &lt;code&gt;Numpad 7&lt;/code&gt;for Desktop Layout. Full description about the Navigator Object navigation can be found in &lt;a href="https://www.nvaccess.org/files/nvdaTracAttachments/455/keycommands%20with%20laptop%20keyboard%20layout.html" rel="noopener noreferrer"&gt;NVDA Command Key Quick Reference&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying Text
&lt;/h2&gt;

&lt;p&gt;To copy a range of text in the terminal, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mark the start of the text to be copied: 

&lt;ul&gt;
&lt;li&gt;Use the Navigator Object to move to the starting point of the text you want to copy. &lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Caps Lock&lt;/code&gt; + &lt;code&gt;F9&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mark the end of the text:

&lt;ul&gt;
&lt;li&gt;Use the Navigator Object to move to the endpoint of the text selection.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Caps Lock&lt;/code&gt; + &lt;code&gt;F10&lt;/code&gt; twice. (Hold the &lt;code&gt;Caps Lock&lt;/code&gt; and then quickly press &lt;code&gt;F10&lt;/code&gt; twice.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After completing these steps, the selected text will be copied to the clipboard.&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>powershell</category>
      <category>nvda</category>
      <category>screenreader</category>
    </item>
    <item>
      <title>How to Use VSCode Logpoint with Keyboard Shortcuts</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Tue, 02 Jul 2024 01:47:50 +0000</pubDate>
      <link>https://dev.to/wiscer/how-to-use-vscode-logpoint-with-keyboard-shortcuts-4gmc</link>
      <guid>https://dev.to/wiscer/how-to-use-vscode-logpoint-with-keyboard-shortcuts-4gmc</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This article demonstrates how to efficiently utilize VSCode Logpoints using only keyboard shortcuts. This method is particularly beneficial for users who rely on screen readers or prefer keyboard-centric workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding VSCode Logpoint
&lt;/h2&gt;

&lt;p&gt;VSCode Logpoints allow developers to dynamically insert logging messages into their code without modifying the source code itself. This feature is invaluable for debugging and understanding code execution flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Custom Shortcut for Logpoints
&lt;/h2&gt;

&lt;p&gt;Since there is no default shortcut or menu item for adding Logpoints, follow these steps to define a custom shortcut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the keybinding editor with &lt;code&gt;Ctrl + K Ctrl + S&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Type &lt;code&gt;Logpoint&lt;/code&gt; into the search box and press &lt;code&gt;Tab&lt;/code&gt; to navigate to the &lt;code&gt;Debug:Add Logpoint&lt;/code&gt; result. Press &lt;code&gt;Enter&lt;/code&gt; to activate.&lt;/li&gt;
&lt;li&gt;Enter your desired keyboard shortcut, for example, &lt;code&gt;Ctrl + L Ctrl + P&lt;/code&gt;, and confirm by pressing &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example File
&lt;/h2&gt;

&lt;p&gt;To illustrate the usage of Logpoints, consider the following JavaScript file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;plus_4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;plus_9&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End of file&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;plus_4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;plus 4&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                               
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;plus_9&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Plus 9&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adding Logpoints to Replace &lt;code&gt;console.log&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Replacing repetitive &lt;code&gt;console.log&lt;/code&gt; statements with Logpoints enhances debugging efficiency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the line containing &lt;code&gt;console.log&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use the custom shortcut (&lt;code&gt;Ctrl + L Ctrl + P&lt;/code&gt;) to add a Logpoint. Enter a descriptive message when prompted, e.g., "Reached end of file", and press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repeat these steps for each &lt;code&gt;console.log&lt;/code&gt; statement in your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running in Debug Environment
&lt;/h2&gt;

&lt;p&gt;To execute the JavaScript file with Logpoints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the debug panel with &lt;code&gt;Ctrl + Shift + D&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;code&gt;Javascript Debug Terminal&lt;/code&gt; using &lt;code&gt;Tab&lt;/code&gt; and activate it.&lt;/li&gt;
&lt;li&gt;Run the script using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  node index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Logpoint messages will be displayed in the terminal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note for screen reader users:&lt;/strong&gt; Switch to screen reader compatibility mode with &lt;code&gt;F2&lt;/code&gt; to read the terminal output. Use arrow keys to navigate through lines and press &lt;code&gt;F1&lt;/code&gt; to return to normal mode.&lt;/p&gt;

&lt;p&gt;Using Logpoints eliminates the need for repetitive &lt;code&gt;console.log&lt;/code&gt; cleanup during debugging sessions, streamlining your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Removing Logpoints
&lt;/h2&gt;

&lt;p&gt;To remove a Logpoint, position the cursor on the relevant line and press &lt;code&gt;F9&lt;/code&gt;, similar to removing breakpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Using VSCode Logpoints significantly improves debugging efficiency compared to traditional &lt;code&gt;console.log&lt;/code&gt; methods. It saves time by reducing code clutter and repetitive cleanup tasks, making debugging more focused and productive.&lt;/p&gt;

&lt;p&gt;We hope this article helps streamline your development process with VSCode Logpoints. Happy coding!&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>logpoint</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Linux WSL for Development Environment</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Fri, 11 Nov 2022 04:00:00 +0000</pubDate>
      <link>https://dev.to/wiscer/linux-wsl-for-development-environment-1ad2</link>
      <guid>https://dev.to/wiscer/linux-wsl-for-development-environment-1ad2</guid>
      <description>&lt;h2&gt;
  
  
  Linux WSL for Development Environment
&lt;/h2&gt;

&lt;p&gt;WSL, stands for &lt;strong&gt;Windows Subsystem for Linux&lt;/strong&gt;, is a sub system within Windows OS allowing users to install one or many Linux distributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Used in this Article
&lt;/h2&gt;

&lt;p&gt;In this article the following environment / applications are used : &lt;br&gt;
Windows 11, WSL2, Ubuntu 20.04 LTS, Windows Terminal, NVM, and Node.js. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This article and all of the videos are made with NVDA screen reader.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Flexibility
&lt;/h2&gt;

&lt;p&gt;Since I became a screen reader user, due to eye problems, I moved to Windows from Linux Ubuntu. &lt;br&gt;
I am now depend on Windows based NVDA screen reader to use the computer.&lt;br&gt;
Developing on Windows machines means that there will be different environment between development and deployment machines (mostly Linux).&lt;/p&gt;

&lt;p&gt;WSL allows me to have a more 'screen reader friendly' environment (Windows desktop)&lt;br&gt;
while having the same environment with the deployment machines (Linux server).&lt;/p&gt;
&lt;h2&gt;
  
  
  Clean Installation
&lt;/h2&gt;

&lt;p&gt;The next benefit of using WSL is that we will have clean installation since all development tools / modules will be on LinuxWSL.&lt;br&gt;
We will have a much more 'clean' Windows installation. &lt;/p&gt;

&lt;p&gt;We can install more than one Linux distributions on one Windows machine.&lt;br&gt;
We can also reset each installed Linux, meaning we can easily have fresh Linux installation on our Windows machine. &lt;br&gt;
To demonstrate 'clean installation' we will install Node.js on Ubuntu and will reset the Ubuntu as below.&lt;/p&gt;
&lt;h3&gt;
  
  
  Install Ubuntu WSL
&lt;/h3&gt;

&lt;p&gt;To show available Linux distros online, open Windows Terminal / Powershell and run :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;wsl --list --online &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install Ubuntu 20.04 use &lt;code&gt;-d &amp;lt;NAME&amp;gt;&lt;/code&gt; as below :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;wsl --install -d Ubuntu-20.04&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After executing the command above, wait and follow instructions on screen.&lt;br&gt;
Upon completion we need to search for &lt;code&gt;Ubuntu&lt;/code&gt; in the Windows Start menu and execute the installed Ubuntu.&lt;br&gt;
This will start Ubuntu initialization, and then we will be asked to supply username and password.&lt;br&gt;
Up until this point the Ubuntu installation process has been completed.&lt;/p&gt;

&lt;p&gt;To display available wsl commands and options, run command below:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;wsl --help&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you are interested on watching realtime demonstration videos on how to install Ubuntu WSL on Windows 11,&lt;br&gt;
you can listen / watch it on 2 videos below.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/PD1FeVtIpLs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Video 1: How to install Ubuntu WSL on Windows 11 (using NVDA). 





&lt;p&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/fGFPUlSPA34"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Video 2: How to install Ubuntu WSL on Windows 11 (using NVDA). 





&lt;h3&gt;
  
  
  Ubuntu Terminal in Windows Terminal
&lt;/h3&gt;

&lt;p&gt;Follow steps below to run Ubuntu Terminal:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;Windows Terminal&lt;/code&gt;. By default, &lt;code&gt;Windows Terminal&lt;/code&gt; will run &lt;code&gt;Powershell&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; +&lt;code&gt;Space&lt;/code&gt; to show list of available CLI applications.&lt;/li&gt;
&lt;li&gt;Use up and down arrow to focus on 'Ubuntu'. Then press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ubuntu terminal should be opened right now. To test, run &lt;code&gt;lsb_release -a&lt;/code&gt; to display the Ubuntu version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3d5C2w0NFXk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Video: Start Ubuntu WSL Terminal in Windows Terminal (using NVDA)





&lt;h3&gt;
  
  
  Install NVM
&lt;/h3&gt;

&lt;p&gt;NVM, stands for Node Version Manager, is a tool to manage Node.js versions in a machine.&lt;br&gt;
NVM can be used to install, remove, and set which version of the currently installed Node.js in a computer.&lt;/p&gt;

&lt;p&gt;To install NVM, open Ubuntu Terminal and execute command below.&lt;br&gt;
Command below will pipe the &lt;code&gt;stdout&lt;/code&gt; from &lt;code&gt;curl&lt;/code&gt; to &lt;code&gt;bash&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;curl -o- &lt;a href="https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh"&gt;https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh&lt;/a&gt; | bash&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Visit &lt;a href="https://github.com/nvm-sh/nvm"&gt;NVM Github page&lt;/a&gt; for more detail info.&lt;br&gt;
Demonstration video, about how to install NVM, is available below.&lt;/p&gt;
&lt;h3&gt;
  
  
  Install Node.js
&lt;/h3&gt;

&lt;p&gt;To test if &lt;code&gt;nvm&lt;/code&gt; is already installed, run &lt;code&gt;nvm --version&lt;/code&gt; on your Ubuntu Terminal.&lt;br&gt;
If &lt;code&gt;nvm&lt;/code&gt; is not recognized by Ubuntu, close the Terminal and try again in a new Terminal.&lt;/p&gt;

&lt;p&gt;To install the latest node version, run below command on Ubuntu Terminal.&lt;br&gt;
&lt;code&gt;node&lt;/code&gt; is an alias for 'node latest version'.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm install node&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install node with a specific version, put he version like below:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm install 14.7.0 &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To display list of available downable version of node.js, run:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm ls-remote&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I mostly install LTS versions for have a more stable Node.js. To display only LTS versions run :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm ls-remote --lts&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install the latest LTS:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm install 'lts/*'&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To install the latest version of a specific codename LTS:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm install lts/hydrogen&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The following command can be used to install LTS version:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm install --lts &lt;br&gt;
nvm install --lts=argon &lt;br&gt;
nvm install 'lts/*' &lt;br&gt;
nvm install lts/hydrogen &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To select version of node.js to be used, use the command &lt;code&gt;use&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm use 20.04&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Up until this point we already have Node.js installed on our Ubuntu WSL. That means we can develop apps in Linux environment on our Windows machine. If you are using VSCode as IDE, you can install extension to access WSL system file.&lt;/p&gt;

&lt;p&gt;This is only a demo of using Linux WSL as our development environment. &lt;br&gt;
We can also install other tools for other programming languages.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/uYkNbdxf1Co"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Video: How to Install NVm (Node Version Manager) and Node.js in Windows 11





&lt;h3&gt;
  
  
  Reset Ubuntu
&lt;/h3&gt;

&lt;p&gt;Once we feel to have a clean dev environment, we can reset the Ubuntu from start. After reset the Ubuntu we will be prompted to input username and password again before start using Ubuntu.&lt;/p&gt;

&lt;p&gt;Follow steps below to reset Ubuntu:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On Windows, search and open &lt;code&gt;Settings&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On the navigation (left side) use up/down arrow to select &lt;code&gt;Apps&lt;/code&gt; and then press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; to move focus to selected &lt;code&gt;Apps&lt;/code&gt; section.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; to move focus to &lt;code&gt;Apps and Features&lt;/code&gt; then press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; several times until find &lt;code&gt;Apps list&lt;/code&gt;, which contains list of applications. Prior to the Apps list there is a search box to filter the apps.&lt;/li&gt;
&lt;li&gt;Use up / down arrow to look for 'Ubuntu' app.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; once to focus on the overflow button.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Enter&lt;/code&gt; on the &lt;code&gt;Advanced Options&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Tab&lt;/code&gt; multiple times to move focus to &lt;code&gt;Reset grouping&lt;/code&gt;. Afterward press &lt;code&gt;Tab&lt;/code&gt; 2 more times to focus on the &lt;code&gt;Reset&lt;/code&gt; button, then press &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;After Ubuntu app has been reset, go to &lt;code&gt;Windows Start Menu&lt;/code&gt; to search and run the Ubuntu app.&lt;/li&gt;
&lt;li&gt;Run the Ubuntu app then provide the prompted username and password. Ubuntu is now ready to be used again from the fresh start. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/elf4y2MdKb8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
Video: Reset Ubuntu WSL in Windows 11 using NVDA





&lt;h2&gt;
  
  
  Conclusion and Docker
&lt;/h2&gt;

&lt;p&gt;WSL, Windows Subsystem for Linux, is a breakthrough technology for developers to have multiple and different ecosystem in one machine.&lt;br&gt;
This option is much practical for software developers compare to use technology such as virtual machine,&lt;br&gt;
since developers mostly only want separation  down to OS layer and no separation required onn physical layers (memory allocation).&lt;/p&gt;

&lt;p&gt;Next, we are going to install Docker wich offers more portability and modularity.&lt;br&gt;
Docker natively runs on Linux. That is why we need to install WSL prior to installing Docker in Windows.&lt;/p&gt;

&lt;p&gt;Hope this post useful. Cheers!&lt;/p&gt;

</description>
      <category>wsl</category>
      <category>ubuntu</category>
      <category>node</category>
      <category>windows11</category>
    </item>
    <item>
      <title>VSCode - How to Jump between Points in a File</title>
      <dc:creator>wiscer</dc:creator>
      <pubDate>Mon, 19 Sep 2022 08:46:24 +0000</pubDate>
      <link>https://dev.to/wiscer/vscode-jumps-between-points-in-a-file-27d8</link>
      <guid>https://dev.to/wiscer/vscode-jumps-between-points-in-a-file-27d8</guid>
      <description>&lt;p&gt;This article contains tips to jump between points (combination of line &amp;amp; column number) in a single file
in VSCode for screen reader users (blind, visually impaired, etc).
&lt;/p&gt;

&lt;p&gt;This article is based on personal experience.
&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I often face situation where I have to jump from 1 point to another line back and forth in a single file.
It is a bit challenging for me since now I am a screen reader user. 
&lt;/p&gt;

&lt;p&gt;As an example, in JSON file below
I need to look for &lt;code&gt;sku&lt;/code&gt;s in &lt;code&gt;products&lt;/code&gt; to replace &lt;code&gt;sku&lt;/code&gt; (xxx) in the &lt;code&gt;cart&lt;/code&gt; array.
Imagine scenarios with much more products and more cart items.
It will require me to traverse through the &lt;code&gt;products&lt;/code&gt; for each &lt;code&gt;cart&lt;/code&gt; item.
&lt;/p&gt;

&lt;p&gt;For this tutorial let's just say &lt;code&gt;carts&lt;/code&gt;, that we need to fill in as a &lt;code&gt;work point&lt;/code&gt;.
And &lt;code&gt;sku&lt;/code&gt; field , that we will look for, as a &lt;code&gt;lookup point&lt;/code&gt;.
&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Sighted Users
&lt;/h2&gt;

&lt;p&gt;This is how a sighted user typically will complete the task:
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the  &lt;code&gt;name&lt;/code&gt; of the first &lt;code&gt;cart&lt;/code&gt; item. Cursor is at &lt;code&gt;work point&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Scroll to &lt;code&gt;products&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Scan through the &lt;code&gt;products&lt;/code&gt; until find the matching &lt;code&gt;name&lt;/code&gt; (&lt;code&gt;lookup point&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;sku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Scroll back to the first item of &lt;code&gt;cart&lt;/code&gt; (&lt;code&gt;work point&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;xxx&lt;/code&gt; with the copied &lt;code&gt;sku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Repeat from the beginning for the second item in &lt;code&gt;cart&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The steps above are pretty simple because a sighted user only need to scroll down/up without having to repeatedly press keys to navigate.
&lt;/p&gt;

&lt;h2&gt;
  
  
  Screen Reader Users
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Challenge
&lt;/h3&gt;

&lt;p&gt;SC users (Screen reader users), on the other hand, do not use scrolling devices.
They only use keyboards to give input to computer.
SC users have to press key up / down to 'scroll' the pages.
&lt;/p&gt;

&lt;p&gt;During the navigation process, SC users have to press up/down key to move cursor 1 line to read each line until reaching the intended 'section'.
It will require much longer time to complete simple task such as above, compared to sighted users.
&lt;/p&gt;

&lt;p&gt;Below are tips I used to  workaround the challenge.
&lt;/p&gt;

&lt;p&gt;Let's consider an initial condition for each tips
where the cursor is at &lt;code&gt;"name" : "Milk"&lt;/code&gt; (line 4).
&lt;/p&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;PgUp&lt;/code&gt; and &lt;code&gt;PgDn&lt;/code&gt; Keys
&lt;/h3&gt;

&lt;p&gt;Users can use &lt;code&gt;PgUp&lt;/code&gt;, to move up 1 page, and &lt;code&gt;PgDn&lt;/code&gt; to move down 1 page.
Until  approximately near the intended lines, the &lt;code&gt;lookup point&lt;/code&gt;, user can use arrow up / down to read each line to get to the &lt;code&gt;lookup point.
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The challenge SC users may have with this method
is to remember how many times they have to press &lt;code&gt;PgUp&lt;/code&gt; or &lt;code&gt;PgDn&lt;/code&gt; keys to jump back and forth betwen &lt;code&gt;work point&lt;/code&gt; to &lt;code&gt;lookup point&lt;/code&gt;.
The distance between &lt;code&gt;work point&lt;/code&gt; and &lt;code&gt;lookup point&lt;/code&gt; may change everytime lines are inserted or deleted between those 2 points.
&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Line Numbers
&lt;/h3&gt;

&lt;p&gt;Another way to jump is by remember the line number of 
the &lt;code&gt;work point&lt;/code&gt; and line number near the &lt;code&gt;lookup point&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;To jump to a certain line number in VSCode :
- Press `Ctrl` + ` G` to open a modal.
- Type in the destination line number, then press `Enter`.
&lt;/p&gt;

&lt;p&gt;With this method SC users have to remember the line numbers and 
they will change everytime a line is inserted or deleted between &lt;code&gt;work point&lt;/code&gt; and &lt;code&gt;lookup point&lt;/code&gt;.
&lt;/p&gt;

&lt;h3&gt;
  
  
  Find 'dummy' anchors
&lt;/h3&gt;

&lt;p&gt;This was the method I preferred compared to the previous ones.
We can use dummy anchors to mark the &lt;code&gt;work point&lt;/code&gt; and &lt;code&gt;lookup point&lt;/code&gt;.
Dummy anchor, in my own term, is a sequence of characters that not existed in the file.
&lt;/p&gt;

&lt;p&gt;For example we can type `aaa` 1 line above &lt;code&gt;work point&lt;/code&gt; and `bbb` near the &lt;code&gt;lookup point&lt;/code&gt;.
I use `aa` and `bbb` because I now there are no such substring in the related file
and it just faster to type those characters.
Then I use VSCode 'find' tool, press `Ctrl` + `F`, to jump between &lt;code&gt;work point&lt;/code&gt; and &lt;code&gt;lookup point&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;The downside of this method is we have to remember to remove those dummy anchors after being used,
and we have to move those dummy anchors if we want to change the jumping points.
This is still not the ideal solution to match the scrolling speed used by sighted users.
&lt;/p&gt;

&lt;h3&gt;
  
  
  Use multiple 'editor Group'
&lt;/h3&gt;

&lt;p&gt;This is the ideal method I found out a while ago.
&lt;/p&gt;

&lt;p&gt;'Editor group' is group of 1 or multiple files or tabs. 
One of the benefit of usin multiple editors is to compare same file of different version (commit) side by side.
We can also view the exactly same file version in multiple editor group at the same time. 
Any changes we make to file `xxx` in any editor group will instantly reflected in the same file `xxx` in other editor group.
&lt;/p&gt;

&lt;p&gt;When we start VSCode, by default, we will only have 1 editor group (Editor group 1).
Pressing `Ctrl` + `2` will open empty editor group 2, `Ctrl` + `3` will open empty editor group 3, and so on.
&lt;/p&gt;

&lt;p&gt;Below are the steps to jump between &lt;code&gt;work point&lt;/code&gt; and &lt;code&gt;lookup point&lt;/code&gt; back and forth :
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;\&lt;/code&gt; to open new editor group with the exact files currently being opened. The cursor will also at the same point (&lt;code&gt;work point&lt;/code&gt;), but editor group 2 is active now.&lt;/li&gt;
&lt;li&gt;Move the cursor to &lt;code&gt;lookup point&lt;/code&gt;, copy the required &lt;code&gt;sku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;1&lt;/code&gt;. This will move focus to editor group 1 with the cursor at the same position (&lt;code&gt;work point&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Paste the &lt;code&gt;sku&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;2&lt;/code&gt; to focus on the editor group 2. Cursor on the editor groop 2 is still at the &lt;code&gt;lookup point&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;Press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;1&lt;/code&gt; if we want to focus back to editor group 1.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We can use this method to jump between multiple points back and forth.
&lt;/p&gt;

&lt;p&gt;This method, IMHO, is faster than the 'scrolling' method commonly used by sighted users.
To close editor group2, just close all the file in the editor group 2.
Press `Ctrl` + `w` to close the currently focused file.
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I just found out about the 'multiple editor groups' method few weeks ago.
I am still trying to make that method a habit.
By far using multiple editor groups to jump between points really increase my productivity.
&lt;/p&gt;

&lt;p&gt;I had been looking for a perfect way to jump between multiple points for a long time.
By sharing my experience I hope this article could help some people, both sighted and screen reader users.
&lt;/p&gt;

&lt;p&gt;Good luck !&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>withscreenreader</category>
    </item>
  </channel>
</rss>
