WorkSpace Explorer の作り方 — 増えた自作アプリを一画面で束ねる Electron 製の開発司令塔

アプリの作り方

WorkSpace Explorer の作り方 — 増えた自作アプリを一画面で束ねる Electron 製の開発司令塔

作業フォルダを開くと、プロジェクトのフォルダが22個並んでいる。そのうち20が Git リポジトリで、コードだけで合計15.67GB。半年前に自分で作ったアプリでも、フォルダ名を見ただけでは「それが Python だったか」「最後に触ったのはいつか」「どうやって起動するのか」は何も分からない。毎回エクスプローラーを行き来して、README を開いて、ターミナルで起動コマンドを思い出す。この往復を消すために、作業フォルダ配下の全プロジェクトを一覧して、状況を把握して、その場から起動できる「開発の司令塔」を Electron で作った。名前は WorkSpace Explorer。この記事では、その画面と設計の勘所を、実際に動かしたスクリーンショットつきで全部見せる。

目次
  1. このガイドで作るもの
  2. 探すのをやめて、一覧から選ぶ
  3. フォルダ名だけでは分からないことを、1枚に集める
  4. ワークスペース全体を上から眺める
  5. 散らかった中間生成物を安全に片づける
  6. 作り方の要点:3つのプロセスと、1本のスキャナ
  7. 実際に使って見えたこと
  8. 正直なまとめ

このガイドで作るもの

WorkSpace Explorer は、作業フォルダ(私の場合は MY_Work_Space)の直下にあるプロジェクトを、起動した瞬間に全部スキャンして一覧化するデスクトップアプリだ。画面は3列。左に検索とフィルタ、中央にプロジェクトの一覧、右に選んだプロジェクトの詳細が出る。詳細には技術スタック、作成日と最終更新、コードサイズ、Git のブランチと未コミット数、起動コマンド、README のプレビューまでが1枚にまとまる。バンドラは使わず、Electron 30 とバニラの HTML/CSS/JS だけで組んだ。

WorkSpace Explorer のメイン画面。左に検索バーとステータス/言語のフィルタチップ、中央にプロジェクト一覧(プロジェクト名はプライバシー保護のためぼかし)、右の詳細パネルに技術スタック Python、作成日・最終更新、サイズ168.7MB、Gitブランチ main、起動方法、クイックアクションのボタン群、README.md タブが表示されている
メイン画面。右の詳細パネルに、選んだプロジェクトのスタック(Python)・作成日と最終更新・コードサイズ(168.7MB)・Git(ブランチ main)・起動方法・README が1枚に集まる。左一覧とパス、README 本文は、公開用に伏せている(実際の画面では読める)。

ダッシュボードの数字で言うと、この時点の中身は22プロジェクト・Git リポジトリ20個・合計15.67GB。以前は100個近くまで膨らんでいたのを、このツールで棚卸ししながら整理して、今の22個まで絞った。散らかったフォルダを片づける管理ツールとして、ちゃんと働いている証拠でもある。数としては多くない。それでも「フォルダ名の並び」から中身を思い出す作業は、20を超えたあたりから確実に重くなる。だから狙いは1点に絞った。プロジェクトを1つ選んで起動するまでの時間を、ゼロに近づける。

探すのをやめて、一覧から選ぶ

入口は検索とフィルタだ。上の検索ボックスに文字を打つと、200ミリ秒のディレイでプロジェクト名を絞り込む。下のスクリーンショットは「a」を含むプロジェクトだけに絞った状態で、右上のカウントが22から11に減っている。キーボードの Ctrl+F で検索へ即フォーカス、Esc で解除。マウスに持ち替えずに端から絞れる。

検索で「a」を入力した状態。プロジェクト数のバッジが11に減り、一覧が絞り込まれている。上部にはすべて/Active/Dormant/Retired/Python/Node.js/Electron のフィルタチップが並ぶ
検索「a」で11件に絞った状態。上部のフィルタチップ(Active・Python・Node.js・Electron…)と併用でき、並び順もステータス順・最終更新順・作成日順・名前順から選べる。

フィルタチップは、ステータス(Active / Dormant / Retired)と主要スタック(Python / Node.js / Electron)で用意した。ステータスはアプリが自動で判定する。最後にファイルを触った日から90日以内なら Active、1年以内なら Dormant、それ以上なら Retired。Obsidian のノートに status: を書いてあればそちらを優先する。だから「放置して1年経ったプロジェクト」が勝手に灰色(Retired)に落ちてくれて、今動いているものだけを Active で拾える。よく開くものは 📌 でピン留めして最上段に固定できる。

フォルダ名だけでは分からないことを、1枚に集める

一覧から1つ選ぶと、右にそのプロジェクトの「プロフィール」が開く(1枚目の画面)。ここに集めたのは、フォルダを開いても一目では分からない情報だけだ。

まず技術スタックとサイズ。package.json があれば Node.js、その依存に nextelectron があれば Next.js・Electron まで見分ける。requirements.txtlightgbmpyside6 があれば LightGBM・PySide6 のバッジが付く。サイズは node_modules.venv を除いた「コードだけの重さ」を出すので、依存で水増しされない実際の規模が分かる。

次に Git。プロジェクトを選ぶと裏で git を呼び、現在のブランチ・未コミット数・最後のコミットからの経過を非同期で読み込む。「main、3未コミット、2日前」のような一行が出るので、開く前に「これはまだ作業中だ」と分かる。起動方法も自動で推測する。npm start があればそれ、run.bat があればそれ、Streamlit を使っていれば streamlit run app.py というふうに、プロジェクトの中身から起動コマンドを組み立てて「▶ 起動」ボタンに載せる。押せば新しいターミナルでそのコマンドが走る。VS Code で開く、エクスプローラーで開く、Obsidian のノートへ飛ぶボタンも同じ列に並べた。「選ぶ→起動する」までを、この画面から一歩も動かずに終わらせたかった。

README も右下でそのまま読める。Markdown を描画して表示するので、フォルダを開いて別のエディタに切り替える手間が要らない。CLAUDE.md や AGENTS.md があれば、タブで切り替えて中身を確認できる。

ワークスペース全体を上から眺める

個別のプロフィールとは別に、全体を俯瞰する 📊 ダッシュボードを付けた。ここは「今の作業場が、どういう構成になっているか」を数字で見る場所だ。

ワークスペース ダッシュボード。プロジェクト総数22(Gitリポジトリ20・合計15.67GB)、ステータス分布はActive 22で100%、技術スタック使用数TOP10はPython 12・Node.js 4・PySide6 3・PyTorch 2・React/PaddleOCR/LightGBM 各1、右に最近更新リスト、下に最近作成とサイズTOP8(プロジェクト名はぼかし)
ダッシュボード。総数22・Git 20・合計15.67GB。スタックは Python 12 が最多で、Node.js 4、PySide6 3、PyTorch 2 と続く。右の「最近更新」と下の「サイズ TOP 8」で、今どこを触っていて、どれが容量を食っているかが一目で出る。

棒グラフのスタック分布を見ると、自分の作業がどこに寄っているかが分かる。私の場合は Python が12個で断トツ、そこに Node.js と PySide6 のデスクトップ系が混じる、というのが数字で見えた。「最近更新」の8件はそのまま「今週の作業ログ」になり、「サイズ TOP 8」は容量を食っている犯人を教えてくれる。ダッシュボードのプロジェクト名はクリックでき、押すとその詳細へ飛んで一覧が閉じる。眺めてから、そのまま作業へ入れる。

散らかった中間生成物を安全に片づける

もう1つ、🧹 Workspace Janitor という掃除機能を積んでいる。プロジェクトが増えると、各フォルダの .venvnode_modules が積み上がって、気づくと数十GBを占める。Janitor は作業フォルダ全体を監査して、それらの中間生成物を休眠日数つきで一覧にする。

Workspace Janitor の監査画面。ジャンクション17/17・環境変数6/6・C:空き981.12GB・最終監査2026-07-15、アラートなし。成果物テーブルにプロジェクト(名前はぼかし)・種別(.venv/node_modules)・サイズ(最大7.58GB)・休眠日数・状態(除外)が並ぶ
Janitor の監査結果。ジャンクション17/17・環境変数6/6・C: 空き981GB を健全性としてチェックし、下の表に各プロジェクトの .venvnode_modules をサイズと休眠日数つきで並べる。回収候補にはチェックボックスが付く。

ここで気をつけたのは、消す操作を絶対に一撃で走らせないことだ。回収したい項目にチェックを入れても、いきなり削除はしない。まず dry-run の内容(何を消し、どうやって元に戻すか)を表示し、「dry-run を確認した」というチェックを自分で入れて初めて実行ボタンが有効になる。削除は「依存記録 → マニフェスト保存 → 削除 → 検証」の順で進み、途中で失敗したらそこで止まる。ディスクを空けたい気持ちと、うっかり必要なものを消す事故は、いつも隣り合わせだ。だから面倒でも確認を1枚挟む設計にした。

作り方の要点:3つのプロセスと、1本のスキャナ

中身は Electron の教科書的な3層構成だ。ファイルを読んだり git を叩いたりするメインプロセスmain.js)、画面を描くレンダラーrenderer/)、その2つを安全につなぐpreload。レンダラーからは OS を直接触れないようにして、必要な操作だけを window.api という窓口越しに呼ぶ。contextIsolation を有効にし、nodeIntegration は切ってある。ローカル専用の道具でも、README を描画する以上は外から来た文字列を扱うので、そこは固めておきたかった。

アプリの心臓は scanner.js 1本だ。作業フォルダの直下を readdirSync で読み、node_modules.git、それに自分自身のフォルダを除外して、残りをプロジェクトとして扱う。各フォルダに対してスタック検出・ステータス判定・サイズ計算・起動コマンド推測・Obsidian ノートの読み込みを回す。サイズ計算では重いフォルダを歩かないので、100個近くまで増えても数秒で返る。Git 情報だけは重いので、一覧のスキャンとは切り離して、プロジェクトを選んだ時に gitspawn して非同期で取りにいく。全部を最初に読もうとすると起動が遅くなる。だから「一覧に必要な軽い情報」と「開いた時に欲しい重い情報」を分けた。

README の描画は marked で Markdown を HTML にして、DOMPurify で通してから差し込む。Obsidian との連携は、Projects/ フォルダのノートを名前で突き合わせて、frontmatter の status やタグ、本文の1行目を説明文として拾う仕組みにした。プロジェクトの「事実」を Obsidian 側の1箇所に置いておけば、このアプリはそれを読むだけでいい。

AI との分担はこうだ。3画面の構成と「何を1枚に集めるか」は自分で決め、スキャナの判定ロジックやIPCの配線はほとんど Claude に書かせた。判定のしきい値(Active を90日にするか)や、Janitor の確認を何段にするかは、実際に自分の作業フォルダで動かしながら調整した。使う人が自分1人だからこそ、しきい値は自分の手で合わせる意味がある。

実際に使って見えたこと

スクリーンショットの数字は、どれも私の作業フォルダの実データだ。22プロジェクト、うち20が Git 管理、コードだけで15.67GB。Janitor を回したら、.venvnode_modules だけで最大のものが7.58GB、上位を合計すると二桁GBが「中間生成物」として眠っていた。全部「除外」判定で安全側に倒してあるとはいえ、数字で突きつけられると片づけたくなる。

使ってみて効いたのは、意外にもステータスの自動判定だった。手で「これは休眠」とタグ付けする運用は、まず続かない。最終更新日から機械的に色を割り振るだけで、Active のフィルタを押した瞬間に「今の自分の戦線」だけが残る。逆に弱点もある。ファイルを1つ開いて保存しただけで最終更新が動くので、「中身は進んでいないのに Active に見える」ことは起きる。そこは日付と未コミット数を併せて見て補っている。

探す時間は、道具で消せる。

正直なまとめ

プロジェクトが20を超えたら、私はこういう司令塔を1つ持つ価値があると考えている。既製のIDEでも一覧は出るが、「Git の状況・コードサイズ・起動コマンド・README・作った時のメモ」を1枚に束ねてくれる道具は、探すより自分の作業フォルダの形に合わせて作ったほうが速かった。使った部品は Electron と、標準の HTML/CSS/JS と、Markdown を描く marked だけ。スキャンのしきい値も、掃除の安全弁も、自分の手に馴染むところに置ける。次はあなたの作業フォルダの「探すのが面倒な瞬間」を1つ選んで、そこだけを潰す小さな司令塔から作ってみてほしい。


👉 関連: 開発実例ギャラリー:Workspace Explorerほかのアプリの作り方バイブコーディング入門

ゲーム感覚でIT・AI用語500選を覚える学習アプリの作り方 — XP・13ランク・実績で「続く」を設計するゲーム感覚でIT・AI用語500選を覚える学習アプリの作り方 — XP・13ランク・実績で「続く」を設計する前のページ

Transcription Studio の作り方 — Whisper をローカルで走らせ、エンジンを切り替えて文字起こしする次のページTranscription Studio の作り方 — Whisper をローカルで走らせ、エンジンを切り替えて文字起こしする

ピックアップ記事

  1. 競艇予想AIの作り方 — LightGBMで「当たる順位」を学習させる実装ガイド…

  2. New Eden Intelligence Hub の作り方 — EVE Onl…

  3. 高精度OCRデスクトップアプリの作り方 — PaddleOCR-VLとPyIns…

  4. Claude Mission Control の作り方 — Tauri+Pyth…

関連記事

  1. 背景除去アプリを作る④|BiRefNetをONNXでローカル推論する — モデル別前処理とDirectML→CPUフォールバック【背景除去Studio制作】
  2. ブラウザゲームを自動テスト&デプロイ⑥|puppeteerヘッドレス検証と静的配信【Archipelago Saga制作・完結】

    アプリの作り方

    ブラウザゲームを自動テスト&デプロイ⑥|puppeteerヘッドレス検証と静的配信【Archipel…

    1万行のゲームを手で全クリアせず「動いている」を機械に証明させる。pu…

  3. マイク録音テストを数値化するアプリの作り方 — ノイズフロア測定の落とし穴と、どのオーディオインターフェースでも使える手順
  4. YouTubeトレンドのサムネイルを一括取得するツールの作り方 — Data API v3で集めて保存する
  5. 都市開発シミュを作る④|4度つまずいて座標系ごと作り直した話 — 真のアイソメグリッド移行【Aurum City制作】

注目

AIで、ここまで作れる

AIで作った2D RPGを、ブラウザでそのまま遊べます。その「作り方=最後まで完成させる進め方」も実例つきで公開中。

▶ ゲームを遊ぶやり方を読む

PR

お名前.com 独自ドメイン取得(PR)

独自ドメイン:お名前.com(本サイトで使用・PR)

  1. AIでゲーム素材を量産する⑤|生成→透過切り出し(BiRefNet)→配置のパイプライン【Archipelago Saga制作】

    アプリの作り方

    AIでゲーム素材を量産する⑤|生成→透過切り出し(BiRefNet)→配置のパイ…
  2. Claude API が会話途中の system メッセージに対応 — キャッシュを壊さず方針を差し替える

    AI・テック動向

    Claude API が会話途中の system メッセージに対応 — キャッシ…
  3. 背景除去アプリを作る④|BiRefNetをONNXでローカル推論する — モデル別前処理とDirectML→CPUフォールバック【背景除去Studio制作】

    アプリの作り方

    背景除去アプリを作る④|BiRefNetをONNXでローカル推論する — モデル…
  4. 背景除去アプリを作る⑥|QGraphicsViewズーム・スポイト・QThread非同期・D&D一括処理【背景除去Studio制作】

    アプリの作り方

    背景除去アプリを作る⑥|QGraphicsViewズーム・スポイト・QThrea…
  5. 正解が分かる音声を自分で作って、日本語ASRを測る(そして、その限界)

    アプリの作り方

    正解が分かる音声を自分で作って、日本語ASRを測る(そして、その限界)
PAGE TOP

TAG CLOUD

ドラッグで回転・クリックでそのタグの記事一覧へ