Okay, this is somewhat odd …it looked like I was getting spam webmentions from an escort agency to an old post of mine. It turns out that technically it’s not spam—they’re genuinely linking to my post from this post on their blog which is actually about webmentions.
And that, your honour, is how this site ended up in my browser history.
{ "type": "entry", "published": "2017-11-13T09:07:20Z", "url": "https://adactio.com/links/13090", "category": [ "webmention", "indieweb", "pinging", "comments", "spam", "sexworkers" ], "bookmark-of": [ "https://www.midlandsmaidens-escorts.com/post-pinger/" ], "content": { "text": "Post Pinging and Webmentions at Midlands Maidens Nottingham Escorts\n\n \n\nOkay, this is somewhat odd \u2026it looked like I was getting spam webmentions from an escort agency to an old post of mine. It turns out that technically it\u2019s not spam\u2014they\u2019re genuinely linking to my post from this post on their blog which is actually about webmentions. \n\nAnd that, your honour, is how this site ended up in my browser history.", "html": "<h3>\n<a class=\"p-name u-bookmark-of\" href=\"https://www.midlandsmaidens-escorts.com/post-pinger/\">\nPost Pinging and Webmentions at Midlands Maidens Nottingham Escorts\n</a>\n</h3>\n\n<p>Okay, this is somewhat odd \u2026it looked like I was getting spam webmentions from an escort agency to <a href=\"https://adactio.com/journal/6469/\">an old post of mine</a>. It turns out that technically it\u2019s not spam\u2014they\u2019re genuinely linking to my post from this post on their blog which is actually about webmentions.</p>\n\n<p>And that, your honour, is how this site ended up in my browser history.</p>" }, "_id": "20", "_source": "2", "_is_read": true }
{ "type": "entry", "published": "2017-11-03", "url": "https://percolator.today/episode/10", "audio": [ "https://percolator.today/redirect.php?url=https%3A%2F%2Fpercolator.today%2Fmedia%2FEpisode_10.mp3" ], "name": "Episode 10: Microsub for Readers", "author": { "type": "card", "name": "Aaron Parecki", "url": "https://aaronparecki.com", "photo": "https://percolator.today/images/aaronpk.jpg" }, "_id": "158", "_source": "13", "_is_read": true }
{ "type": "entry", "url": "https://snarfed.org/2017-10-22_bridgy-fed", "name": "Bridgy Fed", "content": { "text": "I\u2019m launching a new side project! Bridgy Fed connects your IndieWeb site with federated social networks like Mastodon and Hubzilla. If your site can send and receive webmentions, Bridgy Fed can federate it with the fediverse!\nI originally discovered the IndieWeb after I started connecting this web site with social networks like Facebook and Twitter. That led to Bridgy, which has grown bigger than I care to admit. I still have that desire to bridge different communities and networks, and Bridgy Fed is just the latest incarnation. Give it a whirl, kick the tires, and let me know what you think!", "html": "<p>\n <a href=\"https://fed.brid.gy/\">\n <img src=\"https://snarfed.org/bridgy_fed.png\" alt=\"bridgy_fed.png\" /></a></p>\n<p>I\u2019m launching a new side project! <a href=\"https://fed.brid.gy/\">Bridgy Fed</a> connects your <a href=\"https://indieweb.org/\">IndieWeb</a> site with federated social networks like <a href=\"https://joinmastodon.org/\">Mastodon</a> and <a href=\"https://project.hubzilla.org/\">Hubzilla</a>. If your site can send and receive <a href=\"https://indieweb.org/webmention\">webmentions</a>, Bridgy Fed can federate it with the <a href=\"https://en.wikipedia.org/wiki/Fediverse\">fediverse</a>!</p>\n<p>I originally discovered the IndieWeb after I started <a href=\"https://snarfed.org/2011-07-27_facebook_app_for_ostatus\">connecting this web site</a> with social networks like Facebook and Twitter. That led to <a href=\"https://brid.gy/\">Bridgy</a>, which has grown bigger than I care to admit. I still have that desire to bridge different communities and networks, and Bridgy Fed is just the latest incarnation. Give it a whirl, kick the tires, and <a href=\"https://github.com/snarfed/bridgy-fed/issues\">let me know what you think</a>!</p>\n<ul><li><a class=\"u-syndication\" href=\"https://news.indieweb.org/en/snarfed.org/2017-10-22_bridgy-fed\"> </a></li></ul>" }, "author": { "type": "card", "name": "Ryan Barrett", "url": "https://snarfed.org/", "photo": "https://secure.gravatar.com/avatar/947b5f3f323da0ef785b6f02d9c265d6?s=96&d=blank&r=g" }, "_id": "41", "_source": "3", "_is_read": true }
Bumper Homebrew Website Club London tonight. Thanks everyone for coming 🙌
{ "type": "entry", "published": "2017-10-18T19:54:13Z", "url": "https://barryfrost.com/2017/10/hwclondon-20171018", "category": [ "https://calumryan.com", "http://tantek.com", "http://www.kevinmarks.com", "https://doubleloop.net", "https://tommorris.org", "http://www.jeanmrussell.com/", "http://avidenov.com", "hwclondon", "indieweb" ], "photo": [ "https://barryfrost-media.s3.amazonaws.com/file/2017/10/18-ea18a4979e4aafb6827b655c3a54cdfa.jpeg" ], "syndication": [ "https://twitter.com/barryf/status/920743672446160896" ], "content": { "text": "Bumper Homebrew Website Club London tonight. Thanks everyone for coming \ud83d\ude4c", "html": "<p>Bumper Homebrew Website Club London tonight. Thanks everyone for coming \ud83d\ude4c</p>" }, "author": { "type": "card", "name": "Barry FrostBarry Frost", "url": "https://barryfrost.com/", "photo": "https://barryfrost.com/barryfrost.jpg" }, "refs": { "https://calumryan.com": { "type": "card", "name": "Calum Ryan", "url": "https://calumryan.com/", "photo": null }, "http://tantek.com": { "type": "card", "name": "http://tantek.com", "url": "http://tantek.com/", "photo": null }, "http://www.kevinmarks.com": { "type": "card", "name": "Kevin Marks", "url": "http://www.kevinmarks.com/", "photo": null }, "https://doubleloop.net": { "type": "card", "name": "https://doubleloop.net", "url": "https://doubleloop.net/", "photo": null }, "https://tommorris.org": { "type": "card", "name": "https://tommorris.org", "url": "https://tommorris.org/", "photo": null }, "http://www.jeanmrussell.com/": { "type": "card", "name": "http://www.jeanmrussell.com/", "url": "http://www.jeanmrussell.com/", "photo": null }, "http://avidenov.com": { "type": "card", "name": "http://avidenov.com", "url": "http://avidenov.com/", "photo": null } }, "_id": "99734", "_source": "189", "_is_read": true }
{ "type": "entry", "published": "2017-10-12", "url": "https://percolator.today/episode/7", "audio": [ "https://percolator.today/redirect.php?url=https%3A%2F%2Fpercolator.today%2Fmedia%2FPercolator_Episode_7.mp3" ], "name": "Episode 7: Making Micropub More Useful", "author": { "type": "card", "name": "Aaron Parecki", "url": "https://aaronparecki.com", "photo": "https://percolator.today/images/aaronpk.jpg" }, "_id": "161", "_source": "13", "_is_read": true }
{ "type": "entry", "published": "2017-10-09T19:50:03+0000", "url": "https://seblog.nl/2017/10/09/9/bookmarks-and-likes", "category": [ "indieweb" ], "syndication": [ "https://news.indieweb.org/en/seblog.nl/2017/10/09/9/bookmarks-and-likes" ], "name": "Thinking about bookmarks and likes on the IndieWeb", "content": { "text": "At Virtual HWC last week, Sven Knebel pointed me to the new Firefox beta. I use it now, and one of the things I noticed is that ships with integration with Pocket, a bookmarking service to save articles you want to read later. It\u2019s owned by Mozilla now, so they accentuate their service by adding a button prominently in your address bar.\nDespite the pushiness, I tested it out a bit. I like that I can save articles with one click, so I can read them later, possibly on a different device. It made me think about the way I post bookmarks on my own site.\nMy bookmarks and likes look too similar\nThe way I have implemented bookmarks at this moment, is very, very similar to the way I implemented likes. It is a Microformats property (u-bookmark-of vs u-like-of), displayed as an icon (a grey bookmark vs a red heart), with a Dutch text (\u2018Seb heeft [dit] gebookmarkt.\u2019 vs \u2018Seb vindt [dit] leuk.\u2019). \nBy making bookmarks and likes this similar, one would almost think that there is a clearly defined difference in the words \u2018bookmark\u2019 and \u2018like\u2019, that keep them apart, since there is no other distinction. I don\u2019t think there is such a definition.\nBookmarks are mostly used as a \u2018want to read\u2019-list, or a way of keeping track of things that have been read, but might be of interest on a later moment (\u2018want to read again\u2019). Likes are more a reply of some sorts, directed at the author of the post, expressing appreciation.\nThe problem comes when I take readers of my blog into account. The things I like, might be read as a recommendation, but the things I bookmark, might also read as a recommendation. Once I start looking from that perspective, likes and bookmarks fulfill the same role again.\nWhen likes and bookmarks are not recommendations\nSometimes I like things on social media, not because of the contents of the post, but because of the social context around the post. I do not really like the bad picture of the malformed pizza of a friend, I like the fact that I recognize that pizza as the outcome of the enthusiastic plans about making a pizza that my friend told me about earlier that day. I sometimes don\u2019t like the specific check-in a person posted, I just like the person. Some tweets are also quite ambigu: do I like the tweet because of the tweet, or because of the linked article I might or might not have read?\nThose likes are not recommendations for readers, they are purely appreciation, or even just social acknowledgement. Within a certain social context they can be of value to other people, but to random strangers, they are not. Currently, I solve this problem by not posting those kinds of likes to my site at all (leaving them on Facebook or whatever silo), but that\u2019s of course not ideal in the IndieWeb scheme of things.\nWith bookmarks, a similar thing can happen: not all bookmarks are recommendations. The easiest example is an article that I think looks interesting, so I bookmark it to read it later, but I haven\u2019t read it yet. I do not recommend that article, but a reader might think that.\nIn both cases: sometimes I do want to recommend an article in a single post.\nWhat I don\u2019t want to propose\nLet me make a little pause here and say something about likes, favorites, recommendations and what more. We can solve the above things by just adding more webactions to the field. \u201cLet\u2019s also support, next to bookmarks and likes, favorites and recommendations.\u201d But I don\u2019t think that\u2019s the solution, because adding those options means just more post types to keep track of, for both publishing sites and consuming indie-readers. \nKeeping things a little bit abstract and minimal helps us focus on the problem at hand. (Which is at this moment, I think, building an functioning indie-reader in the first place.)\nWhat I would add to my bookmarks\nSeeing what Pocket does with bookmarks, I think I want to expand what I post as a bookmark. To be fair: a lot of other people on the IndieWeb have more detailed bookmarks too. Other properties of a bookmark include: tags, a little summary of the bookmarked post, the reason why the post was bookmarked and sometimes even a screenshot of the bookmarked page.\nI\u2019m not sure how much I want to add to them, but since they are very skinny now, I certainly would like to add some tags. Tags, and possible a reason, make it easier to find a bookmarked article back after a while.\nThat brings me to what I think a bookmark would be for me: showing an interest in the linked article, without adding too much judgement. I see bookmarks as a personal archive of things I want to read or have read. If technical skills allow it, I would also save a copy of the post for personal use, hidden in the bookmark-post itself.\nWhat I would change to likes\nTo likes I wouldn\u2019t change much. For likes, I want to make a personal copy of the original too, because I do care about that content, but from the outside, it\u2019s just a link. \nBut the value of the like would than be more of a vote: this is a piece of content I care about. I think indie-readers should also consume those likes, but just don\u2019t display them the way they display a photo or a note. If there is a post by an author that I don\u2019t follow, but that is liked by, say, three people I do follow, then I want to see that post, accompanied by the names of the three people who liked it. \nThe threshold for the external posts to show up may vary from person to person, both personal preferences of the reader as well as the status of the poster of the like. But the point is that it\u2019s a indie-reader-problem. \nIn this way, a like is in fact a recommendation, from the readers perspective, but just appreciation from the poster.\nBut back to these social likes\nThen there are still those likes that depend on some social context, that aren\u2019t solved by the above approaches.\nI think that the root of the problem lies in those exact words: social context. If I like a certain badly photographed pizza, I should not post that to my main feed, but set the visibility of that like to \u2018friends only\u2019. Chances are that the badly photographed pizza was already published as a private post, only visible to a certain audience, so I can copy that. \nThe problem here lies more in an easy way of publishing private posts, and an easy way to change the audience of those posts. And of course a way for sites to securely share those posts with the right indie-readers, there is a long way to go still.\nAnd what about the bookmarks you haven\u2019t read?\nSharing unread bookmarks is also, I think, question of adding the right audience to the post. Such bookmarks can be posted with an \u2018only me\u2019 visibility. You can then subscribe your indie-reader to your own (private and public) bookmarks-feed. This is, without the private part, what I actually did for a while when I was using an indie-reader. Apart from the bugs in my self-build reader, it worked very well.\nAnd really recommending something? Well, if I really want to recommend something to people who follow me, I can always just post a note, linking the article, and explain why they should read it. That also improves the chance of actually clicking through, no need for extra formatting.\nConclusion\nIn the end I don\u2019t think we need better boundaries between a bookmark and a like, in the form of extra \u2018recommend\u2019 or \u2018favorite\u2019 webactions. A bookmark adds something to an archive for yourself, and a like is giving appreciation to the creator of the post. Recommendations can be either explicit by posting a note, or implicit by publicly liking or bookmarking. But, the way this is implied should be the responsibility of your indie-reader, where you can mix to your own taste. Publishers could filter things that they don\u2019t want everybody to pick up as recommendations by using \u2018only friends\u2019, \u2018only who I follow\u2019 or \u2018only me\u2019 posts.\nIn the end of the day, this is a lot of thinking and talking. I should get back to creating a indie-reader. As should you, because that\u2019s where the one of the undefined parts of the IndieWeb lies now.", "html": "<p>At Virtual HWC last week, <a href=\"http://svenknebel.de\">Sven Knebel</a> pointed me to the new Firefox beta. I use it now, and one of the things I noticed is that ships with integration with <a href=\"https://getpocket.com/\">Pocket</a>, a bookmarking service to save articles you want to read later. It\u2019s owned by Mozilla now, so they accentuate their service by adding a button prominently in your address bar.</p>\n<p>Despite the pushiness, I tested it out a bit. I like that I can save articles with one click, so I can read them later, possibly on a different device. It made me think about the way I post bookmarks on my own site.</p>\n<h2>My bookmarks and likes look too similar</h2>\n<p>The way I have implemented bookmarks at this moment, is very, very similar to the way I implemented likes. It is a Microformats property (<code>u-bookmark-of</code> vs <code>u-like-of</code>), displayed as an icon (a grey bookmark vs a red heart), with a Dutch text (\u2018Seb heeft [dit] gebookmarkt.\u2019 vs \u2018Seb vindt [dit] leuk.\u2019). </p>\n<p>By making bookmarks and likes this similar, one would almost think that there is a clearly defined difference in the words \u2018bookmark\u2019 and \u2018like\u2019, that keep them apart, since there is no other distinction. I don\u2019t think there is such a definition.</p>\n<p>Bookmarks are mostly used as a \u2018want to read\u2019-list, or a way of keeping track of things that have been read, but might be of interest on a later moment (\u2018want to read again\u2019). Likes are more a reply of some sorts, directed at the author of the post, expressing appreciation.</p>\n<p>The problem comes when I take readers of my blog into account. The things I like, might be read as a recommendation, but the things I bookmark, might also read as a recommendation. Once I start looking from that perspective, likes and bookmarks fulfill the same role again.</p>\n<h2>When likes and bookmarks are not recommendations</h2>\n<p>Sometimes I like things on social media, not because of the contents of the post, but because of the social context around the post. I do not really like the bad picture of the malformed pizza of a friend, I like the fact that I recognize that pizza as the outcome of the enthusiastic plans about making a pizza that my friend told me about earlier that day. I sometimes don\u2019t like the specific check-in a person posted, I just like the person. Some tweets are also quite ambigu: do I like the tweet because of the tweet, or because of the linked article I might or might not have read?</p>\n<p>Those likes are not recommendations for readers, they are purely appreciation, or even just social acknowledgement. Within a certain social context they can be of value to other people, but to random strangers, they are not. Currently, I solve this problem by not posting those kinds of likes to my site at all (leaving them on Facebook or whatever silo), but that\u2019s of course not ideal in the IndieWeb scheme of things.</p>\n<p>With bookmarks, a similar thing can happen: not all bookmarks are recommendations. The easiest example is an article that I think looks interesting, so I bookmark it to read it later, but I haven\u2019t read it yet. I do not recommend that article, but a reader might think that.</p>\n<p>In both cases: sometimes I do want to recommend an article in a single post.</p>\n<h2>What I don\u2019t want to propose</h2>\n<p>Let me make a little pause here and say something about likes, favorites, recommendations and what more. We can solve the above things by just adding more webactions to the field. \u201cLet\u2019s also support, next to bookmarks and likes, favorites and recommendations.\u201d But I don\u2019t think that\u2019s the solution, because adding those options means just more post types to keep track of, for both publishing sites and consuming indie-readers. </p>\n<p>Keeping things a little bit abstract and minimal helps us focus on the problem at hand. (Which is at this moment, I think, building an functioning indie-reader in the first place.)</p>\n<h2>What I would add to my bookmarks</h2>\n<p>Seeing what Pocket does with bookmarks, I think I want to expand what I post as a bookmark. To be fair: a lot of other people on the IndieWeb have more detailed bookmarks too. Other properties of a bookmark include: tags, a little summary of the bookmarked post, the reason why the post was bookmarked and sometimes even a screenshot of the bookmarked page.</p>\n<p>I\u2019m not sure how much I want to add to them, but since they are very skinny now, I certainly would like to add some tags. Tags, and possible a reason, make it easier to find a bookmarked article back after a while.</p>\n<p>That brings me to what I think a bookmark would be for me: showing an interest in the linked article, without adding too much judgement. I see bookmarks as a personal archive of things I want to read or have read. If technical skills allow it, I would also save a copy of the post for personal use, hidden in the bookmark-post itself.</p>\n<h2>What I would change to likes</h2>\n<p>To likes I wouldn\u2019t change much. For likes, I want to make a personal copy of the original too, because I do care about that content, but from the outside, it\u2019s just a link. </p>\n<p>But the value of the like would than be more of a vote: this is a piece of content I care about. I think indie-readers should also consume those likes, but just don\u2019t display them the way they display a photo or a note. If there is a post by an author that I don\u2019t follow, but that is liked by, say, three people I do follow, then I want to see that post, accompanied by the names of the three people who liked it. </p>\n<p>The threshold for the external posts to show up may vary from person to person, both personal preferences of the reader as well as the status of the poster of the like. But the point is that it\u2019s a indie-reader-problem. </p>\n<p>In this way, a like is in fact a recommendation, from the readers perspective, but just appreciation from the poster.</p>\n<h2>But back to these social likes</h2>\n<p>Then there are still those likes that depend on some social context, that aren\u2019t solved by the above approaches.</p>\n<p>I think that the root of the problem lies in those exact words: social context. If I like a certain badly photographed pizza, I should not post that to my main feed, but set the visibility of that like to \u2018friends only\u2019. Chances are that the badly photographed pizza was already published as a private post, only visible to a certain audience, so I can copy that. </p>\n<p>The problem here lies more in an easy way of publishing private posts, and an easy way to change the audience of those posts. And of course a way for sites to securely share those posts with the right indie-readers, there is a long way to go still.</p>\n<h2>And what about the bookmarks you haven\u2019t read?</h2>\n<p>Sharing unread bookmarks is also, I think, question of adding the right audience to the post. Such bookmarks can be posted with an \u2018only me\u2019 visibility. You can then subscribe your indie-reader to your own (private and public) bookmarks-feed. This is, without the private part, what I actually did for a while when I was using an indie-reader. Apart from the bugs in my self-build reader, it worked very well.</p>\n<p>And really recommending something? Well, if I really want to recommend something to people who follow me, I can always just post a note, linking the article, and explain why they should read it. That also improves the chance of actually clicking through, no need for extra formatting.</p>\n<h2>Conclusion</h2>\n<p>In the end I don\u2019t think we need better boundaries between a bookmark and a like, in the form of extra \u2018recommend\u2019 or \u2018favorite\u2019 webactions. A bookmark adds something to an archive for yourself, and a like is giving appreciation to the creator of the post. Recommendations can be either explicit by posting a note, or implicit by publicly liking or bookmarking. But, the way this is implied should be the responsibility of your indie-reader, where you can mix to your own taste. Publishers could filter things that they don\u2019t want everybody to pick up as recommendations by using \u2018only friends\u2019, \u2018only who I follow\u2019 or \u2018only me\u2019 posts.</p>\n<p>In the end of the day, this is a lot of thinking and talking. I should get back to creating a indie-reader. As should you, because that\u2019s where the one of the undefined parts of the IndieWeb lies now.</p>" }, "post-type": "article", "_id": "1367154", "_source": "1366", "_is_read": true }
{ "type": "entry", "published": "2017-10-06 15:00:51 -0400", "summary": "Frederick\u2019s October 2017 meetup for Homebrew Website Club met at the Urbana Regional Library on October 4th. Below are notes from the \u201cbroadcast\u201d portion of the meetup.", "url": "https://eddiehinkle.com/2017/10/06/11/article/", "category": [ "indieweb", "hwc" ], "name": "HWC Frederick Oct 04 2017 Wrap-Up", "author": { "type": "card", "name": "Eddie Hinkle", "url": "https://eddiehinkle.com", "photo": null }, "_id": "9995", "_source": "39", "_is_read": true }
{ "type": "entry", "published": "2017-10-04T23:59:56+0000", "url": "https://notiz.blog/2017/10/04/readability/", "name": "readability", "content": { "text": "Zu Zeiten von Pingbacks, antwortete man noch mit Blog-Posts auf Blog-Posts, aber es fehlte die Technik um sie richtig zu \u00fcbermitteln und darzustellen:\n\n[\u2026] und Wertvorstellungen entspricht und nicht von der Mehrheit meiner Freunde abh\u00e4ngig sein.\u00bb Dezentrale Walled Gardens Hier erscheinen von Montag bis Freitag ausgew\u00e4hlte Links zu lesenswerten Texten und aktuellen [\u2026]\n\nMit Webmentions und Microformats2 hat sich zwar die Darstellung verbessert, aber die Texte\u2026 naja\u2026 haben sich \"ver\u00e4ndert\":\n\n#100DoPP d84:\nBoth #AS2 & #Micropub are @W3C PRs!\nCongrats @SocialWebWG @jasnell @evanpro @aaronpk!\nhttps://www.w3.org/TR/micropub\nhttps://www.w3.org/TR/activitystreams-core/\nhttps://www.w3.org/TR/activitystreams-vocabulary\n\ntantek.com/t4np2\n\nTwitter sei Dank!\n\n\u2026da h\u00e4tte man sich die Arbeit auch sparen k\u00f6nnen \ud83d\ude09", "html": "<p>Zu Zeiten von Pingbacks, antwortete man noch mit Blog-Posts auf Blog-Posts, aber es fehlte die Technik um sie richtig zu \u00fcbermitteln und darzustellen:</p>\n\n<pre><code>[\u2026] und Wertvorstellungen entspricht und nicht von der Mehrheit meiner Freunde abh\u00e4ngig sein.\u00bb Dezentrale Walled Gardens Hier erscheinen von Montag bis Freitag ausgew\u00e4hlte Links zu lesenswerten Texten und aktuellen [\u2026]</code></pre>\n\n<p>Mit Webmentions und Microformats2 hat sich zwar die Darstellung verbessert, aber die Texte\u2026 naja\u2026 haben sich \"ver\u00e4ndert\":</p>\n\n<pre><code>#100DoPP d84:\nBoth #AS2 & #Micropub are @W3C PRs!\nCongrats @SocialWebWG @jasnell @evanpro @aaronpk!\nhttps://www.w3.org/TR/micropub\nhttps://www.w3.org/TR/activitystreams-core/\nhttps://www.w3.org/TR/activitystreams-vocabulary</code></pre>\n\n<p><a href=\"http://tantek.com/t4np2\">tantek.com/t4np2</a></p>\n\n<p>Twitter sei Dank!</p>\n\n<p>\u2026da h\u00e4tte man sich die Arbeit auch sparen k\u00f6nnen \ud83d\ude09</p>" }, "author": { "type": "card", "name": "Matthias Pfefferle", "url": "https://notiz.blog/author/matthias-pfefferle/", "photo": "https://secure.gravatar.com/avatar/75512bb584bbceae57dfc503692b16b2?s=40&d=mm&r=g" }, "_id": "100362", "_source": "206", "_is_read": true }
{ "type": "entry", "published": "2017-09-26T23:45:35Z", "url": "https://bear.im/bearlog/2017/269/twitter-i-fixed-it-for-you.html", "category": [ "indieweb" ], "name": "Twitter I fixed it for you", "content": { "text": "So Twitter is all happy with itself that they are (finally) expanding the maximum length of a tweet from 140 to 280...\n\nbig woop-de-doo\n\nIndieWeb folk haven't had this issue for ages because we write our thoughts on our own sites and only use Twitter as a way to notify folks.\n\nIndieWeb\nPOSSE Publish (on your) Own Site, Syndicate Elsewhere", "html": "<p>So Twitter is all happy with itself that they are (finally) expanding the maximum length of a tweet from 140 to 280...</p>\n\n<p>big woop-de-doo</p>\n\n<p>IndieWeb folk haven't had this issue for ages because we write our thoughts on our own sites and only use Twitter as a way to notify folks.</p>\n\n<ul><li><a href=\"https://bear.im/bearlog/\">IndieWeb</a></li>\n<li><a href=\"http://indieweb.org/posse\">POSSE Publish (on your) Own Site, Syndicate Elsewhere</a></li>\n</ul>" }, "author": { "type": "card", "name": "Mike Taylor", "url": "https://bear.im/", "photo": "https://bear.im/images/bear_145x145.jpg" }, "_id": "99740", "_source": "190", "_is_read": true }
{ "type": "entry", "author": { "name": null, "url": "https://ouvre-boite.com//", "photo": null }, "url": "https://ouvre-boite.com//indie-fallacy/", "published": "2017-09-19T23:45:11-04:00", "content": { "html": "<blockquote>\n <p>I won\u2019t travel by plane, because when they crash, a lot of people die. I\u2019d much rather drive my own car.</p>\n</blockquote>\n\n<p>There is absolutely no doubt that plane crashes are spectacular and awfully painful. Yet, when comparing to other means of transportation, there is no doubt either that flying is by far the safest mode of transportation. A recent article <a href=\"http://traveltips.usatoday.com/air-travel-safer-car-travel-1581.html\">explained that</a>, in 2015:</p>\n\n<blockquote>\n <p>13 fatalities per 100 million vehicle miles traveled</p>\n</blockquote>\n\n<blockquote>\n <p>Airline accidents per 100 million miles flown came in at a rate of 0.35</p>\n</blockquote>\n\n\n\n<p>I consider myself a member of the open web community and very friendly with the goals of the IndieWeb community. I too wish for a world where web giants have less power and where the user is in control of more of their data. Yet, I now work for a large (the largest?) publishing platform. It is not often easy to reconcile, but one thing that I can tell you for a fact is that your data is, <em>on average</em>, safer on large hosting provider than it is on your small indie site.</p>\n\n\n\n<p>I built and run a <a href=\"https://superfeedr.com/\">company that crawls the web</a> (and which was acquired by Medium). Superfeedr is at the front row to witness the death of a website and the loss of the data that it hosted. Of course, sometimes, too often, <a href=\"https://indieweb.org/site_deaths\">large silos go away</a>, taking with them a ton of content. However, for every one of them, <em>how many domains expire? How many hosting contract is terminated? How many database failure happen? How many open source CMS instances are compromised? \u2026</em></p>\n\n<p>The Superfeedr database is full of dead and broken URLs which are not accessible anymore, and the vast majority of them is not from large and once popular companies, but rather from small, independent sites whose owner\u2019s interest vanished.</p>\n\n<p>In the same way that we hear more about plane crashes than daily road casualties, we hear more about these large companies which ran out of funding\u2026 but it is pretty clear which ones are actually more likely to disappear with their content.</p>\n\n<p>There are also a lot more practical reasons why one should decide to host their content on large providers like <a href=\"https://medium.com/\">Medium</a>,: convenience, distribution\u2026</p>\n\n<p>That said, it is important to focus on platforms which actually do not act as one way streets: not all platforms are the same. Make sure you pick one that minimizes the \u201ccoupling\u201d so you can safely move away when you need or want to with features such as :</p>\n\n<ul><li><a href=\"https://help.medium.com/hc/en-us/articles/115004745787-Export-content\">exports the full content</a>,</li>\n <li><a href=\"https://help.medium.com/hc/en-us/articles/115005579728-Get-started-with-custom-domains\">use your own domain</a>,</li>\n <li>customize URL completely (which we do not do),</li>\n <li>relies on open formats and protocols, such as RSS or maybe <a href=\"https://www.w3.org/TR/websub/\">WebSub</a> and <a href=\"https://indieweb.org/Webmention\">Webmention</a></li>\n <li>does not require user accounts to \u201cread\u201d the stuff you want everyone to be able to read\u2026 etc.</li>\n</ul>", "text": "I won\u2019t travel by plane, because when they crash, a lot of people die. I\u2019d much rather drive my own car.\n\n\nThere is absolutely no doubt that plane crashes are spectacular and awfully painful. Yet, when comparing to other means of transportation, there is no doubt either that flying is by far the safest mode of transportation. A recent article explained that, in 2015:\n\n\n 13 fatalities per 100 million vehicle miles traveled\n\n\n\n Airline accidents per 100 million miles flown came in at a rate of 0.35\n\n\n\n\nI consider myself a member of the open web community and very friendly with the goals of the IndieWeb community. I too wish for a world where web giants have less power and where the user is in control of more of their data. Yet, I now work for a large (the largest?) publishing platform. It is not often easy to reconcile, but one thing that I can tell you for a fact is that your data is, on average, safer on large hosting provider than it is on your small indie site.\n\n\n\nI built and run a company that crawls the web (and which was acquired by Medium). Superfeedr is at the front row to witness the death of a website and the loss of the data that it hosted. Of course, sometimes, too often, large silos go away, taking with them a ton of content. However, for every one of them, how many domains expire? How many hosting contract is terminated? How many database failure happen? How many open source CMS instances are compromised? \u2026\n\nThe Superfeedr database is full of dead and broken URLs which are not accessible anymore, and the vast majority of them is not from large and once popular companies, but rather from small, independent sites whose owner\u2019s interest vanished.\n\nIn the same way that we hear more about plane crashes than daily road casualties, we hear more about these large companies which ran out of funding\u2026 but it is pretty clear which ones are actually more likely to disappear with their content.\n\nThere are also a lot more practical reasons why one should decide to host their content on large providers like Medium,: convenience, distribution\u2026\n\nThat said, it is important to focus on platforms which actually do not act as one way streets: not all platforms are the same. Make sure you pick one that minimizes the \u201ccoupling\u201d so you can safely move away when you need or want to with features such as :\n\nexports the full content,\n use your own domain,\n customize URL completely (which we do not do),\n relies on open formats and protocols, such as RSS or maybe WebSub and Webmention\n does not require user accounts to \u201cread\u201d the stuff you want everyone to be able to read\u2026 etc." }, "name": "The \u201cindie\u201d\u00a0fallacy", "_id": "124106", "_source": "241", "_is_read": true }
{ "type": "entry", "published": "2017-09-02T20:09:58Z", "url": "https://bear.im/bearlog/2017/245/checking-indieweb-code.html", "category": [ "code, indieweb" ], "name": "Checking Indieweb Code", "content": { "text": "It's been quite a while since I looked at any of the Indieweb code or new tests, so this post is to give things a once-over and see if anything needs fixing.\n\nBelow are links so Webmention Rocks! can check my handling of webmentions.\n\nTests that failed:\n- test 23\n\nTests that passed:\n\ntest 1\ntest 2\ntest 3\ntest 4\ntest 5\ntest 6\ntest 7\ntest 8\ntest 9\ntest 10\ntest 11\ntest 12\ntest 13\ntest 14\ntest 15\ntest 16\ntest 17\ntest 18\ntest 19\ntest 20\ntest 21\ntest 22", "html": "<p>It's been quite a while since I looked at any of the Indieweb code or new tests, so this post is to give things a once-over and see if anything needs fixing.</p>\n\n<p>Below are links so Webmention Rocks! can check my handling of webmentions.</p>\n\n<p>Tests that failed:\n- <a href=\"https://webmention.rocks/test/23/page\">test 23</a></p>\n\n<p>Tests that passed:</p>\n\n<ul><li><a href=\"https://webmention.rocks/test/1\">test 1</a></li>\n<li><a href=\"https://webmention.rocks/test/2\">test 2</a></li>\n<li><a href=\"https://webmention.rocks/test/3\">test 3</a></li>\n<li><a href=\"https://webmention.rocks/test/4\">test 4</a></li>\n<li><a href=\"https://webmention.rocks/test/5\">test 5</a></li>\n<li><a href=\"https://webmention.rocks/test/6\">test 6</a></li>\n<li><a href=\"https://webmention.rocks/test/7\">test 7</a></li>\n<li><a href=\"https://webmention.rocks/test/8\">test 8</a></li>\n<li><a href=\"https://webmention.rocks/test/9\">test 9</a></li>\n<li><a href=\"https://webmention.rocks/test/10\">test 10</a></li>\n<li><a href=\"https://webmention.rocks/test/11\">test 11</a></li>\n<li><a href=\"https://webmention.rocks/test/12\">test 12</a></li>\n<li><a href=\"https://webmention.rocks/test/13\">test 13</a></li>\n<li><a href=\"https://webmention.rocks/test/14\">test 14</a></li>\n<li><a href=\"https://webmention.rocks/test/15\">test 15</a></li>\n<li><a href=\"https://webmention.rocks/test/16\">test 16</a></li>\n<li><a href=\"https://webmention.rocks/test/17\">test 17</a></li>\n<li><a href=\"https://webmention.rocks/test/18\">test 18</a></li>\n<li><a href=\"https://webmention.rocks/test/19\">test 19</a></li>\n<li><a href=\"https://webmention.rocks/test/20\">test 20</a></li>\n<li><a href=\"https://webmention.rocks/test/21\">test 21</a></li>\n<li><a href=\"https://webmention.rocks/test/22\">test 22</a></li>\n</ul>" }, "author": { "type": "card", "name": "Mike Taylor", "url": "https://bear.im/", "photo": "https://bear.im/images/bear_145x145.jpg" }, "_id": "99741", "_source": "190", "_is_read": true }
{ "type": "entry", "published": "2017-08-19T16:17:16+0000", "url": "https://seblog.nl/2017/08/19/6/micropub-irc-bot", "category": [ "indieweb", "howto", "irc", "micropub" ], "syndication": [ "https://news.indieweb.org/en/seblog.nl/2017/08/19/6/micropub-irc-bot" ], "name": "Adding Micropub to your IRC bot", "content": { "text": "In last weeks IndieWeb newsletter I read a blogpost by Sven about having notifications for webmentions and such via IRC. He described more or less the setup I have too: using Aaron\u2019s TikTokBot framework, running on the same machine as a private IRC server for it and your IRC bouncer. In my case, the machine is a Raspberry Pi in my living room, but Sven\u2019s guide describes more or less what I did too, so please check that out.\nI divided my webmention notifications into webmentions and silomentions (that\u2019s backfeed from services like Bridgy and OwnYourSwarm) and I also get notifications for logins and Micropub requests, so I can keep track of what\u2019s happening on my blog. But that\u2019s just expanding the notifications. I added some other functionality I wanted to talk about.\nHey bot, please like this post\nThe one thing that made me post on my site the most, was adding Micropub support. There are various Micropub clients out there that you can use to just write a blogpost, to post a like, to import checkins from Swarm or what have you. But since it\u2019s so simple (once you know how), I also made a lot of Micropub clients out of Workflow, Paw or, in this case, my IRC bot called Bop.\nI can now say like https://example.com/a-post in the same channel my notifications come in, and Bop will post a like-post on my site. My site will then post the webmention and if the other site accepts it, it will be shown as a like under the post, just like that.\nPlease refer to Sven\u2019s blogpost to learn how to set the bot up. I also assume you already have a site that supports Micropub. I will go into obtaining an access token a bit, but that might be a tricky part and depends on how your Micropub endpoint works.\nGetting your bot hooked\nSven mentions the file \u2018hooks.yml\u2019, which contains hooks: [] for him. The hooks-file defines the things the bot will respond to, and since Sven only want to receive notifications, not talk to his bot, he does not need hooks. But we do. Replace the contents of the hooks file with the following:\nhooks:\n- match: \"^(like|bookmark|rsvp|yes|no|maybe|interested) (https?\\\\:\\\\/\\\\/[a-zA-Z0-9\\\\-\\\\.]+\\\\.[a-zA-Z]{2,}(\\\\/[^>,\\\\\\\")\\\\s]*)?)\"\n url: \"http://localhost:8000/micropub.php\"\n channels:\n - \"@seblog\"\n- match: \"^(tweet|note|fb) (.*)\"\n url: \"http://localhost:8000/micropub.php\"\n channels:\n - \"@seblog\"\nAs you can see, I like to match for a URL to support like, bookmark and rsvp, and for anything to support notes on your own site, Twitter and Facebook. Feel free to change the syntax to your own needs.\nUnder channels, I defined @seblog, which means \u2018every channel in the server seblog\u2019. That name comes from your config.yml, and it\u2019s a safety measure, so that when I connect my bot to Freenode also, it won\u2019t accept likes from other people. I am the only person connected to the private IRC network Seblog, so that will be fine.\nCreating the Micropub.php\nAs you saw, the hooks define a URL that will be called by the bot. I specified that to be on localhost:8000 and point to micropub.php. In your TikTokBot folder (or where you want, really) create a folder called \u2018server\u2019 and a file within it called \u2018micropub.php\u2019. Let\u2019s start with the following to test it out:\n<?php\nheader('Content-Type: application/json');\n\necho json_encode([\n 'content' => 'Hi, you called for a Micropub?'\n]);\nThen go to the newly created folder and run the command php -S localhost:8000. This starts up a webserver from that folder, so if you now go to your private channel and say note This is a test, you will see that the bot responds. If you say something that does not match the regex, the bot will stay silent.\nGive me my data back\nIf we want to send data to our Micropub endpoint, we need to make sure that our bot has that data. Let\u2019s make the bot echo whatever we said, so we know that he heard us.\nTikTokBot gives us a JSON object of the message via the POST data. Long story short, you can get it by using the following:\n<?php\nheader('Content-Type: application/json');\n\n$message = json_decode(file_get_contents(\"php://input\"));\n\n$full = $message->content;\n$action = $message->match[0];\n$param = $message->match[1];\n\necho json_encode([\n 'content' => \"Hi, you said '$full', you wanted to $action $param?\"\n]);\nNow, if you say like https://seblog.nl/2017/08/19/6/micropub-irc-bot, the bot will respond with Hi, you said 'like https://seblog.nl/2017/08/19/6/micropub-irc-bot', you wanted to like https://seblog.nl/2017/08/19/6/micropub-irc-bot?. Try it out, and different actions too, so you know it works!\nMake sure not to echo the full message, because since the bot listens to itself, that message will trigger itself again, resulting in the bot repeating the message over and over again. (Just restart the bot if that happens.)\nSending a POST request\nA Micropub request is, in the end, just a POST request. Here\u2019s a little helper function to send one for you. Just start with this code at the top of your file, right after <?php.\nfunction send_post($url, $fields, $bearer = null) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n\n if ($bearer) {\n curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$bearer]);\n }\n\n $body = http_build_query($fields);\n curl_setopt($ch, CURLOPT_POST, 1);\n curl_setopt($ch, CURLOPT_POSTFIELDS, $body);\n\n $resp = curl_exec($ch);\n\n if(!$resp) {\n $resp = 'Error: '.curl_error($ch);\n }\n\n curl_close($ch);\n\n return $resp;\n}\nNext, I have a plain and dirty if-chain, to determine the action. You can add this right after you defined $action and $param:\nif ($action == 'like') {\n $fields = [\n 'like-of' => $param\n ];\n\n} elseif ($action == 'bookmark') {\n $fields = [\n 'bookmark-of' => $param\n ];\n} else exit();\n\nsend_post('https://seblog.nl/micropub', $fields, 'xxx');\nMake sure to replace that URL with your own Micropub endpoint, and xxx with your own access token. I\u2019ll talk about obtaining one at the bottom of this post.\nI don\u2019t have the bot say anything after this, because the bot will give a notification once a Micropub request is made, which is enough feedback for me. You could also return whatever send_post() returns, I leave that up to you.\nMore post types\nAs you can see in the code above, you can just add fields to the array. Here are some other elseifs I use.\n} elseif ($action == 'tweet') {\n if (strlen($param) > 140) {\n exit(json_encode(['content' => 'Text is '.strlen($param).' chars!']);\n }\n\n $fields = [\n 'content' => $param,\n 'syndicate-to' => 'https://brid.gy/publish/twitter'\n ];\n\n} elseif ($action == 'fb') {\n $fields = [\n 'content' => $param,\n 'syndicate-to' => 'https://brid.gy/publish/facebook'\n ];\n\n} elseif ($action == 'rsvp'\n or $action == 'yes'\n or $action == 'no'\n or $action == 'maybe'\n or $action == 'interested') {\n\n $fields = [\n 'in-reply-to' => $param,\n 'rsvp' => $action == 'rsvp' ? 'yes' : $action,\n ];\n\n if (strpos($param, 'facebook.com')) {\n $fields['syndicate-to'] = 'https://brid.gy/publish/facebook';\n }\n\n} elseif ($action == 'note') {\n\n $fields = [\n 'content' => $param\n ];\nSee how easy that is? Please make up new ones and tell me about it!\nI\u2019m particularly proud of the tweet one, which will, thanks to the exit(), not post the tweet unless it fits the 140-chars-rule.\nPlease note that the use of the syndicate-to fields (or the newer mp-syndicate-to) depend on your own website. This only gives my webserver the order to syndicate, it does not syndicate by itself. If your server does not know how to syndicate to Twitter, it will not work, but explaining how to do that is it\u2019s own tutorial.\nIn real life, I actually have note set to 'private' => true and 'audience' => 'http://seblog.nl/, so it\u2019s a private note. But: 1) I don\u2019t expect many people to support private posts, 2) how many people are interested in posting things to their website only they themselves can see? and 3) I want to change the 'private' => true to 'visibility' => 'private', or something like that.\nThat\u2019s it!\nThere you go, a customisable Micropub chatbot. Please double check that it\u2019s only doing it\u2019s thing on your private IRC server, and not on any public servers where your bot might lurk (if you use any). Have fun liking and posting!\nPOST-scriptum: Obtaining an access token\nThe question \u201cwhat do I replace \u2018xxx\u2019 with?\u201d is a hard one to answer, because it totally depends on how your site handles access tokens. Most Micropub clients ship with an IndieAuth flow to obtaining one, but since we\u2019re making this one ourselves, we have to get one manually.\nYou can do this by following the steps on the wiki, if you have a way to send POST requests. You can also log in to a Micropub client like Quill, which shows you the access token it got, and use that. Since this all depends on your own site, it might offer an easier way, or it might not.\nUpdate 2017-10-04: In an earlier version of this post, I did not set a Content-Type: application/json-header, so the bot didn't actually respond. Setting that header at the top of your file will fix that.", "html": "<p>In last weeks IndieWeb newsletter I read <a href=\"https://www.svenknebel.de/posts/2017/8/4/\">a blogpost by Sven</a> about having notifications for webmentions and such via IRC. He described more or less the setup I have too: using <a href=\"https://aaronparecki.com/\">Aaron</a>\u2019s <a href=\"https://github.com/aaronpk/TikTokBot\">TikTokBot</a> framework, running on the same machine as a private IRC server for it and your IRC bouncer. In my case, the machine is a Raspberry Pi in my living room, but Sven\u2019s guide describes more or less what I did too, so please check that out.</p>\n<p>I divided my webmention notifications into webmentions and silomentions (that\u2019s backfeed from services like <a href=\"https://brid.gy\">Bridgy</a> and <a href=\"https://ownyourswarm.p3k.io\">OwnYourSwarm</a>) and I also get notifications for logins and Micropub requests, so I can keep track of what\u2019s happening on my blog. But that\u2019s just expanding the notifications. I added some other functionality I wanted to talk about.</p>\n<h2>Hey bot, please like this post</h2>\n<p>The one thing that made me post on my site the most, was adding <a href=\"https://micropub.net\">Micropub</a> support. There are various Micropub clients out there that you can use to just write a blogpost, to post a like, to import checkins from Swarm or what have you. But since it\u2019s so simple (once you know how), I also made a lot of Micropub clients out of <a href=\"https://workflow.is/\">Workflow</a>, <a href=\"https://paw.cloud/\">Paw</a> or, in this case, my IRC bot called Bop.</p>\n<p>I can now say <code>like https://example.com/a-post</code> in the same channel my notifications come in, and Bop will post a like-post on my site. My site will then post the webmention and if the other site accepts it, it will be shown as a like under the post, just like that.</p>\n<p><em>Please refer to <a href=\"https://www.svenknebel.de/posts/2017/8/4/\">Sven\u2019s blogpost</a> to learn how to set the bot up. I also assume you already have a site that supports Micropub. I will go into <a href=\"http://indieweb.org/obtaining-an-access-token\">obtaining an access token</a> a bit, but that might be a tricky part and depends on how your Micropub endpoint works.</em></p>\n<h2>Getting your bot hooked</h2>\n<p>Sven mentions the file \u2018hooks.yml\u2019, which contains <code>hooks: []</code> for him. The hooks-file defines the things the bot will respond to, and since Sven only want to receive notifications, not talk to his bot, he does not need hooks. But we do. Replace the contents of the hooks file with the following:</p>\n<pre><code>hooks:\n- match: \"^(like|bookmark|rsvp|yes|no|maybe|interested) (https?\\\\:\\\\/\\\\/[a-zA-Z0-9\\\\-\\\\.]+\\\\.[a-zA-Z]{2,}(\\\\/[^>,\\\\\\\")\\\\s]*)?)\"\n url: \"http://localhost:8000/micropub.php\"\n channels:\n - \"@seblog\"\n- match: \"^(tweet|note|fb) (.*)\"\n url: \"http://localhost:8000/micropub.php\"\n channels:\n - \"@seblog\"</code></pre>\n<p>As you can see, I like to match for a URL to support like, bookmark and rsvp, and for anything to support notes on your own site, Twitter and Facebook. Feel free to change the syntax to your own needs.</p>\n<p>Under channels, I defined <code>@seblog</code>, which means \u2018every channel in the server <code>seblog</code>\u2019. That name comes from your <code>config.yml</code>, and it\u2019s a safety measure, so that when I connect my bot to Freenode also, it won\u2019t accept likes from other people. I am the only person connected to the private IRC network Seblog, so that will be fine.</p>\n<h2>Creating the Micropub.php</h2>\n<p>As you saw, the hooks define a URL that will be called by the bot. I specified that to be on localhost:8000 and point to micropub.php. In your TikTokBot folder (or where you want, really) create a folder called \u2018server\u2019 and a file within it called \u2018micropub.php\u2019. Let\u2019s start with the following to test it out:</p>\n<pre><code><?php\nheader('Content-Type: application/json');\n\necho json_encode([\n 'content' => 'Hi, you called for a Micropub?'\n]);</code></pre>\n<p>Then go to the newly created folder and run the command <code>php -S localhost:8000</code>. This starts up a webserver from that folder, so if you now go to your private channel and say <code>note This is a test</code>, you will see that the bot responds. If you say something that does not match the regex, the bot will stay silent.</p>\n<h2>Give me my data back</h2>\n<p>If we want to send data to our Micropub endpoint, we need to make sure that our bot has that data. Let\u2019s make the bot echo whatever we said, so we know that he heard us.</p>\n<p>TikTokBot gives us a JSON object of the message via the POST data. Long story short, you can get it by using the following:</p>\n<pre><code><?php\nheader('Content-Type: application/json');\n\n$message = json_decode(file_get_contents(\"php://input\"));\n\n$full = $message->content;\n$action = $message->match[0];\n$param = $message->match[1];\n\necho json_encode([\n 'content' => \"Hi, you said '$full', you wanted to $action $param?\"\n]);</code></pre>\n<p>Now, if you say <code>like https://seblog.nl/2017/08/19/6/micropub-irc-bot</code>, the bot will respond with <code>Hi, you said 'like https://seblog.nl/2017/08/19/6/micropub-irc-bot', you wanted to like https://seblog.nl/2017/08/19/6/micropub-irc-bot?</code>. Try it out, and different actions too, so you know it works!</p>\n<p>Make sure not to echo the full message, because since the bot listens to itself, that message will trigger itself again, resulting in the bot repeating the message over and over again. (Just restart the bot if that happens.)</p>\n<h2>Sending a POST request</h2>\n<p>A Micropub request is, in the end, just a POST request. Here\u2019s a little helper function to send one for you. Just start with this code at the top of your file, right after <code><?php</code>.</p>\n<pre><code>function send_post($url, $fields, $bearer = null) {\n $ch = curl_init();\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');\n curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\n\n if ($bearer) {\n curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer '.$bearer]);\n }\n\n $body = http_build_query($fields);\n curl_setopt($ch, CURLOPT_POST, 1);\n curl_setopt($ch, CURLOPT_POSTFIELDS, $body);\n\n $resp = curl_exec($ch);\n\n if(!$resp) {\n $resp = 'Error: '.curl_error($ch);\n }\n\n curl_close($ch);\n\n return $resp;\n}</code></pre>\n<p>Next, I have a plain and dirty if-chain, to determine the action. You can add this right after you defined <code>$action</code> and <code>$param</code>:</p>\n<pre><code>if ($action == 'like') {\n $fields = [\n 'like-of' => $param\n ];\n\n} elseif ($action == 'bookmark') {\n $fields = [\n 'bookmark-of' => $param\n ];\n} else exit();\n\nsend_post('https://seblog.nl/micropub', $fields, 'xxx');</code></pre>\n<p>Make sure to replace that URL with your own Micropub endpoint, and <code>xxx</code> with your own access token. I\u2019ll talk about obtaining one at the bottom of this post.</p>\n<p>I don\u2019t have the bot say anything after this, because the bot will give a notification once a Micropub request is made, which is enough feedback for me. You could also return whatever <code>send_post()</code> returns, I leave that up to you.</p>\n<h2>More post types</h2>\n<p>As you can see in the code above, you can just add fields to the array. Here are some other <code>elseif</code>s I use.</p>\n<pre><code>} elseif ($action == 'tweet') {\n if (strlen($param) > 140) {\n exit(json_encode(['content' => 'Text is '.strlen($param).' chars!']);\n }\n\n $fields = [\n 'content' => $param,\n 'syndicate-to' => 'https://brid.gy/publish/twitter'\n ];\n\n} elseif ($action == 'fb') {\n $fields = [\n 'content' => $param,\n 'syndicate-to' => 'https://brid.gy/publish/facebook'\n ];\n\n} elseif ($action == 'rsvp'\n or $action == 'yes'\n or $action == 'no'\n or $action == 'maybe'\n or $action == 'interested') {\n\n $fields = [\n 'in-reply-to' => $param,\n 'rsvp' => $action == 'rsvp' ? 'yes' : $action,\n ];\n\n if (strpos($param, 'facebook.com')) {\n $fields['syndicate-to'] = 'https://brid.gy/publish/facebook';\n }\n\n} elseif ($action == 'note') {\n\n $fields = [\n 'content' => $param\n ];</code></pre>\n<p>See how easy that is? Please make up new ones and tell me about it!</p>\n<p>I\u2019m particularly proud of the <code>tweet</code> one, which will, thanks to the <code>exit()</code>, not post the tweet unless it fits the 140-chars-rule.</p>\n<p>Please note that the use of the <code>syndicate-to</code> fields (or the newer <code>mp-syndicate-to</code>) depend on your own website. This only gives my webserver the order to syndicate, it does not syndicate by itself. If your server does not know how to syndicate to Twitter, it will not work, but explaining how to do that is it\u2019s own tutorial.</p>\n<p>In real life, I actually have <code>note</code> set to <code>'private' => true</code> and <code>'audience' => 'http://seblog.nl/</code>, so it\u2019s a private note. But: 1) I don\u2019t expect many people to support private posts, 2) how many people are interested in posting things to their website only they themselves can see? and 3) I want to change the <code>'private' => true</code> to <code>'visibility' => 'private'</code>, or something like that.</p>\n<h2>That\u2019s it!</h2>\n<p>There you go, a customisable Micropub chatbot. Please double check that it\u2019s only doing it\u2019s thing on your private IRC server, and not on any public servers where your bot might lurk (if you use any). Have fun liking and posting!</p>\n<h4>POST-scriptum: Obtaining an access token</h4>\n<p>The question \u201cwhat do I replace \u2018xxx\u2019 with?\u201d is a hard one to answer, because it totally depends on how your site handles access tokens. Most Micropub clients ship with an IndieAuth flow to obtaining one, but since we\u2019re making this one ourselves, we have to get one manually.</p>\n<p>You can do this by following the <a href=\"http://indieweb.org/obtaining-an-access-token\">steps on the wiki</a>, if you have a way to send POST requests. You can also log in to a Micropub client like Quill, which shows you the access token it got, and use that. Since this all depends on your own site, it might offer an easier way, or it might not.</p>\n<p><strong>Update</strong> 2017-10-04: In an earlier version of this post, I did not set a <code>Content-Type: application/json</code>-header, so the bot didn't actually respond. Setting that header at the top of your file will fix that.</p>" }, "post-type": "article", "_id": "1367155", "_source": "1366", "_is_read": true }
{ "type": "entry", "published": "2017-08-15T07:07:51Z", "url": "https://jeena.net/notes/880", "name": "Jeena,\n\t\t\t\t\n\t\t\t\t\t7 months ago2017-08-15 07:07:51\n\t\t\t\t\t(4)\n\t\t\t \n\t\t\t A couple of interesting articles on the IndieWeb right now: \n\nReflections on Two Years of #Indieweb - Alex Kearney - https://kongaloosh.com/e/2017/6/22/hello-world \n\nNot giving up on IndieWeb - Jeremy Cherfas - https://www.jeremycherfas.net/blog/not-giving-up-on-indieweb \n\nThe confusion about the indieweb - Colin Walker - https://colinwalker.blog/2017/06/22/the-confusion-about-the-indieweb/ \n\nRe: Making the IndieWeb easier for Generation 2 users - John Johnston - http://johnjohnston.info/blog/re-chris-aldrich-on-making-the-indieweb-easier-for-generation-2-users/ \n\n--", "content": { "text": "A couple of interesting articles on the IndieWeb right now:\n\nReflections on Two Years of #Indieweb - Alex Kearney - https://kongaloosh.com/e/2017/6/22/hello-world\n\nNot giving up on IndieWeb - Jeremy Cherfas - https://www.jeremycherfas.net/blog/not-giving-up-on-indieweb\n\nThe confusion about the indieweb - Colin Walker - https://colinwalker.blog/2017/06/22/the-confusion-about-the-indieweb/\n\nRe: Making the IndieWeb easier for Generation 2 users - John Johnston - http://johnjohnston.info/blog/re-chris-aldrich-on-making-the-indieweb-easier-for-generation-2-users/\n\n--", "html": "<p></p>\n<p>A couple of interesting articles on the IndieWeb right now:</p>\n\n<p>Reflections on Two Years of #Indieweb - Alex Kearney - <a href=\"https://kongaloosh.com/e/2017/6/22/hello-world\">https://kongaloosh.com/e/2017/6/22/hello-world</a></p>\n\n<p>Not giving up on IndieWeb - Jeremy Cherfas - <a href=\"https://www.jeremycherfas.net/blog/not-giving-up-on-indieweb\">https://www.jeremycherfas.net/blog/not-giving-up-on-indieweb</a></p>\n\n<p>The confusion about the indieweb - Colin Walker - <a href=\"https://colinwalker.blog/2017/06/22/the-confusion-about-the-indieweb/\">https://colinwalker.blog/2017/06/22/the-confusion-about-the-indieweb/</a></p>\n\n<p>Re: Making the IndieWeb easier for Generation 2 users - John Johnston - <a href=\"http://johnjohnston.info/blog/re-chris-aldrich-on-making-the-indieweb-easier-for-generation-2-users/\">http://johnjohnston.info/blog/re-chris-aldrich-on-making-the-indieweb-easier-for-generation-2-users/</a></p>\n\n<p>--</p>" }, "author": { "type": "card", "name": "Jeena", "url": "https://jeena.net/", "photo": "https://jeena.net/avatar.jpg" }, "_id": "99917", "_source": "201", "_is_read": true }
{ "type": "entry", "published": "2017-07-24T15:35:27+0000", "url": "https://seblog.nl/2017/07/24/1/queue-for-kirby", "category": [ "kirby", "plugin" ], "syndication": [ "https://forum.getkirby.com/t/queue-for-kirby/8056", "https://github.com/jenstornell/kirby-plugins/issues/506" ], "name": "Queue for Kirby", "content": { "text": "I was in need for a Queue, so I made one. :)\nThis plugin adds a basic queue to the Kirby CMS, using Cron and Kirby's flat file system.\nIt's mostly designed to be used in other plugins, such as the new Webmentions plugin I'm writing.\nGithub: https://github.com/sebsel/queue-for-kirby\nqueue::define('job_name', function($job) {\n $job->get('param');\n // contains 'some data' in the job added below\n});\n\nqueue::add('job_name', [\n 'param' => 'some data'\n]);", "html": "<p>I was in need for a Queue, so I made one. :)</p>\n<p>This plugin adds a basic queue to the Kirby CMS, using Cron and Kirby's flat file system.</p>\n<p>It's mostly designed to be used in other plugins, such as the new Webmentions plugin I'm writing.</p>\n<p><strong>Github:</strong> <a href=\"https://github.com/sebsel/queue-for-kirby\">https://github.com/sebsel/queue-for-kirby</a></p>\n<pre><code>queue::define('job_name', function($job) {\n $job->get('param');\n // contains 'some data' in the job added below\n});\n\nqueue::add('job_name', [\n 'param' => 'some data'\n]);</code></pre>" }, "post-type": "article", "_id": "1367156", "_source": "1366", "_is_read": true }
{ "type": "entry", "published": "2017-06-27", "summary": "The size of my images changes fluidly with my responsive layout. Since the browser does not know their heights a priori, the space collapses while the images are still loading. Once the images load the entire page reflows and the rest of the content jumps around to make space for them. It would be much better if the space for the images was reserved from the start and, as a bonus, if some lower resolution version of the images displayed, while the images load. Here is how I do it.", "url": "https://kartikprabhu.com/articles/placeholder-images", "featured": "https://lh3.googleusercontent.com/A7cvUA_niRMXqhuutlmmjEGSiB8d616DpvuKz9GUi2IgPpJkp78q4spuREuookaGlqrGP5hV6n-H0zlFBk7Dxqp_33J64Xipi4-QmxSstqSUyEq6F-HBx4JG-zjE7EnH3vH0Xl1MwlHzVbKfchuJxLxIxB7ri55QSqTqHJ8kaCmYtfFvvvmUnnLz5ZEA5mDxs2kp-Ijf5L9pUWAJpS4v4vL6gg2HvvY3LEVrVwecpc3VvEzc-hti4JZet4guKbW7pujbNHfBOeYtpq4EKUFKTmJzHxtT6tp9KYYofrRSOzZj7LYjGwWgv5XrPhl8x8dsnJCc8UC1NHSVrc4tFQiZFo6AfjdyFYO9nlDXPyy6VfF5gmOWiwh2X1XgnSfN-VshcccxPk7y60V8OOcMqjEB4ENJEm8sWlAygWSHAcOgMN_2D02Oa3OCJNNTaJjbGRbOvSTqRewwvBEvtCy2G3XDnEp3HGv9MSzxyVeWFkjhLDkuuMVXOUYBoVbwxYqe7wUa0odnYkaFhJiOo3KW6Rzh7AP04v4nr_LqyuztVsGzbKKL9bpbPE7cP48hNIIAXMhYpU18l5woLTEk9NmAiU7hBYMI9JkwzI2bqzJ_LfnEeYwMhhFRXh6U3w=s1000", "category": [ "web", "html", "css", "python", "indieweb" ], "syndication": [ "https://twitter.com/kartik_prabhu/status/879770925385879553", "https://plus.google.com/+KartikPrabhu/posts/PViXH5XbLQ5" ], "name": "Placeholder Images", "_id": "100340", "_source": "204", "_is_read": true }
{ "type": "entry", "published": "2017-06-26T11:12:51-0400", "url": "https://ben.thatmustbe.me/note/2017/6/26/2/m", "syndication": [ "https://discourse.joinmastodon.org/t/federation-with-indieweb/434" ], "name": "Mastodon and the Indieweb", "content": { "text": "There has been only a small amount of talk about this previously, but I wanted to bring up discussion of Federation with IndieWeb. This includes all the installs of Known, Micro.blog, and a number of other smaller sites (some 2300). There are several pieces to this.\nCurrently (as far as i can tell), the minimum requirements for following people are listed here https://github.com/tootsuite/mastodon/issues/1441#issuecomment-302969948\nI think it would be useful to allow multiple options for these. h-feeds are pretty well established across all the independent social media sites, so it would be great to be able to use this instead of atom/activitystreams.\nInstead of webfinger depend only on existence of an h-card on the url provided. This part would take some working out to figure out how to properly reference the user. My personal preference would be to allow a blank username, so @ben.thatmustbe.me for example, or @@ben.thatmustbe.me.\nRequire either a salmon endpoint or a webmention endpoint. Webmention is much simpler of a spec and so it has a significant preference for many of the developers.\nAlong with the last item, we would want to actually send and receive webmentions to actually reply to others and get replies back.\nThoughts on this? How can we take it in smaller steps?", "html": "<p>There has been only a small amount of talk about this previously, but I wanted to bring up discussion of Federation with IndieWeb. This includes all the installs of Known, Micro.blog, and a number of other smaller sites (some 2300). There are several pieces to this.</p>\n<p>Currently (as far as i can tell), the minimum requirements for following people are listed here <a href=\"https://github.com/tootsuite/mastodon/issues/1441#issuecomment-302969948\">https://github.com/tootsuite/mastodon/issues/1441#issuecomment-302969948</a></p>\n<p>I think it would be useful to allow multiple options for these. h-feeds are pretty well established across all the independent social media sites, so it would be great to be able to use this instead of atom/activitystreams.</p>\n<p>Instead of webfinger depend only on existence of an h-card on the url provided. This part would take some working out to figure out how to properly reference the user. My personal preference would be to allow a blank username, so @ben.thatmustbe.me for example, or @@ben.thatmustbe.me.</p>\n<p>Require either a salmon endpoint or a webmention endpoint. Webmention is much simpler of a spec and so it has a significant preference for many of the developers.</p>\n<p>Along with the last item, we would want to actually send and receive webmentions to actually reply to others and get replies back.</p>\n<p>Thoughts on this? How can we take it in smaller steps?</p>" }, "_id": "78", "_source": "9", "_is_read": true }
{ "type": "entry", "published": "2017-06-24T12:48:20+0000", "url": "https://seblog.nl/2017/06/24/1/switching-to-znc-on-my-raspberry-pi", "category": [ "indieweb", "howto", "irc" ], "name": "Switching to ZNC on my Raspberry\u00a0Pi", "content": { "text": "I\u2019ve been following the #indieweb channel on IRC for a while now, sometimes more active than other times, and my several methods. In the beginning, I just read the logs on chat.indieweb.org, but when I wanted to say something I had to login with Textual.\nBack in Amsterdam I had a bad internet connection (they probably tried to block IRC) so I wasn\u2019t using it a lot. Then there was the bridged Slack channel, which I used intil my first HWC, where Martijn introduced me to thelounge. I installed it on a Raspberry\u00a0Pi I had lying around and used that for quite a while, until I became inactive and shut the thing down.\nUnfortunately I haven\u2019t been able to make it work again after that, so I was in need of something else. Meanwhile I got used to Textual again, and I kind of liked that, except that it disconnected every time my laptop went to sleep.\nOk, so, ZNC you said?\nYeah, enough history! Let\u2019s get to it. ZNC is an IRC bouncer, which connects to IRC for you. When you connect to ZNC, ZNC will give you all the messages it received since you where away. So accedentally closing your laptop? No worries, just open it and you receive all messages again.\nYou still need some computer to be online all the time, but I had that same Raspberry\u00a0Pi (first edition model B), and it\u2019s perfect for this job.\nI first followed the installation instructions here, first downloading the latest source tarball, and following the unpacking and configuring described on that page. Later on, I had to use a different flag on configure, so I added that one here for you. I used the following commands in order:\nwget https://znc.in/releases/znc-1.6.5.tar.gz\ntar -xzvf znc-1.6.5.tar.gz\ncd znc-1.6.5\n./configure --enable-python\nmake\nsudo make install\nThis all takes a while, especially the make part.\nI then made sure I opened a port on my router towards my RPi, so I could access it from outside my home-network, when I\u2019m on the go (look for the NAT settings in your router).\nExtra modules\nThen for extra modules. The webadmin was on, so I could just go to my home-IP + my new port, let\u2019s say https://192.0.2.0:8000. I had SSL enabled and bad certificates, so you might need to trick your browser into accepting them. In the global modules, I enabled chansaver, lastseen and log. I also had notify_connect, but it felt too noisy for me. Don\u2019t forget to hit the \u2018save\u2019 button.\nIn \u2018Your Settings\u2019 I have chansaver and controlpanel on, I believe by default.\nFor other module configuration I connected to ZNC using Textual. When you add it, you can give it a connection name (this is for yourself). The server address is your home IP, and the port the outside port you put in your router. The server password is the one you put in ZNC in the ./configure step. But then comes the part where I was puzzled: go from the \u2018General\u2019 to the \u2018Identity\u2019 view, and add your Freenode IRC nickname as \u2018Nickname\u2019, but your ZNC username as Username. I used sebsel@Mac/freenode, to identify it later. The personal password is for the NickServ password on Freenode.\nAfter connecting I did /msg *simple_away SetTimer 0, because I want to be set to away the moment all my devices are disconnected from ZNC.\nBecause I want to have Textual on my Mac, and this new-found Mutter on my iPhone, I have to get ZNC to manage multiple clients. By default, ZNC sees you have read your messages on your iPhone, so it does not send it to your Mac. To keep track of multiple clients, you need the ClientBuffer module.\nSince I still had the source, I could just compile the module. So I did:\ncd ~/znc-1.6.5/modules/\nwget https://github.com/jpnurmi/znc-clientbuffer/blob/master/clientbuffer.cpp\ncd ~/znc-1.6.5/\nmake\nsudo make install\nAfter that, I got back to Textual, and did /msg *status LoadMod clientbuffer. After that, you can /msg *clientbuffer help and send *clientbuffer some commands as messages. I did AddClient Mac and AddClient iPhone. You can do a ListClients too to see what you got.\nAdding Mutter to the game\nOn the iPhone app Mutter, I added a network with again my home IP as the server, my nickname sebsel and under Advanced use the port I opened, added the password of ZNC in the first password field. The \u2018username\u2019 under Advanced gets the username for ZNC, so I made it sebsel@iPhone/freenode, to let Clientbuffer identify it as my iPhone. If you have notify_connect on you will see that *status notifies you about logging in with your iPhone.\nWarning: I didn\u2019t get this next part to work\nNext I saw that there is an option to receive notifications from ZNC to your iPhone via Mutter. You will need their mutter-push module for that, and that requires ModPython, so that\u2019s why I added the flag --enable-python during the first make.\nAs their explanation says, first grab the mutter package, then make sure you got the right python libs, and then move mutter.py to ~/.znc/modules/.\ncd ~\nwget https://bitbucket.org/jmclough/mutter-push/get/master.zip\nunzip -d mutter -j master.zip\ncd mutter\nsudo apt-get install python3-pip\nsudo pip3 install requests\ncp mutter.py ~/.znc/modules/\nIn IRC, make sure to /znc loadmod modpython and then /znc loadmod mutter (or send a message to *status with loadmod modpython etc.).\nThis last part of getting notifications is still not working for me. I still wanted to post this though, because all the other things work. Hope I\u2019ll get back to notifications soon, when I do get them to work.", "html": "<p>I\u2019ve been following the <a href=\"https://seblog.nl/category/indieweb\">#indieweb</a> channel on IRC for a while now, sometimes more active than other times, and my several methods. In the beginning, I just read the logs on <a href=\"https://chat.indieweb.org\">chat.indieweb.org</a>, but when I wanted to say something I had to login with <a href=\"https://www.codeux.com/textual/\">Textual</a>.</p>\n<p>Back in Amsterdam I had a bad internet connection (they probably tried to block IRC) so I wasn\u2019t using it a lot. Then there was the bridged <a href=\"https://chat.indieweb.org/slack\">Slack channel</a>, which I used intil my first <a href=\"http://indieweb.org/events/2016-11-30-homebrew-website-club\">HWC</a>, where <a href=\"http://vanderven.se/martijn/\">Martijn</a> introduced me to <a href=\"https://thelounge.github.io/\">thelounge</a>. I installed it on a Raspberry\u00a0Pi I had lying around and used that for quite a while, until I became inactive and shut the thing down.</p>\n<p>Unfortunately I haven\u2019t been able to make it work again after that, so I was in need of something else. Meanwhile I got used to Textual again, and I kind of liked that, except that it disconnected every time my laptop went to sleep.</p>\n<h2>Ok, so, ZNC you said?</h2>\n<p>Yeah, enough history! Let\u2019s get to it. ZNC is an IRC bouncer, which connects to IRC for you. When you connect to ZNC, ZNC will give you all the messages it received since you where away. So accedentally closing your laptop? No worries, just open it and you receive all messages again.</p>\n<p>You still need some computer to be online all the time, but I had that same Raspberry\u00a0Pi (first edition model B), and it\u2019s perfect for this job.</p>\n<p>I first followed the installation instructions <a href=\"http://wiki.znc.in/Installation#Source_Tarball\">here</a>, first downloading the <a href=\"https://znc.in/releases/\">latest</a> source tarball, and following the unpacking and configuring described on that page. Later on, I had to use a different flag on configure, so I added that one here for you. I used the following commands in order:</p>\n<pre><code>wget https://znc.in/releases/znc-1.6.5.tar.gz\ntar -xzvf znc-1.6.5.tar.gz\ncd znc-1.6.5\n./configure --enable-python\nmake\nsudo make install</code></pre>\n<p>This all takes a while, especially the <code>make</code> part.</p>\n<p>I then made sure I opened a port on my router towards my RPi, so I could access it from outside my home-network, when I\u2019m on the go (look for the NAT settings in your router).</p>\n<h2>Extra modules</h2>\n<p>Then for extra modules. The webadmin was on, so I could just go to my home-IP + my new port, let\u2019s say <code>https://192.0.2.0:8000</code>. I had SSL enabled and bad certificates, so you might need to trick your browser into accepting them. In the global modules, I enabled <code>chansaver</code>, <code>lastseen</code> and <code>log</code>. I also had <code>notify_connect</code>, but it felt too noisy for me. Don\u2019t forget to hit the \u2018save\u2019 button.</p>\n<p>In \u2018Your Settings\u2019 I have <code>chansaver</code> and <code>controlpanel</code> on, I believe by default.</p>\n<p>For other module configuration I connected to ZNC using Textual. When you add it, you can give it a connection name (this is for yourself). The server address is your home IP, and the port the outside port you put in your router. The server password is the one you put in ZNC in the <code>./configure</code> step. But then comes the part where I was puzzled: go from the \u2018General\u2019 to the \u2018Identity\u2019 view, and add your Freenode IRC nickname as \u2018Nickname\u2019, but your ZNC username as Username. I used <code>sebsel@Mac/freenode</code>, to identify it later. The personal password is for the NickServ password on Freenode.</p>\n<p>After connecting I did <code>/msg *simple_away SetTimer 0</code>, because I want to be set to away the moment all my devices are disconnected from ZNC.</p>\n<p>Because I want to have Textual on my Mac, and this new-found <a href=\"https://www.mutterirc.com/\">Mutter</a> on my iPhone, I have to get ZNC to manage multiple clients. By default, ZNC sees you have read your messages on your iPhone, so it does not send it to your Mac. To keep track of multiple clients, you need the ClientBuffer module.</p>\n<p>Since I still had the source, I could just compile the module. So I did:</p>\n<pre><code>cd ~/znc-1.6.5/modules/\nwget https://github.com/jpnurmi/znc-clientbuffer/blob/master/clientbuffer.cpp\ncd ~/znc-1.6.5/\nmake\nsudo make install</code></pre>\n<p>After that, I got back to Textual, and did <code>/msg *status LoadMod clientbuffer</code>. After that, you can <code>/msg *clientbuffer help</code> and send *clientbuffer some commands as messages. I did <code>AddClient Mac</code> and <code>AddClient iPhone</code>. You can do a <code>ListClients</code> too to see what you got.</p>\n<h2>Adding Mutter to the game</h2>\n<p>On the iPhone app Mutter, I added a network with again my home IP as the server, my nickname <code>sebsel</code> and under Advanced use the port I opened, added the password of ZNC in the first password field. The \u2018username\u2019 under Advanced gets the username for ZNC, so I made it <code>sebsel@iPhone/freenode</code>, to let Clientbuffer identify it as my iPhone. If you have <code>notify_connect</code> on you will see that *status notifies you about logging in with your iPhone.</p>\n<p><strong>Warning: I didn\u2019t get this next part to work</strong></p>\n<p>Next I saw that there is an option to receive notifications from ZNC to your iPhone via Mutter. You will need their <a href=\"https://bitbucket.org/jmclough/mutter-push/overview\">mutter-push</a> module for that, and that requires ModPython, so that\u2019s why I added the flag <code>--enable-python</code> during the first make.</p>\n<p>As their explanation says, first grab the mutter package, then make sure you got the right python libs, and then move <code>mutter.py</code> to <code>~/.znc/modules/</code>.</p>\n<pre><code>cd ~\nwget https://bitbucket.org/jmclough/mutter-push/get/master.zip\nunzip -d mutter -j master.zip\ncd mutter\nsudo apt-get install python3-pip\nsudo pip3 install requests\ncp mutter.py ~/.znc/modules/</code></pre>\n<p>In IRC, make sure to <code>/znc loadmod modpython</code> and then <code>/znc loadmod mutter</code> (or send a message to *status with <code>loadmod modpython</code> etc.).</p>\n<p><em>This last part of getting notifications is still not working for me. I still wanted to post this though, because all the other things work. Hope I\u2019ll get back to notifications soon, when I do get them to work.</em></p>" }, "post-type": "article", "_id": "1367159", "_source": "1366", "_is_read": true }
{ "type": "entry", "published": "2017-06-20T18:49:37+0000", "url": "https://seblog.nl/2017/06/20/1/daily-and-monthly-overviews", "category": [ "indieweb" ], "name": "Daily and monthly overviews", "content": { "text": "This weekend I worked on some things on Seblog, and since I did some productive work on other projects today, I feel like I can write a blogpost about it without sounding so procrastinating.\nInspired by Aaron Parecki's monthly overviews, and triggered by Martijn van der Ven, who was looking for the same type of page on my site, I started to 'deconstruct' my URLs. You can now remove parts of it and still get useful pages. That was on my list of itches since november 2015 now.\nSo let me explain my URL design first. This post, for example, is /2017/06/20/1/daily-and-monthly-overviews. This is an idea I got from the wiki, and probably also originates with Aaron. The identifying part of it is the date, followed by an ID (the nth post of that day). The slug is just for humans and can be omitted: you will get redirected to the right one. Some posts don't even have one. This allows for a Whistle-style URL shortener which I run at 5eb.nl. (This post can be found through 5eb.nl/4ox1.)\nThe first step was to remove the ID, to get to a day view. I just list all the posts that are created on that day, including private posts when I'm logged in, but oldest-first instead of the newest-first order of my feeds. I also display a summary of the day in icons at the top. I'm really pleased with how it turned out!\nAfter that, I also wanted the monthly view, to get a better overview. I'm really pleased with that too, it's nice to go through my old posts this way, seeing old memories. I'm now more interested in importing my Facebook posts too. I am still looking for a way to have some anchor or summary of the day in my monthly view, to find posts quicker, and adding a location like Aaron might do the trick, but I'll have to figure out how to do that still :)\nI'm quite happy with this for now!", "html": "<p>This weekend I worked on some things on Seblog, and since I did some productive work on other projects today, I feel like I can write a blogpost about it without sounding so procrastinating.</p>\n<p>Inspired by <a href=\"https://aaronparecki.com/\">Aaron Parecki</a>'s <a href=\"https://aaronparecki.com/2017/06\">monthly overviews</a>, and triggered by <a href=\"http://vanderven.se/martijn/\">Martijn van der Ven</a>, who was looking for the same type of page on my site, I started to 'deconstruct' my URLs. You can now remove parts of it and still get useful pages. That was on my list of itches since november 2015 now.</p>\n<p>So let me explain my URL design first. This post, for example, is <code>/2017/06/20/1/daily-and-monthly-overviews</code>. This is an idea I got from <a href=\"https://indieweb.org/URL_design#Ordinal\">the wiki</a>, and probably also originates with Aaron. The identifying part of it is the date, followed by an ID (the <code>n</code>th post of that day). The slug is just for humans and can be omitted: you will get redirected to the right one. Some posts don't even have one. This allows for a <a href=\"http://tantek.pbworks.com/w/page/21743973/Whistle\">Whistle</a>-style URL shortener which I run at <code>5eb.nl</code>. (This post can be found through <code>5eb.nl/4ox1</code>.)</p>\n<p>The first step was to remove the ID, to get to a day view. I just list all the posts that are created on that day, including private posts when I'm logged in, but oldest-first instead of the newest-first order of my feeds. I also display a summary of the day in icons at the top. I'm really pleased with how it turned out!</p>\n<img src=\"https://aperture-proxy.p3k.io/262d2f21cbb6dd6daa4f4afefb66983d9dc29ab8/68747470733a2f2f7365626c6f672e6e6c2f636f6e74656e742f323031372f3137312f3138343933372d312f6461696c792e6a7067\" alt=\"\" /><p>After that, I also wanted the monthly view, to get a better overview. I'm really pleased with that too, it's nice to go through my old posts this way, seeing old memories. I'm now more interested in importing my Facebook posts too. I am still looking for a way to have some anchor or summary of the day in my monthly view, to find posts quicker, and adding a location like Aaron might do the trick, but I'll have to figure out how to do that still :)</p>\n<img src=\"https://aperture-proxy.p3k.io/c5fbeb3a78d99eb6c4f15963a715112a9d9a3a7d/68747470733a2f2f7365626c6f672e6e6c2f636f6e74656e742f323031372f3137312f3138343933372d312f6d6f6e74686c792e6a7067\" alt=\"\" /><p>I'm quite happy with this for now!</p>" }, "post-type": "article", "_id": "1367160", "_source": "1366", "_is_read": true }
{ "type": "entry", "published": "2017-06-14T16:49:29+0000", "url": "https://seblog.nl/2017/06/14/6/at-mentioning-people", "category": [ "indieweb" ], "syndication": [ "https://news.indieweb.org/en/seblog.nl/2017/06/14/6/at-mentioning-people" ], "name": "@-mentioning people on my blog", "content": { "text": "The past week I mentioned both Martijn and the Twitter-account of the Dutch Railways (@NS_online) in different blogposts. For Martijn, I used a hand-written link with the proper .u-category.h-card classes to person-tag him. [see update below] For @NS_online, I wanted to @-mention them in the POSSE'd tweet. Martijn complained that my blog didn't autolink them, so that's what I fixed now.\nI have a new syntax to @-mention (and thus tag) people in my blogposts.\nI want to match names like @name\n\nI don't want to match the word @-mention itself.\nI want to be able to escape the @-mention with a \\, like \\@name, so I can talk about @-mentions in a blogposts (this one, actually, I like meta-meta-meta).\nThen the syntax. Obviously I use an @-symbol, with a name behind it. I then check the name for the following:\nIs the name on my list of names? Then use the URL I provided.\nDoes the name contain a dot? Then assume it's a domain / URL itself, so add replace @ with http:// (@seblog.nl becomes <a href=\"https://seblog.nl/\">Sebastiaan Andeweg</a>)\nAnd if it doesn't contain a dot, assume it's a Twitter account.\nI then fetch the h-card (or profile information) from the resulting URL, and use the name that's there.\nThere are times, however, where I want to specify the name. In the example at the beginning of this post, I called Martijn 'Martijn', not 'Martijn van der Ven', which is on is h-card. Sometimes a full name makes no sense. So I can add the name I want to use in brackets behind the tag (@Zegnat[Martijn]). This way I have total control over my text (and possible conjugations if I start writing in a language that needs those, not that I speak one).\nThen it all comes down to the following syntax:\n@namefromcache > the URL I specified\n@someone.com > that URL\n@facebook.com/someone > also the literal URL\n@twitteruser > their Twitter profile URL\n@someone[This Person] > my own name for them\n\\@someone > escaped tag\nI now need to redo my automated webmention-sending, for it does not yet recognise these tags. Manual sending works fine!\nEdit: after some discussion during the Virtual HWC EU-time, I realised that just doing @someone is not really person-tagging them. Person tagging is explicitly saying \"I am now with this person\", which makes sense for photos and checkins, but not always in blogposts.\nI added a minor tweak: I can now use + instead of @ to really person-tag someone. The @ is used for just a mention, the +-mention will receive the class=\"u-category h-card\" markup. I don't know how much I will be using that, but I have that option now.", "html": "<p>The past week I mentioned both <a href=\"http://vanderven.se/martijn/\">Martijn</a> and the Twitter-account of the Dutch Railways (<a href=\"http://twitter.com/NS_online\">@NS_online</a>) in different blogposts. For Martijn, I used a hand-written link with the proper <code>.u-category.h-card</code> classes to <a href=\"https://indieweb.org/person-tag\">person-tag</a> him. [<em>see update below</em>] For @NS_online, I wanted to @-mention them in the POSSE'd tweet. Martijn complained that my blog didn't autolink them, so that's what I fixed now.</p>\n<p>I have a new syntax to @-mention (and thus tag) people in my blogposts.</p>\n<ul><li>I want to match names like <code>@name</code>\n</li>\n<li>I don't want to match the word @-mention itself.</li>\n<li>I want to be able to escape the @-mention with a <code>\\</code>, like <code>\\@name</code>, so I can talk about @-mentions in a blogposts (this one, actually, I like meta-meta-meta).</li>\n</ul><p>Then the syntax. Obviously I use an @-symbol, with a name behind it. I then check the name for the following:</p>\n<ul><li>Is the name on my list of names? Then use the URL I provided.</li>\n<li>Does the name contain a dot? Then assume it's a domain / URL itself, so add replace <code>@</code> with <code>http://</code> (<code>@seblog.nl</code> becomes <code><a href=\"https://seblog.nl/\">Sebastiaan Andeweg</a></code>)</li>\n<li>And if it doesn't contain a dot, assume it's a Twitter account.</li>\n</ul><p>I then fetch the h-card (or profile information) from the resulting URL, and use the name that's there.</p>\n<p>There are times, however, where I want to specify the name. In the example at the beginning of this post, I called Martijn 'Martijn', not 'Martijn van der Ven', which is on is h-card. Sometimes a full name makes no sense. So I can add the name I want to use in brackets behind the tag (<code>@Zegnat[Martijn]</code>). This way I have total control over my text (and possible conjugations if I start writing in a language that needs those, not that I speak one).</p>\n<p>Then it all comes down to the following syntax:</p>\n<pre><code>@namefromcache > the URL I specified\n@someone.com > that URL\n@facebook.com/someone > also the literal URL\n@twitteruser > their Twitter profile URL\n@someone[This Person] > my own name for them\n\\@someone > escaped tag</code></pre>\n<p>I now need to redo my automated webmention-sending, for it does not yet recognise these tags. Manual sending works fine!</p>\n<p><strong>Edit</strong>: after some discussion during the <a href=\"https://indieweb.org/events/2017-06-14-homebrew-website-club\">Virtual HWC EU-time</a>, I realised that just doing <code>@someone</code> is not really <a href=\"https://indieweb.org/person-tag\">person-tagging</a> them. Person tagging is explicitly saying \"I am now with this person\", which makes sense for photos and checkins, but not always in blogposts.</p>\n<p>I added a minor tweak: I can now use <code>+</code> instead of <code>@</code> to really person-tag someone. The <code>@</code> is used for just a mention, the <code>+</code>-mention will receive the <code>class=\"u-category h-card\"</code> markup. I don't know how much I will be using that, but I have that option now.</p>" }, "post-type": "article", "_id": "1367161", "_source": "1366", "_is_read": true }
So I'm keeping this as a fairly general, high level topic.
I'm a member of the W3C Social Web Working Group and the Social Web Incubator Community Group. And there are a number of specs the Working Group has come out with. There are various bits an pieces that can be used separately but I figured it would be good to give some background on them and some of the discussion that is happening. Would love feedback.
First off, the specs from the Working Group.
ActivityStreams 2 https://w3.org/TR/activitystreams-core/
This is essentially a way of expressing activities that happened as a JSON feed. It covers just about anything you could want and has an extension mechanism to allow for custom things outside of it. Currently it doesn't have a lot of usage, but there is certainly interest in it.
Webmention https://w3.org/TR/webmention/ A much simpler version of linkback, its essentially a method to just notify a specific URL that you have an update for it. Usually this is for letting URLs know of a reply to them. Currently used by indieweb, Known, Micro.blog, and a handful of other implementations. It also has a Salmention extension that is effectively a much simpler implementation of the salmon protocol
Micropub https://w3.org/TR/micropub/ This is a client to server API, Again, heavily used in the indieweb and some others. It uses microformats vocabulary to post and optionally update and delete, posts.
ActivityPub https://w3.org/TR/activitypub/ This is a new spec developed within the working group and getting heavily reviewed within the community group now which does include several projects. It has two parts, both a client to server and server to server part.
WebSub https://w3.org/TR/websub/ This is a cleaned up version of PubSubHubbub 0.4. PuSH was never specified under the W3C so it has been an effort to not break any existing PuSH 0.4 implementation but still provide some clearer specification to it. Mastodon should already be compliant.
Outside of the WG, there are other parts
Microformats http://microformats.org/wiki/microformats2 this is sort of the counterpart to ActivityStreams. It involves adding classes to the displayed content on the page, so you don't repeat yourself. This is already in place on every mastodon post and is on Friendica, Hubzilla, pump.io, gnu social, Known, micro.blog, and the growing list of indieweb implementations. Pretty much everyone except diaspora.
Webfinger this is what sort of led me here today as it seems to be the first place to work on future endeavors. As I understand it there were some issues with needing to rate limit the webfinger endpoint, and many dislike the amount of indirection needed for it. The biggest issue has been getting this to work for the other half of the social world that doesn't use acct:// for user identities. The indieweb uses just URLs for identitiy. So aaron.pk or ben.thatmustbe.me. One option is to add some fake bit to the beginning, like aaronpk@aaron.pk, or ben.thatmustbe.me@ben.thatmustbe.me. Gets pretty redundant. And then the issue is that a person has two different ways to refer to them, if you telling someone using Known how to refer to you, it has to be your URL, if its someone on Mastodon, its another way. The other issue is that some people don't even have access to the .well-known folder on their server. This can be a huge limitation for them sadly.
So I was hoping to start here. Can everyone give some general feedback of webfinger.
Does it do everything you need?
Why did you have to rate limit it?
Are there any problems you have with it?
Do you have any ideas on alternative ways this could work? For example, I could see being able to look up users by either @user@domain.com, @domain.com (if its a single user domain, or @domain.com/user, etc. Then as long as the account is fetched in the same way (either parsing out the microformats from that page, or use content negotiation to get an alternative formats), you would be good to go.
Sorry for the long post, just wanted to get anyone who cares up to speed.
Originally Posted at https://discourse.joinmastodon.org/t/federation-with-social-web-in-general/352
{ "type": "entry", "published": "2017-06-06T23:01:29-0400", "url": "https://ben.thatmustbe.me/article/2017/6/7/1/", "content": { "text": "So I'm keeping this as a fairly general, high level topic.\n\nI'm a member of the W3C Social Web Working Group and the Social Web Incubator Community Group. And there are a number of specs the Working Group has come out with. There are various bits an pieces that can be used separately but I figured it would be good to give some background on them and some of the discussion that is happening. Would love feedback.\n\nFirst off, the specs from the Working Group.\n\nActivityStreams 2 https://w3.org/TR/activitystreams-core/\n\nThis is essentially a way of expressing activities that happened as a JSON feed. It covers just about anything you could want and has an extension mechanism to allow for custom things outside of it. Currently it doesn't have a lot of usage, but there is certainly interest in it.\n\nWebmention https://w3.org/TR/webmention/ A much simpler version of linkback, its essentially a method to just notify a specific URL that you have an update for it. Usually this is for letting URLs know of a reply to them. Currently used by indieweb, Known, Micro.blog, and a handful of other implementations. It also has a Salmention extension that is effectively a much simpler implementation of the salmon protocol\n\nMicropub https://w3.org/TR/micropub/ This is a client to server API, Again, heavily used in the indieweb and some others. It uses microformats vocabulary to post and optionally update and delete, posts.\n\nActivityPub https://w3.org/TR/activitypub/ This is a new spec developed within the working group and getting heavily reviewed within the community group now which does include several projects. It has two parts, both a client to server and server to server part.\n\nWebSub https://w3.org/TR/websub/ This is a cleaned up version of PubSubHubbub 0.4. PuSH was never specified under the W3C so it has been an effort to not break any existing PuSH 0.4 implementation but still provide some clearer specification to it. Mastodon should already be compliant.\n\nOutside of the WG, there are other parts\nMicroformats http://microformats.org/wiki/microformats2 this is sort of the counterpart to ActivityStreams. It involves adding classes to the displayed content on the page, so you don't repeat yourself. This is already in place on every mastodon post and is on Friendica, Hubzilla, pump.io, gnu social, Known, micro.blog, and the growing list of indieweb implementations. Pretty much everyone except diaspora.\n\nWebfinger this is what sort of led me here today as it seems to be the first place to work on future endeavors. As I understand it there were some issues with needing to rate limit the webfinger endpoint, and many dislike the amount of indirection needed for it. The biggest issue has been getting this to work for the other half of the social world that doesn't use acct:// for user identities. The indieweb uses just URLs for identitiy. So aaron.pk or ben.thatmustbe.me. One option is to add some fake bit to the beginning, like aaronpk@aaron.pk, or ben.thatmustbe.me@ben.thatmustbe.me. Gets pretty redundant. And then the issue is that a person has two different ways to refer to them, if you telling someone using Known how to refer to you, it has to be your URL, if its someone on Mastodon, its another way. The other issue is that some people don't even have access to the .well-known folder on their server. This can be a huge limitation for them sadly.\n\nSo I was hoping to start here. Can everyone give some general feedback of webfinger.\n\n\n\tDoes it do everything you need?\n\t\n\t\n\tWhy did you have to rate limit it?\n\t\n\t\n\tAre there any problems you have with it?\n\t\n\t\n\tDo you have any ideas on alternative ways this could work? For example, I could see being able to look up users by either @user@domain.com, @domain.com (if its a single user domain, or @domain.com/user, etc. Then as long as the account is fetched in the same way (either parsing out the microformats from that page, or use content negotiation to get an alternative formats), you would be good to go.\n\t\nSorry for the long post, just wanted to get anyone who cares up to speed.\n\nOriginally Posted at https://discourse.joinmastodon.org/t/federation-with-social-web-in-general/352", "html": "<p>So I'm keeping this as a fairly general, high level topic.</p>\n\n<p>I'm a member of the W3C Social Web Working Group and the Social Web Incubator Community Group. And there are a number of specs the Working Group has come out with. There are various bits an pieces that can be used separately but I figured it would be good to give some background on them and some of the discussion that is happening. Would love feedback.</p>\n\n<p>First off, the specs from the Working Group.</p>\n\n<p><strong>ActivityStreams 2</strong> <a href=\"https://w3.org/TR/activitystreams-core/\">https://w3.org/TR/activitystreams-core/</a><br />\nThis is essentially a way of expressing activities that happened as a JSON feed. It covers just about anything you could want and has an extension mechanism to allow for custom things outside of it. Currently it doesn't have a lot of usage, but there is certainly interest in it.</p>\n\n<p><strong>Webmention</strong> <a href=\"https://w3.org/TR/webmention/\">https://w3.org/TR/webmention/</a> A much simpler version of linkback, its essentially a method to just notify a specific URL that you have an update for it. Usually this is for letting URLs know of a reply to them. Currently used by indieweb, Known, Micro.blog, and a handful of other implementations. It also has a Salmention extension that is effectively a much simpler implementation of the salmon protocol</p>\n\n<p><strong>Micropub</strong> <a href=\"https://w3.org/TR/micropub/\">https://w3.org/TR/micropub/</a> This is a client to server API, Again, heavily used in the indieweb and some others. It uses microformats vocabulary to post and optionally update and delete, posts.</p>\n\n<p><strong>ActivityPub</strong> <a href=\"https://w3.org/TR/activitypub/\">https://w3.org/TR/activitypub/</a> This is a new spec developed within the working group and getting heavily reviewed within the community group now which does include several projects. It has two parts, both a client to server and server to server part.</p>\n\n<p><strong>WebSub</strong> <a href=\"https://w3.org/TR/websub/\">https://w3.org/TR/websub/</a> This is a cleaned up version of PubSubHubbub 0.4. PuSH was never specified under the W3C so it has been an effort to not break any existing PuSH 0.4 implementation but still provide some clearer specification to it. Mastodon should already be compliant.</p>\n\n<p>Outside of the WG, there are other parts<br /><strong>Microformats</strong> <a href=\"http://microformats.org/wiki/microformats2\">http://microformats.org/wiki/microformats2</a> this is sort of the counterpart to ActivityStreams. It involves adding classes to the displayed content on the page, so you don't repeat yourself. This is already in place on every mastodon post and is on Friendica, Hubzilla, pump.io, gnu social, Known, micro.blog, and the growing list of indieweb implementations. Pretty much everyone except diaspora.</p>\n\n<p><strong>Webfinger</strong> this is what sort of led me here today as it seems to be the first place to work on future endeavors. As I understand it there were some issues with needing to rate limit the webfinger endpoint, and many dislike the amount of indirection needed for it. The biggest issue has been getting this to work for the other half of the social world that doesn't use acct:// for user identities. The indieweb uses just URLs for identitiy. So aaron.pk or ben.thatmustbe.me. One option is to add some fake bit to the beginning, like aaronpk@aaron.pk, or ben.thatmustbe.me@ben.thatmustbe.me. Gets pretty redundant. And then the issue is that a person has two different ways to refer to them, if you telling someone using Known how to refer to you, it has to be your URL, if its someone on Mastodon, its another way. The other issue is that some people don't even have access to the .well-known folder on their server. This can be a huge limitation for them sadly.</p>\n\n<p>So I was hoping to start here. Can everyone give some general feedback of webfinger.</p>\n\n<ul><li>\n\t<p>Does it do everything you need?</p>\n\t</li>\n\t<li>\n\t<p>Why did you have to rate limit it?</p>\n\t</li>\n\t<li>\n\t<p>Are there any problems you have with it?</p>\n\t</li>\n\t<li>\n\t<p>Do you have any ideas on alternative ways this could work? For example, I could see being able to look up users by either @user@domain.com, @domain.com (if its a single user domain, or @domain.com/user, etc. Then as long as the account is fetched in the same way (either parsing out the microformats from that page, or use content negotiation to get an alternative formats), you would be good to go.</p>\n\t</li>\n</ul><p>Sorry for the long post, just wanted to get anyone who cares up to speed.</p>\n\n<p>Originally Posted at <a href=\"https://discourse.joinmastodon.org/t/federation-with-social-web-in-general/352\">https://discourse.joinmastodon.org/t/federation-with-social-web-in-general/352</a></p>" }, "_id": "81", "_source": "9", "_is_read": true }