Tasker

A Qt desktop app that converts your Canvas .ics calendar into weighted, color-coded to-dos—built for overloaded students.

Project Overview

What is Tasker?

Tasker is a Qt-based desktop application designed specifically for students, allowing them to organize their assignments, quizzes, and exams into a clear, prioritized task list. A key feature is Tasker's built-in .ics importer, which lets students effortlessly populate their to-do lists by directly importing calendar files exported from Canvas.

Tasks can be categorized by class, assigned custom grade-weight tags, rated by difficulty, and visually distinguished using color-coded labels. With dynamic sorting by due date, importance, or grade impact, Tasker helps students quickly identify and focus on their most critical tasks, simplifying task management even during busy semesters.

My Role

Our team consisted of four members, tasked with building an eLearning-focused application as part of an introductory software engineering course. The primary objective was to gain hands-on experience with Agile methodology rather than solely delivering a complex product. Emphasis was placed on practicing Agile processes: presenting to various stakeholders—including clients, management, and fellow developers—maintaining thorough documentation, and utilizing Agile practices such as storyboarding, sprints, regular scrum meetings, and retrospectives.

As one of two primary developers, my responsibilities centered around the backend functionality related to task management. I designed and implemented the core Task objects, established the custom .tsk file format for task storage, developed the critical .ics file importer, and contributed significantly to parts of the Qt user interface that handled task creation and editing.

Building the user interface was a highly collaborative effort within our team. We frequently engaged in pair programming sessions, collaborating remotely over calls and synchronizing our changes via GitHub. This collaborative approach was particularly beneficial as only one team member initially had prior experience with Qt. Through pair programming, we rapidly gained proficiency in this new framework, facilitating smoother adoption and efficient teamwork.

Functionality Highlights

Import & Filter

Tasker's standout feature is its seamless integration with Canvas. Rather than tackling the complexity of the Canvas API, we utilized Canvas's built-in calendar export feature, which provides comprehensive details on assignments, quizzes, and tests. This streamlined the development process significantly and enabled timely project completion.

One challenge was handling irrelevant calendar entries, such as scheduled Zoom meetings included in the exported files. Fortunately, these meetings had a unique identifier, enabling our parser to accurately filter them out. This ensured users received a clean, focused task list containing only relevant academic tasks.

This practical approach not only simplified our development but also enhanced usability, allowing students to effortlessly import and organize their academic responsibilities.

Prioritize & Tag

Tasker's tagging feature allows users to effectively prioritize and organize their academic responsibilities. Both manually created and imported Canvas tasks can be assigned a difficulty rating based on the user's preferred scale, as well as a grade-weight tag reflecting the task's contribution to their overall course grade. These tags provide additional sorting capabilities, helping students quickly identify the most impactful and critical tasks.

Additionally, Tasker supports class-specific tagging, allowing users to label tasks with course identifiers like CIS1234. Users can further enhance visual clarity by color-coding these class tags, significantly reducing visual clutter and enabling rapid identification of tasks within lengthy lists.

Together, these tagging and sorting options empower students to maintain clear and focused task lists, ensuring that their efforts align with their academic priorities and deadlines.

Save & Sync

Tasker saves all task information in a simple plaintext .tsk file within its directory structure. This approach, fitting for a sophomore project, kept things straightforward. We used no encryption or complex data layers, just readable and easily managed text files.

When closing Tasker, users are prompted with a dialog to either exit without saving, save and exit, or cancel if there are unsaved changes. There's no autosave feature, so if a user makes a mistake or imports the wrong file, they can simply close and reopen the app without saving, effectively rolling back any unwanted changes.

Tech Stack & Tooling

Qt (C++)

We chose Qt 6.x for its desktop UI toolkit. All UI elements (task list, import dialogs, settings) use QWidgets, with signals and slots managing real-time updates when a new .ics file is imported.

C++17

We chose C++17 as our primary language for Tasker, leveraging Visual Studio for development and Qt Creator for UI design. Since the project was completed shortly after our programming fundamentals coursework, where C++ was heavily emphasized, it was the language most of the team was comfortable and productive with.

Visual Studio 2019

We used Visual Studio as our primary IDE for backend development. Its support for C++ projects and partial Qt integration made it easy to manage our codebase and debug core functionality. Once we transitioned to designing the user interface, this setup allowed for a smooth migration to Qt Creator without disrupting our workflow.

GitHub & CircleCI

As part of our Agile workflow, we used GitHub to coordinate changes and manage our codebase. To support continuous integration, we set up CircleCI to run automated tests and builds on every commit, ensuring our code remained stable and that issues were caught early in development.

Screenshots

Tasker main screen
Main Tasker screen with imported tasks
Calendar import dialog
Calendar import dialog with .ics selection

Challenges & Lessons Learned

Tasker marked my second significant software project involving a graphical user interface. My previous experience was building a Minesweeper game from scratch using SFML, where I handled every pixel and event manually. Tasker, however, was my first time building a GUI within an actual GUI toolkit, using Qt's suite of widgets and layout tools. This leap introduced me to a completely different way of designing user experiences and set the stage for future work—like the Unity-based character creator I built in my Human-Computer Interaction course.

The steepest challenge was adopting a brand-new framework and integrating it with our existing C++ backend. Qt offers many high-level tools, like widgets, lists, and dialog boxes,that don't always mesh intuitively with C++ logic. Building and updating the dynamic task list in Qt was especially tricky, and required a lot of teamwork and experimentation. This experience taught me how to quickly learn and integrate unfamiliar technologies, and reinforced the importance of collaborative problem-solving in a team setting.

I also learned the value of simplicity in software solutions. While we initially considered integrating Tasker with Canvas through its API, we quickly realized that route was far too complex for our timeline and experience. Instead, using Canvas's calendar export proved to be an elegant, lightweight solution that allowed us to focus on core functionality—and gave me valuable practice with file I/O in C++. In the end, Tasker was full of firsts: my first collaborative software project, my first hands-on use of Agile practices, and my first self-taught deep dive into a new framework. Though the project had its imperfections, it built a strong foundation for my later work; most notably, my senior project Prettier-er.