GitHub Pages と Cloudflare Pages — 違いと nikinakamura.com への移行計画
この TIL は、現在 niki-nakamura.github.io/til/ で公開しているこのサイトを、すでに保有しているドメイン nikinakamura.com(自動更新は 2027-04-21)へ移すべきかを検討した記録である。前提として、まずホスティング(=サイトのファイルを置いて公開するための場所を貸す仕組み)と CDN(Content Delivery Network = コンテンツ配信網。世界各地の拠点に複製を置き、利用者に近い拠点から配信する仕組み)の基礎を押さえ、GitHub Pages と Cloudflare Pages(クラウドフレア・ページズ)がそれぞれ実際に何をしているのか、なぜ無料なのかを分解する。そのうえで具体的な移行手順と落とし穴を書き出し、最後に結論として「いまの自分にとって最適なもの」を定める。
1. HTTP とウェブホスティングの基礎
1.1 HTTP / HTTPS が裏側で行っていること
ブラウザに https://niki-nakamura.github.io/til/ と入力したとき、通信は次の順序で起こる。
- DNS 解決(DNS resolution = 名前を住所に変換する処理):
niki-nakamura.github.ioという名前が IP アドレスに変換される。問い合わせは OS のリゾルバ(=名前解決を担う OS 側の機能)→ ISP(=インターネット接続事業者)の DNS キャッシュ → 権威 DNS サーバー(=そのドメインの正解を持つサーバー)の順に進む - TCP 接続:解決した IP に対し、3 ウェイハンドシェイク(SYN / SYN-ACK / ACK = 3 往復の合図で接続を確立する手順)で TCP 接続を確立する
- TLS ハンドシェイク:HTTPS なので証明書を交換し鍵を共有する。TLS 1.3 は 1-RTT(RTT = 往復にかかる時間)を要し、再接続時は 0-RTT で済む
- HTTP リクエスト:
GET /til/ HTTP/2のような要求が送られる - HTTP レスポンス:サーバーがステータスコード(
200 OKなど)と HTML を返す - 追加リソース:HTML 内の
<link>・<script>・<img>が解析され、同じことが繰り返される
HTTP の正式な仕様は RFC 9110(HTTP Semantics)と RFC 9112(HTTP/1.1)に定められている(https://www.rfc-editor.org/rfc/rfc9110.html)。RFC(=インターネット技術の公式仕様書)のうち HTTP/2 は RFC 9113、HTTP/3 は RFC 9114 であり、HTTP/3 は TCP ではなく QUIC(クイック = UDP 上で TLS と流量制御を統合した通信規約)を使う。実務的には、HTTP/2 はヘッダ圧縮と多重化(=同一接続で複数のリクエストを並行して送ること)をもたらし、HTTP/3 はヘッドオブラインブロッキング(head-of-line blocking = 先頭の処理が詰まると後続も待たされる現象)の解消をもたらす。
1.2 DNS の役割
DNS は「名前 → IP」を引くだけでなく、用途ごとに複数のレコード種別を持つ。ウェブホスティングで主に触るのは次の 3 つである。
- A レコード:名前を IPv4 アドレスに対応づける(例:
nikinakamura.com → 185.199.108.153) - CNAME レコード:名前を別の名前に対応づける(
www.nikinakamura.com → niki-nakamura.github.io.)。ルートドメイン(apex = サブドメインを付けないドメインそのもの)に CNAME を置くことは RFC 上禁じられており、代替として A レコード、または ANAME / ALIAS と呼ばれる疑似レコードを使う - NS(ネームサーバー)レコード:そのドメインの権威 DNS サーバーを指定する。
nikinakamura.comを Cloudflare に載せるとは、レジストラ(=ドメインの登録を扱う事業者)側の NS レコードを Cloudflare の NS(例:ns1.cloudflare.com)に書き換えることを意味する
ほかにも MX(メール)、TXT(SPF / DKIM = 送信元の正当性を示す仕組み、および所有権確認)、CAA(=証明書の発行を許可する認証局を指定するレコード)があり、ネームサーバーを移行する際は MX レコードを必ず引き継がなければならない(詳細は §5.8)。
1.3 「ホスティング」の層
ひとまとめに「ウェブホスティング」と呼んでいるが、実際にはいくつかの層に分かれる。
- 静的サイトホスティング:HTML / CSS / JS / 画像をそのまま返すだけのもの。GitHub Pages、Cloudflare Pages、Netlify(ネットリファイ)、Vercel(ヴァーセル)の静的配信部分、S3 + CloudFront など
- サーバー実行型ホスティング:PHP / Node.js / Python などで、リクエストごとにサーバー上でコードを実行するもの。Heroku(ヘロク)、Render(レンダー)、AWS Elastic Beanstalk、自前の VPS(Virtual Private Server = 仮想専用サーバー)など
- オブジェクトストレージ:ファイルを置くだけの保管庫。Amazon S3、Cloudflare R2、Google Cloud Storage。単体でも HTTP 配信できるが、通常は前段に CDN を置いて使う
- エッジホスティング:世界各地のエッジ拠点(=利用者に近い配信拠点)でコードを実行するもの。Cloudflare Workers、AWS Lambda@Edge、Vercel Edge Functions、Deno Deploy(ディノ・デプロイ)
静的サイトはエッジホスティングと相性がよく、近年の Pages 系サービス(Cloudflare Pages、Vercel、Netlify)は「静的サイトホスティング + エッジ実行」のハイブリッドになっている。
1.4 CDN とエッジキャッシュ
CDN は、コンテンツを世界中の PoP(Points of Presence = 接続拠点)に複製し、利用者に最も近い PoP から配信する仕組みである。Cloudflare の解説(https://www.cloudflare.com/learning/cdn/what-is-a-cdn/)によれば、CDN がサイトを速くする理由は次の 3 つに集約される。
- 物理的な距離の短縮:東京の利用者に米国東部のオリジンから配信すると往復 100ms 超かかるが、東京の PoP にキャッシュがあれば数 ms で返る
- オリジン負荷の低減:同じファイルを複数の利用者に返す場合、キャッシュヒットすればオリジンへの問い合わせが発生しない
- 接続の効率化:PoP はバックボーン(=事業者の基幹回線)経由でオリジンへの持続的接続を維持しており、TCP / TLS の確立コストを分散できる
「オリジン」とは実ファイルが置かれている場所、「エッジ」とは世界各地の PoP を指す。エッジでキャッシュミスが起きたときにのみ、オリジンから取得する。静的サイトでは、ビルド成果物そのものをあらかじめ全 PoP に事前配布する方式が主流である。
2. GitHub Pages の仕組み
2.1 push から配信までに起きること
main ブランチに push した後、内部では次の流れが走る。
- GitHub Actions(=GitHub 上で自動処理を走らせる仕組み)が自動的に起動する(ワークフローを明示的に書かなくても、Pages の設定を有効にすると裏で
pages-build-deploymentという Action が動く) - リポジトリ直下の
_config.ymlを読み、Jekyll(ジキル = Ruby 製の静的サイトジェネレーター。原稿から HTML を生成する道具)がbundle exec jekyll build相当のビルドを実行し、成果物を_site/に出力する - その成果物が GitHub の静的配信基盤に転送され、Fastly(ファストリー = CDN 事業者)ベースの CDN に配置される
<user>.github.io/<repo>/という URL で配信が始まる
GitHub Pages の CDN は Fastly である、というのが通説であり、niki-nakamura.github.io に curl -I を打ったときに返る server: GitHub.com ヘッダや、過去の障害報告(status.github.com)から繰り返し確認されている。ただし GitHub の公式ドキュメントは「CDN を使用している」としか書いておらず、Fastly と明記した箇所は見つけられなかったため、公式には確認できなかった事実として記録しておく。
2.2 URL 構造と baseurl
GitHub Pages には 2 つの URL 構造がある(https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages)。
- ユーザー / Organization サイト:
<user>.github.io(アカウントごとに 1 サイト) - プロジェクトサイト:
<user>.github.io/<repo>(リポジトリごとに 1 サイト)
このリポジトリはプロジェクトサイトなので niki-nakamura.github.io/til/ というサブパス(=ドメインの下の階層)に置かれており、Jekyll の _config.yml で baseurl: /til を設定して内部リンクを補正している。ルートドメイン(nikinakamura.com)に配信する場合、この baseurl を空文字に変更しないかぎり、CSS のパスが /til/assets/... のままとなり 404(=ページが見つからないエラー)になる。
2.3 なぜ無料なのか
GitHub Pages は保存容量・帯域・ビルドのいずれも無料で、商用利用も許可されている。これが成立する事業上の背景は次のようにまとめられる(推測を含む)。
- GitHub は Microsoft 傘下にあり、開発者を GitHub プラットフォームに囲い込むためのロスリーダー(loss leader = 集客のために採算を度外視して提供する商品)として位置づけられている
- Pages 自体の収益化ではなく、Actions の有料利用・Copilot・Enterprise 契約で収益を回収する設計になっている
- ハードリミット(=厳密な上限値)を緩く設定することで、用途を「個人サイト+ドキュメント」に限定し、大規模な商用配信を事実上不可能にしている
2.4 ハードリミット(公式の数値)
GitHub 公式の制限ページ(https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits)に書かれている制限はおおむね次のとおり。
- 公開サイトの最大サイズ:1 GB
- 帯域:ソフトリミット(=目安としての上限)100 GB / 月
- ビルド頻度:ソフトリミット 10 回 / 時(GitHub Actions のカスタムワークフローでビルドする場合は非適用)
- ビルドのタイムアウト:10 分でデプロイ失敗
- 配信:静的のみ。サーバーサイドのコード実行は不可
加えて、Jekyll のプラグイン許可リスト(allowlist)がある。_config.yml の plugins: に列挙できる gem(=Ruby のライブラリ配布単位)は GitHub が許可したものに限られ、pages-gem の依存関係一覧(https://pages.github.com/versions/)に載る既定のおよそ 9 個と、追加で許可されたプラグインしか使えない。未承認のプラグインを足すと Pages 側のビルドが通らず、ローカルで jekyll build した成果物を push するか、GitHub Actions で任意のビルドを走らせて成果物をデプロイするか、いずれかの回避策が必要になる。
2.5 カスタムドメインを向ける標準手順
公式の手順は次のとおり(https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site)。
- リポジトリの Pages 設定の Custom domain に
nikinakamura.comを入力する → リポジトリにCNAMEファイルが自動でコミットされる - レジストラ(または DNS 事業者)側で次のレコードを設定する:
- apex:GitHub の 4 つの IP に対する A レコード(
185.199.108.153 / .109.153 / .110.153 / .111.153) www:niki-nakamura.github.io.への CNAME
- apex:GitHub の 4 つの IP に対する A レコード(
- GitHub 側で DNS チェックが通ったら Enforce HTTPS を有効化する。Let's Encrypt(レッツ・エンクリプト = 無料で SSL 証明書を発行する認証局)の証明書が自動で発行される
3. Cloudflare Pages の仕組み
3.1 push から配信までに起きること
Cloudflare Pages は GitHub の Pages とは別物であり、Cloudflare 自前のビルド基盤と CDN を使う(https://pages.cloudflare.com)。
- Git 連携によって push を検知する
- Cloudflare のビルド環境(コンテナ = 隔離された実行環境)で、任意の SSG(Static Site Generator = 静的サイトジェネレーター)やフレームワークを実行する。Jekyll、Hugo(ヒューゴ)、Astro(アストロ)、Next.js、Remix(リミックス)、SvelteKit(スベルトキット)、Nuxt(ナクスト)といった主要フレームワークがプリセットとして用意されている
- 成果物を Cloudflare のグローバル CDN に配布する。Cloudflare のネットワークは 337 都市・100 か国以上に及ぶ(https://www.cloudflare.com/network/)
- 全 PoP からのエッジ配信
GitHub Pages との最大の構造的な違いは、ビルド成果物を CDN のオリジンとして配信するのではなく、CDN 自体に事前配布する点にある。エッジが本体なのである。
3.2 DNS と SSL
nikinakamura.com を Cloudflare で運用するには、レジストラ側のネームサーバーを Cloudflare のもの(例:bob.ns.cloudflare.com / lara.ns.cloudflare.com)に切り替える。これにより Cloudflare の DNS が権威サーバーになる。
- HTTPS 証明書(Universal SSL)は自動で発行・更新される。バックエンドに Let's Encrypt と Google Trust Services を持つ
- HTTP/3、TLS 1.3、IPv6 が既定で有効
- DNS 設定画面では、レコードごとに「Proxied(オレンジ色の雲)」か「DNS only(灰色の雲)」を選べる。Proxied にすると Cloudflare の CDN / WAF(Web Application Firewall = ウェブアプリを狙う攻撃を遮る防御) / DDoS 防御(=大量アクセスでサービスを止める攻撃への対策)を経由する
3.3 なぜ無料なのか(重要)
Cloudflare Pages の無料プランには帯域無制限・リクエスト無制限・サイト数無制限が含まれる(https://pages.cloudflare.com)。これが事業として成立する理由は、彼ら自身が複数のブログ記事で説明している。要点は次の 4 つ。
- コスト構造:Cloudflare は自前のグローバル CDN(337 都市、世界人口の 95% から 50ms 以内)を保有しており、固定費中心のビジネスモデルである。ユーザーを 1 人増やす限界費用(=追加 1 単位あたりの費用)はほぼゼロ
- 規模の経済:無料ユーザーは Cloudflare の通信量を押し上げる。営業資料で「世界のトラフィックの X% を扱っている」と言えるほど、商用顧客に対する価格交渉力が高まる
- アップセル(=上位・周辺商品への誘導):Pages 自体は無料に保ちつつ、周辺製品——Workers(サーバーレス実行 = サーバー管理なしでコードを走らせる仕組み)、R2(オブジェクトストレージ)、D1(SQLite)、KV(=キーと値の保管庫)、Durable Objects、Images、Stream、Zero Trust など——で課金する。Pages を入口として開発者を引き込む設計である
- 競合(Vercel / Netlify)との差別化:Vercel と Netlify の無料プランは帯域を 100 GB / 月で頭打ちにし、それを超えると即座に停止するか課金する。Cloudflare はここを帯域無制限で差別化し、開発者の流入を奪っている
確認できなかった事実:今回の WebFetch(=ウェブページ取得)では、Cloudflare が「Pages を Workers のロスリーダーと位置づけている」と明示的に書いたブログ記事を特定できなかった(blog.cloudflare.com/cloudflare-pages-goes-full-stack/ は別の話題だった)。アップセル戦略という解釈は推測である。
3.4 ハードリミット(公式の数値)
Free プランの制限(https://developers.cloudflare.com/pages/platform/limits/)。
- ビルド回数:500 回 / 月
- 同時ビルド数:1
- 1 回あたりの最大ビルド時間:20 分
- 1 サイトあたりのファイル数:20,000
- 1 ファイルの最大サイズ:25 MiB(=2 の 20 乗バイト単位。約 26.2 MB)
- 1 プロジェクトあたりのカスタムドメイン数:100
- 帯域:無制限
- リクエスト数:無制限
別途、Workers を併用する場合にかぎり Workers 側の制限(無料プランで 1 日 100,000 リクエスト)が適用される。純粋な静的配信のみであれば Workers の制限は無関係である。
3.5 カスタムドメインの手順
- レジストラでネームサーバーを Cloudflare のものに切り替える(DNS の伝播に数分〜24 時間)
- Cloudflare Dashboard → Workers & Pages → 対象プロジェクト → Custom Domains →
nikinakamura.comとwww.nikinakamura.comを追加 - Cloudflare が DNS レコードと SSL 証明書を自動で設定する
4. 直接比較表
| 項目 | GitHub Pages | Cloudflare Pages |
|---|---|---|
| ホスティング基盤 | GitHub の静的配信+第三者の CDN | Cloudflare 自前のグローバル CDN |
| エッジ PoP 数 | 非公開 | 337 都市 / 100 か国以上 |
| 無料の帯域 | ソフトリミット 100 GB / 月 | 無制限 |
| ビルド時間の上限 | 10 分 | 20 分 |
| ビルド回数 | 10 回 / 時(ソフト) | 500 回 / 月 |
| 同時ビルド数 | 1 | 1 |
| 公開サイトの最大サイズ | 1 GB | 20,000 ファイル / 各 25 MiB |
| フレームワークの自由度 | Jekyll が一級市民。他は Actions による回避策で対応 | プリセット多数:Jekyll / Hugo / Astro / Next.js など |
| カスタムドメイン | 1 / リポジトリ(1 サイト) | 100 / プロジェクト |
| SSL | Let's Encrypt、自動 | Universal SSL、自動 |
| エッジ実行(サーバーレス) | なし(純粋な静的のみ) | Pages Functions / Workers と統合 |
| 画像最適化 | なし | Cloudflare Images(有料) |
| 現構成の惰性 | すでに稼働中 / 移行コスト 0 | 新規セットアップが必要 |
| プラットフォームロックイン(=特定基盤への依存) | 低い(Jekyll は CMS 非依存) | 中程度(Workers / D1 / R2 を使うと依存が高まる) |
5. nikinakamura.com への移行計画
前提は、ドメインをすでに保有しており、ホスト先として無料の Cloudflare Pages を検討しているという状況である。手順は時系列で書く。
5.1 準備:DNS を Cloudflare へ移す
- Cloudflare アカウントを作成 →
nikinakamura.comを Add a Site で追加 - Cloudflare が既存の DNS レコードをスキャンして候補を提示するので、レコードが正しいか確認する(特に MX、TXT、CAA)
- レジストラ側でネームサーバーを Cloudflare のもの(指示された 2 つの NS)に変更する
- 伝播を待つ(数分〜24 時間)。
dig NS nikinakamura.com(dig = DNS レコードを問い合わせるコマンド)で確認できる
5.2 Pages プロジェクトの作成
Cloudflare Dashboard → Workers & Pages → Create → Pages → Connect to Git → niki-nakamura/til を選択。
ビルド設定:
Framework preset: Jekyll
Build command: bundle exec jekyll build
Build output dir: _site
Root directory: /
Environment: RUBY_VERSION = 3.x(_config.yml と整合)
5.3 ビルドの検証
Cloudflare はプレビュー URL(<branch>.<project>.pages.dev)を自動で発行する。ここで動作を検証する。注意点:
- ルートドメインで公開する場合、
_config.ymlの Jekyll のbaseurl: /tilを空文字""に変更する必要がある。さもないと CSS / リンクがすべて 404 になる url:もhttps://nikinakamura.comに書き換える- GitHub Pages と並行運用する間は、
baseurlを環境変数で切り替えるか、ブランチを分けるほうが安全である
5.4 カスタムドメイン
Pages プロジェクト → Custom Domains → nikinakamura.com と www.nikinakamura.com の両方を追加する。Cloudflare が必要な CNAME を DNS に自動挿入し、Universal SSL 証明書を発行する。
5.5 GitHub Pages からのリダイレクト
30 日以上の並行運用を推奨する。GitHub Pages 側に niki-nakamura.github.io/til/ から nikinakamura.com への 301 リダイレクト(301 = 恒久的な転送を表す HTTP ステータス)を設定する。
ただし、GitHub Pages は本物の 301 ステータスを返せない(純粋な静的配信であり、HTTP ヘッダを動的に出力できないため)。代替は 2 つある。
jekyll-redirect-fromプラグイン(Pages の許可リストに載っている)が、各ページにリダイレクトページを生成する。生成される HTML は<meta http-equiv="refresh">(=HTML のタグで自動転送する方法)とwindow.location.replace()を併用する。Google の John Mueller(ジョン・ミューラー = Google の検索担当者)は、これが SEO 上 301 と同等に扱われると公式に述べているが、本物の 301 より効力は弱い- トップの
index.htmlだけを手書きする方法:meta refresh + canonical link rel(=正規 URL を検索エンジンに伝えるタグ)+ JS リダイレクトを組み合わせる
実務上は、1 の方法で済ませるのが現実的な選択である。
5.6 SEO の引き継ぎ
- Google Search Console(=Google の検索結果での状況を確認・管理するツール)で新しいプロパティ
https://nikinakamura.com/を追加し、所有権を確認する(Cloudflare DNS なら TXT レコード 1 本で済む) - 新サイトの sitemap.xml(=サイト内 URL の一覧ファイル)を送信する
- 旧プロパティ
niki-nakamura.github.io/til/は残す。リダイレクトがどう認識され、リンクがどう引き継がれるかを確認するために必要である - アドレス変更ツール(Change of Address)は使えない。これは「ドメイン全体の移行」を対象としており、
example.github.io/til/のようなサブパスからの移行はカバーしない(https://support.google.com/webmasters/answer/9370220) - 結局のところ meta refresh / JS リダイレクト + 新サイトの送信 + 旧サイトの維持に帰着し、自然な入れ替わりまで 3〜6 か月待つことになる
5.7 GA4 / 計測
GA4(Google Analytics 4 = アクセス解析ツール)は測定 ID(G-XXXXXXXXXX)で動くため、タグ自体はそのまま機能し続ける。やることは次のとおり。
- GA4 プロパティのウェブストリーム URL を
nikinakamura.comに書き換える - 旧 URL からのトラフィックも同じプロパティに流れ込み続けるため、移行期間の比較がしやすい
- 自己リダイレクト経由のセッションが分断されないよう、参照元除外リスト(Referrer exclusion list)に
nikinakamura.github.ioを追加する
5.8 DNS の落とし穴(重要)
ネームサーバーを Cloudflare に切り替えた瞬間、既存の DNS レコードは Cloudflare 側に登録した内容で完全に置き換わる。具体的には:
- MX レコード(メール)を引き継ぎ忘れると、
*@nikinakamura.comが即座に死ぬ - TXT(SPF / DKIM / DMARC)や CAA も同様に消えることがある
- Cloudflare のサイト追加時にスキャンされる候補は完全ではないため、
digで 1 レコードずつ確認したほうがよい
nikinakamura.com でメールを運用している場合は、切り替え前に次を確認すること:
dig MX nikinakamura.com +short
dig TXT nikinakamura.com +short
dig CAA nikinakamura.com +short
これらを先に Cloudflare DNS へ手で入力してから、ネームサーバーを切り替える。
6. 結論 — いま移行すべきか
正直に言えば、現時点(記事 13 本、月間ページビューはおそらく数百程度)では Cloudflare Pages の恩恵は過剰である。GitHub Pages の 100 GB / 月やサイズ上限 1 GB に当たるのは当分先であり、Jekyll のプラグイン許可リストの中で困ってもいない。
推奨はハイブリッド構成である。
- まずドメインだけを Cloudflare DNS に載せる:ネームサーバーを Cloudflare に切り替え、DNS / WAF / DDoS 防御の恩恵だけを享受する
- ホスティングは GitHub Pages のまま維持する:
nikinakamura.comを GitHub Pages のカスタムドメインとして設定する(apex は GitHub の 4 つの A レコード、wwwは CNAME) - Cloudflare 側で DNS only(灰色の雲)か Proxied(オレンジ色の雲)かを選ぶ:Proxied にすると Cloudflare の CDN を経由し、GitHub Pages のオリジン帯域の消費が減るという副次的効果がある
これで「nikinakamura.com で自分のサイトが見える」が最小コストで実現する。
Cloudflare Pages への完全移行は、次のいずれかが生じたときに検討する。
- コンテンツが商業的に重要になり、エッジ最適化や A/B テスト(=2 つの案を出し分けて成果を比べる検証)が必要になったとき
- メールアドレスの収集、リダイレクトのロジック、認証、エッジ側でのレンダリングのために Workers が必要になったとき
- GitHub Pages のプラグイン許可リストや 10 分のビルド上限に当たり、ローカルビルドや Actions への恒常的な逃げ道が煩わしくなったとき
「無料の罠」とは、必要になる前に、無料同士の差別化要素(帯域無制限、Workers 統合)をつかむために移行コストを払うことである。記事 13 本の個人 TIL にとって、「Cloudflare のほうが速い」は、計測できる差よりも移行と学習のコストのほうが高くつく。
2026-05-18
参考文献
- GitHub Pages documentation
- GitHub Pages limits
- GitHub Pages: about (URL structures)
- GitHub Pages: custom domain
- Dependency versions for GitHub Pages
- Cloudflare Pages
- Cloudflare Pages documentation
- Cloudflare Pages limits
- Cloudflare network
- What is a CDN? — Cloudflare
- RFC 9110: HTTP Semantics
- RFC 9112: HTTP/1.1
- RFC 9113: HTTP/2
- RFC 9114: HTTP/3
- jekyll-redirect-from
- Google Search Central: Change of Address
- John Mueller on meta-refresh as 301
関連ノート
- Agentic Commerce — ACP and Visibility into Being 'Bought by AI'
- browser-to-api — a Browserbase skill that turns a site into OpenAPI from a CDP trace
- Safe tenant-scoped writes to a cloud database — connection, authentication and RLS in one go
- Cloudflare Wrangler and Pages Functions — the deployment tool and the Functions bundle
- Introduction to the Digital Architect (00) — the reality of the profession and the big picture of an original textbook series
- The textbook for becoming a digital architect — table of contents (learning roadmap)