<?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: Aarti Panchal</title>
    <description>The latest articles on DEV Community by Aarti Panchal (@aarti-panchal01).</description>
    <link>https://dev.to/aarti-panchal01</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%2F3977979%2Feed7e100-b478-4c5e-aabf-7288da0ffe26.jpeg</url>
      <title>DEV Community: Aarti Panchal</title>
      <link>https://dev.to/aarti-panchal01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aarti-panchal01"/>
    <language>en</language>
    <item>
      <title>Shipping real products as a first engineering hire</title>
      <dc:creator>Aarti Panchal</dc:creator>
      <pubDate>Mon, 10 Aug 2026 16:02:08 +0000</pubDate>
      <link>https://dev.to/aarti-panchal01/three-products-in-a-few-weeks-voice-ai-exit-interviews-aadhaar-verification-and-a-1il2</link>
      <guid>https://dev.to/aarti-panchal01/three-products-in-a-few-weeks-voice-ai-exit-interviews-aadhaar-verification-and-a-1il2</guid>
      <description>&lt;p&gt;I joined an early stage startup as the first person on the team besides the two founders. The mandate was direct: build real products, with real data, fast. A few weeks later, the systems I worked on are live. This is the engineering write up, including the failures that taught me the most.&lt;/p&gt;

&lt;p&gt;The through line is one idea: trustworthy data about workers. Understanding why they leave, and recording that they showed up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning a static dashboard into a live trust score
&lt;/h2&gt;

&lt;p&gt;The first product is a dashboard that runs and analyses worker exit interviews, powered by an AI voice agent.&lt;/p&gt;

&lt;p&gt;When I started, most of the dashboard was a facade. Eleven of the twelve cards were hardcoded. So the real work was making them true. I built the Trust Score on an actual formula: four sub scores for Employer, Contractor, Location, and Regulatory signals, each computed from Firestore data. I added sanity guards so test and junk records could not skew the result.&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%2F5hd2w43ufdtzneyrdwxd.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%2F5hd2w43ufdtzneyrdwxd.png" alt=" " width="799" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Trust Score, now computed from real Firestore data across Employer, Contractor, Location, and Regulatory signals.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A score is only useful if people trust it, so I made it explainable. Cards that break down how the score was reached, an insight panel that surfaces the single biggest challenge based on the lowest sub score, and a next job signal on the worker view. I also added a filter to the interview workflow and fixed a rendering mismatch where twelve cards were defined but only ten showed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making an AI voice interview feel instant
&lt;/h2&gt;

&lt;p&gt;The interview itself runs over a phone call. Instead of HR calling every departing worker, a voice agent calls them in their own language and holds a natural conversation.&lt;/p&gt;

&lt;p&gt;I led the technical integration with the voice platform on my own. To pin down the exact request format, I ran a spike that pointed the platform at httpbin so I could read the raw payload it was sending. That is how I found the cause of a failing POST and got it fixed on the vendor side.&lt;/p&gt;

&lt;p&gt;The interview needs to react to what the worker says, so I built a separate endpoint server that sits between the platform and the model.&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%2F9qq0rbawipjn66111byg.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%2F9qq0rbawipjn66111byg.png" alt=" " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Latency was the hardest part. What moved the needle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Have the model emit the spoken text first and the bookkeeping JSON last, so speech starts before the housekeeping is done.&lt;/li&gt;
&lt;li&gt;Move the server to a Mumbai region and pre warm it before every call.&lt;/li&gt;
&lt;li&gt;Keep every response under twenty words.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also spent real time on conversation quality. I fixed how PF and ESIC are pronounced, spelling them letter by letter in all four languages, removed gossip style probing, and replaced abrupt hang ups with warm, language specific closings. One debugging lesson worth keeping: a 401 that looked like an auth bug was actually environment variables not taking effect until a fresh deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  A kiosk that records attendance by face
&lt;/h2&gt;

&lt;p&gt;The second product is Inverix Attend. A tablet at the gate, and daily check in by face. It is multilingual, works offline, and is privacy first.&lt;/p&gt;

&lt;p&gt;A few parts were interesting to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On device face recognition.&lt;/strong&gt; Each face becomes a 128 number descriptor. Enrollment stores it, check in compares the live numbers against it, and nothing leaves the device except the match.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy first by design.&lt;/strong&gt; At enrollment we only ever keep a name, a photo, and a masked reference. No sensitive identity number is stored.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Firestore constraint I learned the hard way.&lt;/strong&gt; Firestore rejects nested arrays. My face templates were a list of number arrays, so the write threw a 400 that reached the browser as an empty 500. I now serialize the templates to a string and rebuild them on read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Offline that actually works.&lt;/strong&gt; Templates are cached, punches queue locally, and everything syncs when the connection returns.&lt;/p&gt;

&lt;p&gt;The part I am most happy with: getting reliable recognition working entirely in the browser, so a worker's face never leaves the device, and the whole thing still holds up when the network drops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Engineering takeaways
&lt;/h2&gt;

&lt;p&gt;I moved fast by pairing with AI tools, and I want to be honest about that rather than hide it. But the judgment was mine. Reading the real 400 instead of trusting the vague 500. Deciding how the Trust Score should be computed. Running the vendor call. Choosing what to cut. That is where the actual engineering was, and it is the part that stuck.&lt;/p&gt;

&lt;p&gt;The systems are live. On to the next one.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>react</category>
      <category>career</category>
    </item>
    <item>
      <title>What C4GT Actually Is, and How to Get Into DMP 2027</title>
      <dc:creator>Aarti Panchal</dc:creator>
      <pubDate>Sat, 01 Aug 2026 19:34:41 +0000</pubDate>
      <link>https://dev.to/aarti-panchal01/what-c4gt-actually-is-and-how-to-get-into-dmp-2027-2p00</link>
      <guid>https://dev.to/aarti-panchal01/what-c4gt-actually-is-and-how-to-get-into-dmp-2027-2p00</guid>
      <description>&lt;h1&gt;
  
  
  What C4GT Actually Is, and How to Get Into DMP 2027
&lt;/h1&gt;

&lt;p&gt;I'm a second year B.Tech student. Right now I'm rebuilding the frontend of India's national 104 health helpline as a &lt;a href="https://codeforgoodtech.in/" rel="noopener noreferrer"&gt;C4GT&lt;/a&gt; DMP Fellow. Six months ago I didn't know this program existed.&lt;/p&gt;

&lt;p&gt;This is the guide I wanted then. No fluff, no motivational framing. Just what it is and how to get in.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What is C4GT
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Code for GovTech&lt;/strong&gt; connects developers to open source software that governments and public institutions actually run. Not simulations of civic tech. Live systems: health, education, welfare delivery, identity. These serve millions of people and are maintained in public repositories.&lt;/p&gt;

&lt;p&gt;Why this matters more than it sounds: most government software in India is now built as &lt;strong&gt;Digital Public Goods&lt;/strong&gt;, meaning open source, openly licensed, and reusable across states. That means the code is on GitHub and you can contribute to it. A platform serving a hundred million citizens will take your pull request if it's good.&lt;/p&gt;

&lt;p&gt;The gap C4GT fills is that these repos are hard to enter cold. Large, sparsely documented, deep domain context. C4GT provides the structure: a fellowship, a mentor from the organization that owns the codebase, and a scoped project you can actually finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What is DMP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DMP&lt;/strong&gt; is the fellowship track. It's a paid, mentored, fixed term program where you work on one Digital Public Good project with a real mentor from the maintaining organization. Details: &lt;a href="https://pl-app.iiit.ac.in/c4gt" rel="noopener noreferrer"&gt;pl-app.iiit.ac.in/c4gt&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How it runs, in shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizations publish project ideas with scope and required skills&lt;/li&gt;
&lt;li&gt;You pick a project and apply through a form on the C4GT site&lt;/li&gt;
&lt;li&gt;The form runs in stages, asking for your repositories, your education, your background, and why this project&lt;/li&gt;
&lt;li&gt;Resume and proposal uploads are offered but optional&lt;/li&gt;
&lt;li&gt;Selected fellows are paired with a mentor from that organization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Midterm evaluation&lt;/strong&gt; at the halfway point: you present shipped work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final evaluation&lt;/strong&gt; at the end&lt;/li&gt;
&lt;li&gt;Stipend paid across milestones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two things that surprise people. First, it's not an internship where you're handed tickets. You shape the plan with your mentor and own delivery. Second, the code goes into the real repository. My PRs are merged into a system that live call operators use today.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. What kind of projects
&lt;/h2&gt;

&lt;p&gt;A real example: mine.&lt;/p&gt;

&lt;p&gt;India's &lt;strong&gt;104 health helpline&lt;/strong&gt; is what a citizen dials for free health advice, medical guidance, and grievance reporting. Behind that number sits &lt;a href="https://github.com/PSMRI" rel="noopener noreferrer"&gt;AMRIT&lt;/a&gt;, maintained by Piramal Swasthya. A health advisory officer answers, and inside one application does caller identification, beneficiary lookup, symptom capture, clinical decision support, and case closure.&lt;/p&gt;

&lt;p&gt;That application was built on &lt;strong&gt;Angular 4&lt;/strong&gt;, a framework long past end of life. &lt;code&gt;npm audit&lt;/code&gt; on it reports &lt;strong&gt;183 vulnerabilities&lt;/strong&gt;. My project: rebuild the frontend on &lt;strong&gt;Angular 20&lt;/strong&gt; with standalone components, zoneless change detection, signals, ZardUI, Tailwind v4, SNOMED CT clinical coding, and CDSS integration.&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%2Fpxzqynzvlvpdoveklng2.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%2Fpxzqynzvlvpdoveklng2.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;br&gt;
At midterm: 30 PRs merged, 131 commits, 52 of 60 end to end scenarios passing.&lt;/p&gt;

&lt;p&gt;Other projects run across health, education, welfare, agriculture, and identity, spanning backend, frontend, data, mobile, and DevOps. Browse the current list on the C4GT community platform; scope and stack vary widely.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How to apply
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the project list&lt;/strong&gt; at &lt;a href="https://pl-app.iiit.ac.in/c4gt" rel="noopener noreferrer"&gt;pl-app.iiit.ac.in/c4gt&lt;/a&gt;. Filter to projects whose stack you can already work in. You'll be learning the domain, so don't also be learning the language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join the &lt;a href="https://discord.gg/codeforgovtech" rel="noopener noreferrer"&gt;C4GT Discord&lt;/a&gt;.&lt;/strong&gt; This is the actual center of gravity. Announcements, mentor Q&amp;amp;A, other applicants. Join before applications open, not after.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find the repo and read it.&lt;/strong&gt; Every project maps to a public GitHub repo. Clone it. Build it. Get it running locally. This alone puts you ahead of most applicants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open a small PR before you apply.&lt;/strong&gt; Fix a typo, tighten error handling, improve a README. A mentor who has already merged something of yours is evaluating a known quantity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask your questions in public.&lt;/strong&gt; Discord or a GitHub issue, not DMs. Mentors notice who engages carefully.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fill in the application form&lt;/strong&gt; on the C4GT site. You choose your project first, then work through several stages of questions covering your repositories, your education, and your background. Resume and proposal uploads are optional. Watch the deadline. There's no extension.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  5. What to prepare
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub.&lt;/strong&gt; Pinned repos with real READMEs: what it does, how to run it, a screenshot. Ten abandoned tutorial clones read worse than two finished projects. Commit history matters more than star count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resume, optional.&lt;/strong&gt; One page. Lead with projects and what they do, not coursework. Link every repo. Skip the skills percentage bars.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The form answers. This is where it's actually decided.&lt;/strong&gt; There is no formal proposal to write. You pick a project, then work through stages of questions inside the form, and those answers are what get read. What to have ready before you start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your repository links&lt;/strong&gt;, strongest one first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why this project&lt;/strong&gt;, in terms of the problem it solves rather than how excited you are&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you would build&lt;/strong&gt;, concretely: components, endpoints, screens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence you read the code&lt;/strong&gt;, referencing actual files and actual functions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your education and background&lt;/strong&gt;, which the form asks for directly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That fourth point is the differentiator. Most applicants describe the project back to the organization in more words. If your answer says "I looked at the auth service in &lt;code&gt;src/app/core&lt;/code&gt; and here's how I'd migrate it," you're in a different pile.&lt;/p&gt;

&lt;p&gt;The resume and proposal uploads are there if you want them. Use them only if you have something the form fields can't hold, like a migration plan or a longer technical note. Skip them if all they would do is repeat your answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What it's actually like
&lt;/h2&gt;

&lt;p&gt;Honest version, three months in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The codebase is nothing like coursework.&lt;/strong&gt; Sixteen years of accumulated decisions, most undocumented. Functions that look wrong and aren't. They're compensating for backend quirks nobody wrote down. I learned this by deleting a few and breaking things. Reading legacy code well is a skill nobody teaches and everybody needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Senior devs will be direct with you.&lt;/strong&gt; My mentor rejects PRs that aren't right. That felt sharp for about a week and then became the most useful thing in the fellowship. Nobody is protecting your feelings, and that's the respect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI assisted development helps in a specific, limited way.&lt;/strong&gt; I used Claude Code for implementation and CodeRabbit for PR review. It genuinely collapsed the time to understand an unfamiliar codebase, and CodeRabbit caught real null safety and error handling bugs before review. But my hardest problem was not solvable by asking: integrating the CZentrix telephony system, which turned out to be an iframe communicating over &lt;code&gt;postMessage&lt;/code&gt; and documented nowhere. That took instrumenting the old app and reading actual traffic. AI is fast at what code does and unreliable at why. Verify everything against the running system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write things down daily.&lt;/strong&gt; I keep notes on every confirmed API contract, every environment quirk, every bug and cause. By month two I was answering my own questions from my own notes constantly. Nothing else I did had that return.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The moment that made it real:&lt;/strong&gt; a live inbound call arrived on the test system. Caller's number populated. Timer started. Workspace loaded. A real phone call from somewhere in India, rendering into a UI I'd written. That's the difference between a project and infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C4GT:&lt;/strong&gt; &lt;a href="https://codeforgoodtech.in/" rel="noopener noreferrer"&gt;https://codeforgoodtech.in/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C4GT on GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Code4GovTech/C4GT" rel="noopener noreferrer"&gt;https://github.com/Code4GovTech/C4GT&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply / community platform:&lt;/strong&gt; &lt;a href="https://pl-app.iiit.ac.in/c4gt" rel="noopener noreferrer"&gt;https://pl-app.iiit.ac.in/c4gt&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord:&lt;/strong&gt; &lt;a href="https://discord.gg/codeforgovtech" rel="noopener noreferrer"&gt;https://discord.gg/codeforgovtech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AMRIT / PSMRI repos:&lt;/strong&gt; &lt;a href="https://github.com/PSMRI" rel="noopener noreferrer"&gt;https://github.com/PSMRI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Aarti-panchal01" rel="noopener noreferrer"&gt;https://github.com/Aarti-panchal01&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My portfolio:&lt;/strong&gt; &lt;a href="https://aarti-tech-portfolio.vercel.app" rel="noopener noreferrer"&gt;https://aarti-tech-portfolio.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; &lt;a href="https://linkedin.com/in/aartipanchal01" rel="noopener noreferrer"&gt;https://linkedin.com/in/aartipanchal01&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Start now
&lt;/h2&gt;

&lt;p&gt;Applications for DMP 2027 aren't open yet, which is exactly why this is the right time.&lt;/p&gt;

&lt;p&gt;Do this today: join the &lt;a href="https://discord.gg/codeforgovtech" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;. Pick one project from last cycle's list. Clone the repo and get it running. When applications open you'll have months of context while everyone else is reading the project description for the first time.&lt;/p&gt;

&lt;p&gt;I applied assuming I wasn't ready. Second year, no industry experience, no idea if my answers were any good. They were good because I'd read the code.&lt;/p&gt;

&lt;p&gt;That's the whole trick. Go read the code.&lt;/p&gt;

&lt;p&gt;*Aarti Panchal. C4GT 2026 DMP Fellow at Piramal Swasthya, B.Tech AIML '28, PES University Bengaluru. &lt;br&gt;
Questions welcome on &lt;a href="https://linkedin.com/in/aartipanchal01" rel="noopener noreferrer"&gt;My LinkedIn&lt;/a&gt; &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>govtech</category>
      <category>fellowship</category>
    </item>
    <item>
      <title>A Live Call Landed: Rebuilding India's 104 Health Helpline from Angular 4 to Angular 20</title>
      <dc:creator>Aarti Panchal</dc:creator>
      <pubDate>Sat, 01 Aug 2026 18:40:13 +0000</pubDate>
      <link>https://dev.to/aarti-panchal01/a-live-call-landed-rebuilding-indias-104-health-helpline-from-angular-4-to-angular-20-1jn7</link>
      <guid>https://dev.to/aarti-panchal01/a-live-call-landed-rebuilding-indias-104-health-helpline-from-angular-4-to-angular-20-1jn7</guid>
      <description>&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Helpline104-UI-NEXT is the new frontend for India's 104 health helpline, part of the AMRIT platform maintained by Piramal Swasthya Management and Research Institute (PSMRI). When a citizen dials 104, a health advisory officer picks up, and everything that happens next! caller identification, beneficiary lookup, symptom capture, clinical decision support, grievance filing, case closur. happens inside this application.&lt;/p&gt;

&lt;p&gt;The version in production was built on Angular 4. That framework reached end of life years ago. npm audit on the legacy app reports 183 vulnerabilities. That's not a code-quality nitpick on a side project — it's the software layer sitting between a citizen's health question and the record of what they were told.&lt;/p&gt;

&lt;p&gt;The rebuild targets Angular 20 with the current architecture end to end:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standalone components — no NgModules anywhere in the new tree&lt;/li&gt;
&lt;li&gt;Zoneless change detection — Zone.js removed entirely&lt;/li&gt;
&lt;li&gt;Signals for state, replacing the legacy service-plus-subject patterns&lt;/li&gt;
&lt;li&gt;ZardUI + Tailwind v4 for the component and design layer&lt;/li&gt;
&lt;li&gt;SNOMED CT integration for clinically coded symptom and diagnosis capture&lt;/li&gt;
&lt;li&gt;CDSS hooks so agents get decision support inline&lt;/li&gt;
&lt;li&gt;CTI integration — the softphone lives in an iframe and communicates over postMessage&lt;/li&gt;
&lt;/ul&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%2F2hapr9kp7hy47nq2l650.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%2F2hapr9kp7hy47nq2l650.png" alt=" " width="799" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;The rebuilt RO Dashboard — live agent ID, real UAT data&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pull requests merged&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commits&lt;/td&gt;
&lt;td&gt;131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2E scenarios passing&lt;/td&gt;
&lt;td&gt;52 / 60&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App-level bugs in latest full run&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerable runtime dependencies in the rebuild&lt;/td&gt;
&lt;td&gt;0 (npm audit --omit=dev)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular versions jumped&lt;/td&gt;
&lt;td&gt;4 → 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Dev tooling has 20 vulnerabilities (vite, ws, socket.io-adapter) — none shipped to production.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hardest problem I solved
&lt;/h2&gt;

&lt;p&gt;Getting a real inbound call to land in the new app.&lt;/p&gt;

&lt;p&gt;The telephony side is a CZentrix CTI system. The softphone is an embedded iframe that pushes call events over postMessage. Nothing about that was written down. Figuring it out meant instrumenting the legacy app, watching what actually crossed the boundary, and reconstructing the contract from observed traffic.&lt;/p&gt;

&lt;p&gt;Then came the ordering problems. A postMessage can arrive before authentication resolves, so the handler had to be gated on CTI-eligible auth state or it would process a call for a user who wasn't logged in yet. Agent ID parsing had an off-by-one in how the payload was split. Call state didn't survive a page reload so an agent refreshing mid-call lost the panel.&lt;/p&gt;

&lt;p&gt;Then it worked.&lt;/p&gt;

&lt;p&gt;A real inbound call came through on UAT. The caller's number auto-populated in the header. The call timer started counting. The agent workspace loaded with the right context. I watched a live phone call from somewhere in India render itself into a UI I had written, and there is no unit test that feels like that.&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%2Fzojndcma610f4iuqpiru.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%2Fzojndcma610f4iuqpiru.png" alt=" " width="799" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Live call, SNOMED CT returning real clinical concepts from UAT&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned with AI-assisted coding
&lt;/h2&gt;

&lt;p&gt;I used Claude Code for implementation and CodeRabbit for automated PR review across the whole fellowship.&lt;/p&gt;

&lt;p&gt;What it genuinely changed: reading a large unfamiliar codebase went from the slowest part of the job to a tractable one. CodeRabbit caught real defects — null-safety gaps, error banners that dismissed themselves too early, response shapes I'd assumed instead of verified.&lt;/p&gt;

&lt;p&gt;What it did not change: the CTI integration was not solvable by asking. No model knew what CZentrix actually sent over postMessage because it wasn't documented anywhere. That required instrumenting the old app and reading actual traffic.&lt;/p&gt;

&lt;p&gt;The pattern that held: AI is fast at what the code does and unreliable at why it does it. Every time I deleted something that looked wrong, it was compensating for a backend quirk nobody wrote down. Verify everything against the running system.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;Close remaining E2E gaps — mostly waiting on backend fixes and reference data&lt;/li&gt;
&lt;li&gt;Finish remaining supervisor configuration screens&lt;/li&gt;
&lt;li&gt;Accessibility pass — keyboard navigation and screen reader support&lt;/li&gt;
&lt;li&gt;Unit test coverage — zero specs today on signal stores and guards&lt;/li&gt;
&lt;li&gt;Production deployment and handover documentation&lt;/li&gt;
&lt;/ul&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%2Fu0f8gs8i9uzv4bq8lslt.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%2Fu0f8gs8i9uzv4bq8lslt.png" alt=" " width="799" height="401"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;30 PRs merged, every one reviewed by CodeRabbit + Mentor&lt;/strong&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/PSMRI" rel="noopener noreferrer"&gt;AMRIT / PSMRI on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/PSMRI/Helpline104-UI-NEXT" rel="noopener noreferrer"&gt;Helpline104-UI-NEXT repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Aarti-panchal01/c4gt-2026-amrit" rel="noopener noreferrer"&gt;Daily progress logs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pl-app.iiit.ac.in/c4gt" rel="noopener noreferrer"&gt;C4GT community platform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.gg/codeforgovtech" rel="noopener noreferrer"&gt;C4GT Discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Aarti-panchal01" rel="noopener noreferrer"&gt;My GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aarti-tech-portfolio.vercel.app" rel="noopener noreferrer"&gt;Portfolio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/in/aartipanchal01" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thinking about applying to C4GT DMP 2027? The &lt;a href="https://discord.gg/codeforgovtech" rel="noopener noreferrer"&gt;C4GT Discord&lt;/a&gt; is where it starts, and the &lt;a href="https://pl-app.iiit.ac.in/c4gt" rel="noopener noreferrer"&gt;C4GT community platform&lt;/a&gt; lists the projects. I applied assuming I wasn't ready. Second year, no industry experience, no idea if my proposal was any good. What's stopping you? Ask me anything in the comments.&lt;/p&gt;

</description>
      <category>tailwindcss</category>
      <category>opensource</category>
      <category>angular</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
