This commit is contained in:
Sarah Jamie Lewis 2024-02-13 21:16:58 -08:00
parent ca0b28130f
commit c6b3ae5cc1
Signed by: sarah
GPG Key ID: F27FD21A270837EF
858 changed files with 3172 additions and 2270 deletions

View File

@ -0,0 +1,77 @@
---
title: Cwtch 1.14
description: "Cwtch 1.14 is now available to download"
slug: cwtch-1-14
tags: [cwtch, cwtch-stable, release]
image: /img/Themes_collage.png
hide_table_of_contents: false
toc_max_heading_level: 4
authors:
- name: Sarah Jamie Lewis
title: Executive Director, Open Privacy Research Society
image_url: /img/sarah.jpg
---
[Cwtch 1.14 is now available for download](https://cwtch.im/download)!
Cwtch is a communication application (and associated libraries) that uses Tor v3 Onion Services to establish surveillance resistant channels between people. Cwtch has been designed to be
secure, private, and resilient.
You can download Cwtch from [https://cwtch.im/download](https://cwtch.im/download).
Subscribe to our [RSS feed](/blog/rss.xml), [Atom feed](/blog/atom.xml), or [JSON feed](/blog/feed.json) to stay up to date, and get the latest on, all aspects of Cwtch development.
Alternatively we also provide a [releases-only RSS feed](https://cwtch.im/releases/index.xml).
## In This Release
<figure>
[![](/img/Themes_collage.png)](/img/Themes_collage.png)
<figcaption>We have made many changes to Cwtch themeing in 1.14, including new Custom Themes</figcaption>
</figure>
<!--truncate-->
A special thanks to the [amazing volunteer translators](https://docs.cwtch.im/docs/contribute/translate) and [testers](https://docs.cwtch.im/docs/contribute/testing) who made this release possible.
- **New Features:**
- **Custom Themes** - You can now load [custom themes](https://docs.cwtch.im/docs/contribute/themes) into Cwtch.
- **Message View Backgrounds** - This release contains the first support for (optional) background images in the message view. Future releases will allow per-conversation images.
- **Bug Fixes / Improvements:**
- Fixed tor connectivity in newer Tails releases
- Fixes in the Retry Plugin for better managing of a large number of contacts
- Several UX improvements for font scaling, and styling
- Fixed Android File Sharing Bug which prevent downloads of [non-previewed files](https://docs.cwtch.im/docs/settings/experiments/image-previews-and-profile-pictures).
- Fixed Android File Sharing Bug that resulted in a UI reset triggered by a rate race condition between reconnection and new message arriving
- Split Settings Pane into multiple tabs for easier navigation of options
- Fixed contact row date time/localization inconsistency
- Fixed contact row issue where `LANG` wasn't set on some linux systems
- libCwtch now support older Mac releases (min 10.12)
- Updates images and descriptions in the Windows Installer
- **Accessibility / UX:**
- Core translations for **Brazilian Portuguese**, **Danish** , **Dutch**, **French**, **German**, **Italian**, **Norwegian** , **Romanian** , **Russian**, **Polish**, **Slovak**, **Spanish**, **Swahili**, **Swedish**, **Turkish**, and **Welsh**
- Partial translations for **Korean** (41%), **Japanese** (26%), , **Luxembourgish** (19%), **Greek** (15%), **Uzbek** (9%), and **Portuguese** (5%)
- **Theme Refresh** - Many small adjustments to existing themes to make them more accessible
## Reproducible Bindings
Cwtch 1.14 is based on libCwtch version `libCwtch-autobindings-2024-02-12-11-04-v0.0.12`.
The [repliqate scripts](https://docs.cwtch.im/blog/cwtch-bindings-reproducible#introducing-repliqate) to reproduce these bindings from source
can be found at [https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12](https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12)
<hr/>
## Help us go further!
We couldn't do what we do without all the wonderful community support we get, from [one-off donations](https://openprivacy.ca/donate) to [recurring support via Patreon](https://www.patreon.com/openprivacy).
If you want to see us move faster on some of these goals and are in a position to, please [donate](https://openprivacy.ca/donate). If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.
Donations of **$5 or more** can opt to receive stickers as a thank-you gift!
For more information about donating to Open Privacy and claiming a thank you gift [please visit the Open Privacy Donate page](https://openprivacy.ca/donate/).
![A Photo of Cwtch Stickers](/img/stickers-new.jpg)

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 KiB

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[606],{2592:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":23,"previousPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[606],{2592:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":24,"previousPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1174],{3170:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch","page":1,"postsPerPage":10,"totalPages":3,"totalCount":25,"nextPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1174],{3170:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch","page":1,"postsPerPage":10,"totalPages":3,"totalCount":26,"nextPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[4704],{4674:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":25,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[4704],{4674:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":26,"unlisted":false}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8793],{4990:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":25,"previousPage":"/blog/tags/cwtch","nextPage":"/blog/tags/cwtch/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8793],{4990:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":26,"previousPage":"/blog/tags/cwtch","nextPage":"/blog/tags/cwtch/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1598],{5814:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":23,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1598],{5814:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":24,"unlisted":false}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7958],{6818:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":25,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7958],{6818:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":26,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[6946],{9048:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":25,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[6946],{9048:s=>{s.exports=JSON.parse('{"label":"cwtch","permalink":"/blog/tags/cwtch","allTagsPath":"/blog/tags","count":26,"unlisted":false}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7015],{2990:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":23,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7015],{2990:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":24,"unlisted":false}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[198],{4978:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":23,"previousPage":"/blog/tags/cwtch-stable","nextPage":"/blog/tags/cwtch-stable/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[198],{4978:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":24,"previousPage":"/blog/tags/cwtch-stable","nextPage":"/blog/tags/cwtch-stable/page/3","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[205],{3672:e=>{e.exports=JSON.parse('{"label":"release","permalink":"/blog/tags/release","allTagsPath":"/blog/tags","count":3,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[205],{3672:e=>{e.exports=JSON.parse('{"label":"release","permalink":"/blog/tags/release","allTagsPath":"/blog/tags","count":4,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1],{2638:e=>{e.exports=JSON.parse('{"permalink":"/blog/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":25,"previousPage":"/blog","nextPage":"/blog/page/3","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1],{2638:e=>{e.exports=JSON.parse('{"permalink":"/blog/page/2","page":2,"postsPerPage":10,"totalPages":3,"totalCount":26,"previousPage":"/blog","nextPage":"/blog/page/3","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8442],{5310:e=>{e.exports=JSON.parse('{"permalink":"/blog/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":25,"previousPage":"/blog/page/2","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[8442],{5310:e=>{e.exports=JSON.parse('{"permalink":"/blog/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":26,"previousPage":"/blog/page/2","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7438],{8055:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/release","page":1,"postsPerPage":10,"totalPages":1,"totalCount":3,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[7438],{8055:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/release","page":1,"postsPerPage":10,"totalPages":1,"totalCount":4,"blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1713],{3457:l=>{l.exports=JSON.parse('[{"label":"cwtch","permalink":"/blog/tags/cwtch","count":25},{"label":"hybrid-groups","permalink":"/blog/tags/hybrid-groups","count":2},{"label":"acl","permalink":"/blog/tags/acl","count":1},{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","count":23},{"label":"release","permalink":"/blog/tags/release","count":3},{"label":"planning","permalink":"/blog/tags/planning","count":5},{"label":"nightly","permalink":"/blog/tags/nightly","count":4},{"label":"whonix","permalink":"/blog/tags/whonix","count":1},{"label":"preview","permalink":"/blog/tags/preview","count":2},{"label":"search","permalink":"/blog/tags/search","count":1},{"label":"contributors","permalink":"/blog/tags/contributors","count":1},{"label":"community","permalink":"/blog/tags/community","count":1},{"label":"reproducible-builds","permalink":"/blog/tags/reproducible-builds","count":3},{"label":"bindings","permalink":"/blog/tags/bindings","count":5},{"label":"repliqate","permalink":"/blog/tags/repliqate","count":3},{"label":"developer-documentation","permalink":"/blog/tags/developer-documentation","count":1},{"label":"documentation","permalink":"/blog/tags/documentation","count":1},{"label":"security-handbook","permalink":"/blog/tags/security-handbook","count":1},{"label":"autobindings","permalink":"/blog/tags/autobindings","count":2},{"label":"libcwtch","permalink":"/blog/tags/libcwtch","count":2},{"label":"support","permalink":"/blog/tags/support","count":3},{"label":"testing","permalink":"/blog/tags/testing","count":2},{"label":"api","permalink":"/blog/tags/api","count":1}]')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[1713],{3457:l=>{l.exports=JSON.parse('[{"label":"cwtch","permalink":"/blog/tags/cwtch","count":26},{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","count":24},{"label":"release","permalink":"/blog/tags/release","count":4},{"label":"hybrid-groups","permalink":"/blog/tags/hybrid-groups","count":2},{"label":"acl","permalink":"/blog/tags/acl","count":1},{"label":"planning","permalink":"/blog/tags/planning","count":5},{"label":"nightly","permalink":"/blog/tags/nightly","count":4},{"label":"whonix","permalink":"/blog/tags/whonix","count":1},{"label":"preview","permalink":"/blog/tags/preview","count":2},{"label":"search","permalink":"/blog/tags/search","count":1},{"label":"contributors","permalink":"/blog/tags/contributors","count":1},{"label":"community","permalink":"/blog/tags/community","count":1},{"label":"reproducible-builds","permalink":"/blog/tags/reproducible-builds","count":3},{"label":"bindings","permalink":"/blog/tags/bindings","count":5},{"label":"repliqate","permalink":"/blog/tags/repliqate","count":3},{"label":"developer-documentation","permalink":"/blog/tags/developer-documentation","count":1},{"label":"documentation","permalink":"/blog/tags/documentation","count":1},{"label":"security-handbook","permalink":"/blog/tags/security-handbook","count":1},{"label":"autobindings","permalink":"/blog/tags/autobindings","count":2},{"label":"libcwtch","permalink":"/blog/tags/libcwtch","count":2},{"label":"support","permalink":"/blog/tags/support","count":3},{"label":"testing","permalink":"/blog/tags/testing","count":2},{"label":"api","permalink":"/blog/tags/api","count":1}]')}}]);

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[10],{7715:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable","page":1,"postsPerPage":10,"totalPages":3,"totalCount":23,"nextPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[10],{7715:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch-stable","page":1,"postsPerPage":10,"totalPages":3,"totalCount":24,"nextPage":"/blog/tags/cwtch-stable/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":3,"totalCount":25,"nextPage":"/blog/page/2","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[533],{8017:e=>{e.exports=JSON.parse('{"permalink":"/blog","page":1,"postsPerPage":10,"totalPages":3,"totalCount":26,"nextPage":"/blog/page/2","blogDescription":"The latest updated on Cwtch development.","blogTitle":"Development Log"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[3213],{3260:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":23,"unlisted":false}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[3213],{3260:s=>{s.exports=JSON.parse('{"label":"cwtch-stable","permalink":"/blog/tags/cwtch-stable","allTagsPath":"/blog/tags","count":24,"unlisted":false}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[6522],{1484:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":25,"previousPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);
"use strict";(self.webpackChunkuser_handbook=self.webpackChunkuser_handbook||[]).push([[6522],{1484:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/cwtch/page/3","page":3,"postsPerPage":10,"totalPages":3,"totalCount":26,"previousPage":"/blog/tags/cwtch/page/2","blogDescription":"Blog","blogTitle":"Blog"}')}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -2,12 +2,74 @@
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://docs.cwtch.im/blog</id>
<title>Cwtch Development Log</title>
<updated>2024-01-12T00:00:00.000Z</updated>
<updated>2024-02-14T00:00:00.000Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://docs.cwtch.im/blog"/>
<subtitle>The latest insight into Cwtch Development and what the Cwtch team are working on</subtitle>
<icon>https://docs.cwtch.im/img/favicon.png</icon>
<rights>Copyright © ${new Date().getFullYear()} Open Privacy Research Society</rights>
<entry>
<title type="html"><![CDATA[Cwtch 1.14]]></title>
<id>https://docs.cwtch.im/blog/cwtch-1-14</id>
<link href="https://docs.cwtch.im/blog/cwtch-1-14"/>
<updated>2024-02-14T00:00:00.000Z</updated>
<summary type="html"><![CDATA[Cwtch 1.14 is now available to download]]></summary>
<content type="html"><![CDATA[<p><a href="https://cwtch.im/download" target="_blank" rel="noopener noreferrer">Cwtch 1.14 is now available for download</a>!<!-- --></p>
<!-- --><p>Cwtch is a communication application (and associated libraries) that uses Tor v3 Onion Services to establish surveillance resistant channels between people. Cwtch has been designed to be
secure, private, and resilient.</p>
<!-- --><p>You can download Cwtch from <!-- --><a href="https://cwtch.im/download" target="_blank" rel="noopener noreferrer">https://cwtch.im/download</a>.<!-- --></p>
<!-- --><p>Subscribe to our <!-- --><a href="https://docs.cwtch.im/blog/rss.xml">RSS feed</a>, <!-- --><a href="https://docs.cwtch.im/blog/atom.xml">Atom feed</a>, or <!-- --><a href="https://docs.cwtch.im/blog/feed.json">JSON feed</a> to stay up to date, and get the latest on, all aspects of Cwtch development.<!-- --></p>
<!-- --><p>Alternatively we also provide a <!-- --><a href="https://cwtch.im/releases/index.xml" target="_blank" rel="noopener noreferrer">releases-only RSS feed</a>.<!-- --></p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="in-this-release">In This Release<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#in-this-release" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><figure><p><a target="_blank" href="https://docs.cwtch.im/assets/files/Themes_collage-ac81d091a47194dcfc2093f45987a300.png"><img loading="lazy" src="https://docs.cwtch.im/assets/images/Themes_collage-ac81d091a47194dcfc2093f45987a300.png" width="1920" height="1080" class="img_ev3q"></a></p><figcaption>We have made many changes to Cwtch themeing in 1.14, including new Custom Themes</figcaption></figure>
<!-- --><p>A special thanks to the <!-- --><a href="https://docs.cwtch.im/docs/contribute/translate" target="_blank" rel="noopener noreferrer">amazing volunteer translators</a> and <!-- --><a href="https://docs.cwtch.im/docs/contribute/testing" target="_blank" rel="noopener noreferrer">testers</a> who made this release possible.<!-- --></p>
<!-- --><ul>
<!-- --><li><strong>New Features:</strong>
<!-- --><ul>
<!-- --><li><strong>Custom Themes</strong> - You can now load <!-- --><a href="https://docs.cwtch.im/docs/contribute/themes" target="_blank" rel="noopener noreferrer">custom themes</a> into Cwtch.<!-- --></li>
<!-- --><li><strong>Message View Backgrounds</strong> - This release contains the first support for (optional) background images in the message view. Future releases will allow per-conversation images.<!-- --></li>
<!-- --></ul>
<!-- --></li>
<!-- --><li><strong>Bug Fixes / Improvements:</strong>
<!-- --><ul>
<!-- --><li>Fixed tor connectivity in newer Tails releases</li>
<!-- --><li>Fixes in the Retry Plugin for better managing of a large number of contacts</li>
<!-- --><li>Several UX improvements for font scaling, and styling</li>
<!-- --><li>Fixed Android File Sharing Bug which prevent downloads of <!-- --><a href="https://docs.cwtch.im/docs/settings/experiments/image-previews-and-profile-pictures" target="_blank" rel="noopener noreferrer">non-previewed files</a>.<!-- --></li>
<!-- --><li>Fixed Android File Sharing Bug that resulted in a UI reset triggered by a rate race condition between reconnection and new message arriving</li>
<!-- --><li>Split Settings Pane into multiple tabs for easier navigation of options</li>
<!-- --><li>Fixed contact row date time/localization inconsistency</li>
<!-- --><li>Fixed contact row issue where <!-- --><code>LANG</code> wasn't set on some linux systems<!-- --></li>
<!-- --><li>libCwtch now support older Mac releases (min 10.12)</li>
<!-- --><li>Updates images and descriptions in the Windows Installer</li>
<!-- --></ul>
<!-- --></li>
<!-- --><li><strong>Accessibility / UX:</strong>
<!-- --><ul>
<!-- --><li>Core translations for <!-- --><strong>Brazilian Portuguese</strong>, <!-- --><strong>Danish</strong> , <!-- --><strong>Dutch</strong>, <!-- --><strong>French</strong>, <!-- --><strong>German</strong>, <!-- --><strong>Italian</strong>, <!-- --><strong>Norwegian</strong> , <!-- --><strong>Romanian</strong> , <!-- --><strong>Russian</strong>, <!-- --><strong>Polish</strong>, <!-- --><strong>Slovak</strong>, <!-- --><strong>Spanish</strong>, <!-- --><strong>Swahili</strong>, <!-- --><strong>Swedish</strong>, <!-- --><strong>Turkish</strong>, and <!-- --><strong>Welsh</strong></li>
<!-- --><li>Partial translations for <!-- --><strong>Korean</strong> (41%), <!-- --><strong>Japanese</strong> (26%), , <!-- --><strong>Luxembourgish</strong> (19%), <!-- --><strong>Greek</strong> (15%), <!-- --><strong>Uzbek</strong> (9%), and <!-- --><strong>Portuguese</strong> (5%)<!-- --></li>
<!-- --><li><strong>Theme Refresh</strong> - Many small adjustments to existing themes to make them more accessible<!-- --></li>
<!-- --></ul>
<!-- --></li>
<!-- --></ul>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="reproducible-bindings">Reproducible Bindings<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#reproducible-bindings" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>Cwtch 1.14 is based on libCwtch version <!-- --><code>libCwtch-autobindings-2024-02-12-11-04-v0.0.12</code>.
The <!-- --><a href="https://docs.cwtch.im/blog/cwtch-bindings-reproducible#introducing-repliqate" target="_blank" rel="noopener noreferrer">repliqate scripts</a> to reproduce these bindings from source
can be found at <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12" target="_blank" rel="noopener noreferrer">https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12</a></p>
<!-- --><hr>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="help-us-go-further">Help us go further!<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#help-us-go-further" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>We couldn't do what we do without all the wonderful community support we get, from <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">one-off donations</a> to <!-- --><a href="https://www.patreon.com/openprivacy" target="_blank" rel="noopener noreferrer">recurring support via Patreon</a>.<!-- --></p>
<!-- --><p>If you want to see us move faster on some of these goals and are in a position to, please <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">donate</a>. If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.<!-- --></p>
<!-- --><p>Donations of <!-- --><strong>$5 or more</strong> can opt to receive stickers as a thank-you gift!<!-- --></p>
<!-- --><p>For more information about donating to Open Privacy and claiming a thank you gift <!-- --><a href="https://openprivacy.ca/donate/" target="_blank" rel="noopener noreferrer">please visit the Open Privacy Donate page</a>.<!-- --></p>
<!-- --><p><img loading="lazy" alt="A Photo of Cwtch Stickers" src="https://docs.cwtch.im/assets/images/stickers-new-1e9b14bdd638b4907cce833e813a09ad.jpg" width="1024" height="768" class="img_ev3q"></p>]]></content>
<author>
<name>Sarah Jamie Lewis</name>
</author>
<category label="cwtch" term="cwtch"/>
<category label="cwtch-stable" term="cwtch-stable"/>
<category label="release" term="release"/>
</entry>
<entry>
<title type="html"><![CDATA[Enhanced Permissions]]></title>
<id>https://docs.cwtch.im/blog/enhanced-permissions</id>
@ -1074,40 +1136,4 @@ without an associated decoration).<!-- --></p>
<category label="support" term="support"/>
<category label="testing" term="testing"/>
</entry>
<entry>
<title type="html"><![CDATA[Making Cwtch Android Bindings Reproducible]]></title>
<id>https://docs.cwtch.im/blog/cwtch-android-reproducibility</id>
<link href="https://docs.cwtch.im/blog/cwtch-android-reproducibility"/>
<updated>2023-02-10T00:00:00.000Z</updated>
<summary type="html"><![CDATA[In this devlog we revisit reproducible builds and make Cwtch Android bindings reproducible]]></summary>
<content type="html"><![CDATA[<p>In this development log, we continue our previous work on <!-- --><a href="https://docs.cwtch.im/blog/cwtch-bindings-reproducible" target="_blank" rel="noopener noreferrer">reproducible Cwtch bindings</a>, uncovering the final few sources of variation between our <!-- --><a href="https://git.openprivacy.ca/openprivacy/repliqate" target="_blank" rel="noopener noreferrer">Repliqate</a> scripts and our docker/drone builds, leading to fully reproducible builds for Cwtch Android bindings!<!-- --></p>
<!-- --><p><img loading="lazy" src="https://docs.cwtch.im/assets/images/devlog6-047cb55e43376529b3899ac2a0792f9c.png" width="1005" height="481" class="img_ev3q"></p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="changes-necessary-for-reproducible-android-bindings">Changes Necessary for Reproducible Android Bindings<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#changes-necessary-for-reproducible-android-bindings" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>After a thorough investigation of the build artifacts produced by Repliqate and Drone we uncovered three additional sources of variation:</p>
<!-- --><ul>
<!-- --><li><strong>Insufficient path stripping introduced by Android NDK tools</strong> - it turns out that Android builds using NDK versions below 22 are not reproducible as they produce randomized artifacts (through unstripped temporary directory paths appearing in compiled binares). NDK 22 <!-- --><a href="https://github.com/android/ndk/wiki/Changelog-r22" target="_blank" rel="noopener noreferrer">changed the binutils and default linker</a> to versions that correctly strip such paths from build artifacts. As such it was necessary for us to update the NDK version we used. We chose the technically outdated NDK 22 rather than the more modern NDK 25 to minimize Android OS compatibility changes during this switch. However, per our <!-- --><a href="https://docs.cwtch.im/blog/cwtch-platform-support" target="_blank" rel="noopener noreferrer">long term support plan</a>, we will be moving towards adopting the latest NDK in the future.<!-- --></li>
<!-- --><li><strong>Paths in DWARF entries</strong> - while we have been unable to track down exactly where these are being introduced, we did track the final difference in the produced bindings to DWARF debug lines embedded in compiled ELF binaries. These entries encoded the actual location of the NDK on the disk of the build machine, instead of the symbolic link that we believed should have been followed. By physically placing the NDK at same location in repliqate as in our Docker container we were able to get these entries to be consistent - however there is still work to do to understand exactly why they are being introduced at all.<!-- --></li>
<!-- --></ul>
<!-- --><figure><p><a target="_blank" href="https://docs.cwtch.im/assets/files/aar-diff-cefdff70043215f9b9244cbc0a179078.png"><img loading="lazy" src="https://docs.cwtch.im/assets/images/aar-diff-cefdff70043215f9b9244cbc0a179078.png" width="1863" height="428" class="img_ev3q"></a></p><figcaption>Vimdiff comparing the decoded (<!-- --><code>readelf --debug-dump=line</code>) DWARF debug section of Drone-produced Android bindings v.s. Repliqate-produced. The difference in paths is highlighted.<!-- --></figcaption></figure>
<!-- --><ul>
<!-- --><li><strong>Go Compiler Acquisition</strong> - our Docker container was compiling the Go compiler from source, while Repliqate was downloading a pre-compiled version. During debugging we changed the Dockerfile to also download the pre-compiled version in order to eliminate the difference as a potential reproducibility issue. Our tests indicated that there <!-- --><em>was</em> a difference between artifacts produced by the precompiled compiler v.s. one built from source - this is likely explained by introduced environmental differences caused by the compilation of the compiler itself e.g. the contents/versions of modules in the Go package cache which we have seen as having an impact on other produced binaries.<!-- --></li>
<!-- --></ul>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="repliqate-scripts">Repliqate Scripts<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#repliqate-scripts" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>With those issues now fixed, Cwtch Android bindings are <!-- --><strong>officially reproducible!</strong> The first version that officially met this requirement was 1.10.5, and you can find the Repliqate script under <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-bindings-v1.10.5/libcwtch.v1.10.5-android.script" target="_blank" rel="noopener noreferrer">cwtch-bindings-v1.10.5/libcwtch.v1.10.5-android.script</a> in the <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/" target="_blank" rel="noopener noreferrer">Cwtch Repliqate scripts repository</a>.<!-- --></p>
<!-- --><p>This is another big milestone towards our ultimate goal of full reproducibility for Cwtch releases.</p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="help-us-go-further">Help us go further!<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#help-us-go-further" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>We couldn't do what we do without all the wonderful community support we get, from <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">one-off donations</a> to <!-- --><a href="https://www.patreon.com/openprivacy" target="_blank" rel="noopener noreferrer">recurring support via Patreon</a>.<!-- --></p>
<!-- --><p>If you want to see us move faster on some of these goals and are in a position to, please <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">donate</a>. If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.<!-- --></p>
<!-- --><p>Donations of <!-- --><strong>$5 or more</strong> can opt to receive stickers as a thank-you gift!<!-- --></p>
<!-- --><p>For more information about donating to Open Privacy and claiming a thank you gift <!-- --><a href="https://openprivacy.ca/donate/" target="_blank" rel="noopener noreferrer">please visit the Open Privacy Donate page</a>.<!-- --></p>
<!-- --><p><img loading="lazy" alt="A Photo of Cwtch Stickers" src="https://docs.cwtch.im/assets/images/stickers-new-1e9b14bdd638b4907cce833e813a09ad.jpg" width="1024" height="768" class="img_ev3q"></p>]]></content>
<author>
<name>Sarah Jamie Lewis</name>
</author>
<category label="cwtch" term="cwtch"/>
<category label="cwtch-stable" term="cwtch-stable"/>
<category label="reproducible-builds" term="reproducible-builds"/>
<category label="bindings" term="bindings"/>
<category label="repliqate" term="repliqate"/>
</entry>
</feed>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -4,11 +4,70 @@
<title>Cwtch Development Log</title>
<link>https://docs.cwtch.im/blog</link>
<description>The latest insight into Cwtch Development and what the Cwtch team are working on</description>
<lastBuildDate>Fri, 12 Jan 2024 00:00:00 GMT</lastBuildDate>
<lastBuildDate>Wed, 14 Feb 2024 00:00:00 GMT</lastBuildDate>
<docs>https://validator.w3.org/feed/docs/rss2.html</docs>
<generator>https://github.com/jpmonette/feed</generator>
<language>en</language>
<copyright>Copyright © ${new Date().getFullYear()} Open Privacy Research Society</copyright>
<item>
<title><![CDATA[Cwtch 1.14]]></title>
<link>https://docs.cwtch.im/blog/cwtch-1-14</link>
<guid>https://docs.cwtch.im/blog/cwtch-1-14</guid>
<pubDate>Wed, 14 Feb 2024 00:00:00 GMT</pubDate>
<description><![CDATA[Cwtch 1.14 is now available to download]]></description>
<content:encoded><![CDATA[<p><a href="https://cwtch.im/download" target="_blank" rel="noopener noreferrer">Cwtch 1.14 is now available for download</a>!<!-- --></p>
<!-- --><p>Cwtch is a communication application (and associated libraries) that uses Tor v3 Onion Services to establish surveillance resistant channels between people. Cwtch has been designed to be
secure, private, and resilient.</p>
<!-- --><p>You can download Cwtch from <!-- --><a href="https://cwtch.im/download" target="_blank" rel="noopener noreferrer">https://cwtch.im/download</a>.<!-- --></p>
<!-- --><p>Subscribe to our <!-- --><a href="https://docs.cwtch.im/blog/rss.xml">RSS feed</a>, <!-- --><a href="https://docs.cwtch.im/blog/atom.xml">Atom feed</a>, or <!-- --><a href="https://docs.cwtch.im/blog/feed.json">JSON feed</a> to stay up to date, and get the latest on, all aspects of Cwtch development.<!-- --></p>
<!-- --><p>Alternatively we also provide a <!-- --><a href="https://cwtch.im/releases/index.xml" target="_blank" rel="noopener noreferrer">releases-only RSS feed</a>.<!-- --></p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="in-this-release">In This Release<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#in-this-release" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><figure><p><a target="_blank" href="https://docs.cwtch.im/assets/files/Themes_collage-ac81d091a47194dcfc2093f45987a300.png"><img loading="lazy" src="https://docs.cwtch.im/assets/images/Themes_collage-ac81d091a47194dcfc2093f45987a300.png" width="1920" height="1080" class="img_ev3q"></a></p><figcaption>We have made many changes to Cwtch themeing in 1.14, including new Custom Themes</figcaption></figure>
<!-- --><p>A special thanks to the <!-- --><a href="https://docs.cwtch.im/docs/contribute/translate" target="_blank" rel="noopener noreferrer">amazing volunteer translators</a> and <!-- --><a href="https://docs.cwtch.im/docs/contribute/testing" target="_blank" rel="noopener noreferrer">testers</a> who made this release possible.<!-- --></p>
<!-- --><ul>
<!-- --><li><strong>New Features:</strong>
<!-- --><ul>
<!-- --><li><strong>Custom Themes</strong> - You can now load <!-- --><a href="https://docs.cwtch.im/docs/contribute/themes" target="_blank" rel="noopener noreferrer">custom themes</a> into Cwtch.<!-- --></li>
<!-- --><li><strong>Message View Backgrounds</strong> - This release contains the first support for (optional) background images in the message view. Future releases will allow per-conversation images.<!-- --></li>
<!-- --></ul>
<!-- --></li>
<!-- --><li><strong>Bug Fixes / Improvements:</strong>
<!-- --><ul>
<!-- --><li>Fixed tor connectivity in newer Tails releases</li>
<!-- --><li>Fixes in the Retry Plugin for better managing of a large number of contacts</li>
<!-- --><li>Several UX improvements for font scaling, and styling</li>
<!-- --><li>Fixed Android File Sharing Bug which prevent downloads of <!-- --><a href="https://docs.cwtch.im/docs/settings/experiments/image-previews-and-profile-pictures" target="_blank" rel="noopener noreferrer">non-previewed files</a>.<!-- --></li>
<!-- --><li>Fixed Android File Sharing Bug that resulted in a UI reset triggered by a rate race condition between reconnection and new message arriving</li>
<!-- --><li>Split Settings Pane into multiple tabs for easier navigation of options</li>
<!-- --><li>Fixed contact row date time/localization inconsistency</li>
<!-- --><li>Fixed contact row issue where <!-- --><code>LANG</code> wasn't set on some linux systems<!-- --></li>
<!-- --><li>libCwtch now support older Mac releases (min 10.12)</li>
<!-- --><li>Updates images and descriptions in the Windows Installer</li>
<!-- --></ul>
<!-- --></li>
<!-- --><li><strong>Accessibility / UX:</strong>
<!-- --><ul>
<!-- --><li>Core translations for <!-- --><strong>Brazilian Portuguese</strong>, <!-- --><strong>Danish</strong> , <!-- --><strong>Dutch</strong>, <!-- --><strong>French</strong>, <!-- --><strong>German</strong>, <!-- --><strong>Italian</strong>, <!-- --><strong>Norwegian</strong> , <!-- --><strong>Romanian</strong> , <!-- --><strong>Russian</strong>, <!-- --><strong>Polish</strong>, <!-- --><strong>Slovak</strong>, <!-- --><strong>Spanish</strong>, <!-- --><strong>Swahili</strong>, <!-- --><strong>Swedish</strong>, <!-- --><strong>Turkish</strong>, and <!-- --><strong>Welsh</strong></li>
<!-- --><li>Partial translations for <!-- --><strong>Korean</strong> (41%), <!-- --><strong>Japanese</strong> (26%), , <!-- --><strong>Luxembourgish</strong> (19%), <!-- --><strong>Greek</strong> (15%), <!-- --><strong>Uzbek</strong> (9%), and <!-- --><strong>Portuguese</strong> (5%)<!-- --></li>
<!-- --><li><strong>Theme Refresh</strong> - Many small adjustments to existing themes to make them more accessible<!-- --></li>
<!-- --></ul>
<!-- --></li>
<!-- --></ul>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="reproducible-bindings">Reproducible Bindings<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#reproducible-bindings" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>Cwtch 1.14 is based on libCwtch version <!-- --><code>libCwtch-autobindings-2024-02-12-11-04-v0.0.12</code>.
The <!-- --><a href="https://docs.cwtch.im/blog/cwtch-bindings-reproducible#introducing-repliqate" target="_blank" rel="noopener noreferrer">repliqate scripts</a> to reproduce these bindings from source
can be found at <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12" target="_blank" rel="noopener noreferrer">https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-autobindings-v0.0.12</a></p>
<!-- --><hr>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="help-us-go-further">Help us go further!<!-- --><a href="https://docs.cwtch.im/blog/cwtch-1-14#help-us-go-further" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>We couldn't do what we do without all the wonderful community support we get, from <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">one-off donations</a> to <!-- --><a href="https://www.patreon.com/openprivacy" target="_blank" rel="noopener noreferrer">recurring support via Patreon</a>.<!-- --></p>
<!-- --><p>If you want to see us move faster on some of these goals and are in a position to, please <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">donate</a>. If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.<!-- --></p>
<!-- --><p>Donations of <!-- --><strong>$5 or more</strong> can opt to receive stickers as a thank-you gift!<!-- --></p>
<!-- --><p>For more information about donating to Open Privacy and claiming a thank you gift <!-- --><a href="https://openprivacy.ca/donate/" target="_blank" rel="noopener noreferrer">please visit the Open Privacy Donate page</a>.<!-- --></p>
<!-- --><p><img loading="lazy" alt="A Photo of Cwtch Stickers" src="https://docs.cwtch.im/assets/images/stickers-new-1e9b14bdd638b4907cce833e813a09ad.jpg" width="1024" height="768" class="img_ev3q"></p>]]></content:encoded>
<category>cwtch</category>
<category>cwtch-stable</category>
<category>release</category>
</item>
<item>
<title><![CDATA[Enhanced Permissions]]></title>
<link>https://docs.cwtch.im/blog/enhanced-permissions</link>
@ -1018,38 +1077,5 @@ without an associated decoration).<!-- --></p>
<category>support</category>
<category>testing</category>
</item>
<item>
<title><![CDATA[Making Cwtch Android Bindings Reproducible]]></title>
<link>https://docs.cwtch.im/blog/cwtch-android-reproducibility</link>
<guid>https://docs.cwtch.im/blog/cwtch-android-reproducibility</guid>
<pubDate>Fri, 10 Feb 2023 00:00:00 GMT</pubDate>
<description><![CDATA[In this devlog we revisit reproducible builds and make Cwtch Android bindings reproducible]]></description>
<content:encoded><![CDATA[<p>In this development log, we continue our previous work on <!-- --><a href="https://docs.cwtch.im/blog/cwtch-bindings-reproducible" target="_blank" rel="noopener noreferrer">reproducible Cwtch bindings</a>, uncovering the final few sources of variation between our <!-- --><a href="https://git.openprivacy.ca/openprivacy/repliqate" target="_blank" rel="noopener noreferrer">Repliqate</a> scripts and our docker/drone builds, leading to fully reproducible builds for Cwtch Android bindings!<!-- --></p>
<!-- --><p><img loading="lazy" src="https://docs.cwtch.im/assets/images/devlog6-047cb55e43376529b3899ac2a0792f9c.png" width="1005" height="481" class="img_ev3q"></p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="changes-necessary-for-reproducible-android-bindings">Changes Necessary for Reproducible Android Bindings<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#changes-necessary-for-reproducible-android-bindings" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>After a thorough investigation of the build artifacts produced by Repliqate and Drone we uncovered three additional sources of variation:</p>
<!-- --><ul>
<!-- --><li><strong>Insufficient path stripping introduced by Android NDK tools</strong> - it turns out that Android builds using NDK versions below 22 are not reproducible as they produce randomized artifacts (through unstripped temporary directory paths appearing in compiled binares). NDK 22 <!-- --><a href="https://github.com/android/ndk/wiki/Changelog-r22" target="_blank" rel="noopener noreferrer">changed the binutils and default linker</a> to versions that correctly strip such paths from build artifacts. As such it was necessary for us to update the NDK version we used. We chose the technically outdated NDK 22 rather than the more modern NDK 25 to minimize Android OS compatibility changes during this switch. However, per our <!-- --><a href="https://docs.cwtch.im/blog/cwtch-platform-support" target="_blank" rel="noopener noreferrer">long term support plan</a>, we will be moving towards adopting the latest NDK in the future.<!-- --></li>
<!-- --><li><strong>Paths in DWARF entries</strong> - while we have been unable to track down exactly where these are being introduced, we did track the final difference in the produced bindings to DWARF debug lines embedded in compiled ELF binaries. These entries encoded the actual location of the NDK on the disk of the build machine, instead of the symbolic link that we believed should have been followed. By physically placing the NDK at same location in repliqate as in our Docker container we were able to get these entries to be consistent - however there is still work to do to understand exactly why they are being introduced at all.<!-- --></li>
<!-- --></ul>
<!-- --><figure><p><a target="_blank" href="https://docs.cwtch.im/assets/files/aar-diff-cefdff70043215f9b9244cbc0a179078.png"><img loading="lazy" src="https://docs.cwtch.im/assets/images/aar-diff-cefdff70043215f9b9244cbc0a179078.png" width="1863" height="428" class="img_ev3q"></a></p><figcaption>Vimdiff comparing the decoded (<!-- --><code>readelf --debug-dump=line</code>) DWARF debug section of Drone-produced Android bindings v.s. Repliqate-produced. The difference in paths is highlighted.<!-- --></figcaption></figure>
<!-- --><ul>
<!-- --><li><strong>Go Compiler Acquisition</strong> - our Docker container was compiling the Go compiler from source, while Repliqate was downloading a pre-compiled version. During debugging we changed the Dockerfile to also download the pre-compiled version in order to eliminate the difference as a potential reproducibility issue. Our tests indicated that there <!-- --><em>was</em> a difference between artifacts produced by the precompiled compiler v.s. one built from source - this is likely explained by introduced environmental differences caused by the compilation of the compiler itself e.g. the contents/versions of modules in the Go package cache which we have seen as having an impact on other produced binaries.<!-- --></li>
<!-- --></ul>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="repliqate-scripts">Repliqate Scripts<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#repliqate-scripts" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>With those issues now fixed, Cwtch Android bindings are <!-- --><strong>officially reproducible!</strong> The first version that officially met this requirement was 1.10.5, and you can find the Repliqate script under <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/src/branch/main/cwtch-bindings-v1.10.5/libcwtch.v1.10.5-android.script" target="_blank" rel="noopener noreferrer">cwtch-bindings-v1.10.5/libcwtch.v1.10.5-android.script</a> in the <!-- --><a href="https://git.openprivacy.ca/cwtch.im/repliqate-scripts/" target="_blank" rel="noopener noreferrer">Cwtch Repliqate scripts repository</a>.<!-- --></p>
<!-- --><p>This is another big milestone towards our ultimate goal of full reproducibility for Cwtch releases.</p>
<!-- --><h2 class="anchor anchorWithStickyNavbar_LWe7" id="help-us-go-further">Help us go further!<!-- --><a href="https://docs.cwtch.im/blog/cwtch-android-reproducibility#help-us-go-further" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading"></a></h2>
<!-- --><p>We couldn't do what we do without all the wonderful community support we get, from <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">one-off donations</a> to <!-- --><a href="https://www.patreon.com/openprivacy" target="_blank" rel="noopener noreferrer">recurring support via Patreon</a>.<!-- --></p>
<!-- --><p>If you want to see us move faster on some of these goals and are in a position to, please <!-- --><a href="https://openprivacy.ca/donate" target="_blank" rel="noopener noreferrer">donate</a>. If you happen to be at a company that wants to do more for the community and this aligns, please consider donating or sponsoring a developer.<!-- --></p>
<!-- --><p>Donations of <!-- --><strong>$5 or more</strong> can opt to receive stickers as a thank-you gift!<!-- --></p>
<!-- --><p>For more information about donating to Open Privacy and claiming a thank you gift <!-- --><a href="https://openprivacy.ca/donate/" target="_blank" rel="noopener noreferrer">please visit the Open Privacy Donate page</a>.<!-- --></p>
<!-- --><p><img loading="lazy" alt="A Photo of Cwtch Stickers" src="https://docs.cwtch.im/assets/images/stickers-new-1e9b14bdd638b4907cce833e813a09ad.jpg" width="1024" height="768" class="img_ev3q"></p>]]></content:encoded>
<category>cwtch</category>
<category>cwtch-stable</category>
<category>reproducible-builds</category>
<category>bindings</category>
<category>repliqate</category>
</item>
</channel>
</rss>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More