Git Product home page Git Product logo

wings's Introduction

Wings: With Wings, You Never Walk Alone

Demo: Walkthrough (Updated 6/12/2021)

**Note: The map settings on the right is shown to display how to imitate a user's current location!

Table of Contents

  1. Overview
  2. Product Spec
  3. Wireframes
  4. Schema

Overview:

Description

Due to the recent rise of hate-crimes, the risk of public danger has significantly escalated for the general population. In addition to this, with the slow integration of in-person activities during the pandemic, countless college campuses are preparing for a large percentage of in-person courses. With both the growth of potential harm and actual public population (especially that of college campuses), Wings inspired to help provide a safer commmunity in these uncertain times.

Wings is an Android application that connects users to others when they feel unsafe in their current conditions.

Users who are connected are confirmed to be safe "walking buddies" for each other, and are intended to walk together to some common, agreed upon destination. However, Wings intends to offer multiple ways to provide trusted safety sources such as: immediate connection to the police, one button notifcation to emrgency contacts, routing to the nearest registered safe spaces. Several safety precautions are taken during this pairing of users. Wings constantly tracks both users and saves real time information in a real time database. Both users' emergency information are held and and may be contacted at any time, even without a pairing to another user. Users may also choose to leave their buddy at any time.

App Evaluation:

  • Category: Safety
  • Mobile: The app's function relies on the user's ability to move and be tracked. The app will utilize a user's location, display urgent notifications, and display relative map views. The programm cannot be used on immobile devices.
  • Story: With the recent rise of hate-crimes, the app was developed to promote safety and community unity. The app can be useful to several demographics and provides a safer aspect of travel for all users. Because of its potential universal use, the app may be well responded to and spread easily.
  • Market: The app is potentially marketable to all people who feel unsafe traveling by themself. However, the app will cater specifically to Cal Poly Pomona students for now. Later, the app may be expanded to work on several college campuses as well.
  • Habit: The app is very habitual and can be used daily if need be. Users may feel unsafe at any time of the day, and therefore the app can be handy in all such situations. Users only comsume the app, there is currently no plans to allow user creativity.
  • Scope: Wings will be pretty wide, as it will contain many safety feautures and location matching. There is a lot of room to expand to include various other features. Currently the stripped down version is still interesting to build but would not be very secure and safe to use.

Product Specifications:

1. User Stories (Required and Optional)

Required Must-have Stories

  • User can register a new account.
  • User can login and log off.
  • User can view their own profiles and other users' profiles
  • User is shown all possible buddies.
  • User can send, receive, and respond to multiple Buddy Requests.
  • User can set a marker on the map to determine the common destination for both Buddies to walk together towards.
  • User can verify their Buddy via PIN, assigned ID numbers, and profile pictures.
  • User can confirm via PIN when they've safely arrived at their destination.
  • User can input their intended destination on a map.
  • Users are tracked while on a Buddy Trip.
  • Users must be within 15 meters of their destination or meetup location before being able to confirm to the next step.
  • User can search for other users.
  • User can set up their Trusted Contacts with a max. of 5 contacts.
  • User can cancel the Buddy Trip at any time.
  • Buddy Trips and Meetups must be completed within a given lenient ETA. The ETA may be extended with the consent + confirmation of both Buddies.
  • User can see the most current information about the Buddy Trip at any time.
  • User can use the Safety Toolkit to notify Trusted Contacts at ANY time (during or not during a Buddy Trip):
    • Safety Toolkit can only be used with confirmation of PIN.
    • User can choose from two options in the Safety Toolkit: (1) Notify Trusted Contacts or (2) Immediate emergency:
      • User can choose the Notify Trusted Contacts option to automatically send texts of relevant information to all their saved Trusted Contacts. It is used when the user feels unsafe but is NOT in immediate danger.
      • User can choose the Immediate emergency option in the case that they need immediate help. Automatic dialing of police and automatic texts sent to all Trusted Contacts with urgent messages.
    • All applicable relevant information is sent: All Buddies' current locations, intended destinations, their Buddy's general information, all other contacted Trusted Contacts
    • All sent locations via text message always shows real time locations.
    • After being invoked, Safety Toolkit waits for the user to confirm their safety once again via PIN, and then automatically sends all Trusted Contacts an updated message of their safety.
    • If the user has NOT confirmed safety after reaching their destination and after a lenient time period, Safety Toolkit notifies/updates all Trusted Contacts.
  • Buddies can rate and review each other after a Buddy Trip.
  • Users are banned if their rating is too low.

Optional Nice-to-have Stories

  • Different modes of buddying up:
    • User can choose to be "able to be a Buddy" when not in need of a Buddy themself.
    • User can choose to be a Solo Walker, where they walk to their destination on their own but is still open to being paired with a Buddy (i.e still receiving Buddy Requests).
  • User can add friends.
  • User can view friend list.
  • Users can chat with their Buddies.
  • User can request to chat with other users.
  • Buddying can be extended to groups.
  • The user is shown best matched possible buddies first.
  • Filters are available when a user searches through a list of possible buddies.
  • Users can choose to receive notifications when there is a new possible buddy.
  • Users are shown the nearest registered safe spaces.
  • Users can report suspicious areas/activity.

2. Screen Archetypes

  • Login
    • User can login
  • Register
    • User can register a new account.
    • User can go back to login screen
  • Create Profile
    • User can customize their profile
  • Profile
    • User can view their own information
    • User can log out
  • Map-View
    • User can input their destination to create a buddy request
    • Buddy Pairs are required to confirm a route on the map to follow.
  • Stream
    • User is shown all possible buddies
    • User can search for other users.

3. Navigation

Tab Navigation (Tab to Screen)

  • Home Screen
  • Buddy Request Screen
  • Profile Screen
  • Contact list Screen

Flow Navigation (Screen to Screen) Login

  • Map-View
  • Register
  • Register
    • Map-View
    • Login
  • Profile
    • Map-View
    • Stream
  • Map-View (Home Screen)
    • Stream
    • Profile
  • Stream (Create buddy request Screen)
    • Profile
    • Map-View

Wireframes:

[BONUS] Digital Wireframes & Mockups

https://www.figma.com/file/FvkFBW65HVYdpSDwqsKRMM/Wings?node-id=0%3A1

[BONUS] Interactive Prototype

https://www.figma.com/proto/FvkFBW65HVYdpSDwqsKRMM/Wings?node-id=4%3A8&scaling=scale-down&page-id=0%3A1

Schema

Models

User

Property Type Description
fname String user's first name
lname String user's last name
email String user's CPP email (MUST end in "@cpp.edu")
password String user's password
PIN Number user's private 4-digit number to confirm ALL significant decisions!
objectId String uniquely identifies this User in the Parse database
username String user's username in their CPP email (everything before the "@cpp.edu")
profileImage File the image to be displayed on the user's profile
trustedContacts Array[TrustedContact] user's trusted contacts to be notified in case of emergency, max size of 5
friends List of String (Array in Parse) List of User objectId's that the user wants to keep in contact with
currentLocation Geopoint the user's current location
profileSetUp boolean whether or not the user's profile is set up
rating Number average rating

TrustedContact

Property Type Description
user Pointer pointer to the User object who the Trusted Contact is associated with
fname String Trusted contact's first name
lname String Trusted contact's last name
relationship String Trusted contact's relationship to the user
phone String Trusted contact's mobile phone number
email String Trusted contact's email

Buddy

Property Type Description
user Pointer points to the User object who currently needs to get to there destination
meetingLocation Geopoint where the Buddy will meet their partner
receivedBuddyRequests List of BuddyRequest (Array in Parse) List of all received BuddyRequests, need to respond to
sentBuddyRequests List of BuddyRequest (Array in Parse) List of all sent BuddyRequests, waiting for a response
hasBuddy boolean whether or not the Buddy is already paired
onMeetingBuddy boolean whether or not the Buddy is currently meeting with their partner
onBuddyTrip boolean whether or not the Buddy is currently on a BuddyTrip
buddyTrip Pointer points to the BuddyTrip object the Buddy is currently on IF applicable, null otherwise
objectId String uniquely identifies this User on this specific BuddyTrip, null if hasBuddy = false

BuddyRequest

Property Type Description
objectId String uniquely identifies this BuddyRequest
sender Pointer points to the Buddy object who sent the BuddyRequest
receiver Pointer points to the Buddy who needs to respond to the BuddyRequest
isConfirmed boolean whether or not the BuddyRequest has been approved by both Buddies, otherwise, is waiting for a response
methodOfMeeting String who's location the Buddies will meet at: "sender", "receiver", or "halfway"
meetingLocation Geopoint the location where the buddies will head towards to meet
chosenTargetLocation Geopoint where the buddies are ultimately walking together for

BuddyTrip

Property Type Description
objectId String uniquely identifies this BuddyTrip
buddyOne Pointer points to the one of the Buddy objects in question
buddyTwo Pointer points to the other Buddy object in question
targetDestination Geopoint where the buddies are ultimately walking together for
senderLocation Geopoint current location of the request sender
receiverLocation Geopoint current location of the request receiver
EST Number the calculated approximate time it will take for the pair to arrive at their targetDestination (minutes)
timeElasped Number how long it has been since the BuddyTrip began (minutes)

Networking

List of network requests by screen

  • Login screen

    • (Read/GET) Request to login
             @Override
             public void done(ParseUser user, ParseException e) {
                 if(user != null){
                     Log.d(DEBUG_TAG, "Login Success!!");
                     loginSuccess();
                 }
       }
    
    
  • Register #2 screen:

    • (Create/POST) Create new User
       user.setEmail(email);
       user.setPassword(password);
       user.setUsername(username); 
    
    
  • Profile Setup screen and Settings screen:

    • (Update/POST) User's email, username, password, or PIN
      Parse.getCurrentUser().setEmail(email); Parse.getCurrentUser().setUsername(username); Parse.getCurrentUser().setPIN(pin);
  • Home screen:

    • (Read/GET): BuddyTrip’s calculated EST
         query.whereEqualTo(BuddyTrip.KEY_USER, Parse.getCurrentUser())
      
      
  • Edit Trusted Contacts Screen:

    • (Update/PUT) User’s attribute: Trusted Contacts list
      Parse.getCurrentUser().setTrustedContacts(list);
  • Search user screen:

    • (Read/GET) Query for a user given String username inputted
       query.whereEqualTo(User.KEY_USERNAME, input);
       
    
  • Choose Buddy screen:

    • (Read/GET) All Buddies who’s current location is X distance away
         query.whereEqualTo(Buddy.KEY_CURRLOC, Parse.getCurrentUser().getLocation + X);
      
      
    • (Read/GET) All User’s who’s “Able to be a Buddy” is on
         query.whereEqualTo(Buddy.KEY_CANBUDDY, true;
        
      

wings's People

Contributors

jmnguyen1999 avatar stephaniedeleon avatar lmsiu avatar nhinguyen015 avatar

Watchers

James Cloos avatar

wings's Issues

Creating last screens needed for Account Creation: ProfileSetupFragment{ } and EditTrustedContactsFragment{ }

  • ProfileSetupFragment = screen to set up all REQUIRED user information before can start buddying! PIN #, profile picture, and Trusted Contacts

  • EditTrustedContactsFragment = separate screen linked from ProfileSetupFragment for the user to set up multiple Trusted contacts.

  • **Note: Lots of sample code is already written on similar Fragments to display how the interface, StartActivity, and fragments work together, it should help you get started! Also, a ton of this is much more intricate to implement than the other issues, so don't feel pressured to finish everything if you don't have the time for it!

  • Following the wireframes on README, create layout.xml files and implement Fragments for: "Profile Setup Screen" and "Edit Trusted Contacts Screen"

    • ProfileSetupFragment{ }:

      • invoked by either LoginFragment - when user registered AND logged in, but not yet setup profile
      • or by RegisterTwoFragment - when user just registered official account in Parse database
      • Expect to receive the User object we are creating! (B/c we are still building the profile of a to-be-created and not logged in user)
      • create instance of SAFragmentsListener{ }
        • e.g. private SAFragmentsListener SAListener;
      • attach this instance to StartActivity (which implements SAFragmentsListener)
        • e.g. SAListener = (SAFragmentsListener) context;
      • on "Take a Photo" button:
        • Intent to Camera (just like in last Instagram project)
      • on "Upload from Gallery" button:
      • Next to the "Set Trusted Contacts" button (as shown in wireframes):
        • display status: "not done" in red when user not yet have 1 Trusted contact
        • display status "completed" in green, when user has at least 1 Trusted contact
      • on click "Set Trusted Contacts" button:
        • call SAListener.toEditTrustedContacts(User object);
      • on clicked (1) on menu (3 horizontal lines) icon in top navigation bar and clicked (2) "Log out" button:
        • call SAListener.toLoginFragment();
        • Purpose: Allows user to log out without setting up a profile! Profile setup will be enforced in LoginFragment by another issue.
      • On "Complete Profile" button AND if profile pic, PIN, and trusted contacts != null:
        • set user's profileSetUp = true;
        • Check if there is a current user logged in:
          • e.g. if(ParseUser.getCurrentUser() == null)
          • Log the user in! (e.g. when just created account from RegisterTwoFragment)
            • otherwise --> the user was logged in by LoginActivity and just needed to finish setting up the profile
        • Intent to MainActivity

    • EditTrustedContactsFragment{ }:

      • invoked by either ProfileSetupFragment or SettingsFragment
      • Expect to receive the User object we are creating! (B/c we may still building the profile of a to-be-created and not logged in user)
      • Creates a TrustedContact object and uses TrustedContact's setter method to POST request with the Parse database! (must wait for Parse and java models to be done by another issue)
        • Each TrustedContact is inputted into the User's trustedContact's list!
      • create instance of SAFragmentsListener and connect to StartActivity in the same way{ }
        • e.g. private SAFragmentsListener SAListener;
        • SAListener = (SAFragmentsListener) context;
      • Max of 5 Trusted Contacts
      • RecyclerView and Adapter used (to display a Trusted Contact in a format on every row):
        • Every RecyclerView row/Adapter .xml displays Trusted Contact’s:
          • First name
          • last name
          • Relationship to user
          • mobile phone number
          • email
        • Displays the current Trusted Contacts if any
          • On long click (or whatever you prefer to edit a row):
            • Opens Dialog box to edit the current contact or delete it entirely
            • NOTE: Dialog Box is essentially a little pop up form or message that can take a small number of user inputs and act on it. It shouldn't be extremely hard to implement
        • If user has room to add more (e.g. current # of Trusted Contacts < 5)
          • Display a “+” or “add" button:
            • On click → display a different .xml on that row with empty containers to enter the needed info
        • Otherwise display message that user at the max Trusted Contacts allowed
      • on click back button or on click "save" button (wasn't included on the wireframe!)
        • call SAListener.toProfileSetup(User object);
  • For extra help on connections between interfaces, activities, and fragments:

    • You can see the example of how @jmnguyen1999 did her "Snapagram" this way with an in-class interface, under StartActivity.java and the StartActivity packaged Fragments!

Set Up App Frame in Android Studio

  • Make new project, titled "Wings"

  • Setup all activities and layout.xml files needed. Design them according to the wireframes, and just ensure to make a Fragment container!

    • StartActivity{ }:
      • to switch between all not often used Fragments (Login, Register 1 and 2, ProfileSetup, and EditTrustedContacts)
    • MainActivity{ }:
      • to switch between all oftenly used Fragments (Home, UserProfile, SearchUser, ChooseBuddy, OtherProfile)
    • SettingsActivity{ }:
      • an in between, all account settings can be edited here (email, name, uses EditTrustedContacts Fragment)
  • Set up all interfaces to be used a listener from Fragments to Activities (How Fragments can invoke a method from the Activity to switch to next Fragment):

    • StartActivityListener{ }: StartActivity and all Fragments that need to be shown on the activity will use this.
      • These methods are ALL IMPLEMENTED IN StartActivity:
      • toLoginFragment(): switches to Login screen
      • toRegisterOneFragment(): swtiches to Register 1 Screen
      • toRegisterTwoFragment(): switches to Register 2 Screen
      • toProfileSetUp(): switches to Profile Setup Screen
      • toEditTrustedContacts(): switches to EditTrustedContacts Screen

    • MainActivityListener{ }: works in the EXACT same way but with MainActivity and its Fragments
      • toHomeFragment()
      • toUserProfile()
      • toSearchUser()
      • toOtherProfile()
      • toChooseBuddy()
    • @jmnguyen1999 implemented this way for her Instagram copy project, "Snapagram", but with in-class interfaces! If you need to see how it works you can take a look at "SignUpFragment.java" and how it works with "StartingActivity.java"
    • NOTE: Also more in depth on the Google Docs outline!
  • Input all color hex-values, text fonts, text sizes, icons, etc that was used in the wireframe into their corresponding res folders so others can easily design their layout files!

  • Push to GitHub

Creating layouts and implementing SearchUserFragment

  • Following the Figma wireframe, create a layout.xml for SearchUserFragment:

  • Implement SearchUserFragment:

    • uses a MAFragmentsListener object to communicate with MainActivity
      • e.g private MAFragmentsListener listener = (MAFragmentsListener) context;
    • Allows user to input username into the search bar to find a specific user:
      • Makes a query to Parse database to find a user with the specified username, displays appropriate message if a user is not found.
      • Optional stretch: Allow user to search using an actual full name in addition
    • On click a user/profile:
      • call listener.toOtherProfileFragment(userID); to have MainActivity display the OtherProfileFragment
      • OtherProfileFragment is to be implemented by another issue!

User Story #1 and #2: "User can register a new account." and "User can login."

  • LoginFragment = the screen where the user enters information to get to the MainActivity!

  • RegisterOneFragment = the first page of creating a new account. Requires: first name, last name, cpp email, password that meets all requirements, and re-typed password

  • **NOTE: This issue is EXTREMELY similar to how it was done for the last project, the Instagram-copy app, and lots of sample code is already written from @jmnguyen1999 from doing the app frame, so it shouldn't be too bad! But seriously, don't feel pressured to finish absolutely everything if you don't have the time for it!

  • Following the wireframes on README, create layout.xml files and implement Fragments for: "Login Screen", "Register 1 screen", and "Register 2 screen".

    • LoginFragment{ }:
    • Invoked by either: RegisterOneFragment or RegisterTwoFragment - in case user no longer wants to create account!
      • Takes: CPP Email and password
      • Attempts to Log in through Parse requests (just like in Instagram project), and handles it respectfully.
      • create instance of SAFragmentsListener{ }
        • private SAFragmentsListener SAListener;
      • attach this instance to StartActivity instance (which implements SAFragmentsListener):
        • SAListener = (SAFragmentsListener) context;
      • on click "Log in" button AND (current user's profileSetUp == true):
        • Intent to MainActivity
      • on click "Log in" button AND (current user's profileSetUp == false):
        • call SAListener.toProfileSetUp();
        • Purpose: to display the ProfileSetUpFragment instead since the user has not yet set up their profile!
      • on click "Don't have an account? Sign up now!" link:
        • Create a User object
        • call and pass into SAListener.toRegisterOne(User object);

    • RegisterOneFragment{ }:
    • Invoked by either LoginFragment - when user wants to start creating account
      • Takes info:
        • first name
        • last name
        • CPP email:
          • error check that email ends with "@cpp.edu"
          • initialize User's 'username' field = the string w/o "@cpp.edu"
      • If the User object passed in already has some info --> auto-fill into corresponding sections
        • Purpose: displays saved info to the user in the case that they already filled out these sections while creating an account but went back to this page to edit something
      • create instance of SAFragmentListener and connect in same way to StartActivity!
        • e.g. private SAFragmentsListener SAListener;
        • SAListener = (StartActivityListener) context;
      • on click "Already have an account? Login here!" link:
        • call `SAListener.toLoginFragment();"
      • on click back button (wasn't specified in the wireframe but should have one!):
        • call SAListener.toLogInFragment();
      • Confirms the password and re-typed password match EXACTLY
      • a new User object is created and POSTed to Parse database using the User{ } setter method (model Parse and java class must be created by Parse database issue person)
        • handle fail or success of Parse registration appropriately
      • create instance of SAFragmentListener and connect in same way to StartActivity!
        • e.g. private SAFragmentsListener SAListener;
        • SAListener = (StartActivityListener) context;
      • on click "Create account" button:
        • call SAListener.toProfileSetup(User object);
  • For extra help on connections between interfaces, activities, and fragments:

    • You can see an example of how @jmnguyen1999 did her "Snapagram" this way with an in-class interface, under StartActivity.java and the StartActivity packaged Fragments!

Create Parse Objects in back4app, implement their java counterparts, create getters and setters to connect to the Parse Database!

  • Create a new app in back4app titled "Wings".
    • Add all NSLJ members as Collaborators: "App Settings" on left toolbar --> "Collaborators" --> "What's their email?"
  • Create all Model classes listed in README, in Database browser: include all fields
  • Enter in some dummy data to test around with! Users and Buddies for sure!
  • Create and implement a corresponding Java class for every Model. This includes implementing all fields and establishing getters and setters to connect to the online Parse database!
    • **NOTE: Some field types in the models are listed as a List<> because they NEED to be able to have different lengths, i.e different users will add a different amount of friends. But because Parse only allows Array types, you will have to list it as an Array in the database, but KEEP it as a List<> type when in Java! Arrays in java force a fixed size :(
      • this means, provide a setter method that converts the List<> into an Array when storing it in the Parse database!

Creating layouts and implementing UserProfileFragment and OtherProfileFragment

  • UserProfileFragment = Displays the current user's info and allows certain personal features

  • OtherProfileFragment = given a userId, displays the given user's public info and allows the current user to add them if applicable

  • Follow Figma wireframe designs to create layout.xml files for the screens: "User Profile Screen" and "Other Users' Profile Screen" (which are almost identical)

  • Connect and implement the UserProfileFragment:

    • Invoked by the bottom navigation bar
    • Displays profile info:
      • first name
      • email
      • rating (and how many total reviews)
      • Pin code (stretch: What's my pin?)
    • Log out - logs out the user
    • Ability to edit profile picture:
    • On click "What's my PIN" link:
      • Dialog Box to ask for account password, then displaying the user's PIN
        • NOTE: Dialog Box is essentially a little pop up form or message that can take a small number of user inputs and act on it. It shouldn't be extremely hard to implement
        • Resource: Android Dialog Box Guide
      • Optional stretch story later: require more security here, e.g. security words, phone/email confirmation, etc
  • Implement the OtherProfileFragment, cannot connect it yet though because it needs SearchUserFragment!:

    • will be invoked by SearchUserFragment
    • Uses a MAFragmentsListener to communicate with the MainActivity
      • e.g. private MAFragmentsListener listener = (MAFragmentsListener) context;
    • Expects to receive the userId of which User info to show! Here's how to receive the data from the MainActivity:
    • Queries for the User object corresponding to this userId
    • Displays this user's info:
      • first name
      • email
      • rating (and how many total reviews)
      • status of relationship with current user: e.g. "My Friends" or "Others"
        • easy to get current user: ParseUser.getCurrentUser()
    • On click "Add user" or some icon:
      • Add the userId to the current user's "friends" field (List)
    • Should have a back button (wasn't included on the wireframe):
      • On click --> call listener.toSearchUserFragment();

Project Feedback!

👍 Nice work on the second implementation sprint! Excited to see your progress next week!

Project Feedback!

👍 Thanks for submitting your progress for this sprint! This is a big milestone as now it's all about adding optionals and additional polish to the app. Next week we go into the final sprint before demo day.

Project Feedback!

👍 Nice job on the wireframes! Wireframing is a common practice when building apps as it lets you create a blueprint for the app before writing any code. Having a really good blueprint that you can refer to throughout the rest of the project is a really valuable resource and will make it much easier to split up work across your team.

With the wireframes in hand, you should have a good idea of what your app will look like when you finish the project. Next week we'll jump into the data schema.

Figuring out all map functions! Display, interact, and use the map in HomeFragment!

This one's a doozy.

Create the Safety Toolbox

Purpose: option to either dial police automatically, or contact all TrustedContacts

  • intended to be a Dialog Box for easy access

Implement the ChooseBuddyScreen

Purpose: Display all potential buddies in a Recycler View and allow to the current use to choose one.

  • instantiates a Buddy object, = represents an active user who currently wants a buddy (to differentiate between all other inactive users)
  • Once chosen, go to PotentialBuddyFragment filled with the user's infomation and mapping of their current location and their intended destination.
    • on PotentialBuddyFragment confirmation --> some notification that Buddy Request was sent, back to ChooseBuddyFragment:
      • Creation of a BuddyRequest instance
      • num of buddyrequest sent increments and displayed somewhere
    • rejection --> go back to ChooseBuddyFragment

Implementing the Settings Fragment

  • invoked by the top nav bar, menu item
  • Allows user to edit their profile and account information
  • Uses a RecyclerView to list all the possible information the user can edit
    • on click an item, goes to another fragment
    • re-uses TrustedContactsFragment

Project Feedback!

👍 Nice work on getting the data schema defined! Next week we jump into the first implementation sprint. You'll have 3 sprints (one week each) to complete all the required stories for your app and 2 sprints (one week each) to work on optionals and add polish. Let us know if we can help in any way!

Project Feedback!

👍 Great job on the first implementation sprint! The app is really starting to come together. There are 2 weeks left to complete all of the required stories so that you have an MVP (minimum viable product). The purpose of this is to get the minimum set of functionality implemented first and then focus on adding in optionals afterwards. This ensures you have all the basics in place before adding in the additionals and polish.

Project Feedback!

👍 Thanks for submitting your final GIF walkthrough! It's pretty remarkable when you step back and think about how far you've come in the course. 👏 We started with a simple tip calculator and ended with a fully functional app that you've built from the ground up.

Make sure to review the demo day tips as these will help you put together an engaging demo. Best of luck on demo day! 🎉

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.