綴Photo の勉強ノートに戻る
プロダクト設計2026.06.25

ログインを起動の壁にしない — ゲートは同期の側だけに置いた

設計判断local-first綴Photo

モバイルに本物のログインを足す作業のうち、「ログインをアプリのどこに置くか」だけを決めた回です。

綴Photo はデータをスマホのローカルに溜めます。ネットがなくても全部使えます。ログインが要るのは、その記録をクラウドに同期したいときだけです。

「ログインを足す」と聞くと、起動したらまずログイン画面、を思い浮かべます。でも綴Photo はログイン無しで全機能が成立します。だから起動時にログインの壁を立てないことにした。

置き場所。綴った言葉の正は端末 SQLite の photos と meanings。ログイン無しでも閉じても残る。アプリ本体。ログイン無しで全部使える。起動壁を立てない端末 SQLitephotos / meanings閉じても残る設定ログインを静かに置くゲート。ログイン済みのときだけ通す奥の機能。未ログインでは到達しない。同期 / 画像アップロードクラウド。同期したときだけ載る

ゲートは同期の側に足す

同期と画像アップロードの導線は、もともと開発中だけ出すゲートの内側にあった。そこに「ログイン済みなら」を一つ足して、未ログインのときは同期に手が届かないようにした。

dart
// 開発中だけ出す(本番に出さない)に加えて「ログイン済み」を要求
// =未ログインのままクラウド送信に到達させない
if (kDebugMode && loggedIn) ...[
  syncTile,
  uploadTile,
],

条件を一つ足しただけだ。ログインしていない人から見ると、アプリの挙動は今までと何も変わりません。

どこにゲートを置くかは、何を守るアプリかで決まる

同じ「ログインを足す」でも、銀行アプリなら起動時の壁が正しいです。守るものが口座の中身なので、開いた時点で本人でなければ困ります。綴Photo が守るのは端末の中に溜まった言葉で、それはログインの有無に関係なく本人のものです。

口座は銀行のサーバ DB。言葉は端末 SQLite の photos と meanings。どちらも閉じても残る。銀行アプリ守るもの。口座銀行のサーバ DB。閉じても残る壁は起動時開いた時点で本人でなければ困る綴Photo守るもの。綴った言葉端末 SQLite photos / meanings壁は起動には無いゲートは同期の手前だけ

ここを決めずに「ログインといえば起動時の画面」で作り始めると、ローカルだけで完結する強みを、自分の手で入口に閉じ込めることになります。

壁にしないと決めたぶん、ログイン状態は「設定を見れば分かる」程度に静かに見せればいい。その「見せる」ほうで詰まった話は別記事に書いた。

この記事は2026年6月時点の自分の理解で書いています。仕様や認識が変わってる可能性があります。