source:
: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;
}
}
Live
// 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();
Nice. Kinda funny, amethyst thinks the CSS colors are hashtags and lists them at the bottom of this post 😅
Unpopular opinion: When bitcoin has become really mainstream and the world pretty much depends on it working well as money, there will be zero tolerance to spam. Spam will be expensive, but that won't stop bad actors. Big measures will be taken if necessary, and the op_return PR will go down as one of the most startling stupidities in bitcoin history.
We need alternatives bitcoin implementations to core that compete on equal conditions.
Core can't be the de-facto standard monopoly of bitcoin node software anymore, since core developers make changes that take away freedom of configuration choice from node runners.
Not longer than that? I guess people have no sense for some fun activism...
My stickers from nostr:nprofile1qqst6vdsnmzgzkmpzgx2ht7chwpp7wk7lm4er4pzpfcvgrdym89v5jgpzamhxue69uhhyetvv9ujuurvv438xarj9e3k7mgpr9mhxue69uhhqatjv9mxjerp9ehx7um5wghxcctwvsqs6amnwvaz7tmwdaejumr0ds028c2d just arrived.
Let's find something to vandalize.😈 
The unix philosophy.
Make each program do one thing and do it well. Then make all programs interoperable.
The OS on your device is the ultimate super app. It often traps you into one ecosystem that's either like a walled garden (apple) or a massive vendor-lock-in machine (micro$oft).
Linux OTOH is the OS of freedom, and the browser its ultimate UI engine... Except for chrome of course which is a sneaky spying machine.
Unit bias is an issue with Bitcoin. Newcomers often buy Dogecoin or other altcoins simply because they can own "a lot" of them, while the idea of ever owning a whole Bitcoin feels impossible. One proposed solution by nostr:nprofile1qqsgeksa4tajm7x673gq2v7t56dkgkh6pjhhzdhrgxlpke4za8jmmkqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgqgjwaehxw309ac82unsd3jhqct89ejhxqgkwaehxw309aex2mrp0yhxummnw3ezucnpdejqetk0p4 is to shift the language from 21 million bitcoins to 2.1 quadrillion bitcoins. Bitcoin is a great brand name and using satoshis or sats can be confusing. This would fix that too.
However, I feel this proposal would create confusion too, especially for those new to Bitcoin and for the media—because for 16 years, people have heard there are only 21 million bitcoins. Explaining that the total supply hasn’t changed, only the denomination, would be exhausting. Personally, I think calling them “sats” isn’t very intuitive, they should’ve been called “bits”, but at this point, I don’t really care.
¯\_(ツ)_/¯
People are free to call the units what they want of course, but if you go and call sats bitcoin, then I think it's also your duty to deal with and fix the massive avalanche of confusion that's gonna come at you. It will be HELL and it will be your fault.
Seriously, if no-conoiners have trouble figuring out sats, good luck explaining the infinite pizza problem once you have "changed the issuance" or done "stock splits" or whatnot... 'Cause there will be massive outcry over that perception and it will be all over the mainstream media.
But I'm confident nostr:nprofile1qqsgeksa4tajm7x673gq2v7t56dkgkh6pjhhzdhrgxlpke4za8jmmkqpzemhxue69uhhyetvv9ujuurjd9kkzmpwdejhgqgjwaehxw309ac82unsd3jhqct89ejhxqgkwaehxw309aex2mrp0yhxummnw3ezucnpdejqetk0p4 will never get enough support for that absolutely moronic idea, so no worries.😘
Maybe follow some people from other time zones.
GN.
Cool! Thanks.
In your opinion, what would be the minimum system requirements for an all-in-one system that runs knots, datum and als mines on a couple of local asic chips?
Suppose I wanted to design and build such a single-board miner, what CPU type/speed, RAM and SSD size do you think I would I need to take into account?
Would something like a quad core ARM cortex A72 with 4GiB LPDDR5 and a 1TiB NVMe drive be enough in your opinion?
First order. I see SoV as a constant and MoE as a time depended change of that constant.
Like position and velocity.
Coincidentally, in economics one talks about the velocity of money, which is the speed of which one unit moves through the economy (changes hands), so this may be quite fitting.
MoE = dSoV / dt
Just like Nixon screwed the rest of the world over Bretton woods by abandoning the gold standard, Trump is now screwing the rest of the world again by claiming the trade deficit the US needed to run due to Bretton woods was unfair and demanding compensation.
Bretton woods was a hell of a deal for the US, and the world leaders who signed it were naive.
Bretton woods was a workaround and the US masterfully exploited it's flaws. #Bitcoin is the real fix, and it has no such exploits.
Got a headache?
Try to take a hot shower onto your head, so your tiny skull expands a bit to make your swollen brain fit a little better and not hurt so much...
...or just buy some #bitcoin 🤷🏾♂️
How far in the sand does your head have to be buried to honestly believe this is "water condensation"?
#Chemtrails #Geoengineering https://video.nostr.build/fd1c04a79a7f2196a102e0a024b00c145630349d1b232dc35fe1411a264c9d86.mp4
Yes, of course it is. What else would that be?
Turbines burn kerosene (a hydrocarbon), which combined with oxygen turns into CO2 and water vapor.
Nobody* wants or needs a digital Euro.
*) except authoritarian regimes and the ECB for some reason.


