Blob


1 ---
3 ### 1.1. Motivation, Communication
5 I signed up for Twitter account back in 2007.
6 I was 15 years old and didn't really get it.
7 All I knew was that the people whose blogs I subscribed to via RSS were now also *microblogging*.
8 Since that time I've doubled in age and still don't get it.
9 But I *still* use
10 [NetNewsWire],
11 [mutt],
12 [Sylpheed],
13 [MailMate],
14 and Apple's Mail.app
15 across OpenBSD, Linux, macOS and iOS.
17 Reddit and Twitter lost the plot around the same time
18 (see [2023 Reddit API controversy] and [3rd Party Twitter Apps]).
19 No big deal.
21 Here and there I would read posts to smaller communities on Reddit (via RSS)
22 and read the comment threads (`old.reddit.com` forever).
23 Links to Twitter get thrown around sometimes too.
24 But I knew us nerds wouldn't settle until we had our artisanally crafted apps back.
25 What would we come up with next?
27 I'd heard of [Mastodon] before,
28 maybe [Lemmy], too.
29 I looked at screenshots of the default interfaces and immediately thought "nope".
31 As a lover of [Plan 9]
32 and weirdo who mucks around with network protocols for fun,
33 platforms are boring.
34 What excites me is *communication*!
35 Exchanging messages *between* people, systems, and places we can't think of yet!
36 It's what makes receiving even just a single email from a random person such a viscerally distinct experience from
37 thousands reading your post you uploaded somewhere.
38 We're communicating!
40 Then I heard that Lemmy can interact with Mastodon.
41 "That's cool", I thought.
42 But nothing excited me more when I read this about how it actually worked:
44 > ActivityPub is a lot like email.
45 > You post stuff to inboxes and people read your outbox.
47 Maybe these new systems weren't platforms after all.
48 Maybe there was no platform.
50 ### 1.2 Lemmy API
54 ### 1.2 Mastodon API
56 It started with a script.
57 `mastodump` read my timeline via the Mastodon HTTP API,
58 then wrote each status as a [RFC5322] message – an email – to the filesystem:
60 for status in timeline():
61 if os.path.isfile(status.id):
62 continue
63 with open(status.id) as f:
64 print("From: <%s>\n" % status.owner, file=f)
65 print("Subject: %s\n" % status.body, file=f)
66 print("Message-ID: <%d>\n" % status.id, file=f)
67 print("\n", file=f)
68 print(status.body, file=f)
70 `cron` executed `mastodump` every 5 minutes for me.
72 To create posts, I wrote `mastopost`.
73 It was a small SMTP server which received messages over SMTP and created posts to Mastodon:
75 laptop --SMTP--> mastopost --HTTP--> Mastodon --> fediverse
77 ---
79 The problem with both of these approaches is that what I'm really doing is
80 I'm not really communicating with the world.
81 Instead, I'm uploading some data to a platform.
82 My client keeps track of the state of my little platform (my Mastodon/Lemmy instance).
83 My instance manages communication with the outside world for me.