Commit Graph
1184 Commits
Author SHA1 Message Date
Barry DeenandGitHub 14abc621d0 Merge pull request #456 from barrydeen/feat/wot-filter
feat: Web of Trust global content filter
2026-04-16 00:02:58 -04:00
Barry Deen 1d35706a32 feat: add Web of Trust global content filter
When enabled in Settings → Safety → Filters, events from pubkeys
outside the user's qualified social graph (self + follows + extended
network) are silently dropped at the EventRepository and
NotificationRepository ingestion layer. This covers notes, reactions,
zaps, and reposts.

Exempt kinds: profiles (0), contact lists (3), relay lists (10002),
DM-related kinds (4, 1059, 13, 14), and DM relay lists (10050).
The filter fails open when the social graph is not computed or stale.
Toggling the filter triggers an immediate feed rebuild.
2026-04-16 00:00:37 -04:00
Barry DeenandGitHub 102b840b6f Merge pull request #455 from barrydeen/feat/nspam-classifier
feat: on-device AI spam detection for replies
2026-04-15 23:53:05 -04:00
Barry Deen 2604894ca6 feat: add on-device AI spam detection for thread replies and notifications
Ports the nspam v0.9 logistic regression model (~937KB) to pure Kotlin
for on-device classification of likely-bot authors. The model runs
MurmurHash3 feature hashing over character and word n-grams plus
structural note features — no ML runtime needed.

Spam filtering is applied only to replies from non-followed authors in
threads and notifications. Suspected spam replies appear at the bottom
of threads behind a toggle. Users can mark authors as "not spam" to
permanently safelist them. The classifier improves over time by
rescoring authors when more of their notes become available.

Adds a new Filters tab to Safety settings with toggles for the spam
filter (on by default) and Web of Trust filter (off, gated by social
graph — implementation in follow-up PR).
2026-04-15 23:49:42 -04:00
Barry Deen 4d3673f2ba Revert "Merge pull request #446 from fiatjaf/ktlint"
This reverts commit 1b346197c8, reversing
changes made to 80fb1da0e7.
2026-04-15 21:48:04 -04:00
Barry DeenandGitHub 1b346197c8 Merge pull request #446 from fiatjaf/ktlint
run ktlint after every change
2026-04-15 20:47:30 -04:00
Barry DeenandGitHub 80fb1da0e7 Merge pull request #452 from roguehashrate/feature/dm-image-save
feat: fullscreen image viewer with save for encrypted DMs
2026-04-15 20:46:53 -04:00
Barry DeenandGitHub 3d5d25c380 Merge pull request #454 from greenart7c3/main
feat: add BlurHash support and enhance media metadata parsing
2026-04-15 20:31:47 -04:00
Barry DeenandGitHub 18938bf358 Merge pull request #453 from roguehashrate/fix/kind20-custom-emoji
fix: display custom emoji images in Kind 20, 21, 22 notes
2026-04-15 19:51:44 -04:00
greenart7c3 28fd3ea87a feat: add BlurHash support and enhance media metadata parsing
- Introduce `BlurHashDecoder` for decoding BlurHash strings into blurred placeholder bitmaps.
- Update `parseImetaTags` to extract `dimension` and `blurhash` from NIP-92 tags.
- Refactor `RichContent` segments to use a new `MediaMeta` data class instead of raw URL strings.
- Implement blurred placeholders and aspect-ratio-aware loading states in `RichContent`, `PostCard`, and `GalleryCard`.
- Add buffering indicators to `InlineVideoPlayerWithFullscreen`.
- Ensure `imeta` and emoji tags are correctly parsed and passed to `RichContent` in `DraftsScreen` and `UserProfileScreen`.
2026-04-15 17:08:23 -03:00
roguehashrate 0d78de62e3 Fixed kind 20, 21, 22 not rendering :shortcode: 2026-04-14 20:46:50 -05:00
roguehashrate d670baa5de Images in DM's are now able to go big mode and you can save them 2026-04-12 15:10:11 -05:00
Barry DeenandGitHub ad71f6c3f0 Merge pull request #451 from barrydeen/chore/bump-version-0.17.6
chore: bump version to 0.17.6
2026-04-12 13:13:24 -04:00
Barry Deen 6f0f68b85f chore: bump version to 0.17.6 (72) 2026-04-12 13:12:42 -04:00
Barry DeenandGitHub 40e516c938 Merge pull request #450 from barrydeen/fix/navigation-lockup-revert-safe-guard
fix: revert navigateSafe guard that caused UI lockup
2026-04-12 13:02:06 -04:00
Barry Deen cb29c718e3 fix: revert navigateSafe guard that caused UI lockup on slower phones
The lifecycle RESUMED check silently swallowed navigation calls when
the back stack entry hadn't reached RESUMED state yet, making the
entire interface unresponsive — especially on older/slower devices.

Reverts the blanket navigateSafe wrapper from #425. The original
double-tap crash was a narrow edge case; this revert restores reliable
navigation for all users.
2026-04-12 13:01:17 -04:00
Barry DeenandGitHub ec822ef245 Merge pull request #449 from barrydeen/fix/nip18-nevent-unresolved-ref
fix: capture neventEncode return value in Nip18
2026-04-12 12:53:46 -04:00
Barry Deen 41c71c50a3 fix: capture neventEncode return value in Nip18.appendNoteUri
The neventEncode result was being discarded and the return
statement referenced a nonexistent `id` variable, causing a
compilation error.
2026-04-12 12:53:09 -04:00
Barry DeenandGitHub 872fce1d93 Merge pull request #447 from NielLiesmons/main
Chat UI/UX proposal
2026-04-12 12:50:58 -04:00
Barry Deen adb45541a0 chore: remove junk files and add to gitignore
Remove accidentally committed .kotlin/errors/ log and .vscode/ config
files. Add both directories to .gitignore to prevent future commits.
2026-04-12 12:46:44 -04:00
Barry DeenandGitHub e7a6986bf0 Merge pull request #445 from fiatjaf/no-note1
stop producing useless deprecated "note1" codes
2026-04-11 12:31:14 -04:00
Niel Liesmons eec8dd2ad3 - Better Chat Actions Modal
- Conistent UI in all Chats: DMs and Groups
2026-04-10 12:21:26 +02:00
Niel Liesmons f37032d1d0 Group chat Ui improvements:
- Added Actions modal for one-click access to all actions
- Tweaked the top bar and bottom bars
- Made it bubbles
2026-04-09 22:10:48 +02:00
fiatjaf dc24b43f0e run ktlint after every change. 2026-04-09 13:26:55 -03:00
fiatjaf 798e746ec8 stop producing useless deprecated "note1" codes. 2026-04-09 11:37:30 -03:00
Barry DeenandGitHub 32f973f814 Merge pull request #444 from fiatjaf/autoprefix-naddr
also autoprefix naddr1 codes
2026-04-08 18:47:40 -04:00
fiatjaf 3da826f612 also autoprefix naddr1 codes. 2026-04-08 19:38:22 -03:00
Barry DeenandGitHub db6aead115 Merge pull request #443 from barrydeen/fix/focus-requester-crash
fix: catch FocusRequester not initialized crash
2026-04-08 12:36:50 -04:00
Barry Deen 1d56c1204e fix: catch FocusRequester not initialized crash
Guard all LaunchedEffect { requestFocus() } calls against the race
where the FocusRequester node is not yet attached — particularly in
Scaffold subcomposition (SearchScreen) and dialog content.

Reported on HONOR DNY-NX9, Android 36.
2026-04-08 12:36:22 -04:00
Barry DeenandGitHub eb3cd609cd Merge pull request #442 from barrydeen/fix/reply-count-lru-eviction
fix: reply count lost after LRU cache eviction
2026-04-08 11:31:09 -04:00
Barry Deen 8b3915090d fix: reply count lost after LRU cache eviction
countedReplyIds was a ConcurrentHashMap that never evicted, while
replyCounts was an LruCache. When replyCounts evicted an entry, the
permanent dedup set prevented re-counting on re-fetch. Align
countedReplyIds with the same LruCache pattern used by
countedReactionIds and countedZapIds so both evict together.

Bump to 0.17.5 (71).
2026-04-08 11:29:42 -04:00
Barry DeenandGitHub a8dbe9daa3 Merge pull request #441 from barrydeen/feat/emoji-frequency-sorting
feat: sort emoji picker by usage frequency
2026-04-08 10:45:55 -04:00
Barry DeenandClaude Opus 4.6 b881925f4c feat: sort emoji picker by usage frequency
Track emoji usage counts in SharedPreferences and sort the reaction
picker by most-used first. Both unicode and custom image emojis are
included in the unified sorted list, so frequently used custom emojis
appear before less-used unicode ones.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 10:44:55 -04:00
Barry DeenandGitHub 87c5603fd0 Merge pull request #440 from barrydeen/feat/inline-header-action-icons
Inline action icons in chat message headers
2026-04-08 10:10:22 -04:00
Barry Deen 651ccb5154 feat: inline action icons in chat message headers
Move reply/react/zap icons into the username/timestamp header row
so they're always visible without tapping. Removes the tap-to-reveal
action bar and its 5s auto-dismiss timer. Zero extra vertical space.
2026-04-08 10:09:03 -04:00
Barry DeenandGitHub 84f2b3d42f Merge pull request #438 from barrydeen/fix/blocked-users-quoted-notes-and-list-names
Fix blocked users, notifications, chat UX, and live stream toggle
2026-04-07 16:47:59 -04:00
Barry DeenandClaude Opus 4.6 538b4ad9ab chore: bump version to 0.17.4 (70)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:47:19 -04:00
Barry DeenandClaude Opus 4.6 050e0ce603 feat: tap-to-show action bar and colored usernames in chat rooms
Hide reply/react/zap action bar behind a tap gesture with 5s auto-dismiss
to reduce visual clutter in group and live stream chats. Assign each chat
member a deterministic color based on their pubkey for easier distinction,
keeping the user's own name in the theme primary color.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:47:19 -04:00
Barry DeenandGitHub 4b13a94586 Merge pull request #437 from barrydeen/fix/blocked-users-quoted-notes-and-list-names
Fix notifications, blocked user quotes, list names, and live stream toggle
2026-04-07 16:31:40 -04:00
Barry Deen 1d8f28ca9c feat: add toggle to hide live streams from feed
Adds a "Hide live streams" switch in Interface settings under the
Media section, with translations for all 10 supported locales.
2026-04-07 16:29:57 -04:00
Barry Deen 9226129512 fix: distinguish quote notes from replies in notification effects
Quotes with a "q" tag were incorrectly triggering the reply animation.
Also respect notification filter settings for reply/DM tab animations.
2026-04-07 16:29:44 -04:00
Barry DeenandGitHub 7d4d93e8af Merge pull request #436 from barrydeen/fix/blocked-users-quoted-notes-and-list-names
fix: blocked user quoted notes + NIP-51 list name fallback
2026-04-07 16:13:08 -04:00
Barry DeenandClaude Opus 4.6 1f40c58914 fix: hide blocked users' notes when referenced or quoted
getEvent() and findAddressableEvent() served events from blocked pubkeys
without checking the mute list. Quoted/embedded notes from blocked users
were visible because getEvent() reloaded purged events from ObjectBox
persistence. Add block checks to both methods and to seedFromObjectBox().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:12:08 -04:00
Barry DeenandClaude Opus 4.6 8669460bfc fix: support "name" tag fallback for NIP-51 list names
Some clients use "name" instead of "title" for relay sets, follow sets,
bookmark sets, and interest sets. Fall back to "name" when "title" is
absent before using the d-tag identifier.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:12:06 -04:00
Barry DeenandGitHub 8f8fea61ba Merge pull request #435 from barrydeen/fix/status-update-after-resume
fix: status update after resume + misc improvements
2026-04-07 16:00:31 -04:00
Barry DeenandClaude Opus 4.6 106c5ab8f8 feat: notification sound filtering, muted user profiles, article nostr embeds
- Only play notification sounds for enabled notification types (reactions, reposts, mentions, votes)
- Fetch and display profile pictures/names for muted users on the safety screen
- Render nostr entity references (nevent, nprofile, naddr) as rich cards in article view

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 16:00:01 -04:00
Barry DeenandGitHub d59cf28f01 Merge pull request #434 from barrydeen/fix/status-update-after-resume
fix: status update after resume + re-fetch emoji sets
2026-04-07 15:45:26 -04:00
Barry Deen 932927d436 fix: status update silent failure after app resume + always re-fetch emoji sets
Move the optimistic status cache update before the signer null-check so
the UI always responds, and stamp userStatusTimestamps in setUserStatus
so relay re-fetches of stale events cannot overwrite the local update.

Change emoji set fetching to always re-fetch all referenced sets instead
of only missing ones, ensuring sets are up-to-date after reconnect.
2026-04-07 15:44:58 -04:00
Barry DeenandGitHub d91d66bfce Merge pull request #433 from barrydeen/fix/portrait-video-sizing
fix: prevent portrait videos from filling entire post card
2026-04-07 15:22:51 -04:00
Barry Deen 7cdf37db62 fix: prevent portrait videos from filling entire post card
fillMaxWidth() on the video Box pinned both min and max width, preventing
aspectRatio() from narrowing portrait videos to fit within the 500dp
height cap. Wrap in a centering Box so the inner container can freely
size to the correct aspect ratio.
2026-04-07 15:22:24 -04:00