feat: hidden items shown only to the participants an owner picks #1

Open
helix-a wants to merge 1 commit from feat/hidden-items into master
Member

Owners can add a hidden item and choose which of the list's participants can see it.

Behavior

  • Add hidden item (next to Add item) creates the item hidden from everyone, then opens a picker of the list's participants. Later, Choose who sees it, Hide and Show to everyone in the item's menu change the choice.
  • Owners always see the item. It shows a Hidden badge and the line "Only X and Y can see this".
  • Participants who aren't picked get nothing: not the item, its claim, its comments or its count in the list summary. Participants who are picked see a Hidden badge.
  • Hiding an item from someone drops their part in its claim, the same way removing them from the list does.

Backend (backend/src/lists.rs, items.rs)

  • Migration 0005: adds items.hidden and an item_viewers table.
  • The visibility rule lives in one place, lists::visible_to. It applies to the participant list_view, the shared_lists counts, every participant item RPC (claim, join, leave, open-to-share, comment), editing and deleting your own comment, and answer push notifications. An answer notification would otherwise leak the item's name.
  • Adds items.set-viewers { id, viewers: number[] | null }. items.add takes an optional viewers. Only owners can call either, viewers must be current participants, and neither works on off-list gifts.
  • Viewer rows are kept when someone is removed from the list, so they see the item again if re-added. Closing and rolling a list forward copies the hidden flag and the viewers.

Frontend

  • contacts-dialog.ts becomes the generic people-dialog.ts. Picking contacts and picking viewers share it instead of keeping two copies of the checkbox list.
  • viewers.ts owns the "who can see it" flow, used both right after creation and from the item's menu.

Also in this PR

  • @start9labs/start-sdk 3.0.6 → 3.1.1, the pre-PR SDK bump; tsc is clean.
  • Release notes are appended to the unreleased 1.1.0:0, which no registry serves yet.

Verified: cargo test (25 pass, including 4 new tests covering visibility, claim dropping, permission and validation rules, and roll-forward), make bindings, npm run check in web/ (strict templates, prettier) and npx tsc --noEmit. Not verified: I didn't build the .s9pk or click through the UI on a running instance; CI builds the package.
Helix-Harness: claude-code
Helix-Model: claude-opus-5-5

Owners can add a **hidden item** and choose which of the list's participants can see it. **Behavior** - **Add hidden item** (next to **Add item**) creates the item hidden from everyone, then opens a picker of the list's participants. Later, **Choose who sees it**, **Hide** and **Show to everyone** in the item's menu change the choice. - Owners always see the item. It shows a **Hidden** badge and the line "Only X and Y can see this". - Participants who aren't picked get nothing: not the item, its claim, its comments or its count in the list summary. Participants who are picked see a **Hidden** badge. - Hiding an item from someone drops their part in its claim, the same way removing them from the list does. **Backend** (`backend/src/lists.rs`, `items.rs`) - Migration `0005`: adds `items.hidden` and an `item_viewers` table. - The visibility rule lives in one place, `lists::visible_to`. It applies to the participant `list_view`, the `shared_lists` counts, every participant item RPC (claim, join, leave, open-to-share, comment), editing and deleting your own comment, and answer push notifications. An answer notification would otherwise leak the item's name. - Adds `items.set-viewers { id, viewers: number[] | null }`. `items.add` takes an optional `viewers`. Only owners can call either, viewers must be current participants, and neither works on off-list gifts. - Viewer rows are kept when someone is removed from the list, so they see the item again if re-added. Closing and rolling a list forward copies the hidden flag and the viewers. **Frontend** - `contacts-dialog.ts` becomes the generic `people-dialog.ts`. Picking contacts and picking viewers share it instead of keeping two copies of the checkbox list. - `viewers.ts` owns the "who can see it" flow, used both right after creation and from the item's menu. **Also in this PR** - `@start9labs/start-sdk` 3.0.6 → 3.1.1, the pre-PR SDK bump; `tsc` is clean. - Release notes are appended to the unreleased `1.1.0:0`, which no registry serves yet. **Verified:** `cargo test` (25 pass, including 4 new tests covering visibility, claim dropping, permission and validation rules, and roll-forward), `make bindings`, `npm run check` in `web/` (strict templates, prettier) and `npx tsc --noEmit`. **Not verified:** I didn't build the `.s9pk` or click through the UI on a running instance; CI builds the package. Helix-Harness: claude-code Helix-Model: claude-opus-5-5
feat: hidden items shown only to the participants an owner picks
All checks were successful
Build / build (pull_request) Successful in 16m2s
421693f4df
Helix-Harness: claude-code
Helix-Model: claude-opus-5-5
All checks were successful
Build / build (pull_request) Successful in 16m2s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 'feat/hidden-items:feat/hidden-items'
git switch 'feat/hidden-items'

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch 'master'
git merge --no-ff 'feat/hidden-items'
git switch 'feat/hidden-items'
git rebase 'master'
git switch 'master'
git merge --ff-only 'feat/hidden-items'
git switch 'feat/hidden-items'
git rebase 'master'
git switch 'master'
git merge --no-ff 'feat/hidden-items'
git switch 'master'
git merge --squash 'feat/hidden-items'
git switch 'master'
git merge --ff-only 'feat/hidden-items'
git switch 'master'
git merge 'feat/hidden-items'
git push origin 'master'
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
start9/wish-list-startos!1
No description provided.