My desire to practice my skills and share my acquired knowledge fuels my endeavors.
Loved the project? Please visit our Website
This blog is hosted on Vercel, built with Next.js and Tailwind CSS using Tailwind Nextjs Starter Blog.
This blog site takes inspiration from lehuynh.dev. I appreciate Leo Huynh and Timothy Lin for their contribution to this minimal, lightweight, and highly customizable blog starter.
A few major over-engineering-changes from the original repo:
- βοΈ Upgrading to React 19, NextJS 16
- π Adopting Typescript, committing with Conventional Commits
- π Theming in dark mode with Tokyonight Neovim Theme colors for better contrast.
- π¨βπ» My website refers to the design and code from the lehuynh.dev repository and incorporates the tailwind-nextjs-starter-blog template, version 1.0.
- π₯ Bumping up
mdx-bundler,rehype/remarkplugins and dependencies to the latest version
Run the blog using Docker with standalone output mode for optimized image size (~200-300MB).
- Create a
.envfile with required environment variables:
POSTGRES_URL=postgresql://postgres:postgres@postgres:5432/karhdo_blog
GITHUB_API_TOKEN=your_github_token
SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret
SPOTIFY_REFRESH_TOKEN=your_spotify_refresh_token
NEXT_PUBLIC_GISCUS_REPO=your_username/your_repo
NEXT_PUBLIC_GISCUS_REPOSITORY_ID=your_repo_id
NEXT_PUBLIC_GISCUS_CATEGORY=your_category
NEXT_PUBLIC_GISCUS_CATEGORY_ID=your_category_id- Start services:
docker compose up -d- Run migrations:
docker compose exec app pnpm prisma:migrate:deploy- Access at http://localhost:3000
Docker Image: Node.js 24 Alpine with multi-stage build (deps β builder β runner) running as non-root user.
If this project has been beneficial, show your appreciation with a β
The images utilized within this blog originate from Unsplash, GIFs are sourced from GIPHY, and illustrations are from Storyset.
Extending sincere thanks for these exceptional resources π
Copyright Β© 2026 - Do Trong Khanh (Karhdo)
