<?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: jack</title>
    <description>The latest articles on DEV Community by jack (@jack9999).</description>
    <link>https://dev.to/jack9999</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%2F4166603%2Fec063292-6035-4c44-aeb5-1d863072bc56.png</url>
      <title>DEV Community: jack</title>
      <link>https://dev.to/jack9999</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jack9999"/>
    <language>en</language>
    <item>
      <title>Picking an on-device embedding model for an iPhone notes app: what the benchmark changed</title>
      <dc:creator>jack</dc:creator>
      <pubDate>Tue, 27 Oct 2026 13:06:40 +0000</pubDate>
      <link>https://dev.to/jack9999/picking-an-on-device-embedding-model-for-an-iphone-notes-app-what-the-benchmark-changed-544c</link>
      <guid>https://dev.to/jack9999/picking-an-on-device-embedding-model-for-an-iphone-notes-app-what-the-benchmark-changed-544c</guid>
      <description>&lt;p&gt;I shipped an iPhone notes app called Reteum this week. The one hard rule was that there's no server of mine in the loop. No account, no analytics, and no cloud model reading anyone's notes. So search had to run on the phone, for text and for photos, and it had to be good enough that people would actually use it.&lt;/p&gt;

&lt;p&gt;This is what that looked like, and why a benchmark stopped me from making an easy upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  What search has to do
&lt;/h2&gt;

&lt;p&gt;People don't remember the words they used. They remember roughly where they were, what was in a photo, or what language they were thinking in. So the search I wanted had to handle queries like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Seattle last month", which should find what I saved there around then&lt;/li&gt;
&lt;li&gt;"beach", which should find beach photos with no caption&lt;/li&gt;
&lt;li&gt;an English query for a note I wrote in Japanese&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keyword search can't do any of that. Embeddings can, if the model is small enough to live on a phone and still handles many languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The models
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Text:&lt;/strong&gt; Google's EmbeddingGemma, the 300M version. I fine-tuned it for the kind of writing people put in a notes app: short, messy, often with typos, sometimes mixing languages, often using a broad word ("cooking") for something specific (a soup recipe).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Photos and video:&lt;/strong&gt; SigLIP 2 (base, patch 16, 224). Video is handled as a few still frames.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Voice:&lt;/strong&gt; Apple's on-device speech recognition turns voice notes into text, and that text then goes through the same embedding path.&lt;/p&gt;

&lt;p&gt;All of this runs on the iPhone, including in airplane mode. The same text embeddings drive the Atlas, which groups notes into subjects without folders or tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tempting upgrade
&lt;/h2&gt;

&lt;p&gt;Then Google released EmbeddingGemma 2, which reads text, photos and video. One model for everything sounded like an obvious win: less to ship, one embedding space. Before swapping anything I tested it against what I already had.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I tested
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Notes:&lt;/strong&gt; 503 short notes and 3,018 searches in 15 languages, written for the test and not taken from anyone's real notes. Their topics and people were kept out of the training data. A search only counts if the right note comes first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grouping:&lt;/strong&gt; 600 notes on 60 topics never seen in training, clustered automatically and scored with the adjusted Rand index (1 is perfect).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photos:&lt;/strong&gt; XM3600, 3,600 photos with human descriptions in many languages. The description is the query.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video:&lt;/strong&gt; 200 MSR-VTT clips with English descriptions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I compared three text setups: my fine-tuned model, EG2 as released, and EG2 after the same fine-tuning, including averaging several fine-tuned versions ("model soups"). I trained nine EG2 versions and kept the best one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: notes
&lt;/h2&gt;

&lt;p&gt;Top-1 across all 3,018 searches:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Right note first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;My fine-tuned EmbeddingGemma&lt;/td&gt;
&lt;td&gt;67.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EG2 as released&lt;/td&gt;
&lt;td&gt;63.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EG2 fine-tuned (best of 9)&lt;/td&gt;
&lt;td&gt;66.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;English was 76.4% vs 71.3% vs 73.5%. The biggest gap was Swahili, 60.9% vs 37.0% for EG2 as released. EG2 tuned did win in a few languages, including Arabic, Korean and Portuguese, so it isn't a clean sweep.&lt;/p&gt;

&lt;p&gt;Broken down by kind of query, cross-language search was the strongest: 83.8% for my model when the query language differs from the note's. Searching by feeling ("when I was anxious") was the weakest for every model, 14.5% at best, because a note rarely names the feeling it was written in. That's also why I don't use feeling queries as a demo example.&lt;/p&gt;

&lt;p&gt;Grouping settled it. Adjusted Rand index was 0.499 for my model, 0.399 for EG2 as released, and 0.442 for the best tuned EG2. The Atlas depends on that, so notes stay on the current model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results: photos and video
&lt;/h2&gt;

&lt;p&gt;Here it went the other way.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Photos (XM3600, top-1)&lt;/th&gt;
&lt;th&gt;SigLIP 2&lt;/th&gt;
&lt;th&gt;EG2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Average&lt;/td&gt;
&lt;td&gt;54.1%&lt;/td&gt;
&lt;td&gt;68.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Japanese&lt;/td&gt;
&lt;td&gt;37.8%&lt;/td&gt;
&lt;td&gt;81.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chinese&lt;/td&gt;
&lt;td&gt;43.1%&lt;/td&gt;
&lt;td&gt;70.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;EG2 lets you choose how many visual tokens it takes from an image. 140 tokens was as accurate as 280 at half the work. Fine-tuning EG2 for notes barely moved photo search (68.4% to 68.6%), so photos can use the released model. One caveat: XM3600 is public and might be in EG2's training data, so I'm also checking with my own photos.&lt;/p&gt;

&lt;p&gt;For video, reading the whole clip beat still frames. SigLIP 2 on 4 frames got 65.5% right first, EG2 on the whole video at 140 tokens a frame got 71.5%, and at 70 tokens a frame 70.5% while running more than twice as fast. I'll ship the 70-token setting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The decision
&lt;/h2&gt;

&lt;p&gt;A split: my fine-tuned EmbeddingGemma stays for notes and the Atlas, and photo and video search moves to EmbeddingGemma 2 in an update. Both still run on the phone.&lt;/p&gt;

&lt;p&gt;Two takeaways for anyone doing on-device search:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test on your own task.&lt;/strong&gt; A newer, more general model lost on short personal notes and on clustering, and won by a mile on photos. A single "it's better" number would have hidden both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure the weak query types separately.&lt;/strong&gt; The overall top-1 looked fine, while feeling queries sat at 14.5%. That changed what I promise in marketing copy as much as what I ship.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full per-language tables are here: &lt;a href="https://reteum.com/on-device-ai-benchmark" rel="noopener noreferrer"&gt;https://reteum.com/on-device-ai-benchmark&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app is iPhone only (iOS 26+), with an English UI and notes in any of many languages: &lt;a href="https://reteum.com" rel="noopener noreferrer"&gt;https://reteum.com&lt;/a&gt;. If you've shipped on-device embeddings on iOS, I'd like to hear how you handled model size and indexing.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>machinelearning</category>
      <category>swift</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How to Turn Any Concept Into an Animated Explainer Video in Minutes (With AI)</title>
      <dc:creator>jack</dc:creator>
      <pubDate>Thu, 22 Oct 2026 04:19:41 +0000</pubDate>
      <link>https://dev.to/jack9999/how-to-turn-any-concept-into-an-animated-explainer-video-in-minutes-with-ai-5pl</link>
      <guid>https://dev.to/jack9999/how-to-turn-any-concept-into-an-animated-explainer-video-in-minutes-with-ai-5pl</guid>
      <description>&lt;p&gt;Explaining technical ideas — how an API works, what a VPN does, why a math formula holds — is far easier with visuals. But making animated explainer videos used to mean storyboards, voice-over sessions and hours in After Effects.&lt;/p&gt;

&lt;p&gt;Here's a faster workflow I use, built around AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with one clear question
&lt;/h2&gt;

&lt;p&gt;Good explainers answer a single question: "What happens when I call an API?" Write it down. Everything in the video should serve that question.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Draft a short script (or let AI do it)
&lt;/h2&gt;

&lt;p&gt;Aim for 60–120 seconds, roughly 150–300 words. Structure: hook → problem → simple analogy → how it works step by step → recap.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Generate the visuals and narration
&lt;/h2&gt;

&lt;p&gt;Tools like &lt;a href="https://easyimate.com" rel="noopener noreferrer"&gt;Easyimate&lt;/a&gt; take a topic or script and produce a narrated, animated explainer automatically — scenes, motion and voice included. Other options worth knowing: Vyond and Animaker (template-based, more manual control) and Canva (good for simple motion slides).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Edit for clarity, not polish
&lt;/h2&gt;

&lt;p&gt;Watch it once with sound off. If the visuals alone don't tell the story, simplify the scene. Cut any sentence that doesn't move the explanation forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Pick the right format
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;16:9 for YouTube, courses and docs&lt;/li&gt;
&lt;li&gt;9:16 vertical for Shorts, Reels and TikTok&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tips for developers and teachers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Embed short explainers in README files or docs to cut support questions.&lt;/li&gt;
&lt;li&gt;Teachers: one 90-second video per concept beats a 20-minute lecture recording.&lt;/li&gt;
&lt;li&gt;Reuse: one script can become a long video plus several vertical clips.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;You don't need animation skills anymore — just a clear question and a good script. Try it on the concept your users or students ask about most.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work on Easyimate.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>video</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How we use Jev to answer quiz questions (a 90-question benchmark)</title>
      <dc:creator>jack</dc:creator>
      <pubDate>Tue, 06 Oct 2026 13:59:50 +0000</pubDate>
      <link>https://dev.to/jack9999/how-we-use-jev-to-answer-quiz-questions-a-90-question-benchmark-7ho</link>
      <guid>https://dev.to/jack9999/how-we-use-jev-to-answer-quiz-questions-a-90-question-benchmark-7ho</guid>
      <description>&lt;p&gt;I build QuizPilot, an open-source Chrome extension that reads practice questions on a web page and suggests answers. Since TypeSafe released Jev, our code sends every multiple-choice and true/false question to it. This post covers how we map quiz questions onto Jev, and what a small benchmark showed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy:&lt;/strong&gt; Jev answered 85–86 of 90 questions correctly across two runs. A lightweight LLM got 89, a frontier reasoning LLM got all 90.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; one Jev request answered 60 questions in 0.17–0.44 s. The lightweight LLM took 2.6 s, the reasoning LLM 8.5 s.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where it slips:&lt;/strong&gt; every true/false and multi-select answer was right. All of its mistakes were single-choice questions that need several steps of arithmetic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confidence is useful:&lt;/strong&gt; 7 of its 9 wrong answers came back with a confidence below 0.6, against an average of 0.93 for its right answers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why a decision model for quiz questions
&lt;/h2&gt;

&lt;p&gt;A multiple-choice question already lists every possible answer. An LLM still writes its reply as text, and we parse the letter out. Jev takes a state and typed questions (pick one of these options, or yes/no), and returns the choice with a probability. No prose to parse, no answer outside the options.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a quiz question becomes a Jev question
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single choice&lt;/strong&gt; → one Jev categorical question; the choices are the options.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True/false&lt;/strong&gt; → one yes/no (&lt;code&gt;noul&lt;/code&gt;) question: "Is this statement true?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple select&lt;/strong&gt; → one yes/no question per option ("Is option C one of the correct answers?"). Every option at 0.5 or above is ticked; if none reaches 0.5, the likeliest one is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fill-in, short answer, picture questions&lt;/strong&gt; → not sent to Jev; it doesn't write text or read images.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A trimmed request for one true/false question:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"typesafe/jev-1.13"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Questions from a quiz page. Each question is independent. Judge by factual correctness, not by wording or position of the options."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"questions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"q0"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noul"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The harmonic series 1 + 1/2 + 1/3 + … converges."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"task"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Is this statement true?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"criteria"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"true"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The statement is correct"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"false"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The statement is incorrect"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A yes/no answer is a single probability, so we turn it into a confidence by its distance from 0.5: &lt;code&gt;|2p − 1|&lt;/code&gt;. A multiple-select question's confidence is the lowest confidence among its options. A whole page goes out in one request, split only when it nears Jev's input limit.&lt;/p&gt;

&lt;p&gt;The adapter is open source: &lt;a href="https://github.com/jelly-ham/quizpilot-extension" rel="noopener noreferrer"&gt;github.com/jelly-ham/quizpilot-extension&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmark
&lt;/h2&gt;

&lt;p&gt;90 questions with known answers, written by me, none from a real exam:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Basic set (60):&lt;/strong&gt; 20 single choice, 20 multi-select, 20 true/false; half easy, half harder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard set (30):&lt;/strong&gt; mostly multi-step arithmetic — trailing zeros of 100!, 2^100 mod 7, inclusion–exclusion counting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comparison models: a lightweight general LLM with thinking off, and a frontier reasoning LLM at medium effort. Jev and the lightweight LLM ran each set twice.&lt;/p&gt;

&lt;p&gt;| Model | Basic (60) | Hard (30) | Total (90) | Latency |&lt;br&gt;
|---|---|---|---|&lt;br&gt;
| Jev | 59, 59 | 26, 27 | 85–86 | 0.17–0.44 s |&lt;br&gt;
| Lightweight LLM | 60 | 29, 29 | 2.6 s |&lt;br&gt;
| Reasoning LLM | 60 | 30 | 8.5 s |&lt;/p&gt;

&lt;p&gt;Jev by question type, both runs combined: true/false 40/40, multi-select 50/50, single choice 61/70.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Jev gets it wrong
&lt;/h2&gt;

&lt;p&gt;All nine mistakes were single-choice questions whose answer has to be computed, not recognised: trailing zeros of 100!, 2^100 mod 7, the sum of primes from 1 to 100, the number of real roots of x³ − 3x = 1, and (once) the interior angles of a 12-gon. Fact-recall questions, including harder ones, were all right.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confidence tells you when to re-check
&lt;/h2&gt;

&lt;p&gt;Across 180 Jev answers, 9 were wrong. Seven of the nine came back with confidence between 0.26 and 0.49; the two exceptions were the same question (trailing zeros of 100!) at 0.69 and 0.71. Right answers averaged 0.93.&lt;/p&gt;

&lt;p&gt;Re-checking everything below 0.6 would have touched 14 of 180 answers (8%). Using the lightweight LLM's answers from the same benchmark as the fallback, the combination scores 60/60 on the basic set and 28/30 on the hard set. (Combined from separate runs, not a live run with automatic review.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;90 questions we wrote ourselves show large gaps, not small ones.&lt;/li&gt;
&lt;li&gt;Text only; picture questions aren't covered.&lt;/li&gt;
&lt;li&gt;Jev 1.13 via OpenRouter, October 6, 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full post with more detail: &lt;a href="https://quizpilot.link/en/blog/jev/" rel="noopener noreferrer"&gt;quizpilot.link/en/blog/jev&lt;/a&gt;. Happy to answer questions about the adapter or the question set.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>benchmark</category>
      <category>chrome</category>
    </item>
  </channel>
</rss>
