Run Demo *** IMPORTANT ***
See instructions in our Github - https://github.com/330i/family_carpool. These are temporary, until we get a formal cloud deployment and payment plan set up, at which users will just need to install the app for it to work.
A while back, largely off of personal experience, our team recognized a significant gap in the transportation industry - family-oriented carpooling. Most families push their children towards participating in a variety of after school activities, whether it is pee-wee soccer or a high school swim team.
- According to the US Census Bureau, nearly 57% of kids age 6 to 17 participate in some form of extracurricular activity.
We realized there was quite the potential for a widespread app that targets specifically the demographic of carpooling focused on kids and their after school activities.
Logically, parents will often become trusted friends with the others and we believe there is a wonderful opportunity to split up the daily trips amongst each other.
This has the potential help free up time for the parents to get a headstart on their other responsibilities, or if they have other children, transport them to the next activity.
Having seen these issues ourselves, the potential here stood out to us. Thus, my team chose to focus on designing an app that targets this demographic of "carpooling potential" left untouched by most solutions that only target carpooling for the work commute.
Months ago, however, our half-hearted tries to pursue our idea failed due to terrible development experience, and demoralizing cloud costs/scaling prospects. Thus we gave up.
- Come to this hackathon, we looked into quarkus, and realized that our idea was now much more plausible with it. We realized that this app would work hand in hand with the capabilities Quarkus provides as features like adding routes and group chatting with others usually require large amounts of requests and quick response times. Quarkus reignited our passion for the idea, and here we are!
What it does
Once you create and setup your account, you can share your information with other parents at activities like soccer practice, karate, dance, and so on. Using TidePool you can organize a convenient carpooling arrangement to help fit your schedule and preferences, allowing you more easily free up time to do other things or drive another one of your kids with a conflicting schedule.
The home page, where you are brought to after you sign in, is where you can see all the details about your upcoming routes and is the entry point to all the other helpful features in TidePool. Here you also get recommendations based on which of your friends are taking the same route as you at the same time. Note that TidePool only recommends routes if you have declared yourself as friends with that user, in order to ensure maximum safety.
The next page is the calendar screen where the user’s carpool schedules are shown along with an option to create a route. When creating a carpooling task, the user will type their start and end time along with their start and end address. They’ll get a quick preview showing the suggested route before their carpool is registered by the quarkus backend. From here, parents can sign their kids up to be picked up on the way if they were planning to go to the same area in the first place. After the user submits their carpooling data, they along with other users will be automatically notified with local notifications when the carpooling starts.
Once it’s time to go, users access the route page, which shows a calculated route with ETA, information on the driver, who all will be taking the route, and more. One of our most beneficial features is our live-tracking functionality, which offers another layer of convenience, functionality, and safety for users on our platform. We use Kafka streams and broadcasting emitters on our quarkus backend to allow parents to track the location of the driver to ensure they’re on the route and on time. This feature was of the utmost importance to us as we can only imagine how much the safety and security of their children are to all parents.
On the community screen, your group chats and friends are visible. Like I previously mentioned, recommendations and route schedules are generated solely on a user’s friends. in case of an emergency or an abrupt schedule change, you will be able to access their alternate contact data. Group chats, on the other hand, will be automatically added according to your route schedule, one for each route that you’ve joined. These give an easy mechanism for quick communication, as well as for confirming who’s driving when/where. The driver for any given date/time can also easily be changed from here. Contact data and other information of your friends will be readily available through the user information screen in case the individual is unavailable in the group chat.
How We built it
Our app was segmented into 2 different parts - a flutter frontend, and a 100% quarkus backend.
We started off as a basic reactive crud operation, using this for storing user data, routes, carpools, and managing our search algorithms and queries.
Using a reactive PostgreSQL agent, we built the data structure and schema for our entire application. Through, and through, however, our application was structured with a microservice architecture, with several light-weight nodes built with scalability in mind.
Outside of our data management for authentication and other use cases, we used reactive streams with Kafka, and broadcasting emitters to set up our location-tracking pipelines, where one user will publish their location to the service, and then all the other necessary users will be updated on this location in near realtime.
- Streams of requests proved useful for enabling us to set up community and chat architectures. For the on-device function, we used things like the google maps API, geolocation, and flutter_local_notification to enhance the app as a whole.
Perhaps more importantly was the cloud setup. We set up our application to deploy with Kubernetes on docker containers so that we can gain access to all of the benefits that come along with Kubernetes clusters.
- Using quarkus' Kubernetes libraries, we set up an environment, which can scale to loads, auto-deploy, and perform self-healing in the cloud, as these will all be significant in the long run as we push to build this into an actual product.
Our UI was built through a series of meticulous steps, including prototyping, and color matching. As previously stated, it is Flutter that powers the speedy development to intricately change each individual aspect of our user interface to reach our goal.
Challenges We ran into
Since this is our first time with Quarkus, we had a lot to learn. From many simple errors to internal server errors, it was challenging for us to assess the error due to one teammate having the error on one operating system while the other doesn't because he's on another operating system.
Although this was very frustrating to solve, we got more and more exposure to coding on Quarkus, our solution ended up being rewriting all of the interfacing code to substitute out characters that windows quarkus considered invalid, and then re-integrating data back into a proper form upon retrieval.
Learning how to set up the emitters and relevant Kafka stream was also difficult, but the office hours and the quarkus community made it possible.
Besides that, challenges like remote work, tiny bugs, and in general our novelty to so many concepts became the biggest time-suckers, but perhaps also the biggest learning experiences.
Accomplishments that we're proud of
Deciding to jump into the deep end and learn a skill we were all inexperienced with was something that we were quite scared about doing in the beginning. Luckily we found its learning curve was easy to understand and got a grasp of it in time to build a great app around its features. Going in blind learning a skill for a hackathon isn't something that we generally do, but this turned out to be quite a treat.
We're proud of all of our technical progress learning new technologies and reaching new heights as developers. We have a new framework under our belt, and we're not afraid to use it! We've built a UI with lots of passion and detailed precision, and we can now say with confidence that it was more than worth it.
We've grown as a team and created another wonderful project, but most of all, my team is always proud to have successfully built an app that shows promise of high practicality and widespread use in the real world. Like we said earlier, it's always our goal for the app to not only be original but to be something that we think many people could use.
What we learned
Of course, we can state the obvious and say that we learned about each of Quarkus' features and how they're used, but in the process, we also learned a great deal relating to how larger amounts of data are stored and utilized in general.
We learned about concepts like reactive, streams, cloud scaling, cloud-native development, all while building our first microservice architecture.
We all got a higher level of understanding of many general concepts and strategies that are utilized by Quarkus' abilities; we got to experience integrating it and seeing how each of its aspects would influence the functionality of our app.
Aside from the technical abilities, we really enjoyed the experience of just learning something new, and getting to code in java (finally), since other frameworks and strategies just haven't been able to make the cut. Our skills and passion for technology have only grown, and we're now familiar with a new favorite framework.
What's next for TidePool
After the submission process for TidePool, we hope to release this into the real world, as we predict that this is something that many parents would take an interest in.
- This is a product that we as a team really believe in, and with the right combination of bug fixes, business planning, and architectural optimization, we know we can get there!