Skip to content

Sharing a collectible: the affordance that mints a /card link #477

Description

@maximsan

Corrected 2 Sep 2026 against prototype/screens.jsx: the “Copy link” stub lives in ShareStreakSheet (line 411, onClick={() => setCopied(true)}), not at line 433.

What to build

A way to share a collectible. There is none today: the app's only share is the streak card, and the Cards tab has no share affordance at all.

This is the surface that makes #171 worth having — until it exists, nothing in the app can produce a /card/<id> link, and the only shareable URL is the marketing / one. The link itself now works; nothing hands one out.

⚠️ Net-new design, not a port

#34's resolution rules this explicitly. The prototype gestures at a link without ever defining one — its share sheet's "Copy link" tile is a stub that sets a flag and copies nothing (the ShareTarget tile in ShareStreakSheet, screens.jsx:411), and the Cards tab has no share entry point whatsoever. So a design pass is owed before a build one, on the same footing as the streak celebration rule from #26.

What #34 already settled

Not blocked any more

The link resolves. PR #483 shipped the app half of #171/card/<id> opens the app on that card, and an unearned one shows its face. So there is now something at the other end of a link this ticket would mint, and the build can start.

Two things still sit in front of it, and neither is #171's app work:

  • The design. No share affordance exists on a collectible anywhere, so where it sits and what it looks like is owed before it is built.
  • Real-device proof only. The AASA file on brewpath.maximsan.dev is not served yet (the human step Universal links: the dedicated subdomain, the AASA file, and the card route #171 keeps), so a minted link cannot be tapped end to end until it is. That does not block writing or testing the share.
    The unearned-card question that used to sit here is ruled — ADR-0015: a link shows the card's face and withholds its payload. That is what gives this share an audience, since the recipient has usually not earned what they are sent.

Acceptance criteria

  • A collectible can be shared from its sheet, and the share carries both the rendered image and its https://brewpath.maximsan.dev/card/<id> URL
  • The share affordance is designed before it is built — where it sits on the sheet and what it looks like, recorded where the ruling can be checked against it
  • No widget touches share_plus directly; the SharePresenter seam carries the URL, and a fake asserts both halves of the payload under test

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature-buildA screen or mechanic the app does not have yetneeds-triageMaintainer needs to evaluate this issue

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions