写真管理・現像ソフトFocalを自作した話

長年使い続けてきた Adobe Lightroom を手放したいと思い始めて早2年。納得のいく代替ソフトウェアが市場に見当たらなかったため、macOS向けのシンプルなDAM(デジタルアセット管理)&現像ソフトウェア Focal(フォーカル) を自作しました。

Focal アプリアイコン

なぜ今、写真管理ソフトを自作するのか

Aperture への未練と、Lightroom への違和感

かつて私は Apple の Aperture を愛用していました。ライブラリの取り回しの良さ、直感的な操作感、そして何より写真をブラウズする体験(DAM)と、その場でパラメーターを触る体験(現像)がシームレスに統合されている点において、道具として非常に完成度が高く不満は一切ありませんでした。

しかし、2014年の開発終了アナウンスを経てやむを得ず Adobe Lightroom (Classic)へ移行。機能に不満はなく使いやすいソフトウェアですが

  • 年々上がり続けるサブスクリプション費用
  • 使わない重厚な付随機能と、不要になった Photoshop バンドル

写真を取り込んで、日付やアルバムで整理し、気になった写真をその場で軽く現像して書き出す。このために支払うコストが無視できなくなりました。

既存の代替ソフトウェアを検証してぶつかった壁

もちろん、脱Lightroomに向けて市場にある様々な選択肢を検証しました。

  1. Photomator
    macOSネイティブで動作が軽快、UIも美しく、DAMと編集の統合感も素晴らしいため、理想に最も近い存在でした。しかし、NAS上の写真を扱う場合、アルバム機能が使えない という決定的な制約にぶつかりました。我が家の写真データはすべてNAS上で一元管理しているため、この制限は運用上致命的でした(加えて、こちらもサブスクリプション形態です)。
  2. digiKam / darktable (オープンソース)
    オープンソースの代表格として真っ先に検討しました。機能面では非常に強力ですが、UIが複雑で自分が求めている道具としてのシンプルさ・軽快さとは方向性が合いませんでした。また、digiKam(DAM特化)とdarktable(現像特化)を別々に立ち上げて連携させるような分離されたワークフローではなく、1つのアプリ内で閲覧から簡易調整までが完結する一体感が欲しかったのです。

余談:darktable フォークAnselの登場に見る、界隈共通の課題感
ちょうど同じ時期に、GIGAZINEでも darktable の元開発者がUIやパイプラインのシンプル化を図るフォークAnselを立ち上げたという記事 が公開されていました。世界中の写真好きやエンジニアの間でも、既存の現像ソフトは肥大化しすぎており、もっと本質的でシンプルな道具が欲しいという共通の課題感があるのだなと感じました。

ないなら、自分で作る

求めているのは、過剰な機能を持つ巨大なスイートではなく、ApertureのようにDAMと現像が美しく統合され、かつNASでアルバム管理が自由にできる、シンプルで手触りの良い道具 です。 自分に必要な道具を自分で作る。2026年の進化したAIコーディング環境を武器に、個人用写真管理・現像ソフトの実装に着手することにしました。

コンセプト設計:Focalが目指したもの

ソフトウェアの名前は Focal と名付けました。写真用語の焦点(Focal point / Focal length)に由来しつつ、写真管理と現像の本質にフォーカスし、余計なものを削ぎ落とす という意味を込めています。

目指したのは、管理と現像を、1 つのアプリでできる軽量でシンプルな macOS 用の RAW 写真管理・現像アプリ です。

5つのコア設計思想

  1. DAMと現像の完全統合
    ブラウズ画面と編集画面を行き来するストレスをなくし、写真をグリッドでめくりながら、その場で露出や色温度を整えられるシームレスな一体感を重視します。
  2. NASファーストなアーキテクチャ
    大容量のRAW/JPEG画像がストレージを圧迫しないよう、NAS上のディレクトリツリーをそのままマウントして高速プレビュー・参照します。
  3. 物理パス × 仮想アルバムのハイブリッド管理
    ファイルの実体はNAS上の日付/フォルダ構造のまま保持し、イベントやテーマ別の整理はアルバムで行います。
  4. 現像は“割り切り”のミニマリズム
    日常の写真整理に必要な基本調整(露出、ホワイトバランス、トーンカーブ、コントラスト程度)に絞り込みます。レタッチが必要な写真は、darktableやGIMPなどの外部エディタへ渡せばよいというスタンスです。
  5. 脱ベンダーロックイン
    万が一カタログデータベースが破損したりアプリを乗り換えたりしても、ストレージ側のフォルダ構造さえ残っていれば元データは完全に保たれる設計としました。

UI/UX設計

左サイドバーの2段構成

Lightroom Classic を長年使ってきて最も合理的だと感じていたのは、左サイドバーにおける物理フォルダと論理コレクションの住み分けでした。Focal でもこの動線を採用しています。

  • 上部:ストレージ&フォルダツリー(物理構造)
    マウントされたNASやローカルドライブの階層を表示。指定したルートディレクトリ配下の写真をインプレースで高速に一覧表示します。デフォルトの読み込みパスも常時保持します。
  • 下部:アルバム一覧(論理構造)
    ファイル自体の物理配置を動かすことなく、旅行やイベント、被写体ごとのアルバムを作成し、写真をドラッグ&ドロップで紐付けて仮想グループ化します。

SDカードからの取り込み

写真運用のボトルネックになりがちな撮影後の取り込みも、日々のルーチンとしてストレスなく行えるよう設計しました。

  1. SDカードや外部メディアの接続を検知
  2. 指定した保存先(NAS上のアーカイブ領域)へ、EXIFの撮影日時に基づいてディレクトリを自動生成してコピー
  3. ディレクトリの日付フォーマットは設定から柔軟に変更可能(例: YYYY/YYYY-MM-DD/, YYYY/MM/ など)

アーキテクチャと技術スタック

長期的な保守性とパフォーマンスを確保するため、コアロジックとmacOSネイティブUIを明確に疎結合で分離しました。

レイヤー 実装技術 役割
コアエンジン C++ 画像デコード、EXIFメタデータ解析、SQLiteカタログ・アルバム管理、サムネイルキャッシュ生成、ディレクトリ走査
GUI (macOS) Swift / SwiftUI (AppKit) macOSネイティブの滑らかな操作感、ドラッグ&ドロップ、キーボードショートカット、金属的なレスポンス

コア部分を C++ で記述しているため、将来的に Linux や Windows 向けに Qt 等を用いてUIをリビルドできる余地を残していますが、現時点では自分が最も日常的に使う macOS 環境での手触りにフォーカスしています。

開発プロセス:Claude Code による Agentic Coding

今回の開発においてAgentic Codingを利用しました。全て **Claude Code (Sonnet 5.5) に自律的にタスクを実行・検証させました。

コア機能はわずか3時間で自律実装

ファイルシステムの走査、EXIFの日付パース、SQLiteカタログデータベースのスキーマ構築、サムネイル生成パイプラインといったバックエンド基盤は、明確な要件指示を与えたエージェントが自律的にコード生成、ビルド、テストを回すことで、わずか3時間程度で動作する状態 まで組み上がりました。

人間の役割は意思決定とUIの手触りの検証

バックエンドの骨組みが瞬時に出来上がったため、開発者である人間が注力すべきポイントは明確でした。

  • C++側のデータ構造やAPIシグネチャの設計方針の決定
  • 数千〜数万枚の写真が並ぶグリッドの仮想スクロール表示
  • NAS経由でのサムネイル遅延読み込みとキャッシュ戦略
  • サイドバーのドラッグ&ドロップ操作感やキーボードナビゲーションのチューニング

現在の状況と今後の展望

Focal は現在、オープンソースとして GitHub でコードを公開 しています。

自分用のツールとしてはすでに常用できる完成度に達していますが、いきなり Mac App Store に申請するのではなく、まずは Apple の公証を通した DMG パッケージによるテスト配布 を実施しています。

公証を通しておくことで、Gatekeeper にブロックされることなくテスターの Mac でスムーズに起動できます。実際の様々な NAS 環境やカメラの RAW ファイルでの動作フィードバックを集め、不具合修正やパフォーマンスの改善を重ねているところです。

今後さらに安定して完成度が高まり、気が向いたら Mac App Store への登録も検討するかもしれませんが、まずはこの自分が最も使っていて気持ちいい道具を地道に育てていこうと思います。

この記事へのコメント