Skip to content

epic(lists): audit existing work and define the implementation plan #8198

Open
8 of 28 issues completed
Open

Description

@NotThatKindOfDrLiz

Owner: Sebastian (@Chardot)

Goal

Turn Lists into a usable, shareable, extensible feature that can support both user needs and editorial/featured-feed programming.

Context

Lists are considered a priority. Earlier BGV designs were approved and described as dev-ready. Sebastian should review those designs against current product needs and existing implementation work before new development begins.

Key product needs

  • Create and view lists.
  • Add new items to an existing list over time; lists should not remain static.
  • Share lists via a reliable public/share link.
  • Find lists more easily through improved search and discovery.
  • Support collaborative or co-created lists, where appropriate.
  • Support public lists as Featured Feed content.
  • Make lists usable for editorial programming tied to a content calendar, including scheduled featured placement.

Example: a "Purpose of Divine" list created in May is useful editorial content, but it is currently static and difficult to share. Lists should support ongoing additions and easy promotion.

Investigation required

  1. Search GitHub for all existing issues, PRs, branches, labels, and references related to: lists, list sharing, public lists, collaborative lists, featured lists, saved lists, collections, list search/discovery, BGV designs.
  2. Review the existing Lists designs and identify what is already approved and ready to build, what no longer matches current requirements, and what design decisions are missing.
  3. Review current implementation status across mobile, web, backend, and any relevant Nostr/Funnel Cake data model work.
  4. Identify duplicate, stale, blocked, or overlapping issues and link them rather than recreating work.
  5. Update this umbrella issue with a concise inventory of existing work and recommended issue structure.

Deliverables

  • A linked inventory of relevant existing issues, PRs, designs, and code paths.
  • Clear status for each item: shipped, in progress, blocked, outdated, duplicate, or not started.
  • A proposed phased plan:
    • V1: core list creation/viewing plus reliable sharing.
    • V2: adding to lists, public-list discovery/search, Featured Feed integration.
    • V3: collaborative/co-created lists and any advanced permissions/moderation needs.
  • Proposed technical approach and dependencies across mobile, web, backend, and relay/data layers.
  • UX open questions, including ownership, edit permissions, collaboration, visibility, deletion, and share-link behavior.
  • A set of child issues or updates to existing issues, with owners and sequencing.

Acceptance criteria

  • We know exactly what Lists work already exists and where.
  • Existing work is linked and consolidated rather than duplicated.
  • Sebastian has a clear recommended starting point for implementation.
  • The plan supports public/editorial lists for Featured Feed scheduling.
  • The team can make a prioritization decision based on a defined V1, dependencies, and open questions.

Starting inventory (first pass, 2026-08-26)

This is a research pass to seed the work, not the finished deliverable. The headline finding is that most of V1 and a large share of V2 already exist and ship today — Lists is closer to a consolidation, polish and product-decision problem than a greenfield build.

No open umbrella existed

Both prior epics are closed and neither carries an inventory:

Issue State Note
#2261 epic(lists): lists CLOSED 2026-06-29 Body is a single Figma link (below). One sub-issue only (#3267).
#602 [Epic] 8. Curated Lists (NIP-51) CLOSED 2026-05-15 Legacy launch epic. Sub-issues #576 List Creation, #577 List Management, #578 Adding Videos, #579 List Viewing, #580 Special Lists, #1823 Collaborator — all closed.

This issue supersedes both as the live umbrella.

Designs to review

I could not verify the Figma node contents in this pass — the design-vs-current-requirements review is still open and is Sebastian's first task.

Data model as built

Two distinct kinds are in play and the naming in the codebase blurs them:

  • kind 30005 — curated video lists. What "Lists" means in the product sense. Public/private, ordered, collaborator tags.
  • kind 30000 — people lists. A separate feature (mobile/lib/features/people_lists/) sharing the FeatureFlag.curatedLists master switch.

Both sit behind FeatureFlag.curatedLists, which defaults ON (mobile/lib/features/feature_flags/services/build_configuration.dart:16). A second flag, FeatureFlag.profileListFeatures, defaults OFF and gates people-list entry points on profiles and search tiles. Worth an early decision on whether that flag still has a reason to exist.

Mobile — what ships today

CuratedListService (mobile/lib/services/curated_list_service.dart, 1847 lines) already implements essentially the full CRUD surface:

Capability Method Status
Create list createList Shipped
Add item over time addVideoToList Shipped — lists are not structurally static
Remove item removeVideoFromList Shipped
Edit metadata updateList Shipped
Delete deleteOwnedList Shipped (see open bugs)
Manual ordering reorderVideos / getOrderedVideoIds Shipped
Collaborators addCollaborator / removeCollaborator / canCollaborate Shipped
Subscribe to others' lists subscribeToList / unsubscribeFromList Shipped
Private lists NIP-44 encrypted items, PR #6661 Shipped
Tags / local search getListsByTag / searchLists Shipped

Other code paths:

  • mobile/lib/services/curated_list_relay_gateway.dart (700) — NIP-44 seal/unseal, NIP-09 redaction
  • mobile/packages/curated_list_repository/ — converter + relay discovery/search
  • mobile/packages/models/lib/src/curated_list.dart — model
  • mobile/lib/screens/curated_list_feed_screen.dart, curated_list_by_author_screen.dart, discover_lists_screen.dart
  • mobile/lib/widgets/add_to_list_dialog.dart — add-to-list entry point, reachable from the video share action, profile list grid and the Explore Lists tab
  • mobile/lib/screens/search_results/widgets/lists_section.dart — Lists results in search
  • mobile/lib/router/route_paths.dart — /list/{listId}, /list/{pubkey}/{listId}, /discover-lists, /people-lists/new

So the "Purpose of Divine list is static" complaint is not a missing capability. Adding items works. The likely causes are discoverability of the add-to-list entry point, or the list not being owned/public in the shape the sharing path requires. Worth reproducing against that specific list before scoping any build.

Sharing — the real V1 gap

curated_list_feed_screen.dart:415-485. The share action is gated on isOwned && isPublic && pubkey != null:

  • A viewer looking at someone else's public list gets no share action at all. Only the owner can share.
  • A public list whose local record has no author pubkey silently loses the menu entry.
  • The URL is hand-built as 'https://divine.video' + /list/{pubkey}/{listId} at the call site rather than through a shared share-link builder.

Deep links themselves are in place — mobile/docs/DEEP_LINK_URL_REFERENCE.md:248-266,282-283,362 documents both /list/{listId} and /list/{pubkey}/{listId}, and divine-web#482 added /list/* to the Apple app-site-association. The /list/{listId} (no pubkey) form resolves only against local data, which is why it is not a durable share target. "Reliable public/share link" is mostly a matter of always using the authored form and opening the action to non-owners.

Discovery and search — relay-only

DiscoverListsScreen and CuratedListRepository.searchAllLists query relays directly. Funnel Cake is used by the list repository only for thumbnail resolution (curated_list_repository.dart:396), and there is no Funnel Cake list search/discovery endpoint — POST /api/videos/bulk with from_event {kind: 30005, d_tag} resolves a known list's videos, nothing more (mobile/docs/FUNNELCAKE_API_REFERENCE.md:187). This is the structural reason list discovery is slow and thin, and the main backend ask for V2.

Open mobile issues

Protocol / correctness:

Discovery / UX:

Structure:

People lists (kind 30000):

Adjacent feature already scoped on kind 30005:

Recently shipped mobile PRs (context for "what changed since the design")

#6394 preserve addressable video tags · #6476 flag toggle no longer pops the screen · #6482 keep app-shell bloc on a live repository · #6502 stop background sync when the flag turns off · #6513 delete dialog fatal on a dead route · #6617 make owned lists visible and shareable · #6661 private lists via NIP-44 · #6729 notify when videos are added to public lists · #6760 show creator on subscribed lists · #6766 addressable list-add notifications · #6861 dismiss editor before relay ack · #7097 refresh discover list subscriptions · #7564 bound public list relay reads · #8034 stop a deleted list returning on next sync · #8054 keep private lists private during relay sync.

Also closed and worth reading for prior product decisions: #7724 (private→public downgrade on collaborative conflict), #7728 (owner captured once during backfill), and the two release-decision issues #8048 / #8049.

Web — divine-web

Substantially built, and further along on people lists than mobile in some respects:

Backend — Funnel Cake / featured feeds

This is the biggest surprise in the inventory: the Featured-Feed-from-public-list path is already built server-side.

No content-calendar issue exists anywhere in the org. An org-wide search for "content calendar" returns nothing. If editorial programming needs a calendar view rather than per-tab start/end dates, that is genuinely not started and needs its own scope.

Stale branches to triage or delete

origin/create-people-list, origin/feat/curated-list-repo-discovery, origin/feat/reliable-nostr-publish-pr5-lists, origin/fix/videoGridAndLists. No open Lists PRs on mobile or web.


Proposed phasing (for Sebastian to confirm or replace)

V1 — core creation/viewing plus reliable sharing. Mostly consolidation, not construction.

V2 — adding to lists, discovery/search, Featured Feed.

V3 — collaboration, permissions, moderation.

Open questions

  1. Ownership and edit rights on a collaborative list — who can add, remove, reorder, rename, delete? Today canCollaborate is a tag check with no per-action granularity.
  2. Share-link behavior for non-owners — should any viewer be able to share a public list? What does a private-list share attempt do?
  3. Editorial lists: whose account owns them? A Divine editorial list published from a staff npub behaves like any user list, including deletion. Is that acceptable for programmed featured content?
  4. Deletion semantics — what happens to a list that is currently live in a Featured Feed when its owner deletes it? Backend caches a composed snapshot.
  5. Does editorial programming need a calendar, or are per-tab startsAt/endsAt enough? Nothing exists for the former.
  6. kind 30000 vs 30005 — do people lists and video lists stay one feature behind one flag, or split?
  7. Moderation of public lists surfaced editorially — a public list can contain anything; the Featured Feed carries Divine's voice.
  8. Web/mobile parity target — web is ahead on people lists, mobile ahead on private lists. Which is the reference implementation?

Inventory compiled 2026-08-26. States verified against GitHub at that time; re-check before relying on any status here.

Activity

  1. changed the title [-]Lists: audit existing work and define implementation plan[/-] [+]epic(lists): audit existing work and define the implementation plan[/+] on Aug 29, 2026
  2. 6 remaining items

  3. NotThatKindOfDrLiz commented on Sep 24, 2026

    @NotThatKindOfDrLiz
    MemberAuthor

    Two things from recent meetings.

    Direction (11 Sep): build list search first, and add the other access modes later. Please confirm this as the V1 ordering in the phasing above.

    Two new questions for V1

    • Lists are Nostr events with a 64 KB size limit, which caps how many items a list can hold. What is the maximum item count for V1, and what does someone see when a list is full: an error, a hard cap, or splitting across events?
    • Is a V1 list video-first, people-first, or both?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestepicEpic - Section grouping

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions