Pathly - Student Engineering Journal
Pathly is a Windows app I built because large learning goals can feel hard to start. I wanted to see whether software could turn one broad topic into a skill tree with smaller steps, lessons, quizzes, and progress.
The question I kept coming back to was: can software make the next step clearer without pretending that an AI-generated path is automatically correct?
These are selected notes from the git history. Some commits included several experiments at once, so I grouped entries around the engineering problems I was trying to solve.
| Date | Area | Engineering journal |
|---|---|---|
| 2026-02-13 | Earliest saved prototype snapshot | The earliest preserved snapshot already had a Windows UWP app with topic input, saved paths, a sidebar, a large canvas, connected skill nodes, lessons, quizzes, and progress. I had tried to build the whole flow quickly, so a lot of the logic ended up in one page. |
| 2026-02-13 | Skill-tree data and layout | I parsed the AI response into recursive SkillNode objects and calculated positions for every node on a large XAML canvas. Valid JSON was only the first problem because branches could overlap, spread too far apart, or appear outside the visible area. |
| 2026-02-13 | Lessons, progress, and saving | Clicking a node could generate a lesson, mark the skill as learned, unlock later nodes, and save the tree. Lesson state, quiz state, node status, and persistence all had to agree or the path became inconsistent. |
| 2026-03-03 | Study timer and progress | I added a deep-work timer, Pathly Points, session history, and a progress page. During development I temporarily shortened the timer so I would not need to wait 25 minutes for every test, which reminded me to check that test values did not become real defaults. |
| 2026-03-03 | Mini-map and navigation | Large trees were difficult to move around, so I built a mini-map for the 10,000 by 10,000 canvas. Small scale errors made the viewport box drift away from what the main canvas was showing. |
| 2026-03-06 | Interface rewrite | I rebuilt much of the main screen around a floating sidebar, cleaner canvas, history cards, progress information, and study controls. Changing that much at once made the app look more complete but made bugs harder to isolate. |
| 2026-03-06 | Saving study progress | Points and study sessions needed to survive after the app closed. I added persistence and loaded saved values during startup. The harder part was deciding which source was current when local state and later cloud state disagreed. |
| 2026-03-09 | Personalized path input | Instead of asking only for a topic, I added questions about experience level, goal, and study pace. More input gave the AI useful context, but it did not guarantee that the generated tree would be better. |
| 2026-04-13 | Empty states and UI cleanup | I added a clearer empty state and reorganized the sidebar and workspace. The polish helped explain the app, but it also made me notice how large the main code file had become. |
| 2026-04-20 | Moving accounts to Firebase | I replaced the first local account system with Firebase Authentication, session restoration, refresh handling, sign-in, sign-out, and password changes. Authentication became much more than checking an email and password. |
| 2026-04-20 | Service boundaries | While connecting Firebase and AI services, I learned that a client app should not be responsible for protecting sensitive service credentials. That is why the full repository stays private and why a published version would move sensitive service calls behind a backend. |
| 2026-04-21 | Searching paths and nodes | I expanded search so it could filter saved paths and highlight matching nodes inside the current tree. Search, node-status filters, opacity changes, and sorting began interacting, so clearing a search had to restore the correct state. |
| 2026-04-21 | Prerequisite checks | I added prerequisite warnings before opening some skills. Because AI suggestions could be wrong or annoying, the user still needed a way to continue. |
| 2026-04-21 | Firestore as the main state | I moved more progress and study history into Firestore instead of treating local settings as the final answer. This introduced loading order, token refresh, offline behavior, and failed-save states that the interface needed to show. |
| 2026-04-22 | Timer and streak reliability | I added a visible timer progress ring and improved streak saving. A streak could look correct during one session but disappear after a restart if study activity was not stored with the other progress data. |
| 2026-04-24 | Generated study plans | I added an optional AI-generated daily study schedule. A skill tree and a calendar are different structures, so I stored the schedule separately and built another view for days, activities, and estimated time. |
| 2026-04-25 | Warning controls and notes | I added a per-node option to dismiss repeated prerequisite warnings, made lesson notes scrollable, saved them back to the node, and refreshed the tree when notes changed. These smaller changes showed how a feature can exist in code and still be difficult to use. |
| 2026-05-01 | Organizing saved paths | As the number of saved paths increased, one flat history list became hard to use. I added groups that could be created, renamed, expanded, collapsed, and saved. |
| 2026-05-01 | Drag and drop | I added dragging paths into groups and reordering them near other paths. Drop targets, group membership, menu buttons, and expand or collapse taps could interfere with each other, so I had to prevent one path from silently belonging to several groups. |
| 2026-05-08 | Account recovery | I added email verification, resend controls, password reset, and clearer Firebase error messages. A working login screen was not enough; people also needed a way to recover when something went wrong. |
Looking back
Pathly started as a simple idea about breaking one large goal into smaller steps. The difficult part was not only generating the steps. I also had to decide how to draw them, save them, unlock them, search them, organize them, and show uncertainty when the generated path was not perfect.
I also added too much responsibility to HomePage.xaml.cs. It eventually handled UI state, tree generation, canvas drawing, lessons, quizzes, progress, groups, study plans, and saving. Splitting that file into smaller parts would be the biggest cleanup I would make next.
The service-integration work also changed how I think about publishing code. A public version should keep sensitive service access outside the client, so the full development repository remains private while the public showcase focuses on the product idea, architecture, and lessons.