Inspiration

One of my friends at a different university recently came back from a retreat with a group of ~15 people. Throughout the retreat, he had gotten close with many of the members and wanted to keep in touch after the trip. About a week afterwards, he scheduled 1-1 meals and walks with all members, hoping to catch up. Many agreed, but he was surprised that no one had taken the initiative to ask him. When he asked the most extroverted friend in the group, he was surprised to hear that she wanted to ask people but was scared/anxious to do so. In our discussion of his trip, we brainstormed an app idea that allowed friends to easily agree to activities without having the hassle of going down a list of friends, asking each one if they're available, waiting 30 minutes just to find out no is available, and end up not making any plans.

What it does

Through Impromptu, users broadcast their current availability (e.g., "down for food", "studying", "free") and can quickly match with friends who share similar intent. The app facilitates discovery and initializes the hangout - actual coordination happens over external messaging apps.

Users can add friends, create playlists of friends for different purposes (e.g., gym, studying, tennis), and search through their friend network to see which friends are available for any task. Users have a preset of statuses ("busy," "coffee," "food"), but can also leave a custom note adding more detail to their status.

How we built it

We started by sketching out demo pages and detailing fully-fledged workflows on a whiteboard. During this phase, we wrote out all features we wanted and drew what each page would look like after interacting with certain buttons. After deciding on the project overview and architecture, we discussed implementation details using Claude. Once our plan was written, we developed the project using a combination Codex, GitHub Copilot, and Claude Code. We used TypeScript/NextJS for our frontend and backend, MongoDB as our database, Clerk for authentication, Gemini API for natural language parsing features, OneSignal for push notifications, Cloudinary for cloud file storage, and Google Stitch to help with designs. We built Impromptu as a Progressive Web App (PWA) to make deployment easier and make the app usable on mobile devices while circumventing the issues that come with sharing the app through the App Store.

Challenges we ran into

Initially, during our whiteboard brainstorming phase, we realized that there were many so small details we needed to consider given that our idea was fairly simple and straightforward. As a result, we had to spend much more time than expected drawing out all functionalities for our app.

We ran into issues integrated Gemini API and getting our desired functionality. We were able to incorporate Gemini into an AI scheduler feature, but the output did not correctly parse the information we needed (such as the correct end time for an activity/status).

Deployment was a huge hurdle we had to overcome. Initially, we struggled with deciding whether to develop a web app or a mobile app. Eventually, after doing some more research, we landed on building a Progressive Web App that bridges the gap between the two. Neither of us had worked with a PWA before, so we learned how to deploy the app and use it on a mobile device.

Accomplishments that we're proud of

Our biggest accomplishments are mapping the entire workflow clearly, successfully translating a design we wanted into the app's UI, and successfully running the PWA on our mobile devices.

What we learned

We learned the importance of writing out user and app workflows being doing any coding. With the details written out beforehand, AI agents have a much easier time implementing what we envisioned.

What's next for Impromptu

Next up, we need to incorporate automated scheduling given a correct output from Gemini. Another high priority feature is the push notifications showing up on users' devices, instead of relying on users frequently checking their phone.

Share this project:

Updates