Outline a brief description of your project. Live demo here.
- General Info
- Technologies Used
- Features
- Screenshots
- Setup
- Usage
- Project Status
- Room for Improvement
- Acknowledgements
- Contact
Who are we?
Hi! My name is Meidad Troper and together with team members Vaidic Soni, Kelvin Mathew, Priyanka Karki, and Jesse Flynn we created bRUSH! The new social media app.
What are we creating?
In short, this is a mobile social media app that aims at connecting everyone to their creative side as well as connect people closer. The app is aimed at anyone ages 12 to 22 though we believe it will be enjoyable even among families, sharing drawings with your parents.
bRUSH! is a mobile app inspired by BeReal, where all users world wide get a notification at the same time letting them know it is time to skecth! what are they bRUSHing? whatever the random, funny, bizzare, weird promt was generated for that day! every user, world wide - will all be drawing THE SAME THING at the SAME TIME talk about synchronization.... (sorry, bad programmer joke).
Users will have a pre determined amount of time to complete their daily drawing. before they have to submit it.
After a user has submitted their drawing, they are presented with all of their friends drawings! Again, same promt... and that is where the fun begin!
each user is granted medals they can award each day.
A gold medal can be awarded once per day, to the user's favorite drawing.
A silver medal can be awarded once per day for the user's second favorite drawing.
And of course a bronze medal can be awarded once per day for the user's third favorite bRUSH.
In addition, every user is given an unlimited number of "participation medals" which they can award to all the drawings they hated.... Just kidding... they can be awarded to the drawings the user recognizes as impressive, but simply we'rent in the top 3 that day in the user's opinion.
Each user grants those medals to their friends or family... but don't forget... the user also has the chance to be awarded medals of their own from their friends or family! resulting in a friendly and fun competition... who can earn the most gold medals?
Who are we doing it for?
The app is aimed at anyone ages 12 to 22 though we believe it will be enjoyable even among families, sharing drawings with your parents.
Why are we doing this?
Now, you might be hearing all of this... and wonder- but why? what's the point..? it doesn't really solve any global issue... it doesn't save lives, and it most certainly doesn't leave the world a better place... so what even if the point??
Well... According to a recent research, About 45% of students world wide report wishing they had more opportunities to express themselves creatively or artistically but can't. It was also found that 80% of people believe unlocking creativity is critical to economic growth. [1]
Our platform is just the place to do so. People of all ages could take their very own twist at our random bRUSH prompts, and truly express themselves in them. While the app aims to be fun and easy going, it also enables those students craving to express themselves the platform to do so, without being jujged.
bRUSH! Aims to connect people, unlock creative thinking, and bring more color to the world (literally).
- Swift UI
- XCode
- Firebase Authentication
- Firebase Cloud Storage
- Gemini API (Google AI)
- Apple Native APIs (Pencil Kit, photos UI, etc...)
Currently in progress as of October 6, 2025 (Next steps for sprint 2):
- Pick a personal profile page photo
- store drawings locally
- friend requests and leaderboard
- feed view
- medal awarding
- Liquid glass implemntation
- sign up user verification (verification codes)
- Notifications panel
This section lists individual contributions for this sprint.
Each entry includes the JIRA task ID, title, and links to related commits or pull requests.
- Implemented all user login logic including authentication flow and session persistence.
π Bitbucket
- Added user sign-out functionality, restoring the app to its deafult, empty state. π Bitbucket
- Implemented the ability for users to permanently delete their profiles and associated data.
π Bitbucket
- Developed the user registration process and linked it to the backend user store.
π Bitbucket
- Implemented logic for user to update their profiles, including name and username.
π Bitbucket
KAN-106 β Allow Users to pick up a profile photo and set it as their own profile photo, customizing their account
- Added logic to allow users to create their own profile pic in the form of an avatar. That avatar is built of different images overlaid on each other. π Bitbucket
- Added logic that allows users to edit their information after they signed up, in case there was a mistake during the initial setup or they simply want to refresh their profile. π Bitbucket
- Added A sleek animation to the signin page that shows fun skecthes the users can make during their
lifetime on the app.
π Bitbucket
- Implemented logic for thr Profile UI (cards, photo, etc) to scale correctly on all screen sizes. For some reason, iPads had a bunch of issues. Mostly due to different aspect ratio. π Bitbucket
- Added logic to revert hardcoded values and ensure card views in the profile page use real up-to-date cloud info. π Bitbucket
KAN-112 β Add a card that shows the streak, total drawings, and possibly other metric as we see fit
- User profile has a third card for the streak, total drawings, and member since fields. this adds color and cool stats. π Bitbucket
- Added Error Messages for things such as too long of a username, non-matching passwords, invalid email, etc... to allow better user exprienece π Bitbucket
- Moved the signout and delete account buttons into the gear menu for better layout and to ensure they aren't easily clickable by accident. π Bitbucket
- Added Error Messages for things such as too long of a username, non-matching passwords, invalid email, etc... to allow better user exprienece. π Bitbucket
- Added Human avatar options, allowing users to create themselves instead of the "crack addict" looking ones as the team called them, lol. π Bitbucket
- Added the first of 3 unit tests. This one checks the state of the app when user is signed in to see if it tracks correctly. π Bitbucket
- Added The second of 3 Unit tests. This one was for the signout state of the app. π Bitbucket
- Added The third of 3 Unit tests (and last one). This one was for the input length in the password field during signup. π Bitbucket
- Added The second of 3 Unit tests. This one was for the input length in the password field during signup. π Bitbucket
- Added small logic that turns the password field red during signup when the password typed doesn't meet the minimum requirement length wise. π Bitbucket
KAN-158 β Ensure the Refresh Count button on the profile cards fits correctly for all screen sizes
- Updated the UI code for the "refresh stats" button, that makes sure it doesn't overlap the cards on iPad. π Bitbucket
- Updated the UI of the geer icon to ensure it is better fitting the color theme of the app and username text. This has been changed to liquid glass later on by Kelvin as we discussed it might be better. π Bitbucket
- Updated the Avatar Model from having hardcoded array elements (for example "hair_1, hair_2, hair_3, etc...) to useing an array map that goes from 1 to however many items we have, since every avatar option already follows the same naming convension. this allows to simply update the # (size) the map goes to when adding new options, instead of having to manually hardcode the added options. π Bitbucket
- Added a "shared cards" feature, which allows user to share pre-made, up-to-date cards showing their stats such as streak count, total drawings, total medals, or even upload their own drawing and export these as an image, to share on social media. π Bitbucket
KAN-197 β Add a way to export the share cards as a video so it can be shared in a more "alive" way
- Added a way to export the share cards as a video as well (previously was just an image), which captures both the card AND the animated background. This allows users to share a much more "alive" and vibrant showing of their achivements. π Bitbucket
- Added the plan for the unit tests as was required to in sprint assingment 14. π Bitbucket
Update the app and get it ready for possible app store publication, as per the team's discussion!!
- Implemented UI and logic for for the canvas which can generate strokes based on touch input. π Bitbucket Branch
- Implemented UI and logic for the customized Swift toolpicker that updates the drawing view. π Bitbucket Branch
- Implemented UI and logic for being able to undo and redo on iPhone due to the toolpicker not showing one unlike iPad. π Bitbucket Branch
- Implemented UI and logic for creating the composite drawing, saving it in the local memory and being able to share it. π Bitbucket Branch π Bitbucket Pull Request
- Implemented UI and logic for being able to change the color of the canvas or pick from preset assets. Updated the export feature based on this. π Bitbucket Branch π Bitbucket Pull Request
- Added an outline around the canvas that acts as a timer that changes the color while you draw. π Bitbucket
- Added logic that changess the color of the outline timer to show urgency. π Bitbucket
- Added logic that flahses the color at the very end of the timer as a final warning. π Bitbucket
- Implemented logic to upload the shared submissions π Bitbucket
- Added a confirmation dialog when the user chooses to submit early. π Bitbucket
- Added logic to show a success animation after submission. π Bitbucket
- Resolve issues with combining drawing strokes and the background image. π Bitbucket
- Retrieve the prompt from the feed and show it via the bulb icon during drawing. π Bitbucket
- Added a bubble looking container for the prompt using liquid glass that closes when you click outside. π Bitbucket
- Added logic to store the prompt text and creation date locally with each drawing. π Bitbucket
- Improve the share sheet to include βSave Imageβ and other social sharing options. π Bitbucket
- Added logic to save and show the old prompts in oldser drawings. π Bitbucket
- Fixed some issues that were found after the first demo. Removed unused/empty files, changed app name and display info, added variables, fixed styling, etc... π Bitbucket
- Used matchedGeometryEffect to smoothly transition between the grid view to the preview view. (Note: Accidentally the commits for this task were made and linked to the https://cs3398-nemoidians-fall.atlassian.net/browse/KAN-125 branch.) π Bitbucket
- In the simulatorβs app sandbox the images arenβt saved in a fixed directory, instead it's a relative path which changes upon rebuilding. (Note: Accidentally the commits for this task were made and linked to the https://cs3398-nemoidians-fall.atlassian.net/browse/KAN-125 branch.) π Bitbucket
- Drawings in the grid should be able to be long pressed to see the delete option. Also an edit button in the corner to select multiple drawings to delete. π Bitbucket
- Added Deletion Animation to the Drawing Page. π Bitbucket
- Fixed issues found during the Sprint 2 Demo. Many small changes in many files. π Bitbucket
- Fixed a bug where the uploaded drawings had the wrong date on them. This one does NOT have a branch since it was a hotfix. Dr lehr and I talked about this and settled the issue.
- Made dark mode more compatible for icons, stat cards, as well added a notch in avatar + fixed dark mode bugs in the editor. π Bitbucket
- Restructured the files to cleanly separate the backend from the UI, and added the current user to the leaderboard along with some visual fixes. π Bitbucket
- Added a custom inner-shadow modifier for highlighting drawings, plus an average-color background with adaptive text.Also added single/multi share buttons and converted the old alerts into action sheets. π Bitbucket
- I updated the animated mesh-gradient background for the feed and added a custom snow effect using the Vortex library, along with a new streak animation for daily drawings. I also refreshed the submission popup with a Lottie animation and created a custom launch-screen storyboard with responsive transitions for both iPhone and iPad. π Bitbucket
- I improved feed performance with better caching, smoother scrolling, and new transitions, while expanding the profile and avatar features and fixing issues like side-indicator desync and medal limits. I also added new animations, faster notifications, and general styling refinements across the app. π Bitbucket
- Updated the profile sheet with adaptive buttons and stat cards, made the Avatar View customizable as a mini PFP, and revamped the Add Friend view to show the profile sheet with an add option. I also prepped the system for future facial-hair options and a custom 3D avatar in the profile sheet. π Bitbucket
- I fixed the iPad profile-sheet scaling so everything renders correctly on large screens, restored the lost friend-fetching logic with a cleaner, more efficient approach, and polished the leaderboard with stable avatar placement, proper badge stacking, and full dark-mode support. I also improved loading behavior with cleaner redacted states and disabled interactions, and fully fixed profile deletion so friendships, requests, and sign-out all work correctly. π Bitbucket
- Added unit tests for the drawings. π Bitbucket
- The friends tab now refreshes automatically when switching tabs (with pull-to-refresh supported), the friends view shows a real loading state, and feed blur logic correctly uses the streakβs last-completed date. Removing a friend from the profile sheet now updates both the feed and leaderboard just like the friends view. π Bitbucket
- I rebuilt the card system so all text, sizes, and assets scale cleanly and stay consistent, overhauled the showcase and picker for better loading and export behavior, and fixed scrolling and indicator issues across the feed (including dark-mode quirks). I also cleaned up UI bugs by restoring redacted/avatar titles, fixing login layouts, updating notification badges, adding a leaderboard toast, and refreshing popovers. π Bitbucket
- Added the unit tests report as required in sprint assingment 14. π Bitbucket
- Fixing a few issues for the upcoming spring such as card scaling on iPad, spacing adjutments, better dark mode support, and updating small UI elements for better visibility π Bitbucket
Research how to publish the app on the app store and fix any issues as (and if) they rise.
- Users now get periodic reminders every 2 hours to complete their daily drawing if they haven't done so. π Bitbucket
- Fixed notifications and made changes to make them better and increase their frequency. π Bitbucket
- Designed logic to track daily drawing streaks to motivate users. π Bitbucket
- Implemented a dropdown panel that stores and displays all past notifications. π Bitbucket
- Added logic to integrate Gemini API to generate daily drawing prompts π Bitbucket
- Following KAN-113, Added logic to fetch the generated prompt. π Bitbucket
- Implement logic to upload the user's post feature. π Bitbucket
- Added options to share and or download options. π Bitbucket
- Added main logic to fetch the friend's post and show them. π Bitbucket
- Implemented backend data linking. π Bitbucket
- Trained the LLM on certain prompts by giving it examples. π Bitbucket
- Fixing notifications and streak.
- Implement a refresh function on the feed.
- Add necessary animations and UI changes.
Integrated the new logo into the welcome screen. Added a βGet Startedβ button and aligned layout elements. Ensured consistency and responsiveness across devices. π Bitbucket
Built the main feed to display friendsβ drawings. Added navigation tabs for Home, Explore, Create, and Profile. Structured layout for future backend integration. π [Bitbucket] (https://bitbucket.org/cs3398-nemoidians-f25/%7B57222da5-99b9-44b5-8ae7-38296988f7a4%7D/branch/feature/KAN-63-as-a-user-i-want-my-home-page-to-)
Enabled navigation from feed posts to creator profiles. Added private profile visibility logic. Tested smooth page transitions. π Bitbucket
Added interactive like, medal, and share buttons to feed posts. Managed state updates and interaction animations. Verified full integration within feed layout. π Bitbucket
###(Sprint 2)
KAN-93 β Define how each post and its prompt should be structured in the full-screen βreelsβ layout
Designed and implemented the foundational structure for displaying each post in a full-screen vertical layout, inspired by βreelβ-style interactions. Added layout logic ensuring proper alignment of post. π Bitbucket
Developed the main full-screen post view with seamless vertical paging scroll between posts. Integrated smooth transition behavior for better UX consistency with Ripple effect Bitbucket
Standardized layout and alignment for all feed posts to maintain consistent styling and spacing across devices.
Added a fixed prompt container pinned to the top of the feed to display current drawing prompts.
Created a sticky post input box that allows users to easily add new posts without scrolling. Bitbucket
Add swipe gesture support for navigating between full-screen posts. Implement lazy loading and caching for smoother scrolling performance. Enhance accessibility features, including dynamic text scaling and color contrast improvements. Introduce basic feed analytics (view count, engagement tracking) - extra. Fix share button logic to ensure consistent link generation and correct post sharing across devices. Bug fixes: address minor visual inconsistencies in prompt alignment and post transitions.
- Implemented friend screen UI
- Added friend requests section with accept/decline functionality (mock)
- Added friends section with searchable list
π Bitbucket
- Added LeaderboardEntry model and LeaderboardService protocol
- Extended Friends VM with state, sorting, and refresh logic
- Added Leaderboard section in Friends page with ranking, points, refresh, and error/empty states
- Added trophy icon to toggle leaderboard visibility
π Bitbucket
Note: KAN-18 (Friends tab) was accidentally merged into main instead of the sprint1-dev branch. As a result, when I created the KAN-19 branch and merged it into sprint1-dev, it also included the KAN-18 commits. These commits were already reviewed and merged to main earlier. KAN-19 contains only the leaderboard-related changes, but the history shows both sets because of the branch base. This was not an attempt to duplicate or fake work - just a branch merge mistake that I wanted to add here for clarity.
- Implemented friend search and add functionality using Firestore queries on
handle_lowercase. - Integrated HandleServiceFirebase and FriendRequestServiceFirebase for sending, accepting, and declining requests.
- Added bidirectional friendship creation under
/friendships/{uid}/friends/{friendUid}upon acceptance. - Connected UI (
AddFriendView,FriendsViewModel) to reflect pending and accepted states.
π Bitbucket
- Built Firestore logic to load incoming requests under
/friendRequests/{toUid}/incoming/{fromUid}. - Implemented accept/decline to create or remove friendship edges and update the Friends UI immediately.
- Added incoming requests section with action buttons.
π Bitbucket
- Implemented
LeaderboardServiceto aggregate medals from each friendβs user document. - Updated LeaderboardEntry to store gold, silver, bronze, and computed total points (100/25/10 weights).
- Built horizontal bar chart UI where bar width reflects points relative to the top friend.
π Bitbucket
- Added unit tests for FriendsViewModel covering add/remove logic, search filtering, and duplicate request guards.
- Fixed swipe-to-delete crash (List diff mismatch) by removing locally first, then deleting remotely.
- Tightened pending request logic to check both fromUid and toUid (per-current-user pending).
π Bitbucket
- Added tap gesture to open FriendProfileView sheet showing name, handle, and medals.
- Implemented friend removal from profile with confirmation and automatic sheet dismissal.
- Ensured bidirectional Firestore cleanup and refreshed Friends list on delete.
π Bitbucket
- Designed and implemented the backend for the daily medal system using Firestore.
- Added awardUsage documents to enforce the rule that each user gets one gold, one silver, and one bronze medal to give per day.
- Created an awards subcollection under each dailyFeed/{userId} document to store which user gave which medal on which day.
- Implemented AwardServiceFirebase with transactional logic to safely record medals and a fetchAwardCounts helper to aggregate medal counts per user for the feed/leaderboard.
π Bitbucket
- Integrated the medal system into the Home feed cards to show live gold/silver/bronze counts for each drawing.
- Added medal buttons with confirmation alerts, self-award prevention, and one-per-day disabling.
- Wired medal counts into the leaderboard and profile stats so that newly awarded medals are reflected in the UI after reload.
π Bitbucket
- Ensure refresh of medal counts on all VM loading. Polish and prepare app for the App Store.
Project is: in progress
