-
Notifications
You must be signed in to change notification settings - Fork 0
Development Journey
A behind-the-scenes look at how AkademiTrack came to life, written by the developers themselves.
Our school, Akademiet, had a recurring issue: students were constantly forgetting to register their study time on iSkole.net. This had to be done manually every day - sometimes up to 4 times a day, sometimes less. When students forgot, they had to inform their teachers who would then manually fix it. This created unnecessary extra work for teachers who already had enough on their plates.
Me (Mathias) and Andreas stepped in to solve this problem. We decided to create AkademiTrack - an app that automatically registers study time just like a normal person would. The goal was simple: eliminate the manual work and free up both students and teachers from this tedious administrative task.
Timeline: Started around August 18
Our research phase focused on understanding how iSkole.net worked under the hood. We spent time analyzing how the website reacted to different HTTPS requests and mapping out the entire authentication and registration flow.
Key Decisions:
- First attempt: Python - seemed like a good choice initially
- Second attempt: Swift - we thought it would be perfect for Mac since we needed to package it as a .app file, but it wasn't ideal and it cost money
- Final decision: C# with Avalonia - our favorite language! This packaged perfectly for all operating systems
The Reality: It took us a long time to develop the app simply because we had to switch languages 2 TIMES and delete the old apps each time. Starting over was frustrating but necessary.
Timeline: [Continuing through development]
During development, we faced really tough challenges with both design and backend implementation. But in the end, we managed to create a really good design and user experience that we're proud of.
Timeline: [Testing phase]
Our buddy Mustafa was our main tester, and he was excellent at it. He gave us valuable feedback on what needed to be changed and added, pushing us further toward releasing it to our school.
Big thanks to Mustafa for helping us test! 🙏
Below is the complete flow of how AkademiTracks bot operates from start to finish:

Link to the flowchart "Mermaid"
Our authentication system works by encrypting your passwords and Feide username using hashing, then saving them securely on your computer.
When the start button is activated, the system goes through multiple if statements to determine the authentication path. Here's how it works:
Flow:
- Load saved credentials from encrypted storage
- Check if cookies exist from previous sessions
- If cookies exist, validate them via API call
- If cookies are valid and parameters are complete, proceed to fetch schedule
- If not, open browser for authentication
- If saved credentials exist, attempt headless auto-login via Feide
- If auto-login fails or no credentials exist, show visible manual login
- Extract and save cookies + parameters
- Proceed to schedule fetching
What we learned:
- Encryption and secure storage is crucial for user trust
- Balancing automation with security requires careful design
- Headless browser automation can be tricky but is worth the effort
AkademiTrack fetches your full day schedule with a single API call, then intelligently processes it:
Process:
- Find all STU sessions scheduled for today
- Check each STU session for conflicts with other classes
- For sessions with time overlaps, exclude them from the valid list
- Only monitor and register for STU sessions without conflicts
This conflict detection prevents the app from registering you when you're supposed to be in another class.
The notification system was one of the really hard problems we faced, especially on Mac. Normally, Mac notifications work through the OS itself, and we would have had to pay Apple for that capability.
Our Solution: We built our own custom notification system. It was really hard to implement, but it works well and keeps the app free for everyone.
Features:
- Queue-based system with priorities
- Admin notifications checked via Supabase every 30 seconds
- Registration success/failure notifications
- Network error handling (e.g., "Need School WiFi")
The monitoring system runs on a 30-second cycle:
For each valid STU session:
- Check if already registered
- If not, check registration window status
- Window status possibilities:
- Not Yet Open - Log waiting status
- Closed - Log that window closed
- Open - Attempt registration!
- Send POST request when window opens
- Handle response (success, network error, other error)
- Log successful registrations to Supabase
- Continue until all sessions are complete
There were SO many bugs. Saying "Bug #1" and "Bug #2" would be wrong - we had countless downfalls where we just needed to delete what we tried, take a step back, and build it up again in smaller steps.
Our Approach:
- Break problems into smaller pieces
- Test incrementally
- Don't be afraid to start over when something isn't working
- Take breaks when stuck
- Database management - Working with Supabase taught us a lot about real-time data
- Cross-platform development - Building for Windows, macOS, and Linux simultaneously
- Auto-updater implementation - Using Velopack to push updates to users
- Security practices - Encrypting credentials and securing user data
- Mac app development - Learning the intricacies of building for macOS
- API integration - Working with iSkole.net's API
- Planning matters - But not everything comes as planned
- Think like the user - Always consider the user experience
- Discussion is key - Look at ideas and discuss them thoroughly
- Iterate and improve - Take feedback seriously (thanks Mustafa!)
We learned to:
- Handle setbacks (like switching languages twice!)
- Work through difficult problems methodically
- Balance ambition with practical constraints
- Appreciate good planning AND good flexibility
Not everything comes as planned. Sometimes you just need to:
- Take a break
- Step back from the problem
- Discuss the issues you're facing
- Try slowly making something work rather than rushing
Don't expect perfection on the first try. We switched languages twice, rebuilt the app multiple times, and that's okay. It's part of the process.
1. Velopack 🚀 A great tool for packaging and making an updater for your app so you can push new updates to your users seamlessly.
2. Avalonia 💎 Just great to code with for all operating systems. Cross-platform UI that actually works well everywhere.
Leaderboard System 🏆 We're looking at implementing a competitive leaderboard where users can compete for:
- Most study time in their class
- Most study time in their school
- Competition between friends
This will boost people to study more and add a gamification element that makes studying more engaging.
Better School Partnership 🤝 We want to work together with Akademiet to ensure the best experience for students. Direct collaboration with the school administration would help us:
- Ensure compliance with school policies
- Get feedback directly from teachers
- Make improvements that benefit everyone
We don't expect the community to help with our app, but we are open for you to help us!
Please fork our app and help us make it better. Contributions are welcome - whether it's bug fixes, feature additions, or documentation improvements.
Despite switching languages twice, countless bugs, and many late nights - we pushed through and completed the project. Persistence pays off.
The Double-Build Incident 😅
It was late at night, and we were both tired. I (Mathias) was building the app to publish the first version for Mac. I forgot to pull the new code Andreas had made, so I deleted what I'd built and said "I forgot to pull."
Then my tired ass forgot that I'd just said I needed to pull... so I built the old app AGAIN!
This was funny because I had already built the app for Mac at least 15 times that day. By the end, I was a little tired, to say the least.
- Mustafa - Our incredible beta tester who gave us valuable feedback and helped us improve the app significantly. Thank you!
- Coca-Cola - Too much to count. We drank A LOT of Coke through this journey. Thank you to all the Coca-Cola drinks we consumed! 🥤
- Lines of Code: [Check and add this number]
- Development Time: A little over 1 month
- Coca-Cola Consumed: ∞ (Too much to count)
- Commits: 180
- Issues Resolved: 10 known, but probably around 120 total
- Sleepless Nights: 100,000,000 😴
- Language Switches: 2 (Python → Swift → C#)
Our final thoughts: We love cola.
But seriously, AkademiTrack represents our commitment to solving real problems for students at Akademiet. We're proud of what we've built, and we're excited to see it help students and teachers alike.
Mathias & Andreas
Last updated: [10/5/2025]
AkademiTrack - Automated STU attendance registration for Akademiet schools
Made with ❤️ by CyberNilsen & CyberHansen
Website | Email Us | Licensed under MIT License