Compare commits

..

No commits in common. "e0095d2683843298bebb931220c10262f3a3e501" and "a0766ff728fd76763c3b5bb4f724e60d37736c32" have entirely different histories.

16 changed files with 275 additions and 369 deletions

View file

@ -4,7 +4,7 @@ layout: post
lang: 'en' lang: 'en'
title: 'about' title: 'about'
description: 'General info about this website and the author.' description: 'General info about this website and the author'
--- ---
@ -25,7 +25,7 @@ description: 'General info about this website and the author.'
</div> </div>
<p> <p>
Im a&nbsp;front-end developer and a&nbsp;big fan of&nbsp;open-source, I'm a&nbsp;front-end developer and a&nbsp;big fan of&nbsp;open-source,
customization, and minimalist software.<br> customization, and minimalist software.<br>
Member of&nbsp;the Member of&nbsp;the
<a href='https://t.me/barbadbar' target='_blank'>BadBar</a> crew, <a href='https://t.me/barbadbar' target='_blank'>BadBar</a> crew,

View file

@ -2,13 +2,12 @@
layout: post layout: post
lang: 'en' lang: 'en'
date: '2026-04-05'
section: 'about'
title: 'keys' title: 'keys'
description: 'Public keys and fingerprints.' description: 'Public keys and fingerprints.'
section: 'about'
date: '2026-04-05'
--- ---
# Public Keys and Fingerprints # Public Keys and Fingerprints

View file

@ -1,7 +1,6 @@
--- ---
description: 'My own private fanzine.' description: 'My own private fanzine'
css: css:
- index - index

View file

@ -200,7 +200,7 @@ in&nbsp;the middle of&nbsp;a&nbsp;conversation.
</header> </header>
<section class='description'> <section class='description'>
Interactive articles about physics, math, and engineering. Interactive articles about physics, math, and engineering.
Its probably the best website on&nbsp;the entire internet.<br> It's probably the best website on&nbsp;the entire internet.<br>
My&nbsp;favorite post is&nbsp;the one about My&nbsp;favorite post is&nbsp;the one about
<a href='https://ciechanow.ski/bicycle/' target='_blank'>bicycles</a>. <a href='https://ciechanow.ski/bicycle/' target='_blank'>bicycles</a>.
</section> </section>
@ -245,7 +245,7 @@ in&nbsp;the middle of&nbsp;a&nbsp;conversation.
<section class='description'> <section class='description'>
Torrenting can leave traces.<br> Torrenting can leave traces.<br>
Check torrent downloads and distributions Check torrent downloads and distributions
for your own or&nbsp;your neighbors IP&nbsp;address. for your own or&nbsp;your neighbor's IP&nbsp;address.
</section> </section>
</article> </article>
@ -300,7 +300,7 @@ in&nbsp;the middle of&nbsp;a&nbsp;conversation.
<header> <header>
<strong> <strong>
<a href='https://news.ycombinator.com/item?id=42492508' target='_blank'> <a href='https://news.ycombinator.com/item?id=42492508' target='_blank'>
Ask HN: Programmers who dont use autocomplete/LSP, how do&nbsp;you do&nbsp;it? Ask HN: Programmers who don't use autocomplete/LSP, how do&nbsp;you do&nbsp;it?
</a> </a>
</strong> </strong>
</header> </header>
@ -314,7 +314,7 @@ in&nbsp;the middle of&nbsp;a&nbsp;conversation.
<header> <header>
<strong> <strong>
<a href='https://sneak.berlin/20201112/your-computer-isnt-yours/' target='_blank'> <a href='https://sneak.berlin/20201112/your-computer-isnt-yours/' target='_blank'>
Your Computer Isnt Yours Your Computer Isn't Yours
</a> </a>
</strong> </strong>
</header> </header>
@ -411,7 +411,7 @@ in&nbsp;the middle of&nbsp;a&nbsp;conversation.
</strong> </strong>
</header> </header>
<section class='description'> <section class='description'>
Most software tutorials suck. Heres how to&nbsp;make one that doesnt. Most software tutorials suck. Here's how to&nbsp;make one that doesn't.
</section> </section>
</article> </article>

View file

@ -4,7 +4,7 @@ layout: post
lang: 'en' lang: 'en'
title: 'posts' title: 'posts'
description: 'Сomplete list of posts.' description: 'Сomplete list of posts'
--- ---

View file

@ -1,15 +1,16 @@
--- ---
layout: post layout: post
lang: 'ru' lang: 'ru'
date: '2020-11-08'
year: '2020'
section: 'posts'
title: 'initial post' title: 'initial post'
description: 'Первый пост в этом фэнзине, рассказывающий о его внутреннем устойстве.' description: 'Первый пост в этом фэнзине, рассказывающий о его внутреннем устойстве.'
section: 'posts'
year: '2020'
date: '2020-11-08'
--- ---
# Initial Post # Initial Post

View file

@ -1,15 +1,16 @@
--- ---
layout: post layout: post
lang: 'ru' lang: 'ru'
date: '2020-11-18'
year: '2020'
section: 'posts'
title: 'typographic linter' title: 'typographic linter'
description: 'Prettier для текста. Автоматизация рутинной типографики.' description: 'Prettier для текста. Автоматизация рутинной типографики.'
section: 'posts'
year: '2020'
date: '2020-11-18'
--- ---
# Типографика как code style # Типографика как code style

View file

@ -4,3 +4,4 @@ layout: redirect
redirectTarget: '/posts/#2024' redirectTarget: '/posts/#2024'
--- ---

View file

@ -1,15 +1,16 @@
--- ---
layout: post layout: post
lang: 'ru' lang: 'ru'
date: '2024-01-15'
year: '2024'
section: 'posts'
title: 'selfhosted LLM' title: 'selfhosted LLM'
description: 'Персональные LLM в docker-контейнере на твоём компьютере.' description: 'Персональные LLM в docker-контейнере на твоём компьютере.'
section: 'posts'
year: '2024'
date: '2024-01-15'
--- ---
# Your Own Private Large Language Models # Your Own Private Large Language Models

View file

@ -1,15 +1,15 @@
--- ---
layout: post layout: post
lang: 'ru' lang: 'ru'
date: '2024-07-27'
year: '2024'
section: 'posts'
title: 'wrapped bw' title: 'wrapped bw'
description: 'Превращаем fully-featured Bitwarden command-line interface в удобный.' description: 'Превращаем fully-featured Bitwarden command-line interface в удобный.'
section: 'posts'
year: '2024'
date: '2024-07-27'
--- ---
# Интеграция Bitwarden CLI с&nbsp;fzf и&nbsp;буфером обмена # Интеграция Bitwarden CLI с&nbsp;fzf и&nbsp;буфером обмена

View file

@ -1,6 +0,0 @@
---
layout: redirect
redirectTarget: '/posts/#2026'
---

View file

@ -2,418 +2,346 @@
layout: post layout: post
lang: 'en' lang: 'en'
title: 'encrypted XMPP'
description: 'Secure and private messaging with XMPP and OMEMO encryption.'
section: 'posts'
year: '2026' year: '2026'
date: '2026-04-16' date: '2026-04-07'
section: 'posts'
title: 'encrypted_XMPP'
description: 'Secure and private messaging with XMPP and OMEMO encryption.'
--- ---
# End-to-End Encryption in&nbsp;XMPP with OMEMO # End-to-End Encryption in XMPP with OMEMO
I&nbsp;find it&nbsp;funny that twenty years ago I&nbsp;was already trying I find it funny that twenty years ago I was already trying
to&nbsp;get people to&nbsp;switch to&nbsp;XMPP. to promote XMPP over ICQ to my classmates.
At the time, the proprietary messenger kept making life harder
for users of alternative clients.
Thats when I realized that I prefer protocols over services.
For a&nbsp;long time, ICQ was extremely popular around me, I didnt have much success back then,
but the proprietary messenger kept breaking things for people but fortunately, XMPP (and I hope I have too)
using alternative clients, which was quite annoying.
After yet another round of&nbsp;this pointless battle
I&nbsp;realized clearly that I&nbsp;prefer protocols over services.
I&nbsp;didnt have much success back then,
but fortunately, XMPP (and I&nbsp;hope I&nbsp;have too)
has continued moving forward over the past two decades. has continued moving forward over the past two decades.
It&nbsp;has developed slowly, sometimes awkwardly, but steadily. It has developed slowly, sometimes awkwardly, but steadily.
Here, I&nbsp;wont talk about why XMPP is&nbsp;great or&nbsp;how it&nbsp;works. Here I wont talk about why XMPP is great or how to use it.
You can check You can check
<a <a
href='https://contrapunctus.codeberg.page/the-quick-and-easy-guide-to-xmpp.html' href='https://contrapunctus.codeberg.page/the-quick-and-easy-guide-to-xmpp.html'
target='_blank'> target='_blank'>
this guide</a> this guide</a>
(one of&nbsp;many) and Id rather not write another one. (one of many) and Id rather not write another one.
In&nbsp;this post, In this post, I want to focus specifically on end-to-end encryption
I&nbsp;want to&nbsp;focus specifically on&nbsp;end-to-end encryption and the practical aspects of using it.
and the practical aspects of&nbsp;using it.
## Short Glossary ## Short Glossary
**End-to-end encryption** is&nbsp;a&nbsp;way **End-to-end encryption** is a way to keep your chats truly private.<br>
to&nbsp;keep your chats truly private.<br>
Only you and the person youre messaging can read the messages. Only you and the person youre messaging can read the messages.
Not even the server owner has the keys Not even the server owner has the keys needed to decrypt or modify them.
needed to&nbsp;decrypt or&nbsp;modify them.
**XMPP** is&nbsp;an&nbsp;extensible protocol for instant messaging. **XMPP** is an extensible protocol for instant messaging.
Its open, decentralized, and mature. It's open, decentralized, and mature.
**OMEMO** is&nbsp;a&nbsp;<a **OMEMO** is a widely supported XMPP Extension Protocol (XEP)
href='https://omemo.top/'
target='_blank'>widely supported</a>
XMPP Extension Protocol (XEP)
for secure multi-client end-to-end encryption. for secure multi-client end-to-end encryption.
You can read more about You can read more about
it&nbsp;on&nbsp;a&nbsp;<a it on a&nbsp;<a
href='https://conversations.im/omemo/' href='https://contrapunctus.codeberg.page/the-quick-and-easy-guide-to-xmpp.html'
target='_blank'>dedicated page by&nbsp;Daniel Gultsch</a>. target='_blank'>dedicated page by Daniel Gultsch</a>.
**Client**, in&nbsp;this post, **Client**, in this post,
means a&nbsp;specific instance means a specific instance of an XMPP application on a user device.
of&nbsp;an&nbsp;XMPP application on&nbsp;a&nbsp;user device.
<br>OMEMO-related documentation uses the term Device, <br>OMEMO-related documentation uses the term Device,
but I&nbsp;find it&nbsp;potentially confusing: but I find it potentially confusing:
in&nbsp;practice, a&nbsp;single physical device in practice, a single physical device can run multiple independent clients.
can run multiple independent clients.
## Basic Concepts ## Basic Concepts
This section introduces some basics of&nbsp;end-to-end encryption. This section introduces some basic ideas behind end-to-end encryption.
If&nbsp;youre already familiar with the concepts and terminology, If you're already familiar with the concepts and terminology,
you can skip ahead to&nbsp;<a you can skip ahead to&nbsp;<a
href='#practical-aspects-of-omemo-and-xmpp'>how end-to-end encryption href='#'>how end-to-end encryption affects the XMPP user experience</a>
affects the XMPP user experience</a>, or jump straight to the <a
or&nbsp;jump straight to&nbsp;the <a href='#'>step-by-step workflow</a>&nbsp;I personally use.
href='#step-by-step-guide'>step-by-step workflow</a> I&nbsp;personally use.
### Trade-offs Between Safety and Convenience ### Trade-offs Between Safety and Convenience
Unfortunately, things that are truly secure are rarely convenient. Unfortunately, things that are truly secure are rarely convenient.
They often require some initial efforts They often require some initial efforts and a bit of ongoing attention.
and a&nbsp;bit of&nbsp;ongoing attention.
Telegram, which used to&nbsp;be&nbsp;a&nbsp;benchmark for messenger usability Telegram, which used to be a benchmark for messenger usability
before its long dive into enshitification, before its long dive into enshitification,
really draws the line between convenience and security. really draws the line between convenience and security.
Regular chats are easy and flexible, Regular chats are easy and flexible,
but “secret” chats come with a&nbsp;full set of&nbsp;limitations: but "secret" chats come with a full set of limitations:
theyre one-on-one only, theyre one-on-one only,
cant be&nbsp;synced to&nbsp;another device, cant be synced to another device,
arent available on&nbsp;desktop at&nbsp;all, arent available on desktop at all,
and so&nbsp;on. and so on.
All commercial so-called “secure” messengers, like Signal or&nbsp;WhatsApp, All commercial so-called "secure" messengers, like Signal or WhatsApp,
end up&nbsp;with pretty similar limitations, end up with pretty similar limitations,
because its tricky to&nbsp;make end-to-end encrypted chats because it's tricky to make end-to-end encrypted chats
work the way users expect. work the way users expect.
Luckily, protocols and cryptography dont care about Luckily, protocols and cryptography dont care about
convenience or&nbsp;user expectations. convenience or user expectations.
Many XMPP clients let you do&nbsp;almost anything youre trying to&nbsp;do. Many XMPP clients let you do almost anything youre trying to do.
Sometimes its clunky and unintuitive, Sometimes its clunky and unintuitive,
sometimes its the kind of&nbsp;freedom sometimes its the kind of freedom that lets you shoot yourself in the foot.
that lets you shoot yourself in&nbsp;the foot. At the end of the day, youd better understand what youre doing.
At&nbsp;the end of&nbsp;the day, youd better understand what youre doing.
It&nbsp;might sound messy, but for that price, XMPP actually It might sound messy, but for that price, XMPP actually
gives you a&nbsp;lot of&nbsp;handy features: gives you a lot of handy features:
your chats are secured with Signal-grade end-to-end encryption, your chats are secured with Signal-grade end-to-end encryption,
and you can use as&nbsp;many devices as&nbsp;you want, and you can use as many devices as you want,
all at&nbsp;the same time, all at the same time,
without being tied to&nbsp;any proprietary service. without being tied to any proprietary service.
This post is here to show how to use it intentionally and safely.
In&nbsp;general, the XMPP experience today In general, the XMPP experience today
could be&nbsp;described as&nbsp;a&nbsp;“WhatsApp with benefits and frictions”. could be described as a "WhatsApp with benefits and frictions".
Its kinda ironic, considering that WhatsApps protocol It's kinda ironic, considering that WhatsApps protocol
is&nbsp;actually based on&nbsp;XMPP, but incompatibly altered and defederated. is actually based on XMPP, but incompatibly altered and defederated.
### Keys, Fingerprints and Trust ### Keys, Fingerprints and Trust
OMEMO is&nbsp;based on&nbsp;the <a OMEMO is based on the Double Ratchet Algorithm.
href='https://en.wikipedia.org/wiki/Double_Ratchet_Algorithm'
target='_blank'>
Double Ratchet Algorithm</a>.
While the internal details are quite interesting, While the internal details are quite interesting,
for practical purposes its enough to&nbsp;know that for practical purposes it's enough to know that
each client stores some cryptographic keys each client stores some cryptographic keys
and can derive a&nbsp;hash from them, commonly called a&nbsp;fingerprint. and can derive a hash from them, commonly called a fingerprint.
Keys are usually managed automatically by&nbsp;the XMPP client, Keys are usually managed automatically by the XMPP client,
and in&nbsp;normal use you should never need to&nbsp;handle them manually. and in normal use you should never need to handle them manually.
In&nbsp;fact, you probably dont even need to&nbsp;know what they look like. In fact, you probably dont even need to know what they look like.
A&nbsp;fingerprint lets you identify A fingerprint lets you identify a specific client of your contact
a&nbsp;specific client of&nbsp;your contact and verify that it hasnt been spoofed.
and verify that it&nbsp;hasnt been spoofed. Fingerprints for an account are not secret:
Fingerprints for an&nbsp;account are not secret: clients publish their own fingerprints to the XMPP server
clients publish their own fingerprints to&nbsp;the XMPP server and automatically receive the fingerprints of others.
and automatically receive the fingerprints of&nbsp;others. Only fingerprints you explicitly mark as trusted are relevant.
Only fingerprints you explicitly mark as&nbsp;trusted are relevant.
In&nbsp;an&nbsp;typical scenario, the contact should confirm in&nbsp;person In an ideal scenario, the contact should confirm in person
or&nbsp;through an&nbsp;already trusted and secure communication channel or through an already trusted and secure communication channel
that the fingerprint belongs to&nbsp;their device, that the fingerprint belongs to their device,
and only then you mark it&nbsp;as&nbsp;trusted. and only then you mark it as trusted.
In most XMPP clients this is simply done by ticking a checkbox
or by scanning a QR code.
The list of&nbsp;trusted fingerprints The list of trusted fingerprints is used at the moment a message is sent.
is&nbsp;used at&nbsp;the moment a&nbsp;message is&nbsp;sent. Behind the scenes, OMEMO performs a certain amount of key management,
Behind the scenes, and only the clients that are present in the trusted list
OMEMO performs a&nbsp;certain amount of&nbsp;key management, at the time of encryption will be able to decrypt the message later.
and only the clients that are present in&nbsp;the trusted list
at&nbsp;the time of&nbsp;encryption
will be&nbsp;able to&nbsp;decrypt the message later.
Its important to&nbsp;understand It's important to understand that trust cannot be applied retroactively:
that trust cannot be&nbsp;applied retroactively: it's not possible to "extend" trust to new clients
its not possible to&nbsp;“extend” trust to&nbsp;new clients after a message has already been encrypted and sent.
after a&nbsp;message has already been encrypted and sent.
<h2 id='practical-aspects-of-omemo-and-xmpp'> ## Practical Aspects of OMEMO and XMPP
Practical Aspects of&nbsp;OMEMO and XMPP
</h2>
### Chat History ### Chat History
In&nbsp;theory, XMPP supports server-side message history storage via In theory, XMPP supports server-side message history storage via
**XEP-0313: Message Archive Management**. **XEP-0313: Message Archive Management**.
In&nbsp;practice, support for this XEP, In practice, support for this XEP,
as&nbsp;well as&nbsp;retention policies and message lifetime, as well as retention policies and message lifetime,
depends on&nbsp;the specific server. depends on the specific server.
You should never assume that all conversations are stored You should never assume that all conversations are stored
indefinitely by&nbsp;default. indefinitely by default.
From a&nbsp;practical standpoint, From a practical standpoint,
the server-side MAM archive is&nbsp;better considered a&nbsp;cache: the server-side MAM archive is better considered a cache:
it&nbsp;can help you handle recent messages after a&nbsp;short period offline it can help you handle recent messages after a short period offline
or&nbsp;synchronize conversations across multiple devices. or synchronize conversations across multiple devices.
At&nbsp;the end of&nbsp;the day, At the end of the day, keeping your chat history is your responsibility,
keeping your chat history is&nbsp;your responsibility, and this is a good place to apply a local-first approach.
and this is&nbsp;a&nbsp;good place to&nbsp;apply a&nbsp;local-first approach.
### Synchronisation ### Synchronisation
Seamless switching between clients is&nbsp;handled by Seamless switching between clients is handled by
**XEP-0280: Message Carbons**. **XEP-0280: Message Carbons**.
Before its introduction, only incoming messages were synced between devices, Before its introduction, only incoming messages were synced between devices,
while your own outgoing messages were not. while your own outgoing messages were not.
Protocol-level mirroring of&nbsp;your own messages Protocol-level mirroring of your own messages
is&nbsp;a&nbsp;rather non-obvious feature :D is a rather non-obvious feature :D
Its important to&nbsp;note that with end-to-end encryption, It's important to note that with end-to-end encryption,
the concept of&nbsp;trusted fingerprints also applies to&nbsp;your own clients. the concept of trusted fingerprints also applies to your own clients.
For seamless synchronisation of&nbsp;outgoing messages, For seamless synchronisation of outgoing messages,
all your clients must trust each others fingerprints. all your clients must trust each other's fingerprints.
A&nbsp;new client, A new client,
or&nbsp;an&nbsp;old one that was not trusted or an old one that was not trusted at the time messages were sent,
at&nbsp;the time messages were sent, will receive the full history from MAM but will not be able to decrypt it.
will receive the full history from MAM
but will not be&nbsp;able to&nbsp;decrypt it.
<br>Yes, even your own messages. <br>Yes, even your own messages.
In&nbsp;theory, re-encrypting messages on&nbsp;already trusted clients In theory, re-encrypting messages on already trusted clients
could solve this issue, but no&nbsp;XMPP client implements it&nbsp;yet. could solve this issue, but no XMPP client implements it yet.
So&nbsp;in&nbsp;practice you may need to&nbsp;manually resend So in practice you may need to manually resend
some data to&nbsp;a&nbsp;new device. some data to a new device.
### Message Correction ### Message Correction
Its worth keeping in&nbsp;mind that Its worth keeping in mind that
features that seem simple and straightforward at&nbsp;first glance, features that seem simple and straightforward at first glance,
such as&nbsp;message editing and deletion, such as message editing and deletion,
actually rely on&nbsp;client-side implementation actually rely on client-side implementation
and may not behave for your recipient the way you expect. and may not behave for your recipient the way you expect.
Theyre fine to&nbsp;use and are well supported in&nbsp;some clients, Theyre fine to use and are well supported in some clients,
but you shouldnt rely on&nbsp;them to&nbsp;hide anything. but you shouldnt rely on them to hide anything.
### Maintenance ### Maintenance
OMEMO was designed as&nbsp;a&nbsp;set-it-and-forget-it solution OMEMO was designed as a set-it-and-forget-it solution,
and mostly succeeds in&nbsp;that goal. and it mostly succeeds in that goal.
If&nbsp;you have a&nbsp;basic understanding of&nbsp;how the protocol works If you have a basic understanding of how the protocol works
and check in&nbsp;online from time to&nbsp;time, and check in online from time to time,
there shouldnt be&nbsp;any surprises. there shouldnt be any surprises.
All maintenance comes down to&nbsp;making regular backups All maintenance comes down to making regular backups
and notifying your contacts and notifying your contacts
when fingerprints are added or&nbsp;no&nbsp;longer valid when fingerprints are added or no longer valid
so&nbsp;they can keep their trust list up&nbsp;to&nbsp;date. so they can keep their trust list up to date.
## Step-by-Step Guide ## Step-by-step Guide
Lets say I&nbsp;have a&nbsp;XMPP account, `me@some.server`, Lets say I have a XMPP account, me@some.server,
and a&nbsp;few devices: and a few devices: a phone, a laptop, and a desktop computer.
a&nbsp;phone, a&nbsp;laptop, and a&nbsp;desktop computer. First Ill describe my mindset at a high level,
First Ill describe my&nbsp;mindset at&nbsp;a&nbsp;high level,
then Ill add some notes about specific clients. then Ill add some notes about specific clients.
### Client Roles ### Client Roles
On&nbsp;the one hand, I&nbsp;have my&nbsp;phone. On the one hand, I have my phone.
Its almost always with me&nbsp;and almost always online. Its almost always with me and almost always online.
Thats where I&nbsp;keep the full chat history Thats where I keep the full chat history and get real-time notifications.
and get real-time notifications.
On&nbsp;the other hand, I&nbsp;have a&nbsp;couple of&nbsp;desktop applications. On the other hand, I have a couple of desktop applications.
I&nbsp;only open them I only open them when I need to discuss something using my keyboard
when I&nbsp;need to&nbsp;discuss something using my&nbsp;keyboard or move some text between devices.
or&nbsp;share some text between devices. I like to think of them as ad-hoc or satellite clients.
I&nbsp;like to&nbsp;think of&nbsp;them as&nbsp;satellite clients.
### Before the Start ### Before the Start
First, enable OMEMO encryption First, enable OMEMO encryption on every client if it isn't enabled by default.
on&nbsp;every client if&nbsp;it&nbsp;isnt enabled by&nbsp;default. The client will usually generate the keys and fingerprint automatically.
The next step is&nbsp;to&nbsp;add The next step is to add all clients to the trust list on each device:
all clients to&nbsp;the trust list on&nbsp;each device: my phone should trust all my computers,
my&nbsp;phone should trust all my&nbsp;computers, and my computers should trust each other as well as my phone.
and my&nbsp;computers should trust each other
as&nbsp;well as&nbsp;my&nbsp;phone.
Fingerprints do&nbsp;not have to&nbsp;be&nbsp;secret, Fingerprints do not have to be secret, so they can be published on
so&nbsp;they can be&nbsp;published on your website or even on social media profiles.
your website or&nbsp;even on&nbsp;social media profiles. Here is my page with the fingerprints:
Here is&nbsp;my&nbsp;page with the fingerprints, for example: https://oddsquat.org/about/keys/
<br><a href='https://oddsquat.org/about/keys/' target='_blank'>
https://oddsquat.org/about/keys/
</a>
### Start the Conversation in&nbsp;Person ### Start the Conversation in Person
Lets say I&nbsp;meet Alice, Lets say I meet Alice,
we&nbsp;start talking, we start talking, and decide to continue the conversation online.
and then decide to&nbsp;continue the conversation online.
I&nbsp;open a&nbsp;special QR&nbsp;code on&nbsp;my&nbsp;phone, I open a special QR code on my phone, and Alice scans it with her client.
and Alice scans it&nbsp;with her client. This QR code already contains the fingerprints of all my devices,
This QR&nbsp;code already contains so no extra steps are needed.
the fingerprints of&nbsp;all my&nbsp;devices,
so&nbsp;no&nbsp;extra steps are needed on&nbsp;her phone.
After that, I&nbsp;do&nbsp;the same
and scan her QR&nbsp;code as&nbsp;well.
Later at&nbsp;home, Then I do the same and scan the QR code from Alices screen
I&nbsp;manually mark her devices as&nbsp;trusted on&nbsp;my&nbsp;computers with my mobile client.
using the trusted list on&nbsp;my&nbsp;phone, and she does the same.
Now we&nbsp;are both sure Now we are both sure that its really us in the conversation,
that it&nbsp;is&nbsp;really us&nbsp;in&nbsp;the conversation, and that all messages will be available on all our devices and only on them.
and that all messages will be&nbsp;available
on&nbsp;all our devices and only on&nbsp;them.
### Start the Conversation Online ### Start the Conversation Online
Lets say Bob and I&nbsp;start discussing something Lets say Bob and I start discussing something
on&nbsp;a&nbsp;forum or&nbsp;in&nbsp;the Fediverse, on a forum or in the Fediverse,
and then decide to&nbsp;continue the discussion on&nbsp;XMPP. and then decide to move to XMPP.
Before starting the chat, Bob starts the chat. I trust the first device he messages me from,
Bob can confirm its really me&nbsp;using my&nbsp;page with fingerprints. and then we exchange fingerprints for our other devices, if we have any.
I&nbsp;can confirm its really him This approach is called TOFU (Trust On First Use).
by&nbsp;asking him to&nbsp;send his fingerprints
in&nbsp;a&nbsp;private message on&nbsp;the same forum or&nbsp;via email.
Ideally, Bob also has a&nbsp;public page with his fingerprints. Bob can confirm its really me using my page with fingerprints.
That way, we&nbsp;can both independently verify I can confirm its really him by asking him to send his fingerprints
that we&nbsp;are who we&nbsp;say we&nbsp;are. in a private message on the same forum or via email.
In&nbsp;an&nbsp;alternative scenario, Ideally, Bob also has a public page with his fingerprints.
where there has been no&nbsp;prior communication or&nbsp;public pages That way, we can both independently verify
and only a&nbsp;single JID&nbsp;is known, that we are who we say we are.
things play out a&nbsp;bit differently:
Bob starts the chat,
I&nbsp;trust the first device he&nbsp;messages me&nbsp;from,
and then we&nbsp;exchange fingerprints for our other devices,
if&nbsp;we&nbsp;have any.
This approach is&nbsp;called TOFU (Trust On&nbsp;First Use).
### New or&nbsp;Lost Devices ### New or Lost Devices
If&nbsp;I&nbsp;start using a&nbsp;new device If I start using a new device or install another client application,
or&nbsp;install another client application, the first thing I do is add it to the list of trusted clients
the first thing I&nbsp;do&nbsp;is&nbsp;add it&nbsp;to&nbsp;the list on my existing devices.
of&nbsp;trusted clients on&nbsp;my&nbsp;existing devices.
If&nbsp;I&nbsp;lose one of&nbsp;my&nbsp;devices If I lose one of my devices or delete any private keys,
or&nbsp;delete any private keys, the first thing I do is remove the corresponding client
the first thing I&nbsp;do&nbsp;is&nbsp;remove the corresponding client from the trusted list on my other devices.
from the trusted list on&nbsp;my&nbsp;other devices.
Once Ive updated all my&nbsp;personal lists, Once Ive updated all my personal lists,
I&nbsp;should inform my&nbsp;contacts about changes via trusted channels. I should inform my contacts about changes via trusted channels.
I&nbsp;can simply ask Alice to&nbsp;scan I can simply ask Alice to scan my new QR code the next time we meet,
my&nbsp;new QR&nbsp;code the next time we&nbsp;meet, and send Bob a message introducing my new client or letting him know
and send Bob a&nbsp;message introducing that the lost device is no longer trusted
my&nbsp;new client or&nbsp;letting him know and that no real messages will ever come from it again.
that the lost device is&nbsp;no&nbsp;longer trusted
and that no&nbsp;real messages will ever come from it&nbsp;again.
## Client Applications ## Client Applications
This section describes This section describes how OMEMO is used in specific client applications
how OMEMO is&nbsp;used in&nbsp;specific client applications that I personally use.
that I&nbsp;personally use.
### Conversations and Forks ### Conversations and Forks
<a Conversations is a modern, fully featured chat application for Android.
href='https://conversations.im/' It supports everything a messaging app should support:
target='_blank'> chats, voice calls, and sharing photos and files.
Conversations</a> is&nbsp;a&nbsp;modern,
fully featured chat application for Android.
It&nbsp;supports everything a&nbsp;messaging app should support:
chats, voice calls, video calls, and sharing files of&nbsp;any kind.
There are several forks of&nbsp;it&nbsp;where There are several forks of it where the UI or UX may differ,
the UI&nbsp;or&nbsp;UX&nbsp;may differ,
but the core features work exactly the same. but the core features work exactly the same.
I&nbsp;personally use <a I personally use Monocles Chat.
href='https://codeberg.org/monocles/monocles_chat'
target='_blank'>
Monocles Chat</a>.
On&nbsp;the Contact Details screen (including your own account), On the Contact Details screen (including your own account),
you can see a&nbsp;list of&nbsp;published fingerprints you can see a list of published fingerprints
and manually mark them as&nbsp;trusted or&nbsp;revoke trust. and manually mark them as trusted or revoke trust.
To&nbsp;simplify all these routine operations, To simplify all these routine operations, a QR-code-based system is used:
a&nbsp;QR-code-based system is&nbsp;used: You can show your own QR code or scan other peoples codes
you can show your own QR&nbsp;code or&nbsp;scan other peoples codes
directly from the main screen. directly from the main screen.
This makes device verification during in-person meetings This makes device verification during in-person meetings simple and effortless.
simple and effortless.
### Dino ### Dino
<a Dino is a lightweight GTK-based GUI client.
href='https://dino.im/'
target='_blank'>
Dino</a> is&nbsp;a&nbsp;lightweight GTK-based GUI client.
It&nbsp;can be&nbsp;considered a&nbsp;fully functional one, It can be considered a fully functional one,
although some non-essential features are still not implemented. although some non-essential features are still not supported or implemented.
For example, For example,
it&nbsp;is&nbsp;not possible to&nbsp;clear local chat history it is not possible to clear local chat history using built-in methods :D
using built-in methods :D
Trust and untrust decisions can be&nbsp;easily managed Trust and untrust decisions can be easily managed
in&nbsp;the Encryption tab of&nbsp;the Conversation Details window. in the Encryption tab of the Conversation Details window.
It&nbsp;is&nbsp;important to&nbsp;note that, It is important to note that, by default, Dino is configured
by&nbsp;default, Dino is&nbsp;configured to automatically trust new fingerprints.
to&nbsp;automatically trust new fingerprints. I recommend disabling this feature.
I&nbsp;recommend disabling this feature.
### Profanity ### Profanity
<a Profanity is a powerful TUI client
href='https://profanity-im.github.io/' where everything is controlled through a built-in command system.
target='_blank'>
Profanity</a> is&nbsp;a&nbsp;powerful TUI client
where everything is&nbsp;controlled through a&nbsp;built-in command system.
If&nbsp;you somehow intend to&nbsp;use it, If you somehow intend to use it,
you can find a&nbsp;small cheat sheet for the `omemo` command below. below you will find a small cheat sheet for using OMEMO.
However, I&nbsp;strongly recommend reading the full documentation. However, I strongly recommend reading the full documentation.
- Generate a&nbsp;key and add your other clients: - Generate a key and add your other clients:
```text ```text
/omemo gen /omemo gen
/omemo trust me@some.server some-cool-fingerprint-01 /omemo trust me@some.server some-cool-fingerprint-01
@ -421,43 +349,26 @@ However, I&nbsp;strongly recommend reading the full documentation.
/omemo qrcode /omemo qrcode
``` ```
- View the list of&nbsp;your own or&nbsp;someone elses fingerprints: - View the list of your own or someone elses fingerprints:
```text ```text
/omemo fingerprint me@some.server /omemo fingerprint me@some.server
/omemo fingerprint alice@another.server /omemo fingerprint alice@another.server
``` ```
Trusted ones will be&nbsp;marked as&nbsp;`trusted`. Trusted ones will be marked as `trusted`.
- Start an&nbsp;encrypted conversation: - Start an encrypted conversation:
```text ```text
/omemo start alice@another.server /omemo start alice@another.server
``` ```
- Add fingerprints to&nbsp;the trusted list: - Add fingerprints to the trusted list:
```text ```text
/omemo trust alice@another.server some-cool-fingerprint-02 /omemo trust alice@another.server some-cool-fingerprint-02
/omemo trust alice@another.server some-cool-fingerprint-03 /omemo trust alice@another.server some-cool-fingerprint-03
/omemo trust bob@another.server some-cool-fingerprint-04 /omemo trust bob@another.server some-cool-fingerprint-04
``` ```
- Revoke trust for a&nbsp;specific client: - Revoke trust for a specific client:
```text ```text
/omemo untrust alice@another.server some-cool-fingerprint-02 /omemo untrust alice@another.server some-cool-fingerprint-02
``` ```
## Late Disclaimer
This post was originally intended
as&nbsp;a&nbsp;collection of&nbsp;answers to&nbsp;questions
I&nbsp;had when I&nbsp;first started using XMPP with OMEMO.
It&nbsp;isnt meant to&nbsp;be&nbsp;exhaustive or&nbsp;formal,
but rather to&nbsp;clarify the practical side of&nbsp;things
and reduce that initial feeling of&nbsp;being lost
when you keep running into
“The message was not encrypted for this device”
over and over again.
From now on, I&nbsp;hope you wont encounter such errors
or&nbsp;any other issues
connected to&nbsp;end-to-end encryption in&nbsp;XMPP.

View file

@ -2,13 +2,12 @@
layout: post layout: post
lang: 'ru' lang: 'ru'
title: 'ugly keyboards'
description: 'Почему нас окружают уродливые клавиатуры и что с этим можно сделать.'
section: 'posts'
year: '2026' year: '2026'
date: '2026-03-18' date: '2026-03-18'
section: 'posts'
title: 'ugly_keyboards'
description: 'Почему нас окружают уродливые клавиатуры и что с этим можно сделать.'
--- ---

View file

@ -123,7 +123,7 @@ Incomplete list of&nbsp;my&nbsp;projects and experiments.
- <article class='entry'> - <article class='entry'>
<header> <header>
<strong> <strong>
Cantor MX&nbsp;Tastatura Cantor MX Tastatura
</strong> </strong>
</header> </header>
<section class='description'> <section class='description'>
@ -141,7 +141,7 @@ Incomplete list of&nbsp;my&nbsp;projects and experiments.
</strong> </strong>
</header> </header>
<section class='description'> <section class='description'>
Huge custom ergonomic mechanical Dactyl-Manuform (5×6) keyboard. Huge custom ergonomic mechanical Dactyl-Manuform (5&times;6) keyboard.
</section> </section>
<section> <section>
<a href='https://github.com/He4eT/oddkb' target='_blank'>repository</a> <a href='https://github.com/He4eT/oddkb' target='_blank'>repository</a>

View file

@ -1,15 +1,16 @@
--- ---
layout: post layout: post
lang: 'en' lang: 'en'
date: '2020-10-30'
year: '2020'
section: 'posts'
title: 'markdown test page' title: 'markdown test page'
description: 'A test document written using the Markdown language.' description: 'A test document written using the Markdown language.'
section: 'posts'
year: '2020'
date: '2020-10-30'
--- ---
# Markdown: Syntax # Markdown: Syntax

View file

@ -25,7 +25,6 @@ const tp = new Typograf({
const enabledRules = [ const enabledRules = [
'common/nbsp/*', 'common/nbsp/*',
'common/punctuation/apostrophe',
'common/punctuation/quote', 'common/punctuation/quote',
'en-US/dash/main', 'en-US/dash/main',
'ru/dash/main', 'ru/dash/main',