<?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: Arul Cornelious</title>
    <description>The latest articles on DEV Community by Arul Cornelious (@arul_cornelious).</description>
    <link>https://dev.to/arul_cornelious</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3813547%2F5c2651ea-37bf-4c31-b65e-ae101bc605ab.jpeg</url>
      <title>DEV Community: Arul Cornelious</title>
      <link>https://dev.to/arul_cornelious</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arul_cornelious"/>
    <language>en</language>
    <item>
      <title>Clinic Inbox Assistant: My MedGemma Hackathon Project for Safer, Faster Triage</title>
      <dc:creator>Arul Cornelious</dc:creator>
      <pubDate>Tue, 10 Mar 2026 17:58:10 +0000</pubDate>
      <link>https://dev.to/arul_cornelious/clinic-inbox-assistant-my-medgemma-hackathon-project-for-safer-faster-triage-3d6a</link>
      <guid>https://dev.to/arul_cornelious/clinic-inbox-assistant-my-medgemma-hackathon-project-for-safer-faster-triage-3d6a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This project uses only synthetic examples and does &lt;strong&gt;not&lt;/strong&gt; process real patient data. It is a technical demo, not medical advice or a clinical triage tool.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During the MedGemma Impact Challenge on Kaggle, I designed and built &lt;strong&gt;Clinic Inbox Assistant&lt;/strong&gt;, a focused prototype that turns messy clinical inbox notes into structured, triage‑ready summaries. In this post, I’ll share why I chose this problem, how I used MedGemma inside a single Kaggle notebook, the safety constraints I built in, and what I learned about turning a raw health AI model into something closer to a real‑world workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kaggle writeup &amp;amp; notebook: &lt;a href="https://www.kaggle.com/competitions/med-gemma-impact-challenge/writeups/clinic-inbox-assistant-medgemma-impact-challenge" rel="noopener noreferrer"&gt;https://www.kaggle.com/competitions/med-gemma-impact-challenge/writeups/clinic-inbox-assistant-medgemma-impact-challenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo video (YouTube): &lt;a href="https://youtu.be/t-7_SpzPxoc?si=fpkzGIPIA6ISjVUF" rel="noopener noreferrer"&gt;https://youtu.be/t-7_SpzPxoc?si=fpkzGIPIA6ISjVUF&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source code (GitHub): &lt;a href="https://github.com/Arul1998/clinic-inbox-assistant2" rel="noopener noreferrer"&gt;https://github.com/Arul1998/clinic-inbox-assistant2&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also read Google’s announcement of the MedGemma Impact Challenge here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.edtechinnovationhub.com/news/google-launches-medgemma-impact-challenge-to-advance-human-centered-health-ai" rel="noopener noreferrer"&gt;https://www.edtechinnovationhub.com/news/google-launches-medgemma-impact-challenge-to-advance-human-centered-health-ai&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The problem: messy inbox notes
&lt;/h2&gt;

&lt;p&gt;Every day, clinics receive phone call summaries, portal messages, and nurse notes written in free text. Important details and red flags can hide inside long paragraphs, and someone still has to read everything line by line under time pressure. I wanted a way to turn one unstructured note into a structured, machine‑readable summary that could support triage, without pretending to replace clinical judgement.&lt;/p&gt;
&lt;h2&gt;
  
  
  The idea: one note in, structured triage out
&lt;/h2&gt;

&lt;p&gt;Clinic Inbox Assistant takes a single free‑text note plus its type (for example, “phone call”, “patient message”, “nurse note”) and produces a structured JSON‑like object describing the situation. The output includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key symptoms and complaints
&lt;/li&gt;
&lt;li&gt;Onset and duration where possible
&lt;/li&gt;
&lt;li&gt;Relevant risk factors or comorbidities
&lt;/li&gt;
&lt;li&gt;Potential red‑flag indicators
&lt;/li&gt;
&lt;li&gt;Suggested urgency bucket (for example, routine, soon, urgent)
&lt;/li&gt;
&lt;li&gt;A short natural‑language summary
&lt;/li&gt;
&lt;li&gt;A clear disclaimer that this is not real medical advice or triage
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This structure is designed so an EHR, rules engine, or downstream workflow could plug it in and build their own logic on top.&lt;/p&gt;
&lt;h2&gt;
  
  
  Tech stack and MedGemma integration
&lt;/h2&gt;

&lt;p&gt;The entire project runs inside a single Kaggle notebook as required by the MedGemma Impact Challenge. I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MedGemma 4B instruct from Google’s Health AI Developer Foundations collection
&lt;/li&gt;
&lt;li&gt;Python for orchestration and formatting
&lt;/li&gt;
&lt;li&gt;Simple helper functions to validate input and normalise the JSON‑like output
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the core of the notebook is one carefully designed prompt that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explains the clinical inbox scenario in plain language
&lt;/li&gt;
&lt;li&gt;Lists exactly which fields the model should extract
&lt;/li&gt;
&lt;li&gt;Defines a strict JSON‑like schema to follow
&lt;/li&gt;
&lt;li&gt;Reminds the model to be conservative with red‑flag claims and to default to “unknown” when unsure
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is a simplified version of the output format:&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;"note_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;"phone_call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Short description in plain language"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"symptoms"&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="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chest pain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 hours"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"moderate"&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="nl"&gt;"risk_factors"&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="s2"&gt;"hypertension"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"smoker"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"possible_red_flags"&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="s2"&gt;"sudden onset chest pain at rest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"urgent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"disclaimer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This is not medical advice or a real triage decision."&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;The notebook then calls MedGemma with this prompt and the raw note text, parses the response, and prints both a human‑readable summary and the structured object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety, privacy, and “this is not medical advice”
&lt;/h2&gt;

&lt;p&gt;Because this is health‑adjacent, I made safety and privacy explicit goals. The project uses only synthetic examples and does not process real patient data in the notebook. Every output includes a strong disclaimer that this is a prototype and not a replacement for clinical judgement, triage protocols, or emergency services.&lt;/p&gt;

&lt;p&gt;In a real deployment, I would expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper dataset curation and evaluation with clinicians
&lt;/li&gt;
&lt;li&gt;Guardrails for hallucinated red flags or missing critical symptoms
&lt;/li&gt;
&lt;li&gt;Integration into existing clinical workflows and EHR systems
&lt;/li&gt;
&lt;li&gt;Regulatory and privacy review before touching any real data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the competition, the goal was to demonstrate a plausible workflow that could eventually be hardened, not to ship a production‑ready medical device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons from the MedGemma Impact Challenge
&lt;/h2&gt;

&lt;p&gt;The challenge itself is focused on human‑centred, deployable healthcare AI that can run with privacy and edge constraints in mind. Working within a single notebook and model forced me to think more like a product designer than just someone calling an API.&lt;/p&gt;

&lt;p&gt;Some key lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scope matters&lt;/strong&gt;: doing one thing well (single‑note triage structure) beats a vague “AI for everything in the clinic” idea.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt is product&lt;/strong&gt;: most of the behaviour came from carefully iterating on the prompt and schema, not complex code.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explainability wins&lt;/strong&gt;: a structured JSON‑like output is easier to audit, debug, and plug into other systems than a free‑form paragraph.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication counts&lt;/strong&gt;: the competition explicitly scores execution and communication, so the writeup and demo video matter almost as much as the notebook.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if this project never leaves the notebook, the design pattern of “one unstructured input → structured, auditable output” is reusable in many domains beyond healthcare.&lt;/p&gt;

&lt;h2&gt;
  
  
  How you can reuse or extend this idea
&lt;/h2&gt;

&lt;p&gt;If you want to experiment with something similar, here are some easy variations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adapt the schema to other clinical documents (for example, discharge summaries, referral letters).
&lt;/li&gt;
&lt;li&gt;Use the same pattern for non‑medical inboxes: support tickets, HR requests, or legal notes.
&lt;/li&gt;
&lt;li&gt;Add a small rules engine or dashboard on top of the structured output instead of staying in a notebook.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build a spin‑off of Clinic Inbox Assistant, I’d love to see how you adapt the schema and safety choices for your own domain.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hackathon</category>
      <category>llm</category>
      <category>healthcare</category>
    </item>
    <item>
      <title>I Built a VS Code Extension to Clean Up Angular Codebases — Here's What It Does</title>
      <dc:creator>Arul Cornelious</dc:creator>
      <pubDate>Sun, 08 Mar 2026 23:21:34 +0000</pubDate>
      <link>https://dev.to/arul_cornelious/i-built-a-vs-code-extension-to-clean-up-angular-codebases-heres-what-it-does-3iil</link>
      <guid>https://dev.to/arul_cornelious/i-built-a-vs-code-extension-to-clean-up-angular-codebases-heres-what-it-does-3iil</guid>
      <description>&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;After refactors, Angular apps often end up with unused dependencies, dead exports, and lint drift. I wanted a single place in VS Code to run the usual code-quality tools and jump straight to the issues – without remembering CLI commands or switching to the terminal.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Angular Code Quality Toolkit&lt;/strong&gt;: a small VS Code extension that runs &lt;code&gt;depcheck&lt;/code&gt;, &lt;code&gt;ts-prune&lt;/code&gt;, &lt;code&gt;ESLint&lt;/code&gt;, and &lt;code&gt;stylelint&lt;/code&gt; from the editor and shows everything in the &lt;strong&gt;Problems&lt;/strong&gt; panel and as squiggles in the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run depcheck&lt;/strong&gt; — Finds unused and missing npm dependencies; results show in Output and Problems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run ts-prune&lt;/strong&gt; — Finds unused TypeScript exports; uses &lt;code&gt;tsconfig.app.json&lt;/code&gt; when present.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run ESLint&lt;/strong&gt; — Runs your workspace &lt;code&gt;npm run lint&lt;/code&gt; and shows diagnostics in the editor (with a nudge to migrate from TSLint if needed).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add ESLint to Angular project&lt;/strong&gt; — One-click run of &lt;code&gt;ng add @angular-eslint/schematics&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run stylelint&lt;/strong&gt; — Lints CSS/SCSS (uses your npm script or a default glob).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All results go to one &lt;strong&gt;Angular Code Quality&lt;/strong&gt; output channel and into &lt;strong&gt;View → Problems&lt;/strong&gt; plus inline squiggles, so you can fix issues file-by-file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use it
&lt;/h2&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.amazonaws.com%2Fuploads%2Farticles%2F19v8b996vg3cuo2kbki9.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.amazonaws.com%2Fuploads%2Farticles%2F19v8b996vg3cuo2kbki9.png" alt=" " width="800" height="504"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install from the &lt;a href="https://marketplace.visualstudio.com/items?itemName=arul1998.angular-code-quality-toolkit" rel="noopener noreferrer"&gt;VS Code Marketplace&lt;/a&gt; or search &lt;strong&gt;Angular Code Quality Toolkit&lt;/strong&gt; in Extensions.&lt;/li&gt;
&lt;li&gt;Open an Angular project (folder with &lt;code&gt;package.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Ensure the tools are available in that project (&lt;code&gt;npm install --save-dev depcheck ts-prune&lt;/code&gt;, plus a &lt;code&gt;"lint"&lt;/code&gt; script and optionally stylelint).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl+Shift+P&lt;/strong&gt; (or &lt;strong&gt;Cmd+Shift+P&lt;/strong&gt;) → run &lt;strong&gt;Angular Code Quality: Run depcheck&lt;/strong&gt; (or ts-prune, ESLint, stylelint).&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Problems&lt;/strong&gt; and the &lt;strong&gt;Angular Code Quality&lt;/strong&gt; output channel; click an issue to jump to the file and line.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Extension + CI, not either/or
&lt;/h2&gt;

&lt;p&gt;The extension is for fast feedback while you code. For team-wide enforcement, use &lt;strong&gt;CI&lt;/strong&gt; (e.g. GitHub Actions) and &lt;strong&gt;git hooks&lt;/strong&gt; (e.g. husky + lint-staged) with the same tools. The &lt;a href="https://github.com/Arul1998/angular-code-quality-toolkit#using-this-extension-with-ci-recommended" rel="noopener noreferrer"&gt;README&lt;/a&gt; has a sample GitHub Actions workflow you can copy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code Marketplace:&lt;/strong&gt; &lt;a href="https://marketplace.visualstudio.com/items?itemName=arul1998.angular-code-quality-toolkit" rel="noopener noreferrer"&gt;Angular Code Quality Toolkit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Arul1998/angular-code-quality-toolkit" rel="noopener noreferrer"&gt;github.com/Arul1998/angular-code-quality-toolkit&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it on a large Angular app or monorepo, I’d love to hear what works and what you’d improve.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>vscode</category>
      <category>typescript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
