How to Build a Blog Platform with Next.js and MongoDB in 2025

22/06/2025

How to Build a Blog Platform with Next.js and MongoDB in 2025

Learn how to build and deploy a full-stack service platform using Next.js, MongoDB, Node.js, and Tailwind CSS. Includes CRUD, auth, search, SEO, and deployment tips.

Blog Platform with Next.js & MongoDB

|   Tags: Next.js, MongoDB, Full Stack, MERN, Projects

Why Build Your Own Blog Platform?

In the age of AI-generated content and massive platforms, building your own custom blog system teaches you core concepts in full stack development:

  • Routing
  • Dynamic rendering
  • CRUD operations
  • User authentication
  • API development
  • MongoDB integration
  • SEO optimization

And the best part? You can host it live and use it for your personal or freelance brand.

Tech Stack Overview

Frontend Next.js (App Router)
Backend Node.js (API Routes)
Database MongoDB (Mongoose)
Styling Tailwind CSS
Auth JWT or Google OAuth (optional)
Deployment Vercel + MongoDB Atlas

Key Features You’ll Build

  • Blog creation/edit UI
  • Image + HTML + markdown support
  • Server-side search
  • Category tags
  • Pagination and lazy loading
  • Admin login (optional)
  • Contact/Comment form
  • SEO-friendly blog meta tags
  • Dynamic [slug]-based routing

Folder Structure (Basic)


/blog-platform
β”œβ”€β”€ app
β”‚   β”œβ”€β”€ page.jsx (home)
β”‚   β”œβ”€β”€ blog
β”‚   β”‚   └── [slug]/page.jsx
β”‚   └── admin/create-blog.jsx
β”œβ”€β”€ components/BlogCard.jsx, Navbar.jsx
β”œβ”€β”€ lib/connectDB.js
β”œβ”€β”€ models/Blog.js
β”œβ”€β”€ api/blogs/route.js
β”œβ”€β”€ styles/globals.css

    

Blog Schema (MongoDB/Mongoose)


import mongoose from 'mongoose';

const BlogSchema = new mongoose.Schema({
  title: String,
  content: String,
  slug: { type: String, unique: true },
  tags: [String],
  author: String,
  image: String,
  createdAt: { type: Date, default: Date.now },
});

export default mongoose.models.Blog || mongoose.model("Blog", BlogSchema);

    

Blog Page Route – app/blog/[slug]/page.jsx


import BlogCard from '@/components/BlogCard';
import connectDB from '@/lib/connectDB';
import Blog from '@/models/Blog';

export async function generateMetadata({ params }) {
  await connectDB();
  const blog = await Blog.findOne({ slug: params.slug });
  return {
    title: blog?.title || 'Blog',
    description: blog?.content.slice(0, 150),
  };
}

export default async function BlogPage({ params }) {
  await connectDB();
  const blog = await Blog.findOne({ slug: params.slug });

  return (
    <div className="p-4">
      <h1 className="text-3xl font-bold">{blog.title}</h1>
      <img src={blog.image} className="my-4 w-full rounded" />
      <div dangerouslySetInnerHTML={{ __html: blog.content }} />
    </div>
  );
}

    

Create Blog UI – app/admin/create-blog.jsx


'use client';
import { useState } from 'react';

export default function CreateBlog() {
  const [title, setTitle] = useState('');
  const [content, setContent] = useState('');
  const [slug, setSlug] = useState('');

  const handleSubmit = async (e) => {
    e.preventDefault();
    await fetch('/api/blogs', {
      method: 'POST',
      body: JSON.stringify({ title, content, slug }),
      headers: { 'Content-Type': 'application/json' },
    });
    alert('Blog created!');
  };

  return (
    <form onSubmit={handleSubmit} className="p-4 max-w-2xl mx-auto">
      <input onChange={(e) => setTitle(e.target.value)} placeholder="Title" />
      <input onChange={(e) => setSlug(e.target.value)} placeholder="Slug" />
      <textarea onChange={(e) => setContent(e.target.value)} rows={10} />
      <button type="submit">Create</button>
    </form>
  );
}

    

API Route – app/api/blogs/route.js


import connectDB from '@/lib/connectDB';
import Blog from '@/models/Blog';

export async function POST(req) {
  await connectDB();
  const data = await req.json();
  const blog = new Blog(data);
  await blog.save();
  return Response.json({ success: true });
}

export async function GET() {
  await connectDB();
  const blogs = await Blog.find().sort({ createdAt: -1 });
  return Response.json(blogs);
}

    

Deployment Instructions

  • Push your project to GitHub
  • Deploy frontend with Vercel
  • Use MongoDB Atlas as remote DB
  • Set environment variable in Vercel:

MONGO_URI=mongodb+srv://<username>:<password>@cluster.mongodb.net/blog

    

πŸ“¦ Install Project Dependencies


# Create new Next.js app
npx create-next-app@latest service-platform

# Install MongoDB support
npm install mongoose

# Install Tailwind CSS
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

# JWT Authentication
npm install jsonwebtoken bcrypt

# API utilities & form handling
npm install axios react-hook-form

# Deploy tool (Optional)
npm install vercel --global

  

πŸš€ Deploy Your Project

Once your platform is working locally, push to GitHub and deploy using Vercel and MongoDB Atlas:


# Push code to GitHub
git init
git remote add origin https://github.com/yourname/service-platform.git
git add .
git commit -m "initial"
git push -u origin main

# Deploy with Vercel
vercel

# Set MongoDB connection in Vercel dashboard
MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/service-app

  

πŸ’‘ Final Tips for Your Service Platform

  • Secure admin dashboard using JWT or Google Auth
  • Add dynamic metadata with generateMetadata() for SEO
  • Use react-quill or editor.js for content creation
  • Implement pagination, search, and tag filters for better UX
  • Integrate sitemap.xml and robots.txt for full SEO

Building your own full stack service platform in 2025 is easier and more powerful than ever. This hands-on guide walks you through every step of the processβ€”from setting up a modern Next.js frontend to integrating MongoDB for data, securing with JWT, styling with Tailwind CSS, and deploying to Vercel. You'll learn key concepts like dynamic routing, API development, server-side rendering, search, and SEO best practicesβ€”all tailored for developers who want real-world, production-ready skills. Whether you're freelancing, building a portfolio project, or launching a SaaS, this guide is packed with reusable code and patterns for modern app development.