@ Plain Text Nostr
+------------------------------------------------------------------------------+

Nostr Feed

Showing notes from your follow list.

+------------------------------------------------------------------------------+
+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| same                                                                                                                 |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| yes, odd                                                                                                             |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 23d ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| bitchat pulled from china app store                                                                                  |
| https://blossom.primal.net/6d1f5304a85f6ccd6af01a7db43da50688636822df7a38af31ef5f66457c6b77.png                      |
|                                                                                                                      |
+-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 3mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| gm                                                                                                                   |
| note:00b0c20b…8475                                                                                                   |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------- [50 replies] ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- 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] ---+
+- jack -- 5mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| yes                                                                                                                  |
| note:ba9a8a6f…f6bf                                                                                                   |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------- [27 replies] ---+
+- Damus -- 5mo --------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| The lab is opening soon for Purple Subscribers! https://damus.io/purple/checkout/                                    |
| nostr:note1qd3vylj75ph4s8hr5hxzzstjzswrxxnx5cy33l3qruukgfw4dydqzw3ekn                                                |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- 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] ---+
+- 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] ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| live on test flight now. next stop: app store.                                                                       |
|                                                                                                                      |
| note:a732fc1d…b55f                                                                                                   |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------- [33 replies] ---+
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| submit a PR                                                                                                          |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- 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] ---+
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| not the point.                                                                                                       |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| no                                                                                                                   |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 9mo ---------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| where's my bitchat?                                                                                                  |
|                                                                                                                      |
| app store: https://apps.apple.com/us/app/bitchat-mesh/id6748219622                                                   |
|                                                                                                                      |
+-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- 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 --------------------------------------------------------------------------------------------------------- ---+
+- 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] ---+
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| nope                                                                                                                 |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| now at https://nostream.pub                                                                                          |
|                                                                                                                      |
| note:d37b030b…80d4                                                                                                   |
|                                                                                                                      |
+-- reply ---------------------------------------------------------------------------------------------- [2 replies] ---+
+- 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] ---+
+- jack -- 11mo --------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| just scroll and it pauses                                                                                            |
|                                                                                                                      |
+-- reply --------------------------------------------------------------------------------------------------------- ---+
+- 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] ---+
+- 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] ---+
+- jack -- 1y ----------------------------------------------------------------------------------------------------[...]+
|                                                                                                                      |
| https://m.primal.net/QapS.jpg                                                                                        |
|                                                                                                                      |
+-- reply ------------------------------------------------------------------------------------------------ [1 reply] ---+

Write a post

Sign in with a signing-capable method to publish.