{ "type": "entry", "author": { "name": "manton", "url": "http://www.manton.org", "photo": null }, "url": "http://www.manton.org/2017/11/indiewebcamp-austin-set-for-december.html", "name": "IndieWebCamp Austin set for December", "content": { "html": "<p>We\u2019re holding an IndieWebCamp in Austin next month! This is a 2-day event \u2014 Saturday and Sunday, December 9th and 10th \u2014 for anyone who wants to learn more about the IndieWeb, discuss web standards and tools, or just hack on your own web site. We\u2019re lucky to have IndieWeb co-founders Tantek \u00c7elik and Aaron Parecki in town for the event.</p>\n<p>There was another IndieWebCamp in Berlin last week. <a href=\"https://doubleloop.net/2017/11/11/indiewebcamp-berlin-2017-day-1/\">Neil Mather had a great blog post</a> about his experience there:</p>\n<blockquote><p>\n It ran over 2 days, with day 1 an unconference with a number of discussions, the topics and schedule decided entirely by participants in the morning. Day 2 was hack day, with everyone working on an indieweb related bit of work, be it on their own website or on a shared project.\n</p></blockquote>\n<p>IndieWebCamp Austin <a href=\"https://2017.indieweb.org/austin\">registration is open now</a>. Tickets are just $5. Looking forward to planning some next steps for Micro.blog over that weekend. Hope to see you there!</p>", "text": "We’re holding an IndieWebCamp in Austin next month! This is a 2-day event \u2014 Saturday and Sunday, December 9th and 10th \u2014 for anyone who wants to learn more about the IndieWeb, discuss web standards and tools, or just hack on your own web site. We’re lucky to have IndieWeb co-founders Tantek \u00c7elik and Aaron Parecki in town for the event.\nThere was another IndieWebCamp in Berlin last week. Neil Mather had a great blog post about his experience there:\n\n It ran over 2 days, with day 1 an unconference with a number of discussions, the topics and schedule decided entirely by participants in the morning. Day 2 was hack day, with everyone working on an indieweb related bit of work, be it on their own website or on a shared project.\n\nIndieWebCamp Austin registration is open now. Tickets are just $5. Looking forward to planning some next steps for Micro.blog over that weekend. Hope to see you there!" }, "published": "2017-11-16T15:28:43+00:00", "updated": "2017-11-16T15:28:43+00:00", "_id": "147", "_source": "12", "_is_read": true }
Minor update to Micro.blog for iOS is now available in the App Store. Fixes posting via the Micropub API, plus a couple more iPhone X tweaks.
{ "type": "entry", "author": { "name": "manton", "url": "http://www.manton.org", "photo": null }, "url": "http://www.manton.org/2017/11/6027.html", "content": { "html": "<p>Minor update to Micro.blog for iOS is now available in the App Store. Fixes posting via the Micropub API, plus a couple more iPhone X tweaks.</p>", "text": "Minor update to Micro.blog for iOS is now available in the App Store. Fixes posting via the Micropub API, plus a couple more iPhone X tweaks." }, "published": "2017-11-16T05:50:55+00:00", "updated": "2017-11-16T05:50:55+00:00", "_id": "145", "_source": "12", "_is_read": true }
{ "type": "entry", "author": { "name": null, "url": "https://strugee.net/blog/", "photo": null }, "url": "https://strugee.net/blog/2017/11/not-going-to-todays-hwc-san-fransisco-2017", "published": "2017-11-15T14:43:16+00:00", "content": { "html": "<p>Testing whether my new Webmention implementation, <a href=\"https://github.com/strugee/lazymention\">lazymention</a> (which will ship Real Soon Now\u2122), will send a Webmention to note that I will NOT be attending today's <a href=\"http://tantek.com/2017/319/e1/homebrew-website-club\">Homebrew Website Club San Francisco</a>! Though let's be honest, I really want to.</p>\n<p>(With <3 for <a href=\"https://chat.indieweb.org/social/2017-11-15#t1510774596509000\">Tantek</a>)</p>", "text": "Testing whether my new Webmention implementation, lazymention (which will ship Real Soon Now\u2122), will send a Webmention to note that I will NOT be attending today's Homebrew Website Club San Francisco! Though let's be honest, I really want to.\n(With <3 for Tantek)" }, "name": "Not going to today's HWC San Francisco", "_id": "123845", "_source": "227", "_is_read": true }
Had a great time at Refresh Austin tonight. Good to hear what other people are up to, and share a little about what’s going on with Micro.blog and the upcoming IndieWebCamp Austin.
{ "type": "entry", "author": { "name": "manton", "url": "http://www.manton.org", "photo": null }, "url": "http://www.manton.org/2017/11/6022.html", "content": { "html": "<p>Had a great time at Refresh Austin tonight. Good to hear what other people are up to, and share a little about what\u2019s going on with Micro.blog and the upcoming IndieWebCamp Austin.</p>", "text": "Had a great time at Refresh Austin tonight. Good to hear what other people are up to, and share a little about what’s going on with Micro.blog and the upcoming IndieWebCamp Austin." }, "published": "2017-11-15T04:57:10+00:00", "updated": "2017-11-15T04:57:10+00:00", "_id": "126", "_source": "12", "_is_read": true }
Great to see new apps for posting to Micro.blog and IndieWeb-enabled sites. Here’s some info for the Indigenous iOS app beta.
{ "type": "entry", "author": { "name": "manton", "url": "http://www.manton.org", "photo": null }, "url": "http://www.manton.org/2017/11/6010.html", "content": { "html": "<p>Great to see new apps for posting to Micro.blog and IndieWeb-enabled sites. <a href=\"https://eddiehinkle.com/2017/11/10/5/article/\">Here\u2019s some info</a> for the Indigenous iOS app beta.</p>", "text": "Great to see new apps for posting to Micro.blog and IndieWeb-enabled sites. Here’s some info for the Indigenous iOS app beta." }, "published": "2017-11-13T19:24:28+00:00", "updated": "2017-11-13T19:24:28+00:00", "_id": "131", "_source": "12", "_is_read": true }
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 }