A modern, full-featured blogging platform built with the MERN stack (MongoDB, Express.js, React, Node.js). Inkwell provides writers with a powerful, intuitive interface to create, publish, and manage their content.
- Rich Text Editor: EditorJS integration with headers, lists, code blocks, quotes, images, and embeds
- Image Upload: Cloudflare R2 integration for banner and content images
- Draft System: Save drafts and publish when ready
- SEO Optimization: Meta descriptions and tags for better discoverability
- Authentication: JWT-based authentication with Google OAuth
- User Profiles: Customizable profiles with social links
- Dashboard: Personal dashboard with blog management
- Settings: Profile editing and password management
- Comments System: Nested comments with replies
- Like System: Like/unlike blogs with real-time updates
- Notifications: Real-time notifications for likes, comments, and replies
- Search & Discovery: Search blogs and users with filtering
- Responsive Design: Mobile-first design that works on all devices
- Dark/Light Theme: Theme support with CSS variables
- Animations: Smooth transitions with Framer Motion
- Accessibility: WCAG compliant design
- Node.js (v16 or higher)
- MongoDB (local or MongoDB Atlas)
- Cloudflare R2 account
- Firebase project (for Google OAuth)
-
Clone the repository
git clone https://github.com/harish-govindasamy/inkwell.git cd inkwell -
Install backend dependencies
cd server npm install -
Install frontend dependencies
cd ../inkwellFrontend npm install -
Set up environment variables
Backend (server/.env):
DB_LOCATION=mongodb://localhost:27017/inkwell SECRET_ACCESS_KEY=your-jwt-secret-key R2_ACCOUNT_ID=your-cloudflare-account-id R2_ACCESS_KEY_ID=your-r2-access-key R2_SECRET_ACCESS_KEY=your-r2-secret-key R2_BUCKET=inkwell FIREBASE_PROJECT_ID=your-firebase-project-id FIREBASE_CLIENT_EMAIL=your-firebase-client-email FIREBASE_PRIVATE_KEY=your-firebase-private-key
Frontend (inkwellFrontend/.env):
VITE_SERVER_DOMAIN=http://localhost:3000
-
Start the development servers
Terminal 1 (Backend):
cd server npm startTerminal 2 (Frontend):
cd inkwellFrontend npm run dev -
Open your browser Navigate to
http://localhost:5173to see the application.
inkwell/
├── server/ # Backend (Express.js)
│ ├── Schema/ # MongoDB schemas
│ │ ├── User.js
│ │ ├── Blog.js
│ │ ├── Comment.js
│ │ └── Notification.js
│ └── server.js # Main server file
├── inkwellFrontend/ # Frontend (React)
│ ├── src/
│ │ ├── components/ # Reusable components
│ │ ├── pages/ # Page components
│ │ ├── common/ # Utility functions
│ │ └── contexts/ # React contexts
│ └── public/ # Static assets
└── README.md
- React 18 - UI library
- Vite - Build tool and dev server
- Tailwind CSS - Utility-first CSS framework
- Framer Motion - Animation library
- EditorJS - Rich text editor
- Axios - HTTP client
- React Router DOM - Client-side routing
- Node.js - Runtime environment
- Express.js - Web framework
- MongoDB - Database
- Mongoose - MongoDB object modeling
- JWT - Authentication
- bcrypt - Password hashing
- Firebase Admin SDK - Google OAuth
- Cloudflare R2 - File storage
POST /signup- User registrationPOST /signin- User loginPOST /google-auth- Google OAuthPOST /change-password- Change passwordPOST /update-profile- Update user profile
POST /create-blog- Create new blogGET /latest-blogs- Get latest blogsGET /trending-blogs- Get trending blogsGET /get-blog/:blog_id- Get individual blogGET /search-blogs- Search blogsDELETE /delete-blog- Delete blog
POST /add-comment- Add commentGET /get-blog-comments- Get blog commentsDELETE /delete-comment- Delete comment
POST /like-blog- Like/unlike blogGET /is-liked-by-user- Check if blog is liked
GET /get-user/:user_id- Get user profileGET /search-users- Search users
GET /notifications- Get user notificationsPOST /mark-notification- Mark notification as read
- Connect your GitHub repository to Render
- Set environment variables in Render dashboard
- Deploy automatically on push to main branch
- Connect your GitHub repository
- Set build command:
npm run build - Set publish directory:
dist - Add environment variables
- Deploy
- Create a MongoDB Atlas account
- Create a new cluster
- Get connection string
- Update
DB_LOCATIONin environment variables
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- EditorJS - Rich text editor
- Tailwind CSS - CSS framework
- Framer Motion - Animation library
- Cloudflare R2 - Object storage
- Firebase - Authentication
If you have any questions or need help, please:
- Open an issue on GitHub
- Check the documentation
- Contact the maintainers
Built with ❤️ using the MERN stack