<?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: peekvision</title>
    <description>The latest articles on DEV Community by peekvision (@peekvision_io).</description>
    <link>https://dev.to/peekvision_io</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4128550%2F95716adc-d4d7-41e6-be41-c218ca6f63f9.png</url>
      <title>DEV Community: peekvision</title>
      <link>https://dev.to/peekvision_io</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/peekvision_io"/>
    <language>en</language>
    <item>
      <title>Building an Accessible Browser-Based Vision Test with Flutter</title>
      <dc:creator>peekvision</dc:creator>
      <pubDate>Wed, 16 Sep 2026 18:36:28 +0000</pubDate>
      <link>https://dev.to/peekvision_io/building-an-accessible-browser-based-vision-test-with-flutter-3bgb</link>
      <guid>https://dev.to/peekvision_io/building-an-accessible-browser-based-vision-test-with-flutter-3bgb</guid>
      <description>&lt;p&gt;Building an online vision screening tool sounds simple at first: display letters, ask the user whether they can read them, and progressively reduce the letter size.&lt;/p&gt;

&lt;p&gt;In practice, building something usable across desktop and mobile browsers involves much more than that.&lt;/p&gt;

&lt;p&gt;I recently worked on &lt;strong&gt;PeekVision&lt;/strong&gt;, a browser-based visual acuity and color vision screening application built with Flutter. One of the most interesting parts of the project was making the test usable across different devices while also adding an accessible, voice-assisted screening option.&lt;/p&gt;

&lt;p&gt;You can try the project here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/" rel="noopener noreferrer"&gt;https://www.peekvision.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Methodology and limitations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/methodology.html" rel="noopener noreferrer"&gt;https://www.peekvision.io/methodology.html&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Goal
&lt;/h2&gt;

&lt;p&gt;The goal of PeekVision is to provide a simple preliminary browser-based vision screening experience.&lt;/p&gt;

&lt;p&gt;The application currently includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distance visual acuity screening&lt;/li&gt;
&lt;li&gt;Near / reading vision screening&lt;/li&gt;
&lt;li&gt;Separate right-eye, left-eye, and both-eyes testing&lt;/li&gt;
&lt;li&gt;Color vision screening&lt;/li&gt;
&lt;li&gt;An accessible vision test&lt;/li&gt;
&lt;li&gt;Voice-assisted responses&lt;/li&gt;
&lt;li&gt;A screening report&lt;/li&gt;
&lt;li&gt;Mobile and desktop browser support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is important to emphasize that this is a &lt;strong&gt;screening tool&lt;/strong&gt;, not a diagnostic medical device.&lt;/p&gt;

&lt;p&gt;Screen size, browser zoom, display scaling, viewing distance, lighting, and device configuration can affect the results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Browser-Based Vision Testing Is Difficult
&lt;/h2&gt;

&lt;p&gt;Traditional eye charts are designed around a known physical size and a known viewing distance.&lt;/p&gt;

&lt;p&gt;A browser does not give us that certainty.&lt;/p&gt;

&lt;p&gt;Two devices may both report a width of 400 logical pixels, but the physical size of those pixels can be very different.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A phone&lt;/li&gt;
&lt;li&gt;A tablet&lt;/li&gt;
&lt;li&gt;A laptop&lt;/li&gt;
&lt;li&gt;A desktop monitor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;may all render the same Flutter widget differently in physical space.&lt;/p&gt;

&lt;p&gt;That means browser-based visual acuity should be treated as a &lt;strong&gt;screening estimate&lt;/strong&gt;, especially at very small letter sizes.&lt;/p&gt;

&lt;p&gt;For PeekVision, the methodology clearly communicates this limitation instead of presenting browser measurements as clinically calibrated Snellen measurements.&lt;/p&gt;




&lt;h2&gt;
  
  
  Progressive Visual Acuity Testing
&lt;/h2&gt;

&lt;p&gt;The standard test begins with larger letters and progressively moves toward smaller levels.&lt;/p&gt;

&lt;p&gt;A simplified progression looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// approximately 20/50&lt;/span&gt;
  &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// approximately 20/40&lt;/span&gt;
  &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// approximately 20/32&lt;/span&gt;
  &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// approximately 20/25&lt;/span&gt;
  &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// approximately 20/20&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// approximately 20/16&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// approximately 20/13&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row contains five letters.&lt;/p&gt;

&lt;p&gt;The user selects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;I Can Read&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;I Can't Read&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If they can read the row, the application advances to a smaller level.&lt;/p&gt;

&lt;p&gt;If they cannot, the most recent successfully read level is recorded.&lt;/p&gt;

&lt;p&gt;The same process is performed for:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Right eye&lt;/li&gt;
&lt;li&gt;Left eye&lt;/li&gt;
&lt;li&gt;Both eyes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allows the report to show differences between the two eyes as well as combined vision.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Five Letters?
&lt;/h2&gt;

&lt;p&gt;Using multiple letters is more useful than showing a single character because it reduces the chance of a correct response simply through guessing.&lt;/p&gt;

&lt;p&gt;PeekVision generates five-character rows using a restricted letter set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;alphabet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'CDHKNORSVZ'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The row is generated dynamically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;alphabet&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alphabet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact letters are intentionally not announced during the standard test.&lt;/p&gt;




&lt;h2&gt;
  
  
  Accessibility Was a Separate Design Problem
&lt;/h2&gt;

&lt;p&gt;A traditional visual-acuity interface can still be difficult for users who have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;limited vision&lt;/li&gt;
&lt;li&gt;difficulty locating small controls&lt;/li&gt;
&lt;li&gt;motor limitations&lt;/li&gt;
&lt;li&gt;difficulty reading instructions&lt;/li&gt;
&lt;li&gt;screen-reader or voice interaction preferences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of simply enlarging the normal interface, PeekVision includes a separate &lt;strong&gt;Accessible Vision Test&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The accessible workflow uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high contrast&lt;/li&gt;
&lt;li&gt;large targets&lt;/li&gt;
&lt;li&gt;simplified controls&lt;/li&gt;
&lt;li&gt;spoken instructions&lt;/li&gt;
&lt;li&gt;speech recognition&lt;/li&gt;
&lt;li&gt;manual fallback controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The letters themselves are never spoken aloud, because doing so would invalidate the test.&lt;/p&gt;




&lt;h2&gt;
  
  
  Voice-Assisted Interaction
&lt;/h2&gt;

&lt;p&gt;The accessible mode uses text-to-speech for instructions and speech recognition for user responses.&lt;/p&gt;

&lt;p&gt;Conceptually, the flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Speak instruction
      ↓
Display five letters
      ↓
Wait for user response
      ↓
Recognize "I can read" or "I can't read"
      ↓
Advance to next level
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A manual button remains available because microphone permissions and speech recognition support vary between browsers and devices.&lt;/p&gt;

&lt;p&gt;This fallback is important for accessibility.&lt;/p&gt;

&lt;p&gt;Accessibility should not depend on a single input method.&lt;/p&gt;




&lt;h2&gt;
  
  
  Responsive Design Became More Important Than Expected
&lt;/h2&gt;

&lt;p&gt;One of the most practical challenges came from mobile screens.&lt;/p&gt;

&lt;p&gt;On desktop, the visual acuity setup page had enough room for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the test type selector&lt;/li&gt;
&lt;li&gt;vision-correction selector&lt;/li&gt;
&lt;li&gt;test-distance text&lt;/li&gt;
&lt;li&gt;instructions&lt;/li&gt;
&lt;li&gt;the letter row&lt;/li&gt;
&lt;li&gt;response buttons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On a smaller mobile viewport, the same layout could push the letters outside the available area.&lt;/p&gt;

&lt;p&gt;The solution was not simply to shrink everything.&lt;/p&gt;

&lt;p&gt;Shrinking vision-test letters would directly affect the purpose of the interface.&lt;/p&gt;

&lt;p&gt;Instead, the mobile layout changes once the active test begins.&lt;/p&gt;

&lt;p&gt;During setup, the user sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Test type
Vision correction
Viewing distance
Instructions
Start test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the user starts testing, those controls are hidden on small screens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testing Right Eye
Five-letter row
Screening level
I Can Read
I Can't Read
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This frees vertical space while preserving the important testing elements.&lt;/p&gt;

&lt;p&gt;A simplified Flutter condition looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;isMobile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;MediaQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;isActivelyTesting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testingRight&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testingLeft&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt;
    &lt;span class="n"&gt;stage&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Stage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testingBoth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isMobile&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;isActivelyTesting&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Show configuration controls.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was much better than reducing the letter size.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preventing Letter Clipping
&lt;/h2&gt;

&lt;p&gt;Even after simplifying the mobile layout, very large letters could potentially exceed their available space.&lt;/p&gt;

&lt;p&gt;Using &lt;code&gt;FittedBox&lt;/code&gt; provides an additional safety layer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;FittedBox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nl"&gt;fit:&lt;/span&gt; &lt;span class="n"&gt;BoxFit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scaleDown&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;maxLines:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;textAlign:&lt;/span&gt; &lt;span class="n"&gt;TextAlign&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&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;p&gt;The goal is to prevent accidental clipping while still allowing the intended letter-sizing logic to control the test.&lt;/p&gt;




&lt;h2&gt;
  
  
  Distance and Near Vision
&lt;/h2&gt;

&lt;p&gt;PeekVision supports two screening modes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Distance vision
&lt;/h3&gt;

&lt;p&gt;The user is instructed to remain approximately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10 ft / 3 m&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;from the screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Near vision
&lt;/h3&gt;

&lt;p&gt;The screen is held approximately:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;40 cm / 16 in&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;from the eyes.&lt;/p&gt;

&lt;p&gt;The application records which screening mode was used so the report can distinguish near and distance results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Screen Calibration Matters
&lt;/h2&gt;

&lt;p&gt;One of the biggest limitations of online vision tests is physical screen calibration.&lt;/p&gt;

&lt;p&gt;CSS pixels, Flutter logical pixels, and physical millimeters are not necessarily equivalent across devices.&lt;/p&gt;

&lt;p&gt;A future improvement could allow the user to calibrate the display against a known physical object.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Place a standard-size card against the screen
          ↓
Adjust an on-screen rectangle
          ↓
Calculate pixels per millimeter
          ↓
Use the value when sizing optotypes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with calibration, browser zoom, operating-system scaling, viewing distance, and posture can still affect the result.&lt;/p&gt;

&lt;p&gt;That is why the current application clearly describes its result as preliminary screening.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reporting Results Clearly
&lt;/h2&gt;

&lt;p&gt;A screening application should not simply return:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;20/40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without context.&lt;/p&gt;

&lt;p&gt;PeekVision reports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Right Eye (OD)&lt;/li&gt;
&lt;li&gt;Left Eye (OS)&lt;/li&gt;
&lt;li&gt;Both Eyes (OU)&lt;/li&gt;
&lt;li&gt;Screening level&lt;/li&gt;
&lt;li&gt;Test type&lt;/li&gt;
&lt;li&gt;Correction used&lt;/li&gt;
&lt;li&gt;Test distance&lt;/li&gt;
&lt;li&gt;Comparison with the normal 20/20 reference&lt;/li&gt;
&lt;li&gt;Eye-to-eye comparison&lt;/li&gt;
&lt;li&gt;Screening limitations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For very small letter levels, the report explicitly warns that the result is sensitive to physical display calibration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Color Vision Screening
&lt;/h2&gt;

&lt;p&gt;PeekVision also includes a color vision screening workflow.&lt;/p&gt;

&lt;p&gt;Color screening has a different set of browser limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;brightness&lt;/li&gt;
&lt;li&gt;display color profile&lt;/li&gt;
&lt;li&gt;Night Shift / Night Mode&lt;/li&gt;
&lt;li&gt;True Tone&lt;/li&gt;
&lt;li&gt;blue-light filters&lt;/li&gt;
&lt;li&gt;room lighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of those variables, online color plate results should also be treated as preliminary screening rather than a diagnosis.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Lesson From Building It
&lt;/h2&gt;

&lt;p&gt;The biggest lesson from this project was that accessibility and responsive design should not be added at the end.&lt;/p&gt;

&lt;p&gt;For a visual application, accessibility changes the architecture.&lt;/p&gt;

&lt;p&gt;The correct question was not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How can I make the desktop interface smaller?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What information does the user actually need at this stage of the test?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That led to a cleaner mobile testing interface while preserving the more detailed setup screen.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technology
&lt;/h2&gt;

&lt;p&gt;PeekVision is built primarily with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;Flutter Web&lt;/li&gt;
&lt;li&gt;Text-to-speech&lt;/li&gt;
&lt;li&gt;Speech recognition&lt;/li&gt;
&lt;li&gt;Responsive Material UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is designed to run directly in a modern web browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try PeekVision
&lt;/h2&gt;

&lt;p&gt;Live application:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/" rel="noopener noreferrer"&gt;https://www.peekvision.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Visual acuity information:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/visual-acuity-test.html" rel="noopener noreferrer"&gt;https://www.peekvision.io/visual-acuity-test.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accessible vision screening:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/accessible-vision-test.html" rel="noopener noreferrer"&gt;https://www.peekvision.io/accessible-vision-test.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Methodology and limitations:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.peekvision.io/methodology.html" rel="noopener noreferrer"&gt;https://www.peekvision.io/methodology.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/pradeepsambamurthy/vision_scanner_flutter" rel="noopener noreferrer"&gt;https://github.com/pradeepsambamurthy/vision_scanner_flutter&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Note
&lt;/h2&gt;

&lt;p&gt;Browser-based vision screening can make basic screening more accessible, but it should not be confused with a comprehensive eye examination.&lt;/p&gt;

&lt;p&gt;A browser cannot currently reproduce every controlled condition of a professional clinical test.&lt;/p&gt;

&lt;p&gt;The interesting engineering challenge is therefore not simply displaying an eye chart.&lt;/p&gt;

&lt;p&gt;It is designing a useful screening experience while being transparent about what the technology can and cannot measure.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>healthtech</category>
      <category>flutter</category>
    </item>
  </channel>
</rss>
