<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Delta Chat</title>
		<description>Messenger based on e-mail</description>		
		<link>https://delta.chat</link>
		<atom:link href="https://delta.chat/feed.xml" rel="self" type="application/rss+xml" />
		
			
			
			<item>
				<title>Zero metadata, group descriptions, native audio/video calls and much more!</title>
				<description>&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-31-bottle-zero.jpg&quot; alt=&quot;Drawing sketch provided by Paula Petersen&quot; title=&quot;Drawing sketch provided by Paula Petersen&quot; style=&quot;width:240px; float:right; clear:both; margin-left:1em; margin-bottom:.2em;&quot; /&gt;
&lt;strong&gt;With the latest 2.48+ releases,
a chat message reveals close to zero metadata to servers.&lt;/strong&gt;
For cryptographers and messenger enthusiasts, here are the key points on how we turned email very close to zero-metadata:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No cleartext Auto-Submitted or threading headers.&lt;/strong&gt;
In addition to Subject, To, and group membership headers, we’re now also protecting
Auto-Submitted, References, and In-Reply-To.
This means that all meaningful header metadata now lives exclusively in the encrypted part of messages,
implementing full &lt;a href=&quot;https://datatracker.ietf.org/doc/rfc9788/&quot;&gt;Header Protection (RFC 9788)&lt;/a&gt;.
Transport servers only see a minimal so-called outer envelope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Randomized Date header.&lt;/strong&gt;
The outer Date is 5-day randomized, preventing timestamp-correlation
from attackers with access to temporary server message archives.
Delta Chat would not need this header at all,
but we decided to maintain compatibility with other encrypting email apps,
and classic email servers,
which often require this outer Date header to function at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SecureJoin v3 hides cryptographic identities.&lt;/strong&gt;
When the user scans a QR code or clicks on an invite link,
multiple administrative messages are exchanged
in order to establish a chat and verify the encryption setup.
The &lt;a href=&quot;https://github.com/chatmail/core/issues/7396&quot;&gt;new SecureJoin protocol (link contains more beautiful hand drawings!)&lt;/a&gt;
encrypts all initial messages,
and also shows
how to skilfully evolve a protocol to be both forward- and backward-compatible,
thus avoiding any friction for users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No cryptographic key information in OpenPGP messages anymore.&lt;/strong&gt;
We have finally &lt;a href=&quot;https://github.com/chatmail/core/issues/7384&quot;&gt;enabled OpenPGP anonymous recipients&lt;/a&gt;
after waiting five months to give everyone time to upgrade their chatmail clients first.
Please make sure all your devices, and those of your contacts, are using at least
&lt;a href=&quot;https://delta.chat/en/2025-08-04-encryption-v2&quot;&gt;the v2 security-upgrade releases from August 2025 &lt;/a&gt;.
Especially apps older than June 2025 might encounter “unable to decrypt” messages otherwise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No “Sealed Sender” yet,&lt;/strong&gt; but also no phone numbers or private data
recorded at chatmail relays.
Chatmail profiles are created with random addresses
and without asking for any personal information.
We have some ideas about eventually implementing “Sealed Sender”,
but are more likely to aim for &lt;a href=&quot;https://autocrypt2.org&quot;&gt;Autocrypt2 support&lt;/a&gt; first,
a new IETF specification draft for Post-Quantum-Cryptography and Reliable Deletion (“Forward Secrecy”).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-30-near-zero-meta.png&quot; /&gt;&lt;br /&gt;&lt;em&gt;orange: random, green: hidden, everything else: no meaningful data&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;native-calls-on-android-and-ios&quot;&gt;Native calls on Android and iOS!&lt;/h2&gt;

&lt;p&gt;Audio and video calls on Android, iOS
now behave like native phone calls:
you can keep a &lt;strong&gt;call running in the background&lt;/strong&gt;
while switching to a different chat or even another app.
Another useful use case is to &lt;strong&gt;talk while playing&lt;/strong&gt; in-chat games like chess!
Under the hood, calls use peer-to-peer &lt;a href=&quot;https://github.com/deltachat/calls-webapp&quot;&gt;WebRTC&lt;/a&gt;
with signaling via regular Delta Chat messages.
The feature is still behind the “debug calls” setting but probably not in the next release anymore.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-30-android-calls.jpg&quot; style=&quot;width:185px;&quot; /&gt;
&lt;img src=&quot;../assets/blog/2026-03-30-android-calls2.jpg&quot; style=&quot;width:185px;&quot; /&gt;    
&lt;img src=&quot;../assets/blog/2026-03-31-ios-calls1.jpg&quot; style=&quot;width:180px;&quot; /&gt;
&lt;img src=&quot;../assets/blog/2026-03-31-ios-calls2.jpg&quot; style=&quot;width:180px;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;native-video-calls-on-deltatouch-ubuntu-touch&quot;&gt;Native video calls on DeltaTouch (Ubuntu Touch)&lt;/h2&gt;

&lt;p&gt;Google and Apple are highly problematic centralized authorities for the mobile ecosystem,
which is why we are supporting developments on &lt;strong&gt;alternative mobile ecosystems&lt;/strong&gt;
to the best of our abilities and resources.
Luckily, there are some private donors supporting development of DeltaTouch in particular,
a pretty much feature-parity Delta Chat client available on many “Lomiri” platforms.
DeltaTouch recently also landed &lt;strong&gt;audio/video calls, compatible with Delta Chat and all other chatmail clients&lt;/strong&gt;.
If you have C++ and QT knowledge and interests,
by all means consider helping in the &lt;a href=&quot;https://codeberg.org/lk108/deltatouch&quot;&gt;Codeberg DeltaTouch repository&lt;/a&gt;,
and the friendly and skillful developers behind it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-31-deltatouch-1.png&quot; style=&quot;width:185px;&quot; /&gt;  
&lt;img src=&quot;../assets/blog/2026-03-31-deltatouch-2.png&quot; style=&quot;width:185px;&quot; /&gt;  
&lt;img src=&quot;../assets/blog/2026-03-31-deltatouch-3.png&quot; style=&quot;width:185px;&quot; /&gt;  
&lt;img src=&quot;../assets/blog/2026-03-31-deltatouch-4.jpg&quot; style=&quot;width:185px;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;group-and-channel-descriptions&quot;&gt;Group and channel descriptions&lt;/h2&gt;

&lt;p&gt;Groups and broadcast channels now support &lt;a href=&quot;https://github.com/chatmail/core/pull/7829&quot;&gt;descriptions&lt;/a&gt;
that members see in the group profile.
Descriptions are end-to-end encrypted and synced with member additions,
making it easy to tell new members what a group is about.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-30-chan-descr-android.jpg&quot; style=&quot;width:275px;&quot; /&gt;  
&lt;img src=&quot;../assets/blog/2026-03-30-group-descr-ios.jpg&quot; style=&quot;width:250px;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;background-audio-message-player&quot;&gt;Background audio message player&lt;/h2&gt;

&lt;p&gt;For those of us who like interacting via audio messages, this is golden:
both Desktop and Android now support &lt;strong&gt;playing audio messages in the background.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-31-audio-player-desktop.jpg&quot; style=&quot;width: 520px; margin-right: 1em;&quot; /&gt;
&lt;img src=&quot;../assets/blog/2026-03-31-audio-player-android.jpg&quot; style=&quot;width: 220px;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;download-on-demand-revamped-what-a-journey&quot;&gt;Download on demand revamped (what a journey!)&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-31-download-on-demand-1.png&quot; alt=&quot;Message bubble: [Mini App — 4.74 MiB] - Download button; Message bubble: [Video — 14.82 MiB] - Downloading...&quot; style=&quot;width:320px; float:right; clear:both; margin-left:1em; margin-bottom:.5em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We had to fundamentally re-implement the years-old “download on demand” feature,
because it was relying on “cleartext headers” that aren’t available anymore (see the intro on zero-metadata above).
For larger messages, and messages with an attachment,
Delta is now internally sending two messages, one small and one large.
This provides receivers the choice to first download all small messages,
and automatically or optionally download the larger ones:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Calls can get through without first downloading potentially megabytes of attachments.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Delta Chat iOS notifications work without crashing on large messages.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Not yet fully downloaded messages are correctly placed in chats (instead of weird 1:1 email messages).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We still know about a few shortcomings but it should mostly just work fine.
For those interested in the breadth of past and ongoing implementation efforts,
&lt;a href=&quot;https://github.com/chatmail/core/issues?q=pre-message&quot;&gt;search for ‘pre-messages’&lt;/a&gt;
and pray the apparently increasingly vibe-coded GitHub infrastructure grants you results.&lt;/p&gt;

&lt;h2 id=&quot;at-risk-user-needs-1-availability-2-telegram-3-security&quot;&gt;“At-risk” user needs: 1. availability 2. telegram 3. security&lt;/h2&gt;

&lt;p&gt;For over a decade, security-oriented messengers have been urged
to match the latest cryptographic protocols, with Signal often cited as the gold standard.
With the current releases we are closing in on the security and privacy gaps between Delta Chat and Signal. 
But we’d like to kindly remind everyone that Telegram has reached more than one billion users.
One billion people! Many of whom prioritize user experience and UI features,
happily providing message content and metadata to the billionaire hands 
of Mr. Pavel Durov, who offers nothing more than a “Trust me, bro!” attitude.
His skills in security propaganda are second to nobody!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chaos.social/@delta/116243542449596112&quot;&gt;
&lt;img src=&quot;../assets/blog/2026-03-31-chaos-delta.png&quot; alt=&quot;Fediverse funding fact post&quot; title=&quot;Fediverse funding fact post&quot; style=&quot;width:320px; float:right; clear:both; margin-left:1em; margin-bottom:.5em;&quot; /&gt;
&lt;/a&gt;
Delta Chat has always been a pragmatic UI-oriented project.
We aim to provide the &lt;strong&gt;features users expect without centralization and monopoly traps&lt;/strong&gt;.
Even with limited resources compared to tech giants
our newest releases continue to drive usability and modern UI features forward.
An impossible dream for Telegram channels users,
Delta Chat’s &lt;strong&gt;encrypted broadcast channels are&lt;/strong&gt; evolving to provide &lt;strong&gt;a more secure and private alternative&lt;/strong&gt;.
Also, our &lt;a href=&quot;https://chaos.social/@delta/115479392746850836&quot;&gt;public ‘find a messenger with more convenient onboarding’ challenge&lt;/a&gt;
remains open for submissions. No strong competitors emerged so far :)&lt;/p&gt;

&lt;p&gt;As we enter 2026, the rise of authoritarianism makes communication resilience
critical for an increasing number of “at-risk” users everywhere.
&lt;strong&gt;If a tool is blocked or unavailable,
its features, security or otherwise, provide exactly zero benefit.&lt;/strong&gt;
Real-world availability is the very foundation of security in emergency situations,
and in this regard, Delta Chat apps are likely second to none.
Even the &lt;a href=&quot;https://www.nytimes.com/2026/03/31/world/europe/russia-internet-restrictions.html&quot;&gt;New York Times seems to agree&lt;/a&gt;
and we are not quite done yet developing more resiliency features …&lt;/p&gt;

&lt;h2 id=&quot;maximizing-availability-and-resilience-through-multi-path-delivery&quot;&gt;Maximizing availability and resilience through multi-path delivery&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://chatmail.at/relays&quot;&gt;
&lt;img src=&quot;../assets/blog/2026-03-31-chatmail-drawn.jpg&quot; alt=&quot;Hand-drawn chatmail logo&quot; title=&quot;Hand-drawn chatmail logo from Paula Petersen featuring an @ symbol inside a chat bubble.&quot; style=&quot;width:160px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Single-path messaging systems suffer from a fundamental flaw:
if your primary server is blocked or goes down, communication stops.
Centralized services like Signal, WhatsApp, or Telegram are easily targeted
and if they go down themselves, there is no remedy whatsoever.
Also the decentralized Matrix requires depending on a single home server,
creating a persistent single point of failure.&lt;/p&gt;

&lt;p&gt;Our new releases introduce &lt;strong&gt;resilient multi-path message delivery.&lt;/strong&gt;
Each profile can now use multiple relays or mail servers for sending and receiving messages.
If one is blocked, messages automatically flow through another.
Tapping into the &lt;a href=&quot;https://chatmail.at/relays&quot;&gt;growing network of chatmail relays&lt;/a&gt;,
Delta Chat users can finally achieve true transport-layer redundancy,
and transport operators can sleep better
knowing that if their relay goes down it will not prevent users from chatting.
You may imagine it as providing multiple evasive paths for those
seeking to evade the All-Seeing Eye of centralized surveillance and control.
For Rust experts interested in the implementation,
start from the &lt;a href=&quot;https://github.com/chatmail/core/issues/7357&quot;&gt;“multi-relay” development issue&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-31-relay-network-drawing2.jpg&quot; alt=&quot;Hand-drawn relay network redundancy diagram by anonymous author&quot; title=&quot;Diagram showing Alice and Bob connected through six relay servers (@1 to @6), illustrating how communication continues even if some servers fail.&quot; style=&quot;width:550px;&quot; /&gt;&lt;br /&gt;
&lt;em&gt;any of two relays of Alice or Bob can fail, but chatting works&lt;/em&gt;&lt;br /&gt; &lt;/p&gt;

&lt;p&gt;Currently, adding secondary relays is a manual step in “Advanced Settings -&amp;gt; Relays”.
&lt;strong&gt;Ensure all your devices are upgraded to version 2.48 or later before enabling this feature&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2026-03-30-relays.png&quot; style=&quot;width:320px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After conducting more research and iterative streamlining of multi-path operations,
we aim to automate the onboarding process so that profiles learn about new relays organically.
We are setting ourselves the mad goal of
providing an unstoppable, planetary-scale and very private Internet messaging experience,
while using and improving IETF Internet messaging (email) protocols,
with room for community developments, adaptations and variations at every level.&lt;/p&gt;

&lt;p&gt;If you would like to support our efforts, please consider
&lt;a href=&quot;https://delta.chat/en/contribute&quot;&gt;contributing or donating&lt;/a&gt;,
running a &lt;a href=&quot;https://chatmail.at/relays&quot;&gt;chatmail relay&lt;/a&gt;,
or explore the enjoyable wilderness of using or creating &lt;a href=&quot;https://webxdc.org&quot;&gt;secure mini-apps&lt;/a&gt;,
without depending on any app store or hosting servers.&lt;/p&gt;

&lt;p&gt;♥ &lt;strong&gt;thanks for following and supporting us&lt;/strong&gt; ♥&lt;/p&gt;
</description>
				<pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2026-03-31-zero</link>
				<guid isPermaLink="true">https://delta.chat/en/2026-03-31-zero</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Delta Chat V2: a major security upgrade, beautified contact profiles, new email action and direct app access in chats</title>
				<description>&lt;p&gt;&lt;img src=&quot;../assets/blog/2vampire.png&quot; style=&quot;width:240px; float:right; clear:both; margin-bottom:.2em;&quot; /&gt;
&lt;strong&gt;With Delta Chat Version 2, chats are end-to-end encrypted, always and by default.&lt;/strong&gt;
Previously it was possible that chats without green checkmarks could contain messages without end-to-end encryption. 
Not anymore. 
Consequently, Version 2 drops all lock icons, most green checkmarks and a few “decryption problem” dialogues,
simplifying the user interface and raising the floor for real-world security outcomes. 
After all, most users don’t want to engage in theorizing and checking end-to-end encryption.
They have actual lives to live, and enough challenges to tackle already. 
They &lt;em&gt;just&lt;/em&gt; want a reliable fun-to-use messenger that keeps their chats, messages and contacts private. 
The decade long discourse on how to achieve this “just” is ongoing, and V2 releases are our contribution to it.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-07-no-desktop-padlock.png&quot; style=&quot;width:100%; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;rolling-out-major-security-upgrades-into-federated-ecosystems&quot;&gt;Rolling out major security-upgrades into federated ecosystems&lt;/h2&gt;

&lt;p&gt;V2 releases maintain compatibility with older releases, 
even though they roll out a major security upgrade
across many hundred thousand devices, across dozens of apps and bots, at relatively random points in time. 
During 8 years of development, we never needed to ask users or developers for “co-ordinated upgrades” 
like for example &lt;a href=&quot;https://matrix.org/blog/2025/07/security-predisclosure/&quot;&gt;Matrix&lt;/a&gt; 
and &lt;a href=&quot;https://getsession.org/blog/groups-v2-how-to-upgrade&quot;&gt;Session&lt;/a&gt; did in 2025.
But how could we avoid asking for such painful coordination, when other federated messaging projects struggle?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First of all,&lt;/strong&gt; the planetary-scale email system is mature
and has separation between transport protocols and message formats. 
There are no sudden changes in the SMTP protocols which deliver 360 billion messages per day. 
There are many battle-tested server implementations. 
Upgrading any of the many &lt;a href=&quot;https://chatmail.at/clients&quot;&gt;chatmail clients&lt;/a&gt; 
is largely unrelated to how servers upgrade.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://github.com/chatmail/core/blob/main/README.md&quot;&gt;
&lt;img src=&quot;../assets/logos/core-rust-logo.png&quot; style=&quot;width:100px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;/a&gt;
&lt;strong&gt;Second,&lt;/strong&gt; Delta Chat and all other chatmail clients
embed the &lt;a href=&quot;https://github.com/chatmail/core/blob/main/README.md&quot;&gt;chatmail core Rust library&lt;/a&gt;. 
This means there is a single central place where “moving the ecosystem” can be implemented. 
The &lt;a href=&quot;https://github.com/chatmail/core/pull/6796&quot;&gt;key v2 work in the chatmail core Rust library&lt;/a&gt; 
added 4696 and removed 6299 lines of code, netting a &lt;strong&gt;removal of 1603 lines of code&lt;/strong&gt;. 
It fundamentally changed how “identity” and end-to-end encryption is handled in chatmail V2 messaging.
Chatmail clients, though? 
They don’t need to do much more than pulling in a V2 core version, drop some UI elements, adapt a few APIs
and enjoy vast security and compatibility benefits. 
It’s as relaxing as it sounds (except for chatmail core developers who bear the brunt if anything goes wrong).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third,&lt;/strong&gt; low-level chatmail core developments are moored to UI and UX goals,
and involve &lt;a href=&quot;https://passthesalt.ubicast.tv/videos/always-more-secure-analyzing-user-migrations-to-federated-e2ee-messaging-apps-trimmed/&quot;&gt;ongoing usable security research into federated messaging systems&lt;/a&gt;. 
Our protocol- and cryptography-experts accept constraining their designs 
so that they fit actual UI and UX goals, not the other way round. 
Providing smooth distributed upgrading across the ecosystem is a key UX goal which all teams aim for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fourth,&lt;/strong&gt; luck. We may have been just lucky, all things considered :) 
Our centralized core Rust architecture and mature email protocols with transport/content separation help
but do not guarantee that we never have to ask users unpleasant questions or for forgiveness. 
“Nothing works all the time” is a long-running meme in chatmail circles, with a double meaning. 
It was probably coined around the second &lt;a href=&quot;https://delta.chat/en/2019-05-08-xyiv&quot;&gt;10-day gathering in Kyiv 2019&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;chatmail-relays-a-second-layer-of-e2e-enforcement&quot;&gt;Chatmail relays: a second layer of E2E enforcement&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://chatmail.at&quot;&gt;
&lt;img src=&quot;../assets/logos/chatmail.png&quot; style=&quot;width:100px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chatmail.at/relays&quot;&gt;Chatmail relays&lt;/a&gt; are used for default onboarding of Delta Chat users and&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;provide random interoperable email addresses without asking for any private information,&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;enforce OpenPGP end-to-end encryption with metadata-minimization for all sent and received emails,&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;enforce strict Transport Layer Security (TLS) and Domain Key signing (DKIM)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chatmail relays and apps each independently enforce transport and end-to-end encryption
across the world-wide growing &lt;a href=&quot;https://chatmail.at&quot;&gt;secure chatmail&lt;/a&gt; ecosystem. 
New relays are automatically interoperable based on cryptography and IETF standards. 
No permission from us needed.&lt;/p&gt;

&lt;h2 id=&quot;classic-email-usage-was-enhanced-but-requires-opt-in&quot;&gt;Classic email usage was enhanced but requires opt-in&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/email-icon.png&quot; style=&quot;width:100px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
You can not receive or send messages without end-to-end encryption
when onboarding with &lt;a href=&quot;https://chatmail.at/relays&quot;&gt;chatmail relays&lt;/a&gt;,
but you may manually setup a classic email account, also as an additional profile. 
Messages without end-to-end encryption will then be marked with a mail icon. 
Only classic email profiles offer the new “new email” UI action 
that allows to set a subject and add email address recipients
before sending a cleartext email. 
With Version 2 releases, emails without end-to-end encryption 
are generally easier to recognize because chat avatars will also use the same boring mail icon
and chat messages in mail chats will never become end-to-end encrypted.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-07-email-subject.png&quot; style=&quot;width:300px; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;img src=&quot;../assets/blog/2025-07-emails.png&quot; style=&quot;width:300px; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;contact-profiles-are-more-beautiful-on-all-platforms&quot;&gt;Contact Profiles are more beautiful on all platforms&lt;/h2&gt;

&lt;p&gt;While users have few problems navigating identities in small private circles,
the new more beautiful contact profiles aim to help navigate larger chat circles 
where members frequently get added or removed. 
The new contact profile aims to help users 
to identify group members and chat partners more easily.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-07-profile-android.png&quot; style=&quot;width:300px; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;img src=&quot;../assets/blog/2025-07-profile-ios.png&quot; style=&quot;width:300px; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;shortcuts-to-recently-used-apps-in-chats&quot;&gt;Shortcuts to recently used apps in chats&lt;/h2&gt;

&lt;p&gt;All Delta Chat clients now provide direct access in the chat title bar to recently used &lt;a href=&quot;https://webxdc.org/apps&quot;&gt;webxdc apps&lt;/a&gt;.
For more background, we recently wrote about refined app discovery, notifications and home screen integration 
at &lt;a href=&quot;https://delta.chat/en/2025-01-23-webxdc-no-billionaires&quot;&gt;Replacing billionarish platforms with zip-files&lt;/a&gt;,
and about the introduction of &lt;a href=&quot;https://delta.chat/en/2024-11-20-webxdc-realtime&quot;&gt;realtime Peer-to-Peer networking&lt;/a&gt;,
followed by &lt;a href=&quot;https://chaos.social/@delta/114517181096683376&quot;&gt;running a Quake multiplayer game co-ordinated between chatmail peers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-07-app-quick-start.png&quot; style=&quot;width:500px; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;ps-the-chatmail-ecosystem-is-moving&quot;&gt;PS: the chatmail ecosystem is moving&lt;/h2&gt;

&lt;p&gt;In 2016, Signal founder Moxie Marlinspike claimed in &lt;a href=&quot;https://signal.org/blog/the-ecosystem-is-moving/&quot;&gt;the ecosystem is moving&lt;/a&gt;
that federated systems, and email in particular, can fundamentally not do end-to-end encryption:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;So while it’s nice that I’m able to host my own email, that’s also the
reason why my email isn’t end-to-end encrypted, and probably never
will be. By contrast, WhatsApp was able to introduce end-to-end
encryption to over a billion users with a single software update. So
long as federation means stasis while centralization means movement,
federated protocols are going to have trouble existing in a software
climate that demands movement as it does today. (Moxie Marlinspike July 25, 2017)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Challenge accepted :) 
Today, the &lt;a href=&quot;https://chatmail.at&quot;&gt;chatmail&lt;/a&gt; ecosystem of apps, servers and bots 
is living proof that email based end-to-end encrypted messaging is not only possible, 
but even rolling out big security enhancements throughout a federated system can work. 
But there is a fun twist that &lt;em&gt;reinforces&lt;/em&gt; Moxie’s core “centralization means movement” argument: 
&lt;a href=&quot;https://github.com/chatmail/core/blob/main/README.md&quot;&gt;chatmail Rust core&lt;/a&gt; 
&lt;em&gt;beats&lt;/em&gt; Signal in terms of being one centralized codebase 
that is used in all &lt;a href=&quot;https://chatmail.at/clients&quot;&gt;chatmail clients&lt;/a&gt;. 
All federation protocols and IETF standards are implemented in this one centralized library
with a single database schema, whereas Signal’s Android, iOS and Desktop versions 
each use different databases (making migration between platforms hard)
and different languages to implement networking, higher level data structures 
or even some cryptographic properties like &lt;a href=&quot;https://delta.chat/en/help#sealedsender&quot;&gt;Sealed Sender&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the cryptographic machine rooms,
centralized chatmail core efforts co-evolve with the security-audited &lt;a href=&quot;https://github.com/rpgp/rpgp&quot;&gt;rPGP Rust library&lt;/a&gt;
which implements state-of-the-art end-to-end encryption protocols and algorithms. 
Few know that Delta Chat uses the same Ed25519 Rust signing crate as Signal,
that chatmail only uses a &lt;em&gt;minimal carefully selected subset&lt;/em&gt; of OpenPGP,
and that current-day OpenPGP collaboration between various players is pretty enjoyable. 
Chatmail clients are not implementing any aspect of OpenPGP, TLS or email protocols. 
The embedded chatmail Rust core and rPGP do all the heavy lifting,
both backed by multiple &lt;a href=&quot;https://delta.chat/en/help#security-audits&quot;&gt;security audits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To make a longer story short, we recently posted about &lt;a href=&quot;https://chaos.social/@delta/114710708299242142&quot;&gt;our commitments to federation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We are basically doing what #signal and in particular Moxie refused to do, or declared impossible: federation.&lt;/p&gt;

  &lt;p&gt;Both the #email and #activitypub ecosystems are all about federation.&lt;/p&gt;

  &lt;p&gt;However, #deltachat is vertically centralized in that all UIs use the same #rust core which implements all networking, encryption, chat/group/message logic in a single centralized place. The now 40+ #chatmail mail relay network is driven by centralized code.&lt;/p&gt;

  &lt;p&gt;At each level, replication and federation is built in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;pps-what-some-of-you-may-be-curious-about&quot;&gt;PPS: What some of you may be curious about&lt;/h2&gt;

&lt;p&gt;We revised our &lt;a href=&quot;https://delta.chat/en/help#e2ee&quot;&gt;Encryption and security FAQ&lt;/a&gt; 
and include notes on &lt;a href=&quot;https://delta.chat/en/help#pfs&quot;&gt;Forward Secrecy&lt;/a&gt;,
&lt;a href=&quot;https://delta.chat/en/help#sealedsender&quot;&gt;Sealed Sender&lt;/a&gt;
and &lt;a href=&quot;https://delta.chat/en/help#pqc&quot;&gt;Post Quantum Cryptography&lt;/a&gt;. 
To hear about our conceptions of usable security and future plans
you may watch &lt;a href=&quot;https://chaos.social/@delta/114794093068029745&quot;&gt;two security talks from June 2025&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;ppps-what-regular-end-users-wonder-about-&quot;&gt;PPPS: What regular end-users wonder about :)&lt;/h2&gt;

&lt;p&gt;A while ago, a contributor’s parent and long-time Delta Chat user
got back saying: “Everything is fine! But why does each message have a hand bag?”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/handbag.png&quot; style=&quot;width:100px; display: block; margin: auto;&quot; /&gt;&lt;/p&gt;
</description>
				<pubDate>Mon, 04 Aug 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-08-04-encryption-v2</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-08-04-encryption-v2</guid>
			</item>
			
			
		
			
			
			<item>
				<title>A big user surge and funding for decentralized scale</title>
				<description>&lt;p&gt;Beginning June we witnessed a sudden surge of Delta Chat usage especially in the US and Cuba. 
We don’t know the social dynamics behind it but it probably helps that 
Delta Chat apps resiliently work on all platforms and offer a pleasing user interface 
which increasingly many families, groups and communities appreciate. 
Be that as it may, let’s look at some indicators of the recent surge, 
then highlight centralization risks and our mitigation efforts.&lt;/p&gt;

&lt;h2 id=&quot;5000-new-users-per-hour-on-the-default-chatmail-relay&quot;&gt;5000 new users per hour on the default chatmail relay&lt;/h2&gt;

&lt;p&gt;&lt;img alt=&quot;Graph about creation of user accounts on default onboarding server last 6 hours&quot; src=&quot;../assets/blog/surge-5000-users-per-hour.png&quot; style=&quot;max-width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Fun fact: after some performance adjustments to Dovecot, 
the small physical server keeps humming along 
at 20% CPU and 20% IO pressure without consuming noticeable disk storage.&lt;/p&gt;

&lt;h2 id=&quot;18-million-googleapple-push-notifications-per-day&quot;&gt;1.8 Million Google/Apple push notifications per day&lt;/h2&gt;

&lt;p&gt;&lt;img alt=&quot;Graph about push notifications of the last day&quot; src=&quot;../assets/blog/2025-06-direct-notifications-per-day.png&quot; style=&quot;max-width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This daily number reflects the incoming messages for chatmail users 
who installed their app from Google Play or Apple store. 
F-droid, Desktop or classic e-mail users are not reflected in this number.
Number of daily push notifications was around 350K end of February 2025.&lt;/p&gt;

&lt;h2 id=&quot;google-play-android-downloads-crossed-500k-downloads&quot;&gt;Google Play Android downloads crossed 500K downloads&lt;/h2&gt;

&lt;p&gt;&lt;img alt=&quot;Google Play store showing 500K+ downloads&quot; src=&quot;../assets/blog/2025-06-google-play.png&quot; style=&quot;max-width: 100%&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that we generally recommend F-droid or other non-Google sources of installing Delta Chat apps
and only have a somewhat informed guess that at most half of Android users use non-Google sources.&lt;/p&gt;

&lt;h2 id=&quot;funding-for-a-globally-scaled-chatmail-relay-network&quot;&gt;Funding for a globally scaled chatmail relay network&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/logos/chatmail.png&quot; style=&quot;width:100px; float:left; clear:both; margin-right:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are many community-operated &lt;a href=&quot;https://chatmail.at/relays&quot;&gt;chatmail relays&lt;/a&gt; on all continents 
but most new users choose the default onboarding relay in Germany,
reproducing &lt;strong&gt;the known problem of formally decentralized but centralized in practice&lt;/strong&gt; offerings. 
We are engaging in two key Research and Development areas 
to fundamentally mitigate this centralization tendency 
and achieve distributed scale, along with improved resiliency and privacy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Cryptographic hardening&lt;/strong&gt;: Using e-mail addresses as transport but not as a
source of identity; hiding cryptographic identities from transports; 
and further minimizing visibility of meta-data in messages.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Multi-transport&lt;/strong&gt;: Allowing a chat profile to use multiple chatmail relays 
interchangeably, releasing users and operators from making “life-long choices” 
in favor of “as long as it works” choices.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, public funding for these key infrastructure efforts suddenly dried up earlier in 2025,
disrupting our ability to follow through with our always usability-driven work. 
We are now seeking to finance key development work through donations,
aiming to provide decentralized secure messaging infrastructure at global scale,
all open to third parties joining the fun in a permission-free manner. 
A Minecraft-like world for messaging.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://opencollective.com/chatmail&quot; class=&quot;cta-button&quot;&gt;Donate to the new chatmail infrastructure OpenCollective (Europe)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;../../en/donate&quot; class=&quot;cta-button&quot;&gt;Donate to Delta Chat app developments (Libera, BTC, IBAN, OC)&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;nothing-like-in-person-cross-project-gatherings-diff&quot;&gt;Nothing like in-person cross-project gatherings: DIFF!&lt;/h2&gt;

&lt;p&gt;Last but not least, if you are interested in more technical details 
and want to engage with our various contributor teams and communities,
the place to be is &lt;a href=&quot;https://delta.chat/en/2025-05-12-diff-invitation&quot;&gt;DIFF in the Black Forest starting this weekend&lt;/a&gt; 
or, else, for now, sorting your way through our development repositories
and the twisted maze of community and contributor chat groups :)&lt;/p&gt;
</description>
				<pubDate>Wed, 04 Jun 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-06-04-surge-donations</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-06-04-surge-donations</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Delta Chat Desktop, but running inside of Firefox 🦊</title>
				<description>&lt;p&gt;As part of the project to port Delta Chat Desktop from Electron to Tauri&lt;sup id=&quot;fnref:3&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, we’ll showcase a setup where our Desktop app runs in Firefox and does not depend on Electron or Chromium anymore. This video and post walks through what works already, and what doesn’t and is generally aimed at developers and expert users.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;../assets/blog/2025-05-22-browser-edition/browser-screenshot-firefox.png&quot; alt=&quot;Delta Chat Desktop UI running in the Firefox Browser&quot; style=&quot;max-width: 100%; aspect-ratio: 2934 / 1782;&quot; /&gt;
    &lt;figcaption&gt;
        Delta Chat, running in the Firefox Browser
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Features:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;☑️ Basic functionality (such as sending and receiving messages)&lt;/li&gt;
  &lt;li&gt;📎 Sending attachments&lt;/li&gt;
  &lt;li&gt;🔔 Notifications (while the tab is open)&lt;/li&gt;
  &lt;li&gt;1️⃣ Badge counter (number in tab title)&lt;/li&gt;
  &lt;li&gt;🦊🧭🏐 Works in Firefox, Safari, and Chrome&lt;/li&gt;
  &lt;li&gt;🔐 HTTPS with self-signed certificate&lt;/li&gt;
  &lt;li&gt;🔑 Password Protection&lt;/li&gt;
  &lt;li&gt;⬇️ Download attachments or open in browser (useful for PDF)&lt;/li&gt;
  &lt;li&gt;ℹ️ Local Help also works&lt;/li&gt;
  &lt;li&gt;🌐 Language based on Browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is a video that shows the Browser Version in action:&lt;/p&gt;

&lt;video controls=&quot;&quot; style=&quot;max-width: 100%;&quot; alt=&quot;Demo video of the Delta Chat Web version in action&quot;&gt;&lt;source src=&quot;https://delta.chat/video/browser-edition-blogpost-demo.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;

&lt;p&gt;Though it is not standalone, it still needs a server component because Chatmail core&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; can not yet be compiled into a WebAssembly to run fully in the browser, but more on that later.&lt;/p&gt;

&lt;h3 id=&quot;why-we-made-a-browser-edition&quot;&gt;Why we made a Browser Edition&lt;/h3&gt;

&lt;p&gt;So why did we make a Desktop version that works in a Browser? We had three reasons:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Lots of people rightfully criticized depending on Google’s Chromium and resource-hungry Electron&lt;sup id=&quot;fnref:electron&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:electron&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
  &lt;li&gt;To give access to development tools and add-ons on all browsers.&lt;/li&gt;
  &lt;li&gt;To bring back automated integration testing for Delta Chat Desktop.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;future-usecases&quot;&gt;Possible future use cases&lt;/h3&gt;

&lt;p&gt;There are many more ways this web version could be used besides the ones already mentioned:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“Delta Chat Web” - run core on a mobile device and connect to it from a computer over a local network for a WhatsApp web-like experience.&lt;/li&gt;
  &lt;li&gt;Delta Chat as a service (for example, a company could host instances for all their employees).&lt;/li&gt;
  &lt;li&gt;It could be a way to port Delta Chat to special operating systems&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt; that have a browser and rust support, but have no support for Electron or Tauri&lt;sup id=&quot;fnref:3:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/li&gt;
  &lt;li&gt;Run Delta Chat Web on your Raspberry Pi / home server connect from your devices
    &lt;ul&gt;
      &lt;li&gt;treefit already made a &lt;a href=&quot;https://codeberg.org/treefit/deltachat-homeassistant-addon&quot;&gt;plugin for running it on home assistant&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img alt=&quot;Delta Chat Web inside of Home Assistant&quot; src=&quot;../assets/blog/2025-05-22-browser-edition/browser-edition-in-home-assistant.png&quot; style=&quot;max-width: 100%&quot; /&gt;
    &lt;figcaption&gt;Delta Chat Web inside of Home Assistant&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;diving-deeper-into-technical-details&quot;&gt;Diving deeper into technical details&lt;/h3&gt;

&lt;p&gt;To make the Web UI of Delta Chat Desktop independent of Electron, we needed to make our code more modular:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We switched to the JSON-RPC API, which we highlighted in a &lt;a href=&quot;https://delta.chat/en/2025-02-11-why-jsonrpc-bindings-exist&quot;&gt;previous blog post&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;We created a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Runtime&lt;/code&gt; interface and moved all direct calls to Electron into a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RuntimeElectron&lt;/code&gt; class that implements this interface.&lt;/li&gt;
  &lt;li&gt;We also moved nearly all the logic to the frontend/UI code, so the runtimes are even simpler to make and maintain because they contain less and simpler code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Effectively, the web-based UI of the desktop client became independent of Electron or Chromium. 
To add a new Runtime you just need to implement the runtime interface and load it when you start the app.&lt;/p&gt;

&lt;p&gt;The code of the runtime interface: &lt;a href=&quot;https://github.com/deltachat/deltachat-desktop/blob/main/packages/runtime/runtime.ts#L29&quot;&gt;https://github.com/deltachat/deltachat-desktop/blob/main/packages/runtime/runtime.ts#L29&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-05-22-browser-edition/runtime-interface.svg&quot; style=&quot;max-width: 100%&quot; alt=&quot;Diagram visualizing the before and after&quot; /&gt;&lt;/p&gt;

&lt;details&gt;
    &lt;summary&gt;Downsides and Caveats of the Current Browser Version&lt;/summary&gt;
    &lt;p&gt;The current approach has the following caveats that you should to keep in mind&lt;/p&gt;
    &lt;ol&gt;
        &lt;li&gt;
            If you host the server component on a VPS, then the VPS will become the place where the messages are decrypted, so you break the premise of the end-to-end encryption: &quot;end device to end device&quot;.
        &lt;/li&gt;
        &lt;li&gt;
            You need to host the server component for each user, so you need to build management software if you want to use this for a SaaS project/product.
        &lt;/li&gt;
        &lt;li&gt;
            Currently, only one client can connect to the Chatmail core at a time, because there is only a single event queue. &lt;br /&gt; If you would connect multiple clients right now, then they would steal events from each other. 
        &lt;/li&gt;
        &lt;li&gt;
            The current security could be improved: The WebSocket server does not perform origin validation and the login has no timeout/cooldown on wrong passwords. But those would be easy to add.
        &lt;/li&gt;
    &lt;/ol&gt;
    &lt;p&gt;
        Also, some features are still missing in the browser version:
    &lt;/p&gt;
    &lt;ul&gt;
        &lt;li&gt;webxdc chat-shared apps&lt;/li&gt;
        &lt;li&gt;experimental maps/location-streaming&lt;/li&gt;
        &lt;li&gt;viewing HTML emails&lt;/li&gt;
    &lt;/ul&gt; 
    &lt;p&gt;
        These missing features, and especially the webxdc app sandboxing, require more work. See &lt;a href=&quot;https://delta.chat/en/2023-05-22-webxdc-security&quot;&gt;Webxdc security blog post&lt;/a&gt; for a deep dive into the issues. 
    &lt;/p&gt;
&lt;/details&gt;

&lt;h3 id=&quot;what-comes-next-requires-helping-hands-and-contributions&quot;&gt;What comes next requires helping hands and contributions&lt;/h3&gt;

&lt;p&gt;Besides the issues noted, a Web version of Delta Chat that fully satisfies end-to-end encryption guarantees needs the Rust Chatmail core library to run in the browser. Rust in general compiles to &lt;a href=&quot;https://webassembly.org/&quot;&gt;WebAssembly (WASM)&lt;/a&gt;. For example, the security-audited &lt;a href=&quot;https://github.com/rpgp/rpgp&quot;&gt;rPGP end-to-end encryption library&lt;/a&gt; is implemented fully in Rust and  is continuously tested with WebAssembly targets. However, there are some key challenges to address for a “standalone” Web version:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Find a solution for both database storage (currently Chatmail core uses SQLite as an embedded C-library) and arrange fast file storage for media files, avatars etc.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Find a solution to Browsers being unable to perform SMTP or IMAP network protocols; this could involve &lt;a href=&quot;https://chatmail.at/relays&quot;&gt;Chatmail relays&lt;/a&gt; offering a minimal HTTP/WebSocket interface to bridge the gap.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Support webxdc realtime P2P networking and support running &lt;a href=&quot;https://chaos.social/@delta/114517181096683376&quot;&gt;in-chat multiplayer Quake III Arena realtime gameplay&lt;/a&gt;;  Our friends at &lt;a href=&quot;https://iroh.computer&quot;&gt;Iroh&lt;/a&gt; are themselves working on Web-versions&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Explore how well the Chatmail core async Rust code can run in WebAssembly; this could involve a lot of refactoring.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href=&quot;https://support.delta.chat/t/what-would-be-needed-for-a-standalone-web-version-without-a-server-component/3789&quot;&gt;Web version topic in the Delta Chat Forum&lt;/a&gt; for further discussion.&lt;/p&gt;

&lt;p&gt;If you are not really into programming, it might be hard to understand how hard these issues are.
But no worries, even if you are a programmer, or even with ourselves as matter experts, it’s hard to predict :)&lt;/p&gt;

&lt;h2 id=&quot;invitation-to-diff-june-7-17th-in-freiburg&quot;&gt;Invitation to DIFF June 7-17th in Freiburg&lt;/h2&gt;

&lt;p&gt;The best way to discuss with many of us is by making it to an in-person community gathering. This crazy year of 2025 around we are &lt;a href=&quot;https://delta.chat/en/2025-05-12-diff-invitation&quot;&gt;inviting to the DIFF gathering&lt;/a&gt; starting in just a few weeks.&lt;/p&gt;

&lt;h2 id=&quot;donations-needed&quot;&gt;Donations needed&lt;/h2&gt;

&lt;p&gt;While some of our work is funded through public bodies, a lot of it is not.  Please consider &lt;a href=&quot;https://delta.chat/en/donate&quot;&gt;sending a monetary contribution&lt;/a&gt; if you can and appreciate our efforts and want to enable more. Thanks!&lt;/p&gt;

&lt;p&gt;If you want to try the experimental browser version yourself, then you can find the instructions at &lt;a href=&quot;https://github.com/deltachat/deltachat-desktop/blob/main/packages/target-browser/Readme.md&quot;&gt;https://github.com/deltachat/deltachat-desktop/blob/main/packages/target-browser/Readme.md&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:3&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Tauri is an alternative to Electron that is smaller, because it uses the web view provided by the operating system instead of including a whole Chromium browser. It is also written in the memory-safe compiled language rust, which offers security and speed benefits. There will be another blog post going into more detail soon; in the meantime, you can learn more at &lt;a href=&quot;https://tauri.app/&quot;&gt;https://tauri.app/&lt;/a&gt;. &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt; &lt;a href=&quot;#fnref:3:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Formerly known as Delta Chat Core. It is the core library all our UI implementations use. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:electron&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Though It should be said that despite it’s flaws, Electron has served us well over the years and we are grateful that it exists. But it is never good to be too dependent on a single framework, especially one that is so resource wasteful and hard for us to extend or contribute back to. &lt;a href=&quot;#fnref:electron&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;I’m thinking BSD flavors, Haiku, or other rare enthusiast operating systems here &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
				<pubDate>Thu, 22 May 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-05-22-browser-edition</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-05-22-browser-edition</guid>
			</item>
			
			
		
			
			
			<item>
				<title>DIFF Invitation June 7-17th</title>
				<description>&lt;video controls=&quot;&quot; style=&quot;width:560px; max-width: 100%;&quot;&gt;&lt;source src=&quot;https://delta.chat/video/diff-invitation2-2025.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;
&lt;p&gt;During June 7-17th many of our contributors and from neighboring projects will gather in Freiburg in the Black Forest.
We will use outsides and insides of the oldest “free and democratic school” in Germany, the “Kapriole”.
DIFF currently stands for “Decentralized Internet Federation Fusion”.&lt;/p&gt;

&lt;h2 id=&quot;who-is-coming-what-is-happening-at-diff&quot;&gt;Who is coming? What is happening at DIFF?&lt;/h2&gt;

&lt;p&gt;There will be plenty folks from &lt;a href=&quot;https://chatmail.at&quot;&gt;chatmail developments&lt;/a&gt;, from Delta Chat Android/iOS/Desktop/UbuntuTouch, chat bots, 
&lt;a href=&quot;https://webxdc.org&quot;&gt;webxdc app development&lt;/a&gt; as well as &lt;a href=&quot;https://iroh.computer&quot;&gt;Iroh&lt;/a&gt; and &lt;a href=&quot;https://github.com/rpgp/rpgp&quot;&gt;rPGP&lt;/a&gt; projects,
and then some who engage with reviving Peer-to-Peer file sharing, or develop &lt;a href=&quot;https://w2g.tv/en/&quot;&gt;Watch2Gether&lt;/a&gt;. 
We are to be joined by people from international solidarity groups,
an Ukrainian video and photo artist, piano and noise musicians
and likely a theater professional who is to help creating the “Can you arrest a protocol?” play 
about three anti-cryptography court cases … which might see an experimental premiere during DIFF.&lt;/p&gt;

&lt;p&gt;You are invited to join any of this. 
If you want to bring some friends or conspirators, be our guests.&lt;/p&gt;

&lt;h2 id=&quot;co-working-cross-concern-hacking-and-diversions&quot;&gt;Co-working, cross-concern hacking and diversions&lt;/h2&gt;

&lt;p&gt;As of May 12th there are 30+ people arranging themselves to make it,
with about a dozen to do so during the full date frame. 
On some days, some will likely use the opportunity to climb nearby hills, jump into rivers or lakes,
or engage in other diversions. 
Maybe a so called &lt;a href=&quot;https://en.wikipedia.org/wiki/Union_of_egoists&quot;&gt;Union of Egoists&lt;/a&gt;
is not an entirely unfitting reference of how our gatherings typically play out. 
You may also get some vibes by reading a report about a &lt;a href=&quot;https://delta.chat/en/2019-05-08-xyiv&quot;&gt;gathering in Kyiv a few years ago&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The school will be generally open from morning till evening
and everyone may also cling together in small groups, take a room and also do internal project sessions. 
We’ll see to arrange for some food and drinks. Commercial food places are in walking distance. 
On some days we probably do presentation/demo evenings, and announce them publically. 
The place is also exceptionally well suited to have kids around and Freiburg
is also generally a vacationing area, with quick train rides to Switzerland and France.&lt;/p&gt;

&lt;h2 id=&quot;attending-and-joining-diff&quot;&gt;Attending and joining DIFF&lt;/h2&gt;

&lt;p&gt;If you, maybe along with a group of like-minded people, want to join DIFF, that’s quite possible still! 
If you are an individual interested in any of the above, we’ll see to help you feel at home and welcome. 
Please take note of our &lt;a href=&quot;https://delta.chat/en/community-standards&quot;&gt;Community standards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Please send a direct message to our Fediverse &lt;a href=&quot;https://chaos.social/@delta&quot;&gt;@delta@chaos.social&lt;/a&gt;
or to our &lt;a href=&quot;mailto:delta@merlinux.eu&quot;&gt;delta team address&lt;/a&gt; (&lt;a href=&quot;https://i.delta.chat/#56136E70473FB9E59331D760C007984652839B20&amp;amp;a=delta%40merlinux.eu&amp;amp;n=Delta%20Chat%20team&amp;amp;i=ZVfPYn6j2fvtpc_0M6V45uEP&amp;amp;s=WWjjkBKJJ3So8AfuHGXNjcyE&quot;&gt;invite link&lt;/a&gt;)
and from there we’ll add you to a group chat that uses an webxdc editor and other chat apps for further co-ordination. 
You will need to care for some accommodation yourself. 
There also are some possibilities for sharing a room or space if you bring some sleeping gear. 
DIFF also serves as a testbed for arranging event onboarding and communications in chat groups and chat apps,
ahead, during and after the gathering.&lt;/p&gt;

&lt;h2 id=&quot;thanks-to-the-wau-holland-stiftung&quot;&gt;Thanks to the Wau-Holland Stiftung&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/logos/WHS-Logo.RAL5002.svg&quot; alt=&quot;Logo of Wau-Holand Stiftung&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We are grateful for the the support of the &lt;a href=&quot;https://wauland.de&quot;&gt;Wau-Holland Stiftung&lt;/a&gt; 
who agreed to finance the rent for the location and a travel grant. Many thanks!&lt;/p&gt;

</description>
				<pubDate>Mon, 12 May 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-05-12-diff-invitation</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-05-12-diff-invitation</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Messaging editing, deletion and saving now available!</title>
				<description>&lt;p&gt;No need to blush or melt in agony after sending a message anymore!
Editing and deleting messages is now available in most app stores :)&lt;/p&gt;

&lt;p&gt;How is this possible you might wonder? 
There are three core pillars about how Delta Chat functions 
that maybe also help to rectify often occuring misconceptions:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Delta Chat is not a classic e-mail client.&lt;/strong&gt;
It doesn’t show you the content of a mailbox (IMAP) folder. 
Delta only fetches new messages but never looks back at them. 
E-mail servers function as message transport only, not storage.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Delta Chat uses special messages to co-ordinate encryption, metadata and group interactions.&lt;/strong&gt;
Examples for special messages are reactions, group creation or membership changes, 
multi-device synchronization messages, secure encryption negotiation 
and now also editing or deleting a past message.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Delta Chat implements a Peer-to-Peer messaging paradigm&lt;/strong&gt;. 
Unlike with other messengers including WhatsApp, Matrix, Threema or Signal, 
there is &lt;strong&gt;no server side metadata or message state&lt;/strong&gt; so there is nothing to modify.
Edit/Delete are just special messages interpreted by chat partners’ devices.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With those fundamentals out of the way, let’s look at the new features in turn
and maybe start with “saving” messages before editing or deleting them ;)&lt;/p&gt;

&lt;h2 id=&quot;empowering-saved-messages-memory&quot;&gt;Empowering “Saved Messages” memory&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-03-saved-msgs-v2.jpeg&quot; alt=&quot;screenshot showing the new Saved Messages chat feature&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you forward a message to the “Saved Messages” chat
the message will preserve a “&amp;gt;” link jump to the original message.
Messages you saved will have a small bookmark icon in the chat 
so you can easily recognize that you already saved them.
There also is a new action when you select a message 
to save or bookmark it so that it appears in “Saved Messages”. 
The best: saving/bookmarking is always synchronized between your devices.&lt;/p&gt;

&lt;h2 id=&quot;typo-fixing-galore-editing-messages&quot;&gt;Typo-fixing galore: Editing Messages&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-03-edit-msg.jpeg&quot; alt=&quot;screenshot showing the new edit message feature&quot; /&gt;&lt;/p&gt;

&lt;p&gt;When you select a message, you can now pick the stencil (“edit” action)
and will be back as if the message were a draft. 
Note that you can only edit the text but you can not change any attachments. 
Once you send the message, all your chat partners will see an “edited” message,
also indicated the message bubble.&lt;/p&gt;

&lt;h2 id=&quot;deleting-messages-across-devices&quot;&gt;Deleting messages across devices&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-03-delete-msg-for-all.jpeg&quot; alt=&quot;screenshot showing the new &amp;quot;delete for everyone&amp;quot; feature&quot; /&gt;&lt;/p&gt;

&lt;p&gt;In the past, every time you deleted a chat or a message from one device 
you would need to go to all your other devices and repeat the process over and over.
Now message and chat deletion is synchronized across all your devices without breaking a sweat.
If you posted something accidentally (passwords, wrong files or pictures etc.) 
you can also delete your own messages for everyone in the chat now.&lt;/p&gt;

&lt;h2 id=&quot;limits-of-rewriting-the-past&quot;&gt;Limits of rewriting the past?&lt;/h2&gt;

&lt;p&gt;Neither deletion or editing currently have particular restrictions,
and there is no history of message edits. 
You can retract your own message from a year ago,
and edit a message 10 times. 
Will this happen and cause annoyances? 
If so, we’ll see to address issues and iterate. 
In any case, antagonistic or malfeasant chat partners have also many other ways 
to trick and annoy, and it may be a good idea to avoid or block them generally.
Meanwhile, enjoy your new typo-fixing, organizing and retracting powers!&lt;/p&gt;
</description>
				<pubDate>Wed, 26 Mar 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-03-26-edit-and-delete-how</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-03-26-edit-and-delete-how</guid>
			</item>
			
			
		
			
			
			<item>
				<title>From C- to JSON-based APIs of the Rust &quot;core&quot; library 📚</title>
				<description>
&lt;style&gt;
abbr[title] {
  text-decoration-color: rgba(128, 128, 128, 0.75);
}
&lt;/style&gt;

&lt;blockquote&gt;
  &lt;p&gt;Foremost this is a quite technical post. Read our other blog posts if you want something more targeted at end users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have not yet looked at the Delta Chat source code,
you might not know that we have a &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/&quot;&gt;Rust core library&lt;/a&gt; that holds everything together. 
Infrastructure features like encryption, email and network protocols,
chat, contact and message management are implemented in this Rust core library
and &lt;a href=&quot;https://support.delta.chat/t/list-of-all-known-client-projects/3059&quot;&gt;all apps of the current Delta Chat family&lt;/a&gt; 
as well as chat bots benefit from it:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;The core library does all the infrastructure and interoperability work and exposes
high-level methods such as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getAccounts&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getChatlist&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getChatContacts&lt;/code&gt; etc. 
so that it’s much less work maintaining apps or bots on all platforms, 
because they can fully focus on implementing user interactions and interfaces.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The core library is thoroughly tested with Rust unit tests 
and functional integration tests in Python using live-servers,
and core is what makes all apps fully interoperable with each other.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;The core library can easily be used to write bots and new apps/clients
(like DeltaTouch, a client for Ubuntu touch made by Lothar in about a year as a side project, read the &lt;a href=&quot;./2023-07-02-deltatouch&quot;&gt;blog post&lt;/a&gt;).&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;the-c-foreign-function-interface-cffi&quot;&gt;The C Foreign Function Interface (&lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;)&lt;/h2&gt;

&lt;p&gt;The C Foreign Function Interface, for short &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;, was the first way to link to core.
It was introduced back when Björn started the Delta Chat project.
He wrote the &lt;a href=&quot;https://github.com/deltachat/deltachat-core&quot;&gt;core in C&lt;/a&gt; and forked the Telegram Android app for the &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt;,
which is written in Java, so the core is connected via &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;&lt;sup id=&quot;fnref:CFFI&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:CFFI&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; and &lt;a href=&quot;https://github.com/deltachat/deltachat-android/blob/main/jni/dc_wrapper.c&quot;&gt;&lt;abbr title=&quot;Java Native Interface&quot;&gt;JNI&lt;/abbr&gt;&lt;/a&gt; (Java Native Interface).
Later &lt;a href=&quot;https://delta.chat/en/2019-05-08-xyiv#the-coming-delta-chat-rustocalypse&quot;&gt;when we moved the core to Rust&lt;/a&gt;, the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; stayed unmodified
which greatly helped to keep the ecosystem stable 
while the infrastructure implementation radically changed.&lt;/p&gt;

&lt;p&gt;The advantage of a &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; is that most programming languages have a built-in way to bind to it.&lt;/p&gt;

&lt;p&gt;A peek into how the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; methods look like (from &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/blob/main/deltachat-ffi/deltachat.h&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;deltachat.h&lt;/code&gt;&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cp&quot;&gt;#define DC_CONNECTIVITY_NOT_CONNECTED        1000
#define DC_CONNECTIVITY_CONNECTING           2000
#define DC_CONNECTIVITY_WORKING              3000
#define DC_CONNECTIVITY_CONNECTED            4000
&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dc_get_connectivity&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dc_context_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;typedef&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_dc_chatlist&lt;/span&gt;  &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dc_get_chatlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dc_context_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query_str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;query_id&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt;    &lt;span class=&quot;nf&quot;&gt;dc_chatlist_get_cnt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chatlist&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt;  &lt;span class=&quot;nf&quot;&gt;dc_chatlist_get_chat_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chatlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;uint32_t&lt;/span&gt;  &lt;span class=&quot;nf&quot;&gt;dc_chatlist_get_msg_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chatlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;dc_lot_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dc_chatlist_get_summary&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chatlist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;kt&quot;&gt;size_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dc_chat_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chat&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;void&lt;/span&gt;      &lt;span class=&quot;nf&quot;&gt;dc_chatlist_unref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dc_chatlist_t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;chatlist&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Most methods here provide a pointer to a Rust structure, which can be used to access its properties through specialized methods.
After using such a structure, you need to free it using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_unref&lt;/code&gt; methods (like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_chatlist_unref&lt;/code&gt;), otherwise you will create memory leaks.&lt;/p&gt;

&lt;h2 id=&quot;why-implement-a-new-way&quot;&gt;Why implement a new way to talk to core?&lt;/h2&gt;

&lt;p&gt;While the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; in Android and iOS was working fine,
in the Desktop version which is based on Electron it was more problematic. 
Electron contains a full browser which uses multiple processes,
and you can’t easily pass pointers to C-structs over process boundaries,
ignoring that this would a bad idea&lt;sup id=&quot;fnref:bad-idea&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:bad-idea&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;.
On Android and iOS, you can just call Delta Chat core from the &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt; thread,
because this thread is in the same process that the Delta Chat core library was linked to and not a completely different process like in Electron.
So we ended up writing a &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; on top of the Node.js &lt;abbr title=&quot;Node-API&quot;&gt;NAPI&lt;/abbr&gt; bindings on top of the C bindings,
more about that below in the comparison.&lt;/p&gt;

&lt;p&gt;The other problem in Desktop that it is basically single-threaded and while Delta Chat core uses async Rust, 
the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; blocks on nearly all calls (note the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_on&lt;/code&gt;):&lt;/p&gt;

&lt;div class=&quot;language-rust highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;pub&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;unsafe&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;C&quot;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;dc_get_fresh_msg_cnt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;mut&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dc_context_t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;chat_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;u32&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;libc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;c_int&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.is_null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nd&quot;&gt;eprintln!&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ignoring careless call to dc_get_fresh_msg_cnt()&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nf&quot;&gt;block_on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;move&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nn&quot;&gt;ChatId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;chat_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;.get_fresh_msg_cnt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;.await&lt;/span&gt;
            &lt;span class=&quot;nf&quot;&gt;.unwrap_or_log_default&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;failed to get fresh msg cnt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;libc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;c_int&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In Android and iOS, you can easily start threads or offload blocking tasks to other threads,
but on Desktop, each call blocked the main process &lt;strong&gt;and&lt;/strong&gt; led to an unresponsive experience.
Even though the communication between our main and &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt; process was already using async Electron &lt;abbr title=&quot;Inter-process communication&quot;&gt;IPC&lt;/abbr&gt;,
Electron froze the &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt; process every time the main process was blocked.&lt;/p&gt;

&lt;p&gt;Out of these and other frustrations, the idea for a new way to talk to core was born.&lt;/p&gt;

&lt;h2 id=&quot;the-history-of-the-json-rpc-interface&quot;&gt;The history of the &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; interface&lt;/h2&gt;

&lt;p&gt;First there was only talk, like there were discussions of what wire format to use: &lt;abbr title=&quot;Concise Binary Object Representation&quot;&gt;CBOR&lt;/abbr&gt;, message-pack or just plain &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt;.
Then treefit started writing a deltachat-command-&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; project which was passing requests and answers over &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt;.
There were two goals: make Desktop development easier and to make the experiment of a KaiOS client possible &lt;sup id=&quot;fnref:kaios&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:kaios&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;After he got the &lt;a href=&quot;https://github.com/Simon-Laux/delta-command-api&quot;&gt;first prototype&lt;/a&gt; working,
&lt;a href=&quot;https://github.com/Frando&quot;&gt;Frando&lt;/a&gt; cleaned up and rewrote its code to make it more
&lt;a href=&quot;https://github.com/deltachat/deltachat-jsonrpc/pull/14&quot;&gt;idiomatic and professional&lt;/a&gt;.
He also factored out the generic &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; code into a separate library and the procedural macro into a dedicated Rust crate,
so that it can also be used by other projects, which was named &lt;a href=&quot;https://github.com/deltachat/yerpc&quot;&gt;yerpc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Then we merged our temporary “Delta Chat &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt;” repo into the core repo
and moved Desktop over to use the new &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;,
which was easy thanks to the generated TypeScript bindings that gave good auto-completion.
Though DC Desktop still used the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; and Node bindings as transport (see picture below), until May 17, 2024,
when treefit migrated it to use the deltachat-rpc-server binary that uses &lt;abbr title=&quot;standard input/output&quot;&gt;stdio&lt;/abbr&gt; as a transport&lt;sup id=&quot;fnref:jsonrpc-pr&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:jsonrpc-pr&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Remote_procedure_call&quot;&gt;&lt;abbr title=&quot;Remote Procedure Call&quot;&gt;RPC&lt;/abbr&gt;&lt;/a&gt; stands for Remote Procedure Call.
Which is basically a way to call functions/methods remotely.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Desktop architecture versions:&lt;/p&gt;

&lt;figure&gt;
&lt;img style=&quot;max-width: 100%&quot; src=&quot;../assets/blog/2024-11-10-why-jsonrpc-bindings-exist/excalidraw-diagram-light.svg&quot; data-dark-src=&quot;../assets/blog/2024-11-10-why-jsonrpc-bindings-exist/excalidraw-diagram-dark.svg&quot; alt=&quot;Three Flow charts highlighting the differences between the versions. Before JSON-RPC: UI process, talks with custom JSON API in main process of Delta Chat Desktop over Electron IPC. that JSON API makes use of the JavaScript wrapper and NAPI over JavaScript calls (this happens in deltachat-node). The NAPI communicates over CFFI with deltachat-ffi, which then calls Rust functions from the actual core. To add a method, all of these 6 code places need to be touched. After v1.33.0 (2022-10-16), main process until deltachat-ffi don&apos;t need to be touched anymore. Now there is instead a new JSON-RPC module between deltachat-ffi and core; only this JSON-RPC API module and the actual core need to be changed to add a new method (reducing the file to edit from 6 to 2). The API wrapper for the UI is now autogenerated from the JSON-RPC module.Since v1.45.0 (2024-05-24), deltachat-node (NAPI and its JS wrapper) got removed, and deltachat-ffi was replaced by deltachat-rpc-server which connects via stdio pipe to the Delta Chat Desktop main process.&quot; /&gt;
&lt;figcaption&gt;

Figure 1: When adding a new method we need to touch the code for the components shown in red, gray means that it is not touched, and green means the API code is generated and you can directly call it in the UI code.

&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;the-benefits-of-json-rpc-over-cffi&quot;&gt;The benefits of &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; over &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;&lt;/h2&gt;

&lt;h3 id=&quot;less-code-to-write---simplify-development&quot;&gt;Less Code to write - Simplify development&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-11-10-why-jsonrpc-bindings-exist/new-method-addtion-comparison.png&quot; alt=&quot;Code before and after to implement the function &apos;block_contact&apos;. The code before is so much that the font size is so small that it becomes hard to read. So from 7 files and over 45 lines added, down to 2 files and 5 lines.&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you can see in this “meme”, adding a method with &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; is much simpler than adding a method to the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;.
This is thanks to 2 factors:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A new method does not need to be defined in every component. (see also the “Desktop architecture versions” diagram above)&lt;/li&gt;
  &lt;li&gt;Code generation: TypeScript client wrapper code and &lt;a href=&quot;https://open-rpc.org/&quot;&gt;OpenRPC&lt;/a&gt; definition
are auto generated from the Rust code. (including documentation comments)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;error-handling&quot;&gt;Error handling&lt;/h3&gt;

&lt;p&gt;Error handling in C requires much discipline:
a common pattern in C is to return a status code and write results to a pointer that was provided as an argument to the function.
Take this example from &lt;a href=&quot;https://libimobiledevice.org/&quot;&gt;libimobiledevice&lt;/a&gt;’s &lt;a href=&quot;https://docs.libimobiledevice.org/libimobiledevice/latest/lockdown_8h.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;lockdown.h&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;enum&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lockdownd_error_t&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;LOCKDOWN_E_SUCCESS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;LOCKDOWN_E_INVALID_ARG&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;LOCKDOWN_E_INVALID_CONF&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;LOCKDOWN_E_PLIST_ERROR&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;LOCKDOWN_E_PAIRING_FAILED&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lockdownd_error_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lockdownd_client_new&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;idevice_t&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;device&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;lockdownd_client_t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In our &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; we are not as strict, we mostly use 0 or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NULL&lt;/code&gt; pointers to indicate errors:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://c.delta.chat/classdc__context__t.html#a36b0e1a01730411b15294da5024ad311&quot;&gt;dc&lt;em&gt;contact_t * dc&lt;/em&gt;get_contact ( dc_context_t * context, uint32_t contact_id )&lt;/a&gt; &amp;gt; […]
Returns
The contact object, must be freed using dc_contact_unref() when no longer used. NULL on errors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://c.delta.chat/classdc__context__t.html#a78f5a96398b3763bde51b1a057c84903&quot;&gt;int dc_may_be_valid_addr ( const char * addr )&lt;/a&gt; &amp;gt; […]
Returns
1=address may be a valid e-mail address, 0=address won’t be a valid e-mail address&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That seems straight forward, but we had a serious bug with an experimental feature because of this.&lt;/p&gt;

&lt;h4 id=&quot;the-error-handling-bug-that-led-to-lost-accounts&quot;&gt;The error handling bug that led to lost accounts&lt;/h4&gt;

&lt;p&gt;At the time, there was a bug in the iOS app where accounts would go missing seemingly randomly.
Later we found out that &lt;strong&gt;only experimental&lt;/strong&gt; encrypted accounts were affected by this issue.&lt;/p&gt;

&lt;p&gt;The bug was basically that Delta Chat iOS thought that locked accounts would be unconfigured,
because &lt;strong&gt;both&lt;/strong&gt; &lt;strong&gt;unconfigured&lt;/strong&gt; and &lt;strong&gt;error&lt;/strong&gt; did return the value &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.
And if an account was unconfigured, the welcome screen was shown,
and this welcome screen has a “back” button that deleted the unconfigured new accounts.
But such an account was not in fact new,
only dc-iOS thought it was, because &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_is_configured()&lt;/code&gt; returned &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We fixed this bug by adding a call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_is_open()&lt;/code&gt; to the welcome screen&lt;sup id=&quot;fnref:ios-issue&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:ios-issue&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;5&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;         let selectedAccount = dcAccounts.getSelected()
&lt;span class=&quot;gd&quot;&gt;-        if !selectedAccount.isConfigured() {
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+        if selectedAccount.isOpen() &amp;amp;&amp;amp; !selectedAccount.isConfigured() {
&lt;/span&gt;             _ = dcAccounts.remove(id: selectedAccount.id)
             if self.dcAccounts.getAll().isEmpty {
                 _ = self.dcAccounts.add()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h4 id=&quot;getting-more-information-about-errors-than-just-the-fact-that-an-error-occurred&quot;&gt;Getting more information about errors than just the fact that an error occurred&lt;/h4&gt;

&lt;p&gt;As written above, you mostly get to know that and error happened but not &lt;em&gt;what&lt;/em&gt; error.
So where do we get the error from?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;For &lt;a href=&quot;https://c.delta.chat/classdc__context__t.html#adfe52669a5bed893df78a620566dd698&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_configure()&lt;/code&gt;&lt;/a&gt;,
you can listen for the &lt;a href=&quot;https://c.delta.chat/group__DC__EVENT.html#gae047f9361d57c42d82a794324f5b9fd6&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;DC_EVENT_CONFIGURE_PROGRESS&lt;/code&gt;&lt;/a&gt; event,
if progress/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data1&lt;/code&gt; is 0 then comment/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data2&lt;/code&gt; contains the error message.&lt;/li&gt;
  &lt;li&gt;For the other cases you can use &lt;a href=&quot;https://c.delta.chat/classdc__context__t.html#a84c9f09e57c2985fd1c47809eea01969&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_get_last_error()&lt;/code&gt;&lt;/a&gt;
to get the last error sting from the last error event - without possible races from waiting for or looping through events.
    &lt;ul&gt;
      &lt;li&gt;But if you do many operations from different threads there can still be races, at-least in theory.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;how-json-rpc-solves-these-issues&quot;&gt;How &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; solves these issues&lt;/h4&gt;

&lt;p&gt;There are two kinds of responses to a &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; requests:
a response or an error. An error contains an error code and an error message string.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;--&amp;gt; {&quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;method&quot;: &quot;foobar&quot;, &quot;id&quot;: &quot;1&quot;}
&amp;lt;-- {&quot;jsonrpc&quot;: &quot;2.0&quot;, &quot;error&quot;: {&quot;code&quot;: -32601, &quot;message&quot;: &quot;Method not found&quot;}, &quot;id&quot;: &quot;1&quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In Delta Chat we currently only use the error string.
Our &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; clients (JavaScript and Python) automatically convert these error responses to errors in the target language
and return/throw them:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-11-10-why-jsonrpc-bindings-exist/error thrown in js.png&quot; /&gt;
So we always know which call an error belongs to, and we don’t have the risk of mixing up a boolean return value and error.&lt;/p&gt;

&lt;h3 id=&quot;named-fields-in-events&quot;&gt;Named fields in events&lt;/h3&gt;

&lt;p&gt;In the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; you have the following functions to get the data from events:&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Return Type&lt;/th&gt;
      &lt;th&gt;Call Signature&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;int&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html#a900f267609b9768610ecbb5f833ead0e&quot;&gt;dc_event_get_data1_int&lt;/a&gt; (&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html&quot;&gt;dc_event_t&lt;/a&gt; *event)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;int&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html#a189a61d211040263eb9c19582539c941&quot;&gt;dc_event_get_data2_int&lt;/a&gt; (&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html&quot;&gt;dc_event_t&lt;/a&gt; *event)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;char *&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html#a65954ff569082bf7c2f2f3f1ea1ef401&quot;&gt;dc_event_get_data2_str&lt;/a&gt; (&lt;a href=&quot;https://c.delta.chat/classdc__event__t.html&quot;&gt;dc_event_t&lt;/a&gt; *event)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;To know what the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data1&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data2&lt;/code&gt; are about and if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data2&lt;/code&gt; is a string or an integer, you need to look at the event’s documentation: &lt;a href=&quot;https://c.delta.chat/group__DC__EVENT.html&quot;&gt;https://c.delta.chat/group__DC__EVENT.html&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;language-c highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/**
 * Emitted when SMTP connection is established and login was successful.
 *
 * @param data1 0
 * @param data2 (char*) Info string in English language.
 */&lt;/span&gt;
&lt;span class=&quot;cp&quot;&gt;#define DC_EVENT_SMTP_CONNECTED           101
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;With the TypeScript bindings on the other hand, you get named and typed properties.&lt;/p&gt;

&lt;p&gt;Examples of events in &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;SmtpMessageSent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Message len=2402 was SMTP-sent to example@nine.testrun.org&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;kind&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;MsgDelivered&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;chatId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;34&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;msgId&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1342&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Usage in TypeScript:&lt;/p&gt;

&lt;div class=&quot;language-ts highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;dc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;SmtpMessageSent&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;msg&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;dc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;MsgDelivered&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;chatId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;msgId&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;chatId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;msgId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This works very well with &lt;abbr title=&quot;Integrated Development Environment&quot;&gt;IDE&lt;/abbr&gt; auto-completion and “IntelliSense” (hover to get documentation).&lt;/p&gt;

&lt;h3 id=&quot;async-usage-in-delta-chat-desktop&quot;&gt;Async usage in Delta Chat Desktop&lt;/h3&gt;

&lt;p&gt;As described in the &lt;a href=&quot;#why-implement-a-new-way&quot;&gt;beginning&lt;/a&gt;,
before &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; we had issues with desktop getting unresponsive when there was a bit more &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; traffic,
for example when fetching a lot of messages.
While the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; is blocking, with &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; you never block on a single method call
since you just have one bidirectional stream of &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; messages.
This really speed up desktop and made it more responsive.&lt;/p&gt;

&lt;h3 id=&quot;easier-to-use-than-cffi-over-process-boundaries&quot;&gt;Easier to use than &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; over process boundaries&lt;/h3&gt;

&lt;p&gt;&lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; needs to be linked, which also means it will become part of the process that linked it.
&lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; on the other hand requires no linking and is transport-independent,
since it is just sending and receiving &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt; objects.
At the moment 3 transport implementations exist (Electron-&lt;abbr title=&quot;Inter-process communication&quot;&gt;IPC&lt;/abbr&gt;, &lt;abbr title=&quot;standard input/output&quot;&gt;stdio&lt;/abbr&gt;, WebSocket) and it is easy to create new ones.&lt;/p&gt;

&lt;p&gt;It is even possible to use the new &lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html&quot;&gt;webxdc realtime &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/a&gt;
to connect to a remote Delta Chat instance on another computer,
similar to the idea of implementing some remote desktop webxdc app.
The webxdc realtime &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; is also an interesting topic in of its own,
read its &lt;a href=&quot;./2024-11-20-webxdc-realtime&quot;&gt;announcement blog-post&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;h2 id=&quot;json-rpc-api-is-slowly-moving-to-become-the-primary-api&quot;&gt;&lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; is slowly moving to become the primary &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;&lt;/h2&gt;

&lt;p&gt;Delta Chat Desktop and some chat bots use the &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; everywhere
while Android and iOS apps are only using &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; APIs for new features
that don’t get a &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; anymore. 
However, we have no autogenerated wrapper/client for any language besides TypeScript. 
For other languages, the client-code needs to be written and maintained manually. 
It is still easier to add new methods to &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; than to the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;,
especially where core returns complex struct with many fields:
In &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; you would need to create a new opaque struct,
accessor functions for the properties and an unref function and wrappers for those functions.
In &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; you just write the Rust struct &amp;amp; method and process the returned &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt; in the client.&lt;/p&gt;

&lt;p&gt;While Desktop starts core as a subprocess and performs &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; requests via STDIN/STDOUT,
the other platforms use &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; calls to perform &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; requests, 
for both synchronous and asynchronous access to core&lt;sup id=&quot;fnref:jsonrpc_in_cffi&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:jsonrpc_in_cffi&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;6&lt;/a&gt;&lt;/sup&gt;.
Previously, &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; APIs were also used in Desktop 
before it switched to the subprocess approach. 
See the graphic above in “The history of our &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; interface”.
Using the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;-&lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; for performing &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; calls allows to incrementally 
use a &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;-using code base to migrate towards using &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; APIs.&lt;/p&gt;

&lt;h2 id=&quot;three-areas-where-contributions-and-advances-are-welcome-&quot;&gt;Three areas where contributions and advances are welcome :)&lt;/h2&gt;

&lt;p&gt;Currently, we only have automatic code generation for the TypeScript bindings.
It would be great to also have automatically generated bindings for Swift, Java and Python.
If you have background in generating bindings for these target platforms, 
and want to get your hands dirty, please get in touch.&lt;/p&gt;

&lt;p&gt;The core library has many Python integration tests using the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; to Rust core. 
If you have experience with &lt;a href=&quot;https://pytest.org&quot;&gt;pytest&lt;/a&gt; and
want to help porting integration tests to &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt;, 
please checkout &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/tree/main/python/tests&quot;&gt;our current functional test suite&lt;/a&gt; and submit a PR or get in touch.&lt;/p&gt;

&lt;p&gt;Last but not least, the &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; documentation is still not as high quality as the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; one. 
If you, dear reader, want to help and care about good documentation,
we’d be happy for help, 
maybe driven by trying to write a little &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; chat bot yourself?
Copying the generally good &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; documentation 
and improving &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; docs step by step would be warmly welcome and supported.&lt;/p&gt;

&lt;h2 id=&quot;conclusion--tldr&quot;&gt;Conclusion / TL;DR&lt;/h2&gt;

&lt;p&gt;The &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; has the following benefits over our &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Reduces time to change the &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt;, because you need to edit fewer files.&lt;/li&gt;
  &lt;li&gt;Better, more robust error reporting.&lt;/li&gt;
  &lt;li&gt;Complete TypeScript client code generation helps to catch some bugs early during build time.&lt;/li&gt;
  &lt;li&gt;All methods are non-blocking, which allows for a very smooth user experience without &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt; freezes.&lt;/li&gt;
  &lt;li&gt;&lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; over &lt;abbr title=&quot;standard input/output&quot;&gt;stdio&lt;/abbr&gt; is easy to use from all kinds of programming languages without any complicated linking steps. (like &lt;abbr title=&quot;Node-API&quot;&gt;NAPI&lt;/abbr&gt; or the &lt;abbr title=&quot;Java Native Interface&quot;&gt;JNI&lt;/abbr&gt; we need to use in the Android app&lt;sup id=&quot;fnref:jni&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:jni&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;7&lt;/a&gt;&lt;/sup&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So all in all &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; is a huge step forward in simplifying Delta Chat development.&lt;/p&gt;

&lt;h2 id=&quot;further-reading&quot;&gt;Further reading&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://jsonrpc.delta.chat/&quot;&gt;https://jsonrpc.delta.chat/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://js.jsonrpc.delta.chat/classes/RawClient.html&quot;&gt;list of all functions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;where the &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; methods are defined: &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/blob/main/deltachat-jsonrpc/src/api/types/mod.rs&quot;&gt;deltachat-core-rust/deltachat-jsonrpc/src/api/types/mod.rs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;yerpc, the &lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; library: &lt;a href=&quot;https://github.com/deltachat/yerpc&quot;&gt;https://github.com/deltachat/yerpc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; header file, that is the source for the documentation site on &lt;a href=&quot;https://c.delta.chat&quot;&gt;https://c.delta.chat&lt;/a&gt;: &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/blob/main/deltachat-ffi/deltachat.h&quot;&gt;deltachat-core-rust/deltachat-ffi/deltachat.h&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;implementation of &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt; functions: &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/blob/main/deltachat-ffi/src/lib.rs&quot;&gt;deltachat-core-rust/deltachat-ffi/src/lib.rs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:CFFI&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;The header file &lt;a href=&quot;https://github.com/deltachat/deltachat-core-rust/blob/main/deltachat-ffi/deltachat.h&quot;&gt;deltachat.h&lt;/a&gt;
is an easy way to get an idea of the &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; &lt;a href=&quot;#fnref:CFFI&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:bad-idea&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;Why is passing memory pointers across process boundaries potentially dangerous?
Two main reasons: you still need to free/cleanup the remote resource after using it
and common tools will be unable to remind you of the need to do this, because they won’t understand what you are doing.
Another potential issue lies in implementation, if you just do the easy thing and pass raw memory locations as numbers,
then congratulations, you just added a really big security issue,
since most exploits begin by accessing memory that they were not supposed to
(use after free, access to out of bounds memory and so on). Though if you’re lucky it just crashes. &lt;a href=&quot;#fnref:bad-idea&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:kaios&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;KaiOS is an OS for small feature phones with T9 keyboard.
KaiOS has a similar problem: Only webapps are allowed, so there also is a process boundary. - 
&lt;abbr title=&quot;by the way&quot;&gt;BTW&lt;/abbr&gt;: treefit still plans to make that experimental client for KaiOS. &lt;a href=&quot;#fnref:kaios&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:jsonrpc-pr&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;The PR: &lt;a href=&quot;https://github.com/deltachat/deltachat-desktop/pull/3567&quot;&gt;use &lt;abbr title=&quot;standard input/output&quot;&gt;stdio&lt;/abbr&gt; binary instead of dc node &amp;amp; update electron to 30 &amp;amp; update min node to 20 #3567&lt;/a&gt;. &lt;a href=&quot;#fnref:jsonrpc-pr&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:ios-issue&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;The &lt;a href=&quot;https://github.com/deltachat/deltachat-ios/issues/1504#issuecomment-1172894639&quot;&gt;issue&lt;/a&gt; and the &lt;a href=&quot;https://github.com/deltachat/deltachat-ios/pull/1638&quot;&gt;solution&lt;/a&gt;, for those that are interested. &lt;a href=&quot;#fnref:ios-issue&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:jsonrpc_in_cffi&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;&lt;abbr title=&quot;JavaScript Object Notation Remote Procedure Call&quot;&gt;JSON-RPC&lt;/abbr&gt; &lt;abbr title=&quot;Application Programming Interface&quot;&gt;API&lt;/abbr&gt; in the &lt;abbr title=&quot;C Foreign Function Interface&quot;&gt;CFFI&lt;/abbr&gt;: &lt;a href=&quot;https://c.delta.chat/classdc__jsonrpc__instance__t.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dc_jsonrpc_instance_t&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;#fnref:jsonrpc_in_cffi&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:jni&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;https://github.com/deltachat/deltachat-android/blob/main/jni/dc_wrapper.c &lt;a href=&quot;#fnref:jni&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
				<pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-02-11-why-jsonrpc-bindings-exist</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-02-11-why-jsonrpc-bindings-exist</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Replacing billionairish platforms with ZIP files</title>
				<description>&lt;p&gt;How can we evolve and deploy web apps without allowing developers or operators to become a “billionaire in the middle”? 
There are many ways to try to address this challenge and 
some involve the technical Internet protocol foundations. 
The “Web”, and the HTTP protocol in particular, 
arguably played a big part in producing tech billionaires
with their possibly unprecedented power and money concentrations today.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&quot;three spidermen pointing to each other, respectively labeled with &apos;messenger devs&apos;, &apos;webxdc app devs&apos; and &apos;web app users&apos;&quot; src=&quot;../assets/blog/2025-01-spider3.jpg&quot; width=&quot;360&quot; style=&quot;float:right; margin-left:1em;&quot; /&gt;
Joined by XMPP-messengers &lt;a href=&quot;https://cheogram.com&quot;&gt;Cheogram&lt;/a&gt; and &lt;a href=&quot;https://monocles.eu&quot;&gt;Monocles&lt;/a&gt;, 
and supported by many contributing experts in the background, 
we are playfully addressing the no-billionaire-platforms challenge with 
&lt;a href=&quot;https://webxdc.org&quot;&gt;webxdc&lt;/a&gt;, a container format and API for “chat-shared web apps”. 
Technically, webxdc apps are &lt;a href=&quot;https://delta.chat/en/2023-05-22-webxdc-security&quot;&gt;network-sandboxed HTML5 apps&lt;/a&gt;
and instead of the HTTP protocol
they use &lt;a href=&quot;https://webxdc.org/docs/spec/sendUpdate.html&quot;&gt;Peer-to-Peer send/receive APIs&lt;/a&gt; 
implemented by webxdc-capable messengers,
rebasing relations between developers and users by saying&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bye Bye to surveillance capitalism&lt;/strong&gt;:
Users have both the code and the data of their web apps in their hands
and benefit from end-to-end encrypted messaging not only during regular chat messaging 
but also during their private web app usage.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bye Bye to user policing (logins, passwords, OAUTH, TOS and privacy policies etc.)&lt;/strong&gt;: 
Web app developers never obtain or touch any user data or user identities,
and can have peace of mind of not being responsible for any data, 
and not having to program identity management and social discovery UIs. 
Messengers already provide it through arranging chat groups or rooms.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bye Bye to depending on a corp or org that enshittifies&lt;/strong&gt;: 
Messengers, as decentralized runners of webxdc apps in chat groups, 
can not hold web app developers, their users or data hostage. 
Consult &lt;a href=&quot;https://pluralistic.net/2024/11/02/ulysses-pact/&quot;&gt;Cory Doctorow’s “Ulysses Pact”&lt;/a&gt;
for why this is a good idea.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This all sounds too good to be true, right? 
But what if another reality is possible by just stretching out our hands and grabbing it?&lt;/p&gt;

&lt;p&gt;Let’s look at some recent webxdc community advances,
new webxdc app capabilities along with updates to the &lt;a href=&quot;https://webxdc.org/docs/spec/index.html&quot;&gt;webxdc specification&lt;/a&gt;,
and finally at some community-produced webxdc apps already in everyday use,
as working first approximations on how to replace whole Venture-Capital platforms with a ZIP file :)&lt;/p&gt;

&lt;h2 id=&quot;integrated-and-streamlined-webxdc-app-discovery&quot;&gt;Integrated and streamlined webxdc app discovery&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-browser-store.png&quot; alt=&quot;screenshot of new web app store view on a desktop browser&quot; /&gt;
There is a curated collection of apps available at &lt;a href=&quot;https://webxdc.org/apps&quot;&gt;https://webxdc.org/apps&lt;/a&gt; which got a thorough UX/UI streamlining by Jag Talon, 
a former DuckDuckGo frontend designer. 
It’s a static web page offering “tool” and “game” search 
with short descriptions and per-app URLs so you can point people to a particular app.
The web page sources its content from this &lt;a href=&quot;https://apps.testrun.org/xdcget-lock.json&quot;&gt;json app list file&lt;/a&gt;,
generated by commits to the &lt;a href=&quot;https://codeberg.org/webxdc/xdcget/&quot;&gt;codeberg submission repository&lt;/a&gt;. 
Anyone can run their own curation pipelining and &lt;a href=&quot;https://github.com/webxdc/website/tree/main/website/apps&quot;&gt;re-use the web interface&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-appattach.jpg&quot; alt=&quot;view on input field after &apos;attach&apos; action with the &apos;app&apos; selection circled&quot; /&gt;
The new webxdc “app-store” web view was designed to integrate well
with webxdc-supporting messengers through an “attach-app” action of the chat message input field. 
Apart from Cheogram, Monocles and the mainline Delta Chat apps, 
also &lt;a href=&quot;https://arcanechat.me/&quot;&gt;ArcaneChat (a soft Android-fork)&lt;/a&gt; and &lt;a href=&quot;https://delta.chat/en/2023-07-02-deltatouch&quot;&gt;DeltaTouch (a Lomiri-based UI for UbuntuTouch phones and some desktop environments)&lt;/a&gt; 
offer this new instant attach-app action. 
Delta Chat apps run the app-picker with cached data so it works during offline times. 
Most messengers also allow to configure a different URL for an alternative app-picker web page.&lt;/p&gt;

&lt;p&gt;Note that webxdc app store sites &lt;em&gt;seed&lt;/em&gt; apps but don’t control anything afterwards. 
They can not collect any metadata or content data about their usage. 
It’s like distributing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.exe&lt;/code&gt; files in former times, 
only &lt;a href=&quot;https://delta.chat/en/2023-05-22-webxdc-security&quot;&gt;safer&lt;/a&gt;
and more convenient through permission-free and decentralized web-app curation sites. 
Sorry GAFAM, not sorry.&lt;/p&gt;

&lt;h2 id=&quot;webxdc-apps-can-cause-instant-notifications&quot;&gt;Webxdc apps can cause instant notifications&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-chess-noti.jpg&quot; alt=&quot;notification showing that it&apos;s Hocuri&apos;s turn to make a move&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We collectively specified and implemented a new webxdc notification mechanism so that apps like
&lt;a href=&quot;https://webxdc.org/apps/#arcanecircle-chess&quot;&gt;Chess&lt;/a&gt; can cause a system-level notification between app users aka “it’s your turn”,
and the calendar can notify about “your chat partner added a new meeting date”. 
Webxdc app developers re-use the existing push notification machinery of their host messengers 
without having to scream at Google or Apple compliance bureaucracy themselves. 
For webxdc apps to “notify” users they need to specify a list of &lt;em&gt;identities&lt;/em&gt;
when &lt;a href=&quot;https://webxdc.org/docs/spec/sendUpdate.html&quot;&gt;sending application updates&lt;/a&gt;. 
The &lt;a href=&quot;https://webxdc.org/docs/spec/selfAddr_and_selfName.html#selfaddr&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;webxdc.selfAddr&lt;/code&gt; spec&lt;/a&gt; 
describes the details of the new carefully designed “per-app” identity scope.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-chess-setup.png&quot; alt=&quot;view on a chat where a chess-app challenge is arranged&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;webxdc-apps-can-query-sending-rate-limits&quot;&gt;Webxdc apps can query sending rate limits&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-editor.png&quot; alt=&quot;view on an editor-app showing information about upcoming &amp;quot;DC OFFDEM/FOSDEM logistics&quot; /&gt;
Different messengers and transport servers have different “send rate limits”,
namely how many messages are allowed to be sent per time duration,
and how many bytes an application update can carry. 
The &lt;a href=&quot;https://webxdc.org/apps/#webxdc-editor&quot;&gt;updated editor app&lt;/a&gt; now respects 
&lt;a href=&quot;https://webxdc.org/docs/spec/sendUpdate.html#messaging-layer-limits-for-sendupdate&quot;&gt;sendUpdate limits&lt;/a&gt;,
providing for a smoother transport-adaptive user experience. 
The &lt;a href=&quot;https://delta.chat/en/2024-11-20-webxdc-realtime&quot;&gt;recently introduced webxdc realtime channels&lt;/a&gt; have a specified 128KB size limit for ephemeral application updates. 
Ephemeral realtime application updates 
are only distributed between devices actively running a webxdc app
that called the &lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html&quot;&gt;joinRealtime API&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;webxdc-apps-can-be-placed-on-mobile-home-screens&quot;&gt;Webxdc apps can be placed on mobile home screens&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-homescreen.png&quot; alt=&quot;Webxdc Apps on Android and iOS home screens&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On Delta Chat Android and iOS phones you can now add a running webxdc app to your home screen. 
Tapping a webxdc app on your mobile home screen will directly start it,
and everything remains responsive also while offline. 
Remember, there is no HTTP server for webxdc apps. 
All webxdc app state is local, and each webxdc app sends and receives updates 
by interacting with “localhost” only, 
leaving all actual network routing to messengers,
while being itself
&lt;a href=&quot;https://delta.chat/en/2023-05-22-webxdc-security&quot;&gt;blocked from leaking anything to the Internet&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id=&quot;replacing-vc-funded-platforms-with-a-zip-file-&quot;&gt;Replacing VC-funded platforms with a ZIP file …&lt;/h1&gt;

&lt;p&gt;There is no shortage of Venture-Capital fueled mediator platforms that 
offer “free” web apps or mobile apps (mostly web-apps in disguise) 
to mediate interactions between private circles. 
What if you could run such apps in your private chats without needing any mediator,
sign-ups, logins etc?
Here are a few fun VC-platform-replacement candidate zip files.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-splitbillmeta.png&quot; alt=&quot;View on the app store entry of the new Split Bill app&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://webxdc.org/apps/#jagtalon-splitbill&quot;&gt;Split Bill&lt;/a&gt;
allows everyone in a chat group to register “expenses” and provides a “balance” view
of who owes/is owed currently. 
Anybody who enters an expense becomes part of the bill but
you can also “join the bill” if you don’t add expenses. 
Split Bill intentionally provides a basic UI. 
If you feel inclined to add features like a “settle up” button, 
please fork &lt;a href=&quot;https://codeberg.org/jagtalon/split-bill/&quot;&gt;from the codeberg split-bill repository&lt;/a&gt;,
maybe tell Jag about it, and submit a new app to the webxdc collection. 
Or maybe you have an idea how to evolve the split-bill app to become a “solidarity-party” 
app to help accounting when organizing monetary support for people in need?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-shopping1.png&quot; alt=&quot;View on the app store entry of the Shopping List app&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://webxdc.org/apps/#shoppinglist&quot;&gt;Shopping List&lt;/a&gt;
allows families, friends and other collectives to easily arrange for daily shopping. 
The “Shopping list app” provides a simple view for entering “missing” items 
which can be “checked” when someone bought it. 
It’s recommended to have a special-purpose “Shopping” chat group/room 
to ask aboutor clarify specifics of shopping items. 
There even is a “dark mode” and an icon to disable/enable “chat notifications”
when the shopping-todo-list changes.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-todolist.png&quot; alt=&quot;View on the app store entry of the Todo List app&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Who doesn’t love todo-lists, the bane of modern existence?&lt;br /&gt;
Now you can do them nicely in a chat group.
Or maybe you prefer the classic &lt;a href=&quot;https://webxdc.org/apps/#webxdc-checklist&quot;&gt;checklist&lt;/a&gt;,
one of the first webxdc apps back in 2023.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-wonster.png&quot; alt=&quot;View on the app store entry of the Wonster app&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://webxdc.org/apps/#arcanecircle-wonster&quot;&gt;Wonster&lt;/a&gt;
is a popular daily family puzzle challenge. 
Every chat group gets their own unique Wonster challenge.&lt;/p&gt;

&lt;h2 id=&quot;sharing-finished-software-could-be-a-thing-again&quot;&gt;Sharing “Finished Software” could be a thing again!&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2025-01-shareware.jpg&quot; alt=&quot;View of a CD-ROM from 1991, with &amp;quot;So much Shareware!&amp;quot; printed on it&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Webxdc app developers may improve an app over time or they may call it a day. 
The webxdc specification aims to provide long-term backward-compatibility.
Once written apps are to work for a long time, 
on today’s as well as future webxdc-capable messengers. 
Say Bye Bye to integrating with complex frameworks, broken dependencies, 
“forced API level upgrades”, new toolchains or store buereaucracy like 
“your app will be delisted if you don’t declare compliancy with X” etc. 
Nothing can prevent using a webxdc app with friends if you have, in your hand, 
the zip file and a webxdc-capable messenger with a chat group/room to “run” it. 
No worries about VPS or web hosting, DNS or SSL certificates. Peace!&lt;/p&gt;

&lt;p&gt;Curious and interested to join some “replace-VCs-with-ZIP-files” fun and work? 
&lt;a href=&quot;https://webxdc.org/docs/&quot;&gt;Getting started with webxdc development&lt;/a&gt; 
provides tutorial material and introduction chapters on what is involved
when replacing HTTP with Peer-to-Peer protocols.&lt;/p&gt;

&lt;p&gt;We are handing over the mic to the wonderful &lt;a href=&quot;https://rosano.ca/&quot;&gt;Rosano&lt;/a&gt;
who did a succinct intro video a while ago.&lt;/p&gt;
&lt;video controls=&quot;&quot; style=&quot;width:560px; max-width: 100%;&quot;&gt;&lt;source src=&quot;https://webxdc.org/assets/just-web-apps.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=I1K4pBvb2pI&quot;&gt;watch &quot;just web apps&quot; on youtube&lt;/a&gt;&lt;/video&gt;

&lt;h2 id=&quot;thanks-to-nlnet-and-ngi-for-their-support-and-vision&quot;&gt;Thanks to NLNET and NGI for their support and vision!&lt;/h2&gt;

&lt;p&gt;&lt;img alt=&quot;NLNet Logo&quot; src=&quot;../assets/logos/logo_nlnet.svg&quot; width=&quot;140&quot; style=&quot;float:right; margin-left:1em;&quot; /&gt;&lt;br /&gt;
Much of our efforts described above became possible
by the vision and support of &lt;a href=&quot;https://nlnet.nl/&quot;&gt;NLnet-managed funds&lt;/a&gt;,
financially supported by the European Commission’s 
&lt;a href=&quot;https://ngi.eu/&quot;&gt;Next Generation Internet&lt;/a&gt; programme.&lt;/p&gt;

</description>
				<pubDate>Thu, 23 Jan 2025 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2025-01-23-webxdc-no-billionaires</link>
				<guid isPermaLink="true">https://delta.chat/en/2025-01-23-webxdc-no-billionaires</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Delta Chat introduces realtime Peer-to-Peer networking</title>
				<description>&lt;p&gt;Are you interested in enshittification-resistant application development? 
After almost two years of collaboration 
with the wonderful &lt;a href=&quot;https://iroh.computer&quot;&gt;Iroh team&lt;/a&gt;,
and years of discussions with numerous experts in the decentralization space, 
we are happy to announce that &lt;strong&gt;Delta Chat 1.48 apps on all platforms 
contain state-of-the-art Peer-to-Peer networking support&lt;/strong&gt;,
including &lt;a href=&quot;https://en.wikipedia.org/wiki/Hole_punching_(networking)&quot;&gt;hole punching&lt;/a&gt;
and &lt;a href=&quot;https://en.wikipedia.org/wiki/Forward_secrecy&quot;&gt;forward-secret end-to-end encryption&lt;/a&gt;.
Concretely, Delta Chat now establishes private Peer-to-Peer 
&lt;a href=&quot;https://en.wikipedia.org/wiki/Gossip_protocol&quot;&gt;gossipping&lt;/a&gt; networks 
between users who start a &lt;a href=&quot;https://webxdc.org/apps&quot;&gt;webxdc app&lt;/a&gt;
that uses the new &lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html&quot;&gt;joinRealtimeChannel() API&lt;/a&gt;.&lt;/p&gt;

&lt;video controls=&quot;&quot; style=&quot;width:560px; max-width: 100%;&quot;&gt;&lt;source src=&quot;https://merlinux.eu/webxdc-realtime-148.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;

&lt;p&gt;In the following sections, we discuss the “Pixel app” shown in the video 
and other realtime example apps, before providing more technical background 
and a closing note on the importance of protocols and specifications in our endeavours. 
If you want to try out any webxdc app, including the realtime ones:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Install Delta Chat, create a profile and establish a chat with someone&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://i.delta.chat/#37DC2B704A2AE2F6A96235CE0C3A0EBCA4F5801D&amp;amp;a=xstore%40testrun.org&amp;amp;n=&amp;amp;i=-1IGtynaivZ&amp;amp;s=JqHsvvcDmnW&quot;&gt;Tap this invitelink to the xstore bot&lt;/a&gt;
and wait until you receive the store app&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Start the store app, pick an app for download and then share it to any chat&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;pixel-app-small-offline-first-and-realtime&quot;&gt;Pixel app: small, offline-first and realtime&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-11-pixel.jpg&quot; style=&quot;width:180px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; alt=&quot;pixel1-screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://codeberg.org/webxdc/pixel/src/commit/8331769a5b3020a11ea789b311585e42c59c123b/script.js&quot;&gt;source code of the pixel app&lt;/a&gt; shown in the above &lt;a href=&quot;https://merlinux.eu/webxdc-realtime-148.mp4&quot;&gt;video&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;consists of 241 lines of Javascript (including all dependencies),&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;offers collaborative realtime pixel-drawing&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;and is offline-first as it does not require users to be online at the same time.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The pixel app achieves its hybrid offline-first and realtime connectivity 
by using two separate webxdc messaging APIs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://webxdc.org/docs/spec/sendUpdate.html&quot;&gt;webxdc.sendUpdate&lt;/a&gt; 
to relay “application updates” through the regular host messenger channel 
(e-mail for Delta Chat, XMPP message for Cheogram and Monocles).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html#realtimechannelsenddata&quot;&gt;realtimeChannel.send&lt;/a&gt;
to relay ephemeral application messages to any P2P-connected chat partner.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To learn the theory behind how the pixel app achieves “eventual synchronization for all users”,
we suggest to dive into our &lt;a href=&quot;https://webxdc.org/docs/shared_state/index.html&quot;&gt;Shared Web Application state chapter&lt;/a&gt;
and then re-read &lt;a href=&quot;https://codeberg.org/webxdc/pixel/src/commit/8331769a5b3020a11ea789b311585e42c59c123b/script.js&quot;&gt;the 241 lines of Javascript&lt;/a&gt; with a particular eye to “Lamport Clocks” – 
no framework or dependency needed to use this science-fiction-sounding technology ;)&lt;/p&gt;

&lt;p&gt;If you want to improve the app, please fork and &lt;a href=&quot;https://codeberg.org/webxdc/xdcget/src/branch/main/SUBMIT.md&quot;&gt;submit your variant&lt;/a&gt;. 
There already is a &lt;a href=&quot;https://github.com/DeltaZen/pixel&quot;&gt;Color Pixel app&lt;/a&gt; fork
where each participant draws pixels in a different color.&lt;/p&gt;

&lt;h2 id=&quot;pong-app-realtime-only-and-implements-clock-synchronization&quot;&gt;Pong app: realtime-only and implements clock synchronization&lt;/h2&gt;

&lt;video controls=&quot;&quot; style=&quot;width:150px; max-width: 50%;float:right;margin-left:5px;&quot; autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;../assets/blog/2024-11-pong2.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;
&lt;p&gt;The &lt;a href=&quot;https://codeberg.org/webxdc/pong/src/branch/main&quot;&gt;pong app repository&lt;/a&gt; 
provides a simple two-player implementation of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Pong&quot;&gt;classic pong game&lt;/a&gt;. 
UX-wise it’s rudimentary but it does implement basic “clock synchronization” 
which is an important consideration for any realtime networked gaming app.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice to have more original or more modern versions of Pong? 
Maybe also with sounds and colors? 
Also, to provide a “rollback algorithm” you might look at 
a 3rd party &lt;a href=&quot;https://mitxela.com/projects/webrtc-pong&quot;&gt;WebRTC-based Pong development writeup&lt;/a&gt;
to understand what’s involved.&lt;/p&gt;

&lt;p&gt;In any case, if you want to improve on this little Pong classic game, 
please fork and &lt;a href=&quot;https://codeberg.org/webxdc/xdcget/src/branch/main/SUBMIT.md&quot;&gt;submit your variant&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;realtime-editor-cursor-positions-and-immediate-collab&quot;&gt;Realtime Editor: cursor positions and immediate collab&lt;/h2&gt;

&lt;video controls=&quot;&quot; style=&quot;width:150px; max-width: 50%;float:right;margin-left:5px;&quot; autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;../assets/blog/2024-11-realtimeditor.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;
&lt;p&gt;The &lt;a href=&quot;https://codeberg.org/jagtalon/editor&quot;&gt;realtime editor app&lt;/a&gt;
is a collaborative editor that can show realtime cursors and changes. 
However, it’s also behaving as an offline-first app, similar to the pixel app above. 
If you join a chat-shared realtime editor app later, 
you’ll see all changes consistently combined. 
The realtime editor is a fork of the &lt;a href=&quot;https://codeberg.org/webxdc/editor&quot;&gt;basic webxdc editor&lt;/a&gt; 
but with realtime capabilities added.&lt;/p&gt;

&lt;p&gt;Wouldn’t it be nice if there would be coloring of edits? 
Maybe provide a slider that allows to go back in document history? 
Or maybe a way to import a picture into the realtime pad?&lt;/p&gt;

&lt;p&gt;Again, if you can improve this editor tool you are more than welcome. 
Please fork and &lt;a href=&quot;https://codeberg.org/webxdc/xdcget/src/branch/main/SUBMIT.md&quot;&gt;submit your variant&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;unix-terminal-app-realtime-with-a-chat-bot&quot;&gt;Unix terminal app: realtime with a chat bot&lt;/h2&gt;

&lt;video controls=&quot;&quot; style=&quot;width:150px; max-width: 50%;float:right;margin-left:5px;&quot; autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;../assets/blog/2024-11-xdcterm2.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/link2xt/xdcterm&quot;&gt;xdcterm app demo&lt;/a&gt; allows
to run a chat bot in Javascript and then establish contact with it
from your chat profile. 
The bot will create a group where you can add more members 
all of which can see a shared terminal (it’s as if screen-sharing is built-in).&lt;/p&gt;

&lt;p&gt;If you want to play with or improve this rudimentary terminal app,
please fork and feel free to let us know. 
You can not submit it to the webxdc app store 
because it requires a running chat bot on some unix-ish server.&lt;/p&gt;

&lt;h2 id=&quot;live-chat-realtime-chat-in-a-chat-&quot;&gt;Live Chat: realtime chat in a chat :)&lt;/h2&gt;

&lt;video controls=&quot;&quot; style=&quot;width:150px; max-width: 50%;float:right;margin-left:5px;clear:both;margin-top:1em;&quot; autoplay=&quot;&quot; muted=&quot;&quot; loop=&quot;&quot; playsinline=&quot;&quot;&gt;&lt;source src=&quot;../assets/blog/2024-11-livechat2.mp4&quot; type=&quot;video/mp4&quot; /&gt;&lt;/video&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/deltazen/live-chat&quot;&gt;LiveChat app&lt;/a&gt; 
provides ephemeral chatting with realtime typing-indicators
between anyone in a chat group who starts the live chat. 
Messages are not persisted and all history is cleared
when you close the app. 
If all users have closed the app all content is gone. 
There you go. Fully ephemeral, end-to-end encrypted P2P chat at your fingertips :)&lt;/p&gt;

&lt;p&gt;You may use a Live Chat app in a larger existing chat group 
to host a fast “ephemeral side conversation” that will not cause any network traffic
for other chat group members who don’t join the live chat.&lt;/p&gt;

&lt;h2 id=&quot;get-ready-player-two&quot;&gt;Get ready, player two!&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/logos/webxdc2.png&quot; style=&quot;width:140px; float:left; clear:both; margin-right:3em; margin-bottom:.2em;&quot; alt=&quot;Webxdc Logo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To get started on webxdc app development, we recommend the following readings:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://webxdc.org/docs/&quot;&gt;Getting started on developing your own app&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://webxdc.org/docs/shared_state/index.html&quot;&gt;Shared Web Application state&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://delta.chat/en/2024-02-15-webxdc-m3&quot;&gt;Webxdc (Psst!) reclaiming Peer-to-Peer Web
technology&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://delta.chat/en/2023-05-22-webxdc-security&quot;&gt;Bringing E2E privacy to the Web: 4th security audit 😅&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Please don’t hesitate to get back to our fediverse account, 
the &lt;a href=&quot;https://support.delta.chat/c/webxdc/20&quot;&gt;webxdc support forum category&lt;/a&gt;
or other contact addresses.&lt;/p&gt;

&lt;h2 id=&quot;technical-background-on-our-irohp2p-integration&quot;&gt;Technical background on our Iroh/P2P integration&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://iroh.computer&quot;&gt;
&lt;img src=&quot;../assets/logos/iroh.svg&quot; style=&quot;width:150px; float:left; clear:both; margin-right:.5em; margin-bottom:.2em;&quot; alt=&quot;Iroh Logo&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A joint focus with the Iroh team has been to support all platforms reliably,
including mobile platforms. 
For the last half year Delta apps had an opt-in experimental “webxdc realtime” setting
which, after extensive testing and bug fixing, is now enabled by default.&lt;/p&gt;

&lt;h3 id=&quot;how-private-p2p-networking-is-established&quot;&gt;How private P2P networking is established&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/webxdc/webxdc-realtime-check&quot;&gt;
&lt;img src=&quot;../assets/blog/2024-11-realtimecheck.png&quot; width=&quot;150&quot; style=&quot;float:right; margin-left:1em;&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only if you start an app that uses the 
&lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html&quot;&gt;webxdc.joinRealtimeChannel() API&lt;/a&gt;
will Delta Chat initiate participation of your device in a P2P network. 
Delta Chat will send an end-to-end encrypted “system” chat message to a group chat
that contains an &lt;a href=&quot;https://www.iroh.computer/docs/concepts/tickets&quot;&gt;Iroh Ticket&lt;/a&gt;. 
When receiving devices also join the realtime channel, 
they can establish a direct connection immediately because the ticket is already on record. 
No lookup in a global &lt;a href=&quot;https://en.wikipedia.org/wiki/Distributed_hash_table&quot;&gt;distributed hash table&lt;/a&gt;
slows down or complicates the initial connection. 
&lt;strong&gt;The federated e-mail system is used to bootstrap an ephemeral Peer-to-Peer network.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You may download the &lt;a href=&quot;https://apps.testrun.org/webxdc-realtime-check-v1.0.5.xdc&quot;&gt;Realtime Check app&lt;/a&gt;
and share it into a chat to perform network latency analysis between realtime messaging peers. 
You can already run it in “Saved Messages” between two devices in a multi-device setup.&lt;/p&gt;

&lt;p&gt;To establish a direct P2P connection, 
two interested devices will use an &lt;a href=&quot;https://www.iroh.computer/docs/protocols/net#relays&quot;&gt;Iroh Relay&lt;/a&gt; 
which typically runs on every &lt;a href=&quot;https://delta.chat/chatmail&quot;&gt;chatmail server&lt;/a&gt;,
mirroring the existing e-mail federation. 
If your chat profile is using a classic e-mail server
then a global default relay is used, operated kindly by the Iroh team.&lt;/p&gt;

&lt;p&gt;The Iroh relay server combines both &lt;a href=&quot;https://en.wikipedia.org/wiki/STUN&quot;&gt;STUN&lt;/a&gt;
and &lt;a href=&quot;https://en.wikipedia.org/wiki/Traversal_Using_Relays_around_NAT&quot;&gt;TURN&lt;/a&gt; functionality,
to allow peers to discover and directly connect. Additionally it 
relays messages as long as no direct connection is established. 
For more details please check our 
&lt;a href=&quot;https://rs.delta.chat/deltachat/peer_channels/index.html&quot;&gt;Rust deltachat::peer_channels docs&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;identity-on-the-p2p-network-is-ephemeral-and-encryption-is-forward-secret&quot;&gt;Identity on the P2P network is ephemeral, and encryption is forward-secret&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/two-faces.jpg&quot; width=&quot;140&quot; style=&quot;float:right; margin-left:1em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Delta Chat uses ephemeral cryptographic identities for any P2P messaging. 
When Delta Chat is closed or stopped by the operating system,
then a new ephemeral identity will be created on the next start. 
Moreover, Iroh uses &lt;a href=&quot;https://en.wikipedia.org/wiki/QUIC&quot;&gt;QUIC&lt;/a&gt; on the networking layer 
which implements &lt;a href=&quot;https://en.wikipedia.org/wiki/Forward_secrecy&quot;&gt;Forward Secrecy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ephemeral identities and forward-secret encryption shield against 
an attacker that collects encrypted network traffic 
and later compromises your device to try to decrypt past recorded traffic. 
Not only the Live Chat app but all realtime webxdc apps benefit 
from the ephemeral and end-to-end-encrypted Peer-to-Peer messaging
provided by the Iroh stack and its Delta Chat integration on all platforms.&lt;/p&gt;

&lt;h3 id=&quot;a-privacy-note-on-ip-addresses&quot;&gt;A privacy note on IP-addresses&lt;/h3&gt;

&lt;p&gt;Delta Chat does not store IP-addresses anywhere 
and it does not expose IP addresses in the user interface or to webxdc apps. 
Iroh relay servers do not see all the IP addresses 
that user devices advertise to each other (for example relays don’t see peer’s WLAN addresses),
and relays also do not store any IP addresses when facilitating a P2P connection.&lt;/p&gt;

&lt;p&gt;However, chat partners may learn about your IP address if they deploy
some network monitoring tool or use a modified version of Delta Chat. 
If using webxdc apps with a potentially hostile chat partner is a concern for you 
you may disable the “webxdc realtime” setting in “advanced settings” to be sure 
that Delta Chat will never attempt any Peer-to-Peer connection with anyone. 
Don’t forget to then also be careful when clicking on any HTTPS-link in a chat 
as a hostile sender could use it to extract your IP-address as well.&lt;/p&gt;

&lt;h2 id=&quot;specifications-protocols-and-the-freedom-to-exit&quot;&gt;Specifications, protocols and the freedom to exit&lt;/h2&gt;

&lt;p&gt;When other webxdc-supporting XMPP messengers like &lt;a href=&quot;https://cheogram.com&quot;&gt;Cheogram&lt;/a&gt; and &lt;a href=&quot;https://monocles.eu/more/&quot;&gt;Monocles&lt;/a&gt; implement the new webxdc realtime API,
they are not required to use Iroh but can instead 
use other existing XMPP ephemeral messaging capabilities.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://webxdc.org/docs/spec/joinRealtimeChannel.html&quot;&gt;webxdc.joinRealtimeChannel() API&lt;/a&gt;
is a minimal high-level API 
that is easier to use than the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection&quot;&gt;classic WebRTC Browser P2P API&lt;/a&gt;
because a &lt;a href=&quot;https://webxdc.org/docs/spec/messenger.html&quot;&gt;webxdc messenger implementor&lt;/a&gt;
carries the burden to manage all dynamic connectivity, discovery and network routing aspects.&lt;/p&gt;

&lt;p&gt;In fact Delta Chat apps themselves 
could evolve to use a different implementation for webxdc realtime communications. 
We’ve noted in the Fediverse lately that &lt;a href=&quot;https://chaos.social/@delta/113492052382161817&quot;&gt;Protocols and specifications provide freedom of exit&lt;/a&gt; 
and the new realtime API specification is a practical example for that.&lt;/p&gt;

&lt;h2 id=&quot;thanks-to-nlnet-and-ngi-for-support-and-vision&quot;&gt;Thanks to NLNET and NGI for support and vision!&lt;/h2&gt;

&lt;p&gt;&lt;img alt=&quot;NLNet Logo&quot; src=&quot;../assets/logos/logo_nlnet.svg&quot; width=&quot;140&quot; style=&quot;float:right; margin-left:1em;&quot; /&gt;&lt;br /&gt;
Our introduction of the webxdc realtime API has been 
supported by &lt;a href=&quot;https://nlnet.nl/&quot;&gt;NLnet&lt;/a&gt;,
themselves funded by the European Commission’s &lt;a href=&quot;https://ngi.eu/&quot;&gt;Next Generation Internet&lt;/a&gt; programme.&lt;/p&gt;

</description>
				<pubDate>Wed, 20 Nov 2024 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2024-11-20-webxdc-realtime</link>
				<guid isPermaLink="true">https://delta.chat/en/2024-11-20-webxdc-realtime</guid>
			</item>
			
			
		
			
			
			<item>
				<title>Instant Onboarding and Instant Message Delivery</title>
				<description>&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-create-profile.jpg&quot; width=&quot;200px&quot; style=&quot;float: right; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
A major milestone in our 6+ years long project history: 
With the rolling 1.46 app releases you can start chatting without a pre-existing e-mail address. 
Just provide a name and then tap “Agree and continue” 
to create a chat profile using the &lt;a href=&quot;https://nine.testrun.org/privacy.html&quot;&gt;default chatmail server&lt;/a&gt;. 
Or visit other &lt;a href=&quot;../chatmail&quot;&gt;chatmail servers&lt;/a&gt; and tap the invite on their home page.&lt;/p&gt;

&lt;p&gt;Great, a new chat profile in a few seconds, but what now?&lt;/p&gt;

&lt;p&gt;Getting in contact with others is indeed a fundamental problem for any non-mainstream messenger.
In the next two sections we suggest how to get in contact with some bots and humans,
before highlighting more news about the 1.46 release series,
and providing some of our thinking around the UX and UI direction of Delta Chat
and chatmail servers.&lt;/p&gt;

&lt;h2 id=&quot;getting-in-contact-with-chat-bots-and-deltafans&quot;&gt;Getting in contact with chat bots and “DeltaFans”&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-public-bot-avatar.png&quot; width=&quot;100px&quot; style=&quot;float: right; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You may tap “invite links” on a device where Delta Chat is installed like the following:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;To verify things work, send a message to
&lt;a href=&quot;mailto:echo@nine.testrun.org&quot;&gt;echo@nine.testrun.org&lt;/a&gt; and observe the echo reply arriving quickly.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Checkout &lt;a href=&quot;https://i.delta.chat/#9AF055DB87EC48A1C009B6CA55E3712A6F7D346F&amp;amp;a=botsindex%40nine.testrun.org&amp;amp;n=Public%20Bots&amp;amp;i=QpBSronexvP&amp;amp;s=nAfQ0q_JomN&quot;&gt;a “Public Bots” index bot&lt;/a&gt; 
to receive a little web app to view and start interacting with a selection of yet more bots. 
Rest assured, no ChatGPT inside ;)&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-deltafans.jpg&quot; width=&quot;100px&quot; style=&quot;float: right; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;If you feel more adventurous you may contact &lt;a href=&quot;https://i.delta.chat/#B9311CB912B04BBD2977327C53FAAF34FDAAADF4&amp;amp;a=deltafans%40nine.testrun.org&amp;amp;n=DeltaFans&amp;amp;i=s-x3ZriWiET&amp;amp;s=qebTBni-pbN&quot;&gt;Delta
Fans&lt;/a&gt;, an highly-experimental “community” chat profile 
which was recently shared in the fediverse and lives on many people’s devices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Troubleshooting: if tapping an invite link does not open a chat for you,
you get re-directed to the i.delta.chat website
where you may “copy the link” behind the “Open Chat” button, 
and then paste it into the “Scan QR Code” screen of the Delta Chat app.&lt;/p&gt;

&lt;h2 id=&quot;getting-in-contact-with-human-fellows&quot;&gt;Getting in contact with human fellows&lt;/h2&gt;

&lt;p&gt;When using default sign-up with &lt;a href=&quot;/chatmail&quot;&gt;chatmail servers&lt;/a&gt; 
you can only send out end-to-end encrypted messages. 
You can setup &lt;a href=&quot;https://delta.chat/en/2024-03-25-crypto-analysis-securejoin&quot;&gt;guaranteed end-to-end encrypted chats&lt;/a&gt; by&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;adding a new contact through a QR code scan, or&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;sharing your own contact info as an “invite link” 
that any receiver who has installed Delta Chat 
can tap to start a chat with you, or&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;sharing a “group chat invite” 
that any receiver who has installed Delta Chat 
can tap to join the group, or&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;being added to a secure group chat 
which will allow you to message any group member.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2023-11-qr-scan.jpg&quot; style=&quot;width:160px; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;
&lt;img src=&quot;../assets/blog/green-checkmark.svg&quot; width=&quot;140&quot; style=&quot;margin-left:1em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Note that setting up secure chats works just fine in mesh networks in the Amazon Rain Forest 
or in regions that are cut off from the wider Internet. 
No central key server or other global infrastructure is required.&lt;/p&gt;

&lt;h2 id=&quot;new-introduce-a-contact-to-chat-partners&quot;&gt;New: Introduce a contact to chat partners&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-vcard2.png&quot; style=&quot;width:250px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With the 1.46 releases you can now “attach” a contact to a chat message, 
and any receiver can tap it to start chatting with the attached contact. 
The contact attachment has the &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6350&quot;&gt;vcard format&lt;/a&gt;
and contains your name, avatar, e-mail address and encryption information 
so that the initial message can be end-to-end encrypted to the contact,
allowing it to travel to other chatmail and e-mail servers safely.&lt;/p&gt;

&lt;h2 id=&quot;new-instant-push-notifications-for-android&quot;&gt;New: Instant push notifications for Android&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-alice-noti.jpg&quot; style=&quot;width:200px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Instant message delivery through push notifications is not only 
available for iOS but now also for Android devices,
without giving Google and Apple any access to user data. 
Check out &lt;a href=&quot;https://delta.chat/help#instant-delivery&quot;&gt;our new push notifications FAQ section&lt;/a&gt; for more details. 
“Messages not arriving or arriving with long delays” has been 
a recurring real-world issue that we hope is now soon becoming a thing of the past.&lt;/p&gt;

&lt;h2 id=&quot;chat-profiles-on-your-device-and-in-your-hand&quot;&gt;Chat profiles: on your device and in your hand&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/blog/2024-05-create-profile.jpg&quot; style=&quot;width:200px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Delta Chat does not store or keep data at e-mail servers 
but only uses them for ephemeral message transport. 
When first onboarding with Delta Chat you’ll create a “Chat profile”
which initially consists of your chosen name and avatar,
and an automatically generated encryption-setup, e-mail address and password. 
If you tap “use other server” and “manual login” 
you can manually specify an existing e-mail address and password.&lt;/p&gt;

&lt;p&gt;Over time, your chat profile accumulates 
contacts, chat groups, messages and media files. 
You can transfer or duplicate your chat profile to another device,
either by a QR code scan or by exporting it to a file 
and then importing and using it on any other device. 
Chat profiles are literally “in your hand” and stored on your device(s). 
No chat profile data is stored on any server,
also not in encrypted or PIN-protected form. 
Chat profiles use servers only for end-to-end encrypted message transport.&lt;/p&gt;

&lt;h2 id=&quot;are-we-turning-our-back-on-classic-e-mail&quot;&gt;Are we turning our back on classic e-mail?&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;../assets/logos/chatmail.png&quot; style=&quot;width:200px; float:right; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;Firstly, chatmail servers are fully interoperable e-mail servers, 
but they do away with spam-checking and unnecessary rate-limits,
allow anonymous sign-up without requiring any private data,
and are faster and more efficient than classic e-mail servers.&lt;/p&gt;

&lt;p&gt;Secondly, chatmail servers run the popular &lt;a href=&quot;https://www.postfix.org&quot;&gt;postfix&lt;/a&gt;
and &lt;a href=&quot;https://dovecot.org&quot;&gt;dovecot&lt;/a&gt; server software in a minimal configuration,
with small tweaks for optimized onboarding, speed and security. 
Both systems are proven Free and Open Source software 
used by tens of thousands of e-mail providers for billions of messages per day.&lt;/p&gt;

&lt;p&gt;Thirdly, you can still use your existing e-mail address and
there are many &lt;a href=&quot;https://providers.delta.chat&quot;&gt;providers&lt;/a&gt; 
with which Delta Chat works well,
apart from the lack of push notification support.&lt;/p&gt;

&lt;p&gt;Lastly, while Delta Chat aims to offer easier onboarding than Whatsapp, Signal or Telegram 
you can also use and regard it as an e-mail app. 
All Delta Chat apps offer multi-profile support 
which means you can have a profile for instant chat messaging 
&lt;em&gt;and&lt;/em&gt; another profile with a pre-existing e-mail address for classic e-mail purposes.&lt;/p&gt;

&lt;h2 id=&quot;are-we-de-emphasizing-e-mail-addresses-in-the-user-interface&quot;&gt;Are we de-emphasizing e-mail addresses in the user interface?&lt;/h2&gt;

&lt;p&gt;Yes.&lt;/p&gt;

&lt;p&gt;We aim to make Delta Chat more approachable for the many folks 
who do not care about or are even critical of “e-mail”. 
With some likeliness that’s not you because you are reading this post here :)
But you probably know people who don’t rejoice when hearing “e-mail”
but who might appreciate that Delta Chat&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;provides a convenient and reliable messaging experience,&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;does not require a phone number or any other personal data,&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;offers privacy, censorship resistance and free choice of server,&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;offers in-chat games like 2048, Chess or Hextris,
and in-chat tools like an editor, a calendar and a checklist.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In light of all these features, we prefer to not require 
would-be-users first to understand what “e-mail” has to do with anything. 
As a 20-year old woman once fed back “E-mail? Isn’t e-mail just there for spam and work?”
E-mail in the form of chatmail is so much more than that 
but we still think it’s good to let 
e-mail addresses recede into the background of Delta Chat 
just like phone numbers typically recede into the background of classic phone-based messengers.&lt;/p&gt;

&lt;h2 id=&quot;chatmail-makes-e-mail-cheap-again&quot;&gt;Chatmail makes e-mail cheap again&lt;/h2&gt;

&lt;p&gt;With our new chatmail-based instant onboarding system, 
e-mail addresses are becoming, like in the early 2000s, cheap and virtually free. 
But this time around, there is no company posturing to “do no evil” 
luring everyone to their central “ethical” service and then drop the pretense soon after. 
&lt;a href=&quot;https://delta.chat/en/2023-12-13-chatmail&quot;&gt;Running a chatmail server&lt;/a&gt; is a cheap activity 
that we want people to be able to do on the side 
and on low-end hardware all across the world. 
Chatmail is best described as an ephemeral end-to-end encrypted 
messaging routing system running at Internet-scale.&lt;/p&gt;

&lt;h2 id=&quot;internet-standards-ftw-or-e-mail-strikes-back&quot;&gt;Internet standards FTW or: e-mail strikes back!&lt;/h2&gt;

&lt;p&gt;How often have you heard “E-mail is dead” or 
“here is this brand new thing to replace e-mail” 
from marketing pushes throughout the last two decades? 
How often have you heard “The Web is dead and replaced by mobile apps”
only to find most mobile apps being a thinly veiled web view, anyway?&lt;/p&gt;

&lt;p&gt;By contrast, Delta Chat fully embraces both E-mail and Web standards 
to avoid the pitfalls and failures of past and present 
“inventing a new standard to replace e-mail / the Web” efforts.
Our new “Instant onboarding” relies on chatmail servers that operate
as part of the existing massively distributed e-mail network
to provide a fast and secure basis for decentralized instant messaging.&lt;/p&gt;

&lt;p&gt;In other words, 
Delta Chat is a messenger that fundamentally heeds the warning of XKCD 927 :)&lt;/p&gt;

&lt;figure&gt; &lt;a href=&quot;https://xkcd.com/927/&quot;&gt;&lt;img src=&quot;https://imgs.xkcd.com/comics/standards_2x.png&quot; width=&quot;500px&quot; style=&quot;float:center; clear:both; margin-left:.5em; margin-bottom:.2em;&quot; alt=&quot;XKCD 927 comic&quot; /&gt;&lt;figcaption&gt;XKCD 927&lt;/figcaption&gt; &lt;/a&gt;&lt;/figure&gt;

</description>
				<pubDate>Fri, 31 May 2024 00:00:00 +0000</pubDate>
				<link>https://delta.chat/en/2024-05-31-instant-onboarding</link>
				<guid isPermaLink="true">https://delta.chat/en/2024-05-31-instant-onboarding</guid>
			</item>
			
			
		
	</channel>
</rss>

