From f35d8ba5ccfe7c985e3acf792a802cfecfc330e7 Mon Sep 17 00:00:00 2001 From: botandbang <337765928+botandbang@users.noreply.github.com> Date: Mon, 2 Nov 2026 09:10:04 -0500 Subject: [PATCH] fix(web): tie the privacy copy to who can read each space A memberspace policy can make a space publicly readable, so data is not private just because it sits in a space. The booking details hint, the about and sign-in pages, the footer and the READMEs now say who can read each kind of data. The privacy page says Local Network hosts and indexes booking threads, and covers act, party and venue spaces. Part of LOC-157. --- README.md | 2 +- apps/web/README.md | 6 +++--- apps/web/src/lib/components/ProjectForm.svelte | 2 +- apps/web/src/routes/+layout.svelte | 2 +- apps/web/src/routes/about/+page.svelte | 6 +++--- apps/web/src/routes/login/+page.svelte | 2 +- apps/web/src/routes/privacy/+page.svelte | 6 ++++-- 7 files changed, 14 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 938a7df0d..b70c754b4 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Tools for DJs and the people who book them, built on the AT Protocol. Each tool | Tool | What it is | Built with | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | ------------------------- | -| [Local Network](apps/web) | The website at localnetwork.computer: promoters find local DJs, DJs keep a profile, bookings run in private spaces | SvelteKit, atproto spaces | +| [Local Network](apps/web) | The website at localnetwork.computer: promoters find local DJs, DJs keep a profile, bookings run in member-only spaces | SvelteKit, atproto spaces | | [locallibrary](apps/locallibrary) | A command line tool and terminal player that keeps rekordbox USB drives in sync, backed up and edited | Rust | | [localtoolbox](apps/localtoolbox) | A Chrome extension for digging on SoundCloud: track lists, download links, artists' socials, and a queue to batch them | Svelte, Manifest V3 | diff --git a/apps/web/README.md b/apps/web/README.md index 47a35fc2f..c267d6f2b 100644 --- a/apps/web/README.md +++ b/apps/web/README.md @@ -2,7 +2,7 @@ Promoters find local DJs who fit their shows. DJs (called _projects_: a solo DJ, a b2b duo, a group, or a collective) get a profile built around what promoters book on: sound, distance, slot, room size, and budget. Fans follow DJs and see where they play next. -All data lives on the AT Protocol. Public profiles are ordinary atproto records; everything private (requests, staff roles, the audit log, booking threads, personal planners) lives in [atproto spaces](https://atproto.com/blog/atproto-spaces-alpha), the protocol's permissioned-data extension. Published projects, the DJ stats, sets, press kits, shows and follows their managers and fans publish, and the few Bluesky and userinput.app records the site reads are indexed by [HappyView](https://happyview.dev), an AppView whose Lua scripts answer directory search and the show matcher and serve those records to the site. The app keeps its own SQLite index only for space data, and can rebuild it from the network. Every public record is read through HappyView, never straight from a PDS or Bluesky's AppView (see [Directory](#directory) for the few exceptions); writes go to the PDS. +All data lives on the AT Protocol. Public profiles are ordinary atproto records; everything else (requests, staff roles, the audit log, booking threads, personal planners) lives in [atproto spaces](https://atproto.com/blog/atproto-spaces-alpha), the protocol's permissioned-data extension, where each space's read policy decides who can read it. Published projects, the DJ stats, sets, press kits, shows and follows their managers and fans publish, and the few Bluesky and userinput.app records the site reads are indexed by [HappyView](https://happyview.dev), an AppView whose Lua scripts answer directory search and the show matcher and serve those records to the site. The app keeps its own SQLite index only for space data, and can rebuild it from the network. Every public record is read through HappyView, never straight from a PDS or Bluesky's AppView (see [Directory](#directory) for the few exceptions); writes go to the PDS. > Atproto spaces is an alpha (released 2026). This app is built against `@atproto/*@0.0.0-spaces-alpha-20261022141228` and the [0016 spaces proposal](https://github.com/bluesky-social/proposals/tree/main/0016-permissioned-data). Expect breaking changes upstream; all versions are pinned. @@ -96,8 +96,8 @@ All data lives on the AT Protocol. Public profiles are ordinary atproto records; | Press kits' private part, requests and grants | One space per press kit under the root | Root (content, grants), askers | Managers, granted | | Press kit drafts (`computer.localnetwork.epk.draft`) | Each manager's repo in the project's backstage space | Managers | The project's managers | | Press kit view receipts | The app's database only | The app | The project's managers | -| People in acts, parties and venues (`computer.localnetwork.people.*`) | One space per performer, party or venue under the root | Root, for its people or staff | Its people, staff | -| Directory listing status (`computer.localnetwork.listing.status`) | The same space | Root, after staff action | Its people, staff | +| People in acts, parties and venues (`computer.localnetwork.people.*`) | One space per performer, party or venue under the root | Root, for its people or staff | Members (staff via app) | +| Directory listing status (`computer.localnetwork.listing.status`) | The same space | Root, after staff action | Members (staff via app) | | Bluesky display names (`app.bsky.actor.profile`) | The account's own public repo | The account, in any Bluesky app | Admins, via HappyView | | Managers' Bluesky follows (`app.bsky.graph.follow`) | The manager's public repo | The manager, in any Bluesky app | The app, via HappyView | | The bug report space (`app.userinput.space`) | Its owner's public repo on userinput.app | userinput.app | The app, via HappyView | diff --git a/apps/web/src/lib/components/ProjectForm.svelte b/apps/web/src/lib/components/ProjectForm.svelte index b7fe1bb1c..3b6077d27 100644 --- a/apps/web/src/lib/components/ProjectForm.svelte +++ b/apps/web/src/lib/components/ProjectForm.svelte @@ -87,7 +87,7 @@ {#if showDetails} - +
diff --git a/apps/web/src/routes/+layout.svelte b/apps/web/src/routes/+layout.svelte index a0ef4b791..3061483fc 100644 --- a/apps/web/src/routes/+layout.svelte +++ b/apps/web/src/routes/+layout.svelte @@ -90,6 +90,6 @@ Tools Report a bug - Records on the AT Protocol · private data in atproto spaces + Records on the AT Protocol · private data in spaces only their members can read
diff --git a/apps/web/src/routes/about/+page.svelte b/apps/web/src/routes/about/+page.svelte index 19bbec0ee..b94fe54e5 100644 --- a/apps/web/src/routes/about/+page.svelte +++ b/apps/web/src/routes/about/+page.svelte @@ -5,19 +5,19 @@
-

Local Network stores its data on the AT Protocol, not in a private database. Public profiles are ordinary atproto records; everything private uses atproto spaces, the protocol's permissioned-data extension. The app keeps a local index for fast search, and it can rebuild that index from the network.

+

Local Network stores its data on the AT Protocol, not in a private database. Public profiles are ordinary atproto records. Everything else sits in atproto spaces, the protocol's permissioned-data extension, and each space's read policy decides who can read it. The app keeps a local index for fast search, and it can rebuild that index from the network.

Projects

A project is a DJ act: a solo DJ, a b2b duo, a group, or a whole collective. Published projects are computer.localnetwork.project records in the Local Network root account's public repo. Only the root account writes them, after an admin adds a project or a moderator approves a request, so nobody can change a profile without review.

Requests and claims

-

Anyone with an atproto account can list a new project, claim one an admin added, or propose changes to a project they manage. Each request is written into your own repo, inside the root account's private moderation space. Only staff can read that space. Decisions are recorded by the root account in the same space.

+

Anyone with an atproto account can list a new project, claim one an admin added, or propose changes to a project they manage. Each request is written into your own repo, inside the root account's moderation space, which only staff can read. Decisions are recorded by the root account in the same space.

Spaces we use

  • Audit log: anyone may write their own audit entries; staff read.
  • Moderation: anyone may file requests; staff read.
  • -
  • Staff: role assignments, written by the root account.
  • +
  • Staff: role assignments, written by the root account; staff read.
  • Industry: private booking details, readable by staff. Everyone else sees them through the site, in a press kit they've been let into.
  • Booking threads: one space per inquiry, shared only by the promoter and the project's managers.
  • Your planner: a personal space under your own DID, like bookmarks. We keep no copy.
  • diff --git a/apps/web/src/routes/login/+page.svelte b/apps/web/src/routes/login/+page.svelte index c19ad833e..a535bca2d 100644 --- a/apps/web/src/routes/login/+page.svelte +++ b/apps/web/src/routes/login/+page.svelte @@ -43,7 +43,7 @@
    • You approve exactly what we can do on your PDS: write your own requests, bookings and audit entries into Local Network's spaces, and keep a private planner.
    • -
    • Private data uses atproto spaces. If your PDS doesn't support spaces yet, you can still sign in and we'll file things for you.
    • +
    • Your requests, bookings and planner go in atproto spaces that only the people involved can read. If your PDS doesn't support spaces yet, you can still sign in and we'll file things for you.
diff --git a/apps/web/src/routes/privacy/+page.svelte b/apps/web/src/routes/privacy/+page.svelte index 635e1fb57..7486964aa 100644 --- a/apps/web/src/routes/privacy/+page.svelte +++ b/apps/web/src/routes/privacy/+page.svelte @@ -18,8 +18,10 @@

Press kits

A press kit's public part is a record in Local Network's repo that anyone can read. The rest sits in a space under Local Network's account that only the project's managers, Local Network, and the people they let in can read. Asking to see it shares your handle and any message you write with the project's managers. Each person let in gets a record in that space saying so, which any of the managers can have deleted to take access away. Drafts of a press kit sit in each manager's repo in a space only the project's current managers can read.

When someone let in opens a press kit on this site, its project's managers see who and when. Local Network keeps that receipt for {data.retentionDays} days, and any of the managers can delete it sooner. The audit log keeps a record that the press kit was viewed, but not by whom.

-

Just you and the other party

-

Booking threads are readable only by the promoter and the project's managers. Your planner is readable only by you.

+

Acts, parties and venues

+

Each act, party and venue has a space under Local Network's account with who's in it, their roles, invites and requests to join, and whether it's listed in the directory. Only its people are members of the space, and staff see it through this site.

+

Booking threads and your planner

+

Each booking thread is a space under Local Network's account whose only members are the promoter and the project's managers. Local Network indexes the thread so the site can show it to them. Your planner is readable only by you.

On our server

We keep a search index derived from the records above, OAuth tokens needed to act on your behalf (encrypted at rest by your host's disk encryption), hashed browser session tokens, and an outbox of audit entries waiting to be written. Signing out revokes our OAuth session.

Your inbox lives only on our server. Each item says what happened and where (a new inquiry or message in one of your booking threads, say) but not what anyone wrote. Read items are deleted after 90 days and unread ones after 180.