English | 日本語
💡 個人クリエイターにおすすめ! このブログは誰でも簡単にデプロイできて、無料で運用できる個人クリエイター向けのブログテンプレートです。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用)
content/articles/にmy-article.mdを追加- front matter を設定(必須項目あり)
例:
---
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" # 任意
---
# 見出し
本文...- 通常:
content/articles/my-article.md→ slug はmy-article qiitaIdを指定: slug はqiitaIdに置き換わります(URLが/articles/<qiitaId>になります)- canonical URL は、設定に応じて Qiita/Zenn(原本)を優先します(後述)
GITHUB_REPOS を設定すると、ローカルではなく GitHubのContents API から記事一覧/本文を取得します。
GITHUB_REPOS: 例["owner/repo-a","owner/repo-b"]またはowner/repo-a,owner/repo-bGITHUB_BLOG_PATH: 記事ディレクトリ(デフォルトarticles)GITHUB_TOKEN: 任意(private repoやレート制限対策)GITHUB_OWNER: 任意(GITHUB_REPOSに repo名だけ書く場合の補完)
注意:
- slug が衝突する場合は
GITHUB_REPOSの指定順で先勝ちします published: trueの記事のみ表示されます
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
└── ...
複数リポジトリを指定する場合:
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_emailGA4_PRIVATE_KEY: サービスアカウントのprivate_key(改行を含む場合は\nでも可)- 事前に Google Analytics(GA4)側でサービスアカウントに閲覧権限以上を付与してください
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION: Google Search Console 用 verificationZENN_USER_NAME,QIITA_USER_NAME: 原本canonical(Zenn/Qiita)生成に使用(site.jsonでも設定可)- GitHub記事ソース:
GITHUB_REPOS,GITHUB_BLOG_PATH,GITHUB_TOKEN,GITHUB_OWNER
このプロジェクトは packageManager: pnpm です。
このプロジェクトには DevContainer設定 が含まれており、Docker環境で一貫した開発環境を提供します。
- 🐳 マルチステージDockerビルド: Zsh開発環境 + 軽量な本番イメージ
- 📦 pnpm via Corepack
- 🖥️ Zsh with autosuggestions & persistent history でスムーズなCLIワークフロー
- 🛠 Biome をフォーマッター & リンターとして使用(Git統合で一貫したコミット)
- 🎨 Tailwind CSS サポート(VS Code拡張機能もプリインストール済み)
- 🔧 Devcontainer設定 で再現可能でポータブルなワークスペース
- 🛡️ サプライチェーン攻撃対策: バージョンピン、リリース年齢チェック、npm/npx使用制限
-
リポジトリをクローン
git clone https://github.com/wimpykid719/blog-v2 cd blog-v2 -
環境ファイルを作成 コンテナを起動する前に、サンプル環境ファイルをコピーします:
cp .devcontainer/.env.sample .devcontainer/.env
-
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リポジトリやレート制限対策に必要)
-
Dev Containerで開く VS Codeでプロジェクトを開き、「Reopen in Container」を実行して開発環境を初期化します。 必要なツール(pnpm、Biome、Tailwindなど)はすべてプリインストール済みです。
-
Next.jsアプリを起動 コンテナ内で:
cd app && pnpm dev
アプリは 👉 http://localhost:3000 でアクセスできます。
-
Biome設定 初回起動時、Biomeがnode_modulesにインストールされたBiomeを参照できないためエラーが発生する場合があります。 解決するには、Ctrl+Shift+P でコマンドパレットを開き、以下のコマンドを実行してください:
>Biome: Restart
DevContainerを使用しない場合:
cd app
pnpm install
pnpm devブラウザで http://localhost:3000 を開いて確認してください。
pnpm lint
pnpm formatVercelへのデプロイが最も簡単です。
- Project Settings → Environment Variables に
NEXT_PUBLIC_SITE_URL(必要に応じて他の変数も)を設定 pnpm buildが通ることを確認してデプロイ
補足:
/rss.xmlやsitemap.xmlは記事取得にfs(ローカル)またはGitHub APIを使うため、Node.js runtimeで動作します(実装で固定済み)
このボイラープレートには、npmサプライチェーン攻撃から保護するためのセキュリティ対策が含まれています:
- npm/npxコマンドは実行前に確認が必要です(
USE_NPM_ANYWAY=1でバイパス可能) - Corepack経由でpnpmが主要パッケージマネージャーとして強制されます
save-exact=trueを設定した.npmrcにより、正確なバージョンが保存されますnpm-package-json-lintがすべての依存関係が正確なバージョン(^や~なし)を使用していることをチェックしますpnpm lint:package-jsonを実行してバージョンピンを確認できます
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