<?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: Priyanka P</title>
    <description>The latest articles on DEV Community by Priyanka P (@priyanka93).</description>
    <link>https://dev.to/priyanka93</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%2F1634070%2F90af65c2-791e-4379-b3ea-6532d309c9f4.jpg</url>
      <title>DEV Community: Priyanka P</title>
      <link>https://dev.to/priyanka93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/priyanka93"/>
    <language>en</language>
    <item>
      <title>StudyNova: a study tool that shows its sources, built at HackUMass XIV</title>
      <dc:creator>Priyanka P</dc:creator>
      <pubDate>Sun, 15 Nov 2026 12:24:46 +0000</pubDate>
      <link>https://dev.to/priyanka93/studynova-a-study-tool-that-shows-its-sources-built-at-hackumass-xiv-6b</link>
      <guid>https://dev.to/priyanka93/studynova-a-study-tool-that-shows-its-sources-built-at-hackumass-xiv-6b</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the MLH x DEV Writing Challenge.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;At HackUMass XIV, the three of us built &lt;strong&gt;StudyNova&lt;/strong&gt;, a study tool that uses only your own course materials and lets you trace every piece of information back to its source.&lt;/p&gt;

&lt;p&gt;The problem is something most students can relate to. Lecture slides are stored in one place, PDFs in another, and recordings somewhere else. When it is time to prepare for an exam, you end up going through all of them again. Even when you get a practice question wrong, it is not always clear what went wrong. Sometimes the problem is not the concept in the question itself, but an earlier topic that you never fully understood. Most AI study tools do not make this any easier. They give you answers, often confidently, but rarely show you how to verify them.&lt;/p&gt;

&lt;p&gt;StudyNova brings together the slides, PDFs, web pages and lecture recordings you already have and uses them in four ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Maps&lt;/strong&gt; the important concepts and their dependencies, with a supporting page reference for every connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quizzes&lt;/strong&gt; you using your own course materials, with a citation attached to every question.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traces&lt;/strong&gt; incorrect answers back through the prerequisite concepts to identify what you are most likely missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plans&lt;/strong&gt; your revision based on those gaps, giving more weight to concepts that appear frequently in your past exams.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a question cannot be answered using your uploaded materials, StudyNova tells you that the information is "not in your materials" rather than making something up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live site:&lt;/strong&gt; &lt;a href="https://studynova.ink" rel="noopener noreferrer"&gt;studynova.ink&lt;/a&gt;. The landing page explains the application, while the actual workspace is accessible through a team login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video:&lt;/strong&gt; {&lt;a href="https://youtu.be/FAQxpiCUJQs" rel="noopener noreferrer"&gt;https://youtu.be/FAQxpiCUJQs&lt;/a&gt;}&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code:&lt;/strong&gt; &lt;a href="https://github.com/Priyanka-Purushotham5/studyweave" rel="noopener noreferrer"&gt;github.com/Priyanka-Purushotham5/studyweave&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;![The StudyNova concept map: concepts shown as stars, coloured by readiness]&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%2Fbzl5lwbgnri17ivjdk9f.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%2Fbzl5lwbgnri17ivjdk9f.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;![After a wrong answer, a gold path leads to the likely gap, Chain rule, with the quote from the lecture slides]&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%2Fcbyxan9aytrvmer0ondy.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%2Fcbyxan9aytrvmer0ondy.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One interaction captures what we wanted StudyNova to do. Imagine answering the question, "Which rule does backpropagation apply layer by layer?" with &lt;em&gt;Product rule&lt;/em&gt;. StudyNova marks the answer incorrect and traces the prerequisite links backwards, highlighting &lt;strong&gt;Chain rule&lt;/strong&gt; in gold as your weakest prerequisite. Alongside the highlighted concept, it shows the exact sentence from your Lecture 7 slides that explains the rule. The revision plan then moves Chain rule to the top of your study list.&lt;/p&gt;

&lt;p&gt;![The revision plan, with Chain rule first]&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%2Fcm06x4kp2k0j1y08cx32.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%2Fcm06x4kp2k0j1y08cx32.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;We divided StudyNova into three modules, with one person responsible for each and a strict, one-way communication flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser (web app + Chrome extension)
              |
              v
API (Node, MongoDB Atlas)
              |
              v
AI service (Python, Gemini)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The browser communicates only with the API, which in turn communicates with the AI service. The AI service is stateless and is the only component that makes calls to Gemini.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We started with the contracts.&lt;/strong&gt; During the first few hours, we defined every JSON structure that would pass between the modules using JSON Schema. We also created a small demo module in &lt;code&gt;fixtures/&lt;/code&gt;. Each person could then develop independently against a mock of the neighbouring module, using those fixtures. The AI service had a fake Gemini client, the API had a fake AI client, and the web app used mock handlers. This meant nobody had to wait for another person to finish their part before getting started. We also configured CI to validate every fixture against its corresponding schema on each pull request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every quote is verified in code.&lt;/strong&gt; This is probably the part of the project I am most proud of. Whenever the model generates a concept, a connection between concepts or a question, it also provides a supporting quote and the page where that information appears. Before anything is shown to the student, the AI service checks whether the quote actually exists on the specified page. The check accounts for differences in case, whitespace, curly quotation marks and hyphenated line breaks. Anything that cannot be verified is discarded and counted rather than displayed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recent attempts have more influence on readiness.&lt;/strong&gt; For each concept, we calculate readiness by giving more weight to recent attempts. The latest attempt is considered first:&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;R&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;100&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mop"&gt;&lt;span class="mop op-symbol small-op"&gt;∑&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0.&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;



&lt;p&gt;Here, 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;a&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 is 1 for a correct answer and 0 for an incorrect one. For example, a sequence of right, wrong, right gives a readiness score of 67.&lt;/p&gt;

&lt;p&gt;Revision priority is calculated as:&lt;/p&gt;


&lt;div class="katex-element"&gt;
  &lt;span class="katex-display"&gt;&lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;priority&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;exam&amp;nbsp;weight&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;×&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mopen"&gt;(&lt;/span&gt;&lt;span class="mord"&gt;100&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;−&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;readiness&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;


&lt;p&gt;Exam weight represents the number of past papers in which that concept appears.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The gap trace is deterministic.&lt;/strong&gt; Instead of asking the model to guess why a student got something wrong, we follow the prerequisite links backwards and identify the weakest ancestor concept. A concept is labelled "likely gap" if it has at least two attempts and a readiness score below 40. Otherwise, it is labelled "possible gap". We deliberately avoid claiming that we know the exact reason behind a wrong answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lecture captions use the same terminology as the slides.&lt;/strong&gt; To improve transcription accuracy, we build a glossary from the lecture slides and pass it to the transcription process. We then use fuzzy matching to flag likely transcription mistakes, such as "back propagation" being recognised instead of "backpropagation". If a student corrects the same word twice, that correction is applied automatically the next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Gemini API:&lt;/strong&gt; Used for concept extraction, prerequisite links, question generation, grounded answers, past-paper tagging, 768-dimensional embeddings and lecture transcription. All Gemini calls go through a single client file with a fake counterpart, so tests can run without an API key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MongoDB Atlas:&lt;/strong&gt; Stores subjects, modules, resources, concepts, attempts and readiness scores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vultr:&lt;/strong&gt; The complete application runs in Docker on a Vultr Ubuntu server, with Caddy handling HTTPS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Actions:&lt;/strong&gt; Runs the AI service, API, web, sign-in and contract tests on every pull request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What went well.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Starting with clearly defined contracts was probably the best decision we made. All three of us could work in parallel from the first few hours, and when the API was connected to the actual AI service for the first time, the data structures already matched. We did not have to spend time fixing integration issues caused by different assumptions about how the modules should communicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What surprised us.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;A test that passed with mocks failed against the real API.&lt;/em&gt; Mock responses arrive immediately, but the actual API takes a little time to respond. Our browser test was reading the next question before it had finished loading, which meant it ended up answering the wrong question. After logging every request, we found that the question displayed on screen and the question ID being submitted were off by one.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Our animations caused problems during the accessibility audit.&lt;/em&gt; Text that fades in briefly has lower contrast while the animation is running, which axe flagged. We replaced the text fade-in animations with slide animations so that the text remains at full contrast throughout.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Gemini model availability changed during the hackathon.&lt;/em&gt; New AI Studio keys now use a new "AQ." format. One of the models available in our key's model list returned a message saying it was no longer available to new users, while two others timed out under the weekend's load. We wrote a probe script to check model availability and added fallback support so that requests could switch models while staying within the API's 60-second limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What the first live run showed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On a three-page sample lecture, the live Gemini pipeline kept all 6 concepts it found, generated 36 questions, answered an in-scope question with citations, and refused an off-topic one with "not in your materials". 42 of 43 generated items passed the quote check (97.7%); the one that failed was dropped before reaching the student. That is a small sample, so we will be measuring it on full lectures next.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I learned.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI feature is only as trustworthy as the checks built around it. Choosing not to display something that cannot be verified might mean covering a little less information, but it goes a long way towards building trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing for readers who struggle with reading
&lt;/h2&gt;

&lt;p&gt;We built StudyNova for the Accessibility track, so readability was something we considered throughout the design rather than adding at the end.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Night sky, not pitch black.&lt;/strong&gt; We chose a deep navy background with warm off-white text instead of pure white on black, whose glare many readers with dyslexia find hard to read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colour is never the only indicator.&lt;/strong&gt; Every readiness state has both an icon and a label: ○ Untested, ! Weak, ◐ Developing, ✓ Strong and ★ Cleared.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple reading options.&lt;/strong&gt; The application includes a readable mode with increased letter, word and line spacing, a high-contrast mode and a keyboard-accessible outline of the entire concept map.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Motion can be turned off.&lt;/strong&gt; The concept map draws itself like a constellation, while the gap path flows in gold. Both the operating system's reduced-motion setting and an in-app toggle can disable all animations and display the final state directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Measure the citation pass rate and transcription accuracy using full lectures and real recordings, and publish the results.&lt;/li&gt;
&lt;li&gt;Introduce individual student accounts instead of relying on the shared team login used in the hackathon version.&lt;/li&gt;
&lt;li&gt;Complete a full screen-reader accessibility audit using NVDA and VoiceOver.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built by &lt;strong&gt;Priyanka Purushotham&lt;/strong&gt; (AI service), &lt;strong&gt;Danush Kanchi&lt;/strong&gt; (API, data and deployment) and &lt;strong&gt;Rohith Bangalore Vijaya&lt;/strong&gt; (web app and Chrome extension) at HackUMass XIV, University of Massachusetts Amherst.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
