Commit graph

1064 commits

Author SHA1 Message Date
codytseng
e80474099e fix: improve markdown detection and fix line spacing in embedded notes
Count total occurrences of medium signals in containsMarkdown instead of
only distinct types, so repeated patterns like multiple list items
correctly trigger markdown rendering. Add whitespace-normal to
MarkdownContent to prevent inherited whitespace-pre-wrap from parent
note content causing inconsistent line spacing in embedded notes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-25 11:02:00 +08:00
Max Blake
c7eef9fa48
feat: update pl.ts (#763)
A small stylistic amendment
2026-03-22 19:25:27 +08:00
codytseng
3b4a2ba2d3 feat: add allow insecure connections toggle in system settings
Block ws:// relay connections and http:// resource loading by default
to prevent browser mixed content warnings. When blocked, resources
show clickable URL links instead of error placeholders so users can
open them manually.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-21 23:12:09 +08:00
codytseng
c9bd7ca7d7 feat: display larger emojis for emoji-only notes and remove auto-space after custom emoji insertion
Show emojis at a larger size when a note contains only emojis (≤3), similar to Telegram. Also remove the automatic space inserted after custom emoji in the post editor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 22:31:24 +08:00
codytseng
1c3d58f490 fix: include emoji event stores in IndexedDB cleanup
The userEmojiListEvents and emojiSetEvents stores were not included in
the cleanUp() method, causing their cached data to never expire. Add
both stores with a 7-day expiration period.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 22:12:44 +08:00
codytseng
6cca3969ce feat: add explicit protected event toggle in post editor
Add a Switch control next to the relay selector for users to explicitly
enable/disable NIP-70 protected events. Auto-enables when relay
conditions suggest it (no optimal relays), but respects user override.
Includes a help popover explaining protected events with a note that
not all relays support them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 23:03:56 +08:00
codytseng
bd6340bbc7 feat: add protected badge for NIP-70 events
Display a subtle green "Protected" badge next to the username for
events with the `-` tag (NIP-70), indicating restricted distribution.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 22:27:11 +08:00
codytseng
67f308e47f fix: stop YouTube mute-check interval when player is destroyed
The setInterval polling playerRef.current.isMuted() continued running
after the YouTube player was destroyed, causing repeated TypeErrors.
Now the interval self-clears when it detects the player is invalid.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-16 22:08:51 +08:00
codytseng
cd86b3aac5 fix: deduplicate stored events against fetched events in notifications
storedEvents from IndexedDB could contain the same event IDs as the
fetched events, causing duplicate notifications to appear. Use the
shared idSet to filter storedEvents so each event ID appears only once.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 14:15:41 +08:00
codytseng
e5e0918c93 fix: always mount popover backdrop portal to prevent remount issues
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:33:27 +08:00
codytseng
330152fd5c fix: normalize Unicode in local user search for special characters
Apply NFKD normalization to both indexed text and search queries so
that stylized Unicode characters (e.g. 𝚋𝚊𝚝𝚜𝚒𝚚) are decomposed to
their ASCII equivalents and can be matched by search.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:21:13 +08:00
codytseng
3576a11595 fix: prevent relay description text overflow on mobile
Use overflow-wrap: anywhere instead of break-words so long URLs
break properly without splitting normal words mid-character.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-14 13:16:34 +08:00
codytseng
aae8fc2f17 feat: add customizable search relays setting
Replace hardcoded SEARCHABLE_RELAY_URLS with user-configurable search
relays stored in localStorage. Add SearchRelaysSetting UI in System
settings page with add/remove/reset functionality.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 23:19:47 +08:00
codytseng
7be7b30d52 fix: skip fayan search when input is a hex ID or bech32 ID
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:25:29 +08:00
codytseng
f4dbd3c843 fix: handle nprofile type in NostrNode for markdown embedded mentions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-12 22:18:15 +08:00
robos
071c740145
feat: add Silent Payment (BIP 352) support to kind 0 profiles (#758)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: BoltTouring <BoltTouring@users.noreply.github.com>
Co-authored-by: Tanjiro <claude@tricycle.cc>
2026-03-09 10:16:08 +08:00
codytseng
4c144c3da1 feat: support custom emoji, hashtag, invoice, YouTube/X embeds in markdown
Add remarkInlineContent plugin to detect hashtags, custom emojis, and
lightning invoices in text nodes. Handle YouTube/X URLs in the link
component. Fix bug where a text node fully matching a single pattern
was not replaced due to segments.length === 1 check.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 11:15:27 +08:00
codytseng
6f779e8b24 fix: detect markdown image syntax ![alt](url) as strong signal
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:57:39 +08:00
codytseng
cc1aa7f989 feat: add markdown rendering support for Content component
Detect markdown-formatted posts (from bots etc.) and render them
with react-markdown instead of plain text, with feed-friendly
styles (flattened headings, compact lists, scrollable tables).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:49:18 +08:00
codytseng
fc8a160d9a fix: prevent bunker reconnection from blocking app startup
When reconnecting a bunker signer (e.g. Amber) after page reload, skip
the getPublicKey() call since the pubkey is already known from storage.
This prevents the app from hanging indefinitely when the remote signer
is unreachable. Also add a 10s timeout to getPublicKey() for safety.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 23:36:42 +08:00
codytseng
da751fd73c fix: resolve duplicate notifications in notification center
Use compareEvents (which considers both created_at and id) instead of
simple created_at comparison for sorting events in timeline subscription
and load-more logic. This ensures consistent ordering with mergeTimelines
and handleNewEvent deduplication, preventing duplicates when events share
the same timestamp. Also add Set-based dedup in notification list memo
as an additional safety net.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 22:34:39 +08:00
The Daniel 🖖
d361ac60ab
fix: preserve line breaks in longform article summaries (#756)
Co-authored-by: The Daniel <dmnyc@users.noreply.github.com>
2026-02-23 12:44:00 +08:00
codytseng
481603d0e8 feat: add video loop playback setting
Add a toggle in General Settings to enable/disable video loop playback,
following the same pattern as the existing autoplay setting.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 13:55:53 +08:00
Cody Tseng
ae8a534103
fix: show 'Encrypted direct messages not supported' for kind 4 events (#754)
* fix: show 'Encrypted direct messages not supported' for kind 4 events (#753)

Co-authored-by: The Daniel <dmnyc@users.noreply.github.com>

* i18n: add translations for 'Encrypted direct messages not supported'

Also use kinds.EncryptedDirectMessage constant instead of magic number 4.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: The Daniel 🖖 <3638467+dmnyc@users.noreply.github.com>
Co-authored-by: The Daniel <dmnyc@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 13:43:19 +08:00
codytseng
2fbbe6ce1d fix: allow multiple YouTube embeds to render in a single note
Two issues prevented multiple YouTube URLs from rendering:

1. YOUTUBE_URL_REGEX and X_URL_REGEX had the global flag, causing
   stateful lastIndex to skip matches on alternating calls.

2. Each YouTube Player overwrote window.onYouTubeIframeAPIReady,
   so only the last mounted player received the callback. Replace
   with a shared callback queue via ensureYTApi().

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 22:30:10 +08:00
codytseng
2b97adfdca feat: support navigating to primary pages via URL query parameter
Allow users to open a specific primary page by visiting /?page=explore,
/?page=settings, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 22:11:26 +08:00
codytseng
71dc0bb4fc fix: prevent horizontal overflow of relay tags
Add flex-wrap to the relay tags container so tags wrap to the next line
instead of overflowing horizontally.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 22:02:01 +08:00
codytseng
244dda807b feat: add copy note content option and migrate AGENTS.md to CLAUDE.md
Add a "Copy note content" option to the note options menu that copies the
event's content field to clipboard. Merge AGENTS.md into CLAUDE.md with
enhanced i18n rules emphasizing append-only locale key ordering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 21:56:32 +08:00
ClarkQAQ
3196c43644
feat: support audio file uploads via clipboard in post editor (#743) 2026-02-04 10:50:46 +08:00
codytseng
942c9a7d12 💨 2026-01-31 17:56:30 +08:00
Cody Tseng
ed8a22d5bc
feat: community mode (#738)
Co-authored-by: CXPLAY <62034099+cxplay@users.noreply.github.com>
2026-01-24 00:09:10 +08:00
The Daniel 🖖
686b1f9998
feat: use jumble.social share links for notes (#737)
Co-authored-by: The Daniel <dmnyc@users.noreply.github.com>
2026-01-23 22:05:06 +08:00
codytseng
e490407dd5 chore: format 2026-01-22 22:28:07 +08:00
codytseng
4bd4141b54 chore: remove something 2026-01-22 22:24:31 +08:00
codytseng
2dd4e866d2 chore: adjust padding for tab indicator and tab items 2026-01-20 23:17:06 +08:00
codytseng
8aca9efe68 chore: adjust sidebar toggle button position 2026-01-20 22:54:40 +08:00
codytseng
2cd1ae481b feat: support hiding indirect notifications 2026-01-20 22:47:42 +08:00
codytseng
331811f683 pref: reduce unnecessary profile queries 2026-01-19 22:16:21 +08:00
codytseng
ee90ae99c1 feat: render relay description content 2026-01-19 22:07:53 +08:00
codytseng
0d6f8789d0 feat: treat large-screen devices as non-touch 2026-01-19 21:55:48 +08:00
codytseng
71791c9513 fix: expose more detailed error messages 2026-01-17 11:50:24 +08:00
codytseng
d37aa61501 chore: 🏗️ 2026-01-15 23:15:09 +08:00
codytseng
b6cb701ff1 feat: replace user search service 2026-01-15 22:58:55 +08:00
codytseng
400da44543 feat: update trust score badge description 2026-01-14 23:31:40 +08:00
codytseng
ca9610b711 feat: support configurable trust score threshold per context 2026-01-14 23:20:28 +08:00
codytseng
28a1b3096a fix: 💨 2026-01-14 11:37:43 +08:00
codytseng
1766beade4 fix: disable trust filter on profile feed 2026-01-13 23:28:50 +08:00
Cody Tseng
7e8f1692ac
feat: zap details (#731)
Co-authored-by: The Daniel <dmnyc@users.noreply.github.com>
Co-authored-by: The Daniel ️ <dmnycnet@proton.me>
2026-01-13 22:54:50 +08:00
codytseng
603bd35b4a feat: muted words 2026-01-08 22:53:11 +08:00
codytseng
3c74c8c5db style: remove emoji border radius 2026-01-08 22:20:22 +08:00