GEOFRAME

Self-hosted photo management

撮った写真を、手元で整えて、見せる準備まで。

GEOFRAME は、ローカルフォルダや Google Drive の写真を SQLite に索引し、表示用画像の生成、品質解析、撮影地の修正、旅行ブログの下書きまでを 1 つの Rust 製バイナリで行うセルフホスト型の写真管理基盤です。AI による検索や場面の整理は任意で、写真の表示は別プロジェクトの miharashi が担います。

散らばった写真が地図の上で撮影地ごとに整理され、フォトフレームに映るまでの流れ
イメージ図です。実際の画面ではありません。

Overview

管理は GEOFRAME、表示は miharashi

GEOFRAME は写真を整えて、表示クライアントが読む「写真フィード」を提供します。画面に出すところは、別のプロジェクトに任せています。

  1. 写真ローカルフォルダ、Google Drive。原本は変更しません。
  2. GEOFRAMEカタログ(SQLite)、表示用画像、品質解析、撮影地、旅行ブログ、任意の AI。
  3. 写真フィードGET /api/v1/photos と /derivatives/ を HTTP で配信します。
  4. miharashiフィードを読み、写真を画面に表示する別プロジェクトです。
説明用の図です。実際の画面ではありません。表示は miharashi が担い、GEOFRAME との接点は写真フィードの契約だけです。

Features

できること

Catalog

ローカルと Drive をひとつのカタログに

ローカルフォルダと Google Drive の写真を SQLite に索引します。HEIC にも対応します。Drive へはサービスアカウントの読み取り権限で接続し、原本は書き換えません。

Display image

表示用画像の生成

長辺 2560px の JPEG を別に作ります。向きを補正し、EXIF(GPS を含む)は残しません。原本は手を付けずに残ります。

Quality

品質解析と代表選び

鮮明度・露出・クリッピングなどを解析し、似た写真の中から勧める写真を決めます。お気に入りにした写真は、AI の判定より優先します。

Location

撮影地の推定と修正

位置の無い写真は、前後の写真から撮影地を推定し、逆ジオコーディングで地名を付けます。管理画面の地図で手で直した位置は、その後の自動の推定で上書きしません。

Travel blog

旅行ブログの下書き

旅程の JSON と写真カタログを照合し、日別の下書きを作ります。確認して整えたあと、EXIF を除いた画像つきの静的 HTML として書き出せます。公開は自動では行いません。

AI (optional)

言葉で探す、場面を整理する

任意で、言葉による写真検索、同一場面の整理、撮影地の手がかりの判定を使えます。LAN 内のモデルサービスと、クラウドのどちらにも切り替えられ、設定するまで動きません。

Workflow

使い方の流れ

取り込みを有効にすると、写真の取り込みから品質解析までが順に進みます。

  1. 取り込む

    写真をデータディレクトリ内の photos/(起動例では ./var/photos/)に置くか、Google Drive のフォルダを指定します。EXIF の撮影時刻と位置をカタログに記録します。

  2. 整える

    表示用画像の生成と品質解析が自動で進みます。位置の無い写真は、管理画面で確認して地図から直せます。

  3. まとめる

    旅行ブログの下書きを作って確認し、必要なら静的 HTML として書き出します。AI を設定していれば、言葉での検索も使えます。

  4. 見せる

    miharashi などの表示クライアントが、写真フィードを読んで写真を表示します。

Data & network

外部との通信と、いまの状態

GEOFRAME は自分のサーバーで動かしますが、設定した機能によっては外部のサービスと通信します。

写真の外部送信は任意。取り込み時には座標を送信します

  • Google Drive: サービスアカウントの鍵を設定したときだけ、Drive のフォルダを読みます。
  • 自動の地名・標高補完: GEOFRAME_INGEST=1 で取り込むと、国内の未処理座標を地理院の逆ジオコーダ・標高 API へ送ります。Drive・AI の設定や管理画面の操作は不要です。
  • 地図と地名検索: 管理画面で位置を直すとき、OpenStreetMap・地理院のタイルと、地理院・Nominatim の地名検索へ通信します。座標や検索語が上流へ渡ります。
  • クラウド AI: AI の設定ファイルを置き、クラウドを許した用途だけ、縮小して EXIF を除いた写真が外部の API(Google Cloud の Gemini)へ送られます。課金が発生します。用途ごとの上限は設定で決められます。
  • 認証はありません: 信頼できるローカルネットワークで使うか、認証付きのリバースプロキシの内側に置いてください。インターネットへ直接公開しないでください。

Setup

動作環境と導入

配布用のバイナリはまだありません。ソースからビルドして使います。

動作環境

  • 動作を確認しているのは、x86_64 の Linux(x86_64-unknown-linux-musl の静的ビルド)です。
  • ビルドには Rust の安定版ツールチェーン(rustup)が要ります。Python は要りません。
  • systemd が利用可能な Linux で、非 root ユーザーとして実行します。起動時に systemctl show で旧サービスの非稼働を確認するため、systemd へ接続できないコンテナなどでは取り込み付きの起動に失敗します。
  • Google Drive と AI の連携は任意です。
  • 本番の配布(systemd、更新、バックアップ)は、リポジトリのデプロイガイドにあります。

起動する

git clone https://github.com/ysogabe/geoframe.git
cd geoframe
cargo build --release -p geoframe
GEOFRAME_INGEST=1 ./target/release/geoframe serve \
  --listen 127.0.0.1:8080 --data-dir ./var

写真は ./var/photos/ に置きます。ブラウザで http://127.0.0.1:8080/ を開くと管理画面が表示されます。GEOFRAME_INGEST=1 のときだけ、取り込みと画像の生成が進みます。無いときは、カタログに書き込まない状態で起動します。設定の全項目は設定リファレンスにあります。

FAQ

よくある質問

ログインや認証はありますか?

ありません。GEOFRAME には利用者認証がなく、管理画面と API には誰でも届く前提です。信頼できるローカルネットワークで使うか、認証付きのリバースプロキシの内側に置いてください。インターネットへ直接公開しないでください。

写真はクラウドの AI に送られますか?

AI の設定ファイルを置き、クラウドを許した用途だけです。何も設定しなければ、AI の推論は始まらず、写真は外へ出ません。クラウドを許したときは、縮小して EXIF を除いた画像が外部の API へ送られ、課金が発生します。用途ごとの 1 周期あたりの上限も設定できます。

写真と GPS はどう扱われますか?

原本は変更しません。カタログ(SQLite)には、撮影時刻と座標、手で直した位置、お気に入りを保存します。表示用画像と、旅行ブログの書き出しに使う画像は再エンコードするので、EXIF(GPS を含む)は残りません。旅行ブログの画面の API は、正確な座標を返しません。

スライドショーのような表示はできますか?

表示は GEOFRAME の仕事ではありません。別プロジェクトの miharashi が、GEOFRAME の写真フィードを読んで表示します。GEOFRAME は、かつて持っていた Web キオスクや各種の表示機能を 2026 年 10 月に miharashi へ移しました。

カタログのバックアップは必要ですか?

必要です。カタログ(catalog.db)には、手で直した GPS、お気に入り、有料で生成した AI の埋め込みなど、作り直せないデータが入ります。稼働中のデータベースを cp でコピーせず、SQLite の .backup を使ってください。

Read more

ソースと文書