<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Crofty on nsys.dev 技術ブログ</title>
		<link>https://blog.nsys.dev/tags/crofty/</link>
		<description>Recent content in Crofty on nsys.dev 技術ブログ</description>
		<generator>Hugo</generator>
		<language>ja</language>
		
		
		
		
			<lastBuildDate>Mon, 15 Jun 2026 13:00:00 +0900</lastBuildDate>
		
			<atom:link href="https://blog.nsys.dev/tags/crofty/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>多言語サイトの設計 ― テキストを 3 種類に分けて持つ</title>
				<link>https://blog.nsys.dev/posts/i18n-design/</link>
				<pubDate>Mon, 15 Jun 2026 13:00:00 +0900</pubDate>
				<guid>https://blog.nsys.dev/posts/i18n-design/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ・第 3 回&lt;/strong&gt; — 「個人で出版ツールを作って配るまで」（全 5 回予定）。前回は&lt;a href=&#34;https://blog.nsys.dev/posts/contract-the-output/&#34;&gt;出力を契約する&lt;/a&gt;話でした。一覧は &lt;a href=&#34;https://blog.nsys.dev/tags/crofty/&#34;&gt;シリーズの記事一覧&lt;/a&gt; から。今回のテーマは「多言語対応をどう設計するか」です。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;「サイトを多言語にする」と聞くと、まず本文の翻訳を思い浮かべます。でも実際にやってみると、翻訳が要るテキストは本文だけではありませんでした。ナビのラベル、プロフィール、設定値。それぞれ性質が違い、同じ入れ物に押し込むと無理が出ます。&lt;/p&gt;&#xA;&lt;p&gt;うまくいったのは、テキストを種類ごとに分けて、それぞれに合った持ち方をする設計でした。今回はその話です。例として Hugo（crofty が内部で使うもの）を挙げます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;テキストは-3-種類に分かれる&#34;&gt;テキストは 3 種類に分かれる&lt;/h2&gt;&#xA;&lt;p&gt;多言語サイトのテキストを整理すると、だいたい次の 3 種類になります。住む場所も、翻訳の仕組みも別です。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;種類&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;例&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;持ち方&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;本文&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;記事&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;言語ごとのファイル&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;固定文言&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;ナビ、ボタン、「Support」&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;言語 → 文字列の翻訳テーブル&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;設定・データ&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;サイト設定、プロフィール&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;フィールド単位で「共通」か「言語ごと」&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;ひとつずつ見ます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;本文--言語ごとのファイル&#34;&gt;本文 ― 言語ごとのファイル&lt;/h2&gt;&#xA;&lt;p&gt;記事は、ひとつのフォルダ（ページバンドル）に言語別のファイルを並べます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;content/posts/my-article/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  index.md       … 日本語（既定言語）&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  index.en.md    … 英語&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  photo.avif     … 同梱する画像&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ビルドすると &lt;code&gt;/posts/my-article/&lt;/code&gt; と &lt;code&gt;/en/posts/my-article/&lt;/code&gt; の両方ができ、言語の切り替えはページ同士のリンクで済みます。JavaScript は要りません。&lt;/p&gt;&#xA;&lt;p&gt;ひとつだけ小さな罠があります。画像（ページではないファイル）は既定言語のパスにしか出力されないので、英語版から相対参照すると 404 になります。英語版だけ、絶対パスで既定言語側を指せば直ります。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;![&lt;span class=&#34;nt&#34;&gt;図&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;photo.avif&lt;/span&gt;)                     &amp;lt;!-- 日本語：相対でよい --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;![&lt;span class=&#34;nt&#34;&gt;図&lt;/span&gt;](&lt;span class=&#34;na&#34;&gt;/posts/my-article/photo.avif&lt;/span&gt;)   &amp;lt;!-- 英語：絶対パスで指す --&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;固定文言--翻訳テーブル&#34;&gt;固定文言 ― 翻訳テーブル&lt;/h2&gt;&#xA;&lt;p&gt;ナビゲーションやボタンのラベルのような、記事に依らない固定の文言は、本文に混ぜません。言語から文字列を引く「翻訳テーブル」でまとめて持ちます。&lt;/p&gt;</description>
			</item>
			<item>
				<title>出力を契約する ― 配ったあとも中身を変えられるようにする</title>
				<link>https://blog.nsys.dev/posts/contract-the-output/</link>
				<pubDate>Mon, 15 Jun 2026 11:00:00 +0900</pubDate>
				<guid>https://blog.nsys.dev/posts/contract-the-output/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ・第 2 回&lt;/strong&gt; — 「個人で出版ツールを作って配るまで」（全 5 回予定）。前回は&lt;a href=&#34;https://blog.nsys.dev/posts/own-your-writing/&#34;&gt;全体像と前提&lt;/a&gt;を共有しました。各回は単独でも読めます。一覧は &lt;a href=&#34;https://blog.nsys.dev/tags/crofty/&#34;&gt;シリーズの記事一覧&lt;/a&gt; から。今回のテーマは「配ったあとも、中身を変えられるようにしておく」です。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;自分だけで使う道具なら、いつでも自由に作り変えられます。問題は、公開して他の人が使い始めたあとです。&lt;/p&gt;&#xA;&lt;p&gt;たとえば設定キーをひとつ改名しただけで、その古いキーを使っていた利用者の環境は動かなくなります。配ったあとは、利用者が頼っている部分を気軽に変えられない。「外から見えるものは、いつか誰かが当てにする」——これは Hyrum の法則として知られる、ごく当たり前の現象です。&lt;/p&gt;&#xA;&lt;p&gt;そこで配る前に決めておきます ― 何を約束として固定し、どこは自由に変えてよいことにするか。crofty はその約束を「出力」に置きました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;入力か出力か&#34;&gt;入力か、出力か&lt;/h2&gt;&#xA;&lt;p&gt;ここでの「入力」と「出力」は、道具（crofty）が&lt;strong&gt;受け取るもの&lt;/strong&gt;（あなたが書く記事や設定）と、&lt;strong&gt;生み出すもの&lt;/strong&gt;（&lt;code&gt;dist&lt;/code&gt;）です。約束をどちらに置くか、二択になります。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&#x9;&lt;thead&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;入力を契約する&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;th&gt;出力を契約する&lt;/th&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/thead&gt;&#xA;&#x9;&lt;tbody&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;固定するもの&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;設定キー・ファイル構成・テーマ内部&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;生成 HTML に必ず入る項目&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;内部の変更&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;利用者の環境が壊れやすい&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;契約さえ守れば自由&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&#x9;&#x9;&lt;tr&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;つらくなる例&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;キー名の改名、部品の作り替え&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&#x9;&#x9;&lt;td&gt;契約を破ったときだけ&lt;/td&gt;&#xA;&#x9;&#x9;&#x9;&lt;/tr&gt;&#xA;&#x9;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;入力を契約すると内部実装が約束になり、出力を契約すると作り方が自由になります。crofty が選んだのは後者です。&lt;/p&gt;&#xA;&lt;h2 id=&#34;契約の正体--実物を見る&#34;&gt;「契約」の正体 ― 実物を見る&lt;/h2&gt;&#xA;&lt;p&gt;言葉だけだと抽象的なので、実物を見ます。crofty が生成する記事ページの &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; には、必ず次が入っています。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 生成された HTML（抜粋） --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;html&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;記事タイトル · サイト名&lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;link&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;rel&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;canonical&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;https://example.com/posts/hello/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;meta&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;width=device-width, initial-scale=1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- ＋ フィード(/feed.xml)があり、外部へ勝手に通信するタグは無い --&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;head&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この「必ず入っている項目」こそが契約です。&lt;code&gt;lang&lt;/code&gt; や &lt;code&gt;canonical&lt;/code&gt; が欠けたページを、crofty は出力しません。逆に、ここに&lt;strong&gt;無いもの&lt;/strong&gt;（テーマの作り方、HTML の組み立て方）は、自由に変えてよい部分です。&lt;/p&gt;&#xA;&lt;figure class=&#34;mermaid&#34;&gt;&#xA;&lt;img src=&#34;contract.svg&#34; alt=&#34;crofty の内部実装は自由に変えられ、その下の出力契約（dist の保証）は固定され、その先の公開サイトは契約が同じなら壊れない、という三層の図&#34;&gt;&#xA;&lt;figcaption&gt;固定するのは真ん中の一本（出力契約）だけ。上の実装は動かしてよい&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;h2 id=&#34;文書ではなく機械で守る&#34;&gt;文書ではなく、機械で守る&lt;/h2&gt;&#xA;&lt;p&gt;契約は文章で書くだけだと、いつか実装とずれて腐ります。そこで &lt;code&gt;crofty doctor&lt;/code&gt; が、ビルドした &lt;code&gt;dist&lt;/code&gt; が契約を満たしているか毎回チェックします。&lt;/p&gt;</description>
			</item>
			<item>
				<title>書いたものを自分の手元に置く ― Markdown から記事を出す小さな出版ツールを作りました</title>
				<link>https://blog.nsys.dev/posts/own-your-writing/</link>
				<pubDate>Mon, 15 Jun 2026 10:00:00 +0900</pubDate>
				<guid>https://blog.nsys.dev/posts/own-your-writing/</guid>
				<description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;シリーズ・第 1 回&lt;/strong&gt; — 「個人で出版ツールを作って配るまで」（全 5 回予定）。各回は単独でも読めますが、まとめて辿るなら &lt;a href=&#34;https://blog.nsys.dev/tags/crofty/&#34;&gt;シリーズの記事一覧&lt;/a&gt; からどうぞ。今回は全体像と前提の共有で、個々の設計判断は次回以降に取り上げます。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;書いたものは、どこに残るでしょうか。&lt;/p&gt;&#xA;&lt;p&gt;普段、文章を書く場所の多くは、誰かのプラットフォームの上です。読んでもらいやすい一方で、記事の住所（URL）も、見た目も、読者との接点も、その場所の仕様に委ねることになります。サービスが方針を変えたり、畳んだりすれば、書いたものもそれに従うしかありません。&lt;/p&gt;&#xA;&lt;p&gt;それ自体が悪いわけではないのですが、「長く手元に残しておきたい文章」については、もう少し自分の側に置いておきたい。そう思ったのが、小さな出版ツール &lt;strong&gt;crofty&lt;/strong&gt; を作りはじめたきっかけでした。&lt;/p&gt;&#xA;&lt;p&gt;このシリーズでは、その crofty を作って配るまでに考えたこと・つまずいたことを、テーマごとに分けて残していきます。今回はその土台として、「何をしたかったのか」と「全体の流れ」をまとめます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;何をしたかったか&#34;&gt;何をしたかったか&lt;/h2&gt;&#xA;&lt;p&gt;やりたかったことは、ひとことで言うと「自分のコンテンツを所有したまま出版する」ことでした。具体的には、次の 4 つです。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;自分のドメインで出す&lt;/strong&gt; — 記事の住所（URL）を、自分の側に持っておく&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Markdown で書く&lt;/strong&gt; — プレーンテキストなら、どこにでも移せて、長く読める&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;静的サイトにする&lt;/strong&gt; — データベースを持たず表示が速い。仕組みを入れ替えても記事はそのまま&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;エッジから配信する&lt;/strong&gt; — 世界中どこからでも、軽く開ける&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;平たく言えば、「書いたものが、それを作る道具より長生きする」状態にしておきたかった、ということです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;なぜ既存のツールそのままではないのか&#34;&gt;なぜ既存のツールそのままではないのか&lt;/h2&gt;&#xA;&lt;p&gt;ここで正直な疑問があります。静的サイトを作る道具（いわゆる SSG）はすでに優秀なものが揃っていて、たとえば Hugo はとても速くて安定しています。実際、crofty も内部では Hugo を使っています。では、なぜわざわざ別の道具を作ったのか。&lt;/p&gt;&#xA;&lt;p&gt;理由は、「出版」は書くこと自体だけでは終わらないからです。実際にやってみると、書く前後にこまごました工程がついてきます。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;記事を書く土台を用意する（最初のセットアップ）&lt;/li&gt;&#xA;&lt;li&gt;体裁が整っているかを確かめる&lt;/li&gt;&#xA;&lt;li&gt;出力が、配信先で正しく開ける形になっているかを確かめる&lt;/li&gt;&#xA;&lt;li&gt;配信する&lt;/li&gt;&#xA;&lt;li&gt;後から見た目や設定を見直す&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;これらを、その都度ばらばらの手順でやるのではなく、&lt;strong&gt;コマンド 1 つずつの薄い手順&lt;/strong&gt;にまとめておきたかった。crofty は、Hugo を置き換えるものではなく、その上に薄くかぶせた小さな道具です。土台は素の Hugo のままなので、いつでも crofty を外して、ただの Hugo プロジェクトとして扱えます。この「いつでも自分の手元に戻せる」感覚も、最初から大事にしていました。&lt;/p&gt;&#xA;&lt;p&gt;なお、「道具を変えても記事は自分のもの」をどう保証するかは、それ自体で 1 本の記事になるテーマなので、次回にゆずります。&lt;/p&gt;&#xA;&lt;h2 id=&#34;全体の流れ&#34;&gt;全体の流れ&lt;/h2&gt;&#xA;&lt;p&gt;実際の流れは、とてもシンプルです。Markdown を書いて、組み立てて、配る。ほぼそれだけです。&lt;/p&gt;&#xA;&lt;figure class=&#34;mermaid&#34;&gt;&#xA;&lt;img src=&#34;pipeline.svg&#34; alt=&#34;Markdown を書き、crofty build で静的サイト（dist）を生成し、crofty deploy でエッジに配信して、読者のブラウザに届くまでの流れ図&#34;&gt;&#xA;&lt;figcaption&gt;書く → 組み立てる → 配る、という一本道&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;p&gt;登場するコマンドも、役割で並べるとこれだけです。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
