▍AI Dev Lab
VibeCoder

VibeCoder ができるまで — AI とペアプロ中の画面を作る

コーディング風の映像ジェネレーターの開発ログ。 4 ペインのエディタ画面に、 自前のトークナイザによる色分け、 アテンションのヒートマップ、 学習曲線を並べて、 配信の背景や動画素材として使える形にするまでを記録しています。

VibeCoder は、「AI とペアプロしている画面」を映像として流すジェネレーターです。4 ペインのエディタに、色分けされたコード、アテンションのヒートマップ、学習曲線が並んで動きます。配信の背景や動画素材として使うためのものです。

#🎯 中身が無い、を正面から作る

このサービスは何も計算しません。AI も動いていないし、コードも実行されません。「そう見える画面」だけを作っています。

一見ふざけた題材ですが、作るものははっきりしていました。

  • 配信の背景に流す
  • 作業用の BGM 的な視界
  • 動画のカット素材

つまり 見ていて飽きない画面が要件のすべてです。実用性ではなく、時間あたりの情報量と間の取り方で評価が決まります。

#📜 全部を「台本」として持つ

最初にランダム生成を試しましたが、すぐ破綻しました。ランダムだと話の流れがなく、コードが増えたり減ったりして、見ていて意味が取れません。

そこでシーンを台本として持つ構造にしました。

ts
{ type: "thought", chunk: { kind: "tool", text: "→ accelerate launch --num_processes 4 train/trainer.py" } },
{ type: "metric", metric: { tokensPerSec: 1280, gpu: 92, vram: 18.4, loss: 2.84 } },
{ type: "thought", chunk: { kind: "ok", text: "  step 100/3000 · loss 2.84 · lr 2.0e-4" } },
{ type: "delay", ms: 500 },
{ type: "metric", metric: { tokensPerSec: 1310, gpu: 94, loss: 2.41 } },

ステップの種類は数種類だけです。

type意味
thought左ペインに 1 行流す
metric指標パネルを更新
delay間を置く
treeファイルツリーに印を付ける
notify通知を出す

すべて純粋なデータで、動きのロジックは再生側にあります。 台本を書くだけで新しいシーンが増える構造にしたので、5 シーンぶん書くのが苦になりませんでした。

#⏱️ 間(ま)が全部だった

一番調整したのが delay です。等間隔で流すと、機械的で見ていられません。

  • コマンドを打ってから結果が出るまでは少し待つ
  • ログが連続で流れるところは速く
  • 学習が進むところは500ms 刻みで淡々と
  • 完了通知の前はやや長く溜める

この緩急が「作業している感じ」を作ります。実装は setTimeout を挟むだけですが、値の置き方で印象がまったく変わりました。

損失が 2.84 → 2.41 → 1.94 → 1.42 → 1.08 と下がっていくのも、下がり幅を後半ほど小さくしています。実際の学習曲線がそうなるからで、等間隔に下げると嘘に見えます。

#🎨 コードの色分けを自前で書く

エディタペインには色分けされたコードが流れます。ハイライタは依存を足さず自前で書きました。

ts
export function tokenize(code: string, lang: Lang): Array<[string, TokenKind]>

対応言語は tsx / py / rust / go / sql / yaml の 6 つ。完全なパーサではなく、

  • 空白と改行
  • コメント(# か //)
  • 文字列
  • 数値
  • キーワード(言語ごとの一覧)
  • それ以外

に分けるだけの近似です。映像として流れるだけなので、多少の誤判定は問題になりません。 正確さより、依存ゼロと軽さを取りました。

#🔥 アテンションのヒートマップ

8×8 のマス目に色の濃淡を出します。中身は乱数ですが、それらしく見えるための細工が入っています。

ts
export function randomAttention(seed: number): number[][]

一様乱数だと、ただのノイズにしか見えません。対角線付近を強めにして、行ごとに重みの偏りを作ると、アテンション行列らしい構造が出ます。シード付きなので、シーンを再生し直しても同じ模様になります。

#😓 苦労したところ

本物と誤解されないようにする。 実際に AI が動いていると思われると困ります。画面の説明と FAQ で「これは演出であり、モデルは動いていない」と明示しました。見た目を作るサービスほど、何であるかを言葉で書く必要があります。

5 テーマの配色。 配信背景として使うので、上に人物やワイプが乗ることを前提にしました。中央が明るすぎると文字が読めなくなるので、明度の分布を周辺に寄せています。

永久に流し続ける。 シーンが終わったら次のシーンへ、最後まで行ったら最初へ戻ります。ループしていることに気づかれない程度の長さ(1 シーン 10〜18 ステップ × 5 シーン)にしました。

リソースを食わない。 背景として何時間も流されるので、requestAnimationFrame で重い描画を続けるわけにはいきません。更新はステップ単位のイベント駆動にして、何も起きていない間は何も描かない構成にしています。

#🔭 今後の拡張

  • 台本のカスタマイズ(自分のプロジェクト名を入れる)
  • 解像度の指定(配信レイアウトに合わせる)
  • 動画としての書き出し
  • シーンの追加(デプロイ、障害対応、レビュー)

#💡 このサービスから言えること

演出だけのものを作るときも、データと再生ロジックを分けると作りやすくなります。 台本を配列として書けるようにしたから、シーンを増やすのが単なる執筆作業になりました。動きのコードに直接書き込んでいたら、2 シーン目で嫌になっていたはずです。

そして**「間」はコードに書ける**ということ。500ms をどこに置くかで、同じ内容が退屈にも自然にも見えます。数字を並べるだけの調整ですが、ここがこのサービスの本体でした。

[ ./next_action ]

読んだら、 VibeCoder を実際に動かす。

この開発ログは VibeCoder をどう作ったかの記録です。 読み終わったらそのままサービス本体へ戻って、 実物で価値を確かめてください。

[ ./related_logs ]

関連する開発ログ

all logs →
ShadowTwin

立体パズルの別解を作る:同じ影と最少の積み木

ShadowTwinの開発記録。3方向の図から別々の最少配置を2つ探す仕組み、5問の独立全探索、スマホの横並び比較、保存・再編集と入力検査を解説します。実照明の計算や能力診断ではありません。

read log →
SlitCard

スリットアニメーションを作る:4コマの合成と透明原稿の設計

SlitCardの開発記録。4コマの帯を交互に合成し、すき間と黒帯で別のコマを見せる仕組みを解説。同縮尺の台紙・透明シートSVG、50mm確認線、手動プレビュー・初期非表示、再編集と実出力検査を整理します。

read log →
WindowLight

日当たりシミュレーションを作る:窓の光を床へ投影する幾何モデル

WindowLightの開発記録。太陽位置近似から窓の4隅を床へ投影し、凸多角形を部屋で切り取る設計を解説。国立天文台の16時刻との限定照合、大気差・低高度・実際の採光との違い、SVGと設定の再編集を整理します。

read log →
GridLights

電源構成の比較を作る:割合と実量を100個の電球で読み解く

電源構成比較GridLightsの開発記録。12か国の年次発電データを最大剰余法で100個の電球に変換し、割合とTWhを比較する設計を解説。欠損を0補完しない7分類、予想と実値、出典付きSVGと実データ検証を整理します。

read log →
SoundLoom

音のお絵かきを作る:実WAVから絵を測り直す設計

音のお絵かきの開発記録。描画を正弦波のPCMとWAVへ変換し、保存音声の周波数をGoertzel法で測って比較する仕組みを解説。音量・測定窓・量子化の限界と、編集・離脱時の古い結果を抑止する検証を整理します。

read log →
MazeLoom

宝探し迷路を作る:寄り道まで含めた最短ルートの探索

宝探し迷路の開発記録。通路を木として生成し、現在地と3つの宝の取得状態を組み合わせて最短ルートを探す仕組みを解説。問題コードの版固定、画面と解答付きPDFの一致、手数と印刷の検証を整理します。

read log →