ActivityPub Viewer

A small tool to view real-world ActivityPub objects as JSON! Enter a URL or username from Mastodon or a similar service below, and we'll send a request with the right Accept header to the server to view the underlying object.

Open in browser →
{ "@context": [ "https://www.w3.org/ns/activitystreams" ], "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/outbox", "generator": "http://wordpress.org/?v=6.7", "actor": "https://roosenmaallen.com/?author=0", "type": "OrderedCollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/outbox", "totalItems": 53, "first": "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/outbox?page=1", "last": "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/outbox?page=6", "next": "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/outbox?page=2", "orderedItems": [ { "id": "https://roosenmaallen.com/?p=445#activity-create-2024-11-22T17:12:23Z", "type": "Create", "published": "2024-11-22T17:12:23Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/?p=445", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Knuckle Tats</h2><p>I made this a while back for a Fedi shitpost, and it&#8217;s still fun. </p><p><a href=\"https://roosenmaallen.com/tats\">https://roosenmaallen.com/tats</a></p><p>Let me know if you do something fun with it!</p>", "contentMap": { "en": "<h2>Knuckle Tats</h2><p>I made this a while back for a Fedi shitpost, and it&#8217;s still fun. </p><p><a href=\"https://roosenmaallen.com/tats\">https://roosenmaallen.com/tats</a></p><p>Let me know if you do something fun with it!</p>" }, "published": "2024-11-22T17:12:23Z", "tag": [], "url": "https://roosenmaallen.com/2024/11/22/knuckle-tats/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/445/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/445/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/445/replies", "items": [ "https://wandering.shop/users/silvermoon82/statuses/113527727084630968", "https://wandering.shop/users/silvermoon82/statuses/113527748129860703" ] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/?p=442#activity-create-2024-11-15T16:18:33Z", "type": "Create", "published": "2024-11-15T16:18:30Z", "updated": "2024-11-15T16:18:33Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/?p=442", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>New Toy: Towne Crier</h2><p>Following up on <a href=\"https://blob.love/@nora/113461417107781512\">a fedi post</a>, I made a website shell to display random article summaries/links.</p><p><a href=\"https://gitlab.com/eroosenmaallen/towne-crier\">https://gitlab.com/eroosenmaallen/towne-crier</a> </p><p>Articles are input as text files, the a build script compiles them into JSON and puts them into the site; the repo includes a gitlab-ci script to publish the output to GitLab Pages.</p><p>I hope it might be useful to somebody.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>", "contentMap": { "en": "<h2>New Toy: Towne Crier</h2><p>Following up on <a href=\"https://blob.love/@nora/113461417107781512\">a fedi post</a>, I made a website shell to display random article summaries/links.</p><p><a href=\"https://gitlab.com/eroosenmaallen/towne-crier\">https://gitlab.com/eroosenmaallen/towne-crier</a> </p><p>Articles are input as text files, the a build script compiles them into JSON and puts them into the site; the repo includes a gitlab-ci script to publish the output to GitLab Pages.</p><p>I hope it might be useful to somebody.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>" }, "published": "2024-11-15T16:18:30Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/code/", "name": "#Code" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/javascript/", "name": "#JavaScript" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/web/", "name": "#Web" } ], "updated": "2024-11-15T16:18:33Z", "url": "https://roosenmaallen.com/2024/11/15/new-toy-towne-crier/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/442/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/442/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/442/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/?p=434#activity-create-2024-11-06T17:29:23Z", "type": "Create", "published": "2024-11-06T17:29:21Z", "updated": "2024-11-06T17:29:23Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers", "https://mastodon.art/users/CheerLights" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/?p=434", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>CheerLights 2024</h2><p>After some configuration sadness, the CheerLights fedi bot is back up and running, now at <a href=\"https://mastodon.art/@CheerLights\">@CheerLights@mastodon.art</a>.</p><p>In a Fedi post, mention the bot or the hashtag <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/cheerlights/\">#CheerLights</a> along with a colour (blue!), and connected RGB lights all over the world will change together.</p><p>Remember, even when things seem bad, <strong>we are all connected</strong>.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/cheerlights/\">#CheerLights</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>", "contentMap": { "en": "<h2>CheerLights 2024</h2><p>After some configuration sadness, the CheerLights fedi bot is back up and running, now at <a href=\"https://mastodon.art/@CheerLights\">@CheerLights@mastodon.art</a>.</p><p>In a Fedi post, mention the bot or the hashtag <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/cheerlights/\">#CheerLights</a> along with a colour (blue!), and connected RGB lights all over the world will change together.</p><p>Remember, even when things seem bad, <strong>we are all connected</strong>.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/cheerlights/\">#CheerLights</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>" }, "published": "2024-11-06T17:29:21Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/cheerlights/", "name": "#CheerLights" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/web/", "name": "#Web" }, { "type": "Mention", "href": "https://mastodon.art/users/CheerLights", "name": "@CheerLights@mastodon.art" } ], "updated": "2024-11-06T17:29:23Z", "url": "https://roosenmaallen.com/2024/11/06/cheerlights-2024/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers", "https://mastodon.art/users/CheerLights" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/434/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/434/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/434/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/?p=431#activity-create-2024-11-03T16:39:27Z", "type": "Create", "published": "2024-11-03T16:39:24Z", "updated": "2024-11-03T16:39:27Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers", "https://mas.to/users/CheerLights", "https://mas.to/users/Multiverse", "https://mas.to/users/covid_ygk", "https://mas.to/users/sun_tzu_ebooks" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/?p=431", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>2024, the Great Bot Migration</h2><p>With the <a href=\"https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/\" data-type=\"link\" data-id=\"https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/\">announced shutdown</a> of botsin.space, I have moved my stable of friendly bots over to <a href=\"https://mas.to\">https://mas.to</a>.</p><p><!--more--></p><p>My current pack includes:</p><p>CheerLights, <a href=\"https://mas.toi/@CheerLights\">@cheerlights@mas.to</a> &#8211; control RGB lights all over the world with the <a href=\"https://cheerlights.com\">CheerLights </a>network. We Are All Connected!</p><p>Multiverse Coordinates, <a href=\"https://mas.toi/@Multiverse\">@Multiverse@mas.to</a> &#8211; In an infinite multiverse, it&#8217;s nice to know where you are. This bot plays with the Mandela effect, proposing points in the infinite branching multiverse where different cominations of facts are true. Bowie is still alive, and Rober Downey Junior played James Bond? Somewhere, that&#8217;s possible! This bot is interactive, accepting facts from users to be (vetted and) added to the database.</p><p>Covid Kingston, <a href=\"https://mas.toi/@covid_ygk\">@covid_ygk@mas.to</a> &#8211; this is my daily covid data bot. It scrapes data from Kingston Health Science Center to report hospital covid levels in Kingston, Ontario. The bot has additional tools to retrieve data feeds from Ontario Public Health, but those feeds are no longer active.</p><p>Sun Tsu&#8217;s The Art of eBooks, <a href=\"https://mas.toi/@sun_tzu_ebooks\">@sun_tzu_ebooks@mas.to</a> &#8211; this one is a silly Markov bot trained on The Art of War. It is, by design, not a very good language model so the results are only accidentally coherent. This is my nod to the classic Twitter performance piece, Horse eBooks.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastobot/\">#MastoBot</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/social-web/\">#SocialWeb</a></p>", "contentMap": { "en": "<h2>2024, the Great Bot Migration</h2><p>With the <a href=\"https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/\" data-type=\"link\" data-id=\"https://muffinlabs.com/posts/2024/10/29/10-29-rip-botsin-space/\">announced shutdown</a> of botsin.space, I have moved my stable of friendly bots over to <a href=\"https://mas.to\">https://mas.to</a>.</p><p><!--more--></p><p>My current pack includes:</p><p>CheerLights, <a href=\"https://mas.toi/@CheerLights\">@cheerlights@mas.to</a> &#8211; control RGB lights all over the world with the <a href=\"https://cheerlights.com\">CheerLights </a>network. We Are All Connected!</p><p>Multiverse Coordinates, <a href=\"https://mas.toi/@Multiverse\">@Multiverse@mas.to</a> &#8211; In an infinite multiverse, it&#8217;s nice to know where you are. This bot plays with the Mandela effect, proposing points in the infinite branching multiverse where different cominations of facts are true. Bowie is still alive, and Rober Downey Junior played James Bond? Somewhere, that&#8217;s possible! This bot is interactive, accepting facts from users to be (vetted and) added to the database.</p><p>Covid Kingston, <a href=\"https://mas.toi/@covid_ygk\">@covid_ygk@mas.to</a> &#8211; this is my daily covid data bot. It scrapes data from Kingston Health Science Center to report hospital covid levels in Kingston, Ontario. The bot has additional tools to retrieve data feeds from Ontario Public Health, but those feeds are no longer active.</p><p>Sun Tsu&#8217;s The Art of eBooks, <a href=\"https://mas.toi/@sun_tzu_ebooks\">@sun_tzu_ebooks@mas.to</a> &#8211; this one is a silly Markov bot trained on The Art of War. It is, by design, not a very good language model so the results are only accidentally coherent. This is my nod to the classic Twitter performance piece, Horse eBooks.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastobot/\">#MastoBot</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/social-web/\">#SocialWeb</a></p>" }, "published": "2024-11-03T16:39:24Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/code/", "name": "#Code" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/javascript/", "name": "#JavaScript" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/mastobot/", "name": "#MastoBot" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/social-web/", "name": "#SocialWeb" }, { "type": "Mention", "href": "https://mas.to/users/CheerLights", "name": "@cheerlights@mas.to" }, { "type": "Mention", "href": "https://mas.to/users/Multiverse", "name": "@Multiverse@mas.to" }, { "type": "Mention", "href": "https://mas.to/users/covid_ygk", "name": "@covid_ygk@mas.to" }, { "type": "Mention", "href": "https://mas.to/users/sun_tzu_ebooks", "name": "@sun_tzu_ebooks@mas.to" } ], "updated": "2024-11-03T16:39:27Z", "url": "https://roosenmaallen.com/2024/11/03/2024-the-great-bot-migration/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers", "https://mas.to/users/CheerLights", "https://mas.to/users/Multiverse", "https://mas.to/users/covid_ygk", "https://mas.to/users/sun_tzu_ebooks" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/431/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/431/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/431/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/?p=430#activity-create-2024-11-02T21:29:29Z", "type": "Create", "published": "2024-11-02T21:29:29Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/?p=430", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Statistically Probable Ancient Wisdom</h2><p>I’m pleased to announce the launch of my latest Mastodon bot, <a href=\"https://mas.to/@sun_tzu_ebooks\">Sun Tzu’s The Art of eBooks </a>. It’s a Markov chain bot trained on (you guessed it) The Art of War. </p><p><!--more--></p><p>I’ve also published the code on GitLab, as a simple starting point if others want to stand up a Markov bot with their own corpus. </p><p>For future development, I’m curious to make or see a tool to import an old Twitter archive and reformat it into a one-line-per-post text file, the format this script expects. </p><p>The code lives on my GitLab at <a href=\"https://gitlab.com/eroosenmaallen/sun-tzu-ebooks\">https://gitlab.com/eroosenmaallen/sun-tzu-ebooks</a>. </p><p>As always, feedback is welcome!</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/bot/\">#Bot</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/markov/\">#Markov</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastobot/\">#MastoBot</a></p>", "contentMap": { "en": "<h2>Statistically Probable Ancient Wisdom</h2><p>I’m pleased to announce the launch of my latest Mastodon bot, <a href=\"https://mas.to/@sun_tzu_ebooks\">Sun Tzu’s The Art of eBooks </a>. It’s a Markov chain bot trained on (you guessed it) The Art of War. </p><p><!--more--></p><p>I’ve also published the code on GitLab, as a simple starting point if others want to stand up a Markov bot with their own corpus. </p><p>For future development, I’m curious to make or see a tool to import an old Twitter archive and reformat it into a one-line-per-post text file, the format this script expects. </p><p>The code lives on my GitLab at <a href=\"https://gitlab.com/eroosenmaallen/sun-tzu-ebooks\">https://gitlab.com/eroosenmaallen/sun-tzu-ebooks</a>. </p><p>As always, feedback is welcome!</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/bot/\">#Bot</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/markov/\">#Markov</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastobot/\">#MastoBot</a></p>" }, "published": "2024-11-02T21:29:29Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/bot/", "name": "#Bot" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/markov/", "name": "#Markov" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/mastobot/", "name": "#MastoBot" } ], "url": "https://roosenmaallen.com/2024/11/02/statistically-probable-ancient-wisdom/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/430/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/430/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/430/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/2024/02/07/mutual-aid-options-in-canada/#activity-create-2024-02-07T14:12:54Z", "type": "Create", "published": "2024-02-07T14:12:54Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/2024/02/07/mutual-aid-options-in-canada/", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Mutual Aid Options in Canada</h2><p><em>“We support us”</em></p><p>This is the punk ethos running through so many of the communities I’m a part of or associated with. We take care of each other, and in a capitalist hellworld that means moving money around. </p><p><!--more--></p><p>Moving money today means using a third party service if some sort, you can’t pass a $20 bill through ActivityPub. The Wars on Terror, Drugs, etc mean those services are beholden to tracking and reporting requirements, making things much harder for all of us. Each service has its own benefits, cons, and costs. </p><p>The main options here are PayPal, Stripe, and Interac email transfers. </p><h3 class=\"wp-block-heading\">PayPal</h3><p>The good: relatively quick payouts, international</p><p>The bad: Deadnames, data collection and retention</p><p><a href=\"https://paypal.me/eroosenmaallen\">PayPal I</a> is about the most mature way to e-transfer money in Canada. Transfers to bank accounts are fairly fast (I usually see it in 2-3 days), or instant for supported bank cards (not BMO, I haven’t found a list). The downside is that they cling to your deadname like Di Caprio in that boat movie, and they will show it to everyone you send money to.</p><p>PayPal pushes donors to have an account, and they collect and retain a mountain of data on everyone they can. </p><h2 class=\"wp-block-heading\">Stripe</h2><p>The good: not PayPal, international, good name policy</p><p>The bad: can be slow</p><p><a href=\"https://stripe.com\">Stripe</a> is a payment platform that’s available via Ko-Fi, and also allows users to set up direct payment/donation links. They support instant payouts for a small number of banks (TD, Royal, CIBC, not BMO) but otherwise it can take up to a week, which may be a problem in a mutual aid “I’m hungry today” situation. </p><p>One area Stripe is head and shoulders above the competition is their name policy. Most Stripe transactions I see are from “unnamed customer”, with a couple more whose names match their Fediverse accounts. No apparent “Steve Deadname” transactions, which is nice for everyone. </p><h2 class=\"wp-block-heading\">Interac Email</h2><p>The good: instant, cheap or free</p><p>The bad: deadnames, Canadian only</p><p>Available to most Canadian bank accounts, Interac email transfers are pretty great. They’re cheap or free to send, instant or nearly so (they can take up to a few hours if the network is busy), and can go to &amp; from pretty much any bank account in Canada. The main downsides are that they require a Canadian bank account, and it will show the recipient the name your bank has on file. </p><h2 class=\"wp-block-heading\">Ko-Fi</h2><p>The good: convenient, adds a community, sad-trombone-but-they-tried name policy</p><p>The bad: another layer of fees, beholden to payment processor’s deadname policy</p><p><a href=\"https://ko-fi.com/silvermoon82\">Ko-Fi</a> is a crowdfunding platform that adds community and marketing tools in front of the actual payment platform. It backends on PayPal and/or Stripe (and offers turnkey Stripe setup if you don’t already have an account there; it’s super convenient). </p><p>Ko-Fi uses the name the donor provides, but then the payment processor does their own thing; I have a pile of Ko-Fi emails from “Mrs. Linda Really” with matching PayPal emails from “Steve Deadname”. It’s impolite, but at least they tried. </p><p>Anyway, I hope this is helpful. </p><p>Please do comment if you know other options available here, or have thoughts to add. </p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/kofi/\">#KoFi</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mutualaid/\">#MutualAid</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/paypal/\">#PayPal</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/stripe/\">#Stripe</a></p>", "contentMap": { "en": "<h2>Mutual Aid Options in Canada</h2><p><em>“We support us”</em></p><p>This is the punk ethos running through so many of the communities I’m a part of or associated with. We take care of each other, and in a capitalist hellworld that means moving money around. </p><p><!--more--></p><p>Moving money today means using a third party service if some sort, you can’t pass a $20 bill through ActivityPub. The Wars on Terror, Drugs, etc mean those services are beholden to tracking and reporting requirements, making things much harder for all of us. Each service has its own benefits, cons, and costs. </p><p>The main options here are PayPal, Stripe, and Interac email transfers. </p><h3 class=\"wp-block-heading\">PayPal</h3><p>The good: relatively quick payouts, international</p><p>The bad: Deadnames, data collection and retention</p><p><a href=\"https://paypal.me/eroosenmaallen\">PayPal I</a> is about the most mature way to e-transfer money in Canada. Transfers to bank accounts are fairly fast (I usually see it in 2-3 days), or instant for supported bank cards (not BMO, I haven’t found a list). The downside is that they cling to your deadname like Di Caprio in that boat movie, and they will show it to everyone you send money to.</p><p>PayPal pushes donors to have an account, and they collect and retain a mountain of data on everyone they can. </p><h2 class=\"wp-block-heading\">Stripe</h2><p>The good: not PayPal, international, good name policy</p><p>The bad: can be slow</p><p><a href=\"https://stripe.com\">Stripe</a> is a payment platform that’s available via Ko-Fi, and also allows users to set up direct payment/donation links. They support instant payouts for a small number of banks (TD, Royal, CIBC, not BMO) but otherwise it can take up to a week, which may be a problem in a mutual aid “I’m hungry today” situation. </p><p>One area Stripe is head and shoulders above the competition is their name policy. Most Stripe transactions I see are from “unnamed customer”, with a couple more whose names match their Fediverse accounts. No apparent “Steve Deadname” transactions, which is nice for everyone. </p><h2 class=\"wp-block-heading\">Interac Email</h2><p>The good: instant, cheap or free</p><p>The bad: deadnames, Canadian only</p><p>Available to most Canadian bank accounts, Interac email transfers are pretty great. They’re cheap or free to send, instant or nearly so (they can take up to a few hours if the network is busy), and can go to &amp; from pretty much any bank account in Canada. The main downsides are that they require a Canadian bank account, and it will show the recipient the name your bank has on file. </p><h2 class=\"wp-block-heading\">Ko-Fi</h2><p>The good: convenient, adds a community, sad-trombone-but-they-tried name policy</p><p>The bad: another layer of fees, beholden to payment processor’s deadname policy</p><p><a href=\"https://ko-fi.com/silvermoon82\">Ko-Fi</a> is a crowdfunding platform that adds community and marketing tools in front of the actual payment platform. It backends on PayPal and/or Stripe (and offers turnkey Stripe setup if you don’t already have an account there; it’s super convenient). </p><p>Ko-Fi uses the name the donor provides, but then the payment processor does their own thing; I have a pile of Ko-Fi emails from “Mrs. Linda Really” with matching PayPal emails from “Steve Deadname”. It’s impolite, but at least they tried. </p><p>Anyway, I hope this is helpful. </p><p>Please do comment if you know other options available here, or have thoughts to add. </p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/kofi/\">#KoFi</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mutualaid/\">#MutualAid</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/paypal/\">#PayPal</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/stripe/\">#Stripe</a></p>" }, "published": "2024-02-07T14:12:54Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/kofi/", "name": "#KoFi" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/mutualaid/", "name": "#MutualAid" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/paypal/", "name": "#PayPal" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/stripe/", "name": "#Stripe" } ], "url": "https://roosenmaallen.com/2024/02/07/mutual-aid-options-in-canada/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/363/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/363/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/363/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/2023/08/10/unix-principle-dont-prevent-foolish-things-because-that-prevents-clever-things/#activity-create-2023-08-10T20:11:32Z", "type": "Create", "published": "2023-08-10T20:11:29Z", "updated": "2023-08-10T20:11:32Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/2023/08/10/unix-principle-dont-prevent-foolish-things-because-that-prevents-clever-things/", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Unix Principle: Don&#8217;t prevent foolish things, because that prevents clever things</h2><p>Application group at dayjob ran into a guardrail today.<br />They need an FE-generated ID token, low-security, unique in a low-volume setting. Sounds like a UUID to me!<br />But.<br />`crypto.randomUUID()`, in order to prevent low-security IDs being used where high-security is needed, is not accessible outside a secure context, and the application in question runs in an insecure context.<br />On the core team, our go-to &#8220;unique-enough id&#8221; is nanoid. nanoid is pretty spiffy; if available, it&#8217;ll use the browser crypto API to generate good-quality entropy and good random numbers. But! If not available, it&#8217;ll fall back, all the way to Math.random() if it needs to.<br />Secure? No! But not everything is a health info transfer, sometimes we just need a quick and handy number to tie some stuff together.</p><p>Moral of the story:<br />If you prevent your user (user-developer) doing dangerous things, you&#8217;ll also prevent them doing clever things. Document the scary bits and mark the holes, but don&#8217;t put up impassible guardrails or users will just find another way.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a></p>", "contentMap": { "en": "<h2>Unix Principle: Don&#8217;t prevent foolish things, because that prevents clever things</h2><p>Application group at dayjob ran into a guardrail today.<br />They need an FE-generated ID token, low-security, unique in a low-volume setting. Sounds like a UUID to me!<br />But.<br />`crypto.randomUUID()`, in order to prevent low-security IDs being used where high-security is needed, is not accessible outside a secure context, and the application in question runs in an insecure context.<br />On the core team, our go-to &#8220;unique-enough id&#8221; is nanoid. nanoid is pretty spiffy; if available, it&#8217;ll use the browser crypto API to generate good-quality entropy and good random numbers. But! If not available, it&#8217;ll fall back, all the way to Math.random() if it needs to.<br />Secure? No! But not everything is a health info transfer, sometimes we just need a quick and handy number to tie some stuff together.</p><p>Moral of the story:<br />If you prevent your user (user-developer) doing dangerous things, you&#8217;ll also prevent them doing clever things. Document the scary bits and mark the holes, but don&#8217;t put up impassible guardrails or users will just find another way.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/javascript/\">#JavaScript</a></p>" }, "published": "2023-08-10T20:11:29Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/code/", "name": "#Code" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/javascript/", "name": "#JavaScript" } ], "updated": "2023-08-10T20:11:32Z", "url": "https://roosenmaallen.com/2023/08/10/unix-principle-dont-prevent-foolish-things-because-that-prevents-clever-things/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/322/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/322/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/322/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/2023/05/17/international-day-against-homophobia-transphobia-and-biphobia/#activity-create-2023-05-17T13:45:17Z", "type": "Create", "published": "2023-05-17T13:45:17Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/2023/05/17/international-day-against-homophobia-transphobia-and-biphobia/", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>International Day Against Homophobia, Transphobia, and Biphobia</h2><p>Today is the International Day Against Homophobia, Transphobia, and Biphobia.</p><blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>The date of 17 May was specifically chosen to commemorate the World Health Organization’s decision in 1990 to declassify homosexuality as a mental disorder.</p><p>The Day represents a major global annual landmark to draw the attention of decision makers, the media, the public, corporations, opinion leaders, local authorities, etc. to the alarming situation faced by people with diverse sexual orientations, gender identities or expressions, and sex characteristics.</p></blockquote><p>The world has changed a lot, even just in my lifetime, but there is still a long way to go. We still face systemic and personal discrimination and violence. We still need allies to stand beside us and demand change, until every person has the same right to safety and life, no matter who or how we love.</p><p><a href=\"https://may17.org/about/\">https://may17.org/about/</a></p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/lgbt/\">#LGBT</a></p>", "contentMap": { "en": "<h2>International Day Against Homophobia, Transphobia, and Biphobia</h2><p>Today is the International Day Against Homophobia, Transphobia, and Biphobia.</p><blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>The date of 17 May was specifically chosen to commemorate the World Health Organization’s decision in 1990 to declassify homosexuality as a mental disorder.</p><p>The Day represents a major global annual landmark to draw the attention of decision makers, the media, the public, corporations, opinion leaders, local authorities, etc. to the alarming situation faced by people with diverse sexual orientations, gender identities or expressions, and sex characteristics.</p></blockquote><p>The world has changed a lot, even just in my lifetime, but there is still a long way to go. We still face systemic and personal discrimination and violence. We still need allies to stand beside us and demand change, until every person has the same right to safety and life, no matter who or how we love.</p><p><a href=\"https://may17.org/about/\">https://may17.org/about/</a></p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/lgbt/\">#LGBT</a></p>" }, "published": "2023-05-17T13:45:17Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/lgbt/", "name": "#LGBT" } ], "url": "https://roosenmaallen.com/2023/05/17/international-day-against-homophobia-transphobia-and-biphobia/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/320/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/320/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/320/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/2023/01/13/bike-display-replacement/#activity-create-2023-01-14T14:26:11Z", "type": "Create", "published": "2023-01-13T15:54:09Z", "updated": "2023-01-14T14:26:11Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/2023/01/13/bike-display-replacement/", "type": "Note", "attachment": [ { "type": "Image", "url": "https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=840%2C630&#038;ssl=1", "mediaType": "image/jpeg", "name": "Front of the display, mounted to the bike, with the display showing an active ride." }, { "type": "Image", "url": "https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=840%2C630&#038;ssl=1", "mediaType": "image/jpeg", "name": "The first prototype, an Uno+breadboard construct. The screen shows “Welcome to EddieBike”, illustrating once again that technologists should not name things." }, { "type": "Image", "url": "https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=840%2C630&#038;ssl=1", "mediaType": "image/jpeg", "name": "Fritzing window showing the Platonic ideal for the main perfboard circuit." } ], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Bike Display Replacement</h2><p>As part of our recent moves toward better fitness, my partner &amp; I picked up a secondhand exercise bike in the fall. Nice enough bike, but batteries were left in the display module when it went into storage, so it was dead when we got it. Enter the Arduino nerd; I set out to build a replacement module.</p><p><!--more--></p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"310\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_161332_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673540014&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;2000&quot;,&quot;shutter_speed&quot;:&quot;0.066666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_161332_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original.jpg?resize=840%2C630&#038;ssl=1\" class=\"wp-image-310\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The assembled device, mounted on the bike</figcaption></figure><p>First task was to figure out the cadence sensor. On this bike it’s connected via a 3.5mm TS plug. I overthought this one an awful lot; I was thinking some sort of magnetic-sensing coil or 1-wire hall-effect sensor or something; so I did a bunch of awkward trial and error with my multimeter before I found mention of bikes using a magnetic reed switch. So simple! Magnet on the flywheel and a reed switch in the housing; at a certain point in the rotation the switch closes. Dead simple. </p><p>In firmware, I set the cadence pin mode to INPUT_PULLUP and attach an interrupt handler on the falling edge. The handler sets a global variable to the current timestamp and starts the rotation timer. In the main loop, we check that global flag; if it’s set then we copy the value to a local variable and clear the global, then do our “on rotation” stuff: increment the distance, calculate the time for a rotation and invert that to get the rpm, and we EMA the new rpm into our moving average. </p><figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"309\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_144506_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673534707&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_144506_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original.jpg?resize=840%2C630&#038;ssl=1\" alt=\"\" class=\"wp-image-309\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The original Uno + breadboard prototype</figcaption></figure><p>The first prototype hardware was a little over complicated; I used an external pull-down resistor for the cadence sensor; in the current revision I use the Arduino’s internal pull-up. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"311\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230105_144834_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1672930114&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.0083&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230105_144834_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original.jpg?resize=840%2C630&#038;ssl=1\" class=\"wp-image-311\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The perfboard design in Fritzing</figcaption></figure><p>I used Fritzing to design the perfboard layout. There are some differences between the Fritzing and real-life layouts; the real board only allows one wire per hole, so there are some nasty big solder bridges in real life, where the design shows nicely-tidy joints like the nest of ground connections near the middle. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"312\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230109_144327_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673275408&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.025&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230109_144327_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-312\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">Early stages of soldering</figcaption></figure><p>Perfboard is kind of nasty to work with &#8211; you end up making a lot of solder busses, and if you use both sides you can end up with surface-mount sadness mixed in. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"313\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230110_140856_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673359738&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;400&quot;,&quot;shutter_speed&quot;:&quot;0.016666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230110_140856_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-313\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">Solder busses! Solder busses everywhere!</figcaption></figure><p>Because of space constraints, it wasn’t practical to mount the Arduino right on the board. What I settled on was a wiring harness to a pair of 8-pin Dupont headers. I had some trouble with the headers for the input wires, and currently they are bare socket headers shoved onto the pins, while the lower header still has its 8-pin shroud. If this proves unstable and wiggles loose, my next plan is to take the headers off the wires and the nano, and solder the harness in directly. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"314\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_143450_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673534090&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_143450_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-314\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">All wired up and mounted in the case</figcaption></figure><p>Currently, the display shows all available information (current rpm &amp; speed, riding time, and distance) at once, but I’m thinking to make separate screens with larger (and more readable) text, using the front panel button to toggle through like the original unit did. I’m also planning a kmh/mph toggle (long-press the button to switch). </p><p>I’ve published the code and Fritzing files <a href=\"https://gitlab.com/eroosenmaallen/eddie-bike\">On GitLab</a>; I welcome any feedback, suggestions, or questions. If you build your own, let me know!</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/arduino/\">#Arduino</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/diy/\">#DIY</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/fitness/\">#Fitness</a></p>", "contentMap": { "en": "<h2>Bike Display Replacement</h2><p>As part of our recent moves toward better fitness, my partner &amp; I picked up a secondhand exercise bike in the fall. Nice enough bike, but batteries were left in the display module when it went into storage, so it was dead when we got it. Enter the Arduino nerd; I set out to build a replacement module.</p><p><!--more--></p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"310\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_161332_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673540014&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;2000&quot;,&quot;shutter_speed&quot;:&quot;0.066666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_161332_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original.jpg?resize=840%2C630&#038;ssl=1\" class=\"wp-image-310\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_161332_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The assembled device, mounted on the bike</figcaption></figure><p>First task was to figure out the cadence sensor. On this bike it’s connected via a 3.5mm TS plug. I overthought this one an awful lot; I was thinking some sort of magnetic-sensing coil or 1-wire hall-effect sensor or something; so I did a bunch of awkward trial and error with my multimeter before I found mention of bikes using a magnetic reed switch. So simple! Magnet on the flywheel and a reed switch in the housing; at a certain point in the rotation the switch closes. Dead simple. </p><p>In firmware, I set the cadence pin mode to INPUT_PULLUP and attach an interrupt handler on the falling edge. The handler sets a global variable to the current timestamp and starts the rotation timer. In the main loop, we check that global flag; if it’s set then we copy the value to a local variable and clear the global, then do our “on rotation” stuff: increment the distance, calculate the time for a rotation and invert that to get the rpm, and we EMA the new rpm into our moving average. </p><figure class=\"wp-block-image\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"309\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_144506_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673534707&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.033333333333333&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_144506_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original.jpg?resize=840%2C630&#038;ssl=1\" alt=\"\" class=\"wp-image-309\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_144506_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The original Uno + breadboard prototype</figcaption></figure><p>The first prototype hardware was a little over complicated; I used an external pull-down resistor for the cadence sensor; in the current revision I use the Arduino’s internal pull-up. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"840\" height=\"630\" data-attachment-id=\"311\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230105_144834_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=2560%2C1920&amp;ssl=1\" data-orig-size=\"2560,1920\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1672930114&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;80&quot;,&quot;shutter_speed&quot;:&quot;0.0083&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230105_144834_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=300%2C225&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?fit=840%2C630&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original.jpg?resize=840%2C630&#038;ssl=1\" class=\"wp-image-311\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1024%2C768&amp;ssl=1 1024w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=300%2C225&amp;ssl=1 300w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=150%2C113&amp;ssl=1 150w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=768%2C576&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1536%2C1152&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=2048%2C1536&amp;ssl=1 2048w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?resize=1200%2C900&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?w=1680&amp;ssl=1 1680w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230105_144834_original-scaled.jpg?w=2520&amp;ssl=1 2520w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 1362px) 62vw, 840px\" /><figcaption class=\"wp-element-caption\">The perfboard design in Fritzing</figcaption></figure><p>I used Fritzing to design the perfboard layout. There are some differences between the Fritzing and real-life layouts; the real board only allows one wire per hole, so there are some nasty big solder bridges in real life, where the design shows nicely-tidy joints like the nest of ground connections near the middle. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"312\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230109_144327_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673275408&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.025&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230109_144327_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-312\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230109_144327_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">Early stages of soldering</figcaption></figure><p>Perfboard is kind of nasty to work with &#8211; you end up making a lot of solder busses, and if you use both sides you can end up with surface-mount sadness mixed in. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"313\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230110_140856_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673359738&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;400&quot;,&quot;shutter_speed&quot;:&quot;0.016666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230110_140856_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-313\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230110_140856_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">Solder busses! Solder busses everywhere!</figcaption></figure><p>Because of space constraints, it wasn’t practical to mount the Arduino right on the board. What I settled on was a wiring harness to a pair of 8-pin Dupont headers. I had some trouble with the headers for the input wires, and currently they are bare socket headers shoved onto the pins, while the lower header still has its 8-pin shroud. If this proves unstable and wiggles loose, my next plan is to take the headers off the wires and the nano, and solder the harness in directly. </p><figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1024\" data-attachment-id=\"314\" data-permalink=\"https://roosenmaallen.com/2023/01/13/bike-display-replacement/20230112_143450_original/\" data-orig-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=1920%2C2560&amp;ssl=1\" data-orig-size=\"1920,2560\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;1.8&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;SM-A526W&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1673534090&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;5.23&quot;,&quot;iso&quot;:&quot;500&quot;,&quot;shutter_speed&quot;:&quot;0.041666666666667&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;1&quot;}\" data-image-title=\"20230112_143450_original\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=225%2C300&amp;ssl=1\" data-large-file=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?fit=768%2C1024&amp;ssl=1\" src=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original.jpg?resize=768%2C1024&#038;ssl=1\" class=\"wp-image-314\" srcset=\"https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=768%2C1024&amp;ssl=1 768w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=225%2C300&amp;ssl=1 225w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=113%2C150&amp;ssl=1 113w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1152%2C1536&amp;ssl=1 1152w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1536%2C2048&amp;ssl=1 1536w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?resize=1200%2C1600&amp;ssl=1 1200w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?w=1920&amp;ssl=1 1920w, https://i0.wp.com/roosenmaallen.com/wordpress/wp-content/uploads/2023/01/20230112_143450_original-scaled.jpg?w=1680&amp;ssl=1 1680w\" sizes=\"auto, (max-width: 709px) 85vw, (max-width: 909px) 67vw, (max-width: 984px) 61vw, (max-width: 1362px) 45vw, 600px\" /><figcaption class=\"wp-element-caption\">All wired up and mounted in the case</figcaption></figure><p>Currently, the display shows all available information (current rpm &amp; speed, riding time, and distance) at once, but I’m thinking to make separate screens with larger (and more readable) text, using the front panel button to toggle through like the original unit did. I’m also planning a kmh/mph toggle (long-press the button to switch). </p><p>I’ve published the code and Fritzing files <a href=\"https://gitlab.com/eroosenmaallen/eddie-bike\">On GitLab</a>; I welcome any feedback, suggestions, or questions. If you build your own, let me know!</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/arduino/\">#Arduino</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/code/\">#Code</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/diy/\">#DIY</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/fitness/\">#Fitness</a></p>" }, "published": "2023-01-13T15:54:09Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/arduino/", "name": "#Arduino" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/code/", "name": "#Code" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/diy/", "name": "#DIY" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/fitness/", "name": "#Fitness" } ], "updated": "2023-01-14T14:26:11Z", "url": "https://roosenmaallen.com/2023/01/13/bike-display-replacement/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/308/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/308/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/308/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" }, { "id": "https://roosenmaallen.com/2022/11/25/initial-release-masto-dl/#activity-create-2022-11-25T11:53:59Z", "type": "Create", "published": "2022-11-25T11:53:59Z", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "sensitive": false, "object": { "id": "https://roosenmaallen.com/2022/11/25/initial-release-masto-dl/", "type": "Note", "attachment": [], "attributedTo": "https://roosenmaallen.com/?author=0", "content": "<h2>Initial Release: Masto-DL</h2><p>After seeing several people ask about a tool to download their toots, I’ve started putting together a tool to do just that.</p><p><a rel=\"noreferrer noopener\" href=\"https://gitlab.com/eroosenmaallen/masto-dl\" target=\"_blank\">Masto-DL</a> will archive all your toots into individual files (json right now, yaml to come, more as needed/requested).</p><p><!--more--></p><p>This uses the Mastodon API, so will work with any instance a standard Masto client will (Pleroma, etc). ActivityPub itself does have a client-to-server aspect, so I may be able to extend this to Fedi instances more generally.</p><p>This is at present a very rough alpha; lots of debug noise and not much UI polish yet. I’ve tested it to be confident it won’t break anything but if something unexpected happens it might not work properly. In particular, if your instance is busy/slow and returning errors the tool will probably crash.</p><p>You can check out the tool and instructions on Gitlab at <a href=\"https://gitlab.com/eroosenmaallen/masto-dl\">https://gitlab.com/eroosenmaallen/masto-dl</a>; bug reports, feature requests, and merge requests are welcome, as always.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/activitypub/\">#ActivityPub</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/archive/\">#Archive</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/fediverse/\">#Fediverse</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastodon/\">#Mastodon</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/nodejs/\">#NodeJS</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>", "contentMap": { "en": "<h2>Initial Release: Masto-DL</h2><p>After seeing several people ask about a tool to download their toots, I’ve started putting together a tool to do just that.</p><p><a rel=\"noreferrer noopener\" href=\"https://gitlab.com/eroosenmaallen/masto-dl\" target=\"_blank\">Masto-DL</a> will archive all your toots into individual files (json right now, yaml to come, more as needed/requested).</p><p><!--more--></p><p>This uses the Mastodon API, so will work with any instance a standard Masto client will (Pleroma, etc). ActivityPub itself does have a client-to-server aspect, so I may be able to extend this to Fedi instances more generally.</p><p>This is at present a very rough alpha; lots of debug noise and not much UI polish yet. I’ve tested it to be confident it won’t break anything but if something unexpected happens it might not work properly. In particular, if your instance is busy/slow and returning errors the tool will probably crash.</p><p>You can check out the tool and instructions on Gitlab at <a href=\"https://gitlab.com/eroosenmaallen/masto-dl\">https://gitlab.com/eroosenmaallen/masto-dl</a>; bug reports, feature requests, and merge requests are welcome, as always.</p><p><a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/activitypub/\">#ActivityPub</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/archive/\">#Archive</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/fediverse/\">#Fediverse</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/mastodon/\">#Mastodon</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/nodejs/\">#NodeJS</a> <a rel=\"tag\" class=\"hashtag u-tag u-category\" href=\"https://roosenmaallen.com/tag/web/\">#Web</a></p>" }, "published": "2022-11-25T11:53:59Z", "tag": [ { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/activitypub/", "name": "#ActivityPub" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/archive/", "name": "#Archive" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/fediverse/", "name": "#Fediverse" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/mastodon/", "name": "#Mastodon" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/nodejs/", "name": "#NodeJS" }, { "type": "Hashtag", "href": "https://roosenmaallen.com/tag/web/", "name": "#Web" } ], "url": "https://roosenmaallen.com/2022/11/25/initial-release-masto-dl/", "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "cc": [ "https://roosenmaallen.com/wp-json/activitypub/1.0/actors/0/followers" ], "replies": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/303/replies", "type": "Collection", "first": { "id": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/303/replies?page=0", "type": "CollectionPage", "partOf": "https://roosenmaallen.com/wp-json/activitypub/1.0/posts/303/replies", "items": [] } }, "sensitive": false }, "actor": "https://roosenmaallen.com/?author=0" } ] }