{
"type": "entry",
"author": {
"name": null,
"url": "https://herestomwiththeweather.com/",
"photo": null
},
"url": "https://herestomwiththeweather.com/2022/12/22/indieweb-and-mastodon/",
"published": "2022-12-22T20:06:15+00:00",
"content": {
"html": "<p>Thanks to <a href=\"https://effaustin.org/\">EFF-Austin</a> for the opportunity to talk along with <a href=\"https://www.weblogsky.com/\">Jon Lebkowsky</a> about the relationship between <a href=\"https://indieweb.org/\">Indieweb</a> and the <a href=\"https://en.wikipedia.org/wiki/Fediverse\">Fediverse</a>. (<a href=\"https://herestomwiththeweather.com/effaustin/indieweb_mastodon\">Slides</a> and <a href=\"https://www.youtube.com/watch?v=VRu3i9u9I5Q\">video</a>)</p>\n\n<p>The meetup <a href=\"https://www.meetup.com/EFF-Austin/events/nltdcrydcqbrb/\">Indieweb and Mastodon: The Time is Now</a> was coincidentally in the same room as <a href=\"https://indieweb.org/2020/Austin\">IndieWebCamp Austin 2020</a>.</p>",
"text": "Thanks to EFF-Austin for the opportunity to talk along with Jon Lebkowsky about the relationship between Indieweb and the Fediverse. (Slides and video)\n\nThe meetup Indieweb and Mastodon: The Time is Now was coincidentally in the same room as IndieWebCamp Austin 2020."
},
"name": "IndieWeb and Mastodon",
"post-type": "article",
"_id": "33939170",
"_source": "246"
}
{
"type": "entry",
"author": {
"name": null,
"url": "https://herestomwiththeweather.com/",
"photo": null
},
"url": "https://herestomwiththeweather.com/2022/11/15/mastodon-discovery/",
"published": "2022-11-15T16:42:33+00:00",
"content": {
"html": "<p>Making notes is helpful when reading and running unfamiliar code for the first time. I usually start with happy paths. Here\u2019s some notes I made while learning about Mastodon account search and discovery. It\u2019s really cool to poke around the code that so many people are using every day to find each other.</p>\n\n<p>When you search on an account identifier on Mastodon, your browser makes a request to your Mastodon instance:</p>\n\n<blockquote>\n <p>/api/v2/search?q=%40herestomwiththeweather%40mastodon.social&resolve=true&limit=5</p>\n</blockquote>\n\n<p>The resolve=true parameter tells your Mastodon instance to make a webfinger request to the target Mastodon instance if necessary. The search controller <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/controllers/api/v2/search_controller.rb#L32\">makes a call to the SearchService</a></p>\n\n<pre><code> def search_results\n SearchService.new.call(\n params[:q],\n current_account,\n limit_param(RESULTS_LIMIT),\n search_params.merge(resolve: truthy_param?(:resolve), exclude_unreviewed: truthy_param?(:exclude_unreviewed))\n )\n end\n</code></pre>\n\n\n<p>and since resolve=true, SearchService <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/account_search_service.rb#L36\">makes a call to the ResolveAccountService</a></p>\n\n<pre><code> if options[:resolve]\n ResolveAccountService.new.call(query)\n</code></pre>\n\n\n<p>The purpose of ResolveAccountService is to \u201cFind or create an account record for a remote user\u201d and return an account object to the search controller. It includes <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/helpers/webfinger_helper.rb\">WebfingerHelper</a> which is a trivial module with just one one-line method named webfinger!()</p>\n\n<pre><code>module WebfingerHelper\n def webfinger!(uri)\n Webfinger.new(uri).perform\n end\nend\n</code></pre>\n\n\n<p>This method returns a webfinger object. Rather than call it directly, ResolveAccountService <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/resolve_account_service.rb#L34\">invokes process_webfinger!</a> which <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/resolve_account_service.rb#L86\">invokes it</a> and then asks the returned webfinger object\u2019s subject method for its username and domain and makes them instance variables of the service object.</p>\n\n<pre><code> def process_webfinger!(uri)\n @webfinger = webfinger!(\"acct:#{uri}\")\n confirmed_username, confirmed_domain = split_acct(@webfinger.subject)\n\n if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero?\n @username = confirmed_username\n @domain = confirmed_domain\n return\n end\n</code></pre>\n\n\n<p>If the Mastodon instance does not already know about this account, ResolveAccountService <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/resolve_account_service.rb#L55\">invokes fetch_account!</a> which <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/resolve_account_service.rb#L114\">calls the ActivityPub::FetchRemoteAccountService</a> which inherits from <a href=\"https://github.com/herestomwiththeweather/mastodon/blob/main/app/services/activitypub/fetch_remote_actor_service.rb\">ActivityPub::FetchRemoteActorService</a></p>\n\n<pre><code> @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url, suppress_errors: @options[:suppress_errors])\n</code></pre>\n\n\n<p>The actor_url will look something like</p>\n\n<blockquote>\n <p>https://mastodon.social/users/herestomwiththeweather</p>\n</blockquote>\n\n<p>The ActivityPub::FetchRemoteActorService <a href=\"https://github.com/mastodon/mastodon/blob/main/app/services/activitypub/fetch_remote_actor_service.rb#L19\">passes the actor_url parameter to fetch_resource</a> to receive a json response for the remote account.</p>\n\n<pre><code> @json = begin\n if prefetched_body.nil?\n fetch_resource(uri, id)\n else\n\n</code></pre>\n\n\n<p>The response includes a lot of information including name, summary, publicKey, images and urls to fetch more information like followers and following.</p>\n\n<p>Finally, the ActivityPub::FetchRemoteActorService <a href=\"https://github.com/mastodon/mastodon/blob/main/app/services/activitypub/fetch_remote_actor_service.rb#L38\">calls the ActivityPub::ProcessAccountService</a>, passing it the json response.</p>\n\n<pre><code> ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key, verified_webfinger: !only_key)\n</code></pre>\n\n\n<p>If the Mastodon instance does not know about the account, ActivityPub::ProcessAccountService <a href=\"https://github.com/mastodon/mastodon/blob/main/app/services/activitypub/process_account_service.rb#L28\">invokes create_account and update_account</a> to save the username, domain and all the associated urls from the json response to a new account record in the database.</p>\n\n<pre><code> create_account if @account.nil?\n update_account\n</code></pre>\n\n\n<p>I have several questions about how following others works and will probably look at that soon. I may start out by reading <a href=\"https://tinysubversions.com/notes/reading-activitypub/\">A highly opinionated guide to learning about ActivityPub</a> which I bookmarked a while ago.</p>",
"text": "Making notes is helpful when reading and running unfamiliar code for the first time. I usually start with happy paths. Here\u2019s some notes I made while learning about Mastodon account search and discovery. It\u2019s really cool to poke around the code that so many people are using every day to find each other.\n\nWhen you search on an account identifier on Mastodon, your browser makes a request to your Mastodon instance:\n\n\n /api/v2/search?q=%40herestomwiththeweather%40mastodon.social&resolve=true&limit=5\n\n\nThe resolve=true parameter tells your Mastodon instance to make a webfinger request to the target Mastodon instance if necessary. The search controller makes a call to the SearchService\n\n def search_results\n SearchService.new.call(\n params[:q],\n current_account,\n limit_param(RESULTS_LIMIT),\n search_params.merge(resolve: truthy_param?(:resolve), exclude_unreviewed: truthy_param?(:exclude_unreviewed))\n )\n end\n\n\n\nand since resolve=true, SearchService makes a call to the ResolveAccountService\n\n if options[:resolve]\n ResolveAccountService.new.call(query)\n\n\n\nThe purpose of ResolveAccountService is to \u201cFind or create an account record for a remote user\u201d and return an account object to the search controller. It includes WebfingerHelper which is a trivial module with just one one-line method named webfinger!()\n\nmodule WebfingerHelper\n def webfinger!(uri)\n Webfinger.new(uri).perform\n end\nend\n\n\n\nThis method returns a webfinger object. Rather than call it directly, ResolveAccountService invokes process_webfinger! which invokes it and then asks the returned webfinger object\u2019s subject method for its username and domain and makes them instance variables of the service object.\n\n def process_webfinger!(uri)\n @webfinger = webfinger!(\"acct:#{uri}\")\n confirmed_username, confirmed_domain = split_acct(@webfinger.subject)\n\n if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero?\n @username = confirmed_username\n @domain = confirmed_domain\n return\n end\n\n\n\nIf the Mastodon instance does not already know about this account, ResolveAccountService invokes fetch_account! which calls the ActivityPub::FetchRemoteAccountService which inherits from ActivityPub::FetchRemoteActorService\n\n @account = ActivityPub::FetchRemoteAccountService.new.call(actor_url, suppress_errors: @options[:suppress_errors])\n\n\n\nThe actor_url will look something like\n\n\n https://mastodon.social/users/herestomwiththeweather\n\n\nThe ActivityPub::FetchRemoteActorService passes the actor_url parameter to fetch_resource to receive a json response for the remote account.\n\n @json = begin\n if prefetched_body.nil?\n fetch_resource(uri, id)\n else\n\n\n\n\nThe response includes a lot of information including name, summary, publicKey, images and urls to fetch more information like followers and following.\n\nFinally, the ActivityPub::FetchRemoteActorService calls the ActivityPub::ProcessAccountService, passing it the json response.\n\n ActivityPub::ProcessAccountService.new.call(@username, @domain, @json, only_key: only_key, verified_webfinger: !only_key)\n\n\n\nIf the Mastodon instance does not know about the account, ActivityPub::ProcessAccountService invokes create_account and update_account to save the username, domain and all the associated urls from the json response to a new account record in the database.\n\n create_account if @account.nil?\n update_account\n\n\n\nI have several questions about how following others works and will probably look at that soon. I may start out by reading A highly opinionated guide to learning about ActivityPub which I bookmarked a while ago."
},
"name": "Mastodon Discovery",
"post-type": "article",
"_id": "33939172",
"_source": "246"
}
{
"type": "entry",
"author": {
"name": null,
"url": "https://herestomwiththeweather.com/",
"photo": null
},
"url": "https://herestomwiththeweather.com/2022/10/27/rubyconf-in-houston/",
"published": "2022-10-27T21:56:20+00:00",
"content": {
"html": "<p>Earlier this week, I signed up for <a href=\"https://rubyconf.org/\">RubyConf 2022</a> which is Nov. 29 - Dec. 1 in Houston. This is my first conference since the pandemic started and I was glad to see the <a href=\"https://rubyconf.org/safety\">safety precautions</a>. The <a href=\"https://rubyconf.org/schedule\">schedule</a> also looks great! Please say \u201cHi!\u201d if you see me there.</p>",
"text": "Earlier this week, I signed up for RubyConf 2022 which is Nov. 29 - Dec. 1 in Houston. This is my first conference since the pandemic started and I was glad to see the safety precautions. The schedule also looks great! Please say \u201cHi!\u201d if you see me there."
},
"name": "RubyConf in Houston",
"post-type": "article",
"_id": "33939173",
"_source": "246"
}
{
"type": "entry",
"author": {
"name": null,
"url": "https://herestomwiththeweather.com/",
"photo": null
},
"url": "https://herestomwiththeweather.com/2022/10/25/indieauth-login-history/",
"published": "2022-10-25T16:51:16+00:00",
"content": {
"html": "<p>In my last post, I mentioned that I planned to add login history to <a href=\"https://github.com/herestomwiththeweather/irwin\">Irwin</a>. As I was testing my code, I logged into <a href=\"https://indieweb.org/\">indieweb.org</a> and noticed that I needed to update my code to support <a href=\"https://indieauth.spec.indieweb.org/#profile-url-response\">5.3.2 Profile URL Response</a> of the IndieAuth spec as this IndieAuth client does not need an access token. Here\u2019s what the history looks like on my IndieAuth server:</p>\n\n<p><img src=\"https://coffeebucks.s3.amazonaws.com/images/image/jekyll/indieauth_login_history.png\" alt=\"IndieAuth login history\" /></p>\n\n<p>If I click on a login timestamp, I have the option to revoke the access token associated with the login if it exists and has not already expired. My next step is to test some other <a href=\"https://indieweb.org/Micropub/Servers\">micropub servers</a> than the one I use to see what interoperability updates I may need to make.</p>",
"text": "In my last post, I mentioned that I planned to add login history to Irwin. As I was testing my code, I logged into indieweb.org and noticed that I needed to update my code to support 5.3.2 Profile URL Response of the IndieAuth spec as this IndieAuth client does not need an access token. Here\u2019s what the history looks like on my IndieAuth server:\n\n\n\nIf I click on a login timestamp, I have the option to revoke the access token associated with the login if it exists and has not already expired. My next step is to test some other micropub servers than the one I use to see what interoperability updates I may need to make."
},
"name": "IndieAuth login history",
"post-type": "article",
"_id": "33939174",
"_source": "246"
}
{
"type": "entry",
"author": {
"name": null,
"url": "https://herestomwiththeweather.com/",
"photo": null
},
"url": "https://herestomwiththeweather.com/2022/10/09/minimum-viable-indieauth-server/",
"published": "2022-10-09T20:38:46+00:00",
"content": {
"html": "<p>One of the building blocks of the <a href=\"https://indieweb.org/\">Indieweb</a> is <a href=\"https://indieweb.org/IndieAuth\">IndieAuth</a>. Like many others, I bootstrapped my experience with <a href=\"https://indieauth.com/\">indieauth.com</a> but as <a href=\"https://martymcgui.re/2022/07/31/switching-costs-for-an-indieauth-server/\">Marty McGuire explains</a>, there are good reasons to switch and even consider building your own. Because I wanted a server as simple to understand as possible but also wanted to be able to add features that are usually not available, I created a rails project called <a href=\"https://github.com/herestomwiththeweather/irwin\">Irwin</a> and <a href=\"https://github.com/herestomwiththeweather/herestomwiththeweather.github.io/commit/554dbaad13250a97c2b26c034fbce3dd6908c273\">recently configured my blog to use it</a>.</p>\n\n<p>This is not production ready code. While I know that <a href=\"https://github.com/voxpelli/webpage-micropub-to-github\">the micropub server I use</a> works with it, I expect others may not. Also, there is no support for refresh tokens and other things in the spec that I didn\u2019t consider high priority. It does support <a href=\"https://indieweb.org/PKCE\">PKCE</a> but not the less useful \u201cplain\u201d method.</p>\n\n<p>All of <a href=\"https://aaronparecki.com/2020/12/03/1/indieauth-2020\">IndieAuth Spec Updates 2020</a> was very clear and helpful. In one case, I made the server probably too strict (as an easy way to curtail spam registrations). It requires that the hosts for a blog\u2019s authorization endpoint and token endpoint match the host of the IndieAuth server before a user can register an account on the indieauth server.</p>\n\n<p>I plan to add an option for a user to keep a history of logins to indieauth clients soon. Please let me know if you have any questions or suggestions.</p>",
"text": "One of the building blocks of the Indieweb is IndieAuth. Like many others, I bootstrapped my experience with indieauth.com but as Marty McGuire explains, there are good reasons to switch and even consider building your own. Because I wanted a server as simple to understand as possible but also wanted to be able to add features that are usually not available, I created a rails project called Irwin and recently configured my blog to use it.\n\nThis is not production ready code. While I know that the micropub server I use works with it, I expect others may not. Also, there is no support for refresh tokens and other things in the spec that I didn\u2019t consider high priority. It does support PKCE but not the less useful \u201cplain\u201d method.\n\nAll of IndieAuth Spec Updates 2020 was very clear and helpful. In one case, I made the server probably too strict (as an easy way to curtail spam registrations). It requires that the hosts for a blog\u2019s authorization endpoint and token endpoint match the host of the IndieAuth server before a user can register an account on the indieauth server.\n\nI plan to add an option for a user to keep a history of logins to indieauth clients soon. Please let me know if you have any questions or suggestions."
},
"name": "Minimum Viable IndieAuth Server",
"post-type": "article",
"_id": "33939175",
"_source": "246"
}
Just two days to Christmas for many folks around the world and we have our special #NAFO tree topper today.
From forger @keene_chemistry
Bid to win your North Star
{
"type": "entry",
"published": "2022-12-23T18:08:51+00:00",
"url": "https://twitter.com/jgmac1106/status/1606351143822659598",
"photo": [
"https://pbs.twimg.com/media/FkrnS5eXkA8I2ge.jpg",
"https://pbs.twimg.com/media/Fkrn0zNXkAI5COB.jpg"
],
"content": {
"text": "Just two days to Christmas for many folks around the world and we have our special #NAFO tree topper today. \n\nFrom forger @keene_chemistry \n\nBid to win your North Star",
"html": "Just two days to Christmas for many folks around the world and we have our special <a href=\"https://twitter.com/search?q=%23NAFO\">#NAFO</a> tree topper today. \n\nFrom forger <a href=\"https://twitter.com/keene_chemistry\">@keene_chemistry</a> \n\nBid to win your North Star"
},
"author": {
"type": "card",
"name": "jgregorymcverry.com",
"url": "https://twitter.com/jgmac1106",
"photo": "https://pbs.twimg.com/profile_images/1586874242913734658/3GMcjnTC.jpg"
},
"post-type": "photo",
"_id": "33934735",
"_source": "2773"
}
π#NAFOfellas Hanukkah auction!π
After battling invaders w/ his javelin & shield, Fella Macabee is ready to light the HIMARS hanukkiah (menorah) for Hanukkah night ...
Further Proof #Putin is your crazy #Qanon uncle that won't stop talking about #satan#pedos and #Transgender groomers
Poor Sad Pepe Patriots left with out their big cuddly Bear of man.
#Putin off his rocker and poops himself
(Again like your #Qanon uncle)
{
"type": "entry",
"published": "2022-12-23T05:29:40+00:00",
"url": "https://twitter.com/jgmac1106/status/1606160089420791808",
"quotation-of": "https://twitter.com/RachaelBL/status/1606108760342142976",
"content": {
"text": "Further Proof #Putin is your crazy #Qanon uncle that won't stop talking about #satan #pedos and #Transgender groomers\n\nPoor Sad Pepe Patriots left with out their big cuddly Bear of man.\n\n#Putin off his rocker and poops himself\n\n(Again like your #Qanon uncle)",
"html": "Further Proof <a href=\"https://twitter.com/search?q=%23Putin\">#Putin</a> is your crazy <a href=\"https://twitter.com/search?q=%23Qanon\">#Qanon</a> uncle that won't stop talking about <a href=\"https://twitter.com/search?q=%23satan\">#satan</a> <a href=\"https://twitter.com/search?q=%23pedos\">#pedos</a> and <a href=\"https://twitter.com/search?q=%23Transgender\">#Transgender</a> groomers\n\nPoor Sad Pepe Patriots left with out their big cuddly Bear of man.\n\n<a href=\"https://twitter.com/search?q=%23Putin\">#Putin</a> off his rocker and poops himself\n\n(Again like your <a href=\"https://twitter.com/search?q=%23Qanon\">#Qanon</a> uncle)"
},
"author": {
"type": "card",
"name": "jgregorymcverry.com",
"url": "https://twitter.com/jgmac1106",
"photo": "https://pbs.twimg.com/profile_images/1586874242913734658/3GMcjnTC.jpg"
},
"post-type": "note",
"refs": {
"https://twitter.com/RachaelBL/status/1606108760342142976": {
"type": "entry",
"published": "2022-12-23T02:05:43+00:00",
"url": "https://twitter.com/RachaelBL/status/1606108760342142976",
"photo": [
"https://pbs.twimg.com/media/FkoLXrTWYAEVeCF.png"
],
"content": {
"text": "Nailed it. @allahpundit @thedispatch thedispatch.com/newsletter/boi\u2026",
"html": "Nailed it. <a href=\"https://twitter.com/allahpundit\">@allahpundit</a> <a href=\"https://twitter.com/thedispatch\">@thedispatch</a> <a href=\"https://thedispatch.com/newsletter/boilingfrogs/fashion-statement/?utm_source=ActiveCampaign&utm_medium=email&utm_content=Fashion+Statement&utm_campaign=Fashion+Statement\">thedispatch.com/newsletter/boi\u2026</a>"
},
"author": {
"type": "card",
"name": "Rachael Larimore",
"url": "https://twitter.com/RachaelBL",
"photo": "https://pbs.twimg.com/profile_images/1426190406262435841/BB4_N993.jpg"
},
"post-type": "photo"
}
},
"_id": "33921849",
"_source": "2773"
}
{
"type": "entry",
"published": "2022-12-23T04:51:08+00:00",
"url": "https://twitter.com/jgmac1106/status/1606150388662648833",
"quotation-of": "https://twitter.com/JackPosobiec/status/1606031110353301505",
"content": {
"text": "You see a lot of cross over themes between the Influence campaigns of #Russia and the #Westernchauvinism online.\n\nWhole #Putin shirtless on a horse.\n\nSo #Alphamale it is gay.\n\nJack bit.ly/3PNUuPy Is this guy\n\n#ProudBoys #RogerStone #oathkeepers sound same as #Russia",
"html": "You see a lot of cross over themes between the Influence campaigns of <a href=\"https://twitter.com/search?q=%23Russia\">#Russia</a> and the <a href=\"https://twitter.com/search?q=%23Westernchauvinism\">#Westernchauvinism</a> online.\n\nWhole <a href=\"https://twitter.com/search?q=%23Putin\">#Putin</a> shirtless on a horse.\n\nSo <a href=\"https://twitter.com/search?q=%23Alphamale\">#Alphamale</a> it is gay.\n\nJack <a href=\"https://bit.ly/3PNUuPy\">bit.ly/3PNUuPy</a> Is this guy\n\n<a href=\"https://twitter.com/search?q=%23ProudBoys\">#ProudBoys</a> <a href=\"https://twitter.com/search?q=%23RogerStone\">#RogerStone</a> <a href=\"https://twitter.com/search?q=%23oathkeepers\">#oathkeepers</a> sound same as <a href=\"https://twitter.com/search?q=%23Russia\">#Russia</a>"
},
"author": {
"type": "card",
"name": "jgregorymcverry.com",
"url": "https://twitter.com/jgmac1106",
"photo": "https://pbs.twimg.com/profile_images/1586874242913734658/3GMcjnTC.jpg"
},
"post-type": "note",
"refs": {
"https://twitter.com/JackPosobiec/status/1606031110353301505": {
"type": "entry",
"published": "2022-12-22T20:57:09+00:00",
"url": "https://twitter.com/JackPosobiec/status/1606031110353301505",
"in-reply-to": [
"https://twitter.com/MostlyPeacefull/status/1606031007374721024"
],
"content": {
"text": "Wait til they find out who started it",
"html": "Wait til they find out who started it\n<a class=\"u-mention\" href=\"https://twitter.com/AdamKinzinger\"></a>\n<a class=\"u-mention\" href=\"https://twitter.com/MostlyPeacefull\"></a>"
},
"author": {
"type": "card",
"name": "Jack Posobiec \ud83c\uddfa\ud83c\uddf8",
"url": "https://twitter.com/JackPosobiec",
"photo": "https://pbs.twimg.com/profile_images/1590214799433924608/OPJo6W2M.jpg"
},
"post-type": "reply"
}
},
"_id": "33921487",
"_source": "2773"
}
I wish I played video games enough to justify getting one of these, this looks amazing! π
analogue.co/pocket
I haven't even touched my Switch in over a year
{
"type": "entry",
"published": "2022-12-23T04:06:25+00:00",
"url": "https://twitter.com/aaronpk/status/1606139136405954561",
"photo": [
"https://pbs.twimg.com/media/FkonCC2UcAAJgWX.jpg"
],
"content": {
"text": "I wish I played video games enough to justify getting one of these, this looks amazing! \ud83d\ude0d\n\nanalogue.co/pocket\n\nI haven't even touched my Switch in over a year",
"html": "I wish I played video games enough to justify getting one of these, this looks amazing! \ud83d\ude0d\n\n<a href=\"https://www.analogue.co/pocket\">analogue.co/pocket</a>\n\nI haven't even touched my Switch in over a year"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://twitter.com/aaronpk",
"photo": "https://pbs.twimg.com/profile_images/1477113672803622912/ljLUwFLP.jpg"
},
"post-type": "photo",
"_id": "33920938",
"_source": "2773"
}
{
"type": "entry",
"published": "2022-12-22T20:06:22-08:00",
"url": "https://aaronparecki.com/2022/12/22/23/pocket",
"photo": [
"https://aperture-media.p3k.io/aaronparecki.com/05605414d1ae3460d1ea866a85866f025ad56f5e89578314c3a3b76b2880547e.jpg"
],
"syndication": [
"https://twitter.com/aaronpk/status/1606139136405954561"
],
"content": {
"text": "I wish I played video games enough to justify getting one of these, this looks amazing! \ud83d\ude0d \n\nhttps://www.analogue.co/pocket \n\nI haven't even touched my Switch in over a year",
"html": "I wish I played video games enough to justify getting one of these, this looks amazing! <a href=\"https://aaronparecki.com/emoji/%F0%9F%98%8D\">\ud83d\ude0d</a> <br /><br /><a href=\"https://www.analogue.co/pocket\"><span>https://</span>www.analogue.co/pocket</a> <br /><br />I haven't even touched my Switch in over a year"
},
"author": {
"type": "card",
"name": "Aaron Parecki",
"url": "https://aaronparecki.com/",
"photo": "https://aperture-media.p3k.io/aaronparecki.com/273439aa8d2755b0e7894d364b04588b152b3ab782657e3ce0921b079f1f7d3d.jpg"
},
"post-type": "photo",
"_id": "33920772",
"_source": "16"
}