A modern, full-stack note-taking application built with React 19, Node.js, Express, and MongoDB. Features a beautiful UI with real-time search, category management, user authentication, and pagination.
Login Email : xyz@gmail.com, password : 12345678, project video : https://youtu.be/fdxx97Xhd9E
- ** Note Management**: Create, edit, view, and delete notes with rich content
- ** Categories**: Organize notes into categories with automatic count tracking
- ** Advanced Search**: Real-time search by title, content, or tags with pagination
- ** Tags**: Add multiple tags to notes for enhanced organization
- ** User Authentication**: Secure login/register system with JWT tokens
- ** Pagination**: Efficient pagination with 6 notes per page
- ** Responsive Design**: Works seamlessly on desktop, tablet, and mobile
- ** Responsive Design**: Works seamlessly on desktop, tablet, and mobile
- ** Beautiful UI**: Modern design with indigo-purple gradients and smooth animations
- ** Fast Performance**: Built with React 19 for optimal performance
- ** Intuitive Navigation**: Easy-to-use interface with collapsible sidebar
- ** Smooth Animations**: Elegant transitions and hover effects
- ** Real-time Updates**: Instant updates when creating, editing, or deleting notes
- ** Category Counts**: Real-time display of notes count per category
- ** Smart Filtering**: Filter by category with automatic pagination reset
- ** TypeScript**: Full type safety throughout the application
- ** Design System**: Consistent theming with CSS custom properties
- ** Component Architecture**: Modular, reusable components
- ** Modern Stack**: React 19, Vite, Tailwind CSS
- ** JWT Authentication**: Secure token-based authentication
- ** Image Upload**: Cloudinary integration for note images
- ** Real-time Data**: Live updates with proper state management
- JWT Token Authentication: Secure token-based authentication
- Password Hashing: bcryptjs for secure password storage
- Protected Routes: Middleware for route protection
- User Registration & Login: Complete auth flow
- CRUD Operations: Create, Read, Update, Delete notes
- Pagination: Efficient pagination with configurable limits
- Search Functionality: Full-text search across titles and content
- Category Filtering: Filter notes by category
- Image Upload: Cloudinary integration for note images
- User Ownership: Notes are associated with specific users
- Category CRUD: Full category management
- Real-time Counts: MongoDB aggregation for note counts
- Unique Categories: Prevent duplicate category names
- Category-Note Association: Proper relationships
- RESTful API: Standard REST endpoints
- MongoDB Integration: Mongoose ODM for database operations
- File Upload: Multer middleware for file handling
- CORS Support: Cross-origin resource sharing
- Input Validation: Zod schema validation
- Error Handling: Comprehensive error responses
- Logging: Morgan for request logging
- Framework: React 19 with TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS 4.1
- UI Components: Radix UI + Custom components
- Icons: Lucide React
- State Management: React Hooks (useState, useEffect)
- HTTP Client: Fetch API
- Form Handling: React Hook Form with Zod validation
- Runtime: Node.js with Express 5.1
- Database: MongoDB with Mongoose ODM
- Authentication: JWT (jsonwebtoken)
- Password Hashing: bcryptjs
- File Upload: Multer + Cloudinary
- Validation: Zod
- CORS: Cross-origin resource sharing
- Logging: Morgan
- Package Manager: npm
- Development Server: Nodemon
- Environment Variables: dotenv
- Code Quality: ESLint, TypeScript
- Node.js 18+ and npm installed
- MongoDB database (local or cloud)
- Git for version control
- Cloudinary account (for image uploads)
-
Clone the repository
https://github.com/Mijan2001/note-organizer-application.git cd new-project-todo
-
Install Backend Dependencies
cd backend npm install
-
Install Frontend Dependencies
cd ../frontend npm install
-
Environment Setup
Backend (.env file in backend directory):
PORT=5000 MONGODB_URI=mongodb://localhost:27017/note-organizer JWT_SECRET=your-super-secret-jwt-key CLOUDINARY_CLOUD_NAME=your-cloudinary-cloud-name CLOUDINARY_API_KEY=your-cloudinary-api-key CLOUDINARY_API_SECRET=your-cloudinary-api-secret
Frontend (.env file in frontend directory):
VITE_API_URL=http://localhost:5000
-
Start the Development Servers
Backend (Terminal 1):
cd backend npm run dev
Backend will run on:
http://localhost:5000
Frontend (Terminal 2):
cd frontend npm run dev
Frontend will run on:
http://localhost:5173
-
Open your browser Navigate to
http://localhost:5173
to see the application
new-project-todo/
├── backend/
│ ├── controllers/
│ │ ├── authController.js # User authentication logic
│ │ ├── categoryController.js # Category CRUD operations
│ │ └── noteController.js # Note CRUD operations
│ ├── middleware/
│ │ ├── auth.js # JWT authentication middleware
│ │ └── upload.js # File upload middleware
│ ├── models/
│ │ ├── Category.js # Category schema
│ │ ├── Note.js # Note schema
│ │ └── User.js # User schema
│ ├── routes/
│ │ ├── auth.js # Authentication routes
│ │ ├── category.js # Category routes
│ │ └── note.js # Note routes
│ ├── uploads/ # Temporary file storage
│ ├── index.js # Server entry point
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ │ ├── auth/
│ │ │ │ ├── login.tsx # Login dialog
│ │ │ │ └── register.tsx # Registration dialog
│ │ │ ├── layout/
│ │ │ │ └── header.tsx # Main application header
│ │ │ ├── notes/
│ │ │ │ ├── note-editor.tsx # Note creation/editing
│ │ │ │ ├── note-grid.tsx # Notes display grid
│ │ │ │ └── note-details-dialog.tsx # Note details modal
│ │ │ └── ui/
│ │ │ ├── category-sidebar.tsx # Category management
│ │ │ ├── note-card.tsx # Individual note card
│ │ │ ├── pagination.tsx # Pagination component
│ │ │ └── [shadcn components] # Base UI components
│ │ ├── pages/
│ │ │ └── Index.tsx # Main dashboard page
│ │ ├── lib/
│ │ │ └── utils.ts # Utility functions
│ │ ├── hooks/
│ │ │ └── use-toast.ts # Toast notification hook
│ │ ├── index.css # Design system & global styles
│ │ └── main.tsx # Application entry point
│ └── package.json
└── README.md
POST /api/auth/register # Register new user
POST /api/auth/login # Login user
GET /api/notes # Get all notes (with pagination)
POST /api/notes # Create new note
GET /api/notes/:id # Get specific note
PUT /api/notes/:id # Update note
DELETE /api/notes/:id # Delete note
POST /api/notes/:id/photo # Upload note image
GET /api/categories # Get all categories with note counts
POST /api/categories # Create new category
GET /api/categories/:id # Get specific category
PUT /api/categories/:id # Update category
DELETE /api/categories/:id # Delete category
?page=1&limit=6&search=query&category=categoryId
- Registration: User creates account with email/password
- Login: JWT token generated and stored in localStorage
- Protected Routes: Token verified on each API request
- Logout: Token removed from localStorage
{
username: String (required, unique),
email: String (required, unique),
password: String (hashed),
createdAt: Date,
updatedAt: Date
}
{
name: String (required, unique),
createdAt: Date,
updatedAt: Date
}
{
title: String (required),
content: String (required),
category: ObjectId (ref: Category),
author: String (required),
tags: [String],
imageUrl: String,
user: ObjectId (ref: User),
photo: String,
createdAt: Date,
updatedAt: Date
}
- Set environment variables
- Connect MongoDB database
- Deploy using Git integration
- Set
VITE_API_URL
to production backend URL - Deploy using Git integration
# Backend
MONGODB_URI=your-production-mongodb-uri
JWT_SECRET=your-production-jwt-secret
CLOUDINARY_CLOUD_NAME=your-cloudinary-cloud-name
CLOUDINARY_API_KEY=your-cloudinary-api-key
CLOUDINARY_API_SECRET=your-cloudinary-api-secret
# Frontend
VITE_API_URL=https://your-backend-url.com
cd backend
npm test
cd frontend
npm run test
npm run dev # Start development server with nodemon
npm start # Start production server
npm test # Run tests
npm run dev # Start development server
npm run build # Build for production
npm run preview # Preview production build
npm run lint # Run ESLint
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- React Team for the amazing framework
- Tailwind CSS for the utility-first CSS framework
- Radix UI for accessible component primitives
- Lucide for beautiful icons
- MongoDB for the flexible database
- Cloudinary for image hosting
If you have any questions or need help:
- Check the Issues page
- Create a new issue with detailed description
- Contact the maintainers
Made with by [Mijanur Rahman]
This project demonstrates modern full-stack development practices with React, Node.js, and MongoDB.