LERNi
This was the course project for the application programming module. The task was to build a non-trivial GUI application in C# with WPF following the MVVM pattern, with a meaningful data model and persistent state.
Visual Overview
LERNi is structured around semesters as the central organizing unit. Each semester holds a set of courses, each course can have sessions and assignments attached to it, and everything else in the app flows from that hierarchy. Adding a course, scheduling a session or creating an assignment all go through the model layer so the UI never touches the data structures directly.
The timetable view generates itself dynamically from whatever sessions exist across all courses in the active semester. There's no manual layout involved: sessions get grouped by weekday and the grid updates automatically whenever something changes. The same principle applies to the Kanban board, which pulls all assignments from the current semester and sorts them into Todo, In Progress and Done columns. Status changes update the board immediately, and completed assignments can be hidden to reduce noise.
I handled persistence in two ways. The full application state serializes to a binary file on save and restores completely on next launch (semesters, courses, sessions, assignments, user settings). On top of that, user data can be exported and imported as XML, which makes it easier to transfer data or inspect it outside the app.
The architecture follows MVVM fairly strictly. Business logic lives in the model, ViewModels handle data binding and UI state, and window-specific interactions like opening dialogs stay in the code-behind of the views. Serialization and XML handling are extracted into separate service classes. The session types (Lecture and Lab) use inheritance from an abstract base class, which keeps the timetable logic clean and leaves room for adding more types later.
Honestly, building this in WPF was its own kind of frustrating. The framework is old, the tooling feels dated, and there were plenty of moments where I genuinely didn't understand why the curriculum still uses it when there are much better options available. For development I also needed to borrow my flatmate's Windows PC, since I'm on a Mac, which added an extra layer of friction to an already tedious workflow. The irony is that I actually designed LERNi as something I would use myself since it all reflects how I think about organising my studies. And then I can't run it, because it's a Windows desktop app.
That said, I was genuinely happy with how it turned out. As a solo project it was a nice change of pace from the usual team work, and getting the architecture clean and the features to all connect properly felt satisfying in a way that made the WPF pain mostly worth it.