Skip to content

anishvkalbhor/fullstack_blogging_application

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

52 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

devpress-banner

DevPress is a modern, full-stack blogging application built to demonstrate a clean, type-safe, and scalable architecture.
It allows users to create, read, edit, and delete blog posts, manage categories, upload images, and search for content β€” all through a seamless and responsive interface.

🧠 Built as part of a 7-day technical assessment focused on code quality, scalability, and modern best practices.

🌐 Live Demo

πŸ‘‰ https://anishvkalbhor-devpress.vercel.app

wakatime

✨ Features Overview

DevPress successfully implements all Priority 1 & 2 features, plus several Priority 3 β€œNice-to-Have” enhancements for a complete, production-ready experience.

🧩 Priority 1: Core Features

  • βœ… Blog Post CRUD (Create, Read, Update, Delete)
  • βœ… Category CRUD
  • βœ… Assign multiple Categories per post
  • βœ… Blog Listing with pagination (/blog)
  • βœ… Single Post Page (/posts/[slug])
  • βœ… Category Filtering (/blog?category=design)
  • βœ… Responsive, professional UI
  • βœ… Mobile navigation with hamburger menu

🧱 Priority 2: Expected Features

  • βœ… 5-section Landing Page
  • βœ… Dashboard for managing posts
  • βœ… Draft / Published Status Toggle
  • βœ… Fully responsive across devices
  • βœ… Rich-text editor using Tiptap

πŸ’Ž Priority 3: Nice-to-Have Features

  • βœ… Full-text Search (title, content, author)
  • βœ… Reading Time estimate on posts
  • βœ… Image Uploads with Vercel Blob
  • βœ… Dynamic SEO Meta Tags
  • βœ… Pagination on blog & dashboard

βš™οΈ Tech Stack

🧠 Icon πŸ› οΈ Technology πŸ’¬ Description
Next.js 15 (App Router) Framework for SSR, SSG, and routing
TypeScript Static typing across frontend and backend
πŸŒ€ tRPC End-to-end type-safe API layer
PostgreSQL Scalable relational database (hosted on Vercel)
🧱 Drizzle ORM Type-safe, lightweight ORM for Postgres
TanStack Query (React Query) Data fetching and caching layer
Tailwind CSS Utility-first CSS framework
shadcn/ui + Aceternity + MagicUI Modular, themeable UI component systems
✏️ Tiptap Rich text WYSIWYG editor
☁️ Vercel Blob File upload & cloud storage
🧩 Zod Schema validation & type inference
πŸ”” Sonner Elegant toast notifications
Vercel Hosting and CI/CD deployment platform
pnpm Monorepo Workspace setup for modular architecture

🧭 Project Architecture

DevPress is built using a pnpm monorepo structure for clear separation of concerns, modularity, and type safety.

  • apps/web β†’ Frontend (Next.js App) + tRPC Client
  • packages/api β†’ Backend tRPC Routers + Validation
  • packages/db β†’ Drizzle ORM Schema + Database Migrations

πŸ“ Folder Structure

.
β”œβ”€β”€ .eslintrc.js
β”œβ”€β”€ .gitignore
β”œβ”€β”€ README.md
β”œβ”€β”€ apps
β”‚   └── web
β”‚       β”œβ”€β”€ next.config.ts
β”‚       β”œβ”€β”€ postcss.config.js
β”‚       β”œβ”€β”€ tailwind.config.ts
β”‚       β”œβ”€β”€ src
β”‚       β”‚   β”œβ”€β”€ app
β”‚       β”‚   β”‚   β”œβ”€β”€ api/uploadthing
β”‚       β”‚   β”‚   β”‚   β”œβ”€β”€ core.ts
β”‚       β”‚   β”‚   β”‚   └── route.ts
β”‚       β”‚   β”‚   β”œβ”€β”€ blog/[slug]/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ blog/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ categories/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ dashboard/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ editor/[postId]/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ editor/page.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ layout.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ globals.css
β”‚       β”‚   β”‚   └── page.tsx
β”‚       β”‚   β”œβ”€β”€ components
β”‚       β”‚   β”‚   β”œβ”€β”€ layout/{footer,header,main,theme-provider}.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ tiptap-ui/{index,link-edit-popover,code-block-button}.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ ui/{button,card,dialog,form,input,table,textarea,...}.tsx
β”‚       β”‚   β”‚   β”œβ”€β”€ {editor,file-dialog,icons,pagination,providers,theme-toggle,user-nav}.tsx
β”‚       β”‚   β”œβ”€β”€ lib/{editor,fonts,uploadthing,utils}.ts
β”‚       β”‚   └── trpc/{client,provider}.ts
β”‚       └── tsconfig.json
β”œβ”€β”€ packages
β”‚   β”œβ”€β”€ api
β”‚   β”‚   β”œβ”€β”€ src/{root,trpc}.ts
β”‚   β”‚   └── tsconfig.json
β”‚   β”œβ”€β”€ db
β”‚   β”‚   β”œβ”€β”€ prisma/schema.prisma
β”‚   β”‚   β”œβ”€β”€ src/index.ts
β”‚   β”‚   └── tsconfig.json
β”‚   └── ui
β”‚       └── src/button.tsx
β”œβ”€β”€ pnpm-lock.yaml
β”œβ”€β”€ pnpm-workspace.yaml
β”œβ”€β”€ tsconfig.json
└── turbo.json

🧩 tRPC Router Overview

πŸ—‚ Router βš™οΈ Description
router/post.ts CRUD for blog posts, with search, publish, and image upload logic
router/category.ts CRUD for categories
validation.ts Shared Zod schemas for API + forms
root.ts Combines all routers into the appRouter
trpc.ts Sets up context (DB, procedures) & initializes tRPC server

⚑ Local Setup

1️⃣ Clone the Repository

git clone https://github.com/anishvkalbhor/fullstack_blogging_application.git
cd fullstack_blogging_application

2️⃣ Install Dependencies

pnpm install

3️⃣ Set Up Environment Variables

A. Root .env

BLOB_READ_WRITE_TOKEN="vercel_blob_rw_..."

B. packages/db/.env

DATABASE_URL="postgres://..."
BLOB_READ_WRITE_TOKEN="vercel_blob_rw_..."

4️⃣ Run Migrations

pnpm --filter db db:migrate

5️⃣ Start Development Server

pnpm --filter web dev

Then open β†’ http://localhost:3000

πŸ’‘ Trade-offs & Key Decisions

🧠 1. tRPC vs REST/GraphQL

Chose tRPC for end-to-end type safety and faster development. It eliminates redundant schema definitions, making it ideal for solo or small-team TypeScript projects.

🧱 2. Monorepo Architecture

Adopted a pnpm monorepo despite its initial complexity β€” it pays off in scalability and maintainability. It enables shared types, isolated packages, and clear boundaries between web, api, and db.

βš™οΈ 3. Server vs Client Components

Leveraged Next.js App Router for a hybrid rendering model:

  • Server Components for performance and SEO
  • Client Components for interactivity (forms, toasts, menus)

πŸ–ΌοΈ 4. Image Uploads with Vercel Blob

Implemented drag-and-drop file uploads with Vercel Blob instead of basic URLs β€” resulting in a smoother, production-ready UX.

🎨 5. UI/UX Customization

Combined shadcn/ui, Aceternity, and MagicUI for a modern, minimalist design system with complete customization control.

🏁 Summary

DevPress blends modern web architecture, type safety, and production-grade UI to deliver a fully functional blogging platform β€” built in just 7 days.

πŸ’‘ A project that demonstrates how clean code, tRPC, and Next.js 15 can come together to build a scalable, real-world application.

πŸ‘¨β€πŸ’» Author

Anish V. Kalbhor

πŸ“§ anishvkalbhor@gmail.com

πŸ”— GitHub Profile

About

DevPress is a full-stack, type-safe blogging platform built with Next.js 15, tRPC, and PostgreSQL - combining scalability, clean architecture, and modern UI for a seamless writing experience.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors