Inspiration
As someone balancing several areas of life at once, I found it hard to plan my days, and even 24 hours never felt like enough. I wanted a simple way to manage my time and stay consistent, so I built Ascend: one place to plan your daily tasks and build the habits you want to keep. Most apps focus on either tasks or habits, and Ascend brings both together in a single app.
What it does
Ascend is a cross-platform mobile app for tracking tasks and building habits. You can add daily to-dos and mark them complete, and log habits with streak tracking that calculates your current and longest streaks. A home dashboard shows your open tasks and active habits at a glance. Login and signup use JWT authentication, so your data stays synced and secure across sessions. It runs on both iOS and Android with a dark-mode interface.
How we built it
The frontend is React Native with Expo, using Expo Router for file-based navigation across the home, tasks and habits tabs. Styling is custom StyleSheet code with a shared colour palette. State is handled with React Hooks, and AsyncStorage keeps the user's session on the device. The app talks to a backend API using the Fetch API, and JWT tokens handle authentication. The backend is built with Python's FastAPI framework and uses PostgreSQL to store all the app's data.
Challenges we ran into
The hardest part of Ascend was getting habit streaks to work reliably. A streak looks simple on screen, but it depends on every habit session being stored correctly, so I had to design how each completion is logged in the database and how the current and longest streaks are calculated from those logs.
A key problem was stopping duplicate entries. Without a check, a user could log the same habit several times in one day and inflate their streak, which would defeat the purpose of the app. I fixed this by making sure a habit can only be logged once per calendar day, so a second attempt on the same day is rejected. I enforced this on the backend so it holds even if the app sends a repeat request.
Streaks also needed careful handling of dates: deciding when a streak continues, when it resets after a missed day, and when it becomes the new longest streak. Small mistakes here made the numbers wrong, so I tested it against different scenarios such as consecutive days, a skipped day and a repeat log on the same day.
Accomplishments that we're proud of
I'm proud of building a complete working app for the first time, from the mobile frontend to a FastAPI and PostgreSQL backend. It covers the full flow from signup to daily use: authentication, task management, habit tracking with real streak logic, and a dashboard that ties them together. I'm also proud of the polish, with a consistent dark-mode design and custom components rather than default styling.
What we learned
Ascend was my first time building a mobile app, so a lot of what I learned was about how app development differs from the web projects I'd done before. I learned how a React Native app is structured with Expo, including file-based navigation with Expo Router, splitting an app into screens and tabs, and building reusable components with a consistent style. I also found that mobile brings its own concerns, like designing for a small screen, testing on both an emulator and a physical device, and keeping the experience consistent across iOS and Android.
I also learned how a mobile app and a backend work together. Building login and signup with JWT authentication showed me how much sits behind a simple screen: the app has to send credentials, store the token, attach it to later requests and handle failures. Working with FastAPI and PostgreSQL taught me that the rules of the app, like one log per habit per day, belong on the backend where the data is stored, and not only in the interface.
What's next for Ascend
Next, I plan to add notification reminders for each task and habit, and let users schedule their tasks for particular times of the day. I'd also like to add gamification features to help users stick to their daily commitments and remember to check in every day, which goes back to the problem that made me build Ascend in the first place.