Loading repository data…
Loading repository data…
KeepSerene / repository
QuillStack is a feature-rich MERN stack blogging platform with admin dashboard, rich text editor, and modern UI. Create, publish, and manage your blog content effortlessly.

A Modern MERN Stack Blogging Platform with Studio Ghibli-Inspired Design
Live Demo · Report Bug · Request Feature
QuillStack is a feature-rich, full-stack blogging platform built with the MERN stack and TypeScript. Inspired by the whimsical aesthetics of Studio Ghibli, it offers a delightful user experience with a warm, inviting interface in both light and dark themes.
This project serves as a comprehensive portfolio piece, demonstrating modern web development practices, including authentication, authorization, file uploads, rich text editing, and responsive design.
Key Highlights:
Comprehensive admin dashboard with metrics
Clone the repository
git clone https://github.com/KeepSerene/quill-stack-blog-site-mern.git
cd quill-stack-blog-site-mern
Install dependencies
pnpm install
Install backend dependencies
cd backend
pnpm install
Install frontend dependencies
cd ../frontend
pnpm install
cd ..
Create a .env file in the backend directory:
# Server Configuration
PORT=3000
NODE_ENV=development
# Client URL (for CORS)
CLIENT_URL=http://localhost:5173
# Database
DB_URI=mongodb://localhost:27017/quill-stack-db
# Or use MongoDB Atlas:
# DB_URI=mongodb+srv://username:password@cluster.mongodb.net/quill-stack-db
# JWT Secrets (generate strong random strings)
JWT_ACCESS_SECRET=your-super-secret-access-key-min-32-chars
JWT_REFRESH_SECRET=your-super-secret-refresh-key-min-32-chars
JWT_ACCESS_EXPIRES_IN=1h
JWT_REFRESH_EXPIRES_IN=1w
# Admin Emails (comma-separated)
ADMIN_EMAILS=admin@example.com,another@example.com
# Cloudinary Configuration
CLOUDINARY_CLOUD_NAME=your-cloud-name
CLOUDINARY_API_KEY=your-api-key
CLOUDINARY_API_SECRET=your-api-secret
# Logging
WINSTON_LOG_LEVEL=info
Create a .env file in the frontend directory:
# API Base URL
VITE_API_BASE_URL=http://localhost:3000/api/v1
Start the backend server
cd backend
pnpm dev
Start the frontend dev server (in a new terminal)
cd frontend
pnpm dev
Open your browser
http://localhost:5173http://localhost:3000# Build both frontend and backend
pnpm build
# Start the production server
pnpm start
quill-stack/
├── backend/
│ ├── src/
│ │ ├── configs/ # Configuration files
│ │ ├── controllers/ # Request handlers
│ │ │ └── v1/
│ │ │ ├── auth/ # Authentication controllers
│ │ │ ├── blogs/ # Blog controllers
│ │ │ ├── comments/ # Comment controllers
│ │ │ ├── likes/ # Like controllers
│ │ │ ├── users/ # User controllers
│ │ │ └── views/ # View controllers
│ │ ├── lib/ # Utility libraries
│ │ │ ├── cloudinary.ts # Cloudinary integration
│ │ │ ├── jwt.ts # JWT utilities
│ │ │ ├── mongoose.ts # MongoDB connection
│ │ │ └── winston.ts # Logging configuration
│ │ ├── middlewares/ # Express middlewares
│ │ │ ├── authenticate.middleware.ts
│ │ │ ├── authorize.middleware.ts
│ │ │ ├── upload.middleware.ts
│ │ │ └── validation-errors.middleware.ts
│ │ ├── models/ # Mongoose schemas
│ │ │ ├── User.ts
│ │ │ ├── Blog.ts
│ │ │ ├── Comment.ts
│ │ │ ├── Like.ts
│ │ │ └── View.ts
│ │ ├── routes/ # API routes
│ │ │ └── v1/
│ │ │ ├── auth.route.ts
│ │ │ ├── blogs.route.ts
│ │ │ ├── comments.route.ts
│ │ │ ├── likes.route.ts
│ │ │ ├── users.route.ts
│ │ │ ├── views.route.ts
│ │ │ └── index.ts
│ │ ├── @types/ # TypeScript type definitions
│ │ └── server.ts # Express app entry point
│ ├── package.json
│ └── tsconfig.json
├── frontend/
│ ├── public/
│ │ ├── favicon.svg
│ │ └── screenshots/ # App screenshots
│ ├── src/
│ │ ├── components/ # React components
│ │ │ ├── ui/ # shadcn/ui components
│ │ │ └── ... # Custom components
│ │ ├── layouts/ # Layout components
│ │ │ ├── Root.tsx
│ │ │ └── Admin.tsx
│ │ ├── pages/ # Page components
│ │ │ ├── auth/ # Authentication pages
│ │ │ ├── users/ # User pages
│ │ │ ├── admins/ # Admin pages
│ │ │ └── errors/ # Error pages
│ │ ├── routes/ # React Router configuration
│ │ │ ├── actions/ # Form actions
│ │ │ ├── loaders/ # Data loaders
│ │ │ └── router.ts
│ │ ├── lib/ # Utilities
│ │ │ └── api/ # API client setup
│ │ ├── types/ # TypeScript types
│ │ ├── index.css # Global styles
│ │ └── main.tsx # App entry point
│ ├── index.html
│ ├── package.json
│ ├── tsconfig.json
│ └── vite.config.ts
├── package.json # Root package.json
└── README.md
http://localhost:3000/api/v1https://quill-stack.onrender.com/api/v1| Method | Endpoint | Description | Auth Required |
|---|---|---|---|
| POST | /auth/register | Register a new user | No |
| POST | /auth/login | Login user | No |
| POST | /auth/refresh-token | Refresh access token | Yes (Cookie) |
| POST | /auth/logout | Logout user | Yes |
| Method | Endpoint | Description | Auth Required | Role |
|---|---|---|---|---|
| GET | /blogs | Get all published blogs | No | - |
| GET | /blogs/:slug | Get blog by slug | No | - |
| POST | /blogs | Create a new blog | Yes | Admin |
| PUT | /blogs/:slug | Update blog by slug | Yes | Admin |
| DELETE | /blogs/:slug | Delete blog by slug | Yes | Admin |
| Method | Endpoint | Description | Auth Required | Role |
|---|---|---|---|---|
| GET | /users | Get all users | Yes | Admin |
| GET | /users/current | Get current user | Yes | User/Admin |
| GET | /users/:userId | Get user by ID | Yes | Admin |
| PUT | /users/current | Update current user | Yes | User/Admin |
| DELETE | /users/current | Delete current user | Yes | User/Admin |
| DELETE | /users/:userId | Delete user by ID | Yes | Admin |
| GET | /users/:userId/blogs | Get blogs by user | Yes | User/Admin |
| Method | Endpoint | Description |