I remotely attended IndieWebCamp Dusseldorf.
{
"type": "entry",
"published": "2019-05-12T23:28:17-04:00",
"rsvp": "yes",
"url": "https://david.shanske.com/2019/05/12/2816/",
"in-reply-to": [
"https://indieweb.org/2019/D%C3%BCsseldorf"
],
"content": {
"text": "I remotely attended IndieWebCamp Dusseldorf."
},
"author": {
"type": "card",
"name": "David Shanske",
"url": "https://david.shanske.com/",
"photo": "https://david.shanske.com/wp-content/uploads/avatar-privacy/cache/gravatar/2/c/2cb1f8afd9c8d3b646b4071c5ed887c970d81d625eeed87e447706940e2c403d-49.png"
},
"post-type": "rsvp",
"_id": "3428543",
"_source": "1905"
}

Moved my reader actions inline... previously clicking an action in the reader would scroll to the top of the page, because that's where the editor was. It would helpfully scroll you back once the interaction was complete, but it was a bit clunky. :-)
{
"type": "entry",
"published": "2019-05-13T12:35:22+10:00",
"url": "https://unicyclic.com/mal/2019-05-13-_Moved_my_reader_actions_inline_previously_cli-2",
"content": {
"text": "Moved my reader actions inline... previously clicking an action in the reader would scroll to the top of the page, because that's where the editor was. It would helpfully scroll you back once the interaction was complete, but it was a bit clunky. :-)",
"html": "<img alt=\"\" src=\"https://aperture-proxy.p3k.io/2bb855bd0405713fa6b487f148f909750429c91a/68747470733a2f2f756e696379636c69632e636f6d2f6d616c2f7075626c69632f7265616465722d616374696f6e732e706e67\" /><br />\nMoved my reader actions inline... previously clicking an action in the reader would scroll to the top of the page, because that's where the editor was. It would helpfully scroll you back once the interaction was complete, but it was a bit clunky. :-)"
},
"author": {
"type": "card",
"name": "Malcolm Blaney",
"url": "https://unicyclic.com/mal",
"photo": "https://aperture-proxy.p3k.io/4f46272c0027449ced0d7cf8de31ea1bec37210e/68747470733a2f2f756e696379636c69632e636f6d2f6d616c2f7075626c69632f70726f66696c655f736d616c6c5f7468756d622e706e67"
},
"post-type": "note",
"_id": "3429353",
"_source": "243"
}
For quite some time there’s been a lot of fan speculation that Lars is AFAB and trans, with quite a lot of compelling evidence to that effect. It’s a thing I absolutely believe and I keep on hoping for confirmation in-show.
So, the Very Trans Narrative ending of Season 5 could lead to a future episode (or the upcoming movie) to finally answer this.
Here’s how I think it might happen.
{
"type": "entry",
"published": "2019-05-12T19:23:16-07:00",
"summary": "For quite some time there\u2019s been a lot of fan speculation that Lars is AFAB and trans, with quite a lot of compelling evidence to that effect. It\u2019s a thing I absolutely believe and I keep on hoping for confirmation in-show.\nSo, the Very Trans Narrative ending of Season 5 could lead to a future episode (or the upcoming movie) to finally answer this.\nHere\u2019s how I think it might happen.",
"url": "https://beesbuzz.biz/blog/366-An-imagined-scene-from-the-future-of-Steven-Universe",
"name": "An imagined scene from the future of Steven Universe",
"author": {
"type": "card",
"name": "fluffy",
"url": "https://beesbuzz.biz/",
"photo": "https://aperture-proxy.p3k.io/67f0e159262fa91b1915cde9588795b89a61ec8f/68747470733a2f2f6265657362757a7a2e62697a2f7374617469632f6865616473686f742e6a7067"
},
"post-type": "article",
"_id": "3903094",
"_source": "2778"
}
I've written a very hacky #Mycroft #REST webhook to run on a Mycroft box and allow you to integrate other apps with it. It's far from done, and it's super hacky at the moment, but it's working. I use it for some custom #HomeAssistant integrations & have a few other plans for it. It's available on #GitHub.
https://github.com/ketudb/mycroft-webhook-inbound
{
"type": "entry",
"published": "2019-05-13T01:12:49+00:00",
"url": "https://caffeinewitch.tech/2019/05/ive-written-a-very-hacky-mycroft-rest-webhook-to-run",
"category": [
"Mycroft",
"REST",
"HomeAssistant",
"GitHub"
],
"syndication": [
"https://twitter.com/ketudb/status/1127743537741737986"
],
"content": {
"text": "I've written a very hacky #Mycroft #REST webhook to run on a Mycroft box and allow you to integrate other apps with it. It's far from done, and it's super hacky at the moment, but it's working. I use it for some custom #HomeAssistant integrations & have a few other plans for it. It's available on #GitHub.\n\nhttps://github.com/ketudb/mycroft-webhook-inbound",
"html": "I've written a very hacky <a href=\"https://caffeinewitch.tech/tag/Mycroft\" class=\"p-category\">#Mycroft</a> <a href=\"https://caffeinewitch.tech/tag/REST\" class=\"p-category\">#REST</a> webhook to run on a Mycroft box and allow you to integrate other apps with it. It's far from done, and it's super hacky at the moment, but it's working. I use it for some custom <a href=\"https://caffeinewitch.tech/tag/HomeAssistant\" class=\"p-category\">#HomeAssistant</a> integrations & have a few other plans for it. It's available on <a href=\"https://caffeinewitch.tech/tag/GitHub\" class=\"p-category\">#GitHub</a>.<br /><br /><a href=\"https://github.com/ketudb/mycroft-webhook-inbound\">https://github.com/ketudb/mycroft-webhook-inbound</a>"
},
"author": {
"type": "card",
"name": "Keturah",
"url": "https://caffeinewitch.tech/profile/ketudb",
"photo": "https://aperture-proxy.p3k.io/1f50a7f40a48b3b5360e7cba803d2474fe531f45/68747470733a2f2f6361666665696e6577697463682e746563682f66696c652f3531393262643461323534346539643831646638366364383965666233353833"
},
"post-type": "note",
"_id": "3903108",
"_source": "2779"
}
{
"type": "entry",
"published": "2019-05-13T00:49:06+02:00",
"url": "https://aaronparecki.com/2019/05/13/2/https",
"category": [
"indieweb",
"indieauth",
"security",
"https"
],
"name": "Better Default Security for IndieAuth Login Forms",
"content": {
"text": "Last year, I posted a JavaScript snippet that I've started using in all my projects that have an IndieAuth login form, which will automatically add the http scheme if you type a plain domain. This is particularly a problem because the iOS keyboard doesn't include the : character in URL mode.\n\nThe URL keyboard on iOS provides easy access to special characters used in URLs, except no colon!My solution last year was to automatically prepend http:// when a plain domain is entered. This works, but it would be nice if I could use https:// as the default. The problem is I can't assume everyone has https on their websites, and I don't want to have the flow error out when the site can't fetch your domain over https because it's only available on http.\n\nThe trick is that the frontend can tell the backend whether the https scheme was automatically entered or was user-entered. And then, the backend can attempt the https connection first, and if that fails, fall back to http, but only if\u00a0the https scheme was added automatically.\n\nThis provides the best of both worlds. If you explicitly enter https, then it will only\u00a0use the https URL. If you enter just a domain, then it tries https first, and only falls back to http if that fails due to an ssl error.\n\nThe revised code snippet is below. The change if you're using this code is that you have to explicitly opt in to this new behavior. The code attaches to all URL input fields, and then if it finds a corresponding field to add this toggle, it will switch to https by default instead of http, and add a \"1\" to your defined form field.\n\n<script>\n/* add https:// to URL fields on blur */\ndocument.addEventListener('DOMContentLoaded', function() {\n function addDefaultScheme(target) {\n var auto_scheme = false;\n var default_scheme = \"http\";\n var auto_scheme_field = document.querySelector(\"input[name=\"+target.getAttribute('name')+\"_auto_scheme]\");\n if(target.value.match(/^(?!https?:).+\\..+/)) {\n target.value = (auto_scheme_field ? \"https\" : \"http\")+\"://\"+target.value;\n if(auto_scheme_field) {\n auto_scheme_field.value = \"1\";\n }\n }\n }\n var elements = document.querySelectorAll(\"input[type=url]\");\n Array.prototype.forEach.call(elements, function(el, i){\n el.addEventListener(\"blur\", function(e){\n addDefaultScheme(e.target);\n });\n el.addEventListener(\"keydown\", function(e){\n if(e.keyCode == 13) {\n addDefaultScheme(e.target);\n }\n });\n });\n});\n</script>\n\n\nTo use this code with the auto-https upgrade feature, just create any url type input field in the page, and create a hidden input field with a name that is the same as the url field with _auto_scheme appended. The value \"1\" will be written to this field if this code adds the default scheme.\n\n<form action=\"/login\">\n <input type=\"url\" name=\"url\">\n\n <input type=\"text\" name=\"url_auto_scheme\">\n <input type=\"submit\" value=\"Log In\">\n</form>\n\n\nThen in your backend, begin the IndieAuth discovery using the url value as normal. If that step returns an SSL error, then check if url_auto_scheme is 1, and if it is, modify the input URL to switch to the http scheme and try the discovery step again.\n\nThat little bit of frontend JavaScript and backend logic provides a great balance between usability and security for websites that ask users to enter URLs!",
"html": "<p>Last year, I <a href=\"https://aaronparecki.com/2018/06/03/4/url-form-field\">posted a JavaScript snippet</a> that I've started using in all my projects that have an IndieAuth login form, which will automatically add the <code>http</code> scheme if you type a plain domain. This is particularly a problem because the iOS keyboard doesn't include the <code>:</code> character in URL mode.</p>\n\n<img src=\"https://aperture-media.p3k.io/aaronparecki.com/241cb2d5e5fbd7bba69fa10c7914cdf6cb8d28c48111332987c6fc03c2ed4643.png\" alt=\"\" />The URL keyboard on iOS provides easy access to special characters used in URLs, except no colon!<p>My solution last year was to automatically prepend <code>http://</code> when a plain domain is entered. This works, but it would be nice if I could use <code>https://</code> as the default. The problem is I can't assume everyone has https on their websites, and I don't want to have the flow error out when the site can't fetch your domain over https because it's only available on http.</p>\n\n<p>The trick is that the frontend can tell the backend whether the https scheme was automatically entered or was user-entered. And then, the backend can attempt the https connection first, and if that fails, fall back to http, but <i>only if</i>\u00a0the https scheme was added automatically.</p>\n\n<p>This provides the best of both worlds. If you explicitly enter https, then it will <i>only</i>\u00a0use the https URL. If you enter just a domain, then it tries https first, and only falls back to http if that fails due to an ssl error.</p>\n\n<p>The revised code snippet is below. The change if you're using this code is that you have to explicitly opt in to this new behavior. The code attaches to all URL input fields, and then if it finds a corresponding field to add this toggle, it will switch to https by default instead of http, and add a \"1\" to your defined form field.</p>\n\n<pre><code><script>\n/* add https:// to URL fields on blur */\ndocument.addEventListener('DOMContentLoaded', function() {\n function addDefaultScheme(target) {\n var auto_scheme = false;\n var default_scheme = \"http\";\n var auto_scheme_field = document.querySelector(\"input[name=\"+target.getAttribute('name')+\"_auto_scheme]\");\n if(target.value.match(/^(?!https?:).+\\..+/)) {\n target.value = (auto_scheme_field ? \"https\" : \"http\")+\"://\"+target.value;\n if(auto_scheme_field) {\n auto_scheme_field.value = \"1\";\n }\n }\n }\n var elements = document.querySelectorAll(\"input[type=url]\");\n Array.prototype.forEach.call(elements, function(el, i){\n el.addEventListener(\"blur\", function(e){\n addDefaultScheme(e.target);\n });\n el.addEventListener(\"keydown\", function(e){\n if(e.keyCode == 13) {\n addDefaultScheme(e.target);\n }\n });\n });\n});\n</script>\n</code></pre>\n\n<p>To use this code with the auto-https upgrade feature, just create any <code>url</code> type input field in the page, and create a <code>hidden</code> input field with a <code>name</code> that is the same as the url field with <code>_auto_scheme</code> appended. The value \"1\" will be written to this field if this code adds the default scheme.</p>\n\n<pre><code><form action=\"/login\">\n <input type=\"url\" name=\"url\"><br>\n <input type=\"text\" name=\"url_auto_scheme\">\n <input type=\"submit\" value=\"Log In\">\n</form>\n</code></pre>\n\n<p>Then in your backend, begin the IndieAuth discovery using the <code>url</code> value as normal. If that step returns an SSL error, then check if <code>url_auto_scheme</code> is <code>1</code>, and if it is, modify the input URL to switch to the <code>http</code> scheme and try the discovery step again.</p>\n\n<p>That little bit of frontend JavaScript and backend logic provides a great balance between usability and security for websites that ask users to enter URLs!</p>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"post-type": "article",
"_id": "3426246",
"_source": "16"
}
Post-IndieWebCamp hacking continues at the hotel bar! Made a few more minor improvements to Monocle:
• Defaults to "https" when you type in a domain, and if that fails, will fall back to http, rather than the other way around
• Added a logout button
• Added mobile screenshots to the wiki
• Updated the indieauth-client-php library to bubble up things like ssl errors so that apps using the library can report errors better
{
"type": "entry",
"published": "2019-05-12T23:43:01+02:00",
"url": "https://aaronparecki.com/2019/05/12/33/monocle",
"category": [
"indiewebcamp",
"indieweb",
"monocle"
],
"content": {
"text": "Post-IndieWebCamp hacking continues at the hotel bar! Made a few more minor improvements to Monocle: \n\n\u2022 Defaults to \"https\" when you type in a domain, and if that fails, will fall back to http, rather than the other way around \n\u2022 Added a logout button \n\u2022 Added mobile screenshots to the wiki \n\u2022 Updated the indieauth-client-php library to bubble up things like ssl errors so that apps using the library can report errors better",
"html": "Post-IndieWebCamp hacking continues at the hotel bar! Made a few more minor improvements to Monocle: <br /><br />\u2022 Defaults to \"https\" when you type in a domain, and if that fails, will fall back to http, rather than the other way around <br />\u2022 Added a logout button <br />\u2022 Added mobile screenshots to the wiki <br />\u2022 Updated the indieauth-client-php library to bubble up things like ssl errors so that apps using the library can report errors better"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"post-type": "note",
"_id": "3425203",
"_source": "16"
}
{
"type": "entry",
"published": "2019-05-12T19:22:57+02:00",
"url": "https://aaronparecki.com/2019/05/12/30/",
"category": [
"https://foursquare.com/user/13388566",
"https://adactio.com/",
"https://seblog.nl/"
],
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/b4a7f55973098fb6943e57c91881d2f4d0683709ad9ef6aa63c2a00e8dbd186c.jpg"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd85671f8cbd4002c4ea689"
],
"name": "at Wacom Europe GmbH",
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"checkin": {
"type": "card",
"name": "Wacom Europe GmbH",
"latitude": "51.215111",
"longitude": "6.760335",
"url": "https://foursquare.com/v/57d2c6c9498e281d04bb7e50"
},
"post-type": "checkin",
"_id": "3424217",
"_source": "16"
}
Post #IndieWebCamp drinks — with Jeremy, microformats, Seb
{
"type": "entry",
"published": "2019-05-12T17:59:20+02:00",
"url": "https://aaronparecki.com/2019/05/12/18/",
"category": [
"indiewebcamp",
"https://adactio.com/",
"https://foursquare.com/user/13388566",
"https://seblog.nl/"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd842d875eee4002c5892f3"
],
"content": {
"text": "Post #IndieWebCamp drinks \u2014 with Jeremy, microformats, Seb",
"html": "Post #IndieWebCamp drinks \u2014 with <a href=\"https://adactio.com/\">Jeremy</a>, <a href=\"https://foursquare.com/user/13388566\">microformats</a>, <a href=\"https://seblog.nl/\">Seb</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"checkin": {
"type": "card",
"name": "Eigelstein",
"latitude": "51.214321",
"longitude": "6.75525",
"url": "https://foursquare.com/v/4b477857f964a520133326e3"
},
"post-type": "checkin",
"_id": "3421393",
"_source": "16"
}
Second #IndieWebCamp hack day project: how to quickly get started using an IndieWeb reader.
• start with a blank HTML file
• add a rel=me link to your GitHub profile, and make sure your GitHub profile links back
• add a couple `<link>` tags for indieauth.com
• sign in to https://aperture.p3k.io
• add the `<link>` tag it generates for you
• sign in to an IndieWeb reader!
More details at: https://indieweb.org/Microsub#Getting_Started
{
"type": "entry",
"published": "2019-05-12T13:55:47+02:00",
"url": "https://aaronparecki.com/2019/05/12/12/microsub",
"category": [
"IndieWebCamp",
"microsub",
"indiewebcamp",
"indieweb"
],
"content": {
"text": "Second #IndieWebCamp hack day project: how to quickly get started using an IndieWeb reader. \n\n\u2022 start with a blank HTML file \n\u2022 add a rel=me link to your GitHub profile, and make sure your GitHub profile links back \n\u2022 add a couple `<link>` tags for indieauth.com \n\u2022 sign in to https://aperture.p3k.io \n\u2022 add the `<link>` tag it generates for you \n\u2022 sign in to an IndieWeb reader! \n\nMore details at: https://indieweb.org/Microsub#Getting_Started",
"html": "Second <a href=\"https://aaronparecki.com/tag/indiewebcamp\">#<span class=\"p-category\">IndieWebCamp</span></a> hack day project: how to quickly get started using an IndieWeb reader. <br /><br />\u2022 start with a blank HTML file <br />\u2022 add a rel=me link to your GitHub profile, and make sure your GitHub profile links back <br />\u2022 add a couple `<link>` tags for indieauth.com <br />\u2022 sign in to <a href=\"https://aperture.p3k.io\"><span>https://</span>aperture.p3k.io</a> <br />\u2022 add the `<link>` tag it generates for you <br />\u2022 sign in to an IndieWeb reader! <br /><br />More details at: <a href=\"https://indieweb.org/Microsub#Getting_Started\"><span>https://</span>indieweb.org/Microsub#Getting_Started</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"post-type": "note",
"_id": "3418896",
"_source": "16"
}
First #IndieWebCamp hack day project complete! I'm finally starting to get an understanding of CSS Grid.
Thanks to help from @tantek I was able to fix the display of my monthly calendars at https://aaronparecki.com/2019/04 by switching from table display to flex>grid>flex with table>tr>td markup. Kept the table markup and was able to remove one level of nested divs inside too!
The <table> element is a flexbox, the <tr>s are a grid, and the <td>s inside are a flexbox. This lets the rows of the calendar vary in height, but forces the height of the cells of each row to be the same height. Finally the city names at the bottom are able to be "stuck" to the bottom of the cell.
{
"type": "entry",
"published": "2019-05-12T12:53:37+02:00",
"url": "https://aaronparecki.com/2019/05/12/11/indiewebcamp-table",
"category": [
"IndieWebCamp",
"indiewebcamp",
"table",
"css",
"cssgrid"
],
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/0a6109da96fb2ad0c5ecb938b1ec6c11cddcb485ba3f948c59488f140198d27e.png"
],
"content": {
"text": "First #IndieWebCamp hack day project complete! I'm finally starting to get an understanding of CSS Grid. \n\nThanks to help from @tantek I was able to fix the display of my monthly calendars at https://aaronparecki.com/2019/04 by switching from table display to flex>grid>flex with table>tr>td markup. Kept the table markup and was able to remove one level of nested divs inside too! \n\nThe <table> element is a flexbox, the <tr>s are a grid, and the <td>s inside are a flexbox. This lets the rows of the calendar vary in height, but forces the height of the cells of each row to be the same height. Finally the city names at the bottom are able to be \"stuck\" to the bottom of the cell.",
"html": "First <a href=\"https://aaronparecki.com/tag/indiewebcamp\">#<span class=\"p-category\">IndieWebCamp</span></a> hack day project complete! I'm finally starting to get an understanding of CSS Grid. <br /><br />Thanks to help from <a href=\"http://tantek.com/\">@tantek</a> I was able to fix the display of my monthly calendars at <a href=\"https://aaronparecki.com/2019/04\"><span>https://</span>aaronparecki.com/2019/04</a> by switching from table display to flex>grid>flex with table>tr>td markup. Kept the table markup and was able to remove one level of nested divs inside too! <br /><br />The <table> element is a flexbox, the <tr>s are a grid, and the <td>s inside are a flexbox. This lets the rows of the calendar vary in height, but forces the height of the cells of each row to be the same height. Finally the city names at the bottom are able to be \"stuck\" to the bottom of the cell."
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"post-type": "photo",
"_id": "3418476",
"_source": "16"
}
#IndieWebCamp day 2! — with Jeremy, microformats, Seb, Tantek
{
"type": "entry",
"published": "2019-05-12T09:40:10+02:00",
"url": "https://aaronparecki.com/2019/05/12/7/",
"category": [
"indiewebcamp",
"https://adactio.com/",
"https://foursquare.com/user/13388566",
"https://seblog.nl/",
"https://foursquare.com/user/476"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd7cdda3abcaf002c39f421"
],
"content": {
"text": "#IndieWebCamp day 2! \u2014 with Jeremy, microformats, Seb, Tantek",
"html": "#IndieWebCamp day 2! \u2014 with <a href=\"https://adactio.com/\">Jeremy</a>, <a href=\"https://foursquare.com/user/13388566\">microformats</a>, <a href=\"https://seblog.nl/\">Seb</a>, <a href=\"https://foursquare.com/user/476\">Tantek</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"checkin": {
"type": "card",
"name": "sipgate GmbH",
"latitude": "51.211535",
"longitude": "6.756295",
"url": "https://foursquare.com/v/4c5a8a6e67ac0f47ffe6064c"
},
"post-type": "checkin",
"_id": "3417314",
"_source": "16"
}
Photos from IndieWebCamp Düsseldorf day 1 are already posted! 📷 https://www.flickr.com/photos/tollwerk/albums/72157691376106913 Thanks to our amazing photographer @iwontsignuphere
{
"type": "entry",
"published": "2019-05-12T01:23:51+02:00",
"url": "https://aaronparecki.com/2019/05/12/3/iwc",
"category": [
"indieweb"
],
"syndication": [
"https://twitter.com/aaronpk/status/1127353668641050624"
],
"content": {
"text": "Photos from IndieWebCamp D\u00fcsseldorf day 1 are already posted! \ud83d\udcf7 https://www.flickr.com/photos/tollwerk/albums/72157691376106913 Thanks to our amazing photographer @iwontsignuphere",
"html": "Photos from IndieWebCamp D\u00fcsseldorf day 1 are already posted! <a href=\"https://aaronparecki.com/emoji/%F0%9F%93%B7\">\ud83d\udcf7</a> <a href=\"https://www.flickr.com/photos/tollwerk/albums/72157691376106913\"><span>https://</span>www.flickr.com/photos/tollwerk/albums/72157691376106913</a> Thanks to our amazing photographer <a href=\"https://twitter.com/iwontsignuphere\">@iwontsignuphere</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/f37b915b436155617750c9a94573fcedf1110b8a781809c35f8531d577b20a9e.jpg"
},
"post-type": "note",
"_id": "3413980",
"_source": "16"
}
{
"type": "entry",
"published": "2019-05-11T20:57:44+02:00",
"url": "https://aaronparecki.com/2019/05/11/33/",
"category": [
"https://rosemaryorchard.com/",
"https://seblog.nl/"
],
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/aabae093a6ff175dc427ab6d34d6bd771ccec3f7f2126308dd0ae43c5b870734.jpg",
"https://aperture-media.p3k.io/aaronparecki.com/6f10acc400b86e0626a993e5b383f1080aed2fb0771c71d4f1e4b818446ab7fa.jpg"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd71b28d1a402002cf3683e"
],
"content": {
"text": "\ud83c\udf78 \u2014 with Rosemary, Seb",
"html": "\ud83c\udf78 \u2014 with <a href=\"https://rosemaryorchard.com/\">Rosemary</a>, <a href=\"https://seblog.nl/\">Seb</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/9f9062125bb42dba578032e38fb1b31679fa84bbceb16ef8add3fd30c5221485.jpg"
},
"checkin": {
"type": "card",
"name": "Williams",
"latitude": "51.210709",
"longitude": "6.776605",
"url": "https://foursquare.com/v/558f05b4498e1196c1ecc5c3"
},
"post-type": "checkin",
"_id": "3411375",
"_source": "16"
}
{
"type": "entry",
"published": "2019-05-11T17:48:57+02:00",
"url": "https://aaronparecki.com/2019/05/11/19/",
"category": [
"https://seblog.nl/",
"https://rosemaryorchard.com/"
],
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/c65cf5dcf6f3395137fd1267b1529e3a75817dff4e3e70d1d9c8846858b8ff7f.jpg"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd6eee947f876002c3f680b"
],
"name": "at Haus Massenberg",
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"checkin": {
"type": "card",
"name": "Haus Massenberg",
"latitude": "51.195551",
"longitude": "6.768496",
"url": "https://foursquare.com/v/4fcfb8dce4b0660fb500da8d"
},
"post-type": "checkin",
"_id": "3409224",
"_source": "16"
}
Happy 5th birthday WithKnown!
Thanks to everyone who’s worked on and supported this great little IndieWeb and Domain of One’s Own friendly CMS that has made my life happier and all the better for its existence. Kudos especially to Ben Werdmüller, Marcus Povey, and Erin Jo Richey.
Syndicated copies to:
{
"type": "entry",
"published": "2019-05-11T08:21:10-07:00",
"category": [
"education",
"indieweb",
"dooo",
"withknown",
"https://werd.io/",
"https://www.marcus-povey.co.uk/",
"http://erinjo.xyz/"
],
"content": {
"text": "Happy 5th birthday WithKnown!\nThanks to everyone who\u2019s worked on and supported this great little IndieWeb and Domain of One\u2019s Own friendly CMS that has made my life happier and all the better for its existence. Kudos especially to Ben Werdm\u00fcller, Marcus Povey, and Erin Jo Richey.\n\nSyndicated copies to: Twitter icon",
"html": "<p>Happy 5th birthday <a href=\"https://withknown.com/\">WithKnown</a>!</p>\n<p>Thanks to everyone who\u2019s worked on and supported this great little IndieWeb and Domain of One\u2019s Own friendly CMS that has made my life happier and all the better for its existence. Kudos especially to <a class=\"h-card u-category\" href=\"https://werd.io/\">Ben Werdm\u00fcller</a>, <a class=\"h-card u-category\" href=\"https://www.marcus-povey.co.uk/\">Marcus Povey</a>, and <a class=\"h-card u-category\" href=\"http://erinjo.xyz/\">Erin Jo Richey</a>.</p>\n\n<span>Syndicated copies to:</span><ul><li><a class=\"u-syndication\" href=\"https://twitter.com/ChrisAldrich/status/1127232330211323904\"> <span style=\"max-width:1rem;margin:2px;\" title=\"twitter\">Twitter icon</span></a></li></ul>"
},
"author": {
"type": "card",
"name": "Chris Aldrich",
"url": "https://boffosocko.com/",
"photo": "https://aperture-proxy.p3k.io/07a56dfeaeb22fa994a161bf21a4b2110aa17def/68747470733a2f2f7365637572652e67726176617461722e636f6d2f6176617461722f64356662346534393866653630396363323962303465356237616436383863343f733d343926643d6964656e7469636f6e26723d7067"
},
"post-type": "note",
"refs": {
"https://werd.io/": {
"type": "card",
"name": "Ben Werdm\u00fcller",
"url": "https://werd.io/",
"photo": null
},
"https://www.marcus-povey.co.uk/": {
"type": "card",
"name": "Marcus Povey",
"url": "https://www.marcus-povey.co.uk/",
"photo": null
},
"http://erinjo.xyz/": {
"type": "card",
"name": "Erin Jo Richey",
"url": "http://erinjo.xyz/",
"photo": null
}
},
"_id": "3903313",
"_source": "2785"
}
{
"type": "entry",
"published": "2019-05-11T07:56:45+02:00",
"url": "https://aaronparecki.com/2019/05/11/2/",
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/04f3d9a70ef68e77950a807ff0b150f4e3e6a9d949e4c87cc4b8f02a732d0aba.jpg"
],
"syndication": [
"https://www.swarmapp.com/user/59164/checkin/5cd6641d49cf930038706055"
],
"name": "at NH Hotel City Restaurant",
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/41061f9de825966faa22e9c42830e1d4a614a321213b4575b9488aa93f89817a.jpg"
},
"checkin": {
"type": "card",
"name": "NH Hotel City Restaurant",
"latitude": "51.217191",
"longitude": "6.802851",
"url": "https://foursquare.com/v/509ba33be4b0d1cde9f9d5dc"
},
"post-type": "checkin",
"_id": "3404284",
"_source": "16"
}
I'm going!Let’s try a Saturday afternoon!
From 1-3pm, join us for an IndieWeb Meetup at Think Coffee on 8th Av at 14th St in Manhattan!
Come work on your personal website, whether it exists yet or not!
{
"type": "entry",
"published": "2019-05-10T13:13:55-0400",
"rsvp": "yes",
"url": "https://martymcgui.re/2019/05/10/131355/",
"in-reply-to": [
"https://indieweb.org/events/2019-05-11-homebrew-website-club-nyc"
],
"content": {
"text": "I'm going!Let\u2019s try a Saturday afternoon!\n\nFrom 1-3pm, join us for an IndieWeb Meetup at Think Coffee on 8th Av at 14th St in Manhattan!\n\nCome work on your personal website, whether it exists yet or not!",
"html": "I'm going!<p>Let\u2019s try a Saturday afternoon!</p>\n\n<p>From 1-3pm, join us for an IndieWeb Meetup at Think Coffee on 8th Av at 14th St in Manhattan!</p>\n\n<p>Come work on your personal website, whether it exists yet or not!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": "https://martymcgui.re/",
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "rsvp",
"refs": {
"https://indieweb.org/events/2019-05-11-homebrew-website-club-nyc": {
"type": "entry",
"summary": "Join us for an afternoon of IndieWeb personal site demos and discussions!",
"url": "https://indieweb.org/events/2019-05-11-homebrew-website-club-nyc",
"photo": [
"https://res.cloudinary.com/schmarty/image/fetch/w_960,c_fill/https://indieweb.org/images/b/b1/2017-hwc-80s-retro.jpg"
],
"name": "\ud83d\uddfd Homebrew Website Club NYC",
"author": {
"type": "card",
"name": "indieweb.org",
"url": "http://indieweb.org",
"photo": null
},
"post-type": "photo"
}
},
"_id": "3396940",
"_source": "175"
}
This post from Calum finally brought out the FOMO I had been suppressing for IndieWebCamp Berlin.
Really looking forward to the 2019 IndieWeb Summit June 29-30th in Portland!
https://calumryan.com/blog/indiewebcamp-berlin-2019/
{
"type": "entry",
"published": "2019-05-10T13:01:42-0400",
"url": "https://martymcgui.re/2019/05/10/130142/",
"content": {
"text": "This post from Calum finally brought out the FOMO I had been suppressing for IndieWebCamp Berlin.\n\nReally looking forward to the 2019 IndieWeb Summit June 29-30th in Portland!\n\nhttps://calumryan.com/blog/indiewebcamp-berlin-2019/",
"html": "<p>This post from <a href=\"https://calumryan.com/\">Calum</a> finally brought out the FOMO I had been suppressing for IndieWebCamp Berlin.</p>\n\n<p>Really looking forward to <a href=\"https://2019.indieweb.org/summit\">the 2019 IndieWeb Summit</a> June 29-30th in Portland!</p>\n\n<p><a href=\"https://calumryan.com/blog/indiewebcamp-berlin-2019/\">https://calumryan.com/blog/indiewebcamp-berlin-2019/</a></p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": "https://martymcgui.re/",
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "note",
"_id": "3396942",
"_source": "175"
}
{
"type": "entry",
"published": "2019-05-10T12:50:18-0400",
"url": "https://martymcgui.re/2019/05/10/archiving-rooms-from-a-matrixorg-homeserver-including-end-to-end-encrypted-rooms/",
"category": [
"matrix",
"matrix.org",
"export",
"self-hosting",
"ownyourdata",
"archive",
"pantalaimon"
],
"name": "Archiving rooms from a Matrix.org Homeserver (including end-to-end encrypted rooms)",
"content": {
"text": "I'm in the middle of a Forever Project, migrating stuff and services off of an old server in my closet at home onto a new (smaller, better, faster!) server in my closet at home.\nOne such service is a Matrix.org Synapse homeserver that was used as a private Slack-alternative chat for my household, as well as a bridge to some IRC channels. I set it up by hand in haste some years ago and made some not-super-sustainable choices about it, including leaving the database in SQLite (2.2GB and feelin' fine), not documenting my DNS and port-forwarding setup very well, and a few other \"oopsies\".\nI had been keeping the code up to date via \"pip install\" and the latest \"master\" tarballs, but when the announcement came about needing valid TLS for federation starting in 0.99.X, I wasn't sure if I was good to upgrade. (I later found out that I was okay, ha!)\nI found some docs on the most recent ways to set up Matrix on a new server, and even on how to migrate from SQLite to PostgreSQL. However, I don't know if I'll be able to set aside the time to do it all at once, or if it'll be easier just to set it up fresh, or even if I need a homeserver right now. So, I decided to figure out how to make archives of the rooms I cared about, which included household conversations, recipes, and photos from around the house and on travels.\n\n Overview\n\nThe process turned out to be pretty involved, which is why it gets a blog post! It boils down to needing these three things:\n\n osteele/matrix-archive - Export a Matrix room message archive and photos.\n \n \nmatrix-org/pantalaimon - A proxy to handle end-to-end encrypted (E2EE) room content for matrix-archive\n \n matrix-org/Olm - C library to handle the actual E2EE processing. Pantalaimon relies on this library and it's Python extensions.\n \nGetting all the tools built required a pretty recent system, which my old server ain't. I ended up building and running them on my personal laptop, running Ubuntu 19.04.\n\n Since both matrix-archive and pantalaimon are Python-based, I created a Python 3.7 virtualenv to keep everything in, rather than installing everything system-wide.\n\n\n Olm\n\nThe Olm docs recommend building with CMake, but as someone unfamiliar with CMake I could get it to build and run tests, but could not actually get it installed on my system.\nI ended up installing the main lib with:\n\n make && sudo make install\n\nThe Python extensions were a challenge and I am not sure that I remember all the details to properly document them here. I spent a good amount of time trying to follow the Olm instructions to get them installed into my Python virtualenv.\nIn the end, the pantalaimon install built its own version of the Python Olm extensions, so I'm going to guess this was enough for now.\nPantalaimon\nThe pantalaimon README was pretty straightforward, once I installed Olm system-wide. I activated my virtualenv and ran:\n\n python setup.py install\n\nThat resulted in a \"pantalaimon\" script installed in my virtualenv's bin dir, so I could (in theory) run it on the command line, pointing it at my running Synapse server:\n\n pantalaimon https://matrix.example.com:8448\n\nThat started a service on http://127.0.0.1:8009/ which matrix-archive would connect over, with pantalaimon handling all the E2EE decryption transparently.\nmatrix-archive\nThe matrix-archive setup instructions suggest using a dependency manager called \"Pipenv\" that I was not familiar with. I installed it in my virtualenv, then ran it to setup and install matrix-archive:\n\n pip install pipenv\n pipenv install\n\nPipenv \"noticed\" it was running in a virtualenv, and said so. This didn't seem to be much of a problem, but any command I tried to run with \"pipenv run\" would fail. I worked around this by looking in the \"Pipfile\" to see what commands were actually being run, and it turns out it was just calling specific Python scripts in the matrix-archive directory. So, I resolved to run those by hand.\nMongoDB\nmatrix-archive requires MongoDB. I don't use it for anything else, so I had to \"sudo apt install mongodb-server\".\n\n Running the Import\n\nFirst, I set the environment variables needed by matrix-archive:\n\n export MATRIX_USER=<my username>\n export MATRIX_PASSWORD=<my password>\n export MATRIX_HOST=http://127.0.0.1:8009\n\nThen confirmed it was working by getting a list of rooms with IDs:\n\n python list_rooms.py\n\nI set up the list of room IDs in an environment variable:\n\n export MATRIX_ROOM_IDS=!room@server,!room2@server,...\n\nAnd slurped in all the messages with:\n\n python import_messages.py\n\nAt the end, it said it had a bunch of messages. Hooray!\nRunning the Export\nThis is where things kind of ran off the rails. In trying to export messages I kept seeing Python KeyErrors about a missing 'info' key. It seems like maybe the Matrix protocol was updated to make this an optional key, but the upshot was that matrix-archive seemed to assume that every message with an image attached would have an 'info' with info about a thumbnail for that image.\n\n Additionally, the script to download images had some naive handling for turning attachment URLs like \"mxc://example.com/...\" into downloadable URLs. Matrix supports DNS-based delegation, so you can say \"the Matrix server for example.com is matrix.example.com:8448, and this script didn't handle that.\n\nI did some nasty hacks to only get full-sized images, and from the right host:\nupdated the schema to return the full image URL instead of digging in for a thumbnail\n added handling to export_messages.py to handle missing 'info', which was used to guess image mimetypes\n added some hardcoding to map converted \"mxc://\" URLs to the right host.\nAfterwards I was able to do an export of alllllll the images to a \"images/\" folder:\n\n python download_images.py --no-thumbnails\n\n\n And could then export a particular room's history with:\n\n\n python export_messages.py --room-id ROOM-NAME --local-images --filename ROOM-NAME.html\n\nNote that the \"--room-id\" flag above actually wants the human-readable room name, unless it's actually a room on the main matrix.org server.\n\n Afterwards, I could open room-name.html in my browser, and see the very important messages and images I worked so hard to archive.\n\nScreenshot from the (very minimal) HTML export, including an image (of a pug, sourced by a chat bot).What's Next?\nFor now, I'll be putting these files and images in a safe backup and not worrying about them too much, because I have them. I've already stopped my old Synapse server, and can tackle setting up the new one at my leisure. We've moved our house chats to Signal, and I've moved my IRC usage over to bridged Slack channels.\n\n Running a Matrix Synapse homeserver for the past couple of years has been quite interesting! I really appreciate the hard working community (especially in light of their recent infrastructure troubles), and I recognize that it's a ton of work to build a federating network of real-time, private communication. I enjoyed the freedom of having my own chat service to run bots, share images, and discuss private moments without worrying about who might be reading the messages now or down the road.\n\nThat said, there are still some major usability kinks to work out. The end-to-end encryption rollout across homeservers and clients hasn't been the smoothest, and it can be an issue juggling E2EE keys across devices. I look forward to seeing how the community addresses issues like these in the future!\n\n TL;DR - saving an archive of a room's history and files should not be this hard.",
"html": "<p>I'm in the middle of a Forever Project, migrating stuff and services off of an old server in my closet at home onto a new (smaller, better, faster!) server in my closet at home.</p>\n<p>One such service is a <a href=\"https://matrix.org/\">Matrix.org</a> <a href=\"https://github.com/matrix-org/synapse#readme\">Synapse homeserver</a> that was used as a private Slack-alternative chat for my household, as well as a bridge to some IRC channels. I set it up by hand in haste some years ago and made some not-super-sustainable choices about it, including leaving the database in SQLite (2.2GB and feelin' fine), not documenting my DNS and port-forwarding setup very well, and a few other \"oopsies\".</p>\n<p>I had been keeping the code up to date via \"pip install\" and the latest <a href=\"https://github.com/matrix-org/synapse/releases\">\"master\" tarballs</a>, but when the <a href=\"https://matrix.org/blog/2019/04/01/synapse-0-99-3-released/\">announcement came about needing valid TLS for federation starting in 0.99.X</a>, I wasn't sure if I was good to upgrade. (I later found out that I was okay, ha!)</p>\n<p>I found some docs on the most recent ways to <a href=\"https://www.howtoforge.com/tutorial/how-to-install-matrix-synapse-on-ubuntu-1804/\">set up Matrix on a new server</a>, and even on <a href=\"https://github.com/matrix-org/synapse/blob/master/docs/postgres.rst\">how to migrate from SQLite to PostgreSQL</a>. However, I don't know if I'll be able to set aside the time to do it all at once, or if it'll be easier just to set it up fresh, or even if I <i>need</i> a homeserver right now. So, I decided to figure out how to make archives of the rooms I cared about, which included household conversations, recipes, and photos from around the house and on travels.</p>\n<h2>\n Overview\n</h2>\n<p>The process turned out to be pretty involved, which is why it gets a blog post! It boils down to needing these three things:</p>\n<ul><li>\n <a href=\"https://github.com/osteele/matrix-archive\">osteele/matrix-archive</a> - Export a Matrix room message archive and photos.\n </li>\n <li>\n<a href=\"https://github.com/matrix-org/pantalaimon\">matrix-org/pantalaimon</a> - A proxy to handle end-to-end encrypted (E2EE) room content for matrix-archive</li>\n <li>\n <a href=\"https://gitlab.matrix.org/matrix-org/olm/\">matrix-org/Olm</a> - C library to handle the actual E2EE processing. Pantalaimon relies on this library and it's Python extensions.\n </li>\n</ul><p>Getting all the tools built required a pretty recent system, which my old server ain't. I ended up building and running them on my personal laptop, running Ubuntu 19.04.</p>\n<p>\n Since both matrix-archive and pantalaimon are Python-based, I created a Python 3.7 virtualenv to keep everything in, rather than installing <i>everything</i> system-wide.\n</p>\n<h2>\n Olm\n</h2>\n<p>The <a href=\"https://gitlab.matrix.org/matrix-org/olm/blob/master/README.rst\">Olm docs</a> recommend building with CMake, but as someone unfamiliar with CMake I could get it to build and run tests, but could not actually get it <i>installed</i> on my system.</p>\n<p>I ended up installing the main lib with:</p>\n<pre>\n make && sudo make install\n</pre>\n<p>The Python extensions were a challenge and I am not sure that I remember all the details to properly document them here. I spent a good amount of time trying to follow the Olm instructions to get them installed into my Python virtualenv.</p>\n<p>In the end, the pantalaimon install built its own version of the Python Olm extensions, so I'm going to guess this was enough for now.</p>\n<h2>Pantalaimon</h2>\n<p>The <a href=\"https://github.com/matrix-org/pantalaimon#readme\">pantalaimon README</a> was pretty straightforward, once I installed Olm system-wide. I activated my virtualenv and ran:</p>\n<pre>\n python setup.py install\n</pre>\n<p>That resulted in a \"pantalaimon\" script installed in my virtualenv's bin dir, so I could (in theory) run it on the command line, pointing it at my running Synapse server:</p>\n<pre>\n pantalaimon https://matrix.example.com:8448\n</pre>\n<p>That started a service on http://127.0.0.1:8009/ which matrix-archive would connect over, with pantalaimon handling all the E2EE decryption transparently.</p>\n<h2>matrix-archive</h2>\n<p>The <a href=\"https://github.com/osteele/matrix-archive#Setup\">matrix-archive setup instructions</a> suggest using a dependency manager called \"Pipenv\" that I was not familiar with. I installed it in my virtualenv, then ran it to setup and install matrix-archive:</p>\n<pre>\n pip install pipenv\n pipenv install\n</pre>\n<p>Pipenv \"noticed\" it was running in a virtualenv, and said so. This didn't seem to be much of a problem, but any command I tried to run with \"pipenv run\" would fail. I worked around this by looking in the \"Pipfile\" to see what commands were actually being run, and it turns out it was just calling specific Python scripts in the matrix-archive directory. So, I resolved to run those by hand.</p>\n<h3>MongoDB</h3>\n<p>matrix-archive requires MongoDB. I don't use it for anything else, so I had to \"sudo apt install mongodb-server\".</p>\n<h3>\n Running the Import\n</h3>\n<p>First, I set the environment variables needed by matrix-archive:</p>\n<pre>\n export MATRIX_USER=<my username>\n export MATRIX_PASSWORD=<my password>\n export MATRIX_HOST=http://127.0.0.1:8009\n</pre>\n<p>Then confirmed it was working by getting a list of rooms with IDs:</p>\n<pre>\n python list_rooms.py\n</pre>\n<p>I set up the list of room IDs in an environment variable:</p>\n<pre>\n export MATRIX_ROOM_IDS=!room@server,!room2@server,...\n</pre>\n<p>And slurped in all the messages with:</p>\n<pre>\n python import_messages.py\n</pre>\n<p>At the end, it said it had a bunch of messages. Hooray!</p>\n<h3>Running the Export</h3>\n<p>This is where things kind of ran off the rails. In trying to export messages I kept seeing Python KeyErrors about a missing 'info' key. It seems like maybe the Matrix protocol was updated to make this an optional key, but the upshot was that matrix-archive seemed to assume that every message with an image attached would have an 'info' with info about a thumbnail for that image.</p>\n<p>\n Additionally, the script to download images had some naive handling for turning attachment URLs like \"mxc://example.com/...\" into downloadable URLs. Matrix supports <a href=\"https://github.com/matrix-org/synapse/blob/9ffadcdbadd1d480a23a8fc46111bba211089006/docs/federate.md#dns-srv-delegation\">DNS-based delegation</a>, so you can say \"the Matrix server for example.com is matrix.example.com:8448, and this script didn't handle that.\n</p>\n<p>I did some <a href=\"https://github.com/martymcguire/matrix-archive/commit/054bfba36344d0e40b3de4a8fdf9c4de96bc8f25\">nasty hacks</a> to only get full-sized images, and from the right host:</p>\n<ul><li>updated the schema to return the full image URL instead of digging in for a thumbnail</li>\n <li>added handling to export_messages.py to handle missing 'info', which was used to guess image mimetypes</li>\n <li>added some hardcoding to map converted \"mxc://\" URLs to the right host.</li>\n</ul><p>Afterwards I was able to do an export of alllllll the images to a \"images/\" folder:</p>\n<pre>\n python download_images.py --no-thumbnails\n</pre>\n<p>\n And could then export a particular room's history with:\n</p>\n<pre>\n python export_messages.py --room-id ROOM-NAME --local-images --filename ROOM-NAME.html\n</pre>\n<p>Note that the \"--room-id\" flag above actually wants the human-readable room name, unless it's actually a room on the main matrix.org server.</p>\n<p>\n Afterwards, I could open room-name.html in my browser, and see the very important messages and images I worked so hard to archive.\n</p>\n<img src=\"https://aperture-proxy.p3k.io/f9177e9dbfed7374361adc018248f5c77ac47f69/68747470733a2f2f6d656469612e6d617274796d636775692e72652f38612f31352f37312f32342f35393935343365636562383962343666383333666261646535326339313437326562393265393862363937663230396137623236663233362e706e67\" alt=\"a message exchange. marty asks maktrobot to 'pug me'. maktrobot responds with an image of a pug.\" />Screenshot from the (very minimal) HTML export, including an image (of a pug, sourced by a chat bot).<h2>What's Next?</h2>\n<p>For now, I'll be putting these files and images in a safe backup and not worrying about them too much, because I have them. I've already stopped my old Synapse server, and can tackle setting up the new one at my leisure. We've moved our house chats to Signal, and I've moved my IRC usage over to bridged Slack channels.</p>\n<p>\n Running a Matrix Synapse homeserver for the past couple of years has been quite interesting! I really appreciate the hard working community (especially in light of their <a href=\"https://matrix.org/blog/2019/05/08/post-mortem-and-remediations-for-apr-11-security-incident/\">recent infrastructure troubles</a>), and I recognize that it's a ton of work to build a federating network of real-time, private communication. I enjoyed the freedom of having my own chat service to run bots, share images, and discuss private moments without worrying about who might be reading the messages now or down the road.\n</p>\n<p>That said, there are still some major usability kinks to work out. The end-to-end encryption rollout across homeservers and clients hasn't been the smoothest, and it can be an issue juggling E2EE keys across devices. I look forward to seeing how the community addresses issues like these in the future!</p>\n<p>\n TL;DR - saving an archive of a room's history and files should <i>not be this hard</i>.\n</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": "https://martymcgui.re/",
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "article",
"_id": "3396943",
"_source": "175"
}
{
"type": "entry",
"author": {
"name": "Jared White",
"url": "https://jaredwhite.com/",
"photo": null
},
"url": "https://jaredwhite.com/pictures/20190510/1",
"published": "2019-05-10T07:48:40-07:00",
"content": {
"html": "<img alt=\"\" src=\"https://aperture-proxy.p3k.io/42a402f27ec384f9936d42535f45a56ba80b9d2d/68747470733a2f2f7265732e636c6f7564696e6172792e636f6d2f6d617269706f7374612f696d6167652f75706c6f61642f775f313230302c635f6c696d69742c715f36352f46384342334531392d444643352d343445352d413933312d4139463439304435463336445f6477776e78612e6a7067\" /><p>On a family outing in <a href=\"https://jaredwhite.com/tag/portland\">#portland</a> last weekend, we saw this classic Buick parked along the street\u2014gleaming in the sunlight and in absolutely imacculate condition inside and out. Now I\u2019ve never had a particular interest in owning and maintaining classic cars, but if I did\u2026I\u2019d want this one. \ud83d\ude0e</p>",
"text": "On a family outing in #portland last weekend, we saw this classic Buick parked along the street\u2014gleaming in the sunlight and in absolutely imacculate condition inside and out. Now I\u2019ve never had a particular interest in owning and maintaining classic cars, but if I did\u2026I\u2019d want this one. \ud83d\ude0e"
},
"name": "Picture for Friday, May 10, 2019 at 7:48 AM",
"post-type": "article",
"_id": "3903236",
"_source": "2783"
}