<?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: Utkarsh Singh</title>
    <description>The latest articles on DEV Community by Utkarsh Singh (@utkarsh_singh-27).</description>
    <link>https://dev.to/utkarsh_singh-27</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%2F4156872%2F18e0f1ad-3d71-43ce-9df8-77dda422593f.jpg</url>
      <title>DEV Community: Utkarsh Singh</title>
      <link>https://dev.to/utkarsh_singh-27</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/utkarsh_singh-27"/>
    <language>en</language>
    <item>
      <title>A private interview coach that runs in my friend's browser — no server ever saw their resume</title>
      <dc:creator>Utkarsh Singh</dc:creator>
      <pubDate>Sun, 18 Oct 2026 12:19:19 +0000</pubDate>
      <link>https://dev.to/utkarsh_singh-27/a-private-interview-coach-that-runs-in-my-friends-browser-no-server-ever-saw-their-resume-akk</link>
      <guid>https://dev.to/utkarsh_singh-27/a-private-interview-coach-that-runs-in-my-friends-browser-no-server-ever-saw-their-resume-akk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Honest timing note: the weekend window closed on Oct 5 and this was built after. I'm publishing anyway, for the love of completing the arc — this week it earns no prize and no badge. It's just a gift with documentation.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/4-thkind/interviewbuddy" rel="noopener noreferrer"&gt;InterviewBuddy&lt;/a&gt;&lt;/strong&gt; — a private AI mock-interview coach that runs &lt;em&gt;entirely inside one browser tab&lt;/em&gt;. No server. No account. No install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The friend:&lt;/strong&gt; a college friend of mine, mid job-hunt. Their interview prep routine at 2 AM is: job description open in one window, their own resume in another, talking sections out loud to an empty room. Real feedback doesn't exist at that hour — &lt;em&gt;every&lt;/em&gt; “AI interview coach” is a hosted service that wants their resume uploaded to someone's cloud first (and resumes are the single most personal document a candidate owns).&lt;/p&gt;

&lt;p&gt;So I built the coach the shape of a browser tab instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;paste the &lt;strong&gt;job description&lt;/strong&gt; and their &lt;strong&gt;resume/notes&lt;/strong&gt; (nothing uploads — there's no server to upload to),&lt;/li&gt;
&lt;li&gt;Gemma generates &lt;strong&gt;five interview questions&lt;/strong&gt; grounded in that exact role and that exact person,&lt;/li&gt;
&lt;li&gt;they answer out loud and type the gist; each round gets &lt;strong&gt;Strength / Improve / Sharper answer&lt;/strong&gt; feedback,&lt;/li&gt;
&lt;li&gt;it ends with a &lt;strong&gt;debrief&lt;/strong&gt;: two things done well, two to practise, and a confidence score.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Try it at &lt;strong&gt;&lt;a href="https://4-thkind.github.io/interviewbuddy/" rel="noopener noreferrer"&gt;https://4-thkind.github.io/interviewbuddy/&lt;/a&gt;&lt;/strong&gt; — click once and the browser downloads Gemma 3 1B (~0.5 GB) &lt;em&gt;one time&lt;/em&gt;, then caches it. After that, unplug the network; it still works.&lt;/p&gt;

&lt;p&gt;What a real session looks like — five questions pulled from the pasted JD + resume, and round-one coaching:&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%2Fpjmdh18pylcvvqdjehe8.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%2Fpjmdh18pylcvvqdjehe8.png" alt="InterviewBuddy generating grounded questions and giving Strength / Improve / Sharper answer feedback on round one" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The final debrief, where it names what worked and what to practise before the real thing:&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%2Fsh65b5rddxnu6ijuyulk.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%2Fsh65b5rddxnu6ijuyulk.png" alt="The debrief at the end of a full session, with a confidence score" width="800" height="1011"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The whole product is &lt;a href="https://github.com/4-thkind/interviewbuddy" rel="noopener noreferrer"&gt;4-thkind/interviewbuddy&lt;/a&gt;: eight files, and the app itself is exactly two of them — &lt;code&gt;index.html&lt;/code&gt; and &lt;code&gt;app.js&lt;/code&gt;. No bundler, no backend, no SDK key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/4-thkind/interviewbuddy
npx serve &lt;span class="nb"&gt;.&lt;/span&gt;          &lt;span class="c"&gt;# or python -m http.server&lt;/span&gt;
&lt;span class="c"&gt;# open the tab, paste a JD + resume, click start&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://huggingface.co/onnx-community/gemma-3-1b-it-ONNX" rel="noopener noreferrer"&gt;&lt;code&gt;onnx-community/gemma-3-1b-it-ONNX&lt;/code&gt;&lt;/a&gt; — Gemma 3 1B quantized to q4 (~0.5 GB), loaded straight into the tab with &lt;a href="https://github.com/huggingface/transformers.js" rel="noopener noreferrer"&gt;Transformers.js v4&lt;/a&gt;, GPU-accelerated by &lt;strong&gt;WebGPU&lt;/strong&gt;, with a graceful WASM/CPU fallback (the UI badge tells you which one you're on). Streaming output lands token-by-token, which makes a 1B model feel alive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I deliberately skipped Ollama.&lt;/strong&gt; My previous Hacktoberfest build ran a 4B model through a local server — great for my RTX laptop, wrong for a friend who shouldn't have to install &lt;em&gt;anything&lt;/em&gt;. The entire footprint here is: a webpage and one cached model file. Nothing installs, nothing persists, nothing runs when the tab closes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fresh short context per turn.&lt;/strong&gt; Question generation and every feedback round get their own compact messages array instead of one long transcript — a 1B model stays sharp in small windows and drowns in long ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;do_sample: false&lt;/code&gt;, after the model earned it.&lt;/strong&gt; With sampling on, Gemma started inventing candidate background that wasn't in the resume. Temperature 0 keeps the coach honest: it may be dull, but it never lies about who the candidate is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt-compliance is enforced in code, not hoped for.&lt;/strong&gt; “Exactly 5 questions, lines end with &lt;code&gt;?&lt;/code&gt;, no commentary” is backed by a parser that strips numbering, filters non-question lines, and falls back to a legal default. A 1B model &lt;em&gt;will&lt;/em&gt; occasionally answer its own question — the app must survive that.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The privacy argument collapses without open weights.&lt;/strong&gt; If the model were closed, the only way to run it is &lt;em&gt;the other company's server&lt;/em&gt; — the resume leaves the laptop, and my friend's leverage in a negotiation ends up in someone else's training pipeline. Open weights make “it never leaves this tab” physically true, not a policy promise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A gift must be free to keep.&lt;/strong&gt; A hosted interview coach costs a subscription for a friend who is, definitionally, broke. Gemma 1B local costs exactly nothing — per question, per session, ever — and that price is what makes “here, take this” a whole gift instead of a trial.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No internet, no problem.&lt;/strong&gt; Campus Wi-Fi dies during every exam week at my college. After the one-time download, the browser has the model; InterviewBuddy is interview practice that survives the outage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The friend can read and change their own coach.&lt;/strong&gt; The prompt is 12 lines of plain English in &lt;code&gt;app.js&lt;/code&gt;. If they want stricter cold-read questions or a softer tone, they edit one file. Try asking a closed API for that.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;This was built in one working session with an AI coding agent — I picked the friend, the constraints (“lighter than last time, no Ollama, no installs”) and reviewed everything. The honest build log, including the two bugs found while driving it live (a DOM-history bug and a question-parser failure), is in &lt;a href="https://github.com/4-thkind/interviewbuddy/blob/main/AGENT_NOTES.md" rel="noopener noreferrer"&gt;&lt;code&gt;AGENT_NOTES.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 3 1B runs entirely on-device in the browser (ONNX q4 via WebGPU), powers every part of the coach, and swapping to &lt;code&gt;gemma-3-4b&lt;/code&gt; on a stronger laptop is a one-line change.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Solo build — no teammates.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>The $0-per-report feature: a patient-friendly radiology explainer that runs on the clinic's own laptop</title>
      <dc:creator>Utkarsh Singh</dc:creator>
      <pubDate>Sun, 18 Oct 2026 11:10:50 +0000</pubDate>
      <link>https://dev.to/utkarsh_singh-27/the-0-per-report-feature-a-patient-friendly-radiology-explainer-that-runs-on-the-clinics-own-4152</link>
      <guid>https://dev.to/utkarsh_singh-27/the-0-per-report-feature-a-patient-friendly-radiology-explainer-that-runs-on-the-clinics-own-4152</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/4-thkind/plainray" rel="noopener noreferrer"&gt;PlainRay&lt;/a&gt;&lt;/strong&gt; turns radiology reports into plain-language patient explainers — on the clinic's own machine, with an open-weight model, for zero rupees per report.&lt;/p&gt;

&lt;p&gt;It reads a report and produces, in one pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;plain-language summary&lt;/strong&gt; of what the exam showed (under 150 words, roughly 8th-grade reading level),&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;glossary&lt;/strong&gt; of every term and abbreviation it used, translated to everyday words ("consolidation → cloudy areas in the lung"),&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;questions the patient can ask their doctor&lt;/strong&gt;, and&lt;/li&gt;
&lt;li&gt;a calm &lt;strong&gt;urgency note&lt;/strong&gt; — only if the report itself flags something, in the report's own wording. The model is not allowed to invent findings, diagnose, or reassure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Who would pay for this: the kind of clinic that runs two radiologists, one front desk, and a stack of reports whose first word is usually "IMPRESSION:". Behind that desk sits a person who answers "what does effusion mean?" eleven times a week. Every hosted "AI patient portal" wants a per-report meter and a copy of the report on someone else's server. PlainRay flips it: &lt;strong&gt;flat license, zero usage cost, nothing ever leaves the machine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The side-hustle math that makes it a real product instead of a demo: the clinic already owns the laptop, and the model runs on an RTX 4060. So the unit economics are: model = free forever, electricity = what the lamp costs, product = one flat fee per workstation. There is no other version of this offer where the &lt;em&gt;cost driver of the whole business is $0&lt;/em&gt; — that's only possible because the model is an open-weight one you can download.&lt;/p&gt;

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

&lt;p&gt;Three synthetic reports are in the repo (&lt;code&gt;samples/sample_reports.json&lt;/code&gt; — no real PHI is ever committed). Here is the actual flow, captured locally while the machine was offline for everything else:&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%2Ft3t2v9nxgd5mttb7tdzu.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%2Ft3t2v9nxgd5mttb7tdzu.png" alt="PlainRay explaining a chest X-ray report - summary, reading grade, glossary and questions" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second frame is the mammography screening sample — the star of the show, because screening reports are the least readable of all (&lt;a href="https://raw.githubusercontent.com/4-thkind/plainray/main/demo/02-mammo-explained.png" rel="noopener noreferrer"&gt;see it here&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;No login, no cloud, no network. Unplug the ethernet cable and it keeps working — that is the demo. Run it yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/4-thkind/plainray
ollama pull gemma3:4b          &lt;span class="c"&gt;# one time, ~3 GB&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; plainray serve       &lt;span class="c"&gt;# http://127.0.0.1:7860&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; plainray explain &lt;span class="nt"&gt;--file&lt;/span&gt; report.txt   &lt;span class="c"&gt;# JSON on stdout&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; plainray selftest    &lt;span class="c"&gt;# prompts + validator + readability, no model needed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;Everything lives in the &lt;a href="https://github.com/4-thkind/plainray" rel="noopener noreferrer"&gt;4-thkind/plainray&lt;/a&gt; repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;plainray/llm.py&lt;/code&gt; — a minimal local Ollama client in stdlib &lt;code&gt;urllib&lt;/code&gt;, ~40 lines. No pip, no SDK.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plainray/prompts.py&lt;/code&gt; — the patient-safety prompt, readable in plain text by whoever deploys it.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plainray/app.py&lt;/code&gt; — CLI (&lt;code&gt;explain&lt;/code&gt; / &lt;code&gt;serve&lt;/code&gt; / &lt;code&gt;selftest&lt;/code&gt;) and a validator that enforces the JSON shape: caps list lengths, dedupes glossary terms, refuses an empty summary.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plainray/readability.py&lt;/code&gt; — a Flesch-Kincaid grader in stdlib. Numbers, not promises.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;static/index.html&lt;/code&gt; — the UI; the server binds to &lt;code&gt;127.0.0.1&lt;/code&gt; on purpose.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://ollama.com/library/gemma3" rel="noopener noreferrer"&gt;Gemma 3&lt;/a&gt; 4B (open weights), served locally by &lt;a href="https://ollama.com" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; on an RTX 4060 Laptop (8 GB VRAM). One-time ~3 GB pull; after that it runs offline. Generation takes ~30 s per report on this laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The prompt is the product.&lt;/strong&gt; Anti-diagnosis, no invented findings, glossary limited to terms that actually appear in the report, calm-not-reassuring urgency wording. That last rule came from watching Gemma happily soften "consolidation" into "all is well" — which is exactly wrong for a patient explainer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output enforced in code, not trusted from the model.&lt;/strong&gt; &lt;code&gt;_validate()&lt;/code&gt; rebuilds the JSON from scratch. A 4B model &lt;em&gt;will&lt;/em&gt; slip a made-up term into the glossary now and then ("mets", when the report never said it) — the design answer is to show the glossary to a human for one click of review, not to pretend the model is a pharmacist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured readability.&lt;/strong&gt; The Flesch-Kincaid grade runs on the raw report and on the generated explainer, and both numbers show in the UI:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sample report&lt;/th&gt;
&lt;th&gt;Raw grade&lt;/th&gt;
&lt;th&gt;PlainRay explainer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chest X-ray, consolidation&lt;/td&gt;
&lt;td&gt;10.4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Knee MRI, meniscus tear&lt;/td&gt;
&lt;td&gt;10.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.6&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mammography screening&lt;/td&gt;
&lt;td&gt;12.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.7&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero dependencies:&lt;/strong&gt; everything is stdlib (&lt;code&gt;urllib&lt;/code&gt;, &lt;code&gt;http.server&lt;/code&gt;). Clinic IT never touches a package manager.&lt;/li&gt;
&lt;li&gt;Swapping the model is one variable (&lt;code&gt;PLAINRAY_MODEL&lt;/code&gt;): &lt;code&gt;gemma3:12b&lt;/code&gt; on a bigger box, or the medical-tuned sibling &lt;code&gt;medgemma&lt;/code&gt; — same code, same prompt.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PHI is the whole story.&lt;/strong&gt; A radiology report is protected health information. A closed, hosted model requires sending that text to someone else's server before any feature can run — which is why most clinics simply don't have this feature. With Gemma running locally, that sentence disappears from the compliance conversation: the data physically cannot leave the laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It fixes the cost basis of the product.&lt;/strong&gt; A center reading ~120 reports a day on a hosted API pays a meter every month, forever, for a feature most clinics treat as nice-to-have. Local open weights move that cost to approximately zero — which is what makes the pitch survive an accountant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unplugged beats pretty.&lt;/strong&gt; The internet does go down in small clinics. PlainRay doesn't care; the server is on the same machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customize for a niche.&lt;/strong&gt; A general-purpose closed API handles "ACR 2" the way a search engine does. Locally, a clinic can tune the prompt to their own reporting style, and the weights are there if they ever want to go further.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fair for a two-doctor clinic.&lt;/strong&gt; No usage meter, no lock-in, no per-seat squeeze. The feature that is free for a solo practitioner is the same for a hospital.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;This project was built in one working session with an AI coding agent — I set the problem, the constraints ("small, specific, useful, and it must actually run on this laptop") and reviewed everything it produced. The short form of that session — constraints discovered first, the decisions worth keeping, and what was hard — is checked into the repo as &lt;a href="https://github.com/4-thkind/plainray/blob/main/AGENT_NOTES.md" rel="noopener noreferrer"&gt;&lt;code&gt;AGENT_NOTES.md&lt;/code&gt;&lt;/a&gt;. No DevRelay install for this build; the notes file is the session, honestly summarized.&lt;/p&gt;

&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;Honest version: &lt;strong&gt;my first real user test hasn't happened yet.&lt;/strong&gt; During this challenge window I built the product and ran it end-to-end on my own machine against three synthetic reports; nobody's real report went through it, because the right first user is a clinic that will trade one afternoon for a demo, and setting that up properly takes longer than the window. Rather than report a fake ten, here is the actual next step: one call to my cousin's ortho clinic, a printed example made from &lt;code&gt;samples/&lt;/code&gt;, and two questions I'll log verbatim in the repo — &lt;em&gt;would you pay, and how much per year?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're a radiologist or run a small clinic and want to be user #1: the demo runs from a fresh clone in under two minutes, and my contact is on my profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 3 4B runs entirely on-device through Ollama, powers the whole product, and the architecture keeps &lt;code&gt;gemma3:12b&lt;/code&gt; / &lt;code&gt;medgemma&lt;/code&gt; as one-variable drop-ins.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Solo build — no teammates.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
