Commit Graph
52 Commits
Author SHA1 Message Date
Laan Tungir efe9d977cd Make warmOutbox handler non-blocking (fire-and-forget) in worker dispatch — trackUsers involves network I/O that was blocking the entire message dispatch loop, starving getRelayData/getRelayStats v0.7.49 2026-06-26 10:27:42 -04:00
Laan Tungir bff0bca411 Remove redundant warmOutbox calls from ensureLiveFeedSubscription and newAuthors path — NDK.subscribe already calls trackUsers internally, so only the pre-bootstrap warmOutbox is needed. This reduces the outbox event burst that was starving the worker message queue. v0.7.48 2026-06-26 10:17:56 -04:00
Laan Tungir fee3ffc764 Increase getRelayData/getRelayStats timeout from 5s to 15s — worker is busy processing outbox/NDK events from feed.html warmOutbox, causing message queue delays v0.7.47 2026-06-26 10:14:21 -04:00
Laan Tungir d49a3e800f Add debug logging to getDiscoveredRelays handler to diagnose why Serving/Sample Follows columns are empty v0.7.46 2026-06-26 10:11:55 -04:00
Laan Tungir 9d9d0f88f5 Remove discovered relays auto-refresh interval — fetch only on manual expand click to prevent worker message queue starvation v0.7.45 2026-06-26 10:08:13 -04:00
Laan Tungir b11161862a Fix relays.html relay data timeout: separate discovered relays refresh to 15s interval only when expanded, make worker getDiscoveredRelays handler non-blocking (fire-and-forget) to prevent message queue starvation v0.7.44 2026-06-26 09:54:18 -04:00
Laan Tungir fe35b2dfa1 Phase 5: Add discovered relays (outbox) table to relays.html — collapsible section showing temporary outbox relays with connection status, serving follow count, and sample npubs v0.7.43 2026-06-26 09:46:35 -04:00
Laan Tungir ae67e65969 Mark Phases 1-4 as complete in feed-outbox-assessment.md, update summary table with status column v0.7.42 2026-06-26 09:44:56 -04:00
Laan Tungir 19344942b0 Fix relays.html sidenav connection history toggle: remove section title and horizontal rules, use SVG checkbox style matching the relay table checkboxes v0.7.41 2026-06-26 09:43:02 -04:00
Laan Tungir c758333269 Implement feed outbox model pre-warming (Phases 1-3) and relays.html connection history toggle with performance fixes (Phase 4)
Phase 1 (ndk-worker.js): Add warmOutbox, setRelayEventLogging, and getDiscoveredRelays RPC handlers. Gate broadcastRelayEvent and logRelayEvent IndexedDB writes behind relayEventLoggingEnabled flag (default off). trackRelayRead/trackRelayWrite left ungated to preserve footer activity carrots.

Phase 2 (init-ndk.mjs): Add warmOutbox, setRelayEventLogging, and getDiscoveredRelays page API exports with proper request/response wiring and timeouts.

Phase 3 (feed.html): Pre-warm outbox tracker via warmOutbox() before bootstrapFeedPosts and fetchFeedWindow calls so NDK routes author-based subscriptions to follows' write relays before short-lived fetchEvents EOSE.

Phase 4 (relays.html): Add 'Show connection history' sidenav toggle (sidenavRowToggle pattern from feed.html), gate ndkRelayEvent listener and DB loading behind connectionHistoryEnabled flag, switch live event stream to incremental DOM appending, sync state on init/beforeunload.
v0.7.40
2026-06-26 09:38:31 -04:00
Laan Tungir 3ed0c35611 Fix post-feed reply composer width: #divComposer was nested in #divThread and re-applied 80% (560px); now fills parent (700px) v0.7.39 2026-06-26 07:26:09 -04:00
Laan Tungir d9503c1532 Revert: remove layout:'inline' from mountComposer in post-feed.html — made it worse v0.7.38 2026-06-26 07:18:32 -04:00
Laan Tungir fa0859dcdd Fix post-feed.html: reply composer width — add layout:'inline' to mountComposer
The composer wrapper defaults to width:60% (post-composer.css). Adding
layout:'inline' applies the --inline class which sets width:100%.
v0.7.37
2026-06-25 21:29:31 -04:00
Laan Tungir 0c340316ae Fix post-feed.html: reply composer width — add width:100% and box-sizing:border-box to .topPostComposerInput v0.7.36 2026-06-25 21:22:38 -04:00
Laan Tungir 313a55992f Change Nutzap button label from peanut emoji to text 'Nutzap' v0.7.35 2026-06-25 21:18:47 -04:00
Laan Tungir ece3a136c1 Redesign: Split Zap into two buttons (Zap + Nutzap) with separate counts and popups
- Split single Zap button into Zap ( Lightning) and Nutzap (🥜 Cashu) buttons
- Each button has its own count display and popup dialog
- Zap button: only sends Lightning zaps via Cashu melt, simplified dialog (no rail selector)
- Nutzap button: sends NIP-61 nutzaps, dialog shows recipient's accepted mints
- Removed capability badges (buttons themselves show capability via dimming)
- Removed separate nutzap count display (count now on Nutzap button)
- Added applyZapCapabilityDimming() — dims buttons based on resolveZapCapabilities
- Added promptNutzapDetails() to zaps.mjs — shows recipient mints and shared mint info
- Simplified promptZapDetails() — removed rail selector, Lightning only
- Added .interaction-item.nutzap and .dimmed CSS styles
- All colors use CSS variables only
v0.7.34
2026-06-25 21:13:55 -04:00
Laan Tungir 543ae6a1b3 Fix feed.html: disable inline comment rendering that caused flash of replies
Two fixes:
1. post-interactions2.mjs: only call addCommentToPost when getCommentsVisible() is true
2. feed.html: call cards.setCommentsVisible(false) after initPostCards to disable
   inline comment rendering for the new simplified feed

The old feed (feed-old.html) still has the Comments toggle and can re-enable them.
v0.7.33
2026-06-25 21:02:21 -04:00
Laan Tungir 508952a1ea Rename feed.html -> feed-old.html, feed2.html -> feed.html
The new simplified feed (formerly feed2.html) is now the primary feed page.
Updated post-feed.html back button to point to feed.html instead of feed2.html.
v0.7.32
2026-06-25 20:57:34 -04:00
Laan Tungir 15ef106eb5 Fix feed2.html: add missing walletGetBalance and walletGetMints imports
feed2.html was missing walletGetBalance and walletGetMints in both the
init-ndk.mjs import and the initPostCards call. Without these, the zap
rail selector and capability badges couldn't function — handleZapClick
couldn't resolve zap capabilities or show the rail toggle.
v0.7.31
2026-06-25 20:55:02 -04:00
Laan Tungir a42edcf6d6 Feed upgrade Phases 3-5: zap capability indicators, rail selector, balance checks
Phase 3 — Zap Capability Indicators:
- Added resolveZapCapabilities() to zaps.mjs with 5-min TTL cache
- Checks lud16 (from profile cache) for Lightning capability
- Checks kind 10019 (via walletFetchMintList) for nutzap capability
- Computes shared mints between sender and recipient
- Added capability badges (🥜/) to zap button in post-interactions.mjs
- Badges use var(--accent-color) for available, var(--muted-color) for unavailable
- Added proactive kind 10019 batch fetch for followed users in ndk-worker.js
- New IDB store ndk-nutzap-mintlists for persistent caching (6h TTL)
- Non-blocking: badges appear after async resolution

Phase 4 — Zap Rail Selector:
- Updated promptZapDetails with rail toggle (🥜 Nutzap /  Lightning)
- Shows Cashu balance and insufficient balance warning
- Shows shared mint info when nutzap selected
- Default rail: nutzap for <1000 sats, Lightning for >=1000 sats
- Updated handleZapClick to resolve capabilities and respect user's rail choice
- Added zap rail toggle CSS to client.css (all CSS variables)
- Wired walletGetBalance through post-interactions2.mjs and post-feed.html

Phase 5 — Balance Check and Error Handling:
- Pre-flight balance check before sending (hard stop if insufficient)
- Barely-sufficient balance confirmation dialog
- Friendly error messages for melt/swap/timeout/insufficient failures
- Post-zap balance refresh via ndkWalletBalance event

Review fix: threaded walletGetMints through post-interactions2.mjs and post-feed.html
so resolveZapCapabilities can compute shared mints correctly
v0.7.30
2026-06-25 20:48:38 -04:00
Laan Tungir 0267233f87 Fix post-feed.html reply composer formatting — add missing .topPostComposerInput CSS rule
The reply composer was missing the CSS rule that gives it visible formatting
(border, padding, min-height, border-radius). Copied the rule from post.html.
v0.7.29
2026-06-25 20:29:51 -04:00
Laan Tungir 6b45092bc8 Fix post-feed.html: recursive reply fetching for nested replies
Replies to replies don't carry the root post ID in their e tags, only their
immediate parent's ID. The old single-level #e filter missed nested replies.

Added fetchRepliesRecursive() which does breadth-first recursive fetching:
- Starts with root post ID, fetches direct replies
- For each reply found, fetches replies to THAT reply
- Continues up to 5 levels deep (REPLY_FETCH_MAX_DEPTH)
- Deduplicates by event ID
- Per-level timeout (8s) to guard against slow relays
- Real-time handler also triggers 1-level recursive fetch for new replies

This matches Amethyst's ThreadFilterAssemblerSubscription approach.
v0.7.28
2026-06-25 20:20:10 -04:00
Laan Tungir 6d39188967 Fix post-feed.html: remove collapse, fix missing reply, move composer to top
1. Removed collapse/expand functionality — all replies shown, no hidden counts
2. Fixed missing last reply — added safety check to ensure all fetched replies are rendered
3. Moved reply composer to top (under main post, before replies list)
v0.7.27
2026-06-25 20:00:43 -04:00
Laan Tungir c5f682c5fe Feed upgrade Phase 2.5: Threaded replies with vertical lines in post-feed.html
- Added computeReplyLevels() to compute reply depth from NIP-10 e tags
- Added buildDepthFirstOrder() for depth-first thread sorting (root first, children grouped by parent chronologically)
- Render vertical indent lines using CSS variables (var(--muted-color) for non-selected, var(--accent-color) for focused post)
- Added collapse/expand functionality with hidden reply count
- Added focused post highlight via ?focus=<eventId> URL param
- Real-time subscriptions preserved — new replies appear in correct threaded position
- All colors use CSS variables — no hardcoded colors
v0.7.26
2026-06-25 19:53:36 -04:00
Laan Tungir 073fb9e9af Feed upgrade Phase 1 & 2: simplified feed2.html + post-feed.html thread page
Phase 1 (feed2.html):
- Removed inline comment rendering and Comments toggle button
- Comment button now opens post-feed.html?event=<eventId> in new tab
- Removed inline reply composer (kept quote composer)
- Fixed missing queryCache dependency in initPostCards
- Fixed hardcoded color:red -> var(--primary-color)

Phase 2 (post-feed.html):
- New post thread page showing post + all replies + inline composer
- Parses ?event=<hex|nevent|note> URL parameter
- Fetches replies via { kinds: [1], '#e': [postId] }
- Real-time subscriptions for new replies
- Comment button on replies opens sub-threads in new tabs
- Error states for missing/invalid/not-found posts
- All CSS uses variables, no hardcoded colors
v0.7.25
2026-06-25 19:45:36 -04:00
Laan Tungir 2f45c78741 Lightweight 17375-only republish: skip 7375 rewrite, no deletions needed
Kind 17375 is a replaceable event (NIP-60, d-tag=''), so publishing a new
one automatically supersedes the old one on relays. The republish now only:
1. ensureDirectNutzapP2pk() - generate privkey if missing
2. Build NIP-60 tag-array payload
3. NIP-44 encrypt + sign + publish single 17375 event
That's 1 signing round-trip instead of 100+.
Reduced timeout from 120s back to 30s.
Bumped WORKER_REVISION to nip60-lightweight-republish-1.
v0.7.24
2026-06-25 14:05:33 -04:00
Laan Tungir 6d41680297 Increase walletRepublish timeout to 120s for large wallets
The 45s timeout was too short for wallets with many old 7375 token events —
each deletion requires a signing round-trip through the nos2x extension.
v0.7.23
2026-06-25 14:01:01 -04:00
Laan Tungir b2a50376df Ensure nutzap privkey is always included in kind 17375 republish
- Added ensureDirectNutzapP2pk() call in publishDirectProofs before building wallet payload
- This auto-generates a privkey if one wasn't hydrated from the old 17375 event
- Bumped WORKER_REVISION to nip60-privkey-ensure-1
v0.7.22
2026-06-25 13:48:34 -04:00
Laan Tungir 3c4be89ead Add Republish Wallet button to force kind 17375 republish in NIP-60 format
- Added walletRepublish worker handler that calls publishDirectProofs()
- Added walletRepublish() to init-ndk.mjs
- Added republishWallet() to cashu-wallet.mjs controller
- Added 'Republish Wallet (kind 17375)' button to cashu.html sidenav
- Bumped WORKER_REVISION to nip60-republish-1 and cashu-wallet.mjs cache-bust
v0.7.21
2026-06-25 13:39:32 -04:00
Laan Tungir 89d2c259f6 Fix event-management Refresh Kind to honor NIP-65 write-only relay designation and not read from write-only relays like sendit.nosflare.com v0.7.20 2026-06-25 13:34:24 -04:00
Laan Tungir 7b77da7349 Fix NIP-60 kind 17375 content format: use tag-array instead of proprietary object
- Changed walletPayloadObj from {mints, nutzap} object to [['mint',url],['privkey',hex]] tag-array
- Removed non-standard pubkey tag from 17375 public tags (belongs on kind 10019)
- Added parseWalletContent() helper that reads both new tag-array and legacy object formats
- Added migrateLegacyWalletEventIfNeeded() for one-time auto-migration of old wallets
- Bumped WORKER_REVISION to nip60-tagarray-fix-1 to force SharedWorker restart
- Added wallet-page.md plan for unified wallet.html (Bitcoin, Cashu, NWC, CLINK)
v0.7.19
2026-06-25 12:24:48 -04:00
Laan Tungir 38661b7fb6 . v0.7.18 2026-06-14 08:07:35 -04:00
Laan Tungir eed00f67cf Migrate music playlists to Gruuv a-tag hydration and add optional lazy FRIENDS loading v0.7.17 2026-06-09 15:15:08 -04:00
Laan Tungir 8998c5664d Re-sort projects table by 30-day commits after lazy commit counts load v0.7.16 2026-05-29 10:58:32 -04:00
Laan Tungir e943870d77 Port projects page functionality into template with public/no-login mode and project-native styling v0.7.15 2026-05-28 14:44:00 -04:00
Laan Tungir 08fc661077 Prioritize live window.nostr authState for active signing port registration v0.7.14 2026-05-27 15:48:34 -04:00
Laan Tungir 92430296c2 Fix shared-worker signer authority routing for multi-tab nsigner v0.7.13 2026-05-27 15:27:24 -04:00
Laan Tungir bc8e2f46fd Improve shared worker nsigner routing with explicit active signing port registration v0.7.12 2026-05-27 15:17:45 -04:00
Laan Tungir bd713d01f9 Fix stream site URL template editing and add NIP-53 starts/ends tags v0.7.11 2026-05-03 07:00:46 -04:00
Laan Tungir 7ce913997a This is a meaningful git commit message v0.7.10 2026-04-28 12:33:29 -04:00
Laan Tungir 63f5097a6d This is a meaningful git commit message v0.7.9 2026-04-28 10:44:22 -04:00
Laan Tungir 89fed0c818 This is a meaningful git commit message v0.7.8 2026-04-28 10:39:51 -04:00
Laan Tungir 0c9e8bebcb Implement document page chat binding, JSON editor flow, and resizable columns v0.7.7 2026-04-28 10:00:02 -04:00
Laan Tungir 22334ad432 . v0.7.6 2026-04-21 06:32:47 -04:00
Laan Tungir 3ff4bc532b This is a meaningful git commit message v0.7.5 2026-04-19 14:31:26 -04:00
Laan Tungir dc5b97ecf4 Add music player auto-save toggle and Blossom upload for now-playing tracks v0.7.4 2026-04-19 14:00:32 -04:00
Laan Tungir a2f7a7fceb Fix music optional auth to detect existing logged-in session on page load v0.7.3 2026-04-19 13:43:13 -04:00
Laan Tungir 9c85c8ec5e Vendor CDN scripts locally for FIPS HTTP compatibility v0.7.2 2026-04-19 13:37:32 -04:00
Laan Tungir 7f86ca8e66 This is a meaningful git commit message v0.7.1 2026-04-17 16:59:07 -04:00
Laan Tungir ed39a7ee4a Release v0.7.0 v0.1.0 v0.7.0 2026-04-17 16:56:46 -04:00