Devy

Search Posts

Search blog posts by title, description, tags, or content.

Back to list

Building a Blog #1 - Project Overview and Tech Stack

2 min read0 views
reactviteshadcn-uiblog
TranslationKoreanEnglish

Why I Rebuilt It

I had been running my blog with Hugo. Hugo is fast and convenient, but customization had limits. Modifying a theme requires knowing Go template syntax, and adding the interactions I wanted was not straightforward.

I decided that building the blog directly with React would let me implement the features I wanted freely, while also making the blog a useful frontend practice project.

Tech Stack

CategoryTechnologyWhy I Chose It
FrameworkReact 19Familiar ecosystem, access to recent features
BuildVite 7Fast HMR, simple configuration
RoutingReact Router v7Data router and View Transitions support
UIshadcn/ui (new-york)Copyable components with full customization
StylingTailwind CSS v4oklch color system and utility classes
DeploymentGitHub PagesFree and integrates well with GitHub Actions

Project Structure

src/
├── components/     # UI components
│   └── ui/         # shadcn/ui components
├── hooks/          # custom hooks
├── layouts/        # RootLayout (sidebar + header)
├── lib/            # utilities (posts, analytics, etc.)
├── pages/          # page components
└── types/          # TypeScript types
content/
└── posts/          # markdown post files

Post System

Posts are managed as Markdown files under content/posts/{language}/. Vite's import.meta.glob loads all posts at build time.

const modules = import.meta.glob("/content/posts/*/*.md", {
  eager: true,
  query: "?raw",
  import: "default",
})

Each post's frontmatter is parsed to extract title, date, description, tags, and series metadata. This lets the blog run entirely from Markdown files without a separate CMS or database.

I used the shadcn/ui Sidebar component to build a collapsible sidebar. The menu includes Home, Posts, Search, Tags, and About. The footer includes a dark mode toggle and a color theme selector.


The next post covers Command Palette search and the View Transitions API implementation.