Frinna is a full-stack anonymous messaging application built with React and Firebase. As a developer with 3 years of experience in Vue.js, I created this project as a hands-on challenge to master the React ecosystem, from component architecture and state management to automated testing and deployment.
Live Demo: [https://frinna.vercel.app]
| Sign In Page | Sign Up Page (with validation) | User Dashboard |
|---|---|---|
![]() |
![]() |
![]() |
- ✅ User Authentication (Email/Password)
- ✅ Anonymous "Mailbox" System for one-way messages
- ✅ Real-time, two-way chat for registered users
- ✅ Message Reply functionality
- ✅ Fully Responsive Design
- ✅ Automated CI/CD pipeline with GitHub Actions
This project leverages a modern, professional tech stack:
- Framework: React 19
- Build Tool: Vite
- Language: TypeScript
- Styling: Tailwind CSS
- Routing: React Router DOM v7.7
- State Management: Zustand
- Backend & Database: Firebase (Authentication & Firestore)
- Form Handling: React Hook Form
- Notifications: React Hot Toast
- Testing: Vitest & React Testing Library
As a developer transitioning from Vue.js, several key decisions were made to deepen my understanding of the React ecosystem:
-
Custom Components over UI Library: I deliberately chose to build core components like
ButtonandInputfrom scratch using Tailwind CSS instead of using a pre-built library. This forced me to master concepts like component polymorphism,React.forwardRef, and state management within reusable components. -
Zustand for Global State: I selected Zustand for its simplicity, minimal boilerplate, and hook-based API. It felt like a natural and modern successor to the patterns I was familiar with from Pinia in the Vue world, making it an excellent tool for managing global authentication state.
-
User-Centric Testing with RTL: I am implementing a test suite using Vitest and React Testing Library to ensure the application is robust and maintainable. This approach focuses on testing the application from the user's perspective, which builds confidence in the app's functionality rather than its implementation details.
To get a local copy up and running, follow these simple steps.
- Node.js (v22)
- npm or yarn
- Clone the repository:
git clone https://github.com/devadedeji/frinna.git
- Navigate to the project directory:
cd frinna - Install NPM packages:
npm install
This project uses Firebase for its backend. You will need to create your own Firebase project to get the necessary credentials.
-
Create a
.env.localfile in the root of the project. -
Add your Firebase configuration variables. You can find these in your Firebase project settings.
# .env.local VITE_FIREBASE_API_KEY="your_api_key" VITE_FIREBASE_AUTH_DOMAIN="your_auth_domain" VITE_FIREBASE_PROJECT_ID="your_project_id" VITE_FIREBASE_STORAGE_BUCKET="your_storage_bucket" VITE_FIREBASE_MESSAGING_SENDER_ID="your_sender_id" VITE_FIREBASE_APP_ID="your_app_id"
Start the development server:
npm run devOpen http://localhost:5173 to view it in the browser.
To run the component and integration tests, use the following command:
npm run test

