Idea, Concept, and Technology

アイデアを形に

Linory v1.2.0 — 写真から人生のマイルストーンを発見

Linory v1.2.0 をリリースしました。

v1.0 で「人生を一本の曲線で描く」体験を作り、v1.1 でウィジェットによって「記録のハードル」を下げました。v1.2 のテーマは 「振り返りの解像度を上げる」 です。

最大の変更は、写真ライブラリから人生の節目を自動で見つけ出してくれる新機能です。すべてオンデバイス処理。サーバには何も送りません。

Linory

Linory

  • icot
  • ライフスタイル
  • 無料
apps.apple.com

写真からマイルストーンを自動提案

設定画面の「マイルストーン提案」をタップすると、Linoryがあなたの写真ライブラリを分析して、4種類の節目を見つけ出します。

  • 🛫 旅行 — 写真の位置情報から「ホーム」を推定し、そこから100km以上離れた連続日を旅行候補として抽出。地名は逆ジオコーディングで自動取得(例: 「2018年8月 沖縄への旅行」)
  • 🏠 引っ越し — 月単位の写真の中央位置を3ヶ月単位で比較し、50km以上シフトして安定した遷移点を引っ越し候補として検出
  • 📸 特別な日 — 1日に15枚以上の写真がある日を「何かあった日」として抽出
  • 🎂 記念日候補 — 同じ月日に3年以上にわたって写真がある日

提案には代表写真のサムネイルと、旅行・引っ越しは地図サムネイルも付きます。地図をタップすると Apple Maps が起動。「追加」を押せばイベントとして登録され、選んだ代表写真も自動で紐付き。「すべて追加」で一気に取り込むこともできます。

純粋なヒューリスティック(位置・日付の幾何的な計算)だけで実装しているので、Apple Intelligence非対応のデバイスでも動きます。LLMを使う必要すらない、という発見が個人的には嬉しい結果でした。

通知機能

ウィジェットで「記録するきっかけ」を作ったので、次は「思い出すきっかけ」を作りました。

  • 毎日のムード記録リマインダー — お好きな時刻(例: 20:00)に「今日の気分は?」と通知。タップするとQuickMoodViewが開き、すぐに記録できます
  • 「○年前の今日」通知 — 朝の指定時刻に、過去の同じ日に記録したイベントをまとめて通知。「3年前: ハワイ旅行 / 1年前: 転職」のように複数年の出来事を1つの通知に集約

両方とも設定画面でON/OFF切り替え可能。すべてローカル通知なので、APNsもサーバも不要です。

複数写真対応

これまで1イベントには1枚しか写真を紐付けられませんでしたが、複数枚に対応しました。タイムライン上には1枚目を表示し、複数ある場合は「+N」のバッジで枚数を示します。マイルストーン提案から登録する場合も、代表写真がそのまま紐付くようになっています。

データモデルを EventPhoto という別エンティティに切り出してリレーション化したので、今後の拡張(順序入れ替え、キャプション、ALT属性など)もしやすくなりました。既存ユーザーの旧データは初回起動時に自動で移行されます。

連続入力モード & 一括インポート

「初回セットアップで過去のイベントを大量に登録したい」というケース向けに、2つの入力経路を追加しました。

  • 連続入力モード — イベント追加画面で「保存して次へ」ボタン。フォームをリセットしてシートを閉じずに次のイベントを連続で記録
  • 一括インポート — 設定画面から、カンマ区切りのテキストを貼り付けて一括取り込み(2020/4/1, 就職, 80 のような形式)

開発者を応援する Tip Jar

設定画面の末尾に、任意の額で開発者を応援できる Tip Jar を追加しました。¥200 / ¥500 / ¥1500 の3段階。機能制限はありません。気に入ってくれた方からの応援は、開発を続ける大きな励みになります。

大規模データのパフォーマンス改善

これは裏側の話。マイルストーン機能で大量の過去イベントを一括追加できるようになった結果、データポイント数が400個・写真数も同じくらい多いユーザー(自分です)でスクロールが固まる問題が発生。

地道に計測しながら以下を改修しました:

  • EventPhoto の遅延ロード — SwiftDataの外部ストレージI/Oをキャッシュミス時のみに限定
  • 画像のダウンサンプリング + キャッシュ — CGImageSourceCreateThumbnailAtIndex で表示サイズに合わせてデコード
  • 写真オーバーレイの Canvas 統合 — SwiftUIのImage Viewを廃して単一Canvasパスで描画
  • POD スナップショット化 — 毎フレームのSwiftDataプロパティアクセスを排除
  • ズームに応じた制御点・マーカーの間引き — Catmull-Rom補間の入力点数を削減

結果、定常状態で平均5ms/フレーム = 60fps を安定して達成しました。

その他の改善

  • 設定画面から誕生日を編集可能に
  • 新規ユーザーのオンボーディング にマイルストーン提案ページを追加。チュートリアル完了後に「今すぐ試す」シートが自動表示
  • 既存ユーザー向けのアナウンス — アップデート後の初回起動で1度だけ新機能を紹介(次回以降は表示しない)

次に向けて

データの可視化基盤は揃ってきたので、次は統計・インサイトに取り組みたいと考えています。月別・年別のムード推移グラフ、カテゴリ別の傾向、人生全体のサマリーなど。

App Storeで無料ダウンロードできます。ご感想・ご要望をお待ちしています。