Small Problems Deserve Solutions: Building a UoM GPA Calculator
Where the Idea Came From
I've always had a thing for building things that are useful to people.
It doesn't always have to be the biggest innovation. It may not be the most technically challenging project either. Sometimes, there is simply a problem that keeps bothering people, and someone needs to sit down and solve it.
This project started exactly like that.
At the University of Moratuwa, students can view their examination results through the online LMS. Once the results are released, however, many students still have to manually calculate their current CGPA.
For some of my friends, especially friends outside CSE, this became a surprisingly tedious process. They would go through their results, collect the relevant credits and grades, apply the GPA calculation, and repeat the process whenever they wanted to check their updated CGPA.
One of my friends even wrote about this experience on LinkedIn.
That made me think.
We already had a browser extension for Chrome that could calculate the GPA directly from the LMS. So why were people still doing this manually?
There Was Already a Solution
Before building anything, I looked at the existing Chrome extension.
It was already a useful idea. Install it, open the results page, and let the extension calculate your GPA.
But there were some problems.
The UoM results page is not always as straightforward as a simple table of subjects and grades. There can be repeated modules, results separated across semesters, provisional results, pending results, and modules that should not contribute to the GPA.
The existing extension did not handle some of these situations correctly.
One of the problems was when a module was separated across two semesters. Another was the way provisional results were handled.
That was enough for me to think that there was room for another implementation.
Not necessarily a better idea.
Just a better answer to the specific problems I was seeing.
Why Firefox?
I use Firefox.
I've also always been interested in open source software, so building a Firefox extension felt like a natural choice.
But there was something else.
There wasn't a Firefox extension for this problem.
I remember thinking, why not?
So I started building one.
Building the Extension
Technically, the implementation was not particularly difficult.
The extension reads the results table from the UoM LMS page, identifies the relevant modules and grades, and calculates the cumulative GPA.
The important part was not writing a complicated algorithm.
It was figuring out what should actually be calculated.
For example, a module with a PENDING result should not suddenly become part of the GPA calculation.
Some modules have no GPA credits and should be excluded.
Repeated modules need special consideration as well. The extension needs to understand which attempt should actually contribute to the calculation rather than blindly counting every appearance.
The grade values are then mapped to the corresponding grade points and used to calculate the cumulative GPA.
There was no sophisticated backend.
No database.
No API.
No machine learning.
Just a browser extension doing one job.
And that was enough.
The Part That Mattered More Than Coding
This project also reminded me of something I've increasingly started to appreciate.
Sometimes, the most important part of software engineering happens before writing the code.
I used AI heavily while building the extension. It helped with implementation and made the coding process much faster.
But the AI could not decide what the real problem was.
It could not talk to my friends.
It could not notice that students were repeatedly doing the same manual calculation.
It could not understand why a seemingly small edge case actually mattered to someone using the tool.
That part was mine.
The interesting lesson for me was that requirements specification is not just something we do because a software engineering textbook tells us to.
It comes from understanding people.
The users already had a workflow. They already had a problem. My job was to understand that pain point properly and then build something around it.
In a way, the coding was the easy part.
Understanding what to code was more important.
From Something for Friends to Something for Everyone
I never planned to publish the extension.
Initially, this was just something I built because I knew people who needed it.
But once it was working, I started thinking that there was no reason to keep it within my small circle.
So I published the Firefox extension.
A small tool that started as something for my friends was now available to anyone who needed it.
Then Came Chrome and Edge
After publishing the Firefox version, I started thinking about browser choice.
Firefox is what I use, but that doesn't mean everyone else should have to use it.
Most students use Chrome, and Edge is common too.
That is their choice.
So why should the tool restrict them?
I restructured the project and added Chrome and Edge builds while keeping the same core parsing and calculation logic.
The source code is available on GitHub.
It was a small thing, but I liked what it represented.
Software should be flexible enough to meet people where they already are.
What Comes Next
The feedback has already given me ideas for the next version.
One feature I want to add is the ability to enter proposed marks for upcoming semesters and see how those results could affect the final CGPA.
More importantly, students could see what they need to achieve to reach a particular target, whether that is a First Class, Second Upper, Second Lower, or another academic goal.
At that point, the extension would no longer just answer:
What is my GPA?
It could also answer:
What do I need to do next?
I think that could make it more than a calculator.
It could become a small motivational tool.
Small Things Matter Too
As computer science students, we are often drawn toward ambitious projects.
Artificial intelligence.
Robotics.
Distributed systems.
Large platforms.
Groundbreaking research.
And there is nothing wrong with that.
I enjoy building those things too.
But this project reminded me that software does not have to be groundbreaking to be valuable.
A project can solve one small problem for one real person, and still be worth building.
We may build massive systems with thousands of features and tens of thousands of lines of code.
But to me, helping one person with something they genuinely struggled with can matter more than all of that.
Because the purpose matters.
Maybe this is not the most technically impressive thing I've built.
Maybe it never will be.
But every time someone doesn't have to manually calculate their CGPA anymore, it has done exactly what I wanted it to do.
And sometimes, that is enough.
You can find the Firefox extension here and the source code on GitHub.