Virtus banner

Virtus

12 devlogs
15h 24m 8s

“Virtus” means excellence and valor. This application is a terminal-based grades tracker and school assignment manager for those who strive to succeed with minimal distractions.

Demo Repository

Loading README...

sohiearth

Shipped this project!

Hours: 16.29
Cookies: 🍪 50
Multiplier: 20.08 cookies/hr

I built a school assignment/grades tracker, easily controllable from the terminal. The target audience is exactly the types of people involved with Hackclub, which are high school programmers dealing with the balance of school and programming.

The difficult part was learning a new API, ncurses, a sometimes bug prone and hard to use library.

I was able to fix the hard to read codebase mentioned in the previous ship by implementing clang-format and clang-tidy into my workflow.

Virtus implements a assignment-based tracking system, and classes are created on-demand. The assignment data is then used to calculate GPA, weighted GPA, and various types of GPA calculation methods. There are additional features built off of the data that assignments provide, such as a calendar.

The only use of AI for the project was in the readme, where I needed to learn how to center a div. Probably less than 1% of my project as a whole.

sohiearth

Virtus v1.0.0-3

“The summit is built in steps.”

This update is all about embracing the “kaizen” spirit and making small improvements here and there.

Notable Changes

  • Messages when no assignments/classes are added.
  • Improving the codebase - optimizations in various + improving code readability.
  • Readme improvements - changing up the layout, adding information about dependencies.
Attachment
Attachment
Attachment
Attachment
0
sohiearth

Minor Update

  • Updated README according to rejection reason
  • Linux Support
Attachment
0
sohiearth

Shipped this project!

Hours: 14.87
Cookies: 🍪 305
Multiplier: 20.49 cookies/hr

Shipping Virtus (v1,0,0)!

Overview

Releasing this project because it’s starting to experience feature creep.
Had a blast with TUI development, and reminded me a lot of the SDL2 days where I had fun with immediate mode rendering. I might take on that project next. For now, virtus has finished initial development and the addition of new features may be slowed.

Trouble

  • Codebase woes
    I had trouble with managing the cleanliness of the codebase since it’s easy to get a lot of magic numbers when dealing with immediate mode. I was able to use some clever numeric operations to automate line increments and keep the codebase readable.
  • Cursed curses
    I used curses since it was relatively easy to use. The couple downsides that come with that is that: it’s sometimes a bit buggy, CMake compatibility is spotty, and no Windows support. The first and last were acceptable tradeoffs since I run a Mac/Linux setup, but the lack of clear CMake compatibility made me give up on writing all the CMake code myself and relied on StackOverflow and some Copilot. I’ll try to read more documentation/trial and error next time before pulling the trigger on AI.
sohiearth

The Prep Update

Updates

  • Improved the onboarding experience to introduce the navigation
  • Added a classes tab
Attachment
Attachment
Attachment
0
sohiearth

The Grades Update

Updates

Worked on improving grades calculation.

  • Added a Grade/GPA Breakdown by Class section in the grades page.
  • Added a Grade Contribution by Assignment section to see which assignments are affecting grades.
  • Added a setting that lets you configure which type of grade calculation should be used. For now, I only have averages and international baccalaureate calculation methods.
  • Updated the initial setup section since it hadn’t been updated since the start of the project.

What’s Next?

  • The ability to add custom calculation methods.
  • The app might be hard to use, so I think I’ll update the onboarding experience a bit more and introduce more parts of the program.
Attachment
Attachment
Attachment
Attachment
0
sohiearth

The Lazy Update

  • Added GitHub Actions build automation. (curses is only supported on Unix systems, so the program will be limited to Linux & macOS.)
Attachment
0
sohiearth
  • Added per-class GPA calculation and a “Remove Assignment” button in home.
Attachment
Attachment
0
sohiearth

Added a calendar view.

Attachment
0
sohiearth

The Human Readable Code Update

  • Added a unified “interface” structure that builds the interface and draws it at once, reducing the number of calls made and improving the performance and overall look of the program. By doing so, I was also able to add an interface setting that controls the behavior of the draw functions. The attachments show the difference the settings make.
Attachment
Attachment
0
sohiearth

The Clean Up Update

Updates

Clean up the interface a bit more. Made sure the horizontal space between levels of headings is always 2, added more space between elements/toggles, etc.

Dissatisfactions

The code looks pretty messy though, which is something that I am definitely not satisfied with.
In addition, the Assignments and Grades tab look really rushed. I think I’m going to focus on those two next.

Attachment
Attachment
Attachment
Attachment
0
sohiearth

The UI Update

  • Cleaned up the interface. I didn’t want to use the move() functions at first, but I ended up needing them to make clean grids.
  • Added a tab bar, and made some tabs that have some dummy info. Before I continue on with making the “assignment manager” part of the program, I think I’ll rewrite some more interface functions and clean up the code.
Attachment
Attachment
Attachment
Attachment
0
sohiearth

I added basic assignment management. Struggled a bit since it’s my first time using curses, but I think I got something pretty good here.

Attachment
0
sohiearth

Added initial project boilerplate

Attachment
0