Astro Meetup Japan 2026-05-19
2026-05-19 · Astro Meetup Japan

「作りたい気持ちを妨げない」

── デザイナーが個人サイトを作って気付いた Astro の良さ

自己紹介#

プロフィール写真

kobaryo / Kobayashi Ryota#

  • Org — サイボウズ株式会社
  • Role — プロダクトデザイナー / kintone, Dashboard
  • Siteryota5884.com

まずは会社紹介から#

サイボウズの理念とカルチャー
Cybozu — Purpose & Culture

プロダクト#

サイボウズの主要プロダクト
kintone / Garoon / サイボウズ Office / Mailwise

サイボウズのヘルプサイトは Astro 製#

2026/5/9 フロントエンドカンファレンス名古屋にて発表

AIと乗り切った1,500ページ超のヘルプサイト基盤刷新とさらにその先の話 — mugi_uno さん

  • ドメイン知識/技術スタックともに皆無なコードベースにAIとどう立ち向かうか
  • 大量コードのマイグレーションをAIを活用してどう行うか
  • 「AI×刷新」において、どうナレッジを残し未来に繋げるか
— https://speakerdeck.com/mugi_uno/help-site-renewal-with-ai

しかし、今回は私個人の話。#

発表内容

  • 個人サイト(作品なし,ブログのみ)の成果物
  • 学びを共有

こんな人向け

  • Astroでポートフォリオやブログを自分で作ってみたいデザイナー
  • Astroを使っている/興味がある ウェブデザイナー・デザインエンジニア
  • 他の人がAstroで何を作っているのか見てみたい人
01

作成背景(サクッと!)

Q.なんで個人サイト作ったんですか?#

誰か 「note, Zenn, Notion でよくない?」

A.既存プラットフォームで感じた小さな不満を自分で解決したくなった。

  • 投稿先を気軽に乗り換えたい
  • 好みのエディタで書きたい ─── タイプライターモードが欲しい、emacsのキーバインドで移動したいetc
  • 自分が気に入る見た目にしたい ─ 良いものを気軽に取り入れたい

Q.なぜAstro?#

→ A.npm→pnpmベースに切り替える作業をしていたときに友達におすすめされて。波に乗りたかった。

discordのメッセージのスクリーンショット。「最近Astro移行の波きてるよ」と書かれている
きっかけになった投稿のスクリーンショット
02

作ったものの話

個人サイトトップページのスクリーンショット。サイトトップにはKPI(投稿数、総合閲覧数)とほかページへのリンクが表示され、

概要#

コンセプト:ブログ × ダッシュボード

/Top:「見る価値があるサイトか」を判断する情報提供の場
/Posts:ブログをまとめる場所
/Talks:登壇資料をまとめる場所
/About:自分のデータでグラフを試す場所

現在の構成#

Astro — 骨格と配信#

  • Pagessrc/pages/ のファイルがそのままルート
  • Content Collectionsposts / talks を MDX + Zod で型付け
  • ビルド時生成 — OGP(satori)/ RSS / sitemap / expressive-code
  • View Transitions — スライド遷移

React — Island で動かす#

  • グラフ — Highcharts(Treemap / Burndown / PV)
  • 3D 背景 — three.js + R3F(ASCII / Orbital)
  • 検索 — Fuse.js(PostSearch / TalkSearch)
  • 外部データ — GitHubActivity / PopularPosts
  • カウントダウン — LifeProgress / CreativeLifeCountdown

Astro = 骨格 / React = 動く部品。お客さんがサッと見たい部分は軽量にできた。

03

学びの話

学び① 一旦Astroの書き方に拘らず動くもの作っていい。#

始めたときの認識#

  • 「Astro なんとなく軽そう」で採用
  • 「ちゃんと動く = ヨシ」で進めた

例:画像の置き場所#

  • 当時は画像を貼り付ける体験を優先して全部 public/talks/foo.png に直置き→<img src="/talks/foo.png"> で参照。
  • Astroの astro:assets , <Image> が活用できていないことにしばらく経って気付く

→後からまとめて書き直した#

  • 画像public/src/assets/ + astro:assets
  • CodeBlockclient:load の React → astro-expressive-code(ビルド時)
  • SEO / 見出し — 手書き → rehype-slug / autolink-headings / sitemap

感想#

  • 色々な作り方を許容してくれるので、一旦好奇心先行で作って後から改善できる。モチベ維持しやすい
  • MCPを使いつつ都度改善がいい
  • 自分で頑張っても不慣れさからAstroに合った書き方かを見落しがちなので諦め。

「一旦Astroの書き方に拘らず動かすでいいんだ」

学び② View Transitions の遷移は “一瞬の未確定 DOM” を通る#

/Talksのスライド生成機構を作ったときの話

始めたときの認識#

  • スライド機能を作る途中、トップページで使っている ASCII 装飾をスライドにも入れたい!
  • 学び① のノリで「一旦置いて、後で詰めればいける」と思った

実際に起きたこと#

  • 1 スライド目はちゃんと動く
  • View Transition で別スライドに遷移すると getImageData: Value is not of type 'long' で drei がクラッシュ。遷移の瞬間だけ throw する

原因になっていた VT の挙動#

  1. VT は遷移中、古い DOM と新しい DOM が一瞬同居する
  2. 新しい DOM が出てきた直後、Canvas は「幅 0」のフレームを経由する
  3. そこで React Island がマウントされ、drei が getImageData を呼ぶと throw

「マウント時 = サイズが確定した DOM」という前提が、VT の遷移中だけ崩れる

LLM と粘った結果#

試した順: rAF 1 つ挟む → VT 完了を待つ → ResizeObserver

  • 着地点ResizeObserver で Canvas の実寸が出た瞬間にマウント
  • 保険 — drei が出す一回限りのエラーは window で preventDefault

同じことやる人がいたら参考に。

感想#

  • 個人的には満足。現状不満はない。
  • 作りたい気持ちを妨げないのが嬉しい・楽しい
  • 初心者にも優しい(MCP もある)
  • ほかのデザイナーにも勧めたい。

最後に#

今日のイベントも楽しみにしていました。
一緒に楽しみましょう!

fin.

Thank you

イベント最後までいます。何でも聞いてください