+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+ | | | same | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+same
+------------------------------------------------------------------------------+
Nostr Feed
Showing notes from your follow list.
+------------------------------------------------------------------------------+
+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+ | | | yes, odd | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+yes, odd
+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+ | | | bitchat pulled from china app store | | https://blossom.primal.net/6d1f5304a85f6ccd6af01a7db43da50688636822df7a38af31ef5f66457c6b77.png | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+bitchat pulled from china app store https://blossom.primal.net/6d1f5304a85f6ccd6af01a7db43da50688636822df7a38af31ef5f66457c6b77.png
+- jack -- 3mo ---------------------------------------------------------------------------------------------------[...]+ | | | bitchat now has: | | - photos/audio notes in bluetooth mesh | | - better routing algorithm for stabler and longer range meshes | | - uses @torproject's arti framework for speed and reliability | | - audited by 3rd party security group and addressed all findings | | | | bitchat.free | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+bitchat now has: - photos/audio notes in bluetooth mesh - better routing algorithm for stabler and longer range meshes - uses @torproject's arti framework for speed and reliability - audited by 3rd party security group and addressed all findings bitchat.free
+- jack -- 3mo ---------------------------------------------------------------------------------------------------[...]+ | | | gm | | note:00b0c20b…8475 | | | +-- reply --------------------------------------------------------------------------------------------- [50 replies] ---+gm note:00b0c20b…8475
+- Damus -- 4mo --------------------------------------------------------------------------------------------------[...]+ | | | Got questions about Damus, nostr, or something completely unrelated and obscure? Come join Stacker News AMA in 20 | | mins to chat with @jb55 https://stacker.news/items/1328748 | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+Got questions about Damus, nostr, or something completely unrelated and obscure? Come join Stacker News AMA in 20 mins to chat with @jb55 https://stacker.news/items/1328748
+- jack -- 5mo ---------------------------------------------------------------------------------------------------[...]+ | | | nostr wins if it stops trying to be a twitter clone and starts being the invisible layer underneath apps you | | actually want to use. like bitchat for location-based messaging, diVine for entertainment, whitenoise for private | | messaging, zap.stream for streaming, shakespeare for vibe coding, etc. | | | | it wins by unbundling into 50 different apps that all talk to each other, rather than one giant app/corp that traps | | you. it's all about the ecosystem. | | | +-- reply -------------------------------------------------------------------------------------------- [214 replies] ---+nostr wins if it stops trying to be a twitter clone and starts being the invisible layer underneath apps you actually want to use. like bitchat for location-based messaging, diVine for entertainment, whitenoise for private messaging, zap.stream for streaming, shakespeare for vibe coding, etc. it wins by unbundling into 50 different apps that all talk to each other, rather than one giant app/corp that traps you. it's all about the ecosystem.
+- jack -- 5mo ---------------------------------------------------------------------------------------------------[...]+ | | | yes | | note:ba9a8a6f…f6bf | | | +-- reply --------------------------------------------------------------------------------------------- [27 replies] ---+yes note:ba9a8a6f…f6bf
+- Damus -- 5mo --------------------------------------------------------------------------------------------------[...]+ | | | The lab is opening soon for Purple Subscribers! https://damus.io/purple/checkout/ | | nostr:note1qd3vylj75ph4s8hr5hxzzstjzswrxxnx5cy33l3qruukgfw4dydqzw3ekn | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+The lab is opening soon for Purple Subscribers! https://damus.io/purple/checkout/ nostr:note1qd3vylj75ph4s8hr5hxzzstjzswrxxnx5cy33l3qruukgfw4dydqzw3ekn [reposted note unavailable on current relays]
+- Damus -- 6mo --------------------------------------------------------------------------------------------------[...]+ | | | Hey Purple Damus supporters! You might need to update to a new Testflight. Apple expired the old one but we've fixed | | it now! Thanks for everyone who alerted us of this! | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+Hey Purple Damus supporters! You might need to update to a new Testflight. Apple expired the old one but we've fixed it now! Thanks for everyone who alerted us of this!
+- Damus -- 8mo --------------------------------------------------------------------------------------------------[...]+ | | | It's launch day!!! Damus is now available on all platforms with Android ready to download! Thanks to everyone who | | has contributed, tested, and waited patiently for this release. We can't wait to hear what you think! | | https://damus.io/android/ | | | | https://damus.io/damus-android/android_video/master.m3u8 | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+It's launch day!!! Damus is now available on all platforms with Android ready to download! Thanks to everyone who has contributed, tested, and waited patiently for this release. We can't wait to hear what you think! https://damus.io/android/ https://damus.io/damus-android/android_video/master.m3u8
+- Damus -- 8mo --------------------------------------------------------------------------------------------------[...]+ | | | Big Damus Announcement on Bitcoin Asia livestream today! 6:50pm PT! Can't wait to hear what ya'll think! | | | | YouTube: http://youtube.com/live/4BBCwyzZxQE | | Rumble: http://rumble.com/v6y3f6g-bitcoin-asia-2025-day-1-livestream.html | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+Big Damus Announcement on Bitcoin Asia livestream today! 6:50pm PT! Can't wait to hear what ya'll think! YouTube: http://youtube.com/live/4BBCwyzZxQE Rumble: http://rumble.com/v6y3f6g-bitcoin-asia-2025-day-1-livestream.html
+- Damus -- 8mo --------------------------------------------------------------------------------------------------[...]+ | | | Hey #nostr! Things have been very busy at Damus HQ this summer. Lots of announcements coming up! First is…. | | | | We have a New Purple Price for Lightning! Monthly is 8,250 sats and yearly is 82,500. You can also still get Purple | | using the in-app purchase. | | | | There’s also a new TestFlight out in the wild for you to try with an example video below. Thanks for all the | | feedback so far. | | | | Note: we will be only be releasing TestFlights for a little while while we navigate apple things… so Purple is the | | way to try out new #damus features first! | | | | To get on TestFlight - https://damus.io/purple/login/. | | | | ### Added | | +- Added new onboarding suggestions based on user-selected interests (Daniel D’Aquino) | | +- Added adjustable max budget setting for Coinos one-click wallets (Daniel D’Aquino) | | | | ### Changed | | +- Improved the image sizing behavior on the image carousel for a smoother experience (Daniel D’Aquino) | | +- Handle npub correctly in draft notes (Askia Linder) | | +- Move users-section to be last in muted view (Askia Linder) | | | | ### Fixed | | +- Fixed #nsfw tag filtering to be case insensitive (Terry Yiu) | | +- Fixed stretchy banner header in Edit profile (Swift) | | | | https://cdn.jb55.com/s/1059ef43ce6b53ac.mp4 | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+Hey #nostr! Things have been very busy at Damus HQ this summer. Lots of announcements coming up! First is…. We have a New Purple Price for Lightning! Monthly is 8,250 sats and yearly is 82,500. You can also still get Purple using the in-app purchase. There’s also a new TestFlight out in the wild for you to try with an example video below. Thanks for all the feedback so far. Note: we will be only be releasing TestFlights for a little while while we navigate apple things… so Purple is the way to try out new #damus features first! To get on TestFlight - https://damus.io/purple/login/. ### Added +- Added new onboarding suggestions based on user-selected interests (Daniel D’Aquino) +- Added adjustable max budget setting for Coinos one-click wallets (Daniel D’Aquino) ### Changed +- Improved the image sizing behavior on the image carousel for a smoother experience (Daniel D’Aquino) +- Handle npub correctly in draft notes (Askia Linder) +- Move users-section to be last in muted view (Askia Linder) ### Fixed +- Fixed #nsfw tag filtering to be case insensitive (Terry Yiu) +- Fixed stretchy banner header in Edit profile (Swift) https://cdn.jb55.com/s/1059ef43ce6b53ac.mp4
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | live on test flight now. next stop: app store. | | | | note:a732fc1d…b55f | | | +-- reply --------------------------------------------------------------------------------------------- [33 replies] ---+live on test flight now. next stop: app store. note:a732fc1d…b55f
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | submit a PR | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+submit a PR
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | bitchat 1.2.0 (purple) shipping to testflight tonight. | | | | this enables mutual favorites to automatically switch to a nostr-based transport when one of them leaves the mesh. | | only for private messages for now using NIP-17. | | | | basically people can bitchat in person, favorite each other at that time, and then can continue the conversation if | | internet is available through nostr, from any distance. no need to input a npub or know anything about nostr. it | | just works. | | | | https://github.com/permissionlesstech/bitchat/pull/358 | | https://blossom.primal.net/dc9f60a514289adc00d9dcb14e64be382317ee50f1749ea2a9cc73758da7af6a.jpg | | | +-- reply -------------------------------------------------------------------------------------------- [155 replies] ---+bitchat 1.2.0 (purple) shipping to testflight tonight. this enables mutual favorites to automatically switch to a nostr-based transport when one of them leaves the mesh. only for private messages for now using NIP-17. basically people can bitchat in person, favorite each other at that time, and then can continue the conversation if internet is available through nostr, from any distance. no need to input a npub or know anything about nostr. it just works. https://github.com/permissionlesstech/bitchat/pull/358 https://blossom.primal.net/dc9f60a514289adc00d9dcb14e64be382317ee50f1749ea2a9cc73758da7af6a.jpg
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | not the point. | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+not the point.
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | no | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+no
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+ | | | where's my bitchat? | | | | app store: https://apps.apple.com/us/app/bitchat-mesh/id6748219622 | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+where's my bitchat? app store: https://apps.apple.com/us/app/bitchat-mesh/id6748219622
+- Damus -- 10mo -------------------------------------------------------------------------------------------------[...]+ | | | 🚀 New Damus TestFlight is live — and it’s a banger. | | | | 🔍 Web of Trust just got smarter (reply guy filter in threads = activated) | | 👥 Follow Packs are here — find your crowd | | 💸 Wallet UX upgrades | | 🛠️ Plus a bunch of behind-the-scenes magic | | | | Big shoutout to our Purple Subscribers for being the first to test the chaos — and to our unstoppable open source | | devs. You’re building the future and killing it! | | | | Join the TestFlight here: https://damus.io/purple/login/ | | | | Full Changelog: | | | | ### Added | | | | - Added send feature to the wallet view (Daniel D’Aquino) | | - Added popover tips to DMs and Notifications toolbars on Trusted Network button (Terry Yiu) | | - Added tip in threads to inform users what trusted network means (Terry Yiu) | | - Added web of trust reply sorting in threads to mitigate spam (Terry Yiu) | | - Added follow list kind 39089 (ericholguin) | | - Added follow pack preview (ericholguin) | | - Added follow pack timeline to Universe View (ericholguin) | | - Added NIP-05 favicon to profile names and NIP-05 web of trust feed (Terry Yiu) | | - Display uploading indicator in post view (Swift Coder) | | | | | | ### Changed | | | | - Removed media from regular link previews if media is already being shown (Terry Yiu) | | - Renamed Friends of Friends to Trusted Network (Terry Yiu) | | - Added privacy-based redaction to nsec in key settings view (Terry Yiu) | | - Added privacy-based redaction to wallet view (Terry Yiu) | | - Renamed Bitcoin Beach wallet to Blink (Terry Yiu) | | | | | | ### Fixed | | | | - Fixed note rendering to include regular link previews with media removed when media previews are disabled (Terry | | Yiu) | | - Improve error handling on wallet send feature (Daniel D’Aquino) | | - Fixed issue where the text "??" would appear on the balance while loading (Daniel D’Aquino) | | - Hide end previewables when hashtags are present (Terry Yiu) | | - Fixed wallet transactions to always show profile display name unless there is no pubkey (Terry Yiu) | | - Fixed quotes view header alignment (Terry Yiu) | | | | | | ### Removed | | | | - Removed hashtags in Universe View (ericholguin) | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+🚀 New Damus TestFlight is live — and it’s a banger. 🔍 Web of Trust just got smarter (reply guy filter in threads = activated) 👥 Follow Packs are here — find your crowd 💸 Wallet UX upgrades 🛠️ Plus a bunch of behind-the-scenes magic Big shoutout to our Purple Subscribers for being the first to test the chaos — and to our unstoppable open source devs. You’re building the future and killing it! Join the TestFlight here: https://damus.io/purple/login/ Full Changelog: ### Added - Added send feature to the wallet view (Daniel D’Aquino) - Added popover tips to DMs and Notifications toolbars on Trusted Network button (Terry Yiu) - Added tip in threads to inform users what trusted network means (Terry Yiu) - Added web of trust reply sorting in threads to mitigate spam (Terry Yiu) - Added follow list kind 39089 (ericholguin) - Added follow pack preview (ericholguin) - Added follow pack timeline to Universe View (ericholguin) - Added NIP-05 favicon to profile names and NIP-05 web of trust feed (Terry Yiu) - Display uploading indicator in post view (Swift Coder) ### Changed - Removed media from regular link previews if media is already being shown (Terry Yiu) - Renamed Friends of Friends to Trusted Network (Terry Yiu) - Added privacy-based redaction to nsec in key settings view (Terry Yiu) - Added privacy-based redaction to wallet view (Terry Yiu) - Renamed Bitcoin Beach wallet to Blink (Terry Yiu) ### Fixed - Fixed note rendering to include regular link previews with media removed when media previews are disabled (Terry Yiu) - Improve error handling on wallet send feature (Daniel D’Aquino) - Fixed issue where the text "??" would appear on the balance while loading (Daniel D’Aquino) - Hide end previewables when hashtags are present (Terry Yiu) - Fixed wallet transactions to always show profile display name unless there is no pubkey (Terry Yiu) - Fixed quotes view header alignment (Terry Yiu) ### Removed - Removed hashtags in Universe View (ericholguin)
+- Damus -- 11mo -------------------------------------------------------------------------------------------------[...]+ | | | This week we're proving that #damus team members do more than code 24/7! If you're in Oslo, Vegas or Vancouver, come | | say hi! We have a meet and greet in the Nostr lounge at the Bitcoin conference in Las Vegas (1pm), and a | | presentation at the #nosvegas side event (8:30pm). Plus we've got a booth at Web Summit Vancouver - all on May 28th. | | #damusremote #nosvegas | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+This week we're proving that #damus team members do more than code 24/7! If you're in Oslo, Vegas or Vancouver, come say hi! We have a meet and greet in the Nostr lounge at the Bitcoin conference in Las Vegas (1pm), and a presentation at the #nosvegas side event (8:30pm). Plus we've got a booth at Web Summit Vancouver - all on May 28th. #damusremote #nosvegas
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | sats is definitely the wrong term and is stopping everyday people from holding and spending bitcoin. | | | | i agree with steve’s points in this video. | | | | https://youtu.be/F6X03efgJww | | | +-- reply -------------------------------------------------------------------------------------------- [141 replies] ---+sats is definitely the wrong term and is stopping everyday people from holding and spending bitcoin. i agree with steve’s points in this video. https://youtu.be/F6X03efgJww
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | nope | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+nope
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | now at https://nostream.pub | | | | note:d37b030b…80d4 | | | +-- reply ---------------------------------------------------------------------------------------------- [2 replies] ---+now at https://nostream.pub note:d37b030b…80d4
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | ¯\_(ツ)_/¯ | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+¯\_(ツ)_/¯
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | source: | | | | <!DOCTYPE html> | | <html lang="en"> | | <head> | | <meta charset="UTF-8"> | | <meta name="viewport" content="width=device-width, initial-scale=1.0"> | | <title>Nostr Media Feed</title> | | <style> | | :root { | | --bg-color: #ffffff; | | --text-color: #333333; | | } | | | | [data-theme="dark"] { | | --bg-color: #1a1a1a; | | --text-color: #ffffff; | | } | | | | body { | | font-family: -apple-system, system-ui, sans-serif; | | margin: 0; | | padding: 0; | | background: var(--bg-color); | | color: var(--text-color); | | } | | | | #header { | | position: fixed; | | top: 0; | | left: 0; | | right: 0; | | padding: 15px 20px; | | background: var(--bg-color); | | display: flex; | | justify-content: space-between; | | align-items: center; | | z-index: 1000; | | font-size: 14px; | | } | | | | #feed { | | margin-top: 52px; | | } | | | | .note { | | margin-bottom: 0; | | } | | | | .media-container { | | background: #000; | | line-height: 0; | | width: 100%; | | } | | | | .media-container a { | | display: block; | | line-height: 0; | | } | | | | .media-container img, | | .media-container video { | | width: 100%; | | height: auto; | | object-fit: contain; | | opacity: 0; | | transition: opacity 0.5s ease-in; | | } | | | | .media-container img.loaded, | | .media-container video.loaded { | | opacity: 1; | | } | | | | #status { | | display: flex; | | align-items: center; | | gap: 6px; | | opacity: 0.7; | | } | | | | .status-dot { | | width: 6px; | | height: 6px; | | border-radius: 50%; | | } | | | | .status-live .status-dot { | | background: #4CAF50; | | } | | | | .status-paused .status-dot { | | background: #ff9800; | | } | | | | @media (min-width: 800px) { | | .media-container img, | | .media-container video { | | max-height: 100vh; | | } | | } | | | | @media (max-width: 799px) { | | .media-container img, | | .media-container video { | | max-height: none; | | } | | } | | </style> | | </head> | | <body> | | <div id="header"> | | <div id="status" class="status-live"> | | <div class="status-dot"></div> | | <span>Live</span> | | </div> | | </div> | | <div id="feed"></div> | | | | <script> | | // Auto dark mode | | if (window.matchMedia('(prefers-color-scheme: dark)').matches) { | | document.body.setAttribute('data-theme', 'dark'); | | } | | window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => { | | document.body.setAttribute('data-theme', e.matches ? 'dark' : 'light'); | | }); | | | | // Initialize | | const feed = document.getElementById('feed'); | | const status = document.getElementById('status'); | | const seenNotes = new Set(); | | const seenMedia = new Set(); | | let isPaused = false; | | | | // Relays | | const RELAYS = [ | | 'wss://relay.damus.io', | | 'wss://relay.nostr.band', | | 'wss://nos.lol', | | 'wss://relay.nostr.info' | | ]; | | | | const relayPool = new Map(); | | | | // Function to update status display | | function updateStatus(paused) { | | status.className = paused ? 'status-paused' : 'status-live'; | | status.querySelector('span').textContent = paused ? 'Paused' : 'Live'; | | } | | | | // Pause/Resume based on scroll position | | let lastScrollTop = 0; | | window.addEventListener('scroll', () => { | | const st = window.pageYOffset || document.documentElement.scrollTop; | | if (st > lastScrollTop && st > 100) { | | // Scrolling down | | if (!isPaused) { | | isPaused = true; | | updateStatus(true); | | } | | } else if (st === 0) { | | // At top | | if (isPaused) { | | isPaused = false; | | updateStatus(false); | | } | | } | | lastScrollTop = st; | | }); | | | | // Connect to relays | | function connect() { | | let connectedRelays = 0; | | | | RELAYS.forEach(relayUrl => { | | const socket = new WebSocket(relayUrl); | | relayPool.set(relayUrl, socket); | | | | socket.onopen = () => { | | connectedRelays++; | | if (connectedRelays === 1) { | | updateStatus(false); | | } | | | | // Subscribe to notes with media | | const recentSub = JSON.stringify([ | | "REQ", | | "recent_" + relayUrl, | | { | | "kinds": [1], | | "limit": 500 | | } | | ]); | | socket.send(recentSub); | | }; | | | | socket.onclose = () => { | | relayPool.delete(relayUrl); | | connectedRelays--; | | if (connectedRelays === 0) { | | setTimeout(() => connect(), 2000); | | } | | }; | | | | socket.onerror = (error) => { | | console.error('WebSocket error:', error); | | }; | | | | // Handle incoming messages | | socket.onmessage = async (event) => { | | if (isPaused) return; | | | | const data = JSON.parse(event.data); | | if (data[0] !== 'EVENT') return; | | | | const msg = data[2]; | | | | // Handle notes | | if (msg.kind !== 1) return; | | if (seenNotes.has(msg.id)) return; | | seenNotes.add(msg.id); | | | | // Look for media URLs | | const mediaUrls = []; | | const urlRegex = /(https?:\/\/[^\s<]+\.(jpg|jpeg|png|gif|mp4|webm))/gi; | | let match; | | while ((match = urlRegex.exec(msg.content)) !== null) { | | mediaUrls.push(match[0]); | | } | | if (mediaUrls.length === 0) return; | | | | // Check for duplicate media | | const mediaKey = mediaUrls.sort().join(','); | | if (seenMedia.has(mediaKey)) return; | | seenMedia.add(mediaKey); | | | | try { | | // Create note element | | const noteEl = document.createElement('div'); | | noteEl.className = 'note'; | | | | // Add media | | const mediaContainer = document.createElement('div'); | | mediaContainer.className = 'media-container'; | | | | // Make media container clickable | | const mediaLink = document.createElement('a'); | | mediaLink.href = `https://njump.me/${msg.id}`; | | mediaLink.target = '_blank'; | | mediaLink.style.cursor = 'pointer'; | | mediaContainer.appendChild(mediaLink); | | | | for (const url of mediaUrls) { | | if (url.match(/\.(jpg|jpeg|png|gif)$/i)) { | | try { | | // Create and preload image | | const img = document.createElement('img'); | | img.style.opacity = '0'; | | img.src = url; | | img.loading = 'lazy'; | | | | // Wait for image to load | | await new Promise((resolve, reject) => { | | img.onload = resolve; | | img.onerror = reject; | | }); | | | | // Add to container and fade in | | mediaLink.appendChild(img); | | requestAnimationFrame(() => { | | img.style.opacity = '1'; | | }); | | } catch (e) { | | console.error('Failed to load image:', url); | | } | | } else { | | const video = document.createElement('video'); | | video.src = url; | | video.controls = true; | | video.autoplay = true; | | video.muted = true; | | video.loop = true; | | video.playsInline = true; | | video.style.opacity = '0'; | | | | // Fade in once video starts playing | | video.addEventListener('playing', () => { | | requestAnimationFrame(() => { | | video.style.opacity = '1'; | | }); | | }, { once: true }); | | | | video.onerror = () => { | | video.remove(); | | }; | | mediaLink.appendChild(video); | | // Try to start playing | | video.play().catch(e => console.log('Auto-play prevented:', e)); | | } | | } | | | | noteEl.appendChild(mediaContainer); | | feed.insertBefore(noteEl, feed.firstChild); | | } catch (e) { | | console.error('Error creating note element:', e); | | } | | }; | | }); | | } | | | | // Initial connection | | connect(); | | </script> | | </body> | | </html> | | | +-- reply ---------------------------------------------------------------------------------------------- [4 replies] ---+source: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Nostr Media Feed</title> <style> :root { --bg-color: #ffffff; --text-color: #333333; } [data-theme="dark"] { --bg-color: #1a1a1a; --text-color: #ffffff; } body { font-family: -apple-system, system-ui, sans-serif; margin: 0; padding: 0; background: var(--bg-color); color: var(--text-color); } #header { position: fixed; top: 0; left: 0; right: 0; padding: 15px 20px; background: var(--bg-color); display: flex; justify-content: space-between; align-items: center; z-index: 1000; font-size: 14px; } #feed { margin-top: 52px; } .note { margin-bottom: 0; } .media-container { background: #000; line-height: 0; width: 100%; } .media-container a { display: block; line-height: 0; } .media-container img, .media-container video { width: 100%; height: auto; object-fit: contain; opacity: 0; transition: opacity 0.5s ease-in; } .media-container img.loaded, .media-container video.loaded { opacity: 1; } #status { display: flex; align-items: center; gap: 6px; opacity: 0.7; } .status-dot { width: 6px; height: 6px; border-radius: 50%; } .status-live .status-dot { background: #4CAF50; } .status-paused .status-dot { background: #ff9800; } @media (min-width: 800px) { .media-container img, .media-container video { max-height: 100vh; } } @media (max-width: 799px) { .media-container img, .media-container video { max-height: none; } } </style> </head> <body> <div id="header"> <div id="status" class="status-live"> <div class="status-dot"></div> <span>Live</span> </div> </div> <div id="feed"></div> <script> // Auto dark mode if (window.matchMedia('(prefers-color-scheme: dark)').matches) { document.body.setAttribute('data-theme', 'dark'); } window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => { document.body.setAttribute('data-theme', e.matches ? 'dark' : 'light'); }); // Initialize const feed = document.getElementById('feed'); const status = document.getElementById('status'); const seenNotes = new Set(); const seenMedia = new Set(); let isPaused = false; // Relays const RELAYS = [ 'wss://relay.damus.io', 'wss://relay.nostr.band', 'wss://nos.lol', 'wss://relay.nostr.info' ]; const relayPool = new Map(); // Function to update status display function updateStatus(paused) { status.className = paused ? 'status-paused' : 'status-live'; status.querySelector('span').textContent = paused ? 'Paused' : 'Live'; } // Pause/Resume based on scroll position let lastScrollTop = 0; window.addEventListener('scroll', () => { const st = window.pageYOffset || document.documentElement.scrollTop; if (st > lastScrollTop && st > 100) { // Scrolling down if (!isPaused) { isPaused = true; updateStatus(true); } } else if (st === 0) { // At top if (isPaused) { isPaused = false; updateStatus(false); } } lastScrollTop = st; }); // Connect to relays function connect() { let connectedRelays = 0; RELAYS.forEach(relayUrl => { const socket = new WebSocket(relayUrl); relayPool.set(relayUrl, socket); socket.onopen = () => { connectedRelays++; if (connectedRelays === 1) { updateStatus(false); } // Subscribe to notes with media const recentSub = JSON.stringify([ "REQ", "recent_" + relayUrl, { "kinds": [1], "limit": 500 } ]); socket.send(recentSub); }; socket.onclose = () => { relayPool.delete(relayUrl); connectedRelays--; if (connectedRelays === 0) { setTimeout(() => connect(), 2000); } }; socket.onerror = (error) => { console.error('WebSocket error:', error); }; // Handle incoming messages socket.onmessage = async (event) => { if (isPaused) return; const data = JSON.parse(event.data); if (data[0] !== 'EVENT') return; const msg = data[2]; // Handle notes if (msg.kind !== 1) return; if (seenNotes.has(msg.id)) return; seenNotes.add(msg.id); // Look for media URLs const mediaUrls = []; const urlRegex = /(https?:\/\/[^\s<]+\.(jpg|jpeg|png|gif|mp4|webm))/gi; let match; while ((match = urlRegex.exec(msg.content)) !== null) { mediaUrls.push(match[0]); } if (mediaUrls.length === 0) return; // Check for duplicate media const mediaKey = mediaUrls.sort().join(','); if (seenMedia.has(mediaKey)) return; seenMedia.add(mediaKey); try { // Create note element const noteEl = document.createElement('div'); noteEl.className = 'note'; // Add media const mediaContainer = document.createElement('div'); mediaContainer.className = 'media-container'; // Make media container clickable const mediaLink = document.createElement('a'); mediaLink.href = `https://njump.me/${msg.id}`; mediaLink.target = '_blank'; mediaLink.style.cursor = 'pointer'; mediaContainer.appendChild(mediaLink); for (const url of mediaUrls) { if (url.match(/\.(jpg|jpeg|png|gif)$/i)) { try { // Create and preload image const img = document.createElement('img'); img.style.opacity = '0'; img.src = url; img.loading = 'lazy'; // Wait for image to load await new Promise((resolve, reject) => { img.onload = resolve; img.onerror = reject; }); // Add to container and fade in mediaLink.appendChild(img); requestAnimationFrame(() => { img.style.opacity = '1'; }); } catch (e) { console.error('Failed to load image:', url); } } else { const video = document.createElement('video'); video.src = url; video.controls = true; video.autoplay = true; video.muted = true; video.loop = true; video.playsInline = true; video.style.opacity = '0'; // Fade in once video starts playing video.addEventListener('playing', () => { requestAnimationFrame(() => { video.style.opacity = '1'; }); }, { once: true }); video.onerror = () => { video.remove(); }; mediaLink.appendChild(video); // Try to start playing video.play().catch(e => console.log('Auto-play prevented:', e)); } } noteEl.appendChild(mediaContainer); feed.insertBefore(noteEl, feed.firstChild); } catch (e) { console.error('Error creating note element:', e); } }; }); } // Initial connection connect(); </script> </body> </html>
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | just scroll and it pauses | | | +-- reply --------------------------------------------------------------------------------------------------------- ---+just scroll and it pauses
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+ | | | vibe coded this. nostr firehose stream, media only, scroll to pause, tap media to get to profile | | | | https://nostrstream.replit.app | | | | nice in full screen. | | | | (you may see things you don't want to see) | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+vibe coded this. nostr firehose stream, media only, scroll to pause, tap media to get to profile https://nostrstream.replit.app nice in full screen. (you may see things you don't want to see)
+- Damus -- 11mo -------------------------------------------------------------------------------------------------[...]+ | | | 🚀 Damus Notedeck Beta Release 🚀 | | | | Today we're launching the beta version of our multiplatform nostr browser! Think google chrome but for nostr apps. | | The beta is our big first step toward this vision. | | | | Included in the beta is the Dave, the nostr AI assistant (its grok for nostr). Dave is a new notedeck browser app | | that can search and summarize notes from the network. For a full breakdown of everything new, check out our beta | | launch video 👀 | | | | https://cdn.jb55.com/hls/notedeck-beta-release/master.m3u8 | | | | New in Notedeck Beta: | | | | - Dave nostr ai assistant app | | - GIFs! | | - Fulltext note search | | - Add full screen images, add zoom & pan | | - Zaps! NWC/ Wallet ui | | - Introduce last note per pubkey feed (experimental) | | - Allow multiple media uploads per selection | | - Major Android improvements (still wip) | | - Added notedeck app sidebar | | - User Tagging | | - Note truncation | | - Local network note broadcast, broadcast notes to other notedeck notes while you're offline | | - Mute list support (reading) | | - Relay list support | | - Ctrl-enter to send notes | | - Added relay indexing (relay columns soon) | | - Click hashtags to open hashtag timeline | | | | If you're a purple subscriber, make sure to *login* and download the beta here: https://damus.io/notedeck/install/ . | | if you're not logged in you will only see the Alpha release. | | | | If you're not subscribed, you can get a subscription here: https://damus.io/purple/checkout/ | | | | Also make sure to check out the notedeck usability signal group to give feedback! | | https://signal.group/#CjQKINZJS0LBUTsTQbRW-nWUd6Dhkc6ojcBtyMrZcgThaRzEEhAstno8KLqs8E8J0qajLwir | | | | Enjoy! | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+🚀 Damus Notedeck Beta Release 🚀 Today we're launching the beta version of our multiplatform nostr browser! Think google chrome but for nostr apps. The beta is our big first step toward this vision. Included in the beta is the Dave, the nostr AI assistant (its grok for nostr). Dave is a new notedeck browser app that can search and summarize notes from the network. For a full breakdown of everything new, check out our beta launch video 👀 https://cdn.jb55.com/hls/notedeck-beta-release/master.m3u8 New in Notedeck Beta: - Dave nostr ai assistant app - GIFs! - Fulltext note search - Add full screen images, add zoom & pan - Zaps! NWC/ Wallet ui - Introduce last note per pubkey feed (experimental) - Allow multiple media uploads per selection - Major Android improvements (still wip) - Added notedeck app sidebar - User Tagging - Note truncation - Local network note broadcast, broadcast notes to other notedeck notes while you're offline - Mute list support (reading) - Relay list support - Ctrl-enter to send notes - Added relay indexing (relay columns soon) - Click hashtags to open hashtag timeline If you're a purple subscriber, make sure to *login* and download the beta here: https://damus.io/notedeck/install/ . if you're not logged in you will only see the Alpha release. If you're not subscribed, you can get a subscription here: https://damus.io/purple/checkout/ Also make sure to check out the notedeck usability signal group to give feedback! https://signal.group/#CjQKINZJS0LBUTsTQbRW-nWUd6Dhkc6ojcBtyMrZcgThaRzEEhAstno8KLqs8E8J0qajLwir Enjoy!
+- jack -- 1y ----------------------------------------------------------------------------------------------------[...]+ | | | https://m.primal.net/QapS.jpg | | | +-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+https://m.primal.net/QapS.jpg