Marty McGuire
I'm going!My first IndieWebCamp outside the U.S.! Very excited to meet some new faces.
… and to be making my first trip to Germany!
{
"type": "entry",
"published": "2018-09-30T17:15:24-04:00",
"rsvp": "yes",
"url": "https://martymcgui.re/2018/09/30/171524/",
"category": [
"IndieWeb",
"IWC",
"Berlin",
"IWCBerlin"
],
"in-reply-to": [
"https://indieweb.org/2018/Berlin"
],
"content": {
"text": "I'm going!My first IndieWebCamp outside the U.S.! Very excited to meet some new faces.\n\u2026 and to be making my first trip to Germany!",
"html": "I'm going!<p>My first IndieWebCamp outside the U.S.! Very excited to meet some new faces.</p>\n<p>\u2026 and to be making my first trip to Germany!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "rsvp",
"refs": {
"https://indieweb.org/2018/Berlin": {
"type": "entry",
"summary": "",
"url": "https://indieweb.org/2018/Berlin",
"name": "IndieWebCamp Berlin 2018",
"author": {
"type": "card",
"name": "indieweb.org",
"url": "http://indieweb.org",
"photo": null
},
"post-type": "article"
}
},
"_id": "1108626",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-30T15:46:56+10:00",
"url": "https://unicyclic.com/mal/2018-09-30-A_Programmable_IndieWeb",
"category": [
"IndieWeb"
],
"name": "A Programmable IndieWeb",
"content": {
"text": "It's been a long time since we've had any new writing from Aaron Swartz, but a draft of a book has been released that he had worked on, called A Programmable Web.\n\n\nThere's a fair bit of sadness and nostalgia in reading this work, as Aaron had a characteristic writing style that many of us still miss. However it's also a fascinating read, as he introduces concepts of working with the web, building one idea on top of the next.\n\n\nIt also feels a bit like a snapshot of the time when he was writing. I wonder if he would still favor the particular technologies and development styles he writes about? Regardless of his personal development choices, I still think he would have seen the IndieWeb as having the hacker spirit he identified with. In fact, I think this book paints an alternate vision for what we would like to see the IndieWeb achieve.\n\n\nThe final page of the draft reads, \"the Semantic Web is based on a bet, a bet that giving the world tools to easily collaborate and communicate will lead to possibilities so wonderful we can scarcely even imagine them right now. Sure, it sounds a little bit crazy. But it paid off the last time they made that gamble: we ended up with a little thing called the World Wide Web. Let's see if they can do that again.\"\n\n\nIt's a beautiful picture, but I wish Aaron had written we, instead of they, here. He wasn't the sort of guy who waited for others to get things done when it was within his own abilities. The Programmable Web will be built, and the tools for collaboration are being built using the process of collaboration itself.",
"html": "It's been a long time since we've had any new writing from <a href=\"http://www.aaronsw.com/\">Aaron Swartz</a>, but a draft of a book has been released that he had worked on, called <a href=\"https://archive.org/details/AaronSwartzAProgrammableWeb/page/n0\">A Programmable Web</a>.<br /><br />\nThere's a fair bit of sadness and nostalgia in reading this work, as Aaron had a characteristic writing style that many of us still miss. However it's also a fascinating read, as he introduces concepts of working with the web, building one idea on top of the next.<br /><br />\nIt also feels a bit like a snapshot of the time when he was writing. I wonder if he would still favor the particular technologies and development styles he writes about? Regardless of his personal development choices, I still think he would have seen the <a href=\"https://indieweb.org/\">IndieWeb</a> as having the hacker spirit he identified with. In fact, I think this book paints an alternate vision for what we would like to see the IndieWeb achieve.<br /><br />\nThe final page of the draft reads, <em>\"the Semantic Web is based on a bet, a bet that giving the world tools to easily collaborate and communicate will lead to possibilities so wonderful we can scarcely even imagine them right now. Sure, it sounds a little bit crazy. But it paid off the last time they made that gamble: we ended up with a little thing called the World Wide Web. Let's see if they can do that again.\"</em><br /><br />\nIt's a beautiful picture, but I wish Aaron had written <strong>we</strong>, instead of <strong>they</strong>, here. He wasn't the sort of guy who waited for others to get things done when it was within his own abilities. The Programmable Web will be built, and the tools for collaboration are being built using the process of collaboration itself."
},
"author": {
"type": "card",
"name": "Malcolm Blaney",
"url": "https://unicyclic.com/mal",
"photo": "https://aperture-proxy.p3k.io/4f46272c0027449ced0d7cf8de31ea1bec37210e/68747470733a2f2f756e696379636c69632e636f6d2f6d616c2f7075626c69632f70726f66696c655f736d616c6c5f7468756d622e706e67"
},
"post-type": "article",
"_id": "1106025",
"_source": "243",
"_is_read": true
}
This is a demo for IndieWebCamp NYC! If you look at this post on my website, it will have a colored background!
{
"type": "entry",
"published": "2018-09-29T15:01:40-04:00",
"url": "https://aaronparecki.com/2018/09/29/13/",
"category": [
"ff4411"
],
"content": {
"text": "This is a demo for IndieWebCamp NYC! If you look at this post on my website, it will have a colored background!"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/2b8e1668dcd9cfa6a170b3724df740695f73a15c2a825962fd0a0967ec11ecdc.jpg"
},
"post-type": "note",
"_id": "1103099",
"_source": "16",
"_is_read": true
}
Marty McGuire
Are you a member of the 🕸💍 IndieWeb Webring? Today I made an update!
All members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!
From now on, new emoji IDs will not include country flags.
If you’re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the #indieweb chat (I’m schmarty
there). I’ll reset your account and you’ll get a new emoji ID. You’ll also have to update the webring links code on your page to make sure they point to your new ID!
{
"type": "entry",
"published": "2018-09-29T11:45:53-04:00",
"url": "https://martymcgui.re/2018/09/29/114553/",
"category": [
"\ud83d\udd78\ud83d\udc8d",
"webring",
"indieweb",
"update"
],
"content": {
"text": "Are you a member of the \ud83d\udd78\ud83d\udc8d IndieWeb Webring? Today I made an update!\nAll members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!\nFrom now on, new emoji IDs will not include country flags.\nIf you\u2019re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the #indieweb chat (I\u2019m schmarty there). I\u2019ll reset your account and you\u2019ll get a new emoji ID. You\u2019ll also have to update the webring links code on your page to make sure they point to your new ID!",
"html": "<p>Are you a member of the <a href=\"https://xn--sr8hvo.ws\">\ud83d\udd78\ud83d\udc8d</a> IndieWeb Webring? Today I made an update!</p>\n<p>All members of the webring get a unique emoji ID when they first sign in. Previously, those emoji might have included the flag of a country or state, and not everyone wants to be associated with a random country or state!</p>\n<p>From now on, new emoji IDs will not include country flags.</p>\n<p>If you\u2019re a member of the webring already, and would like a new emoji ID, feel free to drop me a line in the <a href=\"https://chat.indieweb.org/\">#indieweb chat</a> (I\u2019m <code>schmarty</code> there). I\u2019ll reset your account and you\u2019ll get a new emoji ID. You\u2019ll also have to update the webring links code on your page to make sure they point to your new ID!</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "note",
"_id": "1102129",
"_source": "175",
"_is_read": true
}
Marty McGuire
{
"type": "entry",
"published": "2018-09-28T15:12:33-04:00",
"url": "https://martymcgui.re/2018/09/28/151233/",
"photo": [
"https://martymcgui.re/imageproxy/960,fit,sCf_co3HWAIZ4fBP7CHdvkr3u8vCz64k1USJq5CitASc=/https://media.martymcgui.re/66/d8/28/6f/71f30adaed0f3c6caf935cc3822e799a0bf375e53d74462aff6f3ff5.jpg"
],
"name": "Notes for event attendance tracker using webmentions from the #badges session at IWC NYC.",
"content": {
"text": "Notes for event attendance tracker using webmentions from the #badges session at IWC NYC.",
"html": "<a href=\"https://media.martymcgui.re/66/d8/28/6f/71f30adaed0f3c6caf935cc3822e799a0bf375e53d74462aff6f3ff5.jpg\"></a> \n \n \n\n \n <p>Notes for event attendance tracker using webmentions from the #badges session at IWC NYC.</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "photo",
"_id": "1098462",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-28T14:53:52-04:00",
"url": "https://david.shanske.com/2018/09/28/thoughts-about-assertion-workflows/",
"name": "Thoughts About Assertion Workflows",
"content": {
"text": "This is a preliminary technical workflow proposal for assertions, which would be needed for badges, endorsements, and other ideas. It is based on thoughts that I had listening to the badges session at Indiewebcamp NYC 2018.\nScenario 1: Individual creates criteria and wants to assert that other individual has achieved said criteria. Example: Professor wants to certify students completed coursework.\nProfessor Posts Criteria for Each Achievement as a unique page (A).\nStudent completes assignment as a post (B).\nProfessor Posts Badge/Assertion/Endorsement post on their website as an h-review, with a p-item property to student\u2019s URL (B). Would need a new or existing property to represent the relationship to the original assertion (A). Suggest u-assert and u-assert-of?\nScenario 2: Individual creates assertion post and solicits others to endorse that statement as factual.\nIndividual makes a post to their site(h-resume for references on a resume, not sure what to request endorsement of a statement? p-assert with a nested h-item?) and invites other individuals(using existing invitee property used for RSVPs?) to endorse or assert it. Criteria might be included for achievement.\nOthers create \u2018assertion\u2019 posts on their site(assert-of) and send webmentions, which would cause the post to be updated to note that it had been achieved.\nExisting microformats for h-resume and h-review seem to allow additional context.\nEducation\nExperience\nSkill\nRating\nBest\nWorst\n\u00a0",
"html": "This is a preliminary technical workflow proposal for assertions, which would be needed for badges, endorsements, and other ideas. It is based on thoughts that I had listening to the badges session at Indiewebcamp NYC 2018.\n<p>Scenario 1: Individual creates criteria and wants to assert that other individual has achieved said criteria. Example: Professor wants to certify students completed coursework.</p>\n<ul><li>Professor Posts Criteria for Each Achievement as a unique page (A).</li>\n<li>Student completes assignment as a post (B).</li>\n<li>Professor Posts Badge/Assertion/Endorsement post on their website as an h-review, with a p-item property to student\u2019s URL (B). Would need a new or existing property to represent the relationship to the original assertion (A). Suggest u-assert and u-assert-of?</li>\n</ul><p>Scenario 2: Individual creates assertion post and solicits others to endorse that statement as factual.</p>\n<ul><li>Individual makes a post to their site(h-resume for references on a resume, not sure what to request endorsement of a statement? p-assert with a nested h-item?) and invites other individuals(using existing invitee property used for RSVPs?) to endorse or assert it. Criteria might be included for achievement.</li>\n<li>Others create \u2018assertion\u2019 posts on their site(assert-of) and send webmentions, which would cause the post to be updated to note that it had been achieved.</li>\n</ul><p>Existing microformats for h-resume and h-review seem to allow additional context.</p>\n<ul><li>Education</li>\n<li>Experience</li>\n<li>Skill</li>\n<li>Rating</li>\n<li>Best</li>\n<li>Worst</li>\n</ul><p>\u00a0</p>"
},
"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-125.png"
},
"post-type": "article",
"_id": "1097936",
"_source": "5",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-28 07:45-0700",
"url": "http://tantek.com/2018/271/t1/indiewebcamp-nyc-great-start-keynotes",
"category": [
"IndieWebCamp"
],
"content": {
"text": "#IndieWebCamp NYC off to a great start with keynotes:\n* @Bali_Maha Connecting the World: Intentions and Realities https://blog.mahabali.me/educational-technology-2/connecting-the-world-intentions-and-realities-keynote-sept-28-indiewebcamp/\n* @iamjessklein Designing for participation in open spaces https://docs.google.com/presentation/d/1dnCDc6BAohIuL8fxB2_nOqtpzGX6RWt1BE4Vay4tC2Y/edit?usp=sharing\n\nLive feed: https://www.youtube.com/watch?v=ZlkhhMiGP-g",
"html": "#<span class=\"p-category\">IndieWebCamp</span> NYC off to a great start with keynotes:<br />* <a class=\"h-cassis-username\" href=\"https://twitter.com/Bali_Maha\">@Bali_Maha</a> Connecting the World: Intentions and Realities <a href=\"https://blog.mahabali.me/educational-technology-2/connecting-the-world-intentions-and-realities-keynote-sept-28-indiewebcamp/\">https://blog.mahabali.me/educational-technology-2/connecting-the-world-intentions-and-realities-keynote-sept-28-indiewebcamp/</a><br />* <a class=\"h-cassis-username\" href=\"https://twitter.com/iamjessklein\">@iamjessklein</a> Designing for participation in open spaces <a href=\"https://docs.google.com/presentation/d/1dnCDc6BAohIuL8fxB2_nOqtpzGX6RWt1BE4Vay4tC2Y/edit?usp=sharing\">https://docs.google.com/presentation/d/1dnCDc6BAohIuL8fxB2_nOqtpzGX6RWt1BE4Vay4tC2Y/edit?usp=sharing</a><br /><br />Live feed: <a href=\"https://www.youtube.com/watch?v=ZlkhhMiGP-g\">https://www.youtube.com/watch?v=ZlkhhMiGP-g</a>"
},
"author": {
"type": "card",
"name": "Tantek \u00c7elik",
"url": "http://tantek.com/",
"photo": "https://aperture-media.p3k.io/tantek.com/acfddd7d8b2c8cf8aa163651432cc1ec7eb8ec2f881942dca963d305eeaaa6b8.jpg"
},
"post-type": "note",
"_id": "1096269",
"_source": "1",
"_is_read": true
}
Marty McGuire
Eating before meeting at IndieWebCamp NYC Leaders meeting.
{
"type": "entry",
"published": "2018-09-27T11:09:00-04:00",
"url": "https://martymcgui.re/2018/09/27/110900/",
"content": {
"text": "Eating before meeting at IndieWebCamp NYC Leaders meeting.",
"html": "<p>Eating before meeting at IndieWebCamp NYC Leaders meeting.</p>"
},
"author": {
"type": "card",
"name": "Marty McGuire",
"url": false,
"photo": "https://aperture-proxy.p3k.io/8275f85e3a389bd0ae69f209683436fc53d8bad9/68747470733a2f2f6d617274796d636775692e72652f696d616765732f6c6f676f2e6a7067"
},
"post-type": "note",
"_id": "1088810",
"_source": "175",
"_is_read": true
}
{
"type": "entry",
"author": {
"name": "Peter Molnar",
"url": "https://petermolnar.net",
"photo": null
},
"url": "https://petermolnar.net/location-tracking-without-server/",
"published": "2018-09-27T11:05:00+01:00",
"content": {
"html": "<p>Nearly all self-hosted location tracking Android applications are based on server-client architecture: the one on the phone collects only a small points, if not only one, and sends it to a configured server. Traccar<a href=\"https://petermolnar.net/#fn1\">1</a>, Owntracks<a href=\"https://petermolnar.net/#fn2\">2</a>, etc.</p>\n<p>While this setup is useful, it doesn\u2019t fit in my static, unless it hurts<a href=\"https://petermolnar.net/#fn3\">3</a> approach, and it needs data connectivity, which can be tricky during abroad trips. The rare occasions in rural Scotland and Wales tought me data connectivity is not omnipresent at all.</p>\n<p>There used to be a magnificent little location tracker, which, besides the server-client approach, could store the location data in CSV and KML files locally: Backitude<a href=\"https://petermolnar.net/#fn4\">4</a>. The program is gone from Play store, I have no idea, why, but I have a copy of the last APK of it<a href=\"https://petermolnar.net/#fn5\">5</a>.</p>\n<p>My flow is the following:</p>\n<ul><li>Backitude saves the CSV files</li>\n<li>Syncthing<a href=\"https://petermolnar.net/#fn6\">6</a> syncs the phone and the laptop</li>\n<li>the laptop has a Python script that imports the CSV into SQLite to eliminate duplicates</li>\n<li>the same script queries against Bing to get altitude information for missing altitudes</li>\n<li>as a final step, the script exports daily GPX files</li>\n<li>on the laptop, GpsPrune helps me visualize and measure trips</li>\n</ul><h2>Backitude configuration</h2>\n<p>These are the modified setting properties:</p>\n<ul><li>Enable backitude: yes</li>\n<li>Settings\n<ul><li>Standard Mode Settings\n<ul><li>Time Interval Selection: 1 minute</li>\n<li>Location Polling Timeout: 5 minutes</li>\n<li>Display update message: no</li>\n</ul></li>\n<li>Wifi Mode Settings\n<ul><li>Wi-Fi Mode Enabled: yes</li>\n<li>Time Interval Options: 1 hour</li>\n<li>Location Polling Timeout: 5 minutes</li>\n</ul></li>\n<li>Update Settings\n<ul><li>Minimum Change in Distance: 10 meters</li>\n</ul></li>\n<li>Accuracy Settings\n<ul><li>Minimum GPS accuracy: 12 meters</li>\n<li>Minimum Wi-Fi accuracy: 20 meters</li>\n</ul></li>\n<li>Internal Memory Storage Options\n<ul><li>KML and CSV</li>\n</ul></li>\n<li>Display Failure Notifications: no</li>\n</ul></li>\n</ul><p>I have an exported preferences file available<a href=\"https://petermolnar.net/#fn7\">7</a>.</p>\n<h2>Syncthing</h2>\n<p>The syncthing configuration is optional; it could be simple done by manual transfers from the phone. It\u2019s also not the most simple thing to do, so I\u2019ll let the Syncting Documentation<a href=\"https://petermolnar.net/#fn8\">8</a> take care of describing the how-tos.</p>\n<h2>Python script</h2>\n<p>Before jumping to the script, there are 3 Python modules it needs:</p>\n<pre><code>pip3 install --user arrow gpxpy requests</code></pre>\n<p>And the script itself - please replace the <code>INBASE</code>, <code>OUTBASE</code>, and <code>BINGKEY</code> properties. To get a Bing key, visit Bing<a href=\"https://petermolnar.net/#fn9\">9</a>.</p>\n<pre><code>import os\nimport sqlite3\nimport csv\nimport glob\nimport arrow\nimport re\nimport gpxpy.gpx\nimport requests\n\nINBASE=\"/path/to/your/syncthing/gps/files\"\nOUTBASE=\"/path/for/sqlite/and/gpx/output\"\nBINGKEY=\"get a bing maps key and insert it here\"\n\ndef parse(row):\n DATE = re.compile(\n r'^(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T'\n r'(?P<time>[0-9]{2}:[0-9]{2}:[0-9]{2})\\.(?P<subsec>[0-9]{3})Z$'\n )\n\n lat = row[0]\n lon = row[1]\n acc = row[2]\n alt = row[3]\n match = DATE.match(row[4])\n # in theory, arrow should have been able to parse the date, but I couldn't get\n # it working\n epoch = arrow.get(\"%s-%s-%s %s %s\" % (\n match.group('year'),\n match.group('month'),\n match.group('day'),\n match.group('time'),\n match.group('subsec')\n ), 'YYYY-MM-DD hh:mm:ss SSS').timestamp\n return(epoch,lat,lon,alt,acc)\n\ndef exists(db, epoch, lat, lon):\n return db.execute('''\n SELECT\n *\n FROM\n data\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n ''', (epoch, lat, lon)).fetchone()\n\ndef ins(db, epoch,lat,lon,alt,acc):\n if exists(db, epoch, lat, lon):\n return\n print('inserting data point with epoch %d' % (epoch))\n db.execute('''INSERT INTO data (epoch, latitude, longitude, altitude, accuracy) VALUES (?,?,?,?,?);''', (\n epoch,\n lat,\n lon,\n alt,\n acc\n ))\n\n\nif __name__ == '__main__':\n db = sqlite3.connect(os.path.join(OUTBASE, 'location-log.sqlite'))\n db.execute('PRAGMA auto_vacuum = INCREMENTAL;')\n db.execute('PRAGMA journal_mode = MEMORY;')\n db.execute('PRAGMA temp_store = MEMORY;')\n db.execute('PRAGMA locking_mode = NORMAL;')\n db.execute('PRAGMA synchronous = FULL;')\n db.execute('PRAGMA encoding = \"UTF-8\";')\n\n files = glob.glob(os.path.join(INBASE, '*.csv'))\n for logfile in files:\n with open(logfile) as csvfile:\n try:\n reader = csv.reader(csvfile)\n except Exception as e:\n print('failed to open CSV reader for file: %s; %s' % (logfile, e))\n continue\n # skip the first row, that's headers\n headers = next(reader, None)\n for row in reader:\n epoch,lat,lon,alt,acc = parse(row)\n ins(db,epoch,lat,lon,alt,acc)\n # there's no need to commit per line, per file should be safe enough\n db.commit()\n\n db.execute('PRAGMA auto_vacuum;')\n\n results = db.execute('''\n SELECT\n *\n FROM\n data\n ORDER BY epoch ASC''').fetchall()\n prevdate = None\n gpx = gpxpy.gpx.GPX()\n\n for epoch, lat, lon, alt, acc in results:\n # in case you know your altitude might actually be valid with negative\n # values you may want to remove the -10\n if alt == 'NULL' or alt < -10:\n url = \"http://dev.virtualearth.net/REST/v1/Elevation/List?points=%s,%s&key=%s\" % (\n lat,\n lon,\n BINGKEY\n )\n bing = requests.get(url).json()\n # gotta love enterprise API endpoints\n if not bing or \\\n 'resourceSets' not in bing or \\\n not len(bing['resourceSets']) or \\\n 'resources' not in bing['resourceSets'][0] or \\\n not len(bing['resourceSets'][0]) or \\\n 'elevations' not in bing['resourceSets'][0]['resources'][0] or \\\n not bing['resourceSets'][0]['resources'][0]['elevations']:\n alt = 0\n else:\n alt = float(bing['resourceSets'][0]['resources'][0]['elevations'][0])\n print('got altitude from bing: %s for %s,%s' % (alt,lat,lon))\n db.execute('''\n UPDATE\n data\n SET\n altitude = ?\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n LIMIT 1\n ''',(alt, epoch, lat, lon))\n db.commit()\n del(bing)\n del(url)\n date = arrow.get(epoch).format('YYYY-MM-DD')\n if not prevdate or prevdate != date:\n # write previous out\n gpxfile = os.path.join(OUTBASE, \"%s.gpx\" % (date))\n with open(gpxfile, 'wt') as f:\n f.write(gpx.to_xml())\n print('created file: %s' % gpxfile)\n\n # create new\n gpx = gpxpy.gpx.GPX()\n prevdate = date\n\n # Create first track in our GPX:\n gpx_track = gpxpy.gpx.GPXTrack()\n gpx.tracks.append(gpx_track)\n\n # Create first segment in our GPX track:\n gpx_segment = gpxpy.gpx.GPXTrackSegment()\n gpx_track.segments.append(gpx_segment)\n\n # Create points:\n gpx_segment.points.append(\n gpxpy.gpx.GPXTrackPoint(\n lat,\n lon,\n elevation=alt,\n time=arrow.get(epoch).datetime\n )\n )\n\n db.close()\n</code></pre>\n<p>Once this is done, the <code>OUTBASE</code> directory will be populated by <code>.gpx</code> files, one per day.</p>\n<h2>GpsPrune</h2>\n<p>GpsPrune is a desktop, QT based GPX track visualizer. It needs data connectivity to have nice maps in the background, but it can do a lot of funky things, including editing GPX tracks.</p>\n<pre><code>sudo apt install gpsprune</code></pre>\n<p><strong>Keep it in mind that the export script overwrites the GPX files, so the data needs to be fixed in the SQLite database.</strong></p>\n<p>This is an example screenshot of GpsPrune, about our 2 day walk down from Mount Emei and it\u2019s endless stairs:</p>\n<a href=\"https://petermolnar.net/location-tracking-without-server/emei_b.png\"> <img src=\"https://aperture-proxy.p3k.io/e4a0b1456e343382f106c8f4e35f5895c110957e/68747470733a2f2f70657465726d6f6c6e61722e6e65742f6c6f636174696f6e2d747261636b696e672d776974686f75742d7365727665722f656d65692e706e67\" title=\"emei\" alt=\"\" /></a>\n\nemei\n<p>Happy tracking!</p>\n\n\n<ol><li><p><a href=\"https://www.traccar.org/\">https://www.traccar.org/</a><a href=\"https://petermolnar.net/#fnref1\">\u21a9</a></p></li>\n<li><p><a href=\"https://owntracks.org/\">https://owntracks.org/</a><a href=\"https://petermolnar.net/#fnref2\">\u21a9</a></p></li>\n<li><p><a href=\"https://indieweb.org/manual_until_it_hurts\">https://indieweb.org/manual_until_it_hurts</a><a href=\"https://petermolnar.net/#fnref3\">\u21a9</a></p></li>\n<li><p><a href=\"http://www.gpsies.com/backitude.do\">http://www.gpsies.com/backitude.do</a><a href=\"https://petermolnar.net/#fnref4\">\u21a9</a></p></li>\n<li><p><a href=\"https://petermolnar.net/gaugler.backitude.apk\">gaugler.backitude.apk</a><a href=\"https://petermolnar.net/#fnref5\">\u21a9</a></p></li>\n<li><p><a href=\"https://syncthing.net/\">https://syncthing.net/</a><a href=\"https://petermolnar.net/#fnref6\">\u21a9</a></p></li>\n<li><p><a href=\"https://petermolnar.net/backitude.prefs\">backitude.prefs</a><a href=\"https://petermolnar.net/#fnref7\">\u21a9</a></p></li>\n<li><p><a href=\"https://docs.syncthing.net/intro/getting-started.html\">https://docs.syncthing.net/intro/getting-started.html</a><a href=\"https://petermolnar.net/#fnref8\">\u21a9</a></p></li>\n<li><p><a href=\"https://msdn.microsoft.com/en-us/library/ff428642\">https://msdn.microsoft.com/en-us/library/ff428642</a><a href=\"https://petermolnar.net/#fnref9\">\u21a9</a></p></li>\n</ol>",
"text": "Nearly all self-hosted location tracking Android applications are based on server-client architecture: the one on the phone collects only a small points, if not only one, and sends it to a configured server. Traccar1, Owntracks2, etc.\nWhile this setup is useful, it doesn\u2019t fit in my static, unless it hurts3 approach, and it needs data connectivity, which can be tricky during abroad trips. The rare occasions in rural Scotland and Wales tought me data connectivity is not omnipresent at all.\nThere used to be a magnificent little location tracker, which, besides the server-client approach, could store the location data in CSV and KML files locally: Backitude4. The program is gone from Play store, I have no idea, why, but I have a copy of the last APK of it5.\nMy flow is the following:\nBackitude saves the CSV files\nSyncthing6 syncs the phone and the laptop\nthe laptop has a Python script that imports the CSV into SQLite to eliminate duplicates\nthe same script queries against Bing to get altitude information for missing altitudes\nas a final step, the script exports daily GPX files\non the laptop, GpsPrune helps me visualize and measure trips\nBackitude configuration\nThese are the modified setting properties:\nEnable backitude: yes\nSettings\nStandard Mode Settings\nTime Interval Selection: 1 minute\nLocation Polling Timeout: 5 minutes\nDisplay update message: no\n\nWifi Mode Settings\nWi-Fi Mode Enabled: yes\nTime Interval Options: 1 hour\nLocation Polling Timeout: 5 minutes\n\nUpdate Settings\nMinimum Change in Distance: 10 meters\n\nAccuracy Settings\nMinimum GPS accuracy: 12 meters\nMinimum Wi-Fi accuracy: 20 meters\n\nInternal Memory Storage Options\nKML and CSV\n\nDisplay Failure Notifications: no\n\nI have an exported preferences file available7.\nSyncthing\nThe syncthing configuration is optional; it could be simple done by manual transfers from the phone. It\u2019s also not the most simple thing to do, so I\u2019ll let the Syncting Documentation8 take care of describing the how-tos.\nPython script\nBefore jumping to the script, there are 3 Python modules it needs:\npip3 install --user arrow gpxpy requests\nAnd the script itself - please replace the INBASE, OUTBASE, and BINGKEY properties. To get a Bing key, visit Bing9.\nimport os\nimport sqlite3\nimport csv\nimport glob\nimport arrow\nimport re\nimport gpxpy.gpx\nimport requests\n\nINBASE=\"/path/to/your/syncthing/gps/files\"\nOUTBASE=\"/path/for/sqlite/and/gpx/output\"\nBINGKEY=\"get a bing maps key and insert it here\"\n\ndef parse(row):\n DATE = re.compile(\n r'^(?P<year>[0-9]{4})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T'\n r'(?P<time>[0-9]{2}:[0-9]{2}:[0-9]{2})\\.(?P<subsec>[0-9]{3})Z$'\n )\n\n lat = row[0]\n lon = row[1]\n acc = row[2]\n alt = row[3]\n match = DATE.match(row[4])\n # in theory, arrow should have been able to parse the date, but I couldn't get\n # it working\n epoch = arrow.get(\"%s-%s-%s %s %s\" % (\n match.group('year'),\n match.group('month'),\n match.group('day'),\n match.group('time'),\n match.group('subsec')\n ), 'YYYY-MM-DD hh:mm:ss SSS').timestamp\n return(epoch,lat,lon,alt,acc)\n\ndef exists(db, epoch, lat, lon):\n return db.execute('''\n SELECT\n *\n FROM\n data\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n ''', (epoch, lat, lon)).fetchone()\n\ndef ins(db, epoch,lat,lon,alt,acc):\n if exists(db, epoch, lat, lon):\n return\n print('inserting data point with epoch %d' % (epoch))\n db.execute('''INSERT INTO data (epoch, latitude, longitude, altitude, accuracy) VALUES (?,?,?,?,?);''', (\n epoch,\n lat,\n lon,\n alt,\n acc\n ))\n\n\nif __name__ == '__main__':\n db = sqlite3.connect(os.path.join(OUTBASE, 'location-log.sqlite'))\n db.execute('PRAGMA auto_vacuum = INCREMENTAL;')\n db.execute('PRAGMA journal_mode = MEMORY;')\n db.execute('PRAGMA temp_store = MEMORY;')\n db.execute('PRAGMA locking_mode = NORMAL;')\n db.execute('PRAGMA synchronous = FULL;')\n db.execute('PRAGMA encoding = \"UTF-8\";')\n\n files = glob.glob(os.path.join(INBASE, '*.csv'))\n for logfile in files:\n with open(logfile) as csvfile:\n try:\n reader = csv.reader(csvfile)\n except Exception as e:\n print('failed to open CSV reader for file: %s; %s' % (logfile, e))\n continue\n # skip the first row, that's headers\n headers = next(reader, None)\n for row in reader:\n epoch,lat,lon,alt,acc = parse(row)\n ins(db,epoch,lat,lon,alt,acc)\n # there's no need to commit per line, per file should be safe enough\n db.commit()\n\n db.execute('PRAGMA auto_vacuum;')\n\n results = db.execute('''\n SELECT\n *\n FROM\n data\n ORDER BY epoch ASC''').fetchall()\n prevdate = None\n gpx = gpxpy.gpx.GPX()\n\n for epoch, lat, lon, alt, acc in results:\n # in case you know your altitude might actually be valid with negative\n # values you may want to remove the -10\n if alt == 'NULL' or alt < -10:\n url = \"http://dev.virtualearth.net/REST/v1/Elevation/List?points=%s,%s&key=%s\" % (\n lat,\n lon,\n BINGKEY\n )\n bing = requests.get(url).json()\n # gotta love enterprise API endpoints\n if not bing or \\\n 'resourceSets' not in bing or \\\n not len(bing['resourceSets']) or \\\n 'resources' not in bing['resourceSets'][0] or \\\n not len(bing['resourceSets'][0]) or \\\n 'elevations' not in bing['resourceSets'][0]['resources'][0] or \\\n not bing['resourceSets'][0]['resources'][0]['elevations']:\n alt = 0\n else:\n alt = float(bing['resourceSets'][0]['resources'][0]['elevations'][0])\n print('got altitude from bing: %s for %s,%s' % (alt,lat,lon))\n db.execute('''\n UPDATE\n data\n SET\n altitude = ?\n WHERE\n epoch = ?\n AND\n latitude = ?\n AND\n longitude = ?\n LIMIT 1\n ''',(alt, epoch, lat, lon))\n db.commit()\n del(bing)\n del(url)\n date = arrow.get(epoch).format('YYYY-MM-DD')\n if not prevdate or prevdate != date:\n # write previous out\n gpxfile = os.path.join(OUTBASE, \"%s.gpx\" % (date))\n with open(gpxfile, 'wt') as f:\n f.write(gpx.to_xml())\n print('created file: %s' % gpxfile)\n\n # create new\n gpx = gpxpy.gpx.GPX()\n prevdate = date\n\n # Create first track in our GPX:\n gpx_track = gpxpy.gpx.GPXTrack()\n gpx.tracks.append(gpx_track)\n\n # Create first segment in our GPX track:\n gpx_segment = gpxpy.gpx.GPXTrackSegment()\n gpx_track.segments.append(gpx_segment)\n\n # Create points:\n gpx_segment.points.append(\n gpxpy.gpx.GPXTrackPoint(\n lat,\n lon,\n elevation=alt,\n time=arrow.get(epoch).datetime\n )\n )\n\n db.close()\n\nOnce this is done, the OUTBASE directory will be populated by .gpx files, one per day.\nGpsPrune\nGpsPrune is a desktop, QT based GPX track visualizer. It needs data connectivity to have nice maps in the background, but it can do a lot of funky things, including editing GPX tracks.\nsudo apt install gpsprune\nKeep it in mind that the export script overwrites the GPX files, so the data needs to be fixed in the SQLite database.\nThis is an example screenshot of GpsPrune, about our 2 day walk down from Mount Emei and it\u2019s endless stairs:\n \n\nemei\nHappy tracking!\n\n\nhttps://www.traccar.org/\u21a9\nhttps://owntracks.org/\u21a9\nhttps://indieweb.org/manual_until_it_hurts\u21a9\nhttp://www.gpsies.com/backitude.do\u21a9\ngaugler.backitude.apk\u21a9\nhttps://syncthing.net/\u21a9\nbackitude.prefs\u21a9\nhttps://docs.syncthing.net/intro/getting-started.html\u21a9\nhttps://msdn.microsoft.com/en-us/library/ff428642\u21a9"
},
"name": "GPS tracking without a server",
"post-type": "article",
"_id": "1087487",
"_source": "268",
"_is_read": true
}
I’ll see what I can do 😀. What time are you hosting it? I’m at GHC until the 28th.
indieweb
ghc
nyc
{
"type": "entry",
"published": "2018-09-26 17:16:48.780835",
"url": "https://kongaloosh.com/e/2018/9/26/ill-see-what-i-can-do",
"syndication": [
"https://kongaloosh.com/"
],
"in-reply-to": [
"http://jgregorymcverry.com/7416-2/"
],
"content": {
"text": "I\u2019ll see what I can do \ud83d\ude00. What time are you hosting it? I\u2019m at GHC until the 28th. \n \n \n \n \n \n \n indieweb\n \n ghc\n \n nyc",
"html": "<p class=\"e-content\"></p><p>I\u2019ll see what I can do \ud83d\ude00. What time are you hosting it? I\u2019m at GHC until the 28th. </p>\n \n \n \n \n <i></i>\n \n <a href=\"https://kongaloosh.com/t/indieweb\">indieweb</a>\n \n <a href=\"https://kongaloosh.com/t/ghc\">ghc</a>\n \n <a href=\"https://kongaloosh.com/t/nyc\">nyc</a>"
},
"author": {
"type": "card",
"name": "Alex Kearney",
"url": "http://kongaloosh.com",
"photo": null
},
"post-type": "reply",
"_id": "1085849",
"_source": "228",
"_is_read": true
}
I’d love to! When are you hosting it?
indieweb
{
"type": "entry",
"published": "2018-09-26 00:00:00",
"url": "https://kongaloosh.com/e/2018/9/26/id-love-to-when-are-you-hosting-it",
"syndication": [
"https://kongaloosh.com/"
],
"in-reply-to": [
"http://jgregorymcverry.com/7416-2/"
],
"content": {
"text": "I\u2019d love to! When are you hosting it?\n \n \n \n \n \n \n indieweb",
"html": "<p class=\"e-content\"></p><p>I\u2019d love to! When are you hosting it?</p>\n \n \n \n \n <i></i>\n \n <a href=\"https://kongaloosh.com/t/indieweb\">indieweb</a>"
},
"author": {
"type": "card",
"name": "Alex Kearney",
"url": "http://kongaloosh.com",
"photo": null
},
"post-type": "reply",
"_id": "1085850",
"_source": "228",
"_is_read": true
}
{
"type": "entry",
"published": "2018-09-26 18:51-0700",
"rsvp": "yes",
"url": "https://gregorlove.com/2018/09/i-attended-indieweb-pre-xoxo-meetup/",
"in-reply-to": [
"https://aaronparecki.com/2018/09/05/5/"
],
"content": {
"text": "I attended \u201cIndieWeb Pre-XOXO Meetup\u201d",
"html": "<p>I attended \u201c<a class=\"u-in-reply-to\" href=\"https://aaronparecki.com/2018/09/05/5/\">IndieWeb Pre-XOXO Meetup</a>\u201d</p>"
},
"author": {
"type": "card",
"name": "gRegor Morrill",
"url": "https://gregorlove.com/",
"photo": "https://aperture-proxy.p3k.io/929c8777d059069a2a16a064d96f4c29b65548f8/68747470733a2f2f677265676f726c6f76652e636f6d2f736974652f6173736574732f66696c65732f333437332f70726f66696c652d323031362d6d65642e6a7067"
},
"post-type": "rsvp",
"_id": "1085745",
"_source": "95",
"_is_read": true
}
🗽 NYC friends!
🕖 Join us for the @IndieWebCamp NYC pre-party at @DeadRabbitNYC tomorrow at 7pm!
🐇 We have a reserved room, so come on by, even if you're not planning to attend IndieWebCamp!
🍻 Drinks thanks to our sponsors!
https://aaronparecki.com/2018/09/27/1/
{
"type": "entry",
"published": "2018-09-26T11:56:13-04:00",
"url": "https://aaronparecki.com/2018/09/26/16/iwc-nyc",
"category": [
"indiewebcamp"
],
"content": {
"text": "\ud83d\uddfd NYC friends! \n\ud83d\udd56 Join us for the @IndieWebCamp NYC pre-party at @DeadRabbitNYC tomorrow at 7pm! \n\ud83d\udc07 We have a reserved room, so come on by, even if you're not planning to attend IndieWebCamp! \n\ud83c\udf7b Drinks thanks to our sponsors! \nhttps://aaronparecki.com/2018/09/27/1/",
"html": "<a href=\"https://aaronparecki.com/emoji/%F0%9F%97%BD\">\ud83d\uddfd</a> NYC friends! <br /><a href=\"https://aaronparecki.com/emoji/%F0%9F%95%96\">\ud83d\udd56</a> Join us for the <a href=\"https://indieweb.org/IndieWebCamps\">@IndieWebCamp</a> NYC pre-party at <a href=\"https://www.deadrabbitnyc.com/\">@DeadRabbitNYC</a> tomorrow at 7pm! <br /><a href=\"https://aaronparecki.com/emoji/%F0%9F%90%87\">\ud83d\udc07</a> We have a reserved room, so come on by, even if you're not planning to attend IndieWebCamp! <br /><a href=\"https://aaronparecki.com/emoji/%F0%9F%8D%BB\">\ud83c\udf7b</a> Drinks thanks to our sponsors! <br /><a href=\"https://aaronparecki.com/2018/09/27/1/\"><span>https://</span>aaronparecki.com/2018/09/27/1/</a>"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/2b8e1668dcd9cfa6a170b3724df740695f73a15c2a825962fd0a0967ec11ecdc.jpg"
},
"post-type": "note",
"_id": "1081689",
"_source": "16",
"_is_read": true
}
Welcome to the Microsub life!
I’ve gone crazy with channels but it makes choosing what I want to consume MUCH easier. On busy days I can just mark entire channels as read and ignore the posts if I feel like it but still check the channels that I know contain info or people important to me.
{
"type": "entry",
"published": "2018-09-26T05:56:47-04:00",
"summary": "Welcome to the Microsub life!\nI\u2019ve gone crazy with channels but it makes choosing what I want to consume MUCH easier. On busy days I can just mark entire channels as read and ignore the posts if I feel like it but still check the channels that I know contain info or people important to me.",
"url": "https://eddiehinkle.com/2018/09/26/11/reply/",
"in-reply-to": [
"https://www.arush.io/94181-2/"
],
"content": {
"text": "Welcome to the Microsub life!\n\nI\u2019ve gone crazy with channels but it makes choosing what I want to consume MUCH easier. On busy days I can just mark entire channels as read and ignore the posts if I feel like it but still check the channels that I know contain info or people important to me.",
"html": "<p>Welcome to the Microsub life!</p>\n\n<p>I\u2019ve gone crazy with channels but it makes choosing what I want to consume MUCH easier. On busy days I can just mark entire channels as read and ignore the posts if I feel like it but still check the channels that I know contain info or people important to me.</p>"
},
"author": {
"type": "card",
"name": "Eddie Hinkle",
"url": "https://eddiehinkle.com/",
"photo": "https://aperture-proxy.p3k.io/cc9591b69c2c835fa2c6e23745b224db4b4b431f/68747470733a2f2f656464696568696e6b6c652e636f6d2f696d616765732f70726f66696c652e6a7067"
},
"post-type": "reply",
"refs": {
"https://www.arush.io/94181-2/": {
"type": "entry",
"url": "https://www.arush.io/94181-2/",
"name": "https://www.arush.io/94181-2/",
"post-type": "article"
}
},
"_id": "1081172",
"_source": "226",
"_is_read": true
}
going to @IndieWebCamp NYC Pre-party this Thursday 2018-09-27 19:00-21:00 @DeadRabbitNYC (deadrabbitnyc.com), an amazing 1850s style bar (nyti.ms/WdOpgc).
NYC friends, come by, ask for #IndieWeb. We have a reserved room!
More info: https://indieweb.org/2018/NYC#Schedule
Thanks @jgmac1106 (jgregorymcverry.com) for the arrangements!
{
"type": "entry",
"published": "2018-09-25 17:17-0700",
"rsvp": "yes",
"url": "http://tantek.com/2018/268/t1/going-to-indiewebcamp-nyc-pre-party",
"category": [
"IndieWeb"
],
"in-reply-to": [
"https://aaronparecki.com/2018/09/27/1/"
],
"content": {
"text": "going to @IndieWebCamp NYC Pre-party this Thursday 2018-09-27 19:00-21:00 @DeadRabbitNYC (deadrabbitnyc.com), an amazing 1850s style bar (nyti.ms/WdOpgc).\n\nNYC friends, come by, ask for #IndieWeb. We have a reserved room!\n\nMore info: https://indieweb.org/2018/NYC#Schedule\n\nThanks @jgmac1106 (jgregorymcverry.com) for the arrangements!",
"html": "going to <a class=\"h-cassis-username\" href=\"https://twitter.com/IndieWebCamp\">@IndieWebCamp</a> NYC Pre-party this Thursday 2018-09-27 19:00-21:00 <a class=\"h-cassis-username\" href=\"https://twitter.com/DeadRabbitNYC\">@DeadRabbitNYC</a> (<a href=\"http://deadrabbitnyc.com\">deadrabbitnyc.com</a>), an amazing 1850s style bar (<a href=\"http://nyti.ms/WdOpgc\">nyti.ms/WdOpgc</a>).<br /><br />NYC friends, come by, ask for #<span class=\"p-category\">IndieWeb</span>. We have a reserved room!<br /><br />More info: <a href=\"https://indieweb.org/2018/NYC#Schedule\">https://indieweb.org/2018/NYC#Schedule</a><br /><br />Thanks <a class=\"h-cassis-username\" href=\"https://twitter.com/jgmac1106\">@jgmac1106</a> (<a href=\"http://jgregorymcverry.com\">jgregorymcverry.com</a>) for the arrangements!"
},
"author": {
"type": "card",
"name": "Tantek \u00c7elik",
"url": "http://tantek.com/",
"photo": "https://aperture-media.p3k.io/tantek.com/acfddd7d8b2c8cf8aa163651432cc1ec7eb8ec2f881942dca963d305eeaaa6b8.jpg"
},
"post-type": "rsvp",
"refs": {
"https://aaronparecki.com/2018/09/27/1/": {
"type": "entry",
"url": "https://aaronparecki.com/2018/09/27/1/",
"name": "aaronparecki.com\u2019s post",
"post-type": "article"
}
},
"_id": "1079146",
"_source": "1",
"_is_read": true
}
Currently microformats are used to add that richness to webmentions. However because webmention is markup agnostic people could start using other data to get the webmention richness. However there hasn’t been a proven better data format yet. 🤷♂️
{
"type": "entry",
"published": "2018-09-25T13:38:13-04:00",
"summary": "Currently microformats are used to add that richness to webmentions. However because webmention is markup agnostic people could start using other data to get the webmention richness. However there hasn\u2019t been a proven better data format yet. \ud83e\udd37\u200d\u2642\ufe0f",
"url": "https://eddiehinkle.com/2018/09/25/25/reply/",
"in-reply-to": [
"https://twitter.com/EddieHinkle/status/1044641518546550786"
],
"content": {
"text": "Currently microformats are used to add that richness to webmentions. However because webmention is markup agnostic people could start using other data to get the webmention richness. However there hasn\u2019t been a proven better data format yet. \ud83e\udd37\u200d\u2642\ufe0f",
"html": "<p>Currently microformats are used to add that richness to webmentions. However because webmention is markup agnostic people could start using other data to get the webmention richness. However there hasn\u2019t been a proven better data format yet. \ud83e\udd37\u200d\u2642\ufe0f</p>"
},
"author": {
"type": "card",
"name": "Eddie Hinkle",
"url": "https://eddiehinkle.com/",
"photo": "https://aperture-proxy.p3k.io/cc9591b69c2c835fa2c6e23745b224db4b4b431f/68747470733a2f2f656464696568696e6b6c652e636f6d2f696d616765732f70726f66696c652e6a7067"
},
"post-type": "reply",
"refs": {
"https://twitter.com/EddieHinkle/status/1044641518546550786": {
"type": "entry",
"url": "https://twitter.com/EddieHinkle/status/1044641518546550786",
"name": "https://twitter.com/EddieHinkle/status/1044641518546550786",
"post-type": "article"
}
},
"_id": "1076613",
"_source": "226",
"_is_read": true
}
Awesome! Webmentions was what originally attracted me to the IndieWeb. you are right, they don’t require microformats. For them to be their best (communicate post intent: like, reply, rsvp, mention) you need some type of data sitting on the src url
{
"type": "entry",
"published": "2018-09-25T13:35:16-04:00",
"summary": "Awesome! Webmentions was what originally attracted me to the IndieWeb. you are right, they don\u2019t require microformats. For them to be their best (communicate post intent: like, reply, rsvp, mention) you need some type of data sitting on the src url",
"url": "https://eddiehinkle.com/2018/09/25/24/reply/",
"in-reply-to": [
"https://twitter.com/tmcw/status/1044419700669575168"
],
"content": {
"text": "Awesome! Webmentions was what originally attracted me to the IndieWeb. you are right, they don\u2019t require microformats. For them to be their best (communicate post intent: like, reply, rsvp, mention) you need some type of data sitting on the src url",
"html": "<p>Awesome! Webmentions was what originally attracted me to the IndieWeb. you are right, they don\u2019t require microformats. For them to be their best (communicate post intent: like, reply, rsvp, mention) you need some type of data sitting on the src url</p>"
},
"author": {
"type": "card",
"name": "Eddie Hinkle",
"url": "https://eddiehinkle.com/",
"photo": "https://aperture-proxy.p3k.io/cc9591b69c2c835fa2c6e23745b224db4b4b431f/68747470733a2f2f656464696568696e6b6c652e636f6d2f696d616765732f70726f66696c652e6a7067"
},
"post-type": "reply",
"refs": {
"https://twitter.com/tmcw/status/1044419700669575168": {
"type": "entry",
"url": "https://twitter.com/tmcw/status/1044419700669575168",
"name": "https://twitter.com/tmcw/status/1044419700669575168",
"post-type": "article"
}
},
"_id": "1076614",
"_source": "226",
"_is_read": true
}
I actually don’t use the micro.blog apps aside from Wavelength. I do everything in my RSS reader and my website. So aside from microcasting, nothing would change if I was on Android. I reply through Webmentions from my site to Micro.blog.
{
"type": "entry",
"published": "2018-09-24T20:54:50-04:00",
"summary": "I actually don\u2019t use the micro.blog apps aside from Wavelength. I do everything in my RSS reader and my website. So aside from microcasting, nothing would change if I was on Android. I reply through Webmentions from my site to Micro.blog.",
"url": "https://eddiehinkle.com/2018/09/24/27/reply/",
"in-reply-to": [
"https://micro.blog/joshsharp/913954"
],
"content": {
"text": "I actually don\u2019t use the micro.blog apps aside from Wavelength. I do everything in my RSS reader and my website. So aside from microcasting, nothing would change if I was on Android. I reply through Webmentions from my site to Micro.blog.",
"html": "<p>I actually don\u2019t use the micro.blog apps aside from Wavelength. I do everything in my RSS reader and my website. So aside from microcasting, nothing would change if I was on Android. I reply through Webmentions from my site to Micro.blog.</p>"
},
"author": {
"type": "card",
"name": "Eddie Hinkle",
"url": "https://eddiehinkle.com/",
"photo": "https://aperture-proxy.p3k.io/cc9591b69c2c835fa2c6e23745b224db4b4b431f/68747470733a2f2f656464696568696e6b6c652e636f6d2f696d616765732f70726f66696c652e6a7067"
},
"post-type": "reply",
"refs": {
"https://micro.blog/joshsharp/913954": {
"type": "entry",
"url": "https://micro.blog/joshsharp/913954",
"name": "https://micro.blog/joshsharp/913954",
"post-type": "article"
}
},
"_id": "1072274",
"_source": "226",
"_is_read": true
}
@jgmac1106 @benwerd consider the glass half-full:
* Lots of @-mentions violate policy? Use domain-mentions!
A little work to get @mlb players domains; surely as celebs they have them.
If(when) they enable Webmentions, they decide instead of Twitter!
{
"type": "entry",
"published": "2018-09-24 18:17-0700",
"url": "http://tantek.com/2018/267/t3/use-domain-mentions-instead",
"in-reply-to": [
"http://jgregorymcverry.com/7359-2/"
],
"content": {
"text": "@jgmac1106 @benwerd consider the glass half-full:\n* Lots of @-mentions violate policy? Use domain-mentions!\nA little work to get @mlb players domains; surely as celebs they have them.\nIf(when) they enable Webmentions, they decide instead of Twitter!",
"html": "<a class=\"h-cassis-username\" href=\"https://twitter.com/jgmac1106\">@jgmac1106</a> <a class=\"h-cassis-username\" href=\"https://twitter.com/benwerd\">@benwerd</a> consider the glass half-full:<br />* Lots of @-mentions violate policy? Use domain-mentions!<br />A little work to get <a class=\"h-cassis-username\" href=\"https://twitter.com/mlb\">@mlb</a> players domains; surely as celebs they have them.<br />If(when) they enable Webmentions, they decide instead of Twitter!"
},
"author": {
"type": "card",
"name": "Tantek \u00c7elik",
"url": "http://tantek.com/",
"photo": "https://aperture-media.p3k.io/tantek.com/acfddd7d8b2c8cf8aa163651432cc1ec7eb8ec2f881942dca963d305eeaaa6b8.jpg"
},
"post-type": "reply",
"refs": {
"http://jgregorymcverry.com/7359-2/": {
"type": "entry",
"url": "http://jgregorymcverry.com/7359-2/",
"name": "jgregorymcverry.com\u2019s post",
"post-type": "article"
}
},
"_id": "1072260",
"_source": "1",
"_is_read": true
}
going to @IndieWebCamp New York City 2018-09-28…29!
Complimentary tickets sold out but organizers were able to release another small batch.
Grab one before they’re gone:
https://ti.to/indieweb/indiewebcamp-nyc
More info: https://indieweb.org/2018/NYC
{
"type": "entry",
"published": "2018-09-24 17:59-0700",
"rsvp": "yes",
"url": "http://tantek.com/2018/267/t2/going-to-indiewebcamp-new-york-city",
"in-reply-to": [
"http://quickthoughts.jgregorymcverry.com/2018/09/25/indiewebcamp-nyc"
],
"content": {
"text": "going to @IndieWebCamp New York City 2018-09-28\u202629! \n\nComplimentary tickets sold out but organizers were able to release another small batch. \nGrab one before they\u2019re gone: \nhttps://ti.to/indieweb/indiewebcamp-nyc\n\nMore info: https://indieweb.org/2018/NYC",
"html": "going to <a class=\"h-cassis-username\" href=\"https://twitter.com/IndieWebCamp\">@IndieWebCamp</a> New York City 2018-09-28\u202629! <br /><br />Complimentary tickets sold out but organizers were able to release another small batch. <br />Grab one before they\u2019re gone: <br /><a href=\"https://ti.to/indieweb/indiewebcamp-nyc\">https://ti.to/indieweb/indiewebcamp-nyc</a><br /><br />More info: <a href=\"https://indieweb.org/2018/NYC\">https://indieweb.org/2018/NYC</a>"
},
"author": {
"type": "card",
"name": "Tantek \u00c7elik",
"url": "http://tantek.com/",
"photo": "https://aperture-media.p3k.io/tantek.com/acfddd7d8b2c8cf8aa163651432cc1ec7eb8ec2f881942dca963d305eeaaa6b8.jpg"
},
"post-type": "rsvp",
"refs": {
"http://quickthoughts.jgregorymcverry.com/2018/09/25/indiewebcamp-nyc": {
"type": "entry",
"url": "http://quickthoughts.jgregorymcverry.com/2018/09/25/indiewebcamp-nyc",
"name": "quickthoughts.jgregorymcverry.com\u2019s post",
"post-type": "article"
}
},
"_id": "1072261",
"_source": "1",
"_is_read": true
}