An android app that takes the user's location on a ski mountain and generates a run (series of trails) for the user to ski or snowboard down the mountain from their current location. If they are at the top of a ski lift, it will generate a run from that ski lift going down the mountain. If they are at the basin (bottom) of the mountain, it will pick a random lift to start from and create a run from there. The user can also adjust a difficulty setting to generate runs with easier or more difficult trails. Finally, the app uses an accelerometer to test if the user shakes their phone to automatically generate a new run, so the user doesn't need to take their gloves off to use the touchscreen on a cold ski mountain.
App in Light Mode
App in Dark Mode
2
2 Weeks (February 2026)
Android Studio, Kotlin, Jetpack Compose, GeoFencing, GitHub
Modeled the trails and ski lifts of Wachusett Ski Resort and Yawgoo Mountain as graphs.
Wrote strategy algorithms for generating a list of trails the user could travel in a run given a difficulty level.
Implemented local lightweight persistent storage of user preferences and settings with android's DataStore.
Following Android app development best practices, we used a Model-View-View Model software architecture to separate algorithmic functionality from the front-end GUI.
Model: Data structures, storing data, manipulating data.
View: Front end UI that the user interacts with.
View Model: Holds references to model data, and binds that data to the view.
I decided to represent the mountain as a directed graph. Each trail would be an edge on the graph, and each junction between two or more trails would be a node in the graph. Each trail would have a name and difficulty level (Green = Easiest, Blue = Intermediate, Black = Difficult).
Wachusett Mountain Map
Trails of Wachusett Mountain as a graph. Yellow circles indicate tops of ski lifts.
As a skier, I never enjoy using my phone on the mountain because my hands get so cold, especially on a ski lift. So we added a setting to allow a user to generate runs without needing to take their hand out of their glove to use the touchscreen.
By enabling Gloves-On mode in the settings, the user can just shake their phone to generate a new run instead of pressing the button on the main dashboard. Disabling this setting simply turns off the shake detection and only allows using the button to generate a new trail.
Our android app uses a device's accelerometer to detect when the user shakes their phone.
A user might only want to go down trails of a certain difficulty. A beginner skier might only want to go down easier green trails, while a more experienced skier might only want the challenge of blue or black trails. In the settings, a user can select one of four difficulty strategies, and depending on the strategy, only runs with a certain difficulty level will be chosen for the run.
This was a unique and interesting project that involved subjects in mobile and ubiquitous computing. While I helped a bit with front end UI design, my main focus was the back end data structures for the mountain. I enjoyed the user experience design aspect of this project, and I wanted to create something that would have been useful to me as a skier on a mountain. An app that can help me decide where I should go for my next run when I am exploring the mountain.
There are a lot of potential features that didn't fit into this project, but if I could work on them in the future, they would make this app even better and more functional:
More mountains and trails: We created mountain graphs for Wachusett and Yawgoo mountains because they are pretty small, but more mountains like Sunday River, with multiple peaks and lifts that don't lead to the same basin, would have a much larger possibility space for runs to generate.
Manually setting start and end points: This didn't apply to the small ski mountains of Wachusett and Yawgoo, but a larger mountain would have many end points. If a skier wanted to get directions to end at a specific lift or mountain basin, I'd like to add that functionality. This would mean implementing a more robust way-finding algorithm, and a form to select starting and ending points when not in gloves on mode.
Handling whether a trail is open or not: Currently, the app assumes all trails on the mountain are open. This is hardly ever the case, as some trails take more snow than others to be open. It would be nice to have the app not choose trails that are not open when generating a run, but that would probably require access to some sort of web API.