feature-todobubu

aimimi

May 2021

Aimimi is a goal sharing mobile application made with Flutter framework. Our objective is to provide a platform that motivates users to achieve their goals and practice greater consistency.

Deliverables

  • Flutter application

My Role

  • Mobile App Developer
  • Designer

Background

We joined The 7th Hong Kong University Student Innovation and Entrepreneurship Competition. Our team, including people from business, fintech, computer science, worked together from ideation to implementation for the idea.

Our Vision

To motivates users to achieve their goals.

We know that goals are easy to set up but hard to persevere. People tend to give up for many reasons. But shouldn’t we find a way to deal with it?

That’s why we created aimimi.

We want to allow the users to share their goals and challenge their friends. Aimimi acts as a miniature social media platform in which others can interact with our users. These qualities can encourage users’ motivation and self-discipline toward their goals in the long run.

By reinventing the traditional and outdated process of creating goals, aimimi enables users to challenge their peers and share their goals, allowing users to receive support from their friends.

How we start?

We didn’t perform an organised design process for our idea at that moment. (We did some improvement on our next Hackathon).

See: Being a UX/UI Designer with Computer Science Degree in Cathay Hackathon | By Andrew Li | Medium .

We did some brainstorming on the themes of our application. We used Figma for real-time collaboration. We define different focuses and we type some possible features on the sticky notes.

We come up with the following themes eventually:

  • Continuous goal
  • Sharing goals
  • Leaderboard
  • Activity

How does the app looks like?

Our interface are simple, and intuitive. With the vibrant accent color, we further develop our screens with it tints and shades.

Continuous Goal & Sharing Goals

Users can create ongoing goals such as “Wake up early everyday 🖼”. Once they’re finished, they can check in to see how well they are doing.

But what makes it exciting is that users can share their goals so that their friends can join them. We believe companions can help in achieving goals.

Leaderboard and Activity

Activity session is the part which acts like a social media platform. Users can give a “like” or leave comments to other users’ activity toward the same goal.

How do we create the app?

It’s a fairly rapid development. We tried the Flutter framework since we wanted to launch on both iOS and Android platform. And use firebase as our primary database.

We also kept the a clean environment for collaboration with feature branching strategies.

Flutter

This is the first time I've used Flutter to develop apps. To be honest, I am not experiencing any hard time on learning Flutter as a React guy. Things like the declarative structure and Provider are quite similar.

We did implement the SignInWithGoogle and SignInWithApple. We spent a lots of tune troubleshooting on that as there aren’t many materials to follow. Our code is available on GitHub.

Firebase Cloud Functions

In order to track whether our users have skip the task that they promised to do, we need to create a scheduled function that execute every day.

Here is the TypeScript code that utilized the firebase functionality:

import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; import fire from "firebase"; admin.initializeApp(); const firebase = admin.firestore(); exports.dailySchedule = functions.pubsub .schedule("0 0 * * * ") .timeZone("Asia/Hong_Kong") .onRun(async (context) => { console.log("This will be run every day at 00:00!"); // ... usersQuerySnapshot.docs.forEach(async (user) => { // ... goalQuerySnapshot.docs.forEach((goal) => { // ... if (!checkedIn) { const newAccuracy = (checkInSuccess / (dayPassed + 1)) * 100; // Clear check in, day passed and update accuracy in user's goal firebase .collection("users") .doc(user.id) .collection("goals") .doc(goal.id) .update({ checkIn: 0, dayPassed: dayPassed + 1, accuracy: newAccuracy, }) .then(() => { // Update accuracy in goal's user firebase .collection("goals") .doc(goal.id) .collection("users") .doc(user.id) .update({ accuracy: newAccuracy, }); // Move to completed/ delete in user's goal // ... } else { // Clear check in, reset checked in in user's goal firebase .collection("users") .doc(user.id) .collection("goals") .doc(goal.id) .update({ checkIn: 0, checkedIn: false, }); } }); }); return null; });