taktamur's Scrap Blog

All Scraps

🤖 Discordのチャットからブログ記事が公開されるまでの仕組み

💡 この記事は、まさにこの記事で説明しているフローを使って作られました。Discord で「整理して記事にして」と言ったら Hermes が markdown を書いて GitHub に push、数分後には blog.taktamur.me に反映されています。

システム構成

[Discord] ──message──▶ [Hermes Agent] ──git push──▶ [GitHub: taktamur/hugo-scrap-blog]
                                                           │
                                                    Cloudflare Pages(自動検知)
                                                           │
                                                    hugo build + デプロイ
                                                           │
                                                           ▼
                                                  https://blog.taktamur.me/
レイヤー 役割
Discord ユーザー入力。チャット感覚で記事のネタを投げる
Hermes Agent AI アシスタント。Discord メッセージを受信し、記事の執筆・編集を行う
GitHub プライベートリポジトリ taktamur/hugo-scrap-blog。記事の markdown ファイルを管理
Cloudflare Pages Git 連携で自動ビルド&デプロイ。push を検知して hugo を実行
blog.taktamur.me 公開ブログ。Hugo で生成された静的サイト

ステップ別の流れ

  1. 投稿 — Discord の #一般 チャンネル(またはスレッド)に「これ記事にして」と書く
  2. 受信&整形 — Hermes Agent が内容を受け取り、日付・タグを判断して markdown に整形
  3. ファイル作成/tmp/hugo-scrap-proto/scrap-blog/content/scraps/.md ファイルを生成(事前に git pull を実行)
  4. Git pushgit addgit commitgit push origin main
  5. 自動デプロイ — Cloudflare Pages が push を検知し、hugo ビルド → デプロイ(数分で完了)
  6. 公開https://blog.taktamur.me/ に記事が表示される

記事ファイルの中身

---
date: 2026-07-25
tags: ["タグ1", "タグ2"]
---

## 🤖 見出し(LLM生成記事は 🤖 マーカー付き)

本文はここに。Markdown形式で自由に書く。
  • タイトル(title)は不要 — frontmatter は datetags だけ
  • 最初の ## 🤖 見出し 行が HTML の <title> になる
  • タグは日本語可(preserveTaxonomyNames: true
  • 🤖 マーカーで LLM が書いた記事であることを明示

なぜ Hugo + Cloudflare Pages なのか

  • 静的サイト — データベース不要、高速、セキュリティリスクが少ない
  • Git 管理 — 記事はすべて markdown ファイル。Git で履歴管理、巻き戻しも簡単
  • 無料ホスティング — Cloudflare Pages は無料枠で十分
  • 自動デプロイ — push するだけ。CI/CD の設定不要

運用上の注意点

  • 記事を書く前に必ず git pull を実行(他端末からの push とのコンフリクト防止)
  • Cloudflare Pages の環境変数: HUGO_VERSION=0.164.0, TZ=Asia/Tokyo
  • hugo.yamlbuildFuture: true を設定(JST 深夜の記事が UTC で未来日扱いされるのを防止)
  • デプロイ状態の確認は wrangler pages deployment list --project-name=hugo-scrap-blog

🤖 wrangler OAuth認証がSSH越しで失敗した話

Cloudflare Pages のデプロイ状態を wrangler CLI で確認しようとして、認証ではまった。

現象

NixOS サーバー(ブラウザなし、SSH接続)で wrangler login を実行。

$ wrangler login
# → ブラウザが開かず、localhost にリダイレクトされてエラー

Cloudflare の認証ページで承認後、localhost:8976 にコールバックが返ってくるが、NixOS 側にブラウザがないため受け取れない。

原因

wrangler login は OAuth PKCE フローを使っている。認証コードを受け取るために localhost で一時的な HTTP サーバーを立て、ブラウザからのコールバックを待つ仕組み。

問題は、操作している端末(Mac)と wrangler が動いている端末(NixOS)が別 なこと。Mac のブラウザで認証すると、コールバック先 localhost は Mac 自身の localhost を指す。当然そこに wrangler の待受サーバーはない。

これは以前はまった Google OAuth Desktop App とまったく同じ構図。デスクトップアプリ用の OAuth フローが、リモートの CLI 環境では機能しない。

対策

SSH ポートフォワードを使う。

(1) Mac からポートフォワード付きで SSH 接続

ssh -L 8976:localhost:8976 nixos

これで Mac の localhost:8976 へのアクセスが NixOS の localhost:8976 に転送される。

(2) NixOS 側で wrangler 認証(URL 表示のみ)

wrangler login --no-browser

ブラウザがなくても URL がコンソールに表示される。

(3) Mac のブラウザにその URL を貼り付けて開く

Cloudflare で承認すると localhost:8976 にリダイレクト → SSH ポートフォワードで NixOS に届く → wrangler がトークンを受け取って認証完了。

一般化

このパターンは OAuth を使う CLI ツール全般で起こる。SSH 越しでブラウザがない環境では、以下のどちらかで対応できる:

方法 用途
SSH ポートフォワード ワンショットの認証。ssh -L <port>:localhost:<port> でコールバックを中継
API トークン 常時使うならトークン方式の方が楽。export CLOUDFLARE_API_TOKEN=... で認証

🤖 Hugo スクラップブログを本番化した

昨日 /tmp/hugo-scrap-proto/scrap-blog/ に作った Hugo スクラップブログのプロトタイプを、Cloudflare Pages にデプロイして本番公開した。

やったこと

  • GitHub private repo 作成: taktamur/hugo-scrap-blog に初期コミットを push
  • 本番設定: hugo.yaml の baseURL を blog.taktamur.me に、languageCodelocale に修正(Hugo v0.158+ の deprecation 対応)
  • Cloudflare Pages Git 連携: API トークン不要の Git 連携方式でセットアップ。push を検知して自動ビルド&デプロイ
  • カスタムドメイン: blog.taktamur.me を設定(DNS 自動設定)
  • 動作確認: トップページ、タグページ、RSS、サイトマップすべて 200 OK

わかったこと

  • cloudflare/pages-action は deprecated(2024年10月)。現在は cloudflare/wrangler-action@v3 が公式推奨
  • Hugo だけの静的サイトなら、GitHub Actions より Cloudflare Pages の Git 連携の方がシンプル(トークン不要、PR プレビュー自動付き)
  • Cloudflare Pages のデフォルト Hugo バージョンは古いので、環境変数 HUGO_VERSION=0.164.0 を明示設定する必要がある

今後の運用

リポジトリに Markdown 記事を追加して main に push するだけで公開される。タグ説明文は content/tags/◯◯/_index.md に書けばタグページに反映。


🤖 Hugoにできること・できないこと

できること

  • Markdown → HTML変換(コードハイライト付き)
  • 複数タグ・タグ別一覧(タクソノミー標準装備)
  • タグ説明文(_index.md の frontmatter)
  • 日付順ソート(date フィールドで自動)
  • テンプレートカスタマイズ(Go Template、表示順・レイアウト自由)
  • 下書き管理(draft: true でビルド除外)
  • 画像の最適化・リサイズ(ビルド時に自動)
  • RSSフィード自動生成(/index.xml
  • サイトマップ自動生成
  • 日本語タグ対応(preserveTaxonomyNames: true
  • データファイル参照(JSON/YAML をテンプレートから利用)
  • 多言語対応(i18n)
  • ページ分割(ページネーション)
  • ビルド爆速(1000記事でも数秒)
  • GitHub Pages / Cloudflare Pages / Netlify に無料デプロイ

できないこと(静的サイトの限界)

  • 全文検索(サーバー処理がない)
  • コメント機能(動的なUGC保存が不可)
  • ユーザー認証・ログイン
  • スマホからの直接投稿(ファイル作成+ビルドが必要)
  • リアルタイム更新(ビルド時に全ページ確定)
  • 動的フィルタリング(タグのAND/OR検索など)
  • アクセス解析(サーバー側の計測不可)
  • データベース連携

対策(外部サービス連携)

  • 全文検索: pagefind(JSライブラリ、日本語対応、ビルド後1コマンド)
  • コメント: giscus(GitHub Discussions連携、GitHubアカウント必須)
  • スマホ投稿: GitHub Mobile → push → Actions で自動ビルド・デプロイ
  • 管理画面: Decap CMS / TinaCMS(GitベースのCMSを載せる)
  • アクセス解析: Google Analytics / Plausible(scriptタグ埋め込み)
  • 動的フィルタ: クライアントJSで実装 or 全組み合わせを静的生成

トレードオフ

  • 動的処理を諦める代わりに、爆速・無料・Git管理の静的サイトが手に入る
  • 検索・コメント等の不足はクライアントJSか外部サービスで穴埋め可能
  • ビルド時に全部確定するので「壊れにくい」のが最大の強み
#hugo #blog #運用

🤖 MacのHermesにCosenseスキルを再セットアップ

Mac側のHermes AgentにCosense CLIとスキルを再導入した。

手順

  1. Cosense CLI をMacにインストール
  2. Hermesのスキルとしてcosenseスキルを登録(GitHub URL指定)
  3. references/user-preferences.md を手動でコピー(GitHub本家には無いため)
  4. 動作確認:cosense listPages でtaktamurプロジェクトにアクセス成功

Mac ⇄ NixOS 間でTailscale+MagicDNSで相互接続できる構成になっている。

#mac #hermes #cosense

🤖 Hermes Agent を v0.18.0 にアップデート

Hermes Agent を v0.17.0 → v0.18.0 に更新。

  • +1120 commits: 大規模アップデート
  • 設定v30→v32自動移行: config.yaml が自動で新しい形式に変換された
  • Gateway自動再起動対応: Discord/Telegram/Matrixの接続がより安定に

特にCosenseスキルの動作が改善され、プレビュー→サブミットのワークフローが安定した。


🤖 Firecrawl MCPの健康監視を改善

Firecrawlの断続的な障害に対応して、監視用cronジョブを強化した。

やったこと

  • LIVE STATUS CHECKS追加: ログ分析だけでなく、現在のDocker・APIの実状態を確認
  • 過剰報告防止ルール: 自己復旧済みのエラーは報告しない(ログ上の過去エラー ≠ 現在の問題)
  • スクリプト + プロンプト両面: healthcheck-collect.sh の出力にライブチェックを追加し、LLMの判定精度を向上

結果として、1分で自己復旧したDocker再起動に[HIGH]で報告するような過剰反応がなくなった。


🤖 Cosense井戸端の表記ルールをスキル化

/villagepump(井戸端)の日記対話から、表記ルールを抽出してスキル化した。

基本ルール

  • [名前.icon] をタブ0の単独行に置いてエントリ開始
  • 返信は1タブ深く + 末尾に [自分の.icon]
  • リアクションは対象行の末尾にアイコン連結

個人日記への応用

井戸端の [名前.icon] → 個人日記では 🤖 でLLM発言を表現するパターンを確立。cosense-editing スキルに組み込み済み。

references/idobata-style.md としてスキル内に保存。


🤖 OpenVikingのDocker完全移行

Native版からDocker版OpenVikingに完全移行した。

  • VLM切替・日本語設定: コンテナ内の設定を日本語環境に調整
  • systemd自動起動: Docker OVがNixOS起動時に自動で立ち上がるように設定
  • 安定稼働: 以降、セッション抽出・ベクトル化が安定して動いている

これでOpenVikingが本格的な長期メモリ基盤として使えるようになった。