Markdown 文章生成,默认读取本地 content/articles/*.md
blog-v2 — Next.js 博客模板
作者 wimpykid719
基于 Next.js App Router 的 Markdown 博客模板,支持本地或 GitHub 仓库作为文章源,内置文章列表与分页、RSS、站点地图、OG 图片、代码高亮与 KaTeX 公式。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 3
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
可选 GitHub 文章源:设置 GITHUB_REPOS 后从仓库 articles/ 目录读取 Markdown
文章列表支持分页(/articles?page=2),并提供文章详情页
内置 RSS(/rss.xml,最多 50 条含分类)、sitemap.xml、robots.txt 与 OG 图片路由
支持 highlight.js 代码高亮与 KaTeX 数式
可选 GA4 统计与首页 Analytics Dashboard(需 GA4 Data API 服务账号凭据)
模板详细介绍
这是一个用 Next.js(App Router)搭建的博客模板,文章由 Markdown 生成。默认从本地 `content/articles/*.md` 读取文章,也可通过设置环境变量 `GITHUB_REPOS` 改为从 GitHub 仓库的 `articles/` 目录读取 Markdown。
页面与路由包括:首页 `/`、文章列表 `/articles`(支持 `?page=` 分页)、文章详情 `/articles/[slug]`、RSS `/rss.xml`(最多 50 条并输出分类)、站点地图 `/sitemap.xml`、`/robots.txt` 以及用于 OG/Twitter 的 `/opengraph-image`。SEO 方面提供 canonical、OG、Twitter Card,并支持 Google Search Console 验证。
文章 front matter 需要包含 title、emoji、type(tech 或 idea)、topics、published、date 等字段,可选的 `qiitaId` 会替换 slug,使 URL 变为 `/articles/<qiitaId>`;canonical 可按配置优先指向 Qiita/Zenn 原文。GitHub 源模式下 slug 冲突按 `GITHUB_REPOS` 顺序先到先得,且只显示 `published: true` 的文章。
可选集成包括 GA4 的 PV 统计与首页 Analytics Dashboard(需 GA4 Data API 的服务账号凭据),以及代码高亮(highlight.js)和数式(KaTeX)。项目使用 pnpm,提供 DevContainer 配置,README 给出的部署方式是 Vercel。README 未说明除 Vercel 之外的其他部署平台细节,也未提供性能或生产就绪程度的说明。
适合你的项目吗?
适用场景
- 用 Markdown 维护并发布个人技术博客
- 把 Zenn 或 Qiita 仓库中的 articles/ 目录作为文章源统一展示
- 需要 RSS、站点地图与 OG 图片等基础 SEO 输出的博客站点
- 在 DevContainer 中开发并部署到 Vercel 的 Next.js 博客
适合人群
- 习惯用 Markdown 写作的个人创作者
- 使用 Next.js App Router 并希望以 pnpm 管理依赖的开发者
- 需要将 GitHub 仓库中的文章同步到自有博客的人
- 希望在 Vercel 上部署博客的开发者
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
项目使用 pnpm(packageManager: pnpm),本地运行需进入 app 目录执行 pnpm install 与 pnpm dev
- 2
推荐使用 DevContainer:克隆仓库后先复制 .devcontainer/.env.sample 为 .devcontainer/.env,再在 VS Code 中 Reopen in Container,然后在容器内执行 cd app && pnpm dev
- 3
建议设置 NEXT_PUBLIC_SITE_URL(末尾不加斜杠),用于生成 sitemap、robots、rss 与 canonical;未设置时回退到 site.json,再回退到 http://localhost:3000
- 4
使用 GitHub 文章源时需配置 GITHUB_REPOS,可选 GITHUB_OWNER、GITHUB_BLOG_PATH(默认 articles)、GITHUB_TOKEN
- 5
Vercel 部署时在 Project Settings → Environment Variables 中配置环境变量,并确认 pnpm build 通过;RSS 与 sitemap 使用 fs 或 GitHub API,运行在 Node.js runtime
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
- 可选功能:设置环境变量 GITHUB_REPOS 后,文章将从 GitHub 仓库的 articles/ 目录读取,而非本地 Markdown。
- 可选功能:需设置 GA4 测量 ID 才会启用 Google Analytics 的 PV 统计。
- 设置 GITHUB_REPOS 后,文章列表与正文将通过 GitHub Contents API 获取,而非本地文件。
- GITHUB_TOKEN 为可选,但访问私有仓库或规避速率限制时需要提供。
- 首页的 Analytics Dashboard(PV/热门页面)为可选功能,需使用 GA4 Data API。
- 使用 GA4 Data API 前,需在 Google Analytics(GA4)侧为服务账号授予至少查看权限。
- 生成指向 Zenn/Qiita 原文的 canonical 时,需设置 ZENN_USER_NAME 与 QIITA_USER_NAME。
- 使用 DevContainer 的 GitHub 文章源时,GITHUB_REPOS 为必填项。
- 使用 DevContainer 的 GitHub 文章源时,GITHUB_OWNER 为必填项。
- GITHUB_TOKEN 为可选但推荐;访问私有仓库或规避速率限制时需要。
- README 给出的部署方式为 Vercel,并称其最为简单。
- 部署到 Vercel 时,需在 Project Settings → Environment Variables 中设置 NEXT_PUBLIC_SITE_URL 等变量。
- /rss.xml 与 sitemap.xml 因使用 fs 或 GitHub API 获取文章,需运行在 Node.js runtime。
- npm/npx 命令执行前需确认,可通过 USE_NPM_ANYWAY=1 绕过。
- pnpm-workspace.yaml 设置了 minimumReleaseAge: 4320(3 天),阻止安装新发布的包。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
- **GitHub記事ソース(任意)**: 環境変数 `GITHUB_REPOS` を設定すると、GitHubリポジトリ上の `articles/` 配下Markdownも読み込み可能
README 原文
- **Google Analytics(任意)**: GA4測定IDを設定するとPV計測
README 原文
`GITHUB_REPOS` を設定すると、ローカルではなく **GitHubのContents API** から記事一覧/本文を取得します。
README 原文
- `GITHUB_TOKEN`: 任意(private repoやレート制限対策)
README 原文
- **GA4 Data API(任意)**: ホームの「Analytics Dashboard(PV/人気ページ)」表示に使用
README 原文
- 事前に **Google Analytics(GA4)側でサービスアカウントに閲覧権限以上**を付与してください
README 原文
- **`ZENN_USER_NAME`**, **`QIITA_USER_NAME`**: 原本canonical(Zenn/Qiita)生成に使用(`site.json` でも設定可)
README 原文
- `GITHUB_REPOS`(必須;推奨フォーマット: `owner/repo-a,owner/repo-b`)
README 原文
- `GITHUB_OWNER`(必須;リポジトリパス用)
README 原文
- `GITHUB_TOKEN`(任意だが推奨;privateリポジトリやレート制限対策に必要)
README 原文
Vercelへのデプロイが最も簡単です。
README 原文
- **Project Settings → Environment Variables** に `NEXT_PUBLIC_SITE_URL`(必要に応じて他の変数も)を設定
README 原文
- `/rss.xml` や `sitemap.xml` は記事取得に `fs`(ローカル)またはGitHub APIを使うため、**Node.js runtime**で動作します(実装で固定済み)
README 原文
- npm/npxコマンドは実行前に確認が必要です(`USE_NPM_ANYWAY=1` でバイパス可能)
README 原文
https://github.com/wimpykid719/blog-v2/blob/main/LICENSE.mdhttps://github.com/wimpykid719/blog-v2/blob/main/README.md- `pnpm-workspace.yaml` に `minimumReleaseAge: 4320`(3日)を設定し、新しくリリースされたパッケージのインストールを防止します
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-14。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 80 / 100
- 技术栈
- Next.js · React
- 网站类型
- 博客
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-04-16
- 截图检查日期
- 2026-10-14
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15
查看当时使用的来源资料
SHA-256: e2782dbb5c4a0529467ef5c6f29e03bdcf15b61465f6361411879ef5eab265eb
2026-10-14T15:46:49.350Z
来源文件 / 仓库# 🏡 DevSpot Blog(Next.js)
[English](./README.en.md) | **日本語**
> 💡 **個人クリエイターにおすすめ!**
> このブログは**誰でも簡単にデプロイできて、無料で運用できる**個人クリエイター向けのブログテンプレートです。Vercelへのデプロイが簡単で、コストゼロで始められます。
## 概要
Next.js(App Router)で作ったブログです。記事はMarkdownから生成され、**記事一覧**・**記事詳細**・**RSS**・**サイトマップ**・**OG画像**などを備えています。
## 主な機能
- **Markdown記事配信**: `content/articles/*.md`(ローカル)から記事を生成
- **GitHub記事ソース(任意)**: 環境変数 `GITHUB_REPOS` を設定すると、GitHubリポジトリ上の `articles/` 配下Markdownも読み込み可能
- **記事一覧 + ページネーション**: `/articles?page=2` のようにページング
- **SEO対応**: canonical/OG/Twitter Card、`robots.txt`、`sitemap.xml`
- **RSSフィード**: `/rss.xml`(最大50件、カテゴリ出力)
- **コードハイライト/数式**: highlight.js / KaTeX 対応
- **Google Analytics(任意)**: GA4測定IDを設定するとPV計測
## ページ / ルーティング
- **ホーム**: `/`
- **記事一覧**: `/articles`(`?page=` 対応)
- **記事詳細**: `/articles/[slug]`
- **RSS**: `/rss.xml`
- **サイトマップ**: `/sitemap.xml`
- **robots**: `/robots.txt`
- **OG画像**: `/opengraph-image`(OG/Twitter用)
## 記事の追加・更新(ローカルMarkdown)
1. `content/articles/` に `my-article.md` を追加
2. front matter を設定(必須項目あり)
例:
```md
---
title: "記事タイトル"
emoji: "📝"
type: "tech" # "tech" | "idea"
topics: ["Next.js", "TypeScript"]
published: true
date: "2025.12.31" # 例: YYYY.MM.DD / YYYY-MM-DD / YYYY/MM/DD
# qiitaId: "xxxxxxxxxxxxxxxxxxxx" # 任意
---
# 見出し
本文...
```
### `slug` と `qiitaId` について(重要)
- **通常**: `content/articles/my-article.md` → slug は `my-article`
- **`qiitaId` を指定**: slug は `qiitaId` に置き換わります(URLが `/articles/<qiitaId>` になります)
- canonical URL は、設定に応じて **Qiita/Zenn(原本)を優先**します(後述)
## 記事の追加・更新(GitHubリポジトリから読み込む:任意)
`GITHUB_REPOS` を設定すると、ローカルではなく **GitHubのContents API** から記事一覧/本文を取得します。
- `GITHUB_REPOS`: 例 `["owner/repo-a","owner/repo-b"]` または `owner/repo-a,owner/repo-b`
- `GITHUB_BLOG_PATH`: 記事ディレクトリ(デフォルト `articles`)
- `GITHUB_TOKEN`: 任意(private repoやレート制限対策)
- `GITHUB_OWNER`: 任意(`GITHUB_REPOS` に repo名だけ書く場合の補完)
注意:
- slug が衝突する場合は **`GITHUB_REPOS` の指定順で先勝ち**します
- `published: true` の記事のみ表示されます
### GitHubリポジトリの階層構造
GitHubリポジトリから記事を読み込む場合、以下の階層構造でMarkdownファイルを配置してください。
```
リポジトリルート/
├── articles/ # 記事ディレクトリ(GITHUB_BLOG_PATH で変更可能、デフォルト: articles)
│ ├── article-1.md
│ ├── article-2.md
│ └── ...
└── .gitignore # その他のファイル(任意)
```
**例: Zenn記事用リポジトリ**
```
zenn-content/
└── articles/
├── nextjs-tutorial.md
├── react-server-components.md
└── ...
```
**例: Qiita記事用リポジトリ**
```
qiita-content/
└── articles/
├── fastapi-guide.md
├── docker-basics.md
└── ...
```
**複数リポジトリを指定する場合:**
```bash
GITHUB_REPOS='["zenn-content","qiita-content"]'
```
この場合、両方のリポジトリの `articles/` 配下のMarkdownファイルが読み込まれます。
**ファイル名とslugの関係:**
- ファイル名: `my-article.md` → slug は `my-article`
- front matter に `qiitaId` がある場合: slug は `qiitaId` に置き換わります
## 環境変数
### 必須(推奨)
- **`NEXT_PUBLIC_SITE_URL`**: 本番URL(末尾スラッシュ無し推奨)
- `sitemap.xml` / `robots.txt` / `rss.xml` / canonical URL の生成に使われます
- 未設定時は `site.json` → それも空なら `http://localhost:3000` にフォールバック
### 任意
- **`NEXT_PUBLIC_GA4_MEASUREMENT_ID`**: GA4測定ID(設定時のみ計測スクリプトを挿入)
- **GA4 Data API(任意)**: ホームの「Analytics Dashboard(PV/人気ページ)」表示に使用
- **`GA4_PROPERTY_ID`**: GA4のプロパティID(数値。例: `123456789`)
- **`GA4_CLIENT_EMAIL`**: サービスアカウントの `client_email`
- **`GA4_PRIVATE_KEY`**: サービスアカウントの `private_key`(改行を含む場合は `\n` でも可)
- 事前に **Google Analytics(GA4)側でサービスアカウントに閲覧権限以上**を付与してください
- **`NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION`**: Google Search Console 用 verification
- **`ZENN_USER_NAME`**, **`QIITA_USER_NAME`**: 原本canonical(Zenn/Qiita)生成に使用(`site.json` でも設定可)
- **GitHub記事ソース**: `GITHUB_REPOS`, `GITHUB_BLOG_PATH`, `GITHUB_TOKEN`, `GITHUB_OWNER`
## ローカルでの環境構築 / 起動
このプロジェクトは `packageManager: pnpm` です。
### 方法1: DevContainerを使用(推奨)
このプロジェクトには **DevContainer設定** が含まれており、Docker環境で一貫した開発環境を提供します。
#### 特徴
- 🐳 **マルチステージDockerビルド**: Zsh開発環境 + 軽量な本番イメージ
- 📦 **pnpm** via Corepack
- 🖥️ **Zsh with autosuggestions & persistent history** でスムーズなCLIワークフロー
- 🛠 **Biome** をフォーマッター & リンターとして使用(Git統合で一貫したコミット)
- 🎨 **Tailwind CSS** サポート(VS Code拡張機能もプリインストール済み)
- 🔧 **Devcontainer設定** で再現可能でポータブルなワークスペース
- 🛡️ **サプライチェーン攻撃対策**: バージョンピン、リリース年齢チェック、npm/npx使用制限
#### セットアップ手順
1. **リポジトリをクローン**
```zsh
git clone https://github.com/wimpykid719/blog-v2
cd blog-v2
```
2. **環境ファイルを作成**
コンテナを起動する前に、サンプル環境ファイルをコピーします:
```zsh
cp .devcontainer/.env.sample .devcontainer/.env
```
3. **GitHub記事ソースの設定(任意)**
このプロジェクトは、GitHubリポジトリに保存されたMarkdownファイルから `/articles` ページを生成できます。
`.devcontainer/.env` に以下の変数を設定してください(`.devcontainer/.env.sample` からコピー後):
- `GITHUB_REPOS`(必須;推奨フォーマット: `owner/repo-a,owner/repo-b`)
- `GITHUB_OWNER`(必須;リポジトリパス用)
- `GITHUB_BLOG_PATH`(任意、デフォルト: `articles`)
- `GITHUB_TOKEN`(任意だが推奨;privateリポジトリやレート制限対策に必要)
4. **Dev Containerで開く**
VS Codeでプロジェクトを開き、「Reopen in Container」を実行して開発環境を初期化します。
必要なツール(pnpm、Biome、Tailwindなど)はすべてプリインストール済みです。
5. **Next.jsアプリを起動**
コンテナ内で:
```zsh
cd app && pnpm dev
```
アプリは 👉 http://localhost:3000 でアクセスできます。
6. **Biome設定**
初回起動時、Biomeがnode_modulesにインストールされたBiomeを参照できないためエラーが発生する場合があります。
解決するには、Ctrl+Shift+P でコマンドパレットを開き、以下のコマンドを実行してください:
```
>Biome: Restart
```
### 方法2: 通常のローカル環境
DevContainerを使用しない場合:
```bash
cd app
pnpm install
pnpm dev
```
ブラウザで `http://localhost:3000` を開いて確認してください。
### Lint / Format
```bash
pnpm lint
pnpm format
```
## デプロイ(Vercel)
Vercelへのデプロイが最も簡単です。
- **Project Settings → Environment Variables** に `NEXT_PUBLIC_SITE_URL`(必要に応じて他の変数も)を設定
- `pnpm build` が通ることを確認してデプロイ
補足:
- `/rss.xml` や `sitemap.xml` は記事取得に `fs`(ローカル)またはGitHub APIを使うため、**Node.js runtime**で動作します(実装で固定済み)
## 🛡️ サプライチェーン攻撃対策
このボイラープレートには、npmサプライチェーン攻撃から保護するためのセキュリティ対策が含まれています:
### 1. pnpm使用の強制
- npm/npxコマンドは実行前に確認が必要です(`USE_NPM_ANYWAY=1` でバイパス可能)
- Corepack経由でpnpmが主要パッケージマネージャーとして強制されます
### 2. バージョンピン
- `save-exact=true` を設定した `.npmrc` により、正確なバージョンが保存されます
- `npm-package-json-lint` がすべての依存関係が正確なバージョン(`^` や `~` なし)を使用していることをチェックします
- `pnpm lint:package-json` を実行してバージョンピンを確認できます
### 3. リリース年齢保護
- `pnpm-workspace.yaml` に `minimumReleaseAge: 4320`(3日)を設定し、新しくリリースされたパッケージのインストールを防止します
- `renovate.json` でRenovateが新しいバージョンに更新する前に3日待つように設定されています
### 設定ファイル
初期化時に以下のセキュリティ設定ファイルが `app/` に自動的にコピーされます:
- `.npmrc` - バージョンピン設定
- `.npmpackagejsonlintrc.json` - package.jsonのリンティングルール
- `pnpm-workspace.yaml` - リリース年齢保護付きのpnpmワークスペース設定
ルートレベルの設定:
- `renovate.json` - 依存関係更新用のRenovate bot設定
## 📂 プロジェクト構造
```
.
├── .devcontainer/ # Devcontainer設定、Dockerfile & 環境設定
│ ├── .env.sample
│ ├── .zshrc
│ ├── app/ # Next.jsアプリ初期化用のテンプレートファイル
│ │ ├── .npmrc
│ │ ├── .npmpackagejsonlintrc.json
│ │ └── pnpm-workspace.yaml
│ ├── compose.yml
│ ├── devcontainer.json
│ ├── Dockerfile
│ └── entrypoint.sh
├── .gitignore # Git ignoreファイル
├── app/ # Next.jsアプリケーションソースコード
│ ├── public/ # 静的アセット
│ ├── src/ # アプリケーションソース
│ ├── content/ # Markdown記事(ローカル)
│ ├── next.config.ts
│ └── package.json
├── LICENSE.md # プロジェクトライセンス
├── README.md
└── renovate.json # Renovate bot設定
```
## ✅ 主な特徴
- Docker & Dev Containersによる一貫した開発環境
- Biome + TailwindCSSが標準装備されたオピニオン付きセットアップ
- 生産性向上のための履歴永続化付きZshシェル
- デプロイに最適化された本番対応ビルド
- 無料で運用可能(Vercelなど)
- 簡単なデプロイプロセス
## 📜 ライセンス
MIT
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

tailwind-nextjs-starter-blog
tailwind-nextjs-starter-blog 是一个面向个人技术博客的 Next.js 与 Tailwind CSS 启动模板,其 v2 版本基于 App Router 与 React Server Comp…
Next.js · 博客

Nextjs-tailwindcss-blog-template
使用 Tailwind CSS 的 Next.js 博客。当前分支通过 Velite 处理 Markdown,早期 Contentlayer 实现保留在单独的历史分支中。
Next.js · 博客

Next-js-Blog-Boilerplate
Next-js-Blog-Boilerplate 是一套面向个人与技术博客的启动代码,基于 Next.js 12 与 Tailwind CSS 3 构建,同时集成了 TypeScript、ESLint、Prettier …
Next.js · 博客

nextjs-blog-theme
nextjs-blog-theme 是 Netlify 团队维护的一个博客启动模板,基于 Next.js 15(Pages Router)和 Tailwind CSS 4.x 构建,设计由 Bejamas 机构完成。
Next.js · 博客

blog
🚀 My personal blog made with Tailwind CSS and NextJS. Template from Timlrx. Feel free to fork, follow and use…
Next.js · 博客

tailnext
Tailnext 是一个基于 Next.js 14 App Router 和 Tailwind CSS 的免费开源模板,由 onWidget 团队创建并维护。
Next.js · 博客
