<?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: Suman Kumar Singh</title>
    <description>The latest articles on DEV Community by Suman Kumar Singh (@skrajput).</description>
    <link>https://dev.to/skrajput</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%2F3984636%2Fbbbf9125-90b9-4267-b0af-1bbfdef5cdee.png</url>
      <title>DEV Community: Suman Kumar Singh</title>
      <link>https://dev.to/skrajput</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/skrajput"/>
    <language>en</language>
    <item>
      <title># I Built a Full Stack Academic Management System for My College — Here's How</title>
      <dc:creator>Suman Kumar Singh</dc:creator>
      <pubDate>Mon, 15 Jun 2026 04:08:43 +0000</pubDate>
      <link>https://dev.to/skrajput/-i-built-a-full-stack-academic-management-system-for-my-college-heres-how-2fnh</link>
      <guid>https://dev.to/skrajput/-i-built-a-full-stack-academic-management-system-for-my-college-heres-how-2fnh</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Full Stack Academic Management System
&lt;/h1&gt;

&lt;h1&gt;
  
  
  for My College — Here's How
&lt;/h1&gt;

&lt;p&gt;For my B.Tech final year project, me and my team &lt;br&gt;
built &lt;strong&gt;Student Sphere&lt;/strong&gt; — a complete academic &lt;br&gt;
management system that connects Students, Faculty, &lt;br&gt;
and Administrators on one platform.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live Website:&lt;/strong&gt; &lt;a href="https://studentsphere0.netlify.app" rel="noopener noreferrer"&gt;https://studentsphere0.netlify.app&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem We Were Solving
&lt;/h2&gt;

&lt;p&gt;Our college (like most colleges in India) was &lt;br&gt;
managing everything manually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 Attendance → Paper registers&lt;/li&gt;
&lt;li&gt;📝 Marks → Excel sheets&lt;/li&gt;
&lt;li&gt;📢 Notices → Physical board&lt;/li&gt;
&lt;li&gt;📁 Assignments → Physical handouts&lt;/li&gt;
&lt;li&gt;📊 Reports → Manual entry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We thought — why not build a system that &lt;br&gt;
digitalizes all of this?&lt;/p&gt;

&lt;p&gt;So we did. 💪&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Student Sphere&lt;/strong&gt; has 3 role-based dashboards:&lt;/p&gt;

&lt;h3&gt;
  
  
  👨‍🎓 Student Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;View attendance percentage with eligibility status&lt;/li&gt;
&lt;li&gt;Check marks and grade card (A+ to F)&lt;/li&gt;
&lt;li&gt;Download study notes uploaded by faculty&lt;/li&gt;
&lt;li&gt;Submit assignments and lab reports digitally&lt;/li&gt;
&lt;li&gt;View notices targeted to their semester&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👩‍🏫 Faculty Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Update attendance and marks (bulk or individual)&lt;/li&gt;
&lt;li&gt;Upload notes, assignments, lab reports&lt;/li&gt;
&lt;li&gt;Set due dates and control submission windows&lt;/li&gt;
&lt;li&gt;Post notices to specific semesters or all students&lt;/li&gt;
&lt;li&gt;View all student submissions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🛡️ Admin Dashboard
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Approve or reject new registrations&lt;/li&gt;
&lt;li&gt;Manage all students and faculty accounts&lt;/li&gt;
&lt;li&gt;Bulk promote entire semesters with undo&lt;/li&gt;
&lt;li&gt;View system-wide statistics&lt;/li&gt;
&lt;li&gt;Manage all notices&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;HTML5, CSS3, Vanilla JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero frameworks&lt;/strong&gt; — no React, no Vue, no Bootstrap&lt;/li&gt;
&lt;li&gt;Single CSS file (~2400 lines) for all 7 pages&lt;/li&gt;
&lt;li&gt;Dark and Light theme toggle&lt;/li&gt;
&lt;li&gt;Fully responsive — mobile to 4K&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Backend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js + Express.js v5&lt;/li&gt;
&lt;li&gt;JWT authentication (7 day expiry)&lt;/li&gt;
&lt;li&gt;bcrypt password hashing (12 salt rounds)&lt;/li&gt;
&lt;li&gt;REST API with 30+ endpoints&lt;/li&gt;
&lt;li&gt;Role-based access control middleware&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Database
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB Atlas (cloud hosted)&lt;/li&gt;
&lt;li&gt;Mongoose ODM&lt;/li&gt;
&lt;li&gt;3 collections: Users, Data, Notices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Frontend → Netlify (auto deploy from GitHub)&lt;/li&gt;
&lt;li&gt;Backend → Render (auto deploy from GitHub)&lt;/li&gt;
&lt;li&gt;Database → MongoDB Atlas free tier&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Mobile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Android app built with Android Studio (Java)&lt;/li&gt;
&lt;li&gt;WebView wrapper&lt;/li&gt;
&lt;li&gt;APK available on GitHub Releases&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Interesting Technical Challenges
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1 — Faculty Page Was Taking 25 Seconds to Load
&lt;/h3&gt;

&lt;p&gt;When the faculty dashboard loaded, it was making &lt;br&gt;
&lt;strong&gt;46 separate API calls&lt;/strong&gt; — one for each student.&lt;/p&gt;

&lt;p&gt;Each call: 300ms × 46 students = &lt;strong&gt;14+ seconds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I added a bulk endpoint on the backend:&lt;/p&gt;

&lt;p&gt;Javascript&lt;br&gt;
router.post('/bulk', protect(), async (req, res) =&amp;gt; {&lt;br&gt;
  const { emails } = req.body;&lt;br&gt;
  const dataArr = await Data.find({ &lt;br&gt;
    email: { $in: emails } &lt;br&gt;
  });&lt;br&gt;
  const result = {};&lt;br&gt;
  dataArr.forEach(d =&amp;gt; { result[d.email] = d; });&lt;br&gt;
  res.json(result);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;One MongoDB &lt;code&gt;$in&lt;/code&gt; query instead of 46 individual &lt;br&gt;
queries. Load time dropped from &lt;strong&gt;25 seconds to &lt;br&gt;
2-3 seconds.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Challenge 2 — Role Based Single Page Application
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Without React
&lt;/h3&gt;

&lt;p&gt;All three dashboards are single HTML files with &lt;br&gt;
multiple hidden sections. Clicking sidebar items &lt;br&gt;
runs this:&lt;/p&gt;

&lt;p&gt;javascript&lt;br&gt;
function switchSec(id) {&lt;br&gt;
  document.querySelectorAll('.section')&lt;br&gt;
    .forEach(s =&amp;gt; s.classList.remove('active'));&lt;br&gt;
  document.getElementById('sec-' + id)&lt;br&gt;
    .classList.add('active');&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;No React. No router. Just vanilla JavaScript.&lt;br&gt;
Feels like an SPA — no page reloads.&lt;/p&gt;




&lt;h3&gt;
  
  
  Challenge 3 — Mobile Tables
&lt;/h3&gt;

&lt;p&gt;On mobile, HTML tables require horizontal scrolling &lt;br&gt;
which is terrible UX. I converted all tables to &lt;br&gt;
card layout at 640px using only CSS:&lt;/p&gt;

&lt;p&gt;css&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/media"&gt;@media&lt;/a&gt; (max-width: 640px) {&lt;br&gt;
  .table-wrap thead tr { display: none; }&lt;br&gt;
  .table-wrap tbody tr {&lt;br&gt;
    display: block;&lt;br&gt;
    border: 1px solid var(--border2);&lt;br&gt;
    border-radius: 8px;&lt;br&gt;
    margin-bottom: 12px;&lt;br&gt;
    padding: 14px;&lt;br&gt;
  }&lt;br&gt;
  .table-wrap tbody td {&lt;br&gt;
    display: flex;&lt;br&gt;
    justify-content: space-between;&lt;br&gt;
    padding: 6px 0;&lt;br&gt;
    border-bottom: 1px solid var(--border);&lt;br&gt;
  }&lt;br&gt;
  .table-wrap tbody td[data-label]::before {&lt;br&gt;
    content: attr(data-label);&lt;br&gt;
    font-size: 0.71rem;&lt;br&gt;
    font-weight: 700;&lt;br&gt;
    color: var(--muted);&lt;br&gt;
    text-transform: uppercase;&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Zero horizontal scrolling. Everything fits &lt;br&gt;
perfectly on mobile.&lt;/p&gt;




&lt;h3&gt;
  
  
  Challenge 4 — JWT Auth Without Framework
&lt;/h3&gt;

&lt;p&gt;javascript&lt;br&gt;
// Middleware&lt;br&gt;
const protect = (role) =&amp;gt; async (req, res, next) =&amp;gt; {&lt;br&gt;
  const token = req.headers.authorization?.split(' ')[1];&lt;br&gt;
  if (!token) &lt;br&gt;
    return res.status(401).json({ msg: 'No token' });&lt;/p&gt;

&lt;p&gt;const decoded = jwt.verify(token, process.env.JWT_SECRET);&lt;br&gt;
  const user = await User.findById(decoded.id);&lt;/p&gt;

&lt;p&gt;if (!user.isApproved) &lt;br&gt;
    return res.status(403).json({ &lt;br&gt;
      code: 'PENDING_APPROVAL' &lt;br&gt;
    });&lt;/p&gt;

&lt;p&gt;if (role &amp;amp;&amp;amp; user.role !== role) &lt;br&gt;
    return res.status(403).json({ msg: 'Forbidden' });&lt;/p&gt;

&lt;p&gt;req.user = user;&lt;br&gt;
  next();&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;Every protected route passes through this &lt;br&gt;
middleware before any data is returned.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;Frontend/&lt;br&gt;
├── index.html&lt;br&gt;
├── login.html&lt;br&gt;
├── register.html&lt;br&gt;
├── student.html&lt;br&gt;
├── faculty.html&lt;br&gt;
├── admin.html&lt;br&gt;
├── about-dev.html&lt;br&gt;
├── css/&lt;br&gt;
│   └── style.css&lt;br&gt;
└── js/&lt;br&gt;
    ├── utils.js&lt;br&gt;
    ├── auth.js&lt;br&gt;
    ├── api.js&lt;br&gt;
    ├── main.js&lt;br&gt;
    ├── student.js&lt;br&gt;
    ├── faculty.js&lt;br&gt;
    └── admin.js&lt;/p&gt;

&lt;p&gt;Backend/&lt;br&gt;
├── server.js&lt;br&gt;
├── middleware/auth.js&lt;br&gt;
├── models/&lt;br&gt;
│   ├── User.js&lt;br&gt;
│   ├── Data.js&lt;br&gt;
│   └── Notice.js&lt;br&gt;
└── routes/&lt;br&gt;
    ├── auth.js&lt;br&gt;
    ├── users.js&lt;br&gt;
    ├── data.js&lt;br&gt;
    └── notices.js&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## The Team

Built by 5 B.Tech students from
**Ramgovind Institute of Technology, Koderma**
under the guidance of **Mr. Ajay Kumar Dangi** 
(H.O.D, CSE Department)

| Name | Role |
|---|---|
| Suman Kumar Singh | Full Stack Developer |
| Abhinav Anand | UI / UX Designer |
| Aman Kumar Vikarn | Backend Developer |
| Sachin Mandal | Database Management |
| Suman Das | Testing &amp;amp; QA |

---

## Links

🌐 Live Website: https://studentsphere0.netlify.app

💻 Frontend GitHub: 
https://github.com/sumankumarsinghrajput/studentsphere-frontend

🔧 Backend GitHub: 
https://github.com/sumankumarsinghrajput/studentsphere-backend

📱 Android APK: Available on GitHub Releases

---

## What I Learned

- Building a complete full stack app from scratch 
  without any frontend framework teaches you how 
  things actually work under the hood
- Performance optimization matters more than 
  features — 25 second load time kills UX no 
  matter how good the features are
- Database schema design decisions made early 
  affect everything later
- Deployment is not just uploading files — 
  CORS, environment variables, security headers, 
  sitemap, robots.txt — all matter

---

If you have any questions about the tech stack, 
implementation, or challenges we faced — 
drop them in the comments below! 👇

Happy to help anyone building something similar.

\#webdev \#javascript \#nodejs \#mongodb 
\#fullstack \#opensource \#beginners

---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>mongodb</category>
    </item>
  </channel>
</rss>
