Developer updates

📊 Summer 2020 grades

Summer 2020 data was received from the University of Houston and will start uploading to the database at 5:00PM on December 29, 2020 (Houston time). Some downtime may be experienced during that period. Expect Summer 2020 data to populate overnight.

Source data

Interim Undergraduate Grade Policy

In my last update, I added Spring 2020 grades to the database. In that update, UH did not provide me with any data on the “NCR” count, but did provide data for the “S” count. However, UH did provide “NCR” data for Summer 2020. That can be seen in the source data but won’t be visible on the website until a future update is made.

📊 Spring 2020 grades

Spring 2020 data was received from the University of Houston and will start uploading to the database at 2:00 AM on July 16, 2020 (Houston time). Some downtime may be experienced during that period. Expect Spring 2020 data to populate during the day of July 16, 2020.

Source data

Interim Undergraduate Grade Policy

Some of you may be curious about the effects of the Interim Undergraduate Grade Policy that was in place during the Spring 2020 semester. This policy was put in place in response to the sudden transition to online learning as a result of the COVID-19 global health crisis. Below are 3 visual aids that present the number of grades issued for the Spring 2020, Fall 2019, and Spring 2019 semesters.

Before making any conclusions from this visual aid, I recommend you analyze the source data yourself below.


  • “S” means “Satisfactory”, as described here.
  • “W” means “Drop with W”, as described here.


Edit, July 20, 2020:

If you’re curious about where “NCR” grades factored into this, I cannot provide any answers. In my formal public data request to the University of Houston, I requested that “NCR” grades be included, but they were specifically excluded in their response.

My phrasing:

Please note, I have included the “S” and “NCR” fields as part of the Spring 2020 Interim Grade Policy. If including these fields is extra work or otherwise incompatible with your procedures, please do not include them as part of this request.

This phrasing is specific because if I ask for data that they cannot/won’t produce due to any reason, it could invalidate my entire request.

🔭 Future update: Groups + Roadmap

Big wall of text incoming, I’ve been busy.

What’s next?

The next planned features for CougarGrades include the “Groups” page (temporary name). This page has been greyed out and marked with a “🔒” in the navigation bar since launch. The intended use of this feature is to compare courses in a specific category or “Group”. Specifically, I’m referring to the UH Core Curriculum by Component Area. These Component Areas are what most UH students are probably familiar with, such as: Life & Physical Sciences, Language, Philosophy, & Culture, Writing in the Disciplines, and many others.

Road Map

Here’s a rough road map of what I’d like to have prepared before introducing “Groups”. The ones that are checked are already done, the “-“ indicate W.I.P.

Progress so far

Technical mumbo jumbo ahead:

A big challenge of introducing new data into CougarGrades is that importing and indexing over 100,000 rows of CSV into NoSQL can be a challenge when it comes to timing. As I’ve noted before, past database upgrades have taken up to 12 hours or more to complete using the legacy Python importer tool. This is because the tool ran synchronously where each row of data was ran one at a time and required a multiple round-trips to verify that duplicates weren’t being created (very slow).

I’m proud to say that this is not the case anymore. As part of the API 2.0.0, future imports are done entirely in the cloud and are processed asynchronously by serverless, idempotent, cloud functions (SUPER fast).

Paired with a rewritten Importer tool in TypeScript, the entire CougarGrades database can be imported and calculated in less than 45 minutes instead of 12 hours or more.

Here’s a demo:

This was a lot of work and there were a lot of challenges along the way. For example, I needed to figure out how to incrementally calculate standard deviation without accessing any of the other elements at runtime. For my first dive into concurrent computing, I’m really proud of how it turned out.

The Present + Future

The current version of the website (0.4.3) will stay published throughout this first round of Fall 2020 course registration to ensure stability and uptime. I’m planning on deploying to production when the “Groups” feature is ready. I want to take my time and get it right. Thankfully, there’s a lot of time until August when the next round of course registration runs through.

Thanks for using CougarGrades! Stay safe and good luck on finals.

Enjoy your Summer! ⛱️🌴

🔧 0.4.3 Update

This update fixes some issues with the site and more.


  • [525344d] Fixed dark mode bug (#4)
  • [c93d28b] Security patch with “npm audit”

🔨 API Update 1.1.0


This update pertains to the public Web API intended for use by students and developers that want to consume CougarGrades data without some of the overhead that may be involved in consuming the CSV data on your own. This update is not related to improvements to the CougarGrades website.

Technical mumbo

The public HTTP API has been updated to support instructor-related data. This update adds the new /instructors endpoint that can be queried by a search term through the query parameter, or an individual instructor can be accessed through the fullName parameter.

To read more about the public API, check out the documentation or inspect the source code below.