ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-06-23上級

シェア画像の日本語だけが □ になる — Antigravity に next/og の CJK フォント供給を直させた実装メモ

next/og の ImageResponse で日本語タイトルだけが豆腐(□)になる。原因の Satori と woff2 の関係を解きほぐし、Google Fonts の text= サブセットをエッジで軽量に引き当てる実装を、Antigravity に直させる手順とあわせて記録します。

next-ogSatoriOGPedge-runtimeAntigravity259

プレミアム記事

先日、Antigravity Lab に新しい記事を公開して、いつものように X とスレッズにリンクを貼りました。プレビューに出てきたシェア画像を見て、手が止まりました。英語の補助テキストは綺麗に出ているのに、肝心の日本語タイトルだけが、四角い豆腐(□□□□)の行列になっていたのです。

個人開発で複数のサイトを回していると、こういう「片方の言語だけ静かに壊れている」不具合がいちばん厄介です。エラーは出ません。ビルドも通ります。ただ、共有されたときにだけ恥ずかしい姿で世に出ていきます。

ここでは、その豆腐を退治するまでの実装を、つまずいた順に残します。題材は next/ogImageResponse ですが、本質は「Antigravity のようなエージェントに OG 画像ルートを書かせると、ほぼ必ずこの罠に落ちる。なぜ落ちるのか、どう直させるのか」という一点に集約されます。

静かに失敗していたのは、フォントを渡していなかったから

最初のルートは Antigravity に書かせました。指示は素朴で、「記事タイトルを大きく入れた 1200×630 の OG 画像を opengraph-image.tsx で返して」というものです。エージェントは数秒で、いかにも正しそうなコードを出してきました。<div> を並べてタイトルを流し込み、ImageResponse で返すだけ。ローカルの英語タイトルでは、確かに描画されました。

ところが日本語が豆腐になる。ここで多くの方が font-family の指定を疑いますが、原因はもっと手前にあります。

ImageResponse の内部は Satori という、HTML/CSS を SVG に変換するエンジンです。そして Satori は、自分でフォントを一切同梱しませんfonts 配列で明示的に渡されたフォントの中に該当するグリフが無ければ、その文字は黙って欠落します。ラテン文字が出ていたのは、Satori が内蔵で持っているごく基本的な字形にたまたま含まれていたからで、日本語は最初から「持っていない字」だったわけです。

エージェントが出したコードには fonts の指定がありませんでした。エラーにならないので、エージェント自身も「成功した」と判断してしまう。ここが、人間が一度は目で確かめないといけない境界です。

woff2 を渡しても直らない、という二段目の罠

「ではフォントを渡せばいい」と、Antigravity に fonts を追加させると、今度は別の壁に当たります。多くのエージェントは、よくある書き方として Google Fonts の woff2 を fetch して渡そうとします。これも静かに失敗します。

理由は、Satori(および内部のラスタライザ)は woff2 を解釈できないからです。woff2 は Brotli で圧縮されたフォント形式で、Satori が直接読めるのは TrueType(ttf)・OpenType(otf)・woff までです。woff2 を渡すと、描画されないか、ランタイムによっては例外で落ちます。

ここを表で整理しておきます。

形式Satori で使えるか典型的な入手元備考
woff2不可ブラウザ向け Google FontsBrotli 圧縮。最も配られやすいが Satori は読めない
woff一部 CDN読めるが入手しづらい
ttf / otfcss2 をサーバから取得本記事で使う。サブセットも効く

つまり目標は明確です。「描画する日本語の字だけを含んだ TrueType を、エッジで軽量に手に入れる」こと。Noto Sans JP のフルセットは数 MB あり、リクエストのたびに丸ごと取り寄せるのは現実的ではありません。必要なのは、タイトルに出てくる十数文字だけです。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
ImageResponse で日本語が □ になる本当の原因(Satori が woff2 を解釈できない)と、TrueType サブセットを引き当てる完全な実装
Google Fonts の css2?text= で描画する文字だけを取り寄せ、数十 KB でエッジ描画するコードと、固定ラベルまで含めたサブセット設計
文字溢れを Satori の制約内で潰す手動クランプと、このバグをエージェントに正しく直させる検証ステップ
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

アプリ開発2026-06-21
Play Store の密度分割で、特定の端末だけ内蔵壁紙が消えた — drawable と nodpi の境界設計
App Bundle の密度分割は、密度別に分けてはいけない画像まで分けてしまうと、特定の密度バケットの端末からだけリソースを取りこぼします。bundletool で再現し、drawable-nodpi への移動か密度分割の無効化で直すまでを、判断基準ごと残しました。
アプリ開発2026-06-21
審査ガイドラインのPDFをエージェントに読ませて、アプリごとのリリース前チェックリストを作る
Antigravity v2.1.4 のPDF添付を使い、App Store と Play の審査ガイドラインをエージェントに文脈として読ませ、アプリの機能に紐づくリリース前チェックリストへ落とし込む手順をまとめました。
アプリ開発2026-06-20
複数環境でエージェント設定が静かにずれていく — 設定ドリフトの検知と是正
2台のMacと自動運用環境でエージェントの設定が少しずつ食い違い、片方だけ失敗する——その「設定ドリフト」を、ハッシュ照合と是正手順で見える化する設計を、個人開発の現場からまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →