Full-stack Next.js 14 application for managing renovation projects in Hebrew (RTL).
- Authentication: Firebase Authentication with email/password
- Project Management: Create and manage multiple renovation projects
- Role-Based Access Control: 6 different roles (Owner, Admin, Family, Contractor, Designer, View-Only)
- Budget Tracking: Monitor planned vs. actual budget with overflow alerts
- Task Management: Track tasks with dependencies, categories, and statuses
- Room Progress: Track renovation progress by room
- Vendor Management: Manage contractors and vendors
- Payment Tracking: Track payments with multiple methods (cheque, bank transfer, cash, credit card)
- Hebrew RTL UI: Full right-to-left support using Material UI
- Frontend: Next.js 14 (App Router), React, TypeScript
- UI Framework: Material UI with RTL support
- Backend: Firebase (Authentication + Firestore)
- Styling: Emotion, RTL styling with stylis-plugin-rtl
- Deployment: Vercel (frontend) + Firebase (backend services)
- Node.js 18+ and npm
- Firebase account
- Git
cd renovation-app
npm install- Go to Firebase Console
- Create a new project or use an existing one
- Enable Firebase Authentication:
- Go to Authentication > Sign-in method
- Enable "Email/Password" provider
- Enable Firestore Database:
- Go to Firestore Database
- Create database in production mode (or test mode for development)
- Choose a location closest to your users
- Get your Firebase configuration:
- Go to Project Settings > General
- Scroll down to "Your apps"
- Click the web icon (</>) to add a web app
- Copy the configuration object
Create a .env.local file in the renovation-app directory and add your Firebase configuration:
NEXT_PUBLIC_FIREBASE_API_KEY=your-api-key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your-project-id.firebaseapp.com
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your-project-id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your-project-id.appspot.com
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your-messaging-sender-id
NEXT_PUBLIC_FIREBASE_APP_ID=your-app-idAdd these security rules to your Firestore database (in Firebase Console > Firestore Database > Rules):
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Helper function to check if user is authenticated
function isSignedIn() {
return request.auth != null;
}
// Helper function to check if user belongs to a project
function isProjectMember(projectId) {
return isSignedIn() &&
exists(/databases/$(database)/documents/projectUsers/$(request.auth.uid + '_' + projectId));
}
// Users collection
match /users/{userId} {
allow read: if isSignedIn();
allow write: if isSignedIn() && request.auth.uid == userId;
}
// Projects collection
match /projects/{projectId} {
allow read: if isProjectMember(projectId);
allow create: if isSignedIn();
allow update, delete: if isProjectMember(projectId);
}
// ProjectUsers collection
match /projectUsers/{projectUserId} {
allow read: if isSignedIn();
allow write: if isSignedIn();
}
// Rooms, Tasks, Vendors, Payments, Contracts, NotificationSettings
match /{collection}/{docId} {
allow read, write: if isSignedIn() &&
collection in ['rooms', 'tasks', 'vendors', 'payments', 'contracts', 'notificationSettings'];
}
}
}npm run devOpen http://localhost:3000 in your browser.
npm run build
npm startrenovation-app/
├── src/
│ ├── app/ # Next.js App Router pages
│ │ ├── dashboard/ # Project dashboard
│ │ │ └── [projectId]/ # Dynamic project pages
│ │ ├── login/ # Login page
│ │ ├── register/ # Registration page
│ │ ├── projects/ # Project selection & creation
│ │ ├── layout.tsx # Root layout with providers
│ │ └── page.tsx # Home page (redirects)
│ ├── components/ # Reusable components
│ │ ├── DashboardLayout.tsx # Main layout with sidebar
│ │ └── ThemeRegistry.tsx # MUI theme with RTL
│ ├── contexts/ # React contexts
│ │ └── AuthContext.tsx # Authentication context
│ ├── lib/ # Utilities and config
│ │ ├── firebase.ts # Firebase initialization
│ │ ├── labels.ts # Hebrew labels
│ │ └── permissions.ts # Role-based permissions
│ └── types/ # TypeScript types
│ └── index.ts # All type definitions
├── .env.local # Environment variables (not in git)
└── package.json
- users: User profiles
- projects: Renovation projects
- projectUsers: User-project relationships with roles
- rooms: Rooms in projects
- tasks: Tasks with dependencies
- vendors: Contractors and service providers
- payments: Payment tracking
- contracts: Contract documents
- notificationSettings: User notification preferences
| Role | Budget | Payments | Edit Tasks | Edit Rooms | Manage Users |
|---|---|---|---|---|---|
| OWNER | ✅ | ✅ | ✅ | ✅ | ✅ |
| ADMIN | ✅ | ✅ | ✅ | ✅ | ✅ |
| FAMILY | View | View | ✅ | ✅ | ❌ |
| CONTRACTOR | ❌ | ❌ | ✅ | ❌ | ❌ |
| DESIGNER | ❌ | ❌ | ✅ | ❌ | ❌ |
| VIEW_ONLY | ❌ | ❌ | ❌ | ❌ | ❌ |
- Register an Account: Go to
/registerand create a new account - Create a Project: After login, click "צור פרויקט חדש" (Create New Project)
- Fill Project Details: Enter project name, address, and planned budget
- Access Dashboard: Click on your project to view the dashboard
- Budget Summary: View planned, used, and remaining budget
- Task Progress: See overall task completion percentage
- Upcoming Payments: Track payments that are due soon
- Room Progress: Monitor renovation progress by room
- Alerts: Get notified about blocked rooms and overdue payments
Create new pages in src/app/dashboard/[projectId]/ for project-specific pages.
- Update types in
src/types/index.ts - Add Firestore queries in your components
- Update permissions in
src/lib/permissions.ts - Add Hebrew labels in
src/lib/labels.ts
Currently using mock data. To use real data:
- Replace mock data with Firestore queries
- Use
collection(),query(),where(),getDocs()from Firebase - Ensure proper authentication and permission checks
- Push your code to GitHub
- Import project in Vercel
- Add environment variables in Vercel dashboard
- Deploy
npm install -g firebase-tools
firebase login
firebase init hosting
npm run build
firebase deploy- Always verify user authentication on both client and server
- Check user project membership before showing data
- Hide financial data from CONTRACTOR and DESIGNER roles
- Use Firestore security rules to enforce server-side access control
- Never expose Firebase private keys or admin credentials
- File upload for contracts and invoices
- Real-time notifications with Firebase Cloud Messaging
- WhatsApp integration for notifications
- Gantt chart for task timeline visualization
- Mobile app (React Native or Flutter)
- PDF reports generation
- Multi-currency support
- Integration with accounting software
- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
MIT License - feel free to use this project for personal or commercial purposes.
For issues or questions, please open an issue on GitHub.
Built with ❤️ using Next.js 14, Material UI, and Firebase