@PinoBatch@Rairii Unfamiliar with #SmallWeb, but fedi is federated.. we all join one of a smaller number of servers that talk to one another (like Mastodon). #Indieweb is, well, indie-- you have your site, I have mine, but we can talk to one another. The longer I hack, the more I prefer the latter.
{
"type": "entry",
"author": {
"name": "@sp1ff",
"url": "https://indieweb.social/@sp1ff",
"photo": null
},
"url": "https://indieweb.social/@sp1ff/110641963625704541",
"content": {
"html": "<p><span class=\"h-card\"><a class=\"u-url\" href=\"https://peoplemaking.games/@PinoBatch\">@<span>PinoBatch</span></a></span> <span class=\"h-card\"><a class=\"u-url\" href=\"https://haqueers.com/@Rairii\">@<span>Rairii</span></a></span> Unfamiliar with <a href=\"https://indieweb.social/tags/SmallWeb\">#<span>SmallWeb</span></a>, but fedi is federated.. we all join one of a smaller number of servers that talk to one another (like Mastodon). <a href=\"https://indieweb.social/tags/Indieweb\">#<span>Indieweb</span></a> is, well, indie-- you have your site, I have mine, but we can talk to one another. The longer I hack, the more I prefer the latter.</p>",
"text": "@PinoBatch @Rairii Unfamiliar with #SmallWeb, but fedi is federated.. we all join one of a smaller number of servers that talk to one another (like Mastodon). #Indieweb is, well, indie-- you have your site, I have mine, but we can talk to one another. The longer I hack, the more I prefer the latter."
},
"published": "2023-07-02T01:46:24+00:00",
"post-type": "note",
"_id": "38165957",
"_source": "7235",
"_is_read": false
}
@Rairii I'm not sure how "the social web" distinguishes fedi from #IndieWeb or Aral Balkan's #SmallWeb, which are more based on each user running their own website on their own domain.
{
"type": "entry",
"author": {
"name": "@PinoBatch",
"url": "https://peoplemaking.games/@PinoBatch",
"photo": null
},
"url": "https://peoplemaking.games/@PinoBatch/110641909075143295",
"content": {
"html": "<p><span class=\"h-card\"><a class=\"u-url\" href=\"https://haqueers.com/@Rairii\">@<span>Rairii</span></a></span> I'm not sure how \"the social web\" distinguishes fedi from <a href=\"https://peoplemaking.games/tags/IndieWeb\">#<span>IndieWeb</span></a> or Aral Balkan's <a href=\"https://peoplemaking.games/tags/SmallWeb\">#<span>SmallWeb</span></a>, which are more based on each user running their own website on their own domain.</p>",
"text": "@Rairii I'm not sure how \"the social web\" distinguishes fedi from #IndieWeb or Aral Balkan's #SmallWeb, which are more based on each user running their own website on their own domain."
},
"published": "2023-07-02T01:32:32+00:00",
"post-type": "note",
"_id": "38165958",
"_source": "7235",
"_is_read": false
}
Blogged: Why organisations should have an indieweb publication strategy (or: why ITFC should have an RSS feed) ✍️ The social media behemoths are dying, so you need a plan B for making sure you can communicate with the outside world. And that’s having an RSS feed and POSSE-ing.
{
"type": "entry",
"author": {
"name": "@leonp",
"url": "https://fosstodon.org/@leonp",
"photo": null
},
"url": "https://fosstodon.org/@leonp/110640775564409812",
"content": {
"html": "<p>Blogged: Why organisations should have an indieweb publication strategy (or: why ITFC should have an RSS feed) \u270d\ufe0f The social media behemoths are dying, so you need a plan B for making sure you can communicate with the outside world. And that\u2019s having an RSS feed and POSSE-ing.<br /><br /> \ud83c\udff7 <a href=\"https://fosstodon.org/tags/ITFC\">#<span>ITFC</span></a> <a href=\"https://fosstodon.org/tags/IndieWeb\">#<span>IndieWeb</span></a> <a href=\"https://fosstodon.org/tags/POSSE\">#<span>POSSE</span></a> <a href=\"https://fosstodon.org/tags/RSS\">#<span>RSS</span></a><br /><a href=\"https://www.thisdaysportion.com/posts/itfc-indieweb/\"><span>https://www.</span><span>thisdaysportion.com/posts/itfc</span><span>-indieweb/</span></a></p>",
"text": "Blogged: Why organisations should have an indieweb publication strategy (or: why ITFC should have an RSS feed) \u270d\ufe0f The social media behemoths are dying, so you need a plan B for making sure you can communicate with the outside world. And that\u2019s having an RSS feed and POSSE-ing.\n\n \ud83c\udff7 #ITFC #IndieWeb #POSSE #RSS\nhttps://www.thisdaysportion.com/posts/itfc-indieweb/"
},
"published": "2023-07-01T20:44:16+00:00",
"post-type": "note",
"_id": "38163731",
"_source": "7235",
"_is_read": false
}
{
"type": "entry",
"published": "2023-07-01T13:32:30-0400",
"url": "https://martymcgui.re/2023/07/01/this-week-in-the-indieweb-audio-edition--june-24th---30th-2023/",
"category": [
"podcast",
"IndieWeb",
"this-week-indieweb-podcast"
],
"audio": [
"https://media.martymcgui.re/08/4e/45/a8/97e513d96ca8188452a7e889c576133606ea8ecbbf593ca02560cd43.mp3"
],
"name": "This Week in the IndieWeb Audio Edition \u2022 June 24th - 30th, 2023",
"content": {
"text": "Show/Hide Transcript\n \n Community gardening for pop-ups and Pythons. It\u2019s the audio edition for This Week in the IndieWeb for June 24th - 30th, 2023.\nYou can find all of my audio editions and subscribe with your favorite podcast app here: martymcgui.re/podcasts/indieweb/.\nMusic from Aaron Parecki\u2019s 100DaysOfMusic project: Day 85 - Suit, Day 48 - Glitch, Day 49 - Floating, Day 9, and Day 11\nThanks to everyone in the IndieWeb chat for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!",
"html": "Show/Hide Transcript\n \n <p>Community gardening for pop-ups and Pythons. It\u2019s the audio edition for <a href=\"https://indieweb.org/this-week/2023-06-30.html\">This Week in the IndieWeb for June 24th - 30th, 2023</a>.</p>\n<p>You can find all of my audio editions and subscribe with your favorite podcast app here: <a href=\"https://martymcgui.re/podcasts/indieweb/\">martymcgui.re/podcasts/indieweb/</a>.</p>\n<p>Music from <a href=\"https://aaronparecki.com/\">Aaron Parecki</a>\u2019s <a href=\"https://100.aaronparecki.com/\">100DaysOfMusic project</a>: <a href=\"https://aaronparecki.com/2017/03/15/14/day85\">Day 85 - Suit</a>, <a href=\"https://aaronparecki.com/2017/02/06/7/day48\">Day 48 - Glitch</a>, <a href=\"https://aaronparecki.com/2017/02/07/4/day49\">Day 49 - Floating</a>, <a href=\"https://aaronparecki.com/2016/12/29/21/day-9\">Day 9</a>, and <a href=\"https://aaronparecki.com/2016/12/31/15/\">Day 11</a></p>\n<p>Thanks to everyone in the <a href=\"https://chat.indieweb.org/\">IndieWeb chat</a> for their feedback and suggestions. Please drop me a note if there are any changes you\u2019d like to see for this audio edition!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": "https://martymcgui.re/",
"photo": "https://martymcgui.re/images/logo.jpg"
},
"post-type": "audio",
"_id": "38162214",
"_source": "175",
"_is_read": false
}
{
"type": "entry",
"author": {
"name": "#indieweb",
"url": "https://indieweb.social/tags/indieweb",
"photo": null
},
"url": "https://martymcgui.re/2023/07/01/133406/",
"content": {
"html": "<p>Community gardening for pop-ups and Pythons. It\u2019s your < 10min update on the #IndieWeb community!</p><br /><p>This Week in the IndieWeb audio edition for June 24th - 30th, 2023.<br /><a href=\"https://martymcgui.re/2023/07/01/this-week-in-the-indieweb-audio-edition--june-24th---30th-2023/\">https://martymcgui.re/2023/07/01/this-week-in-the-indieweb-audio-edition--june-24th---30th-2023/</a></p>",
"text": "Community gardening for pop-ups and Pythons. It\u2019s your < 10min update on the #IndieWeb community!\nThis Week in the IndieWeb audio edition for June 24th - 30th, 2023.\nhttps://martymcgui.re/2023/07/01/this-week-in-the-indieweb-audio-edition--june-24th---30th-2023/"
},
"published": "2023-07-01T17:34:06+00:00",
"post-type": "note",
"_id": "38161663",
"_source": "7235",
"_is_read": false
}
Here's a short Rust program using the microformats crate that checks the presence of a webmention on a certain page, properly resolving all URLs and even scanning HTML content in entry["properties"]["content"].
use std::cell::{RefCell, Ref};
use std::rc::Rc;
use clap::Parser;
use microformats::types::PropertyValue;
use microformats::html5ever;
use microformats::html5ever::tendril::TendrilSink;
#[derive(thiserror::Error, Debug)]
enum Error {
#[error("http request error: {0}")]
Http(#[from] reqwest::Error),
#[error("microformats error: {0}")]
Microformats(#[from] microformats::Error),
#[error("json error: {0}")]
Json(#[from] serde_json::Error),
#[error("url parse error: {0}")]
UrlParse(#[from] url::ParseError),
}
#[derive(Debug)]
enum MentionType {
Reply,
Like,
Repost,
Bookmark,
Mention
}
fn check_mention(document: impl AsRef<str>, base_url: &url::Url, link: &url::Url) -> Result<Option<MentionType>, Error> {
// First, check the document for MF2 markup
let document = microformats::from_html(document.as_ref(), base_url.clone())?;
// Get an iterator of all items
let items_iter = document.items.iter()
.map(AsRef::as_ref)
.map(RefCell::borrow);
for item in items_iter {
let props = item.properties.borrow();
for (prop, interaction_type) in [
("in-reply-to", MentionType::Reply), ("like-of", MentionType::Like),
("bookmark-of", MentionType::Bookmark), ("repost-of", MentionType::Repost)
] {
if let Some(propvals) = props.get(prop) {
for val in propvals {
if let PropertyValue::Url(url) = val {
if url == link {
return Ok(Some(interaction_type))
}
}
}
}
}
// Process `content`
if let Some(PropertyValue::Fragment(content)) = props.get("content")
.map(Vec::as_slice)
.unwrap_or_default()
.first()
{
let root = html5ever::parse_document(html5ever::rcdom::RcDom::default(), Default::default())
.from_utf8()
.one(content.html.to_owned().as_bytes())
.document;
// This is a trick to unwrap recursion into a loop
//
// A list of unprocessed node is made. Then, in each
// iteration, the list is "taken" and replaced with an
// empty list, which is populated with nodes for the next
// iteration of the loop.
//
// Empty list means all nodes were processed.
let mut unprocessed_nodes: Vec<Rc<html5ever::rcdom::Node>> = root.children.borrow().iter().cloned().collect();
while unprocessed_nodes.len() > 0 {
// "Take" the list out of its memory slot, replace it with an empty list
let nodes = std::mem::take(&mut unprocessed_nodes);
for node in nodes.into_iter() {
// Add children nodes to the list for the next iteration
unprocessed_nodes.extend(node.children.borrow().iter().cloned());
if let html5ever::rcdom::NodeData::Element { ref name, ref attrs, .. } = node.data {
// If it's not `<a>`, skip it
if name.local != *"a" { continue; }
for attr in attrs.borrow().iter() {
// if it's not `<a href="...">`, skip it
if attr.name.local != *"href" { continue; }
// Be forgiving in parsing URLs, and resolve them against the base URL
if let Ok(url) = base_url.join(attr.value.as_ref()) {
if &url == link {
return Ok(Some(MentionType::Mention));
}
}
}
}
}
}
}
}
Ok(None)
}
#[derive(Parser, Debug)]
#[clap(
name = "kittybox-check-webmention",
author = "Vika <vika@fireburn.ru>",
version = env!("CARGO_PKG_VERSION"),
about = "Verify an incoming webmention"
)]
struct Args {
#[clap(value_parser)]
url: url::Url,
#[clap(value_parser)]
link: url::Url
}
#[tokio::main]
async fn main() -> Result<(), self::Error> {
let args = Args::parse();
let http: reqwest::Client = {
#[allow(unused_mut)]
let mut builder = reqwest::Client::builder()
.user_agent(concat!(
env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION")
));
builder.build().unwrap()
};
let response = http.get(args.url.clone()).send().await?;
let text = response.text().await?;
if let Some(mention_type) = check_mention(text, &args.url, &args.link)? {
println!("{:?}", mention_type);
Ok(())
} else {
std::process::exit(1)
}
}
{
"type": "entry",
"published": "2023-07-01T18:46:11.162062149+03:00",
"url": "https://fireburn.ru/posts/rust-check-webmention",
"category": [
"Kittybox",
"Rust",
"microformats2",
"IndieWeb"
],
"content": {
"text": "Here's a short Rust program using the microformats crate that checks the presence of a webmention on a certain page, properly resolving all URLs and even scanning HTML content in entry[\"properties\"][\"content\"].\nuse std::cell::{RefCell, Ref};\nuse std::rc::Rc;\n\nuse clap::Parser;\nuse microformats::types::PropertyValue;\nuse microformats::html5ever;\nuse microformats::html5ever::tendril::TendrilSink;\n\n#[derive(thiserror::Error, Debug)]\nenum Error {\n #[error(\"http request error: {0}\")]\n Http(#[from] reqwest::Error),\n #[error(\"microformats error: {0}\")]\n Microformats(#[from] microformats::Error),\n #[error(\"json error: {0}\")]\n Json(#[from] serde_json::Error),\n #[error(\"url parse error: {0}\")]\n UrlParse(#[from] url::ParseError),\n}\n\n#[derive(Debug)]\nenum MentionType {\n Reply,\n Like,\n Repost,\n Bookmark,\n Mention\n}\n\nfn check_mention(document: impl AsRef<str>, base_url: &url::Url, link: &url::Url) -> Result<Option<MentionType>, Error> {\n // First, check the document for MF2 markup\n let document = microformats::from_html(document.as_ref(), base_url.clone())?;\n\n // Get an iterator of all items\n let items_iter = document.items.iter()\n .map(AsRef::as_ref)\n .map(RefCell::borrow);\n\n for item in items_iter {\n let props = item.properties.borrow();\n for (prop, interaction_type) in [\n (\"in-reply-to\", MentionType::Reply), (\"like-of\", MentionType::Like),\n (\"bookmark-of\", MentionType::Bookmark), (\"repost-of\", MentionType::Repost)\n ] {\n if let Some(propvals) = props.get(prop) {\n for val in propvals {\n if let PropertyValue::Url(url) = val {\n if url == link {\n return Ok(Some(interaction_type))\n }\n }\n }\n }\n }\n // Process `content`\n if let Some(PropertyValue::Fragment(content)) = props.get(\"content\")\n .map(Vec::as_slice)\n .unwrap_or_default()\n .first()\n {\n let root = html5ever::parse_document(html5ever::rcdom::RcDom::default(), Default::default())\n .from_utf8()\n .one(content.html.to_owned().as_bytes())\n .document;\n\n // This is a trick to unwrap recursion into a loop\n //\n // A list of unprocessed node is made. Then, in each\n // iteration, the list is \"taken\" and replaced with an\n // empty list, which is populated with nodes for the next\n // iteration of the loop.\n //\n // Empty list means all nodes were processed.\n let mut unprocessed_nodes: Vec<Rc<html5ever::rcdom::Node>> = root.children.borrow().iter().cloned().collect();\n while unprocessed_nodes.len() > 0 {\n // \"Take\" the list out of its memory slot, replace it with an empty list\n let nodes = std::mem::take(&mut unprocessed_nodes);\n for node in nodes.into_iter() {\n // Add children nodes to the list for the next iteration\n unprocessed_nodes.extend(node.children.borrow().iter().cloned());\n\n if let html5ever::rcdom::NodeData::Element { ref name, ref attrs, .. } = node.data {\n // If it's not `<a>`, skip it\n if name.local != *\"a\" { continue; }\n for attr in attrs.borrow().iter() {\n // if it's not `<a href=\"...\">`, skip it \n if attr.name.local != *\"href\" { continue; }\n // Be forgiving in parsing URLs, and resolve them against the base URL\n if let Ok(url) = base_url.join(attr.value.as_ref()) {\n if &url == link {\n return Ok(Some(MentionType::Mention));\n }\n }\n }\n }\n }\n }\n \n }\n }\n\n Ok(None)\n}\n\n#[derive(Parser, Debug)]\n#[clap(\n name = \"kittybox-check-webmention\",\n author = \"Vika <vika@fireburn.ru>\",\n version = env!(\"CARGO_PKG_VERSION\"),\n about = \"Verify an incoming webmention\"\n)]\nstruct Args {\n #[clap(value_parser)]\n url: url::Url,\n #[clap(value_parser)]\n link: url::Url\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), self::Error> {\n let args = Args::parse();\n \n let http: reqwest::Client = {\n #[allow(unused_mut)]\n let mut builder = reqwest::Client::builder()\n .user_agent(concat!(\n env!(\"CARGO_PKG_NAME\"), \"/\", env!(\"CARGO_PKG_VERSION\")\n ));\n\n builder.build().unwrap()\n };\n\n let response = http.get(args.url.clone()).send().await?;\n let text = response.text().await?;\n \n if let Some(mention_type) = check_mention(text, &args.url, &args.link)? {\n println!(\"{:?}\", mention_type);\n\n Ok(())\n } else {\n std::process::exit(1)\n }\n}",
"html": "<p>Here's a short Rust program using the <code>microformats</code> crate that checks the presence of a webmention on a certain page, properly resolving all URLs and even scanning HTML content in <code>entry[\"properties\"][\"content\"]</code>.</p>\n<pre><code>use std::cell::{RefCell, Ref};\nuse std::rc::Rc;\n\nuse clap::Parser;\nuse microformats::types::PropertyValue;\nuse microformats::html5ever;\nuse microformats::html5ever::tendril::TendrilSink;\n\n#[derive(thiserror::Error, Debug)]\nenum Error {\n #[error(\"http request error: {0}\")]\n Http(#[from] reqwest::Error),\n #[error(\"microformats error: {0}\")]\n Microformats(#[from] microformats::Error),\n #[error(\"json error: {0}\")]\n Json(#[from] serde_json::Error),\n #[error(\"url parse error: {0}\")]\n UrlParse(#[from] url::ParseError),\n}\n\n#[derive(Debug)]\nenum MentionType {\n Reply,\n Like,\n Repost,\n Bookmark,\n Mention\n}\n\nfn check_mention(document: impl AsRef<str>, base_url: &url::Url, link: &url::Url) -> Result<Option<MentionType>, Error> {\n // First, check the document for MF2 markup\n let document = microformats::from_html(document.as_ref(), base_url.clone())?;\n\n // Get an iterator of all items\n let items_iter = document.items.iter()\n .map(AsRef::as_ref)\n .map(RefCell::borrow);\n\n for item in items_iter {\n let props = item.properties.borrow();\n for (prop, interaction_type) in [\n (\"in-reply-to\", MentionType::Reply), (\"like-of\", MentionType::Like),\n (\"bookmark-of\", MentionType::Bookmark), (\"repost-of\", MentionType::Repost)\n ] {\n if let Some(propvals) = props.get(prop) {\n for val in propvals {\n if let PropertyValue::Url(url) = val {\n if url == link {\n return Ok(Some(interaction_type))\n }\n }\n }\n }\n }\n // Process `content`\n if let Some(PropertyValue::Fragment(content)) = props.get(\"content\")\n .map(Vec::as_slice)\n .unwrap_or_default()\n .first()\n {\n let root = html5ever::parse_document(html5ever::rcdom::RcDom::default(), Default::default())\n .from_utf8()\n .one(content.html.to_owned().as_bytes())\n .document;\n\n // This is a trick to unwrap recursion into a loop\n //\n // A list of unprocessed node is made. Then, in each\n // iteration, the list is \"taken\" and replaced with an\n // empty list, which is populated with nodes for the next\n // iteration of the loop.\n //\n // Empty list means all nodes were processed.\n let mut unprocessed_nodes: Vec<Rc<html5ever::rcdom::Node>> = root.children.borrow().iter().cloned().collect();\n while unprocessed_nodes.len() > 0 {\n // \"Take\" the list out of its memory slot, replace it with an empty list\n let nodes = std::mem::take(&mut unprocessed_nodes);\n for node in nodes.into_iter() {\n // Add children nodes to the list for the next iteration\n unprocessed_nodes.extend(node.children.borrow().iter().cloned());\n\n if let html5ever::rcdom::NodeData::Element { ref name, ref attrs, .. } = node.data {\n // If it's not `<a>`, skip it\n if name.local != *\"a\" { continue; }\n for attr in attrs.borrow().iter() {\n // if it's not `<a href=\"...\">`, skip it \n if attr.name.local != *\"href\" { continue; }\n // Be forgiving in parsing URLs, and resolve them against the base URL\n if let Ok(url) = base_url.join(attr.value.as_ref()) {\n if &url == link {\n return Ok(Some(MentionType::Mention));\n }\n }\n }\n }\n }\n }\n \n }\n }\n\n Ok(None)\n}\n\n#[derive(Parser, Debug)]\n#[clap(\n name = \"kittybox-check-webmention\",\n author = \"Vika <vika@fireburn.ru>\",\n version = env!(\"CARGO_PKG_VERSION\"),\n about = \"Verify an incoming webmention\"\n)]\nstruct Args {\n #[clap(value_parser)]\n url: url::Url,\n #[clap(value_parser)]\n link: url::Url\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), self::Error> {\n let args = Args::parse();\n \n let http: reqwest::Client = {\n #[allow(unused_mut)]\n let mut builder = reqwest::Client::builder()\n .user_agent(concat!(\n env!(\"CARGO_PKG_NAME\"), \"/\", env!(\"CARGO_PKG_VERSION\")\n ));\n\n builder.build().unwrap()\n };\n\n let response = http.get(args.url.clone()).send().await?;\n let text = response.text().await?;\n \n if let Some(mention_type) = check_mention(text, &args.url, &args.link)? {\n println!(\"{:?}\", mention_type);\n\n Ok(())\n } else {\n std::process::exit(1)\n }\n}\n</code></pre>"
},
"author": {
"type": "card",
"name": "Vika",
"url": "https://fireburn.ru/",
"photo": "https://fireburn.ru/.kittybox/media/uploads/f1/5a/fb/9b/081efafb97b4ad59f5025cf2fd0678b8f3e20e4c292489107d52be09"
},
"post-type": "note",
"_id": "38161429",
"_source": "1371",
"_is_read": false
}
{
"type": "entry",
"author": {
"name": "@gilmae",
"url": "https://aus.social/@gilmae",
"photo": null
},
"url": "https://aus.social/@gilmae/110637980449939540",
"content": {
"html": "<p>This seems extremely cool. I am 100% here for nntp in all its glory and warts.</p><p><a href=\"https://dialup.cafe/@vga256/110637361651638656\"><span>https://</span><span>dialup.cafe/@vga256/1106373616</span><span>51638656</span></a> <a href=\"https://aus.social/tags/Indieweb\">#<span>Indieweb</span></a> <a href=\"https://aus.social/tags/retro\">#<span>retro</span></a> <a href=\"https://aus.social/tags/technology\">#<span>technology</span></a></p>",
"text": "This seems extremely cool. I am 100% here for nntp in all its glory and warts.https://dialup.cafe/@vga256/110637361651638656 #Indieweb #retro #technology"
},
"published": "2023-07-01T08:53:25+00:00",
"post-type": "note",
"_id": "38156183",
"_source": "7235",
"_is_read": false
}
on the limits of searching for a recipe online, the problem with search engines, the problem with subscriptions, and the futility of trying to clean up this mess.
{
"type": "entry",
"author": {
"name": "@alexture",
"url": "https://todon.eu/@alexture",
"photo": null
},
"url": "https://todon.eu/@alexture/110637743808047345",
"content": {
"html": "<p>searching for a recipe</p><p>on the limits of searching for a recipe online, the problem with search engines, the problem with subscriptions, and the futility of trying to clean up this mess.</p><p><a href=\"https://alexsirac.com/searching-for-a-recipe/\"><span>https://</span><span>alexsirac.com/searching-for-a-</span><span>recipe/</span></a></p><p><a href=\"https://todon.eu/tags/cooking\">#<span>cooking</span></a> <a href=\"https://todon.eu/tags/en\">#<span>en</span></a> <a href=\"https://todon.eu/tags/indieWeb\">#<span>indieWeb</span></a> <a href=\"https://todon.eu/tags/recipe\">#<span>recipe</span></a> <a href=\"https://todon.eu/tags/SearchEngines\">#<span>SearchEngines</span></a></p>",
"text": "searching for a recipeon the limits of searching for a recipe online, the problem with search engines, the problem with subscriptions, and the futility of trying to clean up this mess.https://alexsirac.com/searching-for-a-recipe/#cooking #en #indieWeb #recipe #SearchEngines"
},
"published": "2023-07-01T07:53:15+00:00",
"post-type": "note",
"_id": "38155748",
"_source": "7235",
"_is_read": false
}
Just found out about the first edition of the IndieWeb Carnival, which is for June 2023. Of course, today is July 1st and I had to find about it today.
I'll try to keep an eye on the July one and see if it inspires me!
{
"type": "entry",
"author": {
"name": "@alexture",
"url": "https://todon.eu/@alexture",
"photo": null
},
"url": "https://todon.eu/@alexture/110637713443735382",
"content": {
"html": "<p>indieweb carnival</p><p>Just found out about the first edition of the IndieWeb Carnival, which is for June 2023. Of course, today is July 1st and I had to find about it today.</p><p>I'll try to keep an eye on the July one and see if it inspires me!</p><p><a href=\"https://alexsirac.com/indieweb-carnival/\"><span>https://</span><span>alexsirac.com/indieweb-carniva</span><span>l/</span></a></p><p><a href=\"https://todon.eu/tags/en\">#<span>en</span></a> <a href=\"https://todon.eu/tags/indieWeb\">#<span>indieWeb</span></a> <a href=\"https://todon.eu/tags/WritingPrompts\">#<span>WritingPrompts</span></a></p>",
"text": "indieweb carnivalJust found out about the first edition of the IndieWeb Carnival, which is for June 2023. Of course, today is July 1st and I had to find about it today.I'll try to keep an eye on the July one and see if it inspires me!https://alexsirac.com/indieweb-carnival/#en #indieWeb #WritingPrompts"
},
"published": "2023-07-01T07:45:31+00:00",
"post-type": "note",
"_id": "38155749",
"_source": "7235",
"_is_read": false
}
{
"type": "entry",
"author": {
"name": "@liztai",
"url": "https://hachyderm.io/@liztai",
"photo": null
},
"url": "https://hachyderm.io/@liztai/110636765952595960",
"content": {
"html": "<p>That Man: The Outerworlds formed the Federation because they had to. At least, that's the \"official\" story. A Distant Stars tale.</p><p>This story is exclusive for blog subscribers, so do subscribe to the blog to read the story* :)</p><p>* I am mirroring my <a href=\"https://hachyderm.io/tags/Substack\">#<span>Substack</span></a> content on my website as you should. <a href=\"https://hachyderm.io/tags/IndieWeb\">#<span>IndieWeb</span></a>, baby!</p><p><a href=\"https://hachyderm.io/tags/Fiction\">#<span>Fiction</span></a> <a href=\"https://hachyderm.io/tags/Writing\">#<span>Writing</span></a> <a href=\"https://hachyderm.io/tags/WritingCommunity\">#<span>WritingCommunity</span></a> <br /><a href=\"https://firediarist.wordpress.com/2023/07/01/that-man/\"><span>https://</span><span>firediarist.wordpress.com/2023</span><span>/07/01/that-man/</span></a></p>",
"text": "That Man: The Outerworlds formed the Federation because they had to. At least, that's the \"official\" story. A Distant Stars tale.This story is exclusive for blog subscribers, so do subscribe to the blog to read the story* :)* I am mirroring my #Substack content on my website as you should. #IndieWeb, baby!#Fiction #Writing #WritingCommunity \nhttps://firediarist.wordpress.com/2023/07/01/that-man/"
},
"published": "2023-07-01T03:44:34+00:00",
"post-type": "note",
"_id": "38154552",
"_source": "7235",
"_is_read": false
}
To continue my thoughts on why I left the #Apple ecosystem. It's the same reason why I left #Twitter#Facebook for #Mastodon. Why I embraced #IndieWeb and now blog the POSSE/PESOS way. I realised that Apple products, shiny and high quality as they are, was trapping me in their ecosystem. I hated having to upgrade just because they deemed my device "too old". I hate having to buy a new thingamajic when my old dongle worked just fine - just because Apple removed a port. 1/3
{
"type": "entry",
"author": {
"name": "@liztai",
"url": "https://hachyderm.io/@liztai",
"photo": null
},
"url": "https://hachyderm.io/@liztai/110636096296416024",
"content": {
"html": "<p>To continue my thoughts on why I left the <a href=\"https://hachyderm.io/tags/Apple\">#<span>Apple</span></a> ecosystem. It's the same reason why I left <a href=\"https://hachyderm.io/tags/Twitter\">#<span>Twitter</span></a> <a href=\"https://hachyderm.io/tags/Facebook\">#<span>Facebook</span></a> for <a href=\"https://hachyderm.io/tags/Mastodon\">#<span>Mastodon</span></a>. Why I embraced <a href=\"https://hachyderm.io/tags/IndieWeb\">#<span>IndieWeb</span></a> and now blog the POSSE/PESOS way. <br />I realised that Apple products, shiny and high quality as they are, was trapping me in their ecosystem. I hated having to upgrade just because they deemed my device \"too old\". I hate having to buy a new thingamajic when my old dongle worked just fine - just because Apple removed a port. 1/3</p>",
"text": "To continue my thoughts on why I left the #Apple ecosystem. It's the same reason why I left #Twitter #Facebook for #Mastodon. Why I embraced #IndieWeb and now blog the POSSE/PESOS way. \nI realised that Apple products, shiny and high quality as they are, was trapping me in their ecosystem. I hated having to upgrade just because they deemed my device \"too old\". I hate having to buy a new thingamajic when my old dongle worked just fine - just because Apple removed a port. 1/3"
},
"published": "2023-07-01T00:54:16+00:00",
"post-type": "note",
"_id": "38153675",
"_source": "7235",
"_is_read": false
}
There are real downsides to running my website on VPS I sysadmin myself & a homegrown pile of code in JavaScript, Python, Swift, and Zsh. The code is all over the place in every sense of the phrase.
But I can personally guarantee that it'll keep working and remain available so long as I can afford the DNS and VPS fees. I can't say that about any other place I post on the internet.
Own your own space on the web. Post there. Write there. Link to it from your various accounts elsewhere. #indieweb
{
"type": "entry",
"author": {
"name": "@hober",
"url": "https://mastodon.social/@hober",
"photo": null
},
"url": "https://mastodon.social/@hober/110635199526581601",
"content": {
"html": "<p>There are real downsides to running my website on VPS I sysadmin myself & a homegrown pile of code in JavaScript, Python, Swift, and Zsh. The code is all over the place in every sense of the phrase.</p><p>But I can personally guarantee that it'll keep working and remain available so long as I can afford the DNS and VPS fees. I can't say that about any other place I post on the internet.</p><p>Own your own space on the web. Post there. Write there. Link to it from your various accounts elsewhere. <a href=\"https://mastodon.social/tags/indieweb\">#<span>indieweb</span></a></p>",
"text": "There are real downsides to running my website on VPS I sysadmin myself & a homegrown pile of code in JavaScript, Python, Swift, and Zsh. The code is all over the place in every sense of the phrase.But I can personally guarantee that it'll keep working and remain available so long as I can afford the DNS and VPS fees. I can't say that about any other place I post on the internet.Own your own space on the web. Post there. Write there. Link to it from your various accounts elsewhere. #indieweb"
},
"published": "2023-06-30T21:06:12+00:00",
"post-type": "note",
"_id": "38151610",
"_source": "7235",
"_is_read": false
}
{
"type": "entry",
"author": {
"name": "@funkatron",
"url": "https://indieweb.social/@funkatron",
"photo": null
},
"url": "https://indieweb.social/@funkatron/110635039468812168",
"content": {
"html": "<p>DECEMBER 1994 AND HOW ARNIE KATZ CHANGED MY LIFE</p><p>Remembering a long lost friend who made things seem possible for a nerdy teenage fanboy.</p><p><a href=\"https://indieweb.social/tags/Retrocomputing\">#<span>Retrocomputing</span></a> <a href=\"https://indieweb.social/tags/retrogaming\">#<span>retrogaming</span></a> <a href=\"https://indieweb.social/tags/fanzines\">#<span>fanzines</span></a> <a href=\"https://indieweb.social/tags/magazines\">#<span>magazines</span></a> <a href=\"https://indieweb.social/tags/diy\">#<span>diy</span></a> <a href=\"https://indieweb.social/tags/VideoGames\">#<span>VideoGames</span></a> <a href=\"https://indieweb.social/tags/industrialmusic\">#<span>industrialmusic</span></a> <a href=\"https://indieweb.social/tags/Developers\">#<span>Developers</span></a> <a href=\"https://indieweb.social/tags/indiedev\">#<span>indiedev</span></a> <a href=\"https://indieweb.social/tags/indieweb\">#<span>indieweb</span></a></p><p>(Reposting with tags for communities who might dig it)</p><p><a href=\"https://ndd.funkatron.com/december-1994-and-how-arnie-katz-changed-my-life/\"><span>https://</span><span>ndd.funkatron.com/december-199</span><span>4-and-how-arnie-katz-changed-my-life/</span></a></p>",
"text": "DECEMBER 1994 AND HOW ARNIE KATZ CHANGED MY LIFERemembering a long lost friend who made things seem possible for a nerdy teenage fanboy.#Retrocomputing #retrogaming #fanzines #magazines #diy #VideoGames #industrialmusic #Developers #indiedev #indieweb(Reposting with tags for communities who might dig it)https://ndd.funkatron.com/december-1994-and-how-arnie-katz-changed-my-life/"
},
"published": "2023-06-30T20:25:30+00:00",
"post-type": "note",
"_id": "38151105",
"_source": "7235",
"_is_read": false
}
{
"type": "entry",
"author": {
"name": "@voxpelli",
"url": "https://mastodon.social/@voxpelli",
"photo": null
},
"url": "https://mastodon.social/@voxpelli/110634915696549602",
"content": {
"html": "<p>Today\u2019s <a href=\"https://mastodon.social/tags/FollowFriday\">#<span>FollowFriday</span></a>:</p><p>- <span class=\"h-card\"><a class=\"u-url\" href=\"https://ioc.exchange/@decius\">@<span>decius</span></a></span> for his work on <a href=\"https://news.feedseer.com/\"><span>https://</span><span>news.feedseer.com/</span><span></span></a>, an excellent personal aggregation of one\u2019s feed<br />- <span class=\"h-card\"><a class=\"u-url\" href=\"https://mastodon.social/@pfefferle\">@<span>pfefferle</span></a></span> for his great and persistent work on <a href=\"https://mastodon.social/tags/Fediverse\">#<span>Fediverse</span></a> / <a href=\"https://mastodon.social/tags/DiSo\">#<span>DiSo</span></a> / <a href=\"https://mastodon.social/tags/IndieWeb\">#<span>IndieWeb</span></a> plug-ins for <a href=\"https://mastodon.social/tags/WordPress\">#<span>WordPress</span></a> over the last decade(?) which recently landed him a job at Automattic</p>",
"text": "Today\u2019s #FollowFriday:- @decius for his work on https://news.feedseer.com/, an excellent personal aggregation of one\u2019s feed\n- @pfefferle for his great and persistent work on #Fediverse / #DiSo / #IndieWeb plug-ins for #WordPress over the last decade(?) which recently landed him a job at Automattic"
},
"published": "2023-06-30T19:54:01+00:00",
"post-type": "note",
"_id": "38150776",
"_source": "7235",
"_is_read": false
}
The potential is there, but it doesn’t do that right now. I doubt Emissary would implement (for example) the Twitter or Facebook APIs like traditional #IndieWeb POSSE — but I am aiming at additional open PROTOCOLS, with BlueSky as a potential in the future. So, yes? Kinda? If you blur the definition of “Syndicate Elsewhere” @rmdes@shoq
{
"type": "entry",
"author": {
"name": "@benpate",
"url": "https://mastodon.social/@benpate",
"photo": null
},
"url": "https://mastodon.social/@benpate/110634818495783022",
"content": {
"html": "<p>The potential is there, but it doesn\u2019t do that right now. I doubt Emissary would implement (for example) the Twitter or Facebook APIs like traditional <a href=\"https://mastodon.social/tags/IndieWeb\">#<span>IndieWeb</span></a> POSSE \u2014 but I am aiming at additional open PROTOCOLS, with BlueSky as a potential in the future. So, yes? Kinda? If you blur the definition of \u201cSyndicate Elsewhere\u201d <span class=\"h-card\"><a class=\"u-url\" href=\"https://mstdn.social/@rmdes\">@<span>rmdes</span></a></span> <span class=\"h-card\"><a class=\"u-url\" href=\"https://mastodon.social/@shoq\">@<span>shoq</span></a></span></p>",
"text": "The potential is there, but it doesn\u2019t do that right now. I doubt Emissary would implement (for example) the Twitter or Facebook APIs like traditional #IndieWeb POSSE \u2014 but I am aiming at additional open PROTOCOLS, with BlueSky as a potential in the future. So, yes? Kinda? If you blur the definition of \u201cSyndicate Elsewhere\u201d @rmdes @shoq"
},
"published": "2023-06-30T19:29:18+00:00",
"post-type": "note",
"_id": "38150542",
"_source": "7235",
"_is_read": false
}
@benpate@scottjenson Oh, but there is no need to _host_ your reply within your reader, you simply have to be able to _write_ your response within your reader.
Eg: I use @ivory as a client for my Mastodon account and it both reads and writes to that Mastodon account (using the Mastodon-specific API?)
{
"type": "entry",
"author": {
"name": "@voxpelli",
"url": "https://mastodon.social/@voxpelli",
"photo": null
},
"url": "https://mastodon.social/@voxpelli/110634768176895788",
"content": {
"html": "<p><span class=\"h-card\"><a class=\"u-url\" href=\"https://mastodon.social/@benpate\">@<span>benpate</span></a></span> <span class=\"h-card\"><a class=\"u-url\" href=\"https://social.coop/@scottjenson\">@<span>scottjenson</span></a></span> Oh, but there is no need to _host_ your reply within your reader, you simply have to be able to _write_ your response within your reader.</p><p>Eg: I use <span class=\"h-card\"><a class=\"u-url\" href=\"https://tapbots.social/@ivory\">@<span>ivory</span></a></span> as a client for my Mastodon account and it both reads and writes to that Mastodon account (using the Mastodon-specific API?)</p><p>With <a href=\"https://mastodon.social/tags/indieweb\">#<span>indieweb</span></a> it instead could do:</p><p>- Read the content using a standard protocol like <a href=\"https://mastodon.social/tags/MicroSub\">#<span>MicroSub</span></a>: <a href=\"https://indieweb.org/Microsub\"><span>https://</span><span>indieweb.org/Microsub</span><span></span></a><br />- Write any actions / replies using <a href=\"https://mastodon.social/tags/MicroPub\">#<span>MicroPub</span></a>: <a href=\"https://indieweb.org/Micropub\"><span>https://</span><span>indieweb.org/Micropub</span><span></span></a></p>",
"text": "@benpate @scottjenson Oh, but there is no need to _host_ your reply within your reader, you simply have to be able to _write_ your response within your reader.Eg: I use @ivory as a client for my Mastodon account and it both reads and writes to that Mastodon account (using the Mastodon-specific API?)With #indieweb it instead could do:- Read the content using a standard protocol like #MicroSub: https://indieweb.org/Microsub\n- Write any actions / replies using #MicroPub: https://indieweb.org/Micropub"
},
"published": "2023-06-30T19:16:30+00:00",
"post-type": "note",
"_id": "38150416",
"_source": "7235",
"_is_read": false
}
They bundle the reader part and the publishing part.
It’s like bundling Google Reader within WordPress.
Totally needless. (And something I think the #IndieWeb is getting more right with eg #MicroPub, ensuring reading, aggregation, publishing etc doesn’t have to all be in a single application / server)
{
"type": "entry",
"author": {
"name": "@voxpelli",
"url": "https://mastodon.social/@voxpelli",
"photo": null
},
"url": "https://mastodon.social/@voxpelli/110634700809339558",
"content": {
"html": "<p><span class=\"h-card\"><a class=\"u-url\" href=\"https://social.coop/@scottjenson\">@<span>scottjenson</span></a></span> The worst part of most current <a href=\"https://mastodon.social/tags/Fediverse\">#<span>Fediverse</span></a> implementations:</p><p>They bundle the reader part and the publishing part.</p><p>It\u2019s like bundling Google Reader within WordPress.</p><p>Totally needless. (And something I think the <a href=\"https://mastodon.social/tags/IndieWeb\">#<span>IndieWeb</span></a> is getting more right with eg <a href=\"https://mastodon.social/tags/MicroPub\">#<span>MicroPub</span></a>, ensuring reading, aggregation, publishing etc doesn\u2019t have to all be in a single application / server)</p>",
"text": "@scottjenson The worst part of most current #Fediverse implementations:They bundle the reader part and the publishing part.It\u2019s like bundling Google Reader within WordPress.Totally needless. (And something I think the #IndieWeb is getting more right with eg #MicroPub, ensuring reading, aggregation, publishing etc doesn\u2019t have to all be in a single application / server)"
},
"published": "2023-06-30T18:59:22+00:00",
"post-type": "note",
"_id": "38150072",
"_source": "7235",
"_is_read": false
}
I'm gonna have to do more #IndieWeb publishing my own content on my own site, aren't I. Mastodon isn't meant to be a long term stable host of content any more than Twitter is, as much as we might wish for it.
{
"type": "entry",
"author": {
"name": "@toba",
"url": "https://zeroes.ca/@toba",
"photo": null
},
"url": "https://zeroes.ca/@toba/110634539089101736",
"content": {
"html": "<p>I'm gonna have to do more <a href=\"https://zeroes.ca/tags/IndieWeb\">#<span>IndieWeb</span></a> publishing my own content on my own site, aren't I. Mastodon isn't meant to be a long term stable host of content any more than Twitter is, as much as we might wish for it.</p>",
"text": "I'm gonna have to do more #IndieWeb publishing my own content on my own site, aren't I. Mastodon isn't meant to be a long term stable host of content any more than Twitter is, as much as we might wish for it."
},
"published": "2023-06-30T18:18:14+00:00",
"post-type": "note",
"_id": "38149535",
"_source": "7235",
"_is_read": false
}