Commit Graph
15076 Commits
Author SHA1 Message Date
Vitor PamplonaandGitHub 92249b1481 Merge pull request #3207 from vitorpamplona/claude/blissful-feynman-spfyyx
Migrate notification filter from Global to Selected on first load
2026-06-13 12:05:26 -04:00
Claude cdb56f63e2 fix(notifications): migrate legacy Global filter to Curated once
The notifications "Global" mode was split into a raw Global (every event
that p-tags the user) and a curated Selected mode. Existing users who had
selected the old curated-Global kept a persisted value that now
deserializes to the much-more-permissive raw Global, so they suddenly saw
everything.

Add a one-shot, per-account migration: on load, if the account hasn't been
stamped yet and its notification filter is Global, rewrite it to Selected
and stamp the account. saveToEncryptedStorage always stamps the account as
migrated, so brand-new accounts (and any deliberate raw-Global choice made
after the split) are never reverted.

Only the notifications key is touched; Global keeps its original meaning
for every other feed.
2026-06-13 15:49:35 +00:00
Vitor PamplonaandGitHub 72af326936 Merge pull request #3206 from vitorpamplona/claude/modest-meitner-nejynq
Fix test name grammar in LnZapRequestAnonTagTest
2026-06-13 11:47:51 -04:00
Claude 1f8ab1387a fix: remove comma from Kotlin Native test name in LnZapRequestAnonTagTest
Kotlin/Native (iOS) disallows commas in backtick-quoted function names,
which broke the iosSimulatorArm64MainKlibrary task.
2026-06-13 15:44:52 +00:00
Vitor PamplonaandGitHub 5738c25c79 Merge pull request #3205 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-13 11:44:12 -04:00
Crowdin Bot 6be32b4719 New Crowdin translations by GitHub Action 2026-06-13 15:30:23 +00:00
Vitor PamplonaandGitHub 956d5d6fb5 Merge pull request #3199 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-13 11:28:48 -04:00
Vitor PamplonaandGitHub fcb4b7a9ad Merge pull request #3202 from vitorpamplona/claude/sweet-shannon-smjotq
Redesign activity cards (reactions, zaps, nutzaps) with unified UI
2026-06-13 11:28:38 -04:00
Crowdin Bot 891b0b4f57 New Crowdin translations by GitHub Action 2026-06-13 15:10:25 +00:00
Vitor PamplonaandGitHub cdb0c47b39 Merge pull request #3204 from vitorpamplona/claude/trusting-heisenberg-4iu49o
Add show button to hidden words list
2026-06-13 11:08:53 -04:00
Vitor PamplonaandGitHub c2b9391239 Merge pull request #3203 from vitorpamplona/claude/modernize-post-notify-tags-ogz2h1
Refactor notification chips UI with Material 3 components
2026-06-13 11:07:58 -04:00
Claude 72ecb98749 fix: add spacing before the notify add-user search field
The search field shown after tapping Add sat flush against the notify
chips row. Add a standard vertical spacer so it gets a consistent gap.
2026-06-13 15:00:05 +00:00
Claude 1709d5a30a fix: replies to likes/zaps no longer pull in the liked post's thread
Reactions and zaps keep the post they target in Note.replyTo so the card
can embed it, but that edge bridges into a different conversation. The
anchorsItsOwnThread guard only covered clicking the like/zap itself, not
clicking a kind-1111 reply to one — so opening such a reply's thread had
searchRoot/loadUp climb reply -> like -> liked post -> ... -> root of the
liked post's thread, dropping the reply into the wrong conversation, and
replyLevel buried it several indents deep.

Treat reactions/zaps as thread boundaries everywhere reposts already are:
- ThreadAssembler.searchRoot stops at a reaction/zap node.
- ThreadAssembler.loadUp adds the node but does not climb its replyTo.
- ThreadLevelCalculator (replyLevel + replyLevelSignature) treats them as
  level-0 roots.

The boundary predicate is promoted to a shared Event?.anchorsItsOwnThread().
The data layer (replyTo/replies/computeReplyTo) is unchanged — card
rendering and the notification relevance filter still rely on the link;
only thread traversal stops crossing it.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-13 14:57:46 +00:00
Claude 6fcbecb293 fix: make notify chip row spacing match horizontal spacing
Chips render through a selectable Surface that enforces a 48dp minimum
touch target, inflating each chip's measured height above its visible 32dp
pill. That invisible padding dominated the gap between wrapped rows, so the
previous verticalArrangement bump was imperceptible. Disable the minimum
interactive size around the chips so they measure at their visible height
and the row spacing matches the 6dp horizontal spacing.
2026-06-13 14:48:50 +00:00
Claude 6a2033fbb4 feat: show per-row unblock button on Hidden Words screen
Each hidden word now displays an inline unblock button when not in
selection mode, mirroring the Blocked Users screen. Long-press to
multi-select still works for batch unblocking.
2026-06-13 14:46:30 +00:00
Claude 45ce6f2815 fix: render notify chip avatar via leadingIcon to avoid circle clip
InputChip clips its avatar slot to a circle, which cut off the following
badge that BaseUserPicture draws slightly outside the picture's circle.
Pass the picture through the leadingIcon slot instead, which is not clipped.
2026-06-13 14:38:40 +00:00
Claude 82daed3c55 fix: match vertical chip spacing to horizontal in notify row 2026-06-13 14:36:26 +00:00
Claude d7a552770f feat: modernize notify-tag chips in new post screens
Replace the plain solid-color buttons used for Notify: mentions with
Material3 InputChips that show each user's avatar and display name plus a
remove (X) trailing icon, matching the modern contact-chip pattern. The
add-user action now uses an AssistChip with a PersonAdd icon.

Since the Notifying composable is shared, this updates the look across all
new post screens (short notes, comments/replies, and polls).
2026-06-13 03:38:32 +00:00
Vitor PamplonaandGitHub eff826f3d5 Merge pull request #3201 from vitorpamplona/claude/beautiful-ride-n6y3s2
Support private notes: gift-wrap kind-1 replies and posts to p-tagged users
2026-06-12 21:17:55 -04:00
Claude 953f1fe66c feat: add design-time previews for the activity cards
Five previews covering the gradient cards: like (+ heart), custom emoji
reaction, lightning zap, cashu nutzap, and onchain zap — each rendered in
the light/dark ThemeComparisonColumn with a hand-built target note so the
embedded makeItShort post shows. RenderLnZap splits into a thin resolver
plus a stateless RenderLnZapCard so the preview can feed the decrypted
sender/amount/comment directly instead of waiting on async decryption.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 23:37:43 +00:00
Claude 5e75fd1aae feat: render likes, zaps, and nutzaps as gradient activity cards like onchain zaps
Extends the onchain zap card's visual language to the other interaction
kinds. A shared ActivityCardFrame draws the rounded gradient wash, with
a circular kind badge, sender → recipient avatars, and a kind pill on
the first line; the makeItShort target post embeds between that line and
the amount, exactly as in the onchain card, followed by the comment.

- Lightning zaps: bitcoin orange, bolt badge, LIGHTNING pill, big sats
  amount, decrypted sender avatar.
- Cashu nutzaps: bitcoin orange, cashu badge, CASHU pill.
- Reactions: tinted with the Liked heart rose, heart badge (or the
  emoji itself for custom reactions), REACTION pill, no amount row.
- Onchain zaps keep their card; the embedded target post moves inside
  it, between the header row and the amount.

The body TransferCard and the trailing reaction emoji are replaced by
the cards; TransferCard stays for its preview.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 23:00:42 +00:00
Claude 74d394a7f7 Merge remote-tracking branch 'origin/main' into claude/beautiful-ride-n6y3s2
# Conflicts:
#	amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt
2026-06-12 22:52:57 +00:00
Claude 0b5f926dd8 docs: TODO for gift-wrap deletion requests (recipient-authored kind 5)
Captures the verified current behavior (author-keyed DeletionIndex, no
wrap→rumor cascade, accidental seal-id blocking) and the agreed design:
recipient special case in hasBeenDeleted, recipient field on HostStub,
and the reverse-lookup live cascade in LocalCache.

https://claude.ai/code/session_01B39MQmrT3dz137nfpXABvo
2026-06-12 22:52:15 +00:00
Claude cb9580941c Revert "feat: modernize reaction and zap cards into activity cards"
This reverts commit 11b991ef50.
2026-06-12 22:16:42 +00:00
Claude 11b991ef50 feat: modernize reaction and zap cards into activity cards
Reaction, lightning-zap, and nutzap cards used to render as a note frame
inside a note frame: two identical author headers with the action demoted
to a trailing emoji or a transfer row. They now read as activity cards:

- The action renders as a chip in the author header, next to the actor's
  name: the reaction emoji (custom emoji included) or amount-to-recipient
  (bolt/cashu icon + sats + recipient avatar). New ActivityActionChip,
  wired into FirstUserInfoRow and the thread master header.
- The target post renders as a quoted, bordered, compact embed
  (RenderActionTarget, formerly RenderZappedPost) — the only
  note-looking frame in the card.
- The zap comment, when present, becomes the card's own text between
  header and quote, like a quote-post. The body TransferCard and the
  floating reaction emoji are gone.

Onchain zaps keep their gradient tx-status card (already visually
distinct) and only inherit the quoted target styling.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 21:56:14 +00:00
Claude d271c3fe4b fix: replies to likes and zaps now reach the Curated notification feed
The Curated (Selected) notification mode gates events through
tagsAnEventByUser, which only recognized a reply by its parent note's
author in the local cache. That made replies to the user's reactions
disappear whenever the reaction event wasn't cached (nothing re-fetches
old kind 7s after a restart), and replies to the user's zaps never
matched at all because zap receipts are authored by the lightning
provider. Detect both from the kind 1111 event itself: reaction parents
via the NIP-22 root/reply author tags, zap parents via the k tag plus
the reply's explicit p tag on the user. Covered by
NotificationTagsAnEventByUserTest.

Also renders the embedded target note inside zap and reaction cards with
makeItShort, keeping the inner preview compact.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 21:23:33 +00:00
Claude 46b2147598 Merge remote-tracking branch 'origin/main' into claude/sweet-shannon-smjotq 2026-06-12 19:52:34 +00:00
Claude 0948c0d467 feat: reactions and zaps anchor their own thread; drop chip long-press
Opening the thread screen on a reaction, lightning zap, nutzap, or onchain
zap now shows that event as the root with only its reply subtree below it —
the post it targets stays visible through the card's embedded preview, but
the target's conversation no longer loads around it. Replies and comments
(kind 1 / 1111) keep the existing behavior: the full parent thread loads
and the screen lands on the clicked note. Covered by ThreadAssemblerTest.

The long-press reply shortcut on notification zap chips is removed: the
thread view's reply button is now the single reply entry point (and still
routes private zaps to the sender's DM room via routeReplyTo).

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 19:44:09 +00:00
Vitor PamplonaandGitHub 3339577c37 Merge pull request #3200 from vitorpamplona/claude/laughing-tesla-va4nvi
Improve NIP-82 software app UI with author info and screenshots
2026-06-12 15:43:28 -04:00
Claude bb43fd97b8 feat: open app screenshots fullscreen via ZoomableContentView
ScreenshotsStrip now renders each screenshot through ZoomableContentView,
so tapping one opens the standard fullscreen zoomable viewer with paging
across all of the app's screenshots. Tiles keep a fixed height and take
their width from the image's cached aspect ratio (portrait fallback
before first load).

https://claude.ai/code/session_01RJSke6d4dpSZgdtXAmGMmp
2026-06-12 19:31:31 +00:00
Claude a699bcd1c4 feat: zap renderings embed the zapped post, like reactions and reposts do
RenderLnZap, RenderNutzap, and RenderOnchainZap now show the post the zap
targets above the transfer card (via the zap note's replyTo, mirroring
RenderReaction), so the target is visible wherever a zap renders — the
thread master view, composer reply previews, and quoted embeds. Reactions
already embedded their target.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 19:28:09 +00:00
Claude eb5f7d5434 feat: single click on like/zap chips opens the event's thread view
Clicking a zap, nutzap, or like chip in the notification galleries now
navigates to that event's own thread, where anyone can reply, boost, zap,
or share it — the sender's profile remains one tap away via their avatar
in the thread header. Boost chips keep navigating to the profile.

To make those threads render properly:
- The thread master view now dispatches ReactionEvent (kind 7) through
  RenderReaction and NutzapEvent (kind 9321) through a new RenderNutzap
  transfer card; NoteCompose gains the NutzapEvent branch as well.
- The master header shows the zap sender (from the embedded zap request)
  instead of the lightning provider that signed the receipt, including
  the avatar click target.

The private-zap reply-via-DM fallback moves from the chip long-press into
routeReplyTo, so every reply entry point — including the thread view's
reply button — routes private zaps to the sender's DM room when we hold
the decrypted sender, instead of a public composer that cannot tag them.

https://claude.ai/code/session_01LM3KTECMMAdNBHZfs1dANa
2026-06-12 19:27:35 +00:00
Claude 8c7430038d fix: letter-avatar fallback for app icons while loading or on failure
AppIcon used to render an empty bordered box when the icon url was
missing, still downloading, or failed to load. It now draws the app
name's first letter on a surfaceVariant background underneath the
image, so all three states show a meaningful placeholder.

https://claude.ai/code/session_01RJSke6d4dpSZgdtXAmGMmp
2026-06-12 18:19:20 +00:00
Vitor PamplonaandGitHub bf07917260 Merge pull request #3196 from vitorpamplona/claude/nice-ptolemy-9153uk
Add Selected filter mode for curated notifications
2026-06-12 14:07:38 -04:00
Claude 7072da5286 feat: show screenshots in app feed cards, drop platform chips
Feed cards now render the app's screenshots in a horizontal LazyRow at
200dp so the images are big enough to convey what the app is about.
The platform/license chips were removed from the card since they add
little at feed level (still shown on the detail screen).

https://claude.ai/code/session_01RJSke6d4dpSZgdtXAmGMmp
2026-06-12 18:07:24 +00:00
Claude 7743d2a82a feat: show 'by <author>' under the app name in feed cards and detail header
Replaces the standalone author row on the detail screen with a shared
AppAuthorLine ('by' + clickable profile picture + username) rendered
right under the app name, and adds the same line to the app feed cards.

https://claude.ai/code/session_01RJSke6d4dpSZgdtXAmGMmp
2026-06-12 18:05:44 +00:00
Vitor PamplonaandGitHub c6ac3bebed Merge pull request #3197 from davotoula/fix/relay-log-diagnostics
Make relay failure logs diagnosable (exception class on null message, correct NIP-11 error label)
2026-06-12 13:42:31 -04:00
David KasparandGitHub 83a32c685a Merge pull request #3198 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-12 19:41:42 +02:00
Crowdin Bot 7f0a902ece New Crowdin translations by GitHub Action 2026-06-12 17:37:46 +00:00
David KasparandGitHub efe23db553 Merge pull request #3195 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-06-12 19:35:45 +02:00
Vitor PamplonaandGitHub e0e21f4562 Merge pull request #3192 from vitorpamplona/claude/eager-ptolemy-rwso2r
Add NIP-89 app recommendation management UI
2026-06-12 13:33:38 -04:00
davotoula d2f0b717ba Code review:
- apply exception-class fallback to connect() too
- dedup message construction
2026-06-12 19:30:09 +02:00
davotoula 16e5ddbc5f fix(amethyst): report NIP-11 fetch failures as FAIL_TO_REACH_SERVER 2026-06-12 19:30:09 +02:00
davotoula 91a003d72d fix(quartz): include exception class in relay failure logs when message is null 2026-06-12 19:30:09 +02:00
Claude 1ea0b91ff1 feat: relabel the curated notification filter from Selected to Curated
https://claude.ai/code/session_013VDWpD8Dr6sBF7tBEUZGpg
2026-06-12 17:30:02 +00:00
Claude b9a1d198c2 feat: show app author on the app detail screen
Adds a clickable author row (profile picture + username) below the
app header, matching the owner row pattern used by community and
long-form screens.

https://claude.ai/code/session_01RJSke6d4dpSZgdtXAmGMmp
2026-06-12 17:26:27 +00:00
Crowdin Bot bd8f4cdb48 New Crowdin translations by GitHub Action 2026-06-12 17:23:00 +00:00
Claude 24ef184de5 fix: start the app recommendations flow eagerly to pin notes in the soft cache
With WhileSubscribed, nothing held a strong reference to my own 31989
notes while no UI was collecting; under memory pressure the soft cache
could drop them, and the next recommendApp would rebuild that kind's
event from an empty snapshot, wiping previously recommended apps.
Eagerly keeps the observer registered (its result set strongly
references the notes), matching the sibling account states.

https://claude.ai/code/session_015dX5vWqvXUYD8rzPYX8vTB
2026-06-12 17:22:57 +00:00
Vitor PamplonaandGitHub 5d1e9d3a6e Merge pull request #3194 from vitorpamplona/claude/vibrant-feynman-awdqs4
Exclude metadata tags from text search
2026-06-12 13:21:11 -04:00
Claude ac7f55eb3e refactor: extract NIP-89 recommendation logic into AppRecommendationsState
Follows the Account state-class convention (InterestSetsState et al.):
the observed flow, the publish mutex, and recommendApp/unrecommendApp
now live in model/nip89AppHandlers/AppRecommendationsState, publishing
through account.sendMyPublicAndPrivateOutbox. Account just links it as
val appRecommendations = AppRecommendationsState(signer, cache, scope).

https://claude.ai/code/session_015dX5vWqvXUYD8rzPYX8vTB
2026-06-12 15:40:15 +00:00