<?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: QuickSign</title>
    <description>The latest articles on DEV Community by QuickSign (@quicksign).</description>
    <link>https://dev.to/quicksign</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%2F4040015%2Fb90ae358-2e58-4f22-bd21-4db9d76d15a0.PNG</url>
      <title>DEV Community: QuickSign</title>
      <link>https://dev.to/quicksign</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quicksign"/>
    <language>en</language>
    <item>
      <title>Building an ASL Learning App That Uses Computer Vision to Evaluate Your Signs in Real Time</title>
      <dc:creator>QuickSign</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:17:50 +0000</pubDate>
      <link>https://dev.to/quicksign/building-an-asl-learning-app-that-uses-computer-vision-to-evaluate-your-signs-in-real-time-4j8m</link>
      <guid>https://dev.to/quicksign/building-an-asl-learning-app-that-uses-computer-vision-to-evaluate-your-signs-in-real-time-4j8m</guid>
      <description>&lt;p&gt;We built QuickSign, a gamified American Sign Language (ASL) learning app that uses the user's webcam to evaluate whether they actually performed a sign correctly. Instead of only asking users to recognize signs, QuickSign analyzes handshape, location, movement, and palm orientation and provides feedback on what went wrong.&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://aslgame.vercel.app" rel="noopener noreferrer"&gt;https://aslgame.vercel.app&lt;/a&gt;&lt;/p&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuc2a5uw9nbq8n4lbfzrr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuc2a5uw9nbq8n4lbfzrr.png" alt=" " width="390" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why we started building this&lt;/p&gt;

&lt;p&gt;Learning a new language usually involves a lot of repetition.&lt;/p&gt;

&lt;p&gt;You learn a word, practice it, get feedback, and try again.&lt;/p&gt;

&lt;p&gt;But learning sign language has an interesting problem.&lt;/p&gt;

&lt;p&gt;A lot of digital learning tools can show you how a sign looks. They can ask you to identify a sign from a video or choose the correct answer from multiple options.&lt;/p&gt;

&lt;p&gt;But there is a difference between:&lt;/p&gt;

&lt;p&gt;"I know what this sign looks like."&lt;/p&gt;

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

&lt;p&gt;"I can actually produce this sign correctly."&lt;/p&gt;

&lt;p&gt;We wanted to build something focused on the second problem.&lt;/p&gt;

&lt;p&gt;So my co-founder Muhammad Saad and I started building QuickSign, a gamified ASL learning platform where users can learn signs and then perform them in front of their own webcam.&lt;/p&gt;

&lt;p&gt;The application analyzes the user's movements and provides feedback on their performance.&lt;/p&gt;

&lt;p&gt;The goal isn't just to tell someone that they got a sign wrong.&lt;/p&gt;

&lt;p&gt;The goal is to help them understand why.&lt;/p&gt;

&lt;p&gt;What QuickSign does&lt;/p&gt;

&lt;p&gt;The basic experience looks something like this:&lt;/p&gt;

&lt;p&gt;Learn a sign&lt;br&gt;
     ↓&lt;br&gt;
Practice the sign&lt;br&gt;
     ↓&lt;br&gt;
Turn on webcam&lt;br&gt;
     ↓&lt;br&gt;
Perform the sign&lt;br&gt;
     ↓&lt;br&gt;
Extract hand + pose landmarks&lt;br&gt;
     ↓&lt;br&gt;
Analyze handshape, location, movement, orientation&lt;br&gt;
     ↓&lt;br&gt;
Check the sign against its requirements&lt;br&gt;
     ↓&lt;br&gt;
Provide feedback&lt;/p&gt;

&lt;p&gt;For example, instead of simply returning:&lt;/p&gt;

&lt;p&gt;❌ Incorrect&lt;/p&gt;

&lt;p&gt;the system can evaluate individual components of the sign.&lt;/p&gt;

&lt;p&gt;Conceptually, the feedback might look like:&lt;/p&gt;

&lt;p&gt;Handshape       ✓&lt;br&gt;
Location        ✓&lt;br&gt;
Palm orientation ✓&lt;br&gt;
Movement        ✗&lt;/p&gt;

&lt;p&gt;This gives the learner something actionable to work on.&lt;/p&gt;

&lt;p&gt;The technology behind it&lt;/p&gt;

&lt;p&gt;QuickSign is built as a React and TypeScript web application.&lt;/p&gt;

&lt;p&gt;Our current stack includes:&lt;/p&gt;

&lt;p&gt;React 19&lt;br&gt;
TypeScript&lt;br&gt;
Vite&lt;br&gt;
Tailwind CSS&lt;br&gt;
Zustand&lt;br&gt;
Supabase&lt;br&gt;
Vercel&lt;br&gt;
MediaPipe Tasks API&lt;br&gt;
TensorFlow.js&lt;br&gt;
WebRTC&lt;br&gt;
PostHog&lt;/p&gt;

&lt;p&gt;The webcam-based recognition happens directly in the browser.&lt;/p&gt;

&lt;p&gt;We use MediaPipe hand and pose landmark detection to extract the information needed for recognition.&lt;/p&gt;

&lt;p&gt;The important part is that the recognition pipeline does not simply take one frame and ask:&lt;/p&gt;

&lt;p&gt;"Does this look like the sign?"&lt;/p&gt;

&lt;p&gt;Instead, we treat a sign as a collection of parameters.&lt;/p&gt;

&lt;p&gt;For our recognition architecture, these include:&lt;/p&gt;

&lt;p&gt;Handshape&lt;br&gt;
Location&lt;br&gt;
Movement&lt;br&gt;
Palm orientation&lt;br&gt;
Non-manual markers where applicable&lt;/p&gt;

&lt;p&gt;The exact parameters required depend on the sign being evaluated.&lt;/p&gt;

&lt;p&gt;The first big lesson: a single frame isn't enough&lt;/p&gt;

&lt;p&gt;This was probably one of the most important problems we encountered.&lt;/p&gt;

&lt;p&gt;We had a bug with our COFFEE sign recognition.&lt;/p&gt;

&lt;p&gt;The sign requires a specific movement involving the hands.&lt;/p&gt;

&lt;p&gt;Our original implementation checked whether the user's hands were approximately in the right position and whether the handshapes looked correct.&lt;/p&gt;

&lt;p&gt;The problem?&lt;/p&gt;

&lt;p&gt;Someone could hold two static fists in roughly the right position and pass the check.&lt;/p&gt;

&lt;p&gt;They weren't actually performing the sign.&lt;/p&gt;

&lt;p&gt;They were just holding a pose that happened to look similar to one frame of the sign.&lt;/p&gt;

&lt;p&gt;This taught us an important lesson:&lt;/p&gt;

&lt;p&gt;If a sign requires movement, you cannot reliably verify it from a single frame.&lt;/p&gt;

&lt;p&gt;So we changed our approach.&lt;/p&gt;

&lt;p&gt;Instead of only looking at the current frame, movement-based signs are evaluated using a rolling window of landmark history.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;Frame 1 ─┐&lt;br&gt;
Frame 2  │&lt;br&gt;
Frame 3  │&lt;br&gt;
Frame 4  ├──→ Movement analysis&lt;br&gt;
Frame 5  │&lt;br&gt;
Frame 6  │&lt;br&gt;
Frame 7 ─┘&lt;/p&gt;

&lt;p&gt;The system can now analyze how the hands moved over time rather than only where they are right now.&lt;/p&gt;

&lt;p&gt;This allows us to reason about things like:&lt;/p&gt;

&lt;p&gt;Linear movement&lt;br&gt;
Circular movement&lt;br&gt;
Repeated movement&lt;br&gt;
Movement direction&lt;br&gt;
Movement magnitude&lt;/p&gt;

&lt;p&gt;This was a major architectural change for us.&lt;/p&gt;

&lt;p&gt;It also changed how we thought about computer vision problems in general.&lt;/p&gt;

&lt;p&gt;A static image and a sequence of movements are fundamentally different problems.&lt;/p&gt;

&lt;p&gt;Our recognition architecture&lt;/p&gt;

&lt;p&gt;The recognition engine is designed around sign definitions.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding every sign into separate verification logic, we define the requirements for each sign as structured data.&lt;/p&gt;

&lt;p&gt;Conceptually, a sign might specify:&lt;/p&gt;

&lt;p&gt;Sign&lt;br&gt;
├── Handshape requirements&lt;br&gt;
├── Spatial relationship&lt;br&gt;
├── Movement requirements&lt;br&gt;
├── Palm orientation&lt;br&gt;
└── Non-manual markers&lt;/p&gt;

&lt;p&gt;The generic verification engine then evaluates the required parameters.&lt;/p&gt;

&lt;p&gt;A sign only passes if every required parameter meets its own threshold.&lt;/p&gt;

&lt;p&gt;We deliberately avoided simply averaging everything into one score.&lt;/p&gt;

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

&lt;p&gt;Handshape:          95%&lt;br&gt;
Location:           92%&lt;br&gt;
Palm orientation:   90%&lt;br&gt;
Movement:           30%&lt;/p&gt;

&lt;p&gt;An average score might still look reasonably high.&lt;/p&gt;

&lt;p&gt;But if movement is essential to the sign, that shouldn't be enough.&lt;/p&gt;

&lt;p&gt;The user didn't perform the sign correctly.&lt;/p&gt;

&lt;p&gt;So our approach is closer to:&lt;/p&gt;

&lt;p&gt;Required parameter 1 → PASS&lt;br&gt;
Required parameter 2 → PASS&lt;br&gt;
Required parameter 3 → PASS&lt;br&gt;
Required parameter 4 → FAIL&lt;/p&gt;

&lt;p&gt;Overall → FAIL&lt;/p&gt;

&lt;p&gt;This makes the system more strict, but also makes the feedback more meaningful.&lt;/p&gt;

&lt;p&gt;Where machine learning fits in&lt;/p&gt;

&lt;p&gt;We also experimented with machine learning for sign recognition.&lt;/p&gt;

&lt;p&gt;Our current system uses a small Bi-GRU classifier built with TensorFlow.js.&lt;/p&gt;

&lt;p&gt;However, we made a deliberate architectural decision:&lt;/p&gt;

&lt;p&gt;The ML model is not allowed to grant a successful sign on its own.&lt;/p&gt;

&lt;p&gt;Instead, it acts as a veto or disambiguation layer.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;Rule Engine&lt;br&gt;
     │&lt;br&gt;
     ├── FAIL ───────→ FAIL&lt;br&gt;
     │&lt;br&gt;
     └── PASS&lt;br&gt;
           │&lt;br&gt;
           ↓&lt;br&gt;
       Bi-GRU Model&lt;br&gt;
           │&lt;br&gt;
      ┌────┴────┐&lt;br&gt;
      │         │&lt;br&gt;
    VETO      ACCEPT&lt;br&gt;
      │         │&lt;br&gt;
      ↓         ↓&lt;br&gt;
     FAIL      PASS&lt;/p&gt;

&lt;p&gt;This means the machine learning model can catch potential false positives, but it cannot turn an obviously incorrect performance into a successful one.&lt;/p&gt;

&lt;p&gt;We chose this approach because the rule engine gives us something very valuable:&lt;/p&gt;

&lt;p&gt;Interpretability.&lt;/p&gt;

&lt;p&gt;If a user fails a sign, we can potentially explain which component caused the failure.&lt;/p&gt;

&lt;p&gt;A black-box classifier might simply say:&lt;/p&gt;

&lt;p&gt;"The model predicts this isn't COFFEE."&lt;/p&gt;

&lt;p&gt;Our system can instead reason about the individual requirements.&lt;/p&gt;

&lt;p&gt;That makes the feedback much more useful for learning.&lt;/p&gt;

&lt;p&gt;The second big lesson: passing automated tests doesn't mean the product works&lt;/p&gt;

&lt;p&gt;Another challenge appeared when we started testing our recognition system with real people.&lt;/p&gt;

&lt;p&gt;Some signs passed our automated tests perfectly.&lt;/p&gt;

&lt;p&gt;Then a real human tried them.&lt;/p&gt;

&lt;p&gt;And they failed.&lt;/p&gt;

&lt;p&gt;At first, this was confusing.&lt;/p&gt;

&lt;p&gt;We had automated fixtures.&lt;/p&gt;

&lt;p&gt;We had regression tests.&lt;/p&gt;

&lt;p&gt;We had confusor tests designed to catch false positives.&lt;/p&gt;

&lt;p&gt;Everything looked good.&lt;/p&gt;

&lt;p&gt;But our tests were based too heavily on idealized or synthetic movements.&lt;/p&gt;

&lt;p&gt;Real people don't move like perfect mathematical models.&lt;/p&gt;

&lt;p&gt;People have different:&lt;/p&gt;

&lt;p&gt;Arm lengths&lt;br&gt;
Camera positions&lt;br&gt;
Sitting distances&lt;br&gt;
Movement speeds&lt;br&gt;
Hand sizes&lt;br&gt;
Execution styles&lt;/p&gt;

&lt;p&gt;The result was a classic problem:&lt;/p&gt;

&lt;p&gt;The system worked in our test environment but didn't work reliably in the real world.&lt;/p&gt;

&lt;p&gt;We had to start calibrating our thresholds against actual human performances.&lt;/p&gt;

&lt;p&gt;This was a big shift in our development process.&lt;/p&gt;

&lt;p&gt;We learned that for computer vision applications, automated tests are necessary, but they aren't sufficient.&lt;/p&gt;

&lt;p&gt;You need both:&lt;/p&gt;

&lt;p&gt;Automated tests&lt;br&gt;
       +&lt;br&gt;
Real-world calibration&lt;br&gt;
       +&lt;br&gt;
Actual human testing&lt;/p&gt;

&lt;p&gt;All three reveal different classes of problems.&lt;/p&gt;

&lt;p&gt;Making recognition work at different camera distances&lt;/p&gt;

&lt;p&gt;Another problem we had to solve was scale.&lt;/p&gt;

&lt;p&gt;A user's hands might occupy a large part of the camera frame.&lt;/p&gt;

&lt;p&gt;Or they might sit farther away.&lt;/p&gt;

&lt;p&gt;If we used raw pixel distances for spatial relationships, the same sign could look completely different depending on how close the user was to the webcam.&lt;/p&gt;

&lt;p&gt;So instead of relying on absolute pixel measurements, our spatial thresholds are normalized using the user's shoulder width.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;/p&gt;

&lt;p&gt;Raw pixel distance&lt;br&gt;
        ↓&lt;br&gt;
Normalize relative to body scale&lt;br&gt;
        ↓&lt;br&gt;
Compare spatial relationship&lt;/p&gt;

&lt;p&gt;This makes the recognition system less dependent on how close the user is sitting to the camera.&lt;/p&gt;

&lt;p&gt;It's a small implementation detail, but it makes a big difference in real-world usability.&lt;/p&gt;

&lt;p&gt;Building the actual learning experience&lt;/p&gt;

&lt;p&gt;We didn't want QuickSign to feel like a computer vision demo.&lt;/p&gt;

&lt;p&gt;The goal was to make it feel like a game.&lt;/p&gt;

&lt;p&gt;We've built multiple learning systems around the recognition engine.&lt;/p&gt;

&lt;p&gt;Currently, QuickSign includes:&lt;/p&gt;

&lt;p&gt;Lessons&lt;br&gt;
Practice mode&lt;br&gt;
Story mode&lt;br&gt;
Speed challenges&lt;br&gt;
Streaks&lt;br&gt;
Badges&lt;br&gt;
Ranks&lt;br&gt;
A shop&lt;br&gt;
Spaced repetition&lt;br&gt;
Multiplayer rooms&lt;br&gt;
PvP duels&lt;/p&gt;

&lt;p&gt;The app currently has three scenarios:&lt;/p&gt;

&lt;p&gt;☕ Coffee Shop&lt;br&gt;
🏥 Hospital&lt;br&gt;
🏫 Classroom&lt;/p&gt;

&lt;p&gt;Across these scenarios, the current system contains 51 signs.&lt;/p&gt;

&lt;p&gt;The idea is to teach signs in context rather than presenting the learner with a completely disconnected list of vocabulary.&lt;/p&gt;

&lt;p&gt;Multiplayer was another interesting challenge&lt;/p&gt;

&lt;p&gt;We also wanted users to be able to practice together.&lt;/p&gt;

&lt;p&gt;Instead of building a dedicated game server for every multiplayer interaction, we use:&lt;/p&gt;

&lt;p&gt;WebRTC for peer-to-peer communication&lt;br&gt;
Supabase Realtime for signaling&lt;/p&gt;

&lt;p&gt;This allows us to build multiplayer functionality without requiring a traditional multiplayer game backend.&lt;/p&gt;

&lt;p&gt;There are still plenty of challenges with this architecture, especially around connection reliability and NAT traversal, but it has been an interesting part of the project.&lt;/p&gt;

&lt;p&gt;Privacy was important to us&lt;/p&gt;

&lt;p&gt;Because QuickSign uses a webcam, privacy was something we wanted to think about from the beginning.&lt;/p&gt;

&lt;p&gt;The actual sign recognition pipeline runs client-side in the browser.&lt;/p&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l3eh3mkmyguko920vwq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1l3eh3mkmyguko920vwq.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The webcam video and landmark data used for recognition are not streamed to a server for the recognition process.&lt;/p&gt;

&lt;p&gt;This means the recognition itself can happen locally:&lt;/p&gt;

&lt;p&gt;User webcam&lt;br&gt;
     ↓&lt;br&gt;
Browser&lt;br&gt;
     ↓&lt;br&gt;
MediaPipe&lt;br&gt;
     ↓&lt;br&gt;
Landmarks&lt;br&gt;
     ↓&lt;br&gt;
Recognition engine&lt;br&gt;
     ↓&lt;br&gt;
Feedback&lt;/p&gt;

&lt;p&gt;No recognition server is required for the core experience.&lt;/p&gt;

&lt;p&gt;For a product that asks users to point a camera at themselves, we believe this is an important architectural decision.&lt;/p&gt;

&lt;p&gt;We're still learning about ASL itself&lt;/p&gt;

&lt;p&gt;There's also an important limitation we want to be transparent about.&lt;/p&gt;

&lt;p&gt;Neither of us is Deaf.&lt;/p&gt;

&lt;p&gt;We're developers who are building technology around ASL education, and we know that this comes with a responsibility to approach the subject carefully.&lt;/p&gt;

&lt;p&gt;ASL isn't simply "English represented with your hands."&lt;/p&gt;

&lt;p&gt;It's a real language with its own linguistic structure, grammar, and cultural context.&lt;/p&gt;

&lt;p&gt;We're still learning, and we don't want to pretend that building a technically impressive recognition system automatically makes us experts in ASL.&lt;/p&gt;

&lt;p&gt;Our goal is to keep improving the product, listen to feedback, and work toward making the learning experience more accurate, respectful, and useful.&lt;/p&gt;

&lt;p&gt;What we're working on next&lt;/p&gt;

&lt;p&gt;QuickSign is currently live and we're preparing for a broader public launch.&lt;/p&gt;

&lt;p&gt;Our immediate focus is:&lt;/p&gt;

&lt;p&gt;Improving recognition accuracy with real users&lt;br&gt;
Expanding the number of signs&lt;br&gt;
Improving calibration&lt;br&gt;
Making feedback more useful&lt;br&gt;
Continuing to test the recognition engine against real-world performances&lt;br&gt;
Growing the learning content&lt;br&gt;
Getting feedback from ASL learners and people with relevant expertise&lt;/p&gt;

&lt;p&gt;The biggest metric we're watching isn't how many people visit the website.&lt;/p&gt;

&lt;p&gt;It's whether someone:&lt;/p&gt;

&lt;p&gt;Completes their first lesson.&lt;br&gt;
Finds the experience useful.&lt;br&gt;
Comes back and continues learning.&lt;/p&gt;

&lt;p&gt;For us, that's a much better indication that we're actually solving a problem.&lt;/p&gt;

&lt;p&gt;Try QuickSign&lt;/p&gt;

&lt;p&gt;If you're interested in computer vision, machine learning, language learning, or just want to see what we've built, we'd love for you to try it.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://aslgame.vercel.app" rel="noopener noreferrer"&gt;https://aslgame.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We're especially interested in hearing from developers who have built applications involving:&lt;/p&gt;

&lt;p&gt;Computer vision&lt;br&gt;
Real-time ML&lt;br&gt;
Browser-based AI&lt;br&gt;
Human motion tracking&lt;br&gt;
EdTech&lt;br&gt;
Language learning&lt;/p&gt;

&lt;p&gt;One of the biggest lessons we've learned so far is that getting a computer vision system to work in a controlled demo is one thing.&lt;/p&gt;

&lt;p&gt;Getting it to work reliably for real humans, with different cameras, different environments, and different ways of performing the same task is a completely different challenge.&lt;/p&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2su70wb6nbagiq5iwcy0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2su70wb6nbagiq5iwcy0.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've worked on something similar, I'd love to hear what you learned.&lt;/p&gt;

&lt;p&gt;What was the biggest gap you encountered between "it works in the demo" and "it actually works for users"?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>testing</category>
      <category>webdev</category>
      <category>reviews</category>
    </item>
  </channel>
</rss>
