Avatar
₿/🐈‍⬛
a514ab3befb752faaeb536192d04941dc25b88458e89407f9539bb89f39daf78

Yeah I don't care about some dickhead that every now and then discovers spamster or makes one, I like the reply girls that are a fan of nostr:nprofile1qqsr9cvzwc652r4m83d86ykplrnm9dg5gwdvzzn8ameanlvut35wy3gpzpmhxue69uhkummnw3ezuamfdejsz9rhwden5te0wfjkccte9ejxzmt4wvhxjmcpz4mhxue69uhhyetvv9ujumt0wd68ytnsw43qdwkdtx and blossom up the ai response (the primal one). Now that's an effort hahah.

Replying to Avatar Cocktus 🌵

Ahaha gotta love nostr. nostr:nprofile1qqspcxtmzt9feczptdcwwszmjac0pmrtena4nvetvw406sktyshpvssprdmhxue69uhhw6r9v96zu6rpwpc8jarpwejhym3wvdhj7qg4waehxw309aex2mrp0yhxgctdw4eju6t09uqsuamnwvaz7tmwdaejumr0dshsm8xw8z check this out. Wanted to play with nostr:nprofile1qqsw2n8a6yps2lwm7249ak4eqzs7m0ygypdr789075w26c9eap44x0qpzpmhxue69uhkummnw3ezumt0d5hsz9thwden5te0wfjkccte9ejxzmt4wvhxjme0qy88wumn8ghj7mn0wvhxcmmv9upz06yf nostr-rss (which nostter.app uses, but could be used with any web nostr client) to turn some(any) pubs rss(with media in notes) to be used by podbean and podcast republic which handle video (antennapod trots the m3u8 support as well so meh) and now you are on my podbean playlist so keep the good stuff coming 🤣🤙 Sharing from the pod apps to oxchat and geting the dms on amethyst is 🔥

https://cdn.satellite.earth/7863513e4d61f7eeb52ba1c9c83070ac57264616bcbc2ec9432b9680da506180.mp4

Ahaha gotta love nostr. nostr:nprofile1qqspcxtmzt9feczptdcwwszmjac0pmrtena4nvetvw406sktyshpvssprdmhxue69uhhw6r9v96zu6rpwpc8jarpwejhym3wvdhj7qg4waehxw309aex2mrp0yhxgctdw4eju6t09uqsuamnwvaz7tmwdaejumr0dshsm8xw8z check this out. Wanted to play with nostr:nprofile1qqsw2n8a6yps2lwm7249ak4eqzs7m0ygypdr789075w26c9eap44x0qpzpmhxue69uhkummnw3ezumt0d5hsz9thwden5te0wfjkccte9ejxzmt4wvhxjme0qy88wumn8ghj7mn0wvhxcmmv9upz06yf nostr-rss (which nostter.app uses, but could be used with any web nostr client) to turn some(any) pubs rss(with media in notes) to be used by podbean and podcast republic which handle video (antennapod trots the m3u8 support as well so meh) and now you are on my podbean playlist so keep the good stuff coming 🤣🤙 Sharing from the pod apps to oxchat and geting the dms on amethyst is 🔥

https://cdn.satellite.earth/7863513e4d61f7eeb52ba1c9c83070ac57264616bcbc2ec9432b9680da506180.mp4

Replying to Avatar ₿/🐈‍⬛

Yo, my favorite new blossom+deno to nostr shit is to scrape tenor #catstr gifs and 🌸 them up now that nostrcheck is in as well, thanks to nostr:nprofile1qqszv6q4uryjzr06xfxxew34wwc5hmjfmfpqn229d72gfegsdn2q3fgpz9mhxue69uhkummnw3ezuamfdejj7qg6waehxw309ahx7um5wgh8g6r9wdsk6etrv96zu6t09uqsuamnwvaz7tmwdaejumr0dshs9h69jx nostr:nprofile1qqsqgc0uhmxycvm5gwvn944c7yfxnnxm0nyh8tt62zhrvtd3xkj8fhgprdmhxue69uhkwmr9v9ek7mnpw3hhytnyv4mz7un9d3shjqgcwaehxw309ahx7umywf5hvefwv9c8qtmjv4kxz7gpzemhxue69uhhyetvv9ujumt0wd68ytnsw43z7s3al0v and the heads up of nostr:nprofile1qqsgdp0taan9xwxadyc79nxl8svanu895yr8eyv0ytnss8p9tru047qpp4mhxue69uhkummn9ekx7mqpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3qamnwvaz7tmwdaehgu3wwa5kuegzls3js instagram script.

nostr:nevent1qqsq5t4scgw95pma9w0gk8tk0j5t07mu9lel3qv4ssa7p40a95gg5fgpzfmhxue69uhkummnw3ezumr49e4k2tczyz24gvcfdl9zy0ef4h749gxzmcr683fwk6q0ndxeadkydkged32quqcyqqqqqqg3phnsz

```

import { NSecSigner, NRelay1, NSchema as n } from '@nostrify/nostrify';

import { BlossomUploader } from '@nostrify/nostrify/uploaders'; import * as nip19 from 'nostr-tools/nip19'; // Helper function to convert a hex string to Uint8Array function hexToUint8Array(hex: string): Uint8Array { if (hex.length % 2 !== 0) { throw new Error("Hex string must have an even length"); } const array = new Uint8Array(hex.length / 2); for (let i = 0; i < hex.length; i += 2) { array[i / 2] = parseInt(hex.substr(i, 2), 16); } return array; } // Retrieve the secret key from an environment variable const hexSecretKey = Deno.env.get('SECRET_KEY_HEX');

if (!hexSecretKey) { throw new Error('Environment variable "SECRET_KEY_HEX" is not set.'); } const secretKey: Uint8Array = hexToUint8Array(hexSecretKey); // Initialize the signer with your secret key const signer = new NSecSigner(secretKey);

// Define the relay URLs

const relayUrls = [

'wss://nostr.mom', 'wss://nos.lol', 'wss://relay.primal.net', 'wss://e.nos.lol', 'wss://relay.nostr.band' ];

// Create an array of NRelay1 instances const relays = relayUrls.map(url => new NRelay1(url)); // Path to the JSON file that stores uploaded files

const uploadedFilesPath = './uploaded_files.json'; // Function to read uploaded files from JSON async function readUploadedFiles(): Promise> {

try { const data = await Deno.readTextFile(uploadedFilesPath); return new Set(JSON.parse(data)); } catch { return new Set();

} }

// Function to write uploaded files to JSON

async function writeUploadedFiles(uploadedFiles: Set) { await Deno.writeTextFile(uploadedFilesPath, JSON.stringify(Array.from(uploadedFiles))); }

// Function to sign, parse, and upload a media file async function signAndUploadMedia(filePath: string, uploadedFiles: Set) { try {

// Check if the file has already been uploaded if (uploadedFiles.has(filePath)) {

console.log(`File ${filePath} has already been uploaded. Skipping.`); return; }

// Get the public key from the signer const pubkey = await signer.getPublicKey();

// Initialize the uploader const uploader = new BlossomUploader({

servers: [ 'https://cdn.satellite.earth',

'https://nstore.nostrver.se',

'https://blossom.puhcho.me',

'https://blossom.primal.net', 'https://files.v0l.io/', 'https://cdn.nostrcheck.me' ],

signer: signer, // Use the signer for authentication

}); // Read the file const fileBuffer = await Deno.readFile(filePath);

const file = new File([fileBuffer], filePath.split('/').pop()!);

// Upload the file and get the tags const tags = await uploader.upload(file);

// Find the URL in the tags let fileUrl = 'Unknown URL';

for (const tag of tags) {

if (tag[0] === "url" && tag[1]) {

fileUrl = tag[1];

break; } } // Create event data

const eventData = { kind: 1,

content: `${fileUrl}`,

tags: tags, created_at: Math.floor(Date.now() / 1000), };

// Sign the event to get id and sig

const signedEvent = await signer.signEvent(eventData);

const completeEventData = {

...eventData, id: signedEvent.id, pubkey: pubkey, sig: signedEvent.sig,

};

// Parse and validate the complete event data using NSchema

const event = n.event().parse(completeEventData); console.log('Parsed and validated event:', event);

// Send the event to each relay for (const relay of relays) { console.log('Sending event to relay:', relay); console.log(await relay.event(event));

await relay.close(); } // Add the file to the uploaded files set and update the JSON file uploadedFiles.add(filePath); await writeUploadedFiles(uploadedFiles);

console.log("Done!");

} catch (error) {

console.error('Error signing and uploading media:', error);

} } // Function to select a random valid file from a folder

async function getRandomValidFileFromFolder(folderPath: string, uploadedFiles: Set): Promise { const validExtensions = ['jpg', 'mp4', 'webp', 'gif']; const files: string[] = []; for await (const dirEntry of Deno.readDir(folderPath)) { if (dirEntry.isFile) {

const extension = dirEntry.name.split('.').pop()?.toLowerCase(); if (extension && validExtensions.includes(extension)) { files.push(dirEntry.name); } }

} // Filter out files that have already been uploaded const unuploadedFiles = files.filter(file => !uploadedFiles.has(`${folderPath}/${file}`));

if (unuploadedFiles.length === 0) { console.error('No unuploaded valid files found. Please add new JPG, MP4, or WEBP files.');

return null; } const randomIndex = Math.floor(Math.random() * unuploadedFiles.length);

return `${folderPath}/${unuploadedFiles[randomIndex]}`;

}

// Example usage

const folderPath = Deno.env.get('MEDIA_FOLDER_PATH');

if (folderPath) { readUploadedFiles().then((uploadedFiles) => {

getRandomValidFileFromFolder(folderPath, uploadedFiles).then((randomFilePath) => { if (randomFilePath) {

signAndUploadMedia(randomFilePath, uploadedFiles);

}

});

});

} else {

console.error('Environment variable "MEDIA_FOLDER_PATH" is not set.');

}

```

Also puts amethyst gallery to good use:

https://v.nostr.build/ICPPrle8VODjFOPV.mp4

```

import { NSecSigner, NRelay1, NSchema as n } from '@nostrify/nostrify';

import { BlossomUploader } from '@nostrify/nostrify/uploaders';

import * as nip19 from 'nostr-tools/nip19';

// Helper function to convert a hex string to Uint8Array

function hexToUint8Array(hex: string): Uint8Array {

if (hex.length % 2 !== 0) {

throw new Error("Hex string must have an even length");

}

const array = new Uint8Array(hex.length / 2);

for (let i = 0; i < hex.length; i += 2) {

array[i / 2] = parseInt(hex.substr(i, 2), 16);

}

return array;

}

// Function to read uploaded files from JSON

async function readUploadedFiles(uploadedFilesPath: string): Promise> {

try {

const data = await Deno.readTextFile(uploadedFilesPath);

return new Set(JSON.parse(data));

} catch {

return new Set();

}

}

// Function to write uploaded files to JSON

async function writeUploadedFiles(uploadedFiles: Set, uploadedFilesPath: string) {

await Deno.writeTextFile(uploadedFilesPath, JSON.stringify(Array.from(uploadedFiles)));

}

// Function to append a URL to a text file

async function appendUrlToFile(fileUrl: string, urlFilePath: string) {

try {

await Deno.writeTextFile(urlFilePath, fileUrl + '\n', { append: true });

console.log(`Appended URL to file: ${fileUrl}`);

} catch (error) {

console.error('Error appending URL to file:', error);

}

}

// Function to sign, parse, and upload a media file

async function signAndUploadMedia(

filePath: string,

uploadedFiles: Set,

urlFilePath: string,

signer: NSecSigner,

relays: { relay: NRelay1; url: string }[]

) {

try {

// Check if the file has already been uploaded

if (uploadedFiles.has(filePath)) {

console.log(`File ${filePath} has already been uploaded. Skipping.`);

return;

}

// Get the public key from the signer

const pubkey = await signer.getPublicKey();

// Initialize the uploader

const uploader = new BlossomUploader({

servers: [

'https://cdn.satellite.earth',

'https://nstore.nostrver.se',

'https://blossom.puhcho.me',

'https://blossom.primal.net',

'https://cdn.nostrcheck.me'

],

signer: signer,

});

// Read the file

const fileBuffer = await Deno.readFile(filePath);

const file = new File([fileBuffer], filePath.split('/').pop()!);

// Upload the file and get the tags

const tags = await uploader.upload(file);

// Find the URL in the tags

let fileUrl = 'Unknown URL';

for (const tag of tags) {

if (tag[0] === "url" && tag[1]) {

fileUrl = tag[1];

break;

}

}

// Append the URL to the text file

await appendUrlToFile(fileUrl, urlFilePath);

// Create event data

const eventData = {

kind: 1,

content: `${fileUrl}`,

tags: tags,

created_at: Math.floor(Date.now() / 1000),

};

// Sign the event to get id and sig

const signedEvent = await signer.signEvent(eventData);

const completeEventData = {

...eventData,

id: signedEvent.id,

pubkey: pubkey,

sig: signedEvent.sig,

};

// Parse and validate the complete event data using NSchema

const event = n.event().parse(completeEventData);

console.log('Parsed and validated event:', event);

// Send the event to each relay

for (const { relay, url } of relays) {

try {

console.log(`Sending event to relay ${url}`);

await relay.event(event);

console.log(`Event sent successfully to ${url}`);

} catch (error) {

console.error(`Error sending event to relay ${url}:`, error);

} finally {

try {

await relay.close();

console.log(`Relay ${url} closed`);

} catch (closeError) {

console.error(`Error closing relay ${url}:`, closeError);

}

}

}

// Add the file to the uploaded files set and update the JSON file

uploadedFiles.add(filePath);

await writeUploadedFiles(uploadedFiles, './uploaded_files.json');

console.log("Done!");

} catch (error) {

console.error('Error signing and uploading media:', error);

}

}

// Function to select a random valid file from a folder

async function getRandomValidFileFromFolder(folderPath: string, uploadedFiles: Set): Promise {

const validExtensions = ['jpg', 'mp4', 'webp', 'gif'];

const files: string[] = [];

for await (const dirEntry of Deno.readDir(folderPath)) {

if (dirEntry.isFile) {

const extension = dirEntry.name.split('.').pop()?.toLowerCase();

if (extension && validExtensions.includes(extension)) {

files.push(dirEntry.name);

}

}

}

// Filter out files that have already been uploaded

const unuploadedFiles = files.filter(file => !uploadedFiles.has(`${folderPath}/${file}`));

if (unuploadedFiles.length === 0) {

console.log('All files have been uploaded. Selecting a random URL to publish.');

return null;

}

const randomIndex = Math.floor(Math.random() * unuploadedFiles.length);

return `${folderPath}/${unuploadedFiles[randomIndex]}`;

}

// Function to publish a Nostr event with a random URL

async function publishRandomUrlEvent(urlFilePath: string, signer: NSecSigner, relays: { relay: NRelay1; url: string }[]) {

try {

const urls = (await Deno.readTextFile(urlFilePath)).trim().split('\n');

if (urls.length === 0) {

console.error('No URLs found in the URL file.');

return;

}

const randomUrl = urls[Math.floor(Math.random() * urls.length)];

// Create event data

const eventData = {

kind: 1,

content: `${randomUrl}`,

tags: [],

created_at: Math.floor(Date.now() / 1000),

};

// Sign the event to get id and sig

const signedEvent = await signer.signEvent(eventData);

const completeEventData = {

...eventData,

id: signedEvent.id,

pubkey: await signer.getPublicKey(),

sig: signedEvent.sig,

};

// Parse and validate the complete event data using NSchema

const event = n.event().parse(completeEventData);

console.log('Parsed and validated event:', event);

for (const { relay, url } of relays) {

try {

console.log(`Sending event to relay ${url}`);

await relay.event(event);

console.log(`Event sent successfully to ${url}`);

} catch (error) {

console.error(`Error sending event to relay ${url}:`, error);

} finally {

try {

await relay.close();

console.log(`Relay ${url} closed`);

} catch (closeError) {

console.error(`Error closing relay ${url}:`, closeError);

}

}

}

console.log("Published random URL event successfully!");

} catch (error) {

console.error('Error publishing random URL event:', error);

}

}

// Main function to execute the script

async function main() {

const hexSecretKey = Deno.env.get('SECRET_KEY_HEX');

if (!hexSecretKey) {

console.error('Environment variable "SECRET_KEY_HEX" is not set.');

Deno.exit(1);

return;

}

const secretKey: Uint8Array = hexToUint8Array(hexSecretKey);

// Initialize the signer with your secret key

const signer = new NSecSigner(secretKey);

// Define the relay URLs

const relayUrls = [

'wss://nostr.mom',

'wss://nos.lol',

'wss://relay.primal.net',

'wss://e.nos.lol',

'wss://relay.damus.io',

'wss://nostr.lu.ke',

'wss://nostr.oxtr.dev',

'wss://relay.nostrcheck.me',

'wss://nostr.data.haus',

'wss://ditto.puhcho.me/relay',

'wss://offchain.pub',

'wss://strfry.iris.to'

];

// Create an array of NRelay1 instances with their URLs

const relays = relayUrls.map(url => ({ relay: new NRelay1(url), url }));

// Path to the JSON file that stores uploaded files

const uploadedFilesPath = './home/user/test_bloom/uploaded_files.json';

// Path to the text file that stores uploaded URLs

const urlFilePath = './home/user/test_bloom/uploaded_urls.txt';

// Example usage

const folderPath = Deno.env.get('MEDIA_FOLDER_PATH');

if (folderPath) {

try {

const uploadedFiles = await readUploadedFiles(uploadedFilesPath);

const randomFilePath = await getRandomValidFileFromFolder(folderPath, uploadedFiles);

if (randomFilePath) {

await signAndUploadMedia(randomFilePath, uploadedFiles, urlFilePath, signer, relays);

} else {

await publishRandomUrlEvent(urlFilePath, signer, relays);

}

} catch (error) {

console.error('Error during execution:', error);

} finally {

Deno.exit();

}

} else {

console.error('Environment variable "MEDIA_FOLDER_PATH" is not set.');

Deno.exit(1);

}

}

// Execute main function

main();

```

Better as it was uploading to just one blossom.

Yo, my favorite new blossom+deno to nostr shit is to scrape tenor #catstr gifs and 🌸 them up now that nostrcheck is in as well, thanks to nostr:nprofile1qqszv6q4uryjzr06xfxxew34wwc5hmjfmfpqn229d72gfegsdn2q3fgpz9mhxue69uhkummnw3ezuamfdejj7qg6waehxw309ahx7um5wgh8g6r9wdsk6etrv96zu6t09uqsuamnwvaz7tmwdaejumr0dshs9h69jx nostr:nprofile1qqsqgc0uhmxycvm5gwvn944c7yfxnnxm0nyh8tt62zhrvtd3xkj8fhgprdmhxue69uhkwmr9v9ek7mnpw3hhytnyv4mz7un9d3shjqgcwaehxw309ahx7umywf5hvefwv9c8qtmjv4kxz7gpzemhxue69uhhyetvv9ujumt0wd68ytnsw43z7s3al0v and the heads up of nostr:nprofile1qqsgdp0taan9xwxadyc79nxl8svanu895yr8eyv0ytnss8p9tru047qpp4mhxue69uhkummn9ekx7mqpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3qamnwvaz7tmwdaehgu3wwa5kuegzls3js instagram script.

nostr:nevent1qqsq5t4scgw95pma9w0gk8tk0j5t07mu9lel3qv4ssa7p40a95gg5fgpzfmhxue69uhkummnw3ezumr49e4k2tczyz24gvcfdl9zy0ef4h749gxzmcr683fwk6q0ndxeadkydkged32quqcyqqqqqqg3phnsz

```

import { NSecSigner, NRelay1, NSchema as n } from '@nostrify/nostrify';

import { BlossomUploader } from '@nostrify/nostrify/uploaders'; import * as nip19 from 'nostr-tools/nip19'; // Helper function to convert a hex string to Uint8Array function hexToUint8Array(hex: string): Uint8Array { if (hex.length % 2 !== 0) { throw new Error("Hex string must have an even length"); } const array = new Uint8Array(hex.length / 2); for (let i = 0; i < hex.length; i += 2) { array[i / 2] = parseInt(hex.substr(i, 2), 16); } return array; } // Retrieve the secret key from an environment variable const hexSecretKey = Deno.env.get('SECRET_KEY_HEX');

if (!hexSecretKey) { throw new Error('Environment variable "SECRET_KEY_HEX" is not set.'); } const secretKey: Uint8Array = hexToUint8Array(hexSecretKey); // Initialize the signer with your secret key const signer = new NSecSigner(secretKey);

// Define the relay URLs

const relayUrls = [

'wss://nostr.mom', 'wss://nos.lol', 'wss://relay.primal.net', 'wss://e.nos.lol', 'wss://relay.nostr.band' ];

// Create an array of NRelay1 instances const relays = relayUrls.map(url => new NRelay1(url)); // Path to the JSON file that stores uploaded files

const uploadedFilesPath = './uploaded_files.json'; // Function to read uploaded files from JSON async function readUploadedFiles(): Promise> {

try { const data = await Deno.readTextFile(uploadedFilesPath); return new Set(JSON.parse(data)); } catch { return new Set();

} }

// Function to write uploaded files to JSON

async function writeUploadedFiles(uploadedFiles: Set) { await Deno.writeTextFile(uploadedFilesPath, JSON.stringify(Array.from(uploadedFiles))); }

// Function to sign, parse, and upload a media file async function signAndUploadMedia(filePath: string, uploadedFiles: Set) { try {

// Check if the file has already been uploaded if (uploadedFiles.has(filePath)) {

console.log(`File ${filePath} has already been uploaded. Skipping.`); return; }

// Get the public key from the signer const pubkey = await signer.getPublicKey();

// Initialize the uploader const uploader = new BlossomUploader({

servers: [ 'https://cdn.satellite.earth',

'https://nstore.nostrver.se',

'https://blossom.puhcho.me',

'https://blossom.primal.net', 'https://files.v0l.io/', 'https://cdn.nostrcheck.me' ],

signer: signer, // Use the signer for authentication

}); // Read the file const fileBuffer = await Deno.readFile(filePath);

const file = new File([fileBuffer], filePath.split('/').pop()!);

// Upload the file and get the tags const tags = await uploader.upload(file);

// Find the URL in the tags let fileUrl = 'Unknown URL';

for (const tag of tags) {

if (tag[0] === "url" && tag[1]) {

fileUrl = tag[1];

break; } } // Create event data

const eventData = { kind: 1,

content: `${fileUrl}`,

tags: tags, created_at: Math.floor(Date.now() / 1000), };

// Sign the event to get id and sig

const signedEvent = await signer.signEvent(eventData);

const completeEventData = {

...eventData, id: signedEvent.id, pubkey: pubkey, sig: signedEvent.sig,

};

// Parse and validate the complete event data using NSchema

const event = n.event().parse(completeEventData); console.log('Parsed and validated event:', event);

// Send the event to each relay for (const relay of relays) { console.log('Sending event to relay:', relay); console.log(await relay.event(event));

await relay.close(); } // Add the file to the uploaded files set and update the JSON file uploadedFiles.add(filePath); await writeUploadedFiles(uploadedFiles);

console.log("Done!");

} catch (error) {

console.error('Error signing and uploading media:', error);

} } // Function to select a random valid file from a folder

async function getRandomValidFileFromFolder(folderPath: string, uploadedFiles: Set): Promise { const validExtensions = ['jpg', 'mp4', 'webp', 'gif']; const files: string[] = []; for await (const dirEntry of Deno.readDir(folderPath)) { if (dirEntry.isFile) {

const extension = dirEntry.name.split('.').pop()?.toLowerCase(); if (extension && validExtensions.includes(extension)) { files.push(dirEntry.name); } }

} // Filter out files that have already been uploaded const unuploadedFiles = files.filter(file => !uploadedFiles.has(`${folderPath}/${file}`));

if (unuploadedFiles.length === 0) { console.error('No unuploaded valid files found. Please add new JPG, MP4, or WEBP files.');

return null; } const randomIndex = Math.floor(Math.random() * unuploadedFiles.length);

return `${folderPath}/${unuploadedFiles[randomIndex]}`;

}

// Example usage

const folderPath = Deno.env.get('MEDIA_FOLDER_PATH');

if (folderPath) { readUploadedFiles().then((uploadedFiles) => {

getRandomValidFileFromFolder(folderPath, uploadedFiles).then((randomFilePath) => { if (randomFilePath) {

signAndUploadMedia(randomFilePath, uploadedFiles);

}

});

});

} else {

console.error('Environment variable "MEDIA_FOLDER_PATH" is not set.');

}

```

Also puts amethyst gallery to good use:

https://v.nostr.build/ICPPrle8VODjFOPV.mp4

Running utxo's relay on the phone to see how it will "go". The go vers was too up, and had to change the db to sqlite, but overall ok. Khartu runs well there, could be onioned, changed some prefered relays 🤙

Amethyst. Just open the pic post itself. The geotag is there.

Replying to Avatar Sjors Provoost

nostr:npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z IIRC Amethyst supports geotags, but I don't see anything in the app for the above picture. It has both g and l tags. But maybe I borked it.

My script uses nostr:npub1uac67zc9er54ln0kl6e4qp2y6ta3enfcg7ywnayshvlw9r5w6ehsqq99rx's nostr-geotags: https://github.com/sandwichfarm/nostr-geotags

London is London.

Replying to Avatar Sebastix

Ok ✅ 60-minute time-block over 😉

Result: https://sebastix.social/timeline/global (there is already content)

- It seems only my data is there (yet).

- Composed and transmitted my first note from the instance 😎

- As the docs says, Ditto lacks the outbox model so it's my guess why I don't see content from other npubs yet

- Looking for relay settings on instance level, but I guess they are not there

- This install wasn't painfull (I could skip certain steps as I already had a working Nginx + SSL config there)

Now I will try to find a friend to onboard and test it :) Creating my own local social platform where I play Elon games.

Btw I was thinking that since you can run your own ditto with whitelist pubs policy of writting on the relay, effectively like private post office and boxes (well as far as 04s are), that could be a comunity with dms-ing and possibly sharing blobs only between the users of it if the messages are not broadcasted elsewhere. Funny enough to use another client for the dms on the relay only, as ditto does not seem to be dms oriented at least for now.

Yeah. The problem with the general rss is that for the podcasts it needs the enclosure url part to be able to play. So till fanfares.io is ready 🔥(npub.pro does the rss just for whoever makes a site there), I just used nostter rss generation tool from Snowcait's nostr-rss with a little add :

That way it plays the links in the kind 1 in antennapod, podcast republic, podcast addict etc. Like supertestnet's hit (hosted on satellite) 🔥🤣 from nostr:nprofile1qqsw2n8a6yps2lwm7249ak4eqzs7m0ygypdr789075w26c9eap44x0qpz4mhxue69uhhyetvv9ujuerpd46hxtnfduhszyrhwden5te0v5hxummn9ekx7mp0qyg8wumn8ghj7mn0wd68ytnddakj7rajwhn or turns any pub to podcaster as long as they have the links in the notes. Could be nostter, nostrudel, nostr band etc. Works with forked notes as well.

Like this on antennapod:

https://video.nostr.build/b71b245ccdd99b3ad3f0c0101632212b4470bfc5f7314b457913afd3362c1547.mp4

This ran on localhost for the test, the general rss pull will be whatever domain/npub with the modified tool. Fountain picks up the feed but does not play it, not sure as the app crashes for me.