Galaxy Z Fold7 × Claude Codeで電車でも個人開発を進める

先日、MOSH社・RABO社と共同開催したクローズドのAI勉強会で「電車でも個人開発を進める技術」というタイトルで発表しました。 この記事はその発表内容をブログ向けにまとめたものです。

はじめに:AI活用に素振りは大事

仕事では割とコンサバなAI活用をしています。個人のコーディングはほぼ100%AIがドライバーになっていますが、チームでの活用度はまだ低め。より深く理解するために、もっと気軽に「素振り」がしたいと思っていました。

個人開発はいいぞ!でも時間がない

素振りといえば個人開発。しかし人生のフェーズと共に、開発に使える時間はどんどん減っていきます。減らしたくない睡眠時間、減らせない移動時間……。

そこで思ったのが「電車移動中に開発できたら」ということです。

整えた環境

試行錯誤の末、次のような構成に落ち着きました。

  • 本体:折りたたみスマホ(Galaxy Z Fold7)
    • SSHアプリ:Termux
    • VPN:Tailscale
    • エディタ:vim
    • ターミナル管理:tmux

開発のワークフローとしては、プランニング(mo)→ 実装(Claude Code)→ レビュー(difit)という流れで進めています。

実際にやってみた感想

メリット

  • 折りたたみスマホが便利すぎる
    • Galaxy Z Fold7はタブレットとは違ったポータビリティ性能が魅力です。ポケットからサクッとPCを取り出せる感覚で、とにかく持ち運びやすい。
  • 結構戦える
    • Agentic Codingの普及、重厚なIDEからCLIへの回帰が進んでいるあたりが理由かなと。
  • 環境準備が楽
    • ターミナルはリモートのMacにSSHして、日頃と同じ環境を担保できます。
    • モバイル ↔ PC をシームレスに切り替えられるのが特に気に入っています(同じリモート環境にSSHするだけ)
    • また、TailscaleによってセキュアなVPN接続を実現し、不必要なポートを解放せずに済むのも安心です。

デメリット

  • Galaxy Z Fold7が高すぎる(約25万円)
  • 開発に集中しすぎて電車を乗り過ごす(2回やりました)

画面の使い方

実際の作業では、折りたたんだ状態の画面を左右に分割して使います。

  • 左半分:ターミナル
    • 基本的にClaude Codeを起動。サーバー起動や特定ファイルの確認はtmuxで切り替え
  • 右半分:ブラウザ
    • 成果物の確認やPRの作成

真ん中をドラッグして画面幅を適宜変更できるのも便利です。プランニング時はターミナルを広め、レビュー時はブラウザを広めにする、といった使い分けをしています。

工夫① CLIツール「difit」でコードレビュー

yoshiko-pg/difit というCLIツールをコードレビューに活用しています。PRを作る前にGitHub Likeな画面でレビューでき、GitHubと同様にコメントもつけられます。コメントは最終的にプロンプトとしてコピーできるので、Claude Codeへの指示に使えて便利です。

src/hoge.ts:L100
255文字にして
=====
src/hoge.ts:L200
テストを追加して

工夫② CLIツール「mo」でMarkdownを確認

k1LoW/mo はブラウザベースのMarkdown ViewerツールをCLIから起動できるものです。

$ mo PLAN.md

複数のMarkdownを開いても別プロセス/別ポートが使用されない設計で、ライブリロードにも対応。ブラウザで開くので英語のドキュメントも翻訳できます。

工夫③ Tailscale × 開発サーバー公開

開発中、リモートPCの localhost にスマホからアクセスしたくなる場面があります(アプリサーバー、difit、moなど)。これを Tailscale Serve を使って安全にhttpsで外部公開しています。

.zshrc に以下のようなシェル関数を定義しています。

tsdev() {
  if [ $# -eq 0 ]; then set -- 3000; fi
  local host="$(tailscale status --json | jq -r '.Self.DNSName | rtrimstr(".")')"
  for port in "$@"; do
    tailscale serve --bg --https=${port} "http://localhost:${port}"
    echo "-> https://${host}:${port}/"
  done
}

tsdevoff() {
  tailscale serve status --json 2>/dev/null \
    | jq -r '.TCP | keys[]' \
    | while read -r port; do
        tailscale serve --https=${port} off 2>/dev/null
      done
  echo "-> stop"
}

使い方はシンプルで、以下のように実行できます。

# 例えばリモートのhttp://localhost:3000/ にアクセスしたいとする
$ tsdev 3000
# https://mydevpc.tail12345.ts.net:3000/ でアクセスできるようになる

まとめ

移動中も開発していこうな!💪