<?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: Mokash Kumar</title>
    <description>The latest articles on DEV Community by Mokash Kumar (@mokshlohana).</description>
    <link>https://dev.to/mokshlohana</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%2F4028736%2F63fe25b0-817d-4f60-825c-7e6733682696.png</url>
      <title>DEV Community: Mokash Kumar</title>
      <link>https://dev.to/mokshlohana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mokshlohana"/>
    <language>en</language>
    <item>
      <title>How I Built an Ultra-Fast, Programmatic Results &amp; GPA Portal for My University (MUET)</title>
      <dc:creator>Mokash Kumar</dc:creator>
      <pubDate>Tue, 14 Jul 2026 12:22:28 +0000</pubDate>
      <link>https://dev.to/mokshlohana/how-i-built-an-ultra-fast-programmatic-results-gpa-portal-for-my-university-muet-276n</link>
      <guid>https://dev.to/mokshlohana/how-i-built-an-ultra-fast-programmatic-results-gpa-portal-for-my-university-muet-276n</guid>
      <description>&lt;p&gt;At Mehran University of Engineering and Technology (MUET), Jamshoro, results are traditionally announced via large, static PDF tables. But the main issue is:&lt;/p&gt;

&lt;p&gt;Every semester, the same story.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need to check your result? Open your laptop.&lt;/li&gt;
&lt;li&gt;Connect to the university network... or set up a VPN.&lt;/li&gt;
&lt;li&gt;Want to know your actual class or batch rank? Good luck guessing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That frustration became my latest project.&lt;/p&gt;

&lt;p&gt;To solve this, I set out to build the &lt;strong&gt;MUET Results Portal&lt;/strong&gt; (&lt;code&gt;https://muetresults.vercel.app&lt;/code&gt;)—an independent, open-source lookup engine and administrative compiler that provides students with instant semester results, CGPA calculations, batch standings, and interactive academic calendars.&lt;/p&gt;

&lt;p&gt;Here is an engineering deep-dive into how I built it using a serverless GitOps pipeline, vanilla JavaScript SPA, and Gemini AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Architecture &amp;amp; Data Pipeline
&lt;/h2&gt;

&lt;p&gt;To keep the platform hosting costs at absolute zero while maintaining lighting-fast page loads, I designed a pre-rendered static pipeline. Rather than querying a database at runtime, all student data is compiled statically.&lt;/p&gt;

&lt;p&gt;Here is the GitOps workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Official PDF Release&lt;/strong&gt;: The Mehran University Examination Department publishes a new results PDF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM OCR Parsing&lt;/strong&gt;: Via a secure administrative panel (&lt;code&gt;/mokshadmin&lt;/code&gt;), I upload the scanned PDF/image. A serverless backend function streams the document to the &lt;strong&gt;Google Gemini 1.5 Flash API&lt;/strong&gt;, which returns structured JSON student records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git Database Update&lt;/strong&gt;: The approved JSON records are committed back to the repository's git-tracked database (&lt;code&gt;muet_student_gpa_dataset.csv&lt;/code&gt;) using the GitHub REST API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD Pre-rendering Build&lt;/strong&gt;: The new commit triggers a Vercel build hook. Node compilation scripts read the CSV database and:

&lt;ul&gt;
&lt;li&gt;Group records and compile them into static runtime JSON structures.&lt;/li&gt;
&lt;li&gt;Pre-render complete static HTML folder structures for all batch rankings and departments.&lt;/li&gt;
&lt;li&gt;Regenerate SEO sitemaps (&lt;code&gt;sitemap.xml&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Deployment&lt;/strong&gt;: Vercel serves the pre-rendered static files instantly to clients worldwide.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💻 Tech Stack Decisions: Why Vanilla JS?
&lt;/h2&gt;

&lt;p&gt;For the student lookup portal, I avoided heavy frameworks like React, Next.js, or Angular. Instead, I chose &lt;strong&gt;Vanilla HTML5, CSS3, and ES6+ JavaScript modules&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Largest Contentful Paint (LCP)&lt;/strong&gt;: &amp;lt; 0.6s. The page loads and displays instantly on slow mobile networks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cumulative Layout Shift (CLS)&lt;/strong&gt;: 0. Layout container sizes are predefined, resulting in zero jumps as rankings render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Hydration Mismatch&lt;/strong&gt;: In standard SPAs, crawlers read empty root divs before JavaScript mounts. By pre-rendering the static HTML shells of all program lists and rankings (e.g., &lt;code&gt;/ranking/23CS&lt;/code&gt;) at compile time, search engine bots read the completed tables instantly—even with JavaScript disabled.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📈 Search Optimization (SEO) &amp;amp; AI Search Citation
&lt;/h2&gt;

&lt;p&gt;To ensure the portal became the #1 resource for MUET searches, I optimized it for generative AI answer engines (Generative Engine Optimization - GEO) and traditional search:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Structured Schema Graphs&lt;/strong&gt;: I integrated dynamic JSON-LD schemas in the head of each view:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HowTo Schema&lt;/strong&gt; on the GPA Calculator to capture step-by-step calculation lookups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset Schema&lt;/strong&gt; on batch rankings so search engine bots index student lists as structural datasets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAQPage Schema&lt;/strong&gt; on the Academic Calendar to display rich expandable FAQs directly in search results.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index Protection&lt;/strong&gt;: Blocked programmatic student lookups (&lt;code&gt;/result/*&lt;/code&gt;) in &lt;code&gt;robots.txt&lt;/code&gt; and sent &lt;code&gt;X-Robots-Tag: noindex&lt;/code&gt; headers, preventing index bloat while focusing crawl budget on high-value tools.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  💡 What I Learned
&lt;/h2&gt;

&lt;p&gt;Building this portal taught me the value of solving real-world local problems. By focusing on performance constraints, clean semantic code, and automated AI data extraction, I was able to build a tool that helps thousands of students on campus.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check out the live portal:&lt;/strong&gt; &lt;a href="https://muetresults.vercel.app" rel="noopener noreferrer"&gt;https://muetresults.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/mokashkumar1" rel="noopener noreferrer"&gt;https://github.com/mokashkumar1/muet-results-portal&lt;/a&gt; (Feel free to star or contribute!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn:&lt;/strong&gt; Connect with me at &lt;a href="https://www.linkedin.com/in/mokashkumar/" rel="noopener noreferrer"&gt;linkedin.com/in/mokashkumar/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>education</category>
      <category>opensource</category>
      <category>showdev</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
