AIにほぼ任せてポートフォリオサイトをつくった

  • ポートフォリオ
  • AI活用
  • Astro
  • ふりかえり
AIにほぼ任せてポートフォリオサイトをつくった

経緯

ポートフォリオサイトをつくろうと決めてから、最初にやったのはAIにサイトの構成を相談することだった。

自分の中にあったのは「静かで、心地よくて、長く見ていても疲れないサイトにしたい」という、ぼんやりしたイメージだけ。どんなセクションが要るか、どういう順番で並べるか、コピーのトーンはどうするか。そのあたりをAIと壁打ちしながら固めていった。

セクション構成が決まったあとも、コンポーネントの実装、APIルートの設計、コンテンツのスキーマ定義と、やることは多かった。でもその大半は、自分がゼロから書いたものではない。AIにやりたいことを伝えて、出てきたコードを読んで、直して、組み込む。その繰り返しでサイトの骨格ができていった。

自分がやったこと

AIに実装を任せた分、自分の手が空いた。その時間を何に使ったかというと、ほとんどスタイルの調整だった。

余白の取り方、テキストの行間、色のトーン、ホバー時のトランジション速度、スクロールしたときのリズム。AIが出してくるCSSは「正しいけど、なんか違う」ということが多い。要素は正しく配置されているのに、全体を眺めると空気感が合わない。その「なんか違う」を潰していく作業に、制作時間の大きな割合を使った。

たとえばローディング画面。「Maymai.dev」の文字が一文字ずつ浮き上がって、線が伸びて、ラベルがフェードインする。構造やアニメーションの骨格はAIが書いたものだが、各要素のディレイを30msずつずらすのか40msにするのか、フェードアウトまでの間を0.8秒にするのか1秒にするのか。そういう調整は画面を見ながら自分で決めた。2回目以降はsessionStorageでスキップする制御や、prefers-reduced-motionで丸ごと非表示にする判断も、AIに聞いて実装してもらったものだけど、「初回だけ見せたい」という意図は自分のものだった。

色についても同じで、サイト全体のカラーパレットはかなり時間をかけて選んだ。AIに候補を出してもらうこともあったが、最終的にはブラウザで実際に当ててみて決めている。数値で見ると微差なのに、画面の印象がまるで変わる。ここは人間がやるしかない部分だった。

技術スタック

サイトの構成を簡単に書いておく。

Astro 6 をフレームワークに選んだ。ページの大部分を静的HTMLとして出力して、動きが必要な箇所だけクライアントJSを読み込む。ポートフォリオのような読みもの主体のサイトには素直に合っていた。共有スクリプトとAPIルートは TypeScript、スタイルは SCSS でscoped styleと共通定義を組み合わせている。

ヒーローセクションの背景には Pixi.js 8 でクラゲを浮かべている。傘の開閉、触手の揺れ、ポインターへの追従といった描画ロジックはAIに書いてもらったものがベースで、自分は主にクラゲの配置と色味を調整した。PC用に7体、モバイル用に5体のプリセット座標があり、DevToolsでビューポートを切り替えながら一つずつ位置を詰めていった。Pixi.jsはawait import('pixi.js')で動的に読み込んでいるので、トップページ以外にはバンドルが乗らない。prefers-reduced-motionが有効なら初期化自体をスキップする。

ホスティングとサーバーサイド処理は Cloudflare Workers に統一した。ブログと制作物の各記事につけたいいね機能は、Cloudflare KV にカウントを保存して、クライアント側はlocalStorageで重複防止している。APIルートではtypeslugをバリデーションしていて、開発環境ではKVの代わりにインメモリのMapにフォールバックする仕組み。この辺の設計もAIに「ローカルでKVが使えない場合どうする?」と聞いて出てきた方式がそのまま使えた。

コンテンツ管理はAstroの Content Collections で、blogとworksそれぞれにZodスキーマを定義してMarkdownを置く構成。blogのdescriptiontagsはoptionalにした。書くときの心理的ハードルは低いほうがいい。

別プロジェクトページのギャラリーには Swiper を使っている。サイトマップは @astrojs/sitemap でAPIルートを除外して生成。

ビルドはnode scripts/generate-assets.mjs && astro buildの2段階、デプロイはastro build && wrangler deployで通る。

苦労した点

Cloudflare環境のデバッグ

WorkersのランタイムはNode.jsと微妙に異なる。cloudflare:workersからのimportがローカルのastro devでは動かなくて、環境判定の分岐を入れる必要があった。wrangler devとの挙動の違いにも何度か引っかかった。ここはAIに聞いても「理屈上はこうなるはず」という答えしか返ってこなくて、実機で試して潰すしかなかった。

AIが出すコードとの距離

AIが出すコードは動く。動くけど、自分のSCSS設計やBEM命名と噛み合わないことが多かった。変数名やクラス名の付け方、セレクタの粒度、ミックスインの使いどころ。そのまま貼ると既存のスタイル体系と馴染まないので、結局手で書き直す場面は少なくなかった。

逆に言えば、「こういうコードにしたい」という自分の基準があるから書き直せる。基準がなければAIの出力をそのまま使うことになるし、それはそれで動くから問題ないのかもしれない。でも細部に自分の手が入っていないサイトは、たぶん自分で触り続ける気にならない。

レスポンシブの地道な調整

セクションごとのPC/SP切り替え、クラゲのプリセット座標の分岐、ナビゲーションの表示切り替え。レスポンシブ対応はAIに構造を出してもらっても、実際の画面で見ると詰めが甘い箇所が多くて、DevToolsでサイズを変えながら一つずつ直していった。この作業が地味にいちばん時間を食った気がする。

感想

AIに任せてよかったのは、実装の初速が速かったことと、自分の手をスタイルの調整に集中させられたこと。コンポーネントの骨格やAPIの設計を自分でゼロから考えていたら、見た目のトーンを詰める時間はもっと少なかっただろう。

自分がこのサイトの制作でやったことを正直に振り返ると、AIが出してきたものを読んで、選んで、直して、並べた、という表現がいちばん近い。でもそれは「何もしていない」とは違うと思っている。何を採用して何を捨てるか、どこを直してどこはそのまま使うか。その判断の積み重ねがサイトのトーンをつくっている。

ブログはこの記事がまだ最初の一本で、ここから増やしていくつもりだ。

実はこの記事も全部AIなんだ。