Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1ecba89ab4 | |||
| bad56eb06a | |||
| 5ac1e637fc | |||
| 262afbb425 |
22 changed files with 8094 additions and 12 deletions
BIN
Ali Alkhatib - Defining AI/AI_laundry.png
Normal file
BIN
Ali Alkhatib - Defining AI/AI_laundry.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 217 KiB |
Binary file not shown.
1995
Ali Alkhatib - Defining AI/Ali Alkhatib - Defining AI.en.pdf
Normal file
1995
Ali Alkhatib - Defining AI/Ali Alkhatib - Defining AI.en.pdf
Normal file
File diff suppressed because it is too large
Load diff
45
Ali Alkhatib - Defining AI/build.sh
Executable file
45
Ali Alkhatib - Defining AI/build.sh
Executable file
|
|
@ -0,0 +1,45 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
basedir="$(dirname "$0")"
|
||||
basedir="$(realpath "$basedir")"
|
||||
cd "$basedir"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
TARGETFILE="$name".$TARGETLANG.pdf
|
||||
TARGETFILEBOOK="$name".${TARGETLANG}-book.pdf
|
||||
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" ./"$TARGETFILE"; then
|
||||
echo "Failed to compile "$name"/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Compiled read mode. Now compiling print mode."
|
||||
|
||||
if ! command -v pdfbook2; then
|
||||
echo "ERROR: pdfbook2 not installed. Not compiling print mode."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
typst compile --input format=booklet --root .. ./"$SOURCEFILE" "$t"
|
||||
|
||||
# Need to be in the folder there for it to work, otherwise it
|
||||
# tries to rename from current partition to /tmp which of course fails
|
||||
parent="$(dirname "$t")"
|
||||
newFileName="$(basename "$t" .pdf)-book.pdf"
|
||||
newFile="$parent"/"$newFileName"
|
||||
cd "$parent"
|
||||
|
||||
pdfbook2 --paper=a4paper "$t" --no-crop --outer-margin=0 --inner-margin=0 --top-margin=0 --bottom-margin=0
|
||||
|
||||
cd "$basedir"
|
||||
cp "$newFile" "$TARGETFILEBOOK"
|
||||
echo "Booklet available in $TARGETFILEBOOK"
|
||||
25
Ali Alkhatib - Defining AI/dev.sh
Executable file
25
Ali Alkhatib - Defining AI/dev.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" "$t"; then
|
||||
echo "Failed to compile $name/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Initial compilation successful. Now starting watch mode. Opening $t"
|
||||
xdg-open "$t"
|
||||
|
||||
typst watch --root .. ./"$SOURCEFILE" "$t"
|
||||
133
Ali Alkhatib - Defining AI/main.en.typ
Normal file
133
Ali Alkhatib - Defining AI/main.en.typ
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
// Default margin for readability
|
||||
#set page(
|
||||
margin: (inside: 1.5cm, outside: 1.5cm),
|
||||
)
|
||||
#set quote(
|
||||
block: true,
|
||||
)
|
||||
#show quote: set text(
|
||||
style: "italic",
|
||||
)
|
||||
// If input format == "booklet", we alternate
|
||||
// margins for print format. Otherwise, we set
|
||||
// equivalent margins on both sides.
|
||||
#set page(
|
||||
margin: (inside: 2cm, outside: 1cm),
|
||||
) if "format" in sys.inputs and sys.inputs.format == "booklet"
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
)
|
||||
#set text(
|
||||
font: "DejaVu Sans",
|
||||
size: 17.3pt,
|
||||
)
|
||||
#set par(justify: true)
|
||||
|
||||
#align(
|
||||
center,
|
||||
text(
|
||||
size: 48pt,
|
||||
// font: "Communard",
|
||||
[ = Defining AI ]
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
image(height: 50%, "AI_laundry.png"),
|
||||
),
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
[ *Ali Alkhatib, December 6 2024* ],
|
||||
)
|
||||
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#show heading.where(level: 2): set block(above: 1.5em, below: 1.5em)
|
||||
#set page(
|
||||
numbering: "1",
|
||||
)
|
||||
|
||||
The main issue I have with a lot of work that tries to define AI is that the criteria they use to draw boundaries often turn out to be functionally useless for my needs; these definitions lead us to weird places, letting scholars fixate on strange, unworkable frameworks. Those pedantic fixations don’t really benefit the organizers, activists, regular people who are getting crushed by the systems they’re trying to work against. So I’m going to try to unpack how I think about AI; how I trace the boundaries of the term in a way that’s as useful as possible for me and my needs; and how I would encourage you to scope or define ideas that are important to your work.
|
||||
|
||||
Let’s look at how AI Snake Oil, by Naranayan and Kapoor, sets out to define AI. The authors pose 3 questions to loosely infer whether something is AI:
|
||||
|
||||
#quote[
|
||||
Does the task require creative effort or training for a human to perform? [page 12]
|
||||
|
||||
Was the behavior of the system directly specified in code by the developer, or did it indirectly emerge, say by learning from examples or searching through a database? [page 13]
|
||||
|
||||
… whether the system makes decisions more or less autonomously and possesses some degree of flexibility and adaptability to the environment. [page 13]
|
||||
]
|
||||
|
||||
I found these questions a little nebulous and indeterminate. I think you could spend some time litigating what constitutes creative effort, what reflects an “indirectly emergent behavior”, what satisfies “some degree of flexibility”, and so on.
|
||||
|
||||
Fortunately, they offer some examples. Examples can be a great way to disambiguate something like a definition, or a framework for thinking about a problem. A salient example can help affirm or problematize the motivating idea - if a framework should have something to say about an issue, I like to try to work through it and see what it offers. It’s a good sign if the framework suggests something that makes sense - even better if that framework brings something into focus that wasn’t obvious otherwise. A good definition can help sensitize us to critical details that we might otherwise overlook.
|
||||
|
||||
Okay, I’ll digress from talking about the virtues of good writing and framework-building like this. Let’s look at an example they provide that offers contrasts between a clear case of AI and a clear case of not-AI:
|
||||
|
||||
#quote[
|
||||
… an insurance pricing formula, for example, might be considered AI if it was developed by having the computer analyze past claims data, but not if it was a direct result of an expert’s knowledge, even if the actual rule was identical in both cases. [page 13]
|
||||
]
|
||||
|
||||
I was pretty stumped by this example. My instinct was to ask in what sense this distinction matters, and especially why it’s being held so prominently. If anything, it struck me as an illustrative example of the abject failure of an approach to defining AI that’s contingent on the inner workings of the system - because anybody who has experienced health insurance claims systems can tell you that you don’t get a lot of insight into how the system works. You certainly don’t get to know whether you’re in the former system or the latter without a lot of litigation and paperwork.
|
||||
|
||||
This distinction grated at me for some time, because as far as I was concerned it didn’t really matter if you were dealing with two identical systems - identical decisions, identical opacity, identical absence of accountability - whether one is AI and the other not. Only they, the computer scientists argue, can affirmatively identify one system as AI while another, identical system, is not.
|
||||
|
||||
It frustrated me for a while; the implication that computer scientists and other technical experts should effectively chaperone the collective efforts of activists and organizers against these systems is deeply offensive to me. But at least it brought into focus another critique they offered later:
|
||||
|
||||
#quote[
|
||||
Civil rights advocates have often lumped together facial recognition [technology (FRT)] with other error-prone technologies used in the criminal justice system, like those that predict the risk of crime—despite the fact that the two technologies have nothing in common and the fact that error rates differ by many orders of magnitude. [page 16]
|
||||
]
|
||||
|
||||
Again, I found this interpretation of a coalition of civil rights advocates quite strange at first. Perhaps this is the difference between an anthropologist-trained computer scientist and a pair of computer scientists trained through-and-through as such, but my first instinct was to think about what civil rights advocates understand about the ecology of policing technology that gives them the perspective to recognize this constellation of technologies as neighbors of one another. What do they know that I, as a relative outsider to their collective effort, obviously don’t?
|
||||
|
||||
The Stop LAPD Spying Coalition produced a whole documentary #footnote[https://www.youtube.com/watch?v=-ldiWO3k-do] explaining their rationale, where they talk about some of the work they did to figure out what connecting through-lines bind them together. I don’t think it takes a particularly sharp mind to understand that the coalitions against FRT, against predictive policing, against prisons, etc… are working against a constellation of politically closely-related politics that happen to be implemented on a range of disparate technologies.
|
||||
|
||||
One might inspect handguns and stun guns, come to the conclusion that these are two totally different technologies because they don’t operate on the same technical principles at all, and embarrassingly overlook that they’re obviously both tools police use to maim and kill people. You don’t need to deconstruct a handgun and a stun gun to understand their adjacent, often overlapping, roles in policing. Fixating on the firing mechanisms can apparently desensitize someone to the political neighborhood these technologies share, and make a person a very unreliable ally in an ongoing collective struggle to abolishing policing.
|
||||
|
||||
#line()
|
||||
|
||||
|
||||
|
||||
I think we should shed the idea that AI is a technological artifact with political features and recognize it as a political artifact through and through. AI is an ideological project to shift authority and autonomy away from individuals, towards centralized structures of power. Projects that claim to “democratize” AI routinely conflate “democratization” with “commodification”. Even open-source AI projects often borrow from libertarian ideologies to help manufacture little fiefdoms.
|
||||
|
||||
This way of thinking about AI (as a political project that happens to be implemented technologically in myriad ways that are inconsequential to identifying the overarching project as “AI”) brings the discipline - reaching at least as far back as the 1950s and 60s, drenched in blood from military funding - into focus as part of the same continuous tradition.
|
||||
|
||||
Defining AI along political and ideological language allows us to think about things we experience and recognize productively as AI, without needing the self-serving supervision of computer scientists to allow or direct our collective work. We can recognize, based on our own knowledge and experience as people who deal with these systems, what’s part of this overarching project of disempowerment by the way that it renders autonomy farther away from us, by the way that it alienates our authority on the subjects of our own expertise.
|
||||
|
||||
This framework sensitizes us to “small” systems that cause tremendous harm because of the settings in which they’re placed and the authority people place upon them; and it inoculates us against fixations on things like regulating systems just because they happened to use 10^26 floating point calculations #footnote[https://digitaldemocracy.calmatters.org/bills/ca_202320240sb1047] in training - an arbitrary threshold, denoting nothing in particular, beneath which actors could (and do) cause monumental harms already, today.
|
||||
|
||||
Okay, that was a bit of a post. Whether you subscribe to this way of defining AI or you totally reject it, I hope I’ve made it more salient to you that you can judge frameworks entirely according to how well it helps you navigate a space you’re trying to navigate. You can reject a definition that isn’t helping you, and I would encourage you to reject mine just as readily as I rejected AI Snake Oil’s if it’s not serving your purposes.
|
||||
|
||||
I’ll wrap it up here; if you’re benefiting from some particular way of drawing a boundary around and thinking about AI, I’d really like to hear about it.
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#set page(
|
||||
numbering: none,
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
block(
|
||||
height: 50%,
|
||||
width: 80%,
|
||||
[
|
||||
= What is AI, really?
|
||||
\
|
||||
|
||||
Ali Alkhatib, digital ethics researcher, proposes an unconventional definition. Why have long debates around what's intelligent or not, whether machine learning can reason or learn, and such technicalities?
|
||||
|
||||
By focusing on the context, goals and structures of AI as a political project, Ali Alkhatib offers a new view on AI as a project of disempowerment, in the continuation of existing power structures.
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
image("../resources/noslop.svg"),
|
||||
)
|
||||
BIN
Bluesky problems/Bluesky problems.en-book.pdf
Normal file
BIN
Bluesky problems/Bluesky problems.en-book.pdf
Normal file
Binary file not shown.
3636
Bluesky problems/Bluesky problems.en.pdf
Normal file
3636
Bluesky problems/Bluesky problems.en.pdf
Normal file
File diff suppressed because it is too large
Load diff
4
Bluesky problems/bluesky.svg
Normal file
4
Bluesky problems/bluesky.svg
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="600" height="530" version="1.1" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" fill="#1185fe"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 745 B |
BIN
Bluesky problems/bluesky_arch.png
Normal file
BIN
Bluesky problems/bluesky_arch.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 161 KiB |
45
Bluesky problems/build.sh
Executable file
45
Bluesky problems/build.sh
Executable file
|
|
@ -0,0 +1,45 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
basedir="$(dirname "$0")"
|
||||
basedir="$(realpath "$basedir")"
|
||||
cd "$basedir"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
TARGETFILE="$name".$TARGETLANG.pdf
|
||||
TARGETFILEBOOK="$name".${TARGETLANG}-book.pdf
|
||||
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" ./"$TARGETFILE"; then
|
||||
echo "Failed to compile "$name"/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Compiled read mode. Now compiling print mode."
|
||||
|
||||
if ! command -v pdfbook2; then
|
||||
echo "ERROR: pdfbook2 not installed. Not compiling print mode."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
typst compile --input format=booklet --root .. ./"$SOURCEFILE" "$t"
|
||||
|
||||
# Need to be in the folder there for it to work, otherwise it
|
||||
# tries to rename from current partition to /tmp which of course fails
|
||||
parent="$(dirname "$t")"
|
||||
newFileName="$(basename "$t" .pdf)-book.pdf"
|
||||
newFile="$parent"/"$newFileName"
|
||||
cd "$parent"
|
||||
|
||||
pdfbook2 --paper=a4paper "$t" --no-crop --outer-margin=0 --inner-margin=0 --top-margin=0 --bottom-margin=0
|
||||
|
||||
cd "$basedir"
|
||||
cp "$newFile" "$TARGETFILEBOOK"
|
||||
echo "Booklet available in $TARGETFILEBOOK"
|
||||
BIN
Bluesky problems/decentralization.jpg
Normal file
BIN
Bluesky problems/decentralization.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 335 KiB |
25
Bluesky problems/dev.sh
Executable file
25
Bluesky problems/dev.sh
Executable file
|
|
@ -0,0 +1,25 @@
|
|||
#! /usr/bin/env bash
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" "$t"; then
|
||||
echo "Failed to compile $name/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Initial compilation successful. Now starting watch mode. Opening $t"
|
||||
xdg-open "$t"
|
||||
|
||||
typst watch --root .. ./"$SOURCEFILE" "$t"
|
||||
270
Bluesky problems/main.en.typ
Normal file
270
Bluesky problems/main.en.typ
Normal file
|
|
@ -0,0 +1,270 @@
|
|||
// Default margin for readability
|
||||
#set page(
|
||||
margin: (inside: 1.5cm, outside: 1.5cm),
|
||||
)
|
||||
#set quote(
|
||||
block: true,
|
||||
)
|
||||
#show quote: set text(
|
||||
style: "italic",
|
||||
)
|
||||
// If input format == "booklet", we alternate
|
||||
// margins for print format. Otherwise, we set
|
||||
// equivalent margins on both sides.
|
||||
#set page(
|
||||
margin: (inside: 2cm, outside: 1cm),
|
||||
) if "format" in sys.inputs and sys.inputs.format == "booklet"
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
)
|
||||
#set text(
|
||||
font: "DejaVu Sans",
|
||||
size: 15.7pt,
|
||||
)
|
||||
#set par(justify: true)
|
||||
|
||||
#align(
|
||||
center,
|
||||
text(
|
||||
size: 48pt,
|
||||
// font: "Communard",
|
||||
[ = Bluesky problems ]
|
||||
) + text(
|
||||
size: 19pt,
|
||||
[ = What Silicon Valley won't tell you ],
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
image(height: 50%, "bluesky.svg"),
|
||||
),
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
[ *Multiple authors - 2025-2026* ],
|
||||
)
|
||||
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#show heading.where(level: 2): set block(above: 1.5em, below: 1.5em)
|
||||
#set page(
|
||||
numbering: "1",
|
||||
)
|
||||
|
||||
= Be Wary of Bluesky
|
||||
|
||||
_Kevin Åberg Kultalahti (February 21 2026) on kevinak.se_
|
||||
|
||||
In 2023, Bluesky's CTO Paul Frazee was asked what would happen if Bluesky ever turned against its users. His answer:
|
||||
|
||||
#quote("it would look something like this: bluesky has gone evil. there's a new alternative called freesky that people are rushing to. I'm switching to freesky")
|
||||
|
||||
*That's the same argument people made about Twitter.* "If it goes bad, we'll just leave." We know how that played out.
|
||||
|
||||
== The promise
|
||||
|
||||
Bluesky is built on ATProto, an open protocol. The pitch is simple: your data is yours, your identity is yours, and if you don't like what Bluesky is doing, you can take everything and leave. Apps like Tangled (git hosting), Grain (photos), and Leaflet (publishing) all plug into the same protocol. One account, many apps, no lock-in.
|
||||
|
||||
It sounds great. But look closer.
|
||||
|
||||
== Where your data actually lives
|
||||
|
||||
When you use any ATProto app, it writes data to your Personal Data Server, or PDS. Your Bluesky posts, your Tangled issues, your Leaflet publications, your Grain photos. All of it goes to the same place.
|
||||
|
||||
*For almost every user, that place is a server run by Bluesky.*
|
||||
|
||||
You can self-host a PDS. Almost nobody does. Why would they? Bluesky's PDS works out of the box with every app, zero setup, zero maintenance. Self-hosting means running a server, keeping it online, and gaining nothing in return.
|
||||
|
||||
To be fair, migration tools exist. You can move your account to a self-hosted PDS for as little as \$5 a month. Bluesky has made this easier over time and even supports moving back. But this only works if you do it before the door closes. If an acquirer disables exports, it doesn't matter that the tools existed yesterday. And we know from every platform transition in history that almost nobody takes proactive steps to protect their data.
|
||||
|
||||
== The flywheel
|
||||
|
||||
Here's the part that worries me.
|
||||
|
||||
Every new ATProto app makes this problem worse, not better. Each app tells you "sign in with your Bluesky account", which really means "write more data to Bluesky's servers." The more apps that launch, the more users depend on Bluesky's infrastructure, the less reason anyone has to leave.
|
||||
|
||||
*The protocol doesn't distribute value across the network. It concentrates it.* Developers are building features on top of Bluesky's infrastructure for free, making it more indispensable with every app that ships.
|
||||
|
||||
And Bluesky gets to claim the moral high ground the whole time. "We're open! We're decentralized! You can leave whenever you want!" Meanwhile, the switching cost goes up every day.
|
||||
|
||||
== The chokepoints
|
||||
|
||||
It's not just the PDS. Bluesky controls almost every critical layer:
|
||||
|
||||
*The Relay.* All data flows through it. Bluesky runs the dominant one. Whoever controls the relay controls what gets seen, hidden, or deprioritized. Third parties can run their own, but without the users, it doesn't matter.
|
||||
|
||||
*The AppView.* This is what assembles your timeline, threads, and notifications. Bluesky runs the main one. If it goes down or goes hostile, every client that depends on it breaks.
|
||||
|
||||
*The DID Directory.* Your identity on ATProto resolves through a centralized directory run by Bluesky. They've called it a "placeholder" since 2023 and said they plan to decentralize it. There's still no timeline.
|
||||
|
||||
*At every layer, the answer is "anyone can run their own." At every layer, almost nobody does.*
|
||||
|
||||
== The Gmail problem
|
||||
|
||||
Email is an open, federated protocol. Anyone can run a mail server. In practice, running your own mail server is painful and everyone just uses Gmail. The protocol being "open" didn't prevent centralization.
|
||||
|
||||
ATProto might be worse. With email, at least each app connects to your own server. With ATProto, each new app adds more data to the same centralized PDS. The open protocol is actually a centralization flywheel.
|
||||
|
||||
== What happens in an acquisition
|
||||
|
||||
Say someone buys Bluesky. They now control:
|
||||
|
||||
- The PDS for nearly every user
|
||||
- The main relay
|
||||
- The main AppView
|
||||
- The DID directory that resolves every identity
|
||||
|
||||
They could disable data export. They could cut off third-party apps. They could shut down federation. They could insert ads, shadow ban users, deprioritize content.
|
||||
|
||||
And the blast radius isn't just Bluesky the social network. It's every app in the ecosystem. Your git issues on Tangled, your posts on Leaflet, your photos on Grain. All stored on infrastructure now controlled by the acquirer.
|
||||
|
||||
*The protocol says you can leave. But the company that just paid billions for the network has no incentive to let you.*
|
||||
|
||||
I like Bluesky. I use Bluesky. The team seems to genuinely care.
|
||||
|
||||
But every counter-argument to the concerns above rests on the same foundation: technically, users can leave. Technically, you can self-host. Technically, you can run your own relay. The capability exists at every layer. But people don't do these things. They never have with any protocol. Not email, not RSS, not XMPP. *The default wins. Always.*
|
||||
|
||||
And then there's the money. You don't raise \$120M at a \$700M valuation to run a public utility. Those investors need a return. That return comes from monetizing users, getting acquired, or going public. All three create pressure to consolidate control, not distribute it. A truly decentralized network where users can freely leave is worth less to an acquirer than one where they can't.
|
||||
|
||||
The PBC structure is supposed to be the safeguard. But PBC obligations are vague and untested in court. When \$120M in VC money is on one side of the balance, guess which way it tips.
|
||||
|
||||
*The protocol can't save you from incentives.*
|
||||
|
||||
#pagebreak()
|
||||
|
||||
= User ban controversy reveals Bluesky’s decentralized aspiration isn’t reality
|
||||
|
||||
_Matthew Sheffield (October 7 2025) on plus.flux.community_
|
||||
|
||||
When it launched in 2023 in private beta, Bluesky was pitched as a different kind of social network, one that placed openness and user-friendliness at its core. It came along at just the right moment as Elon Musk’s purchase and takeover of Twitter led millions of users head toward any type of exit.
|
||||
|
||||
The initial destination for many was Mastodon, but its Linux geek ethos and system of numerous “federated” servers that communicate via the open-source ActivityPub protocol proved to be too complicated for people who just wanted to crack jokes. Acting on the opportunity, Bluesky opened up to the public in February 2024 and saw a rapid influx of users.
|
||||
|
||||
Besides being easier to sign up and use than Mastodon, Bluesky offered a different approach to content moderation that was more flexible and user-driven. In addition to making its software source code available under open licenses, Bluesky wanted to put moderation decisions in the hands of its users, encouraging them to make lists of accounts that could be automatically blocked or labeled—and thereby removing itself as much as possible from moderation decisions that have plagued discussion group administrators since the days of Usenet newsgroups.
|
||||
|
||||
Millions of people flooded in after Bluesky opened its doors to the public. By November of 2024, there were nearly 1.5 million daily posters, most of them anti-Musk Twitter refugees who were eager to get away from Musk’s right-wing makeover of the site into X.
|
||||
|
||||
However, as time has gone by, Bluesky’s traffic has declined (X’s has as well) and some of its users have become increasingly upset at its moderation decisions, including allowing U.S. Vice President J.D. Vance and anti-trans writer Jesse Singal to remain as users of the platform. Singal became a particular target, prompting a petition with more than 28,000 signatures urging Bluesky to “enforce its Community Guidelines” against him that has not been successful, although he has been temporarily banned.
|
||||
|
||||
Accusations of indifference to anti-trans bigotry seem to have exacerbated some users’ frustrations with the platform for its alleged tolerance of racist content. In 2023, many launched a “posting strike” after they discovered that Bluesky allowed people to sign up for user names containing racial slurs, a policy the company quickly reversed and apologized for.
|
||||
|
||||
The labeling feature of Bluesky has been more positively regarded, with many people subscribing to lists to label or block Trump supporters, Singal, and other widely disliked journalists. But things have not been perfect. Several users have complained about being added to libelously named lists, while others have complained that stalkers have added them to numerous lists out of revenge. Trying to balance concerns between legitimate blocklist maintainers and victims of false accusations, Bluesky unveiled a series of changes to its terms of service which brought it more in line with other social platforms, but also sparked controversy because now users can get blocklists hidden by reporting on them.
|
||||
|
||||
The failure of the Singal ban effort has also continued to grate on Bluesky’s most persistent critics, and the site’s executives have been met with many critical and often off-topic replies and quote posts.
|
||||
|
||||
#line()
|
||||
|
||||
While Bluesky has been navigating user concerns, its engineering team has been moving ahead with its long-promised open source efforts, breaking up its software stack into several pieces to enable a federated Authenticated Transfer Protocol (ATProto) network where anyone with the know-how and funds could run their own copy of Bluesky.
|
||||
|
||||
#image("bluesky_arch.png")
|
||||
|
||||
There are several key pieces of code that combine to make the Bluesky network function: A personal data server (PDS) which hosts the official/canonical copies of its users’ posts and profile information. Whenever it’s updated, the data is combined and sent to a Relay server, which combines and indexes posts from many different PDSes to create what social networks call the “firehose,” the collection of all posts made on the network.
|
||||
|
||||
The firehose data is imported by a labeler program which categorizes it in various ways set up by users, the processed data is combined together by an application server (or AppViews as they’re called for now in Bluesky). When a user logs into their PDS and pushes “refresh,” their local app connects to the PDS’s designated feed generator which serves up a cached version of the accounts they follow.
|
||||
|
||||
While the ATProto system has been criticized as overly complicated compared to the ActivityPub system that powers the Fediverse, it has one key feature that ActivityPub lacks: the ability to transfer servers while keeping all of your followers and posts.
|
||||
|
||||
Due to the complexity of the Bluesky software stack, whether its federation model actually works in practice has not really been put to the test. While ActivityPub has several instances with millions of users (like Facebook Threads, Flipboard, and even Donald Trump’s Truth Social), it also has many much smaller ones run by small organizations and individuals.
|
||||
|
||||
As of this writing, however, the only completely independent implementation of ATProto is Bluesky. But that isn’t for want of trying on the part of Rudy Fraser, the creator of Blacksky, an alternative service that he unveiled in May of 2023 in response to Black American users’ complaints about Bluesky’s moderation policies.
|
||||
|
||||
Despite Fraser’s efforts to implement his own PDS, Relay, and App View, however, Blacksky still remains partially dependent upon Bluesky’s application server, largely because while the code to implement the dataplane of posts and users within an application server is released, the open-source version is slower. As a result, Blacksky is dependent on Bluesky’s application server to give users a fast experience, which also means that it is dependent on Bluesky’s labeling system and its moderation choices.
|
||||
|
||||
The labeling software, called Ozone, also has issues, according to Bluesky engineer Bryan Newbold.
|
||||
|
||||
“Making it easier to run moderation services is something we want to do. we invested a lot of time and effort in Ozone, but have not been able to focus on making it usable/accessible for independent folks,” he wrote in an Oct. 3 post, adding that “we are looking at funding folks to fork or re-implement it for community use-case.”
|
||||
|
||||
This limitation is likely to be another reason why Blacksky relies on Bluesky’s AppView. Without it, Blacksky’s independent moderators couldn’t actually perform their task. (Fraser did not respond to repeated attempts to contact him for comment.)
|
||||
|
||||
Blacksky’s continued dependency on Bluesky came into focus on Sunday after a Blacksky user going by the handle Link suddenly found himself unable to view his own posts on the alternative site.
|
||||
|
||||
“My account was taken down without any explanation for almost a full day,” Link told me in a Signal message, showing me a screenshot indicating that he had been banned even as his Blacksky account remained capable of viewing others’ posts and changing preferences. Unbeknownst to him, Link’s account had been banned by Bluesky’s moderators and this meant that even though he was in good standing at Blacksky, no one there, including himself, was able to read his posts. (They are visible within the ATProto firehose feed, however, as several sharp-eyed users soon discovered.)
|
||||
|
||||
Link’s banning came at a very bad moment for Bluesky, just weeks after it had banned or suspended several users following the Sept. 10 murder of far-right activist Charlie Kirk, which many Republican officials have sought to use as a tool for government censorship.
|
||||
|
||||
Federal Communications Commission Brendan Carr’s threats against late night comedian Jimmy Kimmel led to his temporary suspension by ABC, and he was far from the only Republican to issue them. Louisiana Rep. Clay Higgins, chair of the House subcommittee on federal law enforcement, sent a menacing letter to Bluesky and other social media networks demanding that they identify and ban anyone deemed to be celebrating Kirk’s killing.
|
||||
|
||||
“The authors of these posts are to be identified and banned from your platform, as well as any new pages they may create,” he wrote. “The reasonable restriction of public statements that lie far beyond the standards of our own society is not an oppression of free speech, it is, rather, the protection of free speech.”
|
||||
|
||||
There’s no proof that Higgins’s threats against social media platforms led to Bluesky banning anyone, but in any case, more than a few users were permanently or temporarily banned for mocking Kirk’s death, including horror author Gretchen Felker-Martin.
|
||||
|
||||
The fallout from the Kirk controversies and the months of replies seems to have irked Bluesky CEO Jay Graber, and she began pushing back on the user complaints. On Oct. 1, she approvingly quoted a user who had referenced the famous pancakes-waffle Twitter meme about how liking pancakes doesn’t mean disliking waffles, adding: “Too real. We’re going to try to fix this. Social media doesn’t have to be this way.”
|
||||
|
||||
Graber’s post was soon met by a reply asking if she’d banned Singal yet, prompting her to respond in all-caps: “WAFFLES.”
|
||||
|
||||
The next day, Thursday, Graber returned to her theme, posting a photograph of a berry-covered waffle, accompanied with the caption: “Amazing breakfast this morning. I love waffles.”
|
||||
|
||||
As might be expected, Graber’s trolling was not taken well by her critics. The waffles post received more than 1,700 replies, including many mocking her as a Musk-like figure.
|
||||
|
||||
On Friday, Graber turned more serious in her pushback: “Harassing the mods into banning someone has never worked. And harassing people in general has never changed their minds,” she wrote, adding later that: “Yet it’s a behavior that persists across social media anyway, with negative consequences for civil discourse and society. Human nature is a contributing factor, but systems that reward outrage only make the problem worse.”
|
||||
|
||||
Among the more than 100 people who quoted Graber’s post that day was Link. He posted a photo of Kirk which he accompanied with descriptive text that read: “Charlie Kirk sitting in a white T-shirt that says freedom. A negative consequence follows.”
|
||||
|
||||
Link made a number of other posts after to that one, but on Sunday his Blacksky account stopped working. After receiving no contact from either Blacksky or Bluesky, Link messaged Bluesky’s moderation team and received an email about 3 hours later saying that he had violated the social network’s community guidelines in his quote of Graber days earlier, presumably its policies against “threats or encouragement of violence.”
|
||||
|
||||
That is not how Link sees his post.
|
||||
|
||||
“I want to be extremely clear I was not making a death threat or inciting violence,” he told me, saying that he had sent 12 separate examples of other people posting the same Kirk image as a reaction meme. “I don’t wish death on Jay, I wish for her and her team to grow a conscience. I disagree with the decision and how it was handled. My account was taken down without any explanation for almost a full day in what can only be viewed as a retroactive ban.”
|
||||
|
||||
I’ve asked Bluesky whether the post had been reported as a violation by other users. I will update this story if I receive a response. Rudy Fraser, the Blacksky administrator has not responded to a request for comment.
|
||||
|
||||
Asked about why Link had to contact Bluesky to find out what had happened to his account rather than receiving a notice, Paul Frazee, the service’s CTO, said that it was “unfortunate,” and that Bluesky needed to finish adding a feature to let users of external PDSes know if they have been banned by Bluesky labelers.
|
||||
|
||||
#line()
|
||||
|
||||
Agree or disagree on whether Bluesky has treated Link fairly, the incident has exposed that the social network’s decentralization plans have yet to be fulfilled. Blacksky seems to be the furthest-along alternative ATProto implementation, but it’s still dependent on Bluesky. There’s another one called Northsky Social, but it has not launched any services yet. And while there are several alternative AppViews such as Deer.social, there does not seem to be any service (or combination of services) that can function as a full-stack implementation of ATProto.
|
||||
|
||||
This might explain why, despite having a network of nearly 40 million users, no situation like Link’s banning seems to have happened during Bluesky’s very short lifespan.
|
||||
|
||||
The episode has sent more than a few Bluesky users to start wondering whether the snow-covered grass on Mastodon’s side of the road is worth considering.
|
||||
|
||||
But not everyone is looking forward to the idea: “I’d go back to Usenet before I went back to Mastodon,” wrote Bluesky user Count Von Horse Knuckler. “I do not need people yelling at me for not putting cat pictures behind trigger warnings or unwanted Linux advice.”
|
||||
|
||||
Help may be on the horizon, however. As developers are becoming more aware of the power of ATProto, they are building increasingly complex projects on it, including a promising service called Slices, which aims to make it easy to build and deploy custom AppViews, a feature Blacksky and other Bluesky alternatives could certainly use. Bluesky execs have said they are working hard to make federation easier.
|
||||
|
||||
Meanwhile, Link is caught in limbo.
|
||||
|
||||
“Now my account is not viewable on either Blacksky or Bluesky,” he notes. “I’m fortunate that I moved over to Blacksky and I think that is the only reason I still have access to my account and data…Bluesky claims to want decentralization and composable moderation, but they still enjoy abusing the power of arbitrary banishment.”
|
||||
|
||||
#pagebreak()
|
||||
|
||||
= Decentralization stats
|
||||
|
||||
\
|
||||
There are several ways to measure how centralized a network is. Check out https://arewedecentralizedyet.org/ for more information. Here's a screenshot of the website, showing how decentralized the Fediverse is, compared to the ATmosphere (taken September 12 2026).
|
||||
\
|
||||
|
||||
#align(
|
||||
center,
|
||||
image("decentralization.jpg")
|
||||
)
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#set page(
|
||||
numbering: none,
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
block(
|
||||
height: 50%,
|
||||
width: 80%,
|
||||
[
|
||||
= Is Bluesky decentralized?
|
||||
\
|
||||
|
||||
This compilation of text outlines some of the problems with Bluesky, Jack Dorsey's latest startup.
|
||||
|
||||
While advertised as a decentralized platform, how decentralized is it in practice? Who controls the network? And who benefits from making users believe they are in control?
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
image("../resources/noslop.svg"),
|
||||
)
|
||||
Binary file not shown.
|
|
@ -1241,12 +1241,12 @@ x
|
|||
endstream
|
||||
endobj
|
||||
315 0 obj
|
||||
<</Creator(Typst 0.15.1)/ModDate(D:20260910122044+02'00)/CreationDate(D:20260910122044+02'00)>>
|
||||
<</Creator(Typst 0.15.1)/ModDate(D:20260911111821+02'00)/CreationDate(D:20260911111821+02'00)>>
|
||||
endobj
|
||||
316 0 obj
|
||||
<</Length 996/Type/Metadata/Subtype/XML>>
|
||||
stream
|
||||
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-09-10T12:20:44+02:00</xmp:ModifyDate><xmp:CreateDate>2026-09-10T12:20:44+02:00</xmp:CreateDate><xmpTPg:NPages>8</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>jAfoPMgY5G7aMlUjnGImJQ==</xmpMM:InstanceID><xmpMM:DocumentID>jAfoPMgY5G7aMlUjnGImJQ==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?>
|
||||
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-09-11T11:18:21+02:00</xmp:ModifyDate><xmp:CreateDate>2026-09-11T11:18:21+02:00</xmp:CreateDate><xmpTPg:NPages>8</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>VkAfYY0Sdfg4RWJhs1teCg==</xmpMM:InstanceID><xmpMM:DocumentID>VkAfYY0Sdfg4RWJhs1teCg==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?>
|
||||
endstream
|
||||
endobj
|
||||
317 0 obj
|
||||
|
|
@ -1573,7 +1573,7 @@ xref
|
|||
0000092468 00000 n
|
||||
0000093541 00000 n
|
||||
trailer
|
||||
<</Size 318/Root 317 0 R/Info 315 0 R/ID[(jAfoPMgY5G7aMlUjnGImJQ==)(jAfoPMgY5G7aMlUjnGImJQ==)]>>
|
||||
<</Size 318/Root 317 0 R/Info 315 0 R/ID[(VkAfYY0Sdfg4RWJhs1teCg==)(VkAfYY0Sdfg4RWJhs1teCg==)]>>
|
||||
startxref
|
||||
93745
|
||||
%%EOF
|
||||
BIN
XMPP - 25 years/XMPP - 25 years.fr-book.pdf
Normal file
BIN
XMPP - 25 years/XMPP - 25 years.fr-book.pdf
Normal file
Binary file not shown.
1750
XMPP - 25 years/XMPP - 25 years.fr.pdf
Normal file
1750
XMPP - 25 years/XMPP - 25 years.fr.pdf
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -5,8 +5,19 @@ basedir="$(realpath "$basedir")"
|
|||
cd "$basedir"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
if ! typst compile --root .. ./main.typ ./"$name".pdf; then
|
||||
echo "Failed to compile $name/main.typ. Please fix errors and run me again."
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
TARGETFILE="$name".$TARGETLANG.pdf
|
||||
TARGETFILEBOOK="$name".${TARGETLANG}-book.pdf
|
||||
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" ./"$TARGETFILE"; then
|
||||
echo "Failed to compile "$name"/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
|
@ -18,7 +29,7 @@ if ! command -v pdfbook2; then
|
|||
fi
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
typst compile --input format=booklet --root .. ./main.typ "$t"
|
||||
typst compile --input format=booklet --root .. ./"$SOURCEFILE" "$t"
|
||||
|
||||
# Need to be in the folder there for it to work, otherwise it
|
||||
# tries to rename from current partition to /tmp which of course fails
|
||||
|
|
@ -30,6 +41,5 @@ cd "$parent"
|
|||
pdfbook2 --paper=a4paper "$t" --no-crop --outer-margin=0 --inner-margin=0 --top-margin=0 --bottom-margin=0
|
||||
|
||||
cd "$basedir"
|
||||
newFinalFile="$name"-book.pdf
|
||||
cp "$newFile" "$newFinalFile"
|
||||
echo "Booklet available in $newFinalFile"
|
||||
cp "$newFile" "$TARGETFILEBOOK"
|
||||
echo "Booklet available in $TARGETFILEBOOK"
|
||||
|
|
|
|||
|
|
@ -3,13 +3,23 @@
|
|||
cd "$(dirname "$0")"
|
||||
name="$(basename "$(pwd)")"
|
||||
|
||||
# Check if we want to run against a certain translation
|
||||
if [ $# -lt 1 ]; then
|
||||
echo "Please specify the language you want to build (eg. fr)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
TARGETLANG="$1"
|
||||
SOURCEFILE="main.${TARGETLANG}.typ"
|
||||
|
||||
|
||||
t="$(mktemp --suffix=.pdf)"
|
||||
if ! typst compile --root .. ./main.typ "$t"; then
|
||||
echo "Failed to compile $name/main.typ. Please fix errors and run me again."
|
||||
if ! typst compile --root .. ./"$SOURCEFILE" "$t"; then
|
||||
echo "Failed to compile $name/"$SOURCEFILE". Please fix errors and run me again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Initial compilation successful. Now starting watch mode. Opening $t"
|
||||
xdg-open "$t"
|
||||
|
||||
typst watch --root .. ./main.typ "$t"
|
||||
typst watch --root .. ./"$SOURCEFILE" "$t"
|
||||
|
|
|
|||
134
XMPP - 25 years/main.fr.typ
Normal file
134
XMPP - 25 years/main.fr.typ
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
// Default margin for readability
|
||||
#set page(
|
||||
margin: (inside: 1.5cm, outside: 1.5cm),
|
||||
)
|
||||
// If input format == "booklet", we alternate
|
||||
// margins for print format. Otherwise, we set
|
||||
// equivalent margins on both sides.
|
||||
#set page(
|
||||
margin: (inside: 2cm, outside: 1cm),
|
||||
) if "format" in sys.inputs and sys.inputs.format == "booklet"
|
||||
|
||||
#set page(
|
||||
paper: "a4",
|
||||
)
|
||||
#set text(
|
||||
font: "DejaVu Sans",
|
||||
size: 13.3pt,
|
||||
)
|
||||
#set par(justify: true)
|
||||
|
||||
#align(
|
||||
center,
|
||||
text(
|
||||
size: 48pt,
|
||||
// font: "Communard",
|
||||
[ = Jabber/XMPP ]
|
||||
) + text(
|
||||
size: 19pt,
|
||||
[ = 25 years of Digital Independence ],
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
image(height: 50%, "XMPP_logo_notext.svg"),
|
||||
),
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
[ *Daniel Gultsch - August 24, 2026* ],
|
||||
)
|
||||
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#show heading.where(level: 2): set block(above: 1.5em, below: 1.5em)
|
||||
#set page(
|
||||
numbering: "1",
|
||||
)
|
||||
|
||||
== Infrastructure
|
||||
|
||||
« Nos infrastructures devraient nous appartenir. » Beaucoup de gens approuvent par instinct cette affirmation. Pourtant, l’identité de ce « nous » varie selon le type d’infrastructure. Les autoroutes, les voies ferrées, les ponts et les ports nécessitent des efforts à l’échelle d'une Nation. La gestion des réseaux d'eau est généralement confiée aux municipalités. Et ce désir d'autonomie s’exprime aussi à une échelle bien plus réduite : être propriétaire de son logement est un rêve pour beaucoup — mais cette propriété ne doit pas nécessairement être individuelle. Les coopératives d'habitation ou le logement social #footnote[#link("https://en.wikipedia.org/wiki/Housing_in_Vienna")] peuvent offrir des avantages similaires.
|
||||
|
||||
Le néocolonialisme de la Chine, qui se manifeste notamment par la construction et le rachat d’infrastructures dans des États souverains, est légitimement critiqué. Refuser de vendre ses sources d’eau à Nestlé est une position universellement admise, et les propriétaires immobiliers figurent parmi les classes les plus détestées.
|
||||
|
||||
Pendant longtemps, l’Europe n’a pas appliqué les mêmes exigences aux services numériques. Cela s’explique en partie par le fait que l’Europe incluait implicitement les entreprises américaines dans un « nous » collectif — une hypothèse qui s’est officiellement effondrée sous l’administration Trump, mais qui aurait dû être accueillie avec scepticisme bien avant cela. Les entreprises ne sont pas nos amies. Plus largement, l’Europe n'avait tout simplement aucune considération pour les infrastructures de services numériques. Si l’antiaméricanisme revient à la mode et alimente une grande partie du mouvement pour la souveraineté numérique, l’Europe ne doit pas se contenter de remplacer les entreprises américaines par des entreprises européennes, mais s'orienter vers des propriétés collectives.
|
||||
|
||||
Sous le système capitaliste, les entreprises auront toujours un rôle dans la construction ou l’exploitation de nos infrastructures, mais doivent rester interchangeables. Si une entreprise construit une route, l’entretien et la réparation 50 ans plus tard doit pouvoir être confiée à un autre prestataire. Il est acceptable qu'une entreprise construise et exploite les lignes à haute tension, mais elle ne doit pas en être propriétaire. Nous voulons que de plus petits acteurs puissent s'interconnecter au réseau et y particpier. C’est là qu’interviennent les standards #footnote[*NdT:* _standard_ en anglais est traduit par _norme_ ou _standard_ de façon interchangeable] ouverts.
|
||||
|
||||
Internet a été — et l’est encore, dans une certaine mesure — bâti autour de standards. Un datacenter peut acheter des serveurs auprès d’un fournisseurs, des switchs auprès d’un autre, des routeurs auprès chez un troisième, et les connecter à un fournisseur d’accès qui utilise du matériel d'un autre constructeur encore. Si l’une de ces entreprises fait faillite ou déçoit ses clients par ses pratiques, on peut commander chez une autre. Les avantages de cette indépendance d’approvisionnement sont évidents, même pour celleux dont ce n'est pas le métier. Pourtant, dès qu’on parle d’outils de communication, même les personnes les plus renseignées oublient d'appliquer ce même raisonnement.
|
||||
|
||||
Communiquer est sans doute la quatrième activité la plus importante pour les êtres humains après respirer, manger et se reproduire. Pourtant, on considère rarement nos outils de communication comme des infrastructures.
|
||||
|
||||
Les activistes citent souvent Signal, Wire et Threema comme exemples de chats développés et gérés par des organisations un peu plus éthiques que les géants de la tech. Mais au-delà de la confidentialité, ces entreprises continuent d’entretenir des écosystèmes fermés dont on ne peut s’extraire. Elles ne sont pas interopérables. Signal n'a pas agi de manière intrinsèquement malveillante — bien que verser près d’un million de dollars par an à son PDG et héberger ses serveurs sur AWS soient des choix discutables — le problème est que nous ne disposons d’aucun plan B si cela devient le cas.
|
||||
|
||||
La question du logiciel libre est orthogonale à ce problème. La liberté permet de garantir que le logiciel n’est pas un logiciel espion — contrairement à WhatsApp et aux autres produits de Meta #footnote[#link("https://localmess.github.io/")] — et que le chiffrement de bout en bout est fiable, mais n'empêche pas Signal de fermer ses serveurs ou de cesser ses activités dans l’UE #footnote[#link("https://mastodon.world/@Mer__edith/112535616774247450")]). Le logiciel libre ne suffit pas, à lui seul, à répondre aux exigences que nous devrions avoir pour notre infrastructure.
|
||||
|
||||
Pour être à la hauteur, nous devons concevoir des systèmes où l’auto-hébergement est structurellement possible, mais n'est pas nécessaire. Tout comme il est possible d'être propriétaire de son logement, il devrait être possible de gérer son propre serveur ; il en va de même pour la propriété collective. Les systèmes numériques devraient offrir les avantages de la propriété individuelle et de la propriété collective.
|
||||
|
||||
Considérer la communication numérique comme une véritable infrastructure ne peut se faire qu'en adoptant et en imposant des normes ouvertes (standards).
|
||||
|
||||
Le protocole XMPP (Extensible Messaging and Presence Protocol) #footnote[#link("https://www.rfc-editor.org/rfc/rfc6120.html")]<ref4> #footnote[#link("https://www.rfc-editor.org/rfc/rfc6121.html")] est une norme de communication en ligne. Il n'a pas été conçu pour répondre au climat politique actuel. En réalité, il a plus de 25 ans.
|
||||
|
||||
== Normes
|
||||
|
||||
L'interopérabilité et l'indépendance vis-à-vis des fournisseurs reposent sur l'introduction et le suivi de normes. Afin d'éviter qu'un fournisseur n'impose des normes excluant explicitement ou implicitement ses concurrents, ou lui conférant des avantages déloyaux, des organismes de développement de standards (SDO) ont été créés pour favoriser la coopération mutuelle . Ceux-ci ont généralement des garde-fous pour empêcher une seule entreprise d'acquérir trop influence. Parmi les SDO connus, on peut citer l'ISO, l'IETF, le W3C et le Consortium Unicode.
|
||||
|
||||
Il est important de distinguer la situation où un fournisseur publie son API en autorisant des tiers à l'utiliser de celle où des individus se réunissent pour élaborer collectivement une norme dans le cadre d'un organisme de développement de standards. Les SDO comme l'IETF fonctionnent parce qu'elles poussent au consensus des personnes avec des besoins différents. Les protocoles ne sont pas dictés par les priorités d'une entreprise ; ils sont au contraire revus et testés par des entités concurrentes, des chercheureuses en sécurité et des développeureuses indépendant-es.
|
||||
|
||||
L'entreprise Element (anciennement Riot et NewVector) développe une messagerie instantanée aux fonctionnalités similaires à XMPP — telles que l'auto-hébergement et la fédération. Mais, au lieu d'adopter XMPP, elle a préféré publier sa propre API baptisée Matrix pour que les autres l'adoptent. Contrairement à un standard traditionnel, Element garde un contrôle étroit sur toute évolution de son API publique. Les postes-clé au sein de la Matrix Foundation sont majoritairement occupés par des employéEs (présent ou passé) d'Element. Il est notoirement difficile de faire accepter des contributions externes dans la spécification. #footnote[#link("https://github.com/matrix-org/matrix-spec-proposals/pull/4174")] En quête de souveraineté numérique, les administrations publiques européennes tombent dans le piège de telles plateformes contrôlées par un fournisseur unique, confondant code open-source et norme ouverte.
|
||||
|
||||
C'est naturel que les propositions de standards émergent dans une seule organisation. JMAP — un remplaçant moderne d'IMAP et de SMTP Submission, assez proche de Matrix (une API JSON sur HTTP) — a vu le jour chez Fastmail avant d'être soumis à l'IETF. Jabber a débuté comme un projet communautaire open source avant d'être présenté à l'IETF et rebaptisé XMPP. Les idées démarrent modestement, mais pour créer un standard, il faut des avis extérieurs, de la collaboration et le cadre d'un organisme de développement de standards (SDO).
|
||||
|
||||
La différence d'approche entre Fastmail et Element est frappante pour les utilisateurices. Non seulement le protocole JMAP a été considérablement amélioré grâce au groupe de travail de l'IETF, mais il dispose désormais d'au moins trois implémentations de serveurs et beaucoup plus de clients. À l'inverse, Matrix — né à la même époque vers 2014 — n'a toujours qu'une implémentation de référence, tandis qu'une seconde peine à émerger. Cette solution de référence est célèbre pour son usage abusif de ressources, ce qui rend l'auto-hébergement difficile pour les petites organisations et les personnes. Element commercialise des extensions propriétaires pour améliorer les performances.
|
||||
|
||||
== Le « X » de XMPP
|
||||
|
||||
Les origines de XMPP — d'abord nommé Jabber — remontent à plus d'un quart de siècle. La RFC initiale #footnote[#link("https://www.rfc-editor.org/rfc/rfc3920.html")] date d'octobre 2004 et a été légèrement révisée en mars 2011 @ref4. Or, les besoins en matière de messagerie instantanée évoluent sur une si longue période. Heureusement, le « X » de XMPP signifie « Extensible ». Le protocole peut évoluer grâce à des extensions: les XEP (*XMPP Extension Protocols*). Ces extensions sont gérées par la XMPP Standards Foundation (XSF). La XSF ne les rédige pas, mais fournit plutôt le cadre (SDO) permettant aux développeureuses de proposer et de standardiser leurs propres extensions.
|
||||
|
||||
Adapter le protocole à un cahier des charges mouvant n'est pas toujours facile. La XEP-0198 (*Stream Management*), une extension cruciale pour éviter de perdre des messages lors sur mobile, a été stabilisée en 2009, mais n'a été largement déployée que vers 2014-2015. Le premier iPhone est sorti en 2007, et le premier Android (HTC Dream) en 2008. OMEMO (XEP-0384), extension pour le chiffrement de bout en bout, a gagné en popularité à partir de 2016, trois ans après qu'Edward Snowden #footnote[#link("https://en.wikipedia.org/wiki/Snowden_disclosures")] a révélé la surveillance massive de la NSA et donc le besoin de chiffrement. Les articles « The (Sad) State of Mobile XMPP in 2014 » de Georg Lukas #footnote[#link("https://op-co.de/blog/posts/mobile_xmpp_in_2014/")] et « The State of Mobile XMPP in 2016 » de l'auteur de ces lignes #footnote[#link("https://gultsch.de/posts/the-state-of-mobile-xmpp-in-2016/")] illustrent cette transition difficile vers l'ère mobile.
|
||||
|
||||
Cela montre qu'avoir des standards ne suffit pas. Les normes doivent s'appuyer sur de multiples implémentations, de préférence indépendantes. Aujourd'hui, la XSF assure le suivi de l'état d'implémentation de ses XEP #footnote[#link("https://xmpp.org/extensions/")]. Ces données aident les auteurices et la XSF suivre le cycle des extensions, par exemple pour passer une XEP du statut « Expérimental » à « Stable ». Elles identifient facilement les autres clients et serveurs prenant en charge une extension pour effectuer des tests d'interopérabilité. Enfin, en listant les fonctionnalités des logiciels, elles permettent aux utilisateurices de trouver le client adapté à leurs besoins.
|
||||
|
||||
Les clients modernes tels que Dino (Linux) ou Conversations (Android) ne se laissent pas distancer par les alternatives basées sur des protocoles propriétaires. Ils ont par exemple rajouté récemment les réactions par émojis, la synchronisation des confirmations de lecture entre différents appareils, ou encore les indicateurs de fuseau horaire afin d'éviter d'envoyer un message durant la nuit dans un autre pays. Une fonctionnalité unique parmi les solutions de messagerie instantanée auto-hébergées — devenue malheureusement pertinente à la suite d'une attaque soutenue par un État contre un fournisseur XMPP public #footnote[#link("https://notes.valdikss.org.ru/jabber.ru-mitm/")] — est le channel binding, un mécanisme visant à empêcher certaines attaques de type man in the middle.
|
||||
|
||||
Parmi les projects actuels, la communauté XMPP travaille sur les réponses aux messages, le partage de plusieurs images sous forme de galerie et la prise en charge d'OAuth. Ces fonctionnalités s'appuient déjà sur des XEP expérimentales, mais la communauté attend des retours d'expérience sur leur mise en œuvre avant de faire avancer le processus. Parallèlement, elle étudie les possibilités de mettre à jour la RFC et de soumettre à nouveau le protocole à l'IETF sous l'appellation « XMPP 2.0 ».
|
||||
|
||||
La messagerie instantanée n'est pas une expérience utlisateurice homogène. Une application pour la collaboration professionnelle n'a pas les mêmes fonctionnalités qu'une pour usage familial ou entre amiEs. Tous les clients XMPP ne visent pas la même expérience, mais les normes permettent de créer des clients spécialisés pour certains besoins sans avoir à inventer un protocole de toutes pièces.
|
||||
|
||||
== Un avenir ancré dans le passé
|
||||
|
||||
La communauté XMPP compte des développeurs plus jeunes que le protocole lui-même, ce qui est fascinant. Il a survécu dans son coin à des startups financées par du capital-risque, à des plateformes propriétaires et à des cycles technologiques entiers. Cette endurance nous fournit la résilience dont nous avons besoins dans ces temps incertains. Elle est l'ancrage, la colonne vertébrale, l'infrastructure.
|
||||
|
||||
Matrix a réinventé la roue en concevant un métro sur pneus. Sur le papier, il y a de réels avantages — comme pouvoir gravir des pentes plus raides — arguments utilisés dans une publicité agressive et un lobbying intense pour se vendre auprès des collectivités et gouvernements. Au bout du compte, toutefois, la collectivité se retrouve prisonnière d'un fournisseur unique.
|
||||
|
||||
L'évolution de la situation géopolitique et la prise de conscience de la domination excessive des géants de la tech nous poussent à rechercher et à développer des alternatives. Mais et si cette alternative se trouvait sous nos yeux depuis plus de 25 ans ? Il s'agit de la norme de référence en matière de messagerie instantanée : la RFC 6120, ou *Extensible Messaging and Presence Protocol* (XMPP).
|
||||
|
||||
#pagebreak()
|
||||
|
||||
#set page(
|
||||
numbering: none,
|
||||
)
|
||||
|
||||
#align(
|
||||
center + horizon,
|
||||
block(
|
||||
height: 50%,
|
||||
width: 80%,
|
||||
[
|
||||
= À propos de messagerie instantanée standard et fédérée
|
||||
\
|
||||
|
||||
Dans ce texte, Daniel Gultsch, mainteneur du client XMPP Conversations pour Android, célèbre les 25 ans de la norme RFC XMPP, nous rappelant pourquoi nous ne pouvons pas confier nos communications à un seul acteur.
|
||||
|
||||
Malgré ses limites, l'écosystème Jabber/XMPP est encore aujourd'hui animé par des communautés sans but lucratif et des projets à destination des petits hébergeurs indépendants des géants de la tech.
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
#align(
|
||||
center + bottom,
|
||||
image("../resources/noslop.svg"),
|
||||
)
|
||||
Loading…
Reference in a new issue