Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: https://sixohthree.com/feeds/atom.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <feed xmlns="http://www.w3.org/2005/Atom"><title>sixohthree.com</title><link href="https://sixohthree.com/" rel="alternate"></link><link href="https://sixohthree.com/feeds/atom.xml" rel="self"></link><id>https://sixohthree.com/</id><updated>2025-04-22T00:00:00-04:00</updated><entry><title>Links (22 April 2025)</title><link href="https://sixohthree.com/links-22-april-2025" rel="alternate"></link><published>2025-04-22T00:00:00-04:00</published><updated>2025-04-22T00:00:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2025-04-22:/links-22-april-2025</id><summary type="html">&lt;p&gt;Some links I collected recently.&lt;/p&gt;</summary><content type="html">&lt;ul&gt;
  3. &lt;li&gt;&lt;a href="https://bylandandsea.ie/"&gt;bylandandsea.ie&lt;/a&gt; – Travel to and from Ireland without flying&lt;/li&gt;
  4. &lt;li&gt;&lt;a href="https://garagehq.deuxfleurs.fr/"&gt;Garage&lt;/a&gt; — An open-source distributed object storage service tailored for
  5.  self-hosting, supporting the S3 API&lt;/li&gt;
  6. &lt;li&gt;Human chains feel like a metaphor in these dark times&lt;ul&gt;
  7. &lt;li&gt;&lt;a href="https://www.nbcnews.com/news/us-news/ice-tries-detain-man-tennessee-home-neighbors-form-human-chain-n1032791"&gt;ICE came for their neighbor, so these Tennesseans formed a human chain to
  8.  protect him&lt;/a&gt;&lt;/li&gt;
  9. &lt;li&gt;&lt;a href="https://www.theguardian.com/us-news/2025/apr/17/book-brigade-us-town-forms-human-chain-to-move-9100-books-one-by-one"&gt;‘Book brigade’: US town forms human chain to move 9,100 books
  10.  one-by-one&lt;/a&gt;&lt;/li&gt;
  11. &lt;/ul&gt;
  12. &lt;/li&gt;
  13. &lt;li&gt;&lt;code&gt;stty -ixon&lt;/code&gt; to stop ^S from freezing your terminal via
  14.  &lt;a href="https://social.jvns.ca/@b0rk/114354742870242559"&gt;@b0rk@social.jvns.ca&lt;/a&gt;&lt;/li&gt;
  15. &lt;li&gt;&lt;a href="https://www.chiark.greenend.org.uk/~ianmdlvl/rust-polyglot/"&gt;Rust for the Polyglot Programmer&lt;/a&gt; via
  16.  &lt;a href="https://infosec.exchange/@raptor/114363710652153874"&gt;@raptor@infosec.exchange&lt;/a&gt;&lt;/li&gt;
  17. &lt;li&gt;&lt;a href="https://www.seriouseats.com/chai-recipe-8364307"&gt;How to Make Chai&lt;/a&gt;&lt;/li&gt;
  18. &lt;li&gt;&lt;a href="https://fxrant.blogspot.com/2025/04/the-movie-mistake-mystery-from-revenge.html?m=1"&gt;The Movie Mistake Mystery from "Revenge of the Sith"&lt;/a&gt;&lt;/li&gt;
  19. &lt;li&gt;&lt;a href="https://typst.app/"&gt;Typst&lt;/a&gt; – A more productive workflow for science.&lt;/li&gt;
  20. &lt;li&gt;&lt;a href="https://twinery.org/cookbook/"&gt;Twine Cookbook&lt;/a&gt; – "This Cookbook contains documentation, tips, and
  21.  examples for using the non-linear story creation tool &lt;a href="https://twinery.org/"&gt;Twine&lt;/a&gt;"&lt;/li&gt;
  22. &lt;/ul&gt;</content><category term="Personal"></category><category term="links"></category></entry><entry><title>Webhooks as a (Systemd) Service</title><link href="https://sixohthree.com/webhooks-as-systemd-service" rel="alternate"></link><published>2025-04-12T12:23:00-04:00</published><updated>2025-04-12T12:23:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2025-04-12:/webhooks-as-systemd-service</id><summary type="html">&lt;p&gt;Using the &lt;code&gt;webhook&lt;/code&gt; Go package to deploy on demand.&lt;/p&gt;</summary><content type="html">&lt;p&gt;The &lt;a href="https://xoxo.zone/docs/"&gt;"docs" microsite&lt;/a&gt; for &lt;a href="https://xoxo.zone/"&gt;xoxo.zone&lt;/a&gt; is a static page built with
  23. Eleventy. I explicitly didn't want to overcomplicate the site's setup with a
  24. cloud build process triggered by commit actions: the static site is compiled
  25. locally and committed alongside the content changes. A cron on the server runs
  26. &lt;code&gt;git pull&lt;/code&gt; on the repo every 5 minutes. The web server can directly serve the
  27. site without any additional build.&lt;/p&gt;
  28. &lt;p&gt;The site is updated a couple times a month on average. Of the 8,640 average
  29. monthly cron git pulls, 8,638 will do nothing. The net impact of this is
  30. probably negligible, but it did annoy me. Besides, Codeberg (my forge of choice
  31. for xoxo) gets the occasional DDoS and I'm sure is getting hammered by "AI"
  32. scrapers that never sleep. Why send them more traffic than necessary?&lt;/p&gt;
  33. &lt;p&gt;I wanted to update the site when I pushed to the repo, without a complex
  34. configuration that would be difficult for someone else to pick up. Maybe I could
  35. write a lightweight web server that listened for a request and perform an
  36. action?&lt;/p&gt;
  37. &lt;h2&gt;Stop giving things generic names&lt;/h2&gt;
  38. &lt;p&gt;The obvious choice for triggering an action on push is a &lt;a href="https://en.wikipedia.org/wiki/Webhook"&gt;Webhook&lt;/a&gt;, which
  39. Codeberg supports natively. Expose an endpoint, verify incoming requests, run a
  40. command.&lt;/p&gt;
  41. &lt;p&gt;Doing some preliminary searches, I stumbled across the extremely
  42. generically-named &lt;a href="https://github.com/adnanh/webhook/"&gt;webhook&lt;/a&gt;, a Go web server for triggering commands based
  43. on webhook requests. It's apt-installable on Ubuntu, has a simple configuration
  44. file syntax in JSON or YAML, and doesn't mind being proxied behind nginx. From a
  45. maintenance perspective, that's better than rolling my own server.&lt;/p&gt;
  46. &lt;h2&gt;Webhook configuration&lt;/h2&gt;
  47. &lt;p&gt;After &lt;code&gt;apt install webhook&lt;/code&gt;, I customised some of the launch parameters with
  48. &lt;code&gt;systemctl edit webhook&lt;/code&gt;&lt;sup id=sf-webhooks-as-systemd-service-1-back&gt;&lt;a href=#sf-webhooks-as-systemd-service-1 class=simple-footnote title="Technically these are in an Ansible playbook, but I'm simplifying so the code examples are more self-contained."&gt;1&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
  49. &lt;pre&gt;&lt;code class=language-ini&gt;[Unit]
  50. ConditionPathExists=
  51. ConditionPathExists=/etc/webhook.yaml
  52.  
  53. [Service]
  54. ExecStart=
  55. ExecStart=/usr/bin/webhook -nopanic -hooks /etc/webhook.yaml -ip 127.0.0.1 -port 9899 -urlprefix my-webhook-prefix
  56. User=www-data
  57. Group=www-data
  58. &lt;/code&gt;&lt;/pre&gt;
  59. &lt;p&gt;I configured my hook in &lt;code&gt;/etc/webhook.yaml&lt;/code&gt;. &lt;code&gt;webhook&lt;/code&gt; has an awkward syntax for
  60. passing arguments to commands, so I made a small bin script to wrap &lt;code&gt;cd&lt;/code&gt; and
  61. &lt;code&gt;git pull ...&lt;/code&gt;. &lt;code&gt;webhook&lt;/code&gt; also includes "matchers" to further customise the hook
  62. based on incoming parameters. This config performs request signature
  63. verification based on a shared secret, and filters for push events.&lt;/p&gt;
  64. &lt;pre&gt;&lt;code class=language-yaml&gt;- id: deploy-docs
  65.  execute-command: /usr/local/bin/xoxo-docs-pull
  66.  response-message: ok
  67.  trigger-rule:
  68.      and:
  69.          - match:
  70.                type: payload-hmac-sha256
  71.                secret: my_secret
  72.                parameter:
  73.                    source: header
  74.                    name: X-Forgejo-Signature
  75.          - match:
  76.                type: value
  77.                value: push
  78.                parameter:
  79.                    source: header
  80.                    name: X-Forgejo-Event
  81. &lt;/code&gt;&lt;/pre&gt;
  82. &lt;p&gt;Then I proxied the requests through Nginx:&lt;/p&gt;
  83. &lt;pre&gt;&lt;code class=language-nginx&gt;upstream webhooks {
  84.    server 127.0.0.1:9899 fail_timeout=5;
  85. }
  86.  
  87. server {
  88.    # the rest of the server config...
  89.  
  90.    location ~ ^/my-webhook-prefix/ {
  91.       proxy_pass http://webhooks;
  92.    }
  93. }
  94. &lt;/code&gt;&lt;/pre&gt;
  95. &lt;p&gt;That's enough to get a working webhook. No more cron needed!&lt;/p&gt;
  96. &lt;h2&gt;The future&lt;/h2&gt;
  97. &lt;p&gt;Mastodon itself supports webhooks, and I'd love to improve our admin hooks in
  98. the future. Today we get a Discord message when a report is created, but it's
  99. not very readable and there's no ability to update the initial message when the
  100. report is actioned. &lt;code&gt;webhook&lt;/code&gt; feels like a good starting place to improve that
  101. experience.&lt;/p&gt;&lt;ol class=simple-footnotes&gt;&lt;li id=sf-webhooks-as-systemd-service-1&gt;Technically these are in an &lt;a href="https://www.ansible.com/"&gt;Ansible&lt;/a&gt; playbook,
  102. but I'm simplifying so the code examples are more self-contained. &lt;a href=#sf-webhooks-as-systemd-service-1-back class=simple-footnote-back&gt;↩&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</content><category term="Web"></category><category term="eleventy"></category><category term="mastodon"></category><category term="codeberg"></category><category term="webhooks"></category></entry><entry><title>Migrating xoxo.zone to OVHcloud</title><link href="https://sixohthree.com/migrating-xoxo-zone-to-ovhcloud" rel="alternate"></link><published>2025-04-10T07:02:00-04:00</published><updated>2025-04-10T07:02:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2025-04-10:/migrating-xoxo-zone-to-ovhcloud</id><summary type="html">&lt;p&gt;A postmortem on moving the server (again)&lt;/p&gt;</summary><content type="html">&lt;p&gt;Mastodon hosted on &lt;a href="https://xoxo.zone/"&gt;xoxo.zone&lt;/a&gt; is now living on its new server at OVHcloud.
  103. We were hosted at Hetzner for &lt;a href="https://xoxo.zone/docs/"&gt;just about 2 years&lt;/a&gt;, but draconian terms of
  104. service and &lt;a href="https://tenforward.blog/hetzner-considered-hostile-a-psa/"&gt;some scary experiences&lt;/a&gt; for other communities made the move
  105. inevitable. I evaluated a few EU-based hosts, including Netcup and Scaleway. OVH
  106. hit the sweet spot of pricing, specs, and terms of use.&lt;/p&gt;
  107. &lt;h2&gt;We built this shitty&lt;/h2&gt;
  108. &lt;p&gt;Due to a miscalculation, the server I provisioned on Hetzner used spinning rust
  109. HDDs instead of SSDs. This gave us a ton of storage overhead we didn't need, and
  110. was also slow as fuck and made many simple things very painful. Even git
  111. operations and restarting services could take minutes instead of seconds.&lt;/p&gt;
  112. &lt;p&gt;The upgrade to Mastodon v4.2.0 last October was particularly painful. I first
  113. upgraded the server from Ubuntu 20.04 to Ubuntu 22.04, and planned to keep going
  114. to Ubuntu 24.04. This required a PostgreSQL upgrade from v15 to v17. I started
  115. this upgrade at 15:00, and gave up for the day when the database finally
  116. finished rebuilding at 01:30. The server was down the whole time. Bummer.&lt;/p&gt;
  117. &lt;h2&gt;A lot of effort went into making this look effortless&lt;/h2&gt;
  118. &lt;p&gt;A challenge of running a server like this is needing to know a little bit about
  119. everything. It was clear to me that I could do better than 10.5 hours of
  120. downtime, but I wasn't sure how to get there. I've done a lot of reading about
  121. PostgreSQL migration strategies since October.&lt;/p&gt;
  122. &lt;p&gt;The server database is backed up twice a day. The &lt;code&gt;pg_dump&lt;/code&gt; takes about 2 hours,
  123. and the upload is another half hour, to say nothing of restoring the db on a new
  124. host. Not awesome.&lt;/p&gt;
  125. &lt;p&gt;A test &lt;code&gt;rsync --checksum&lt;/code&gt; of the database took about 80 minutes, even for
  126. subsequent rsyncs that (in theory) had to transfer less data.&lt;/p&gt;
  127. &lt;p&gt;Replication was daunting, but I stuck with it. In the end it was pretty painless
  128. and worked &lt;em&gt;extremely&lt;/em&gt; well.&lt;/p&gt;
  129. &lt;p&gt;I created a replication role on the old server, xoxo-4:&lt;/p&gt;
  130. &lt;pre&gt;&lt;code&gt;CREATE ROLE xoxo5 WITH REPLICATION PASSWORD 'secret_password' LOGIN;
  131. &lt;/code&gt;&lt;/pre&gt;
  132. &lt;p&gt;And I updated the access rules in &lt;code&gt;/etc/postgresql/17/main/pg_hba.conf&lt;/code&gt;:&lt;/p&gt;
  133. &lt;pre&gt;&lt;code&gt;# Allow replication from xoxo5@10.0.0.5
  134. host    replication     xoxo5           10.0.0.5/32       scram-sha-256
  135. &lt;/code&gt;&lt;/pre&gt;
  136. &lt;p&gt;On the new host, xoxo-5, I emptied out the &lt;code&gt;/var/lib/postgresql/17/main&lt;/code&gt;
  137. directory and enabled replication:&lt;/p&gt;
  138. &lt;pre&gt;&lt;code&gt;sudo -u postgres pg_basebackup -h 10.0.0.4 -p 5432 -U xoxo5 -D /var/lib/postgresql/17/main/ -Fp -Xs -R
  139. &lt;/code&gt;&lt;/pre&gt;
  140. &lt;p&gt;This took a few hours but it was worth every second. Once the backup was done,
  141. the results were extremely promising: &lt;code&gt;select * from pg_stat_replication&lt;/code&gt; and
  142. &lt;a href="https://pgmetrics.io/"&gt;pgmetrics&lt;/a&gt; showed delays in the milliseconds, and spot checking counts in
  143. the &lt;code&gt;statuses&lt;/code&gt; and &lt;code&gt;accounts&lt;/code&gt; tables looked good (other than &lt;code&gt;count(*)&lt;/code&gt; taking
  144. over 10 minutes on xoxo-4).&lt;/p&gt;
  145. &lt;p&gt;In theory the hardest, slowest part was done: the 88GB database was ready for
  146. cutover whenever we were.&lt;/p&gt;
  147. &lt;h2&gt;Not zero-downtime but I remain chuffed&lt;/h2&gt;
  148. &lt;p&gt;I was emboldened by successful replication and from listening to Eurovision
  149. playlists at high volume for the previous hour. After some encouraging words
  150. like "why not" and "if you fuck this up maybe i can focus on work," I finalised
  151. a migration plan and kicked things off.&lt;/p&gt;
  152. &lt;p&gt;&lt;img alt="Screenshot from Discord, Clarity says: thinking emoji, if it goes wrong and the server crashes that'll probably just help me focus on work better" src="/media/2025/04/focus.png"&gt;&lt;/p&gt;
  153. &lt;p&gt;I had done a lot of work already at this point:&lt;/p&gt;
  154. &lt;ul&gt;
  155. &lt;li&gt;I had run the &lt;a href="https://docs.joinmastodon.org/admin/install/"&gt;server setup guide&lt;/a&gt; and finished an initial rsync on some
  156.  key directories, including the nginx config&lt;/li&gt;
  157. &lt;li&gt;A bunch of server config, including Mastodon service files, backup
  158.  configuration, and crons are in an Ansible playbook, which I had already run&lt;/li&gt;
  159. &lt;li&gt;The domain TTL was already ramped down to 60 seconds&lt;/li&gt;
  160. &lt;/ul&gt;
  161. &lt;p&gt;Winding down xoxo-4 looked like this:&lt;/p&gt;
  162. &lt;pre&gt;&lt;code&gt;mastodon-bounce stop all     # wrapper script that runs systemctl on all mastodon services
  163. mastodon-bounce disable all
  164. systemctl disable --now redis-server.service
  165. &lt;/code&gt;&lt;/pre&gt;
  166. &lt;p&gt;Bringing things back up on xoxo-5 looked like this:&lt;/p&gt;
  167. &lt;pre&gt;&lt;code&gt;/root/sync.sh # /home/mastodon/live, /var/lib/redis, /etc/letsencrypt, /etc/nginx
  168. pg_ctlcluster 17 main promote
  169. systemctl enable --now redis-server.service
  170. mastodon-bounce start all
  171. mastodon-bounce enable all
  172. RAILS_ENV=production ./bin/tootctl feeds build
  173. RAILS_ENV=production ./bin/tootctl search deploy
  174. &lt;/code&gt;&lt;/pre&gt;
  175. &lt;p&gt;I would also run a few SQL commands to check data consistency:&lt;/p&gt;
  176. &lt;pre&gt;&lt;code&gt;sudo -u postgres psql -c '\x' -c 'select * from pg_stat_replication'
  177. time sudo -u mastodon psql mastodon_production -c &amp;quot;select count(1) from statuses&amp;quot;
  178. time sudo -u mastodon psql mastodon_production -c &amp;quot;select id, created_at from statuses order by created_at desc limit 10&amp;quot;
  179. time sudo -u mastodon psql mastodon_production -c &amp;quot;select count(1) from accounts&amp;quot;
  180. &lt;/code&gt;&lt;/pre&gt;
  181. &lt;h2&gt;Job's done&lt;/h2&gt;
  182. &lt;p&gt;The migration took about 15 minutes from start to finish. Next time, with SSD
  183. hosts on both sides, I could probably get it down to seconds or maybe even zero
  184. downtime.&lt;/p&gt;
  185. &lt;p&gt;I did hit one snag that was obfuscated by caching in the Mastodon service
  186. worker: the mastodon account's home directory was created with permissions
  187. &lt;code&gt;0750&lt;/code&gt;, and Nginx could not read files in the web directory, causing a lot of
  188. busted client pages for about 30 minutes after I "finished" the migration.
  189. There's always something.&lt;/p&gt;
  190. &lt;p&gt;But still! It's done and I'm happy with how it went.&lt;/p&gt;
  191. &lt;p&gt;Let's not do it again for a long time.&lt;/p&gt;</content><category term="Web"></category><category term="mastodon"></category><category term="xoxo.zone"></category><category term="fediverse"></category></entry><entry><title>XOXO 2024</title><link href="https://sixohthree.com/xoxo-2024" rel="alternate"></link><published>2024-08-27T22:38:00-04:00</published><updated>2024-08-27T22:38:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2024-08-27:/xoxo-2024</id><summary type="html">&lt;p&gt;The final XOXO Festival wrapped up this weekend in Portland, Oregon. It was my fifth XOXO, and it's been 5 years since the previous festival, XOXO 2019.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="Five XOXO Festival badges" src="/media/2024/08/badges.jpg"&gt; &lt;em&gt;Badge lineup: 2015, 2016, 2018, 2019, 2024&lt;/em&gt;&lt;/p&gt;
  192. &lt;p&gt;The final XOXO Festival wrapped up this weekend in Portland, Oregon. It was my
  193. fifth XOXO, and it's been 5 years since the previous festival, XOXO 2019.&lt;/p&gt;
  194. &lt;p&gt;Five years is a long time. Maybe long enough that, like me, you see a change in
  195. yourself. Since 2019, I'm a little frayed around the edges, more cautious, more
  196. reserved in the face of an unfriendly world.&lt;/p&gt;
  197. &lt;p&gt;I have allowed myself to harden in the past five years. I saw it happening and I
  198. fucking leaned in. It was a learned response to a hostile environment. The
  199. timeline of this blog is a reflection of that change: withdrawal, retreat, a
  200. reluctance to engage.&lt;/p&gt;
  201. &lt;p&gt;XOXO is an event, yes. It's a particular point in time with a beginning and an
  202. end. But XOXO is also a feeling of curiosity, a sense of wonder, a rejection of
  203. cynicism, a community. A reminder. &lt;a href="https://xoxo.zone/@jkent/113036275692117626"&gt;A dream&lt;/a&gt;.&lt;/p&gt;
  204. &lt;p&gt;XOXO is made of people. This weekend, those people reminded me what it's like to
  205. allow myself to feel joy and hope. I saw a lot of old friends and maybe made
  206. some new ones. I heard their stories and felt their excitement. Hibernating
  207. parts of me woke up, did a little stretch, and thought maybe it's time to leave
  208. the cave.&lt;/p&gt;
  209. &lt;p&gt;It's easy to harden up. &lt;a href="https://www.youtube.com/watch?v=cNwy1Th4NYo"&gt;Only natural&lt;/a&gt;, as I heard through &lt;a href="https://aratin.gay/"&gt;a friend&lt;/a&gt;.
  210. Going soft again is not so easy. All these great people make me want to at least
  211. try.&lt;/p&gt;
  212. &lt;p&gt;There will not be another XOXO Festival, but there are many people who embody
  213. its spirit, whether they associate it with the festival or not. I will try to
  214. remember that without the festival's periodic reminder.&lt;/p&gt;
  215. &lt;p&gt;&lt;img alt="People at night on a lawn under strings of lights, in front of a large white tent" src="/media/2024/08/tent.jpg"&gt;
  216. &lt;em&gt;The traditional "leaving XOXO" shot, 2024&lt;/em&gt;&lt;/p&gt;
  217. &lt;h2&gt;Collected XOXO 2024 Posts&lt;/h2&gt;
  218. &lt;ul&gt;
  219. &lt;li&gt;&lt;a href="https://www.spideyj.com/the-final-xoxo/"&gt;The Final XOXO&lt;/a&gt; by Kit Jones (SpideyJ)&lt;/li&gt;
  220. &lt;li&gt;&lt;a href="https://hey.georgie.nu/post-xoxo/"&gt;some thoughts (but not enough thoughts), post-XOXO 2024&lt;/a&gt; by  Georgie&lt;/li&gt;
  221. &lt;li&gt;&lt;a href="https://buttondown.com/hupfen/archive/this-will-all-end-in-tears/"&gt;This Will All End in Tears&lt;/a&gt; by Zoe Landon&lt;/li&gt;
  222. &lt;li&gt;&lt;a href="https://lyonheart.us/xoxo-2024/"&gt;My experience of XOXO 2024&lt;/a&gt; by Matthew Lyon&lt;/li&gt;
  223. &lt;li&gt;&lt;a href="https://brookshelley.com/posts/2024-08-27-xoxo/"&gt;The Last XOXO: 2024&lt;/a&gt; by Brook Shelley&lt;/li&gt;
  224. &lt;li&gt;&lt;a href="https://kottke.org/24/08/thanks-xoxo"&gt;Thanks, XOXO&lt;/a&gt; by Jason Kottke&lt;/li&gt;
  225. &lt;li&gt;&lt;a href="https://phildini.dev/xoxo-2024"&gt;XOXO 2024&lt;/a&gt; by Phil Dini&lt;/li&gt;
  226. &lt;li&gt;&lt;a href="https://bamoon.com/my-first-year-with-xoxo/"&gt;My first year with XOXO&lt;/a&gt; by Brian Moon&lt;/li&gt;
  227. &lt;li&gt;&lt;a href="https://justinpot.com/the-internet-doesnt-have-to-feel-like-this/"&gt;The internet doesn’t have to feel like this&lt;/a&gt; by Justin Pot&lt;/li&gt;
  228. &lt;li&gt;&lt;a href="https://netninja.com/2024/08/29/lowering-expectations-one-project-at-a-time/"&gt;Lowering Expectations, One Project at a Time&lt;/a&gt; by BrianEnigma&lt;/li&gt;
  229. &lt;li&gt;&lt;a href="https://geekdad.com/2024/08/creating-community-at-xoxo/"&gt;Creating Community at XOXO&lt;/a&gt; by Jonathan Liu&lt;/li&gt;
  230. &lt;li&gt;&lt;a href="https://jrubenoff.com/writing/xoxo-festival/"&gt;XOXO taught me it was OK to be weird&lt;/a&gt; by Josh Rubenoff&lt;/li&gt;
  231. &lt;li&gt;&lt;a href="https://benjaminchait.net/archives/xoxo-2024"&gt;XOXO 2024&lt;/a&gt; by Benjamin Chait&lt;/li&gt;
  232. &lt;li&gt;&lt;a href="https://emorydunn.com/blog/2024/09/xoxo/"&gt;XOXO&lt;/a&gt; by Emory Dunn&lt;/li&gt;
  233. &lt;li&gt;&lt;a href="https://open.substack.com/pub/byvishmili/p/spotted-a-deep-dive-into-the-digital"&gt;Spotted: A deep dive into the digital jungle, where the survival of the fittest isn’t about brawn but brains—and a little (a lot of) kindness, too&lt;/a&gt; by Višnja Milidragović&lt;/li&gt;
  234. &lt;li&gt;&lt;a href="https://jwithy.weblog.lol/2024/09/it-has-been-a-time"&gt;It has been a time&lt;/a&gt; by Jim Withington&lt;/li&gt;
  235. &lt;li&gt;&lt;a href="https://www.mmmx.cloud/after-xoxo"&gt;After xoxo&lt;/a&gt; by Ním Daghlian&lt;/li&gt;
  236. &lt;li&gt;&lt;a href="https://clarity.flowers/journal/goodbye_xoxo.html"&gt;goodbye, xoxo&lt;/a&gt; by clarity flowers&lt;/li&gt;
  237. &lt;li&gt;&lt;a href="https://www.rawsignal.ca/newsletter-archive/lower-your-expectations"&gt;Lower your expectations&lt;/a&gt; by Johnathan and Melissa Nightingale&lt;/li&gt;
  238. &lt;li&gt;&lt;a href="https://arun.is/blog/farewell-xoxo/"&gt;Farewell, XOXO&lt;/a&gt; by Arun Venkatesan&lt;/li&gt;
  239. &lt;li&gt;Photo album: &lt;a href="https://www.flickr.com/photos/linkletter/albums/72177720320167689/"&gt;XOXO Festival 2024&lt;/a&gt; by Ian Linkletter&lt;/li&gt;
  240. &lt;/ul&gt;</content><category term="Personal"></category><category term="xoxo"></category></entry><entry><title>Marshall Turner Moulton, 1928-2022</title><link href="https://sixohthree.com/marshall-turner-moulton" rel="alternate"></link><published>2022-07-27T21:15:00+00:00</published><updated>2022-07-27T21:15:00+00:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2022-07-27:/marshall-turner-moulton</id><summary type="html">&lt;p&gt;Rest in peace, Grampy.&lt;/p&gt;</summary><content type="html">&lt;p&gt;January 3, 1928 - July 22, 2022. Rest in peace, Grampy.&lt;/p&gt;
  241. &lt;p&gt;&lt;img alt="Marshall Turner Moulton" src="/media/2022/mtm.jpg"&gt;&lt;/p&gt;</content><category term="Personal"></category></entry><entry><title>Introductions</title><link href="https://sixohthree.com/introductions" rel="alternate"></link><published>2022-04-26T18:37:00-04:00</published><updated>2022-04-26T18:37:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2022-04-26:/introductions</id><summary type="html">&lt;p&gt;Welcome to Mastodon&lt;/p&gt;</summary><content type="html">&lt;p&gt;Is Elon Musk buying Twitter? Maybe.&lt;/p&gt;
  242. &lt;p&gt;Is the Fediverse hoppin'? Definitely.&lt;/p&gt;
  243. &lt;p&gt;&lt;img alt="introductions" src="/media/2022/introductions.png"&gt;&lt;/p&gt;</content><category term="Social"></category><category term="mastodon"></category><category term="twitter"></category></entry><entry><title>Hollybank Road</title><link href="https://sixohthree.com/hollybank-road" rel="alternate"></link><published>2022-03-31T12:03:00+01:00</published><updated>2022-03-31T12:03:00+01:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2022-03-31:/hollybank-road</id><summary type="html">&lt;p&gt;What I want to remember&lt;/p&gt;</summary><content type="html">&lt;p&gt;Air thick with the smell of spring onions.&lt;/p&gt;
  244. &lt;p&gt;Cool beers and good craic over the garden wall on any night of the week.&lt;/p&gt;
  245. &lt;p&gt;That's what I will carry with me.&lt;/p&gt;</content><category term="Personal"></category></entry><entry><title>ACNH: Removing a Deleted Profile's House</title><link href="https://sixohthree.com/acnh-removing-deleted-profiles-house" rel="alternate"></link><published>2021-11-13T14:32:00+00:00</published><updated>2021-11-13T14:32:00+00:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2021-11-13:/acnh-removing-deleted-profiles-house</id><summary type="html">&lt;p&gt;A new profile can claim an abandoned house. This took me a while to figure out.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; To remove the house of a player whose profile is deleted from your
  246. Switch, just start up ACNH has a user who does not have a house,
  247. and link them to the deleted profile.&lt;/p&gt;
  248. &lt;p&gt;A while back my kids got ahold of my Switch, and created a profile (not linked
  249. to a Nintendo account, in this case) and made themselves a house (or tent) on my
  250. island in Animal Crossing: New Horizons. I deleted this profile but to my
  251. surprise, the house stayed behind. The normal process to delete a resident and
  252. their house is to launch them game with their profile, press the "minus" key on
  253. the title screen, and request to delete your data. This was no longer possible
  254. because I had deleted the anonymous profile.&lt;/p&gt;
  255. &lt;p&gt;The fix is actually pretty simple, if non-obvious. This took me a bit to figure
  256. out so I'm writing it here for posterity.&lt;/p&gt;
  257. &lt;h2&gt;Claiming the house with a new profile&lt;/h2&gt;
  258. &lt;p&gt;In short, if you have deleted user data on the island, and launch the game with
  259. a new profile (that doesn't have a house), you'll be asked if you want to link
  260. the abandoned resident with the new profile. Once you've linked them, you can
  261. use the regular process to delete the resident data from the title scree, and
  262. then delete the profile (if you created it just for this purpose).&lt;/p&gt;
  263. &lt;p&gt;There are a few warnings and prompts along the way. The whole process can be
  264. seen in the screenshots below.&lt;/p&gt;
  265. &lt;p&gt;&lt;img alt="Notification of existing resident data not linked to a user account" src="/media/2021/11/01.jpg"&gt;&lt;/p&gt;
  266. &lt;p&gt;&lt;img alt="Prompt to play using existing resident data" src="/media/2021/11/02.jpg"&gt;&lt;/p&gt;
  267. &lt;p&gt;&lt;img alt="Notification of number of players with unlinked data" src="/media/2021/11/03.jpg"&gt;&lt;/p&gt;
  268. &lt;p&gt;&lt;img alt="Prompt to select user to play as" src="/media/2021/11/04.jpg"&gt;&lt;/p&gt;
  269. &lt;p&gt;&lt;img alt="Warning when user does not have a linked Nintendo Account" src="/media/2021/11/05.jpg"&gt;&lt;/p&gt;
  270. &lt;p&gt;&lt;img alt="Warning that Internet-related features will be reset" src="/media/2021/11/06.jpg"&gt;&lt;/p&gt;
  271. &lt;p&gt;&lt;img alt="Confirmation to play as selected resident" src="/media/2021/11/07.jpg"&gt;&lt;/p&gt;
  272. &lt;p&gt;&lt;img alt="Account linking screen" src="/media/2021/11/08.jpg"&gt;&lt;/p&gt;
  273. &lt;p&gt;&lt;img alt="Notification that data was updated" src="/media/2021/11/09.jpg"&gt;&lt;/p&gt;
  274. &lt;p&gt;&lt;img alt="Notification that profile will now play as the selected resident" src="/media/2021/11/10.jpg"&gt;&lt;/p&gt;
  275. &lt;!-- links --&gt;</content><category term="Games"></category><category term="acnh"></category><category term="animal crossing: new horizons"></category></entry><entry><title>Kingswood 2461</title><link href="https://sixohthree.com/kingswood-2461" rel="alternate"></link><published>2021-03-20T22:13:00-04:00</published><updated>2021-03-20T22:13:00-04:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2021-03-20:/kingswood-2461</id><summary type="html">&lt;p&gt;My Mom's childhood phone number.&lt;/p&gt;</summary><content type="html">&lt;p&gt;My Mom's childhood phone number in Rockport, Massachusetts was Kingswood 2461.
  276. This would have been some time in the mid to late 1950s.&lt;/p&gt;
  277. &lt;p&gt;This is not useful information. It's just a funny thing she told me once, and I
  278. wrote it down. Now I'm writing it here, where maybe a bunch of robots will put
  279. it on a bunch of hard drives and remember it forever.&lt;/p&gt;
  280. &lt;p&gt;That's all.&lt;/p&gt;</content><category term="Personal"></category></entry><entry><title>Hades: There is No Escape</title><link href="https://sixohthree.com/hades-there-is-no-escape" rel="alternate"></link><published>2020-11-15T22:56:00-05:00</published><updated>2020-11-15T22:56:00-05:00</updated><author><name>Annika Backstrom</name></author><id>tag:sixohthree.com,2020-11-15:/hades-there-is-no-escape</id><summary type="html">&lt;p&gt;After just over 80 hours, I've finally reached the epilogue in Hades.&lt;/p&gt;</summary><content type="html">&lt;p&gt;After just over 80 hours, I've finally reached the epilogue in &lt;a href="https://www.supergiantgames.com/games/hades/"&gt;Hades&lt;/a&gt;. As a
  281. &lt;a href="https://en.wikipedia.org/wiki/Roguelike"&gt;roguelike&lt;/a&gt;, you maybe never "finish," but the epilogue is a pretty
  282. significant milestone. It feels especially signifcant for me, as I don't have a
  283. great track record of sticking with games these days.&lt;/p&gt;
  284. &lt;p&gt;I picked Hades up on the Nintendo Switch after its 1.0 release in September.
  285. After a few very satisfying runs, I bought the game on Steam on September 25. My
  286. first clear on PC was October 23, I finished the main storyline on October 25,
  287. and it took until November 15 to reach the epilogue, 82 hours in.&lt;/p&gt;
  288. &lt;p&gt;Hades checks a lot of boxes for me: the characters (and voices) are great, the
  289. combat is fast and fun, there's lots of variety available in each run, and I can
  290. feel myself improve with practice. I'll probably keep playing for a while yet:
  291. there are still a few achievements left for me, plus a whole lotta heat to push.&lt;/p&gt;
  292. &lt;p&gt;&lt;a href="https://sixohthree.com/media/2020/11/hades.jpg"&gt;&lt;img alt="Hades &amp;quot;win&amp;quot; screen showing victory in 42 minutes, 58 seconds" src="https://sixohthree.com/media/2020/11/hades.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
  293. &lt;!-- links --&gt;</content><category term="Games"></category><category term="Hades"></category><category term="Roguelike"></category></entry></feed>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=https%3A//sixohthree.com/feeds/atom.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda