← psybertechno:geo

プライバシー

何を送信し、何を端末に留め、誰に渡るのか。一般論ではなく、実際のコードにあることだけを書いています。

対象バージョン:v0.1.3 / 最終更新:2026-07-30

まとめ

デバイスID

初回に、ランダムな UUID(v4)を1つ生成して端末の localStorage に ptg:device-id というキーで保存します。これは認証ではなく、公開した内容の帰属と、サーバー側のレート制限・不正利用対策のためだけの匿名IDです。氏名・メール・広告IDなどとは結び付いていません。

ブラウザのストレージを消すか、別のブラウザ・別の端末を使うと、別のIDになります(プライベートモードなどストレージが使えない環境では、ページを開くたびに使い捨てのIDになります)。バックアップの書き出し/取り込みでは、このIDも一緒に移せます。

サーバーに送信するもの

送信が起きるのは次の場面だけです。それぞれ、何が送られ、何が保存されるかを列挙します。

1. 公開する(PUBLISH)

あなたが EDIT MENU から明示的に PUBLISH したときだけ送信されます。送るもの:

  • レイヤー(AREA / SPOT)とマスのID・座標
  • 編集したパターン(ステップ・音程・分解能などの内容そのもの)
  • トライブ(RED / GREEN / BLUE)
  • ジェネレータのバージョン
  • 再送を重複させないためのキー(冪等キー)
  • デバイスID
  • Cloudflare Turnstile のトークン(ボット判定用)
  • 位置情報が取得できている場合は、そのときの測位(緯度・経度・精度・取得時刻)

サーバー(Cloudflare D1)に保存されるもの:上記のリビジョン一式(レイヤー・マスID・座標・連番・デバイスID・パターン・ジェネレータバージョン・冪等キー・作成時刻・トライブ)、測位(緯度・経度・精度)、その測位がマスの中だと確認できたかどうかのフラグ、および Cloudflare が接続元IPから判定した国コード。国コードは記録するだけで、これを理由に拒否することはありません。

測位はマスの中にいることの確認に使われ、確認に使ったのち緯度・経度が保存されます。位置情報が取得できていない場合、測位は送られず「未確認」として記録されます。

2. 足跡ビーコン

再生中に同じマスに一定時間滞在すると、「そのマスが実際に聴かれた」ことを伝える小さな信号が送られます。風化(decay)の時計をリセットし、足跡ヒートマップを作るためのものです。

送るもの:聴かれたマスのレイヤーとID、およびデバイスID。

保存されるもの:マス単位の集計だけ(レイヤー・マスID・座標・累計回数・最終時刻)。デバイスIDはデータベースに保存されません — リクエスト処理中のレート制限用にメモリ上で使われるだけで、リクエストが終われば消えます。誰がどこを聴いたかの記録は残りません。

地図に出る粒度:足跡ヒートマップは AREA(約250m四方)より細かくは表示しません。SPOT(約70m四方)の足跡は、すべて所属する AREA に合算した形でしか地図に出ませんし、API も SPOT 粒度では返しません(地図をどれだけ拡大しても同じです)。SPOT 単位の集計は風化(decay)の時計のために記録し続けますが、「誰かがその住所に立っていた」と読めてしまう粒度では見せない、という考え方です。

時刻についても同じ考え方です:外に出る「最後に聴かれた時刻」は日単位に丸めます(その日の 00:00 UTC)。ミリ秒のままだと「このマスに 14:32 に誰かがいた」という記録になってしまうためです。風化の計算はもともと日単位なので、丸めても音は変わりません(PUBLISH の時刻は丸めません。公開は意図的な行為で、帰属のある記録です)。

3. 通報エンドポイント

アプリ内に通報ボタンはありません(公開済みのマスは自由記述・画像・音声を含まず、通報が守るべき実害が乏しいため撤去済み)。エンドポイント自体は運営・お問い合わせ経由の通報や、将来のジャーニー通報のために残しています。使われた場合に送信されるもの:対象のレイヤーとマスのID、デバイスID、(あれば)理由のテキスト。保存されるもの:同じ内容と受付時刻、対応状況。詳しくはヘルプ

4. ジャーニーを共有する

ジャーニーには GPS の軌跡が丸ごと入っています。共有したリンクを受け取った人は、あなたが歩いた経路をそのまま再生できます。自宅・職場・通勤経路が推定できます。

共有は必ずあなたの明示的な操作で行われ、その前に必ずプライバシー確認のダイアログが表示されます。録音しただけ・保存しただけでは、何も送信されません。

送るもの:ジャーニーのイベント列(GPS とリスニングの軌跡、マスごとのパターンと音色のスナップショット、地図タップによるジャンプ、録音中の編集、PLAY / STOP)を gzip 圧縮したもの。あわせてタイトル・開始時刻・長さ・イベント数、デバイスID、Turnstile のトークン。

保存されるもの:ジャーニーの本体は Cloudflare R2 に、メタデータ(ID・タイトル・開始時刻・長さ・イベント数・サイズ・デバイスID・作成時刻・取り下げ状態)は D1 に保存されます。ここでのデバイスIDは、悪用時にモデレーションできるよう意図的に保存しています。

共有IDはランダムな12文字です。リンクを知っている人は誰でも再生できます。

5. 世界を読み込む

再生同期の基準時刻や、いま表示している範囲の公開済みデータを読み込むリクエストです。デバイスIDは送られません。送られるのは、必要としている区画の座標だけです。ただし通信である以上、Cloudflare には接続元のIPアドレスとリクエスト時刻が渡ります。

保存期間と削除

端末に留まるもの(共有しない限り送信されません)

ブラウザのサイトデータを消すと、これらはすべて消えます(すでに公開した内容や共有したジャーニーは、サーバー側に残ります)。

位置情報について

ページを開くだけで通信が発生する第三者

これらは、あなたが何も操作しなくても、ページの読み込みによって接続が発生します。各社にはあなたのIPアドレスとブラウザの基本情報(User-Agent など)が渡ります。

Cloudflare(ホスティング・API・データ保存)
サイトの配信とAPIの処理、および D1・R2 への保存を担っています。IPアドレス、接続元の国、リクエストの記録が渡ります。
Cloudflare プライバシーポリシー
Cloudflare Turnstile(ボット判定)
PUBLISH とジャーニー共有のときだけのボット対策です。スクリプトは EDIT モードに初めて入ったときに初めて読み込まれます — ただ聴いているだけなら読み込まれません。
Cloudflare プライバシーポリシー
CARTO(地図タイル)/ OpenStreetMap(地図データ)
地図の背景画像は CARTO の配信サーバーから読み込みます。どの範囲の地図を表示しているか(タイルの座標とズーム)が、IPアドレスとともに渡ります。地図データ自体は OpenStreetMap 由来です。
CARTO プライバシーポリシーOSM Foundation プライバシーポリシー
Google Fonts
アプリ本体は UI のピクセルフォントを読み込みます。ヘルプ・プライバシー・寄付窓口などの説明ページ(このページを含む)も、本文用の書体(LINE Seed JP)を読み込みます。いずれも fonts.googleapis.com / fonts.gstatic.com からの読み込みで、IPアドレスとブラウザ情報が Google に渡ります。
Google プライバシーポリシー
unpkg(CDN)
地図ライブラリ Leaflet のスタイルシートを unpkg.com から読み込みます。IPアドレスとブラウザ情報が渡ります。
Cloudflare Zaraz / Google Analytics(アクセス解析)
同意が得られた場合に、利用状況の計測のために読み込まれます。詳細と、位置情報などを送らないという線引きはアクセス解析の項に書いています。

これら以外に、外部へ通信するものは組み込んでいません。広告ネットワーク、SNS のトラッキングピクセル、A/Bテストツールの類はありません。

アクセス解析(Google Analytics)

サイト全体の利用状況を把握するために Google Analytics 4(GA4)を使っています。導入は Cloudflare Zaraz 経由で、アプリのコードに解析タグを直接埋め込む形はとっていません。

位置情報(GPS)、編集した音、ジャーニーの記録内容は、アナリティクスには一切送信されません。

解析が扱うのは「ページが見られた」という粒度までです。マス(セル)のID、緯度・経度、ジャーニーの中身、そして上記のデバイスID(ptg:device-id)を、解析のイベントパラメータやカスタムディメンションとして送ることはありません。これらが渡るのは、上に列挙した自分たちの API だけです。

解析が集めるもの

これらのイベントに乗るのは、上の括弧内にあるような決められた選択肢と小さな数字だけです。自由入力のテキストや識別子を渡せない形で実装しています。

URL の扱い — 情報ページとアプリ本体で違います

「どのページが読まれたか」を知るために URL を記録しますが、このサイトには性質の違う2種類のページがあるため、扱いを分けています。

情報ページ(このプライバシー、ヘルプ、寄付窓口)

URL をそのまま記録します/help//privacy//support/)。どの説明ページが読まれているかを知るためです。これらの URL に位置情報は含まれておらず、どのページを開いたかがわかるだけです。

アプリ本体

アプリの URL には現在地のマスが入っていて(/{zone}/{area}/{spot})、URL そのものが座標になっています。そのため、アプリのページビューは、マスの部分を取り除いた /(サイトのトップ)という一定の値に置き換えてから解析へ送ります。記録として残るのは「アプリが開かれた」ということだけで、この座標が解析側へ渡ることはありません。

歩いてマスが変わるたびにアドレスバーの URL は書き換わりますが、その書き換えが解析に送られることもありません。

つまり記録されるのは「情報ページのうちどれが読まれたか」までで、アプリ側の「どこにいたか」は、どのページの記録からも復元できません。冒頭の約束(位置情報・編集した音・ジャーニーの内容はアナリティクスに一切送信しない)は、この扱いによって保たれています。

同意について

解析の同意管理は Cloudflare Zaraz の同意ツールが担当しています。対象地域からの訪問者には、解析が動き出す前に同意を確認します。同意の内容は、同じ同意バナー(画面に表示される設定リンクから再度開けます)からいつでも変更・撤回できます。撤回すると、以後の解析は停止します。

解析が使う Cookie / 識別子

Google Analytics は、同じブラウザからの訪問をまとめて数えるために、Cookie(_ga など)またはそれに相当するローカルの識別子を使います。これらは このアプリ独自のデバイスID(ptg:device-id)とは完全に別物で、互いに結び付けていません。デバイスIDが解析側に渡ることも、解析の識別子がこのアプリの世界データに紐づくこともありません。

参考リンク: Google プライバシーポリシーGoogle Analytics のデータ利用についてCloudflare プライバシーポリシー(Zaraz)

Cookie

アプリ自身の状態(下書き・設定・ジャーニーなど)は Cookie ではなく localStorage / sessionStorage / IndexedDB に保存しています。Cookie を使うのは上記のアクセス解析と、その同意管理まわりです。ほかの第三者が独自に Cookie を設定する場合もあります。

子どもの利用について

アカウントも決済もなく、氏名や連絡先を集めることもありません。ただし位置情報を扱うため、お子さまが使う場合は保護者の方の判断のもとでご利用ください。特にジャーニーの共有は、移動経路がそのまま相手に渡ります。

削除・訂正の依頼

変更について

内容を変更した場合は、このページの「最終更新」の日付を更新します。