mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-09-27 17:58:47 +00:00
1292 lines
101 KiB
HTML
1292 lines
101 KiB
HTML
|
|
<!DOCTYPE html>
|
|
<html lang="en"
|
|
|
|
|
|
dir="ltr"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>
|
|
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<script>if (localStorage.getItem('theme') === 'dark' || (!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches)) document.documentElement.classList.add('dark')</script>
|
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title></title>
|
|
<meta name="Content-Type" content="text/html;charset=utf-8"/>
|
|
|
|
<link rel="icon" type="image/png" sizes="96x96" href="/img/favicon.ico"/>
|
|
<meta name="theme-color" content="#ffffff">
|
|
<link href="/css/tailwind.css" rel="stylesheet"/>
|
|
<link id="prism-theme" rel="stylesheet" href="/css/prism-light.min.css"/>
|
|
<link href="/css/style.css" rel="stylesheet"/>
|
|
<link rel="stylesheet" href="/css/doc.css"/>
|
|
<link rel="stylesheet" href="/css/design3-nav.css">
|
|
<script async defer src="https://buttons.github.io/buttons.js"></script>
|
|
</head>
|
|
|
|
<body class="bg-white dark:bg-[#000832]">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<header id="navbar">
|
|
<a href="/" class="logo logo-light ltr:mr-auto rtl:ml-auto"><img src="/img/new/logo-light.png" alt="logo"></a>
|
|
<a href="/" class="logo logo-dark ltr:mr-auto rtl:ml-auto"><img src="/img/new/logo-dark.png" alt="logo"></a>
|
|
|
|
<nav id="menu">
|
|
<ul>
|
|
<li class="nav-link ">
|
|
<a href="/">
|
|
<span class="nav-link-text">Home</span>
|
|
</a>
|
|
</li>
|
|
|
|
<hr>
|
|
|
|
<li class="nav-link ">
|
|
<a href="/directory/">
|
|
<span class="nav-link-text">Directory</span>
|
|
</a>
|
|
</li>
|
|
|
|
<!-- <hr>
|
|
|
|
<li class="nav-link send-file ">
|
|
<a href="/file/">
|
|
<span class="nav-link-text">Send file</span>
|
|
</a>
|
|
</li>
|
|
|
|
<hr> -->
|
|
|
|
<li class="nav-link">
|
|
<a href="javascript:void(0);">
|
|
<span class="">Guide</span>
|
|
<span href="" id="btn-mobile">
|
|
<svg viewBox="0 0 10 6" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.50447 0.902966C1.21571 0.627397 0.747525 0.627397 0.458761 0.902966C0.169996 1.17853 0.169996 1.62532 0.458761 1.90089L4.21933 5.48961C4.25543 5.52406 4.29433 5.5542 4.33533 5.58003C4.62234 5.76088 5.01237 5.73074 5.26504 5.48961L9.02561 1.90089C9.31438 1.62532 9.31438 1.17853 9.02561 0.902966C8.73685 0.627397 8.26867 0.627397 7.97991 0.902966L4.74219 3.99273L1.50447 0.902966Z"/>
|
|
</svg>
|
|
</span>
|
|
</a>
|
|
|
|
<ul class="sub-menu">
|
|
|
|
<li><a href="/docs/guide/readme.html" class="">Quick start</a></li>
|
|
|
|
<li><a href="/docs/guide/send-messages.html" class="">Sending messages</a></li>
|
|
|
|
<li><a href="/docs/guide/secret-groups.html" class="">Secret groups</a></li>
|
|
|
|
<li><a href="/docs/guide/chat-profiles.html" class="">Chat profiles</a></li>
|
|
|
|
<li><a href="/docs/guide/managing-data.html" class="">Managing data</a></li>
|
|
|
|
<li><a href="/docs/guide/audio-video-calls.html" class="">Audio & video Calls</a></li>
|
|
|
|
<li><a href="/docs/guide/privacy-security.html" class="">Privacy & security</a></li>
|
|
|
|
<li><a href="/docs/guide/app-settings.html" class="">App settings</a></li>
|
|
|
|
<li><a href="/docs/guide/making-connections.html" class="">Making connections</a></li>
|
|
|
|
</ul>
|
|
</li>
|
|
|
|
<hr>
|
|
|
|
<li class="nav-link">
|
|
<a href="javascript:void(0);">
|
|
<span class="">Reference</span>
|
|
<span href="" id="btn-mobile">
|
|
<svg viewBox="0 0 10 6" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.50447 0.902966C1.21571 0.627397 0.747525 0.627397 0.458761 0.902966C0.169996 1.17853 0.169996 1.62532 0.458761 1.90089L4.21933 5.48961C4.25543 5.52406 4.29433 5.5542 4.33533 5.58003C4.62234 5.76088 5.01237 5.73074 5.26504 5.48961L9.02561 1.90089C9.31438 1.62532 9.31438 1.17853 9.02561 0.902966C8.73685 0.627397 8.26867 0.627397 7.97991 0.902966L4.74219 3.99273L1.50447 0.902966Z"/>
|
|
</svg>
|
|
</span>
|
|
</a>
|
|
|
|
<ul class="sub-menu">
|
|
<li><a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md"
|
|
target="_blank">Whitepaper
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a></li>
|
|
<li><a href="/privacy">Privacy Policy</a></li>
|
|
<li><a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/simplex-messaging.md"
|
|
target="_blank">SMP protocol
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a></li>
|
|
<li><a href="/docs/protocol/simplex-chat.html">Chat protocol</a></li>
|
|
<li><a href="/docs/glossary.html">Glossary</a></li>
|
|
|
|
<hr>
|
|
|
|
|
|
<li><a href="/docs/simplex.html" class=" lg:px-[20px] inline-block whitespace-nowrap">SimpleX network</a></li>
|
|
|
|
<li><a href="/docs/business.html" class=" lg:px-[20px] inline-block whitespace-nowrap">SimpleX for business</a></li>
|
|
|
|
<li><a href="/docs/directory.html" class=" lg:px-[20px] inline-block whitespace-nowrap">SimpleX Directory</a></li>
|
|
|
|
<li><a href="/docs/android.html" class=" lg:px-[20px] inline-block whitespace-nowrap">Accessing Android files</a></li>
|
|
|
|
<li><a href="/docs/server.html" class=" lg:px-[20px] inline-block whitespace-nowrap">Host SMP Server</a></li>
|
|
|
|
<li><a href="/docs/xftp-server.html" class=" lg:px-[20px] inline-block whitespace-nowrap">Host XFTP Server</a></li>
|
|
|
|
<li><a href="/docs/chat-relay.html" class=" lg:px-[20px] inline-block whitespace-nowrap">Host Chat Relay</a></li>
|
|
|
|
<li><a href="/docs/webrtc.html" class=" lg:px-[20px] inline-block whitespace-nowrap">WebRTC servers</a></li>
|
|
|
|
<li><a href="/downloads/" class=" lg:px-[20px] inline-block whitespace-nowrap">Downloads</a></li>
|
|
|
|
<li><a href="/reproduce/" class=" lg:px-[20px] inline-block whitespace-nowrap">Verify & reproduce builds</a></li>
|
|
|
|
<li><a href="/transparency/" class=" lg:px-[20px] inline-block whitespace-nowrap">Transparency</a></li>
|
|
|
|
<li><a href="/security/" class=" lg:px-[20px] inline-block whitespace-nowrap">Security</a></li>
|
|
|
|
<li><a href="/faq/" class=" lg:px-[20px] inline-block whitespace-nowrap">FAQ</a></li>
|
|
|
|
|
|
<hr>
|
|
|
|
<li><a href="/docs/translations.html"
|
|
>Translate SimpleX Chat
|
|
</a></li>
|
|
<li><a href="/docs/android.html"
|
|
>Accessing Android files
|
|
</a></li>
|
|
<li><a href="https://github.com/simplex-chat/simplex-chat/blob/stable/apps/simplex-bot-advanced/Main.hs"
|
|
target="_blank">Chat bot example
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a></li>
|
|
<li><a href="https://github.com/simplex-chat/simplex-chat/tree/stable/packages/simplex-chat-client/typescript"
|
|
target="_blank">TypeScript SDK
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a></li>
|
|
<li><a href="/docs/cli.html">Terminal CLI</a></li>
|
|
<li><a href="https://github.com/simplex-chat/simplexmq"
|
|
target="_blank">SimpleXMQ
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a></li>
|
|
</ul>
|
|
</li>
|
|
|
|
<hr>
|
|
|
|
<li class="nav-link ">
|
|
<a href="/links">
|
|
<span class="nav-link-text">Community</span>
|
|
</a>
|
|
</li>
|
|
|
|
<li class="nav-link ">
|
|
<a href="/blog">
|
|
<span class="nav-link-text">Blog</span>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
|
|
<div class="right-links">
|
|
|
|
<a class="box-btn token md:hidden" href="/crowdfunding/">
|
|
Invest
|
|
</a>
|
|
|
|
<button href="#" class="theme-switch-btn">
|
|
<svg class="sun" width="469" height="469" viewBox="0 0 469 469" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M225.768 1.44594C220.301 3.84594 214.701 10.6459 213.768 15.9793C213.234 18.3793 213.101 31.7126 213.368 45.7126L213.768 71.1793L217.634 76.1126C226.701 88.1126 242.968 87.5793 252.301 75.0459C254.968 71.5793 255.101 69.5793 255.101 42.2459C255.101 14.9126 254.968 12.9126 252.301 9.44594C250.834 7.44594 248.034 4.51261 246.168 3.17928C241.768 -0.154057 231.101 -1.08739 225.768 1.44594Z"/>
|
|
<path d="M72.9687 65.3128C63.7687 71.5794 60.1687 81.4461 63.7687 91.1794C65.502 95.4461 98.702 129.446 104.035 132.379C106.035 133.446 110.569 134.246 114.035 134.246C126.035 134.246 134.435 125.846 134.435 113.846C134.435 110.379 133.635 105.846 132.569 103.846C129.635 98.5128 95.6353 65.3128 91.3687 63.5794C85.102 61.3128 77.902 61.9794 72.9687 65.3128Z"/>
|
|
<path d="M377.102 63.7128C373.102 65.3128 338.969 98.7794 336.302 103.846C335.236 105.846 334.436 110.379 334.436 113.846C334.436 125.846 342.836 134.246 354.836 134.246C358.302 134.246 362.836 133.446 364.836 132.379C370.169 129.446 403.369 95.4461 405.102 91.1794C408.702 81.4461 405.102 71.5794 395.902 65.3128C391.102 61.9794 383.102 61.3128 377.102 63.7128Z"/>
|
|
<path d="M211.635 108.246C185.635 113.179 163.502 125.046 144.302 144.112C117.902 170.512 104.968 203.579 106.835 240.246C109.768 297.712 149.102 344.912 205.902 359.179C218.568 362.379 250.302 362.379 262.968 359.179C310.435 347.312 345.768 312.646 358.702 265.046C362.435 251.446 362.835 219.446 359.368 205.712C347.368 158.112 312.302 122.379 265.235 110.112C251.768 106.512 225.502 105.579 211.635 108.246Z"/>
|
|
<path d="M12.4349 214.779C-0.498477 220.379 -4.09848 237.579 5.23486 248.246C11.2349 255.046 15.6349 255.846 45.3682 255.313C74.0349 254.913 75.1015 254.646 81.6349 245.713C85.9015 239.979 85.5015 228.113 80.8349 221.979C74.4349 213.713 71.2349 212.913 42.1682 212.913C23.7682 213.046 15.2349 213.579 12.4349 214.779Z"/>
|
|
<path d="M396.035 215.179C393.635 216.379 390.035 219.445 388.035 221.979C383.368 228.112 382.968 239.979 387.235 245.712C394.035 254.779 394.301 254.912 426.435 254.912C458.568 254.912 458.835 254.779 465.635 245.712C469.501 240.512 469.501 227.979 465.635 222.779C458.968 213.845 458.301 213.579 428.035 213.179C404.435 212.912 399.768 213.179 396.035 215.179Z"/>
|
|
<path d="M103.101 336.779C96.7013 340.779 65.368 373.179 63.768 377.313C57.368 394.513 74.168 411.313 91.368 404.913C95.6347 403.179 129.635 369.979 132.568 364.646C135.368 359.446 134.968 349.046 131.768 343.846C126.168 334.646 112.035 331.179 103.101 336.779Z"/>
|
|
<path d="M344.035 336.912C341.635 338.379 338.569 341.445 337.102 343.845C333.902 349.045 333.502 359.445 336.302 364.645C339.235 369.979 373.235 403.179 377.502 404.912C387.235 408.512 397.102 404.912 403.369 395.712C406.702 390.779 407.369 383.579 405.102 377.312C403.369 373.045 370.169 339.045 364.835 336.112C359.635 333.312 349.235 333.712 344.035 336.912Z"/>
|
|
<path d="M225.368 385.712C222.968 387.046 219.368 390.112 217.368 392.646L213.768 397.312V426.379C213.768 458.246 213.901 458.779 222.968 465.446C228.168 469.312 240.701 469.312 245.901 465.446C254.834 458.779 255.101 457.979 255.501 428.246C256.034 397.579 255.234 394.379 246.834 387.979C241.101 383.579 231.634 382.512 225.368 385.712Z"/>
|
|
</svg>
|
|
|
|
<svg class="moon" width="469" height="469" viewBox="5 5 20 23" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M10.895 7.574c0 7.55 5.179 13.67 11.567 13.67 1.588 0 3.101-0.38 4.479-1.063-1.695 4.46-5.996 7.636-11.051 7.636-6.533 0-11.83-5.297-11.83-11.83 0-4.82 2.888-8.959 7.023-10.803-0.116 0.778-0.188 1.573-0.188 2.39z"></path>
|
|
</svg>
|
|
</button>
|
|
|
|
|
|
<div class="nav-link flag-container">
|
|
<a href="javascript:void(0);">
|
|
|
|
|
|
<p style="text-align:center;">en</p>
|
|
<svg viewBox="0 0 10 6" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.50447 0.902966C1.21571 0.627397 0.747525 0.627397 0.458761 0.902966C0.169996 1.17853 0.169996 1.62532 0.458761 1.90089L4.21933 5.48961C4.25543 5.52406 4.29433 5.5542 4.33533 5.58003C4.62234 5.76088 5.01237 5.73074 5.26504 5.48961L9.02561 1.90089C9.31438 1.62532 9.31438 1.17853 9.02561 0.902966C8.73685 0.627397 8.26867 0.627397 7.97991 0.902966L4.74219 3.99273L1.50447 0.902966Z"/>
|
|
</svg>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</a>
|
|
|
|
<ul class="sub-menu">
|
|
|
|
|
|
|
|
|
|
<li>
|
|
<a href="/docs/protocol/badges-overview.html">
|
|
<p>English</p>
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
<button id="cross-btn" class="nav-toggle-btn">
|
|
<svg id="cross" viewBox="0 0 13 13" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M12.7973 11.5525L7.59762 6.49833L12.7947 1.44675C13.055 1.19371 13.0658 0.771991 12.8188 0.505331C12.5718 0.238674 12.1602 0.227644 11.8999 0.480681L6.65343 5.58028L1.09979 0.182228C0.839522 -0.070157 0.427909 -0.059127 0.18094 0.207531C-0.0660305 0.474191 -0.0552645 0.895911 0.205003 1.14894L5.70862 6.49833L0.20247 11.851C-0.0577975 12.104 -0.0685635 12.5257 0.178407 12.7924C0.306324 12.9306 0.477936 13 0.650181 13C0.811033 13 0.971873 12.9397 1.09726 12.817L6.65343 7.41639L11.9025 12.5186C12.0285 12.6406 12.1893 12.7015 12.3495 12.7015C12.5218 12.7015 12.6934 12.6321 12.8213 12.4939C13.0689 12.2273 13.0582 11.8062 12.7973 11.5525Z" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</header>
|
|
<div id="mobile-header">
|
|
<a href="/" class="logo flex dark:hidden ltr:mr-auto rtl:ml-auto"><img src="/img/new/logo-symbol-light.svg" alt="" srcset=""></a>
|
|
<a href="/" class="logo hidden dark:flex ltr:mr-auto rtl:ml-auto"><img src="/img/new/logo-symbol-dark.svg" alt="" srcset=""></a>
|
|
|
|
<button id="hamburger" class="nav-toggle-btn">
|
|
<svg viewBox="0 0 100 80" width="36" height="36">
|
|
<rect width="100" height="15"></rect>
|
|
<rect y="30" width="100" height="15"></rect>
|
|
<rect y="60" width="100" height="15"></rect>
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
|
|
|
|
<script>(function () {
|
|
var VALID = /^[\w.-]{1,40}$/;
|
|
var KEYS = ['utm_source', 'utm_campaign'];
|
|
|
|
function fromUrl(name) {
|
|
var hash = new URLSearchParams(location.hash.replace(/^#\??/, '')).get(name);
|
|
var query = new URLSearchParams(location.search).get(name);
|
|
var value = hash != null ? hash : query;
|
|
return value && VALID.test(value) ? value : null;
|
|
}
|
|
|
|
function remember(name, value) {
|
|
try {
|
|
if (value) sessionStorage.setItem(name, value);
|
|
return value || sessionStorage.getItem(name);
|
|
} catch (e) {
|
|
return value;
|
|
}
|
|
}
|
|
|
|
var utm = {};
|
|
KEYS.forEach(function (name) {
|
|
var value = remember(name, fromUrl(name));
|
|
if (value && VALID.test(value)) utm[name] = value;
|
|
});
|
|
|
|
if (!utm.utm_source && !utm.utm_campaign) return;
|
|
|
|
function fill(name, value) {
|
|
if (!value) return;
|
|
document.querySelectorAll('input[name="' + name + '"]').forEach(function (input) {
|
|
input.value = value;
|
|
});
|
|
}
|
|
|
|
function withUtm(href) {
|
|
var url = new URL(href, location.href);
|
|
KEYS.forEach(function (name) {
|
|
if (utm[name]) url.searchParams.set(name, utm[name]);
|
|
});
|
|
return url.toString();
|
|
}
|
|
|
|
function apply() {
|
|
fill('SOURCE', utm.utm_source);
|
|
fill('CAMPAIGN', utm.utm_campaign);
|
|
|
|
if (/^\/blog(\/|$)/.test(location.pathname)) return;
|
|
|
|
document.querySelectorAll('a[href^="https://wefunder.com/"]').forEach(function (link) {
|
|
link.href = withUtm(link.getAttribute('href'));
|
|
});
|
|
}
|
|
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', apply);
|
|
} else {
|
|
apply();
|
|
}
|
|
})();
|
|
</script>
|
|
|
|
<script>
|
|
// switch theme
|
|
const sunIcon = document.querySelector('.sun');
|
|
const moonIcon = document.querySelector('.moon');
|
|
|
|
const userTheme = localStorage.getItem('theme');
|
|
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
const prismThemeLink = document.getElementById('prism-theme')
|
|
|
|
function iconToggle () {
|
|
sunIcon.classList.toggle('hidden');
|
|
moonIcon.classList.toggle('hidden');
|
|
}
|
|
|
|
function updateThemeColor() {
|
|
const meta = document.querySelector('meta[name="theme-color"]');
|
|
if (meta) meta.setAttribute('content', getComputedStyle(document.body).backgroundColor);
|
|
const navbar = document.querySelector('header#navbar');
|
|
if (navbar && navbar.classList.contains('open')) {
|
|
navbar.style.transition = 'none';
|
|
navbar.classList.remove('open');
|
|
setTimeout(() => {
|
|
navbar.classList.add('open');
|
|
setTimeout(() => navbar.style.transition = '', 0);
|
|
}, 0);
|
|
}
|
|
}
|
|
|
|
function themeCheck() {
|
|
if (userTheme === 'dark' || (!userTheme && systemTheme)) {
|
|
document.documentElement.classList.add('dark');
|
|
moonIcon.classList.add('hidden');
|
|
if (prismThemeLink) {
|
|
prismThemeLink.setAttribute('href','/css/prism-dark.min.css')
|
|
}
|
|
}
|
|
else{
|
|
sunIcon.classList.add('hidden');
|
|
if (prismThemeLink) {
|
|
prismThemeLink.setAttribute('href','/css/prism-light.min.css')
|
|
}
|
|
}
|
|
updateThemeColor();
|
|
}
|
|
themeCheck();
|
|
|
|
function themeSwitch () {
|
|
if (document.documentElement.classList.contains('dark')) {
|
|
document.documentElement.classList.remove('dark');
|
|
localStorage.setItem('theme', 'light');
|
|
if(prismThemeLink){
|
|
prismThemeLink.setAttribute('href','/css/prism-light.min.css')
|
|
}
|
|
iconToggle();
|
|
} else {
|
|
document.documentElement.classList.add('dark');
|
|
localStorage.setItem('theme', 'dark');
|
|
if (prismThemeLink) {
|
|
prismThemeLink.setAttribute('href','/css/prism-dark.min.css')
|
|
}
|
|
iconToggle();
|
|
}
|
|
updateThemeColor();
|
|
}
|
|
|
|
const nav = document.querySelector('header#navbar');
|
|
|
|
window.addEventListener('click',(e)=>{
|
|
if(e.target.closest('.nav-link')){
|
|
if(e.target.closest('.nav-link').classList.contains('active')){
|
|
e.target.closest('.nav-link').classList.remove('active');
|
|
}
|
|
else{
|
|
document.querySelectorAll('.nav-link').forEach(el => el.classList.remove('active'))
|
|
e.target.closest('.nav-link').classList.add('active');
|
|
}
|
|
}
|
|
else if(e.target.closest('.nav-toggle-btn')){
|
|
if(nav.classList.contains('open')){
|
|
nav.classList.remove('open');
|
|
document.getElementById('mobile-header').classList.remove('nav-open');
|
|
document.documentElement.classList.remove('lock-scroll');
|
|
}
|
|
else{
|
|
document.documentElement.classList.add('lock-scroll');
|
|
document.getElementById('mobile-header').classList.add('nav-open');
|
|
nav.classList.add('open');
|
|
}
|
|
}
|
|
else if(e.target.closest('.theme-switch-btn')){
|
|
themeSwitch();
|
|
}
|
|
});
|
|
</script>
|
|
|
|
<section id="doc" class="bg-white dark:bg-[#000832] mt-[66px]">
|
|
<div>
|
|
<main>
|
|
<aside class="sidebar px-4 lg:px-7">
|
|
<div class="h-[66px] lg:h-0">
|
|
<a href="/" class="h-full flex dark:hidden lg:hidden items-center ltr:mr-auto rtl:ml-auto"><img class="w-auto max-h-[50px] pr-10" src="/img/new/logo-light.png" alt="logo"/></a>
|
|
<a href="/" class="h-full hidden dark:flex dark:lg:hidden items-center ltr:mr-auto rtl:ml-auto"><img class="w-auto max-h-[50px] pr-10" src="/img/new/logo-dark.png" alt="logo"/></a>
|
|
</div>
|
|
<ul class="!my-4">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="">Guide</p>
|
|
<ul>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/readme.html">Quick start</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/send-messages.html">Sending messages</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/secret-groups.html">Secret groups</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/channel-webpage.html">Channel webpage</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/chat-profiles.html">Chat profiles</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/managing-data.html">Managing data</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/audio-video-calls.html">Audio & video Calls</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/privacy-security.html">Privacy & security</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/app-settings.html">App settings</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/guide/making-connections.html">Making connections</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="">Reference</p>
|
|
<ul>
|
|
|
|
<li>
|
|
<a class="" href="/docs/simplex.html">SimpleX platform</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/business.html">SimpleX for business</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/directory.html">SimpleX Directory</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/android.html">Accessing files in Android app</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/cli.html">Terminal CLI</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/contributing.html">Contributing guide</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/server.html">Hosting your own SMP Server</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/translations.html">Contributing SimpleX app translations</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/webrtc.html">Using custom WebRTC ICE servers</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/xftp-server.html">Hosting your own XFTP Server</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/docs/chat-relay.html">Hosting your own Chat Relay</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/downloads/">Download SimpleX apps</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/reproduce/">Verify and reproduce builds</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/transparency/">Transparency Reports</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/security/">Security Policy</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a class="" href="/faq/">Frequently Asked Questions</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="">Protocol</p>
|
|
<ul>
|
|
|
|
<li>
|
|
<a class="" href="/docs/protocol/simplex-chat.html">SimpleX Chat Protocol</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
</ul>
|
|
</aside>
|
|
<article class="content px-4 lg:px-7">
|
|
|
|
|
|
|
|
<!-- <div class="sticky top-[66px] bg-white dark:bg-[#071C46] z-[49] !py-2 lg:hidden">
|
|
<div class="relative flex items-center justify-between">
|
|
<button class="menu flex items-center gap-2">
|
|
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" viewBox="0 0 24 24" class="menu-icon h-4 w-4 fill-[rgb(60,60,60)] dark:fill-white">
|
|
<path d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"></path>
|
|
<path d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"></path>
|
|
<path d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"></path>
|
|
<path d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"></path>
|
|
</svg>
|
|
<span class="!text-[rgb(60,60,60)] dark:!text-white">Menu</span>
|
|
</button>
|
|
|
|
<div class="nav-link">
|
|
<a href="javascript:void(0);" class="flex items-center gap-2 !no-underline !text-[rgb(60,60,60)] dark:!text-white">
|
|
<span class="">On this page</span>
|
|
<span href="" id="btn-mobile" class="flex items-center justify-center h-auto w-auto mt-1">
|
|
<svg class="fill-black dark:fill-white" width="10" height="6" viewBox="0 0 10 6" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M1.50447 0.902966C1.21571 0.627397 0.747525 0.627397 0.458761 0.902966C0.169996 1.17853 0.169996 1.62532 0.458761 1.90089L4.21933 5.48961C4.25543 5.52406 4.29433 5.5542 4.33533 5.58003C4.62234 5.76088 5.01237 5.73074 5.26504 5.48961L9.02561 1.90089C9.31438 1.62532 9.31438 1.17853 9.02561 0.902966C8.73685 0.627397 8.26867 0.627397 7.97991 0.902966L4.74219 3.99273L1.50447 0.902966Z"/>
|
|
</svg>
|
|
</span>
|
|
</a>
|
|
|
|
<ul class="flex flex-col items-start gap-2 absolute bg-white dark:bg-black top-full left-0 right-0 mt-[10px] w-full h-auto rounded-md shadow-[0_0_3px_rgb(60_72_88_/_15%)] sub-menu hash-list">
|
|
<li class="mb-5">
|
|
<a href="#" id="back-to-top">Back to top</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div> -->
|
|
<div><p>Revision 1, 2026-09-18</p>
|
|
<h1 id="simplex-supporter-badges" tabindex="-1">SimpleX Supporter Badges</h1>
|
|
<h2 id="table-of-contents" tabindex="-1">Table of contents</h2>
|
|
<ul>
|
|
<li><a href="#introduction">Introduction</a>
|
|
<ul>
|
|
<li><a href="#what-is-a-badge">What is a badge</a></li>
|
|
<li><a href="#what-a-badge-grants">What a badge grants</a></li>
|
|
<li><a href="#what-a-badge-discloses">What a badge discloses</a></li>
|
|
<li><a href="#comparison-with-signal-badges">Comparison with Signal badges</a></li>
|
|
<li><a href="#non-goals">Non-goals</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#architecture">Architecture</a>
|
|
<ul>
|
|
<li><a href="#participants">Participants</a></li>
|
|
<li><a href="#service-requests">Service requests</a></li>
|
|
<li><a href="#buying-and-redeeming">Buying and redeeming</a></li>
|
|
<li><a href="#monthly-issuance">Monthly issuance</a></li>
|
|
<li><a href="#presentation">Presentation</a></li>
|
|
<li><a href="#servers">Servers</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#cryptographic-primitives">Cryptographic primitives</a></li>
|
|
<li><a href="#security">Security</a>
|
|
<ul>
|
|
<li><a href="#design-objectives">Design objectives</a></li>
|
|
<li><a href="#threat-model">Threat model</a></li>
|
|
</ul>
|
|
</li>
|
|
<li><a href="#future-work">Future work</a></li>
|
|
</ul>
|
|
<h2 id="introduction" tabindex="-1">Introduction</h2>
|
|
<p>The goal is for SimpleX Chat to be partly funded by its users, who buy supporter badges. A badge is shown on the profile of the person who bought it, and it raises the limits that other users and servers apply to that person's files. This document describes what a badge is, what it grants, how it is issued and presented, and what it discloses about the holder.</p>
|
|
<p>A badge is stored in the user's profile on the device, and it is presented as proofs that cannot be linked to each other or to the purchase. The SimpleX network has no accounts, and a paid feature must not introduce one: in other messengers a paid feature is attached to an account, and the operator sees in one record who paid and what they did with the feature.</p>
|
|
<h3 id="what-is-a-badge" tabindex="-1">What is a badge</h3>
|
|
<p>A badge is a credential issued by the badge service, a bot operated by SimpleX Chat. The credential is a <a href="https://datatracker.ietf.org/doc/draft-irtf-cfrg-bbs-signatures/">BBS signature</a> over four values: a master key generated by the app; the expiry date; the badge type, currently <code>supporter</code> or <code>legend</code>; and a reserved field that is currently empty.</p>
|
|
<p>The holder of a BBS signature can prove that the issuer signed certain values, disclose some of those values, and keep the other values and the signature itself secret. The credential itself is therefore not sent to anyone. When the badge is to be shown or used, the app generates a proof that discloses the badge type, the expiry date and the reserved field, names the issuer key by its index, and hides the master key and the signature. Two proofs from the same credential cannot be linked to each other, by the issuer or by anyone else. Each proof is generated for one context, whether a conversation, a file or a session with a server, and is not accepted in any other.</p>
|
|
<p>The transport protocols of the network call the same credential an entitlement: a name, an expiry and an extra string, disclosed in a proof. The chat application puts the badge type into the name, so a server that verifies an entitlement and a contact who sees a badge are looking at different zero-knowledge proofs of the same credential.</p>
|
|
<h3 id="what-a-badge-grants" tabindex="-1">What a badge grants</h3>
|
|
<ul>
|
|
<li>A badge is shown on the profile to contacts, to the members of groups, and to the subscribers of channels.</li>
|
|
<li>A badge allows larger files. The default limit is 1GB; a supporter can send files up to 2GB, and a legend up to 5GB. The limit is applied by the recipient, whose app verifies the sender's proof before it accepts a file above the default size.</li>
|
|
<li>A badge extends the storage of files on servers. An XFTP server stores a file for 48 hours by default. It may be configured to store files for longer when they are uploaded by the holder of a badge of a given type; the example values in the server configuration file are 7 and 21 days for supporter and legend badge holders, respectively.</li>
|
|
</ul>
|
|
<p>Two other uses are planned and described under <a href="#future-work">Future work</a>:</p>
|
|
<ul>
|
|
<li>A backup will be a link whose content the app replaces each time it makes a new backup, so that the same link restores the latest state. A badge will raise the size of the backup and the time it is stored, and the storage time is then the period the app can remain offline before the backup is lost.</li>
|
|
<li>Servers that verify the proof will apply higher rate limits when creating messaging queues, file chunks and notification tokens.</li>
|
|
</ul>
|
|
<h3 id="what-a-badge-discloses" tabindex="-1">What a badge discloses</h3>
|
|
<p>The badge service holds the purchase key, the number of months bought, and the payment record of the purchase. A card payment is linked to the purchase, as in any other service; a user who wants the payment itself to be private may pay with cryptocurrency. In either case the record is held by the service alone, and the service does not learn where the badge is later shown or used, because a zero-knowledge proof contains nothing that refers back to the credential or the purchase.</p>
|
|
<p>A party that verifies a proof learns the badge type and the expiry date. Since all credentials expiring in the same week have the same expiry date, these two values place the holder among the supporters whose badges expire that week.</p>
|
|
<h3 id="comparison-with-signal-badges" tabindex="-1">Comparison with Signal badges</h3>
|
|
<p>Signal sells donation badges using <a href="https://eprint.iacr.org/2019/1416.pdf">receipt credentials</a>. The client obtains a credential against a payment without revealing its account, and then presents the credential once to the account server, which records its serial number, level and expiry against the account and attaches the badge to the account. The payment is not linked to the account cryptographically. The same mechanism is used for Signal's paid backups.</p>
|
|
<p>The differences follow from Signal having accounts and SimpleX not having them.</p>
|
|
<p>In Signal:</p>
|
|
<ul>
|
|
<li>The server holds the list of accounts that have badges.</li>
|
|
<li>The credential can be verified only by the server that issued it.</li>
|
|
<li>The credential is presented once, after which the badge is a property of the account.</li>
|
|
<li>The client requests the credential and redeems it in a single sequence of jobs without delay, so the server can match the request made under the payment with the redemption made under the account by their times and by network address.</li>
|
|
<li>The expiry of a credential is rounded up to the next day.</li>
|
|
</ul>
|
|
<p>In SimpleX:</p>
|
|
<ul>
|
|
<li>A server verifies a proof for one session and cannot link that session to any other.</li>
|
|
<li>A credential can be verified against the issuer's public key by contacts, channel relays and independently operated servers.</li>
|
|
<li>A credential is presented every time the badge is shown or used, with a new proof each time.</li>
|
|
<li>The request for a renewed credential and the profile update that presents it are made on different days.</li>
|
|
<li>All credentials expiring in the same week have the same expiry.</li>
|
|
</ul>
|
|
<table>
|
|
<thead>
|
|
<tr>
|
|
<th>Property</th>
|
|
<th>Signal badges</th>
|
|
<th>SimpleX badges</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>Account required</td>
|
|
<td>Yes</td>
|
|
<td>No</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Operator holds the list of badge holders</td>
|
|
<td>Yes</td>
|
|
<td>No</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Verified by</td>
|
|
<td>The issuing server</td>
|
|
<td>Any party with the issuer's public key</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Presentations per credential</td>
|
|
<td>One</td>
|
|
<td>Unlimited</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Proof bound to the context of presentation</td>
|
|
<td>No</td>
|
|
<td>Yes</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Expiry rounded up to</td>
|
|
<td>The next day</td>
|
|
<td>The end of the following Monday</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Issuance and presentation on different days</td>
|
|
<td>No</td>
|
|
<td>Yes</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Usable on independently operated servers</td>
|
|
<td>No</td>
|
|
<td>Yes</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h3 id="non-goals" tabindex="-1">Non-goals</h3>
|
|
<ul>
|
|
<li>A badge does not restrict anything that is available today: the defaults are unchanged, and a badge only raises them.</li>
|
|
<li>A badge does not create an identity: it has no persistent identifier, it is not linked across conversations, and an incognito profile does not show it.</li>
|
|
<li>A badge cannot be transferred: a code can be redeemed once, and the credential obtained with it is usable only with the master key it was issued for.</li>
|
|
<li>A badge does not exempt its holder from the limits a server applies: it lowers the cost of a resource without removing the limit on it.</li>
|
|
<li>A badge cannot be revoked; credentials are issued for one month at a time instead.</li>
|
|
</ul>
|
|
<h2 id="architecture" tabindex="-1">Architecture</h2>
|
|
<pre><code> ┌─────────────────┐ code ┌──────────────┐ purchase ┌──────────┐
|
|
│ Web purchase │ ────────> │ Holder │ ────────────> │ Issuer │
|
|
└─────────────────┘ │ (the app) │ <──────────── └──────────┘
|
|
└──────┬───────┘ credential
|
|
│ every month
|
|
│ a new proof each time
|
|
┌─────────────────────────┼───────────────────────┐
|
|
│ │ │
|
|
┌────▼─────┐ ┌─────▼──────┐ ┌─────▼──────┐
|
|
│ Contacts,│ │ File │ │ The user's │
|
|
│ groups, │ │ recipients │ │ own servers│
|
|
│ channels │ └────────────┘ └────────────┘
|
|
└──────────┘
|
|
</code></pre>
|
|
<h3 id="participants" tabindex="-1">Participants</h3>
|
|
<ul>
|
|
<li>The issuer is the badge service, a bot on the SimpleX network with a contact address. It holds the secret key with which credentials are signed. Apps and servers hold a list of eight issuer public keys, and every credential includes the index of the key that signed it, so the service can move to the next key without a release of apps or servers.</li>
|
|
<li>The holder is the app. It keeps the credential in the user's profile, generates proofs on the device, and renews the credential every month.</li>
|
|
<li>The verifiers are contacts, group members, channel relays, the recipients of files, and the user's own servers. A verifier holds the issuer public keys and no other information about badges.</li>
|
|
</ul>
|
|
<h3 id="service-requests" tabindex="-1">Service requests</h3>
|
|
<p>The app and the badge service communicate through one-off service requests, a primitive of the SimpleX agent described in <a href="https://github.com/simplex-chat/simplexmq/blob/master/rfcs/2026-07-11-service-rpc.md">One-off requests to service addresses</a>. Although the service has a contact address, it is not a contact of the app, and no conversation with it exists.</p>
|
|
<p>A request is a single message to the service's address. The app establishes a double ratchet, with post-quantum key agreement, from the keys published in the service's address link, encrypts the request with the double ratchet, and sends it to the address queue on the service's server in the same way as any message to a server chosen by another party, that is, through a proxy server when private routing is enabled (which is the default). With the request the app sends the address of a reply queue that it created for this request on one of its own servers. The service decrypts the request with a receiving ratchet initialised from its private keys, sends the reply to the reply queue under the same ratchet, and deletes its state; the app deletes the reply queue and the ratchet when it has the reply or when the request times out.</p>
|
|
<p>This exchange has the following properties:</p>
|
|
<ul>
|
|
<li>Unlike a request made directly to the service over HTTP, the app does not connect to the service, nor the service to the app. Each communicates only with SMP servers, so the service does not see the app's network address, and with private routing the service's server does not see it either.</li>
|
|
<li>Unlike a chat connection, which is a persistent channel through which all requests made over it can be linked to each other, a service request does not create persistent state. Each request uses new keys and a new reply queue, so two requests from the same app cannot be linked by the service or by servers.</li>
|
|
<li>A reply that decrypts proves that it came from the holder of the keys published in the service's link and signed by its root key, so a server cannot substitute a reply.</li>
|
|
<li>The badge service answers a repeated request with the same result and does not execute the operation twice, so the app can repeat a request whose reply was lost.</li>
|
|
</ul>
|
|
<p>A purchase is identified by an Ed25519 key pair that the app generates for it and does not use for any other purpose. Every request concerning the purchase, the redemption and each monthly renewal, is signed with this key, and the signature covers the request together with a value derived from the ratchet of that exchange, so it is valid for that exchange only and cannot be replayed. The agent verifies the signature and delivers the verified public key to the service with the request, and the service accepts a request about a purchase only when the verified key is the purchase key.</p>
|
|
<h3 id="buying-and-redeeming" tabindex="-1">Buying and redeeming</h3>
|
|
<p>A badge is bought for one or more months, either on the web or in the app.</p>
|
|
<p>On the web the purchase produces a code, which is then redeemed in the app. The code is the only data passed from the web site to the app: the web site does not learn which app redeems a code, and the app does not see the payment. The code is generated in the buyer's browser, and the service stores only its hash; at redemption the app presents the code itself, and the service matches it against the stored hash. A badge issued without a sale, for example in compensation for a problem, is a code generated by the operator and redeemed in the same way.</p>
|
|
<p>In the app, the user pays by card, in cryptocurrency, or through the app store. The app requests an invoice from the service, or presents the receipt of the app store, and the service issues the credential once the payment is confirmed.</p>
|
|
<p>In both cases the app generates the master key and the purchase key pair before the purchase. To redeem a code, the app sends the code and the master key to the service, which issues the credential. A code redeemed a second time with the same purchase key returns the same credential; a code redeemed with a different purchase key is refused.</p>
|
|
<h3 id="monthly-issuance" tabindex="-1">Monthly issuance</h3>
|
|
<p>A credential is issued for one month at a time, however many months were bought. The service keeps a count of the months remaining for each purchase key, and issues the next credential when the app asks for it. Unused months, e.g. if the app was offline, lapse at the next badge issuance.</p>
|
|
<p>Credentials are issued monthly to limit what the expiry date discloses. If credentials were issued for the whole term, a user who bought a year would hold a credential expiring on a day a year ahead, when few other credentials expire, and this date would be disclosed in every proof for a year. Instead, every credential is issued for one month, and its expiry is rounded to the end of the Monday following the end of the paid month (UTC). For example, if the paid month ends on Wednesday 14 October 2026, the credential expires at the end of Monday 19 October, and so does every credential whose month ends between Monday 12 and Sunday 18 October. All credentials whose paid month ends in the same week thus expire at the same instant.</p>
|
|
<p>The renewal is split over two days for the same reason. The app requests the next credential on the day before the current one expires, and when the current one expires, it switches to the new one and sends its updated profile to its contacts. In the example above, the app asks the service for the new credential on Monday 19 October and starts showing it on Tuesday 20 October, so an observer of both the request and the profile update cannot correlate them by time.</p>
|
|
<p>The renewal runs in the background and does not require any action from the user. Recipients accept a badge for seven days after its expiry, and servers for one day, so a renewal delayed by a few days is not visible to contacts.</p>
|
|
<h3 id="presentation" tabindex="-1">Presentation</h3>
|
|
<p>A BBS proof is generated over a string, called the presentation header, and is verified only against the same string. The string binds the proof to the context in which it is presented. Without it, a proof received in one conversation could be copied and presented in another. Between apps the string is sent with the proof, and the recipient checks that it is the string it expects; servers know the string already, so it is not sent to them.</p>
|
|
<p>The context of a conversation is the same string over which message signatures are computed:</p>
|
|
<ul>
|
|
<li>In a direct chat it is a hash derived from the state of the end-to-end encryption, which only the two sides hold.</li>
|
|
<li>In a group it is the member's identifier together with the member's signing key.</li>
|
|
<li>In a channel it is the channel's identifier together with the member's identifier, or the channel's identifier alone when a message is sent in the name of the channel.</li>
|
|
</ul>
|
|
<p>A session with a server is identified by the TLS session identifier, which both sides derive from the TLS handshake and which differs on every connection.</p>
|
|
<p>Each time the app sends its profile, whether to a new contact, to a group it joins, or to everyone when the profile is updated, it generates a new proof and includes it. The proof is bound to the conversation in which the profile is sent: in a direct chat to the connection with the contact, in a group to the member's identity in that group, and in a channel to the member's identity established by the channel's roster. In a group the badge is accepted only from a message signed with the member's key, and in a channel it is verified against the key that the roster establishes for the member.</p>
|
|
<p>A file larger than the default limit is sent with two proofs. The first is placed in the file invitation, the message that announces the file, and is bound to the conversation and to the size of the file; the recipient's app verifies it when the invitation arrives. The second is placed in the file description, the record of where the chunks of the file are stored and how they are decrypted, and is bound in addition to a hash of the description and to the storage time of the file; the app verifies it before the download begins.</p>
|
|
<h3 id="servers" tabindex="-1">Servers</h3>
|
|
<p>The client presents the entitlement proof in the transport handshake, bound to the TLS session identifier. The server verifies it once, when the session is established, and applies the result to every command in the session.</p>
|
|
<p>The client presents the proof only to its own servers, that is, to those configured for the profile, which are identified by the certificate fingerprint pinned in TLS. It does not present the proof to a server whose address it received from a contact or found in a file description, because a file description names the servers on which the chunks are stored, and these are chosen by the sender. If the app presented its proof to every server it connected to, a sender could store a file on a server of their own and learn, when the file is downloaded, that the person downloading it holds a badge.</p>
|
|
<p>On XFTP servers the proof extends the storage time of files. The server grants the smaller of the time requested by the client and the maximum configured for the badge type, and returns the resulting expiry. SMP servers and notification servers accept the same proof in their handshakes but do not yet make use of it.</p>
|
|
<p>The exchange between the app and the badge service, that is, the commands, responses and errors, is described in the <a href="/docs/protocol/badges-rpc.html">badge service protocol</a>.</p>
|
|
<h2 id="cryptographic-primitives" tabindex="-1">Cryptographic primitives</h2>
|
|
<p>Badges are built on <a href="https://datatracker.ietf.org/doc/draft-irtf-cfrg-bbs-signatures/">BBS signatures</a>, in the BLS12-381-SHA-256 suite, implemented by <a href="https://github.com/Fraunhofer-AISEC/libbbs">libbbs</a> over <a href="https://github.com/supranational/blst">blst</a>. A credential is a signature over four values under the header <code>SimpleX badges v1</code>; a proof discloses three of them and is 304 bytes long. BBS was chosen for four properties that the design needs together:</p>
|
|
<ul>
|
|
<li>A proof can be verified by anyone who holds the issuer's public key, so contacts and independently operated servers verify badges without consulting the issuer.</li>
|
|
<li>A proof discloses only the values selected.</li>
|
|
<li>A proof cannot be linked to any other proof of the same credential.</li>
|
|
<li>A proof is generated over a presentation header, so it can be bound to the context in which it is presented.</li>
|
|
</ul>
|
|
<p>Credentials of the kind Signal uses can be verified only by their issuer, and a receipt credential discloses its serial number when presented, so it is presented once. Single-use tokens, such as blind signatures and the tokens of Privacy Pass, are likewise spent when presented and do not include values such as an expiry or a type.</p>
|
|
<p>Service requests are protected by the double ratchet of the <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/agent-protocol.md">SimpleX agent</a>, with X448 key agreement and the sntrup761 KEM, established from keys published in the service's link. The purchase keys with which requests are signed, and the member keys that form part of the conversation context in groups, are Ed25519 keys. Codes are hashed with SHA-256, and the file description in the context of a file proof with SHA-512.</p>
|
|
<h2 id="security" tabindex="-1">Security</h2>
|
|
<h3 id="design-objectives" tabindex="-1">Design objectives</h3>
|
|
<ol>
|
|
<li>A proof discloses no value that links it to another proof or to the purchase.</li>
|
|
<li>A proof used in one context, whether a session, a conversation or a file, cannot be used in another context.</li>
|
|
<li>The timing of presentations does not identify the holder: all credentials expiring in the same week share the same expiry, and the renewal request and the profile update are made on different days.</li>
|
|
<li>Requests to the badge service cannot be linked to each other, to a profile or to a network address, and a request about a purchase can be made only by the holder of the purchase key.</li>
|
|
<li>A credential cannot be forged: the issuer keys are fixed in apps and servers, and the app verifies a credential before storing it.</li>
|
|
<li>A missing or failed proof leaves the default limit in place, and a server cannot be configured to grant a badge type less than the default.</li>
|
|
</ol>
|
|
<h3 id="threat-model" tabindex="-1">Threat model</h3>
|
|
<p>This threat model assumes the <a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/security.md">SimpleX network threat model</a> and addresses the threats specific to badges.</p>
|
|
<p><strong>The badge service</strong></p>
|
|
<p><em>can:</em></p>
|
|
<ul>
|
|
<li>See the purchase key of every badge, the master key generated for it, the number of months bought, and the payment record.</li>
|
|
<li>Issue any credential, or refuse to issue one, as it holds the issuer key.</li>
|
|
</ul>
|
|
<p><em>cannot:</em></p>
|
|
<ul>
|
|
<li>Connect a purchase with a profile, a contact, a group or a session with a server - a proof contains nothing that refers back to the purchase.</li>
|
|
<li>Learn where a badge is shown or used.</li>
|
|
<li>Learn the network address of the app - requests reach the service through SMP servers, on connections created for the request.</li>
|
|
</ul>
|
|
<p><strong>A contact, a group member or a channel relay</strong></p>
|
|
<p><em>can:</em></p>
|
|
<ul>
|
|
<li>See the badge type and the expiry date.</li>
|
|
</ul>
|
|
<p><em>cannot:</em></p>
|
|
<ul>
|
|
<li>Tell whether a badge seen in another conversation belongs to the same person.</li>
|
|
<li>Reuse a profile proof or a file proof in another context.</li>
|
|
<li>Distinguish the holder from the other supporters whose badges expire in the same week.</li>
|
|
</ul>
|
|
<p><strong>A server operator</strong></p>
|
|
<p><em>can:</em></p>
|
|
<ul>
|
|
<li>See the badge type and the expiry date once in each session.</li>
|
|
<li>Group together the sessions of the supporters whose badges expire in the same week.</li>
|
|
</ul>
|
|
<p><em>cannot:</em></p>
|
|
<ul>
|
|
<li>Reuse the proof on another connection.</li>
|
|
<li>Link a session to the purchase, to a profile or to sessions on other servers, except through the week of expiry.</li>
|
|
<li>Obtain a proof from a client that does not use the server.</li>
|
|
</ul>
|
|
<p><strong>The server that hosts the badge service's address</strong></p>
|
|
<p><em>can:</em></p>
|
|
<ul>
|
|
<li>See that requests arrive for the service.</li>
|
|
</ul>
|
|
<p><em>cannot:</em></p>
|
|
<ul>
|
|
<li>See the content of requests.</li>
|
|
<li>See the network address of the app when private routing is used.</li>
|
|
<li>See the replies, which are sent to a queue on a server chosen by the app.</li>
|
|
</ul>
|
|
<p><strong>One badge on many machines</strong></p>
|
|
<p>Since proofs are unlinkable, a server cannot count the sessions of a single credential, so the benefit granted by a badge must be limited without counting sessions. For this reason a badge lowers the cost of a resource without removing the limit on it, and limits per session remain in force.</p>
|
|
<p><strong>Compromise of the user's device or backup</strong></p>
|
|
<p>An attacker who obtains the credential and the purchase key can use the badge until it expires and renew it while months remain. There is no revocation, so the loss is limited to the months bought.</p>
|
|
<p><strong>Interception of a code</strong></p>
|
|
<p>A code is a bearer secret until it is redeemed; once redeemed, it is refused to any other purchase key.</p>
|
|
<p><strong>A passive network observer</strong></p>
|
|
<p><em>can:</em></p>
|
|
<ul>
|
|
<li>Observe SimpleX traffic between clients and servers.</li>
|
|
</ul>
|
|
<p><em>cannot:</em></p>
|
|
<ul>
|
|
<li>See a proof - proofs to servers are inside TLS, in a handshake block of fixed size, and proofs to other users and requests to the badge service are inside end-to-end encrypted messages.</li>
|
|
<li>Distinguish a session in which a proof was presented from a session without one.</li>
|
|
</ul>
|
|
<h2 id="future-work" tabindex="-1">Future work</h2>
|
|
<ul>
|
|
<li>Backups will be stored on XFTP servers, and a badge will raise their size and their storage time, as described under <a href="#what-a-badge-grants">What a badge grants</a>.</li>
|
|
<li>SMP servers and notification servers will verify the proof. A server that verifies it can charge the holder of a badge less for creating queues, file chunks and notification tokens (under the planned proof-of-work scheme, the required effort is divided by a factor configured for each badge type), and can apply higher rate limits and larger quotas.</li>
|
|
<li>Subscriptions that renew automatically, the transfer of remaining months to a new device, and the pausing of a prepaid badge are planned.</li>
|
|
</ul>
|
|
</div>
|
|
</article>
|
|
</main>
|
|
</div>
|
|
</section>
|
|
|
|
|
|
<section class="bg-[#D3E9FF] dark:bg-[#080D25] py-[50px] footer page">
|
|
<div class="container">
|
|
<div class="flex flex-col lg:flex-row justify-between">
|
|
<div class="flex flex-col items-center lg:items-start">
|
|
<a href="/" class="h-full mb-14 dark:hidden"><img class="w-auto h-[46px]" src="/img/new/logo-light.png" alt="logo" /></a>
|
|
<a href="/" class="h-full mb-14 hidden dark:inline-block"><img class="w-auto h-[46px]" src="/img/new/logo-dark.png" alt="logo" /></a>
|
|
|
|
<div class="flex flex-col items-center lg:items-start lg:flex-row gap-[150px] lg:gap-[350px]">
|
|
<div class="flex flex-col items-center lg:items-start">
|
|
<a href="/why"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
Why we are building it
|
|
</a>
|
|
<a href="/about/"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
About & Contact us
|
|
</a>
|
|
<a href="/privacy/"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
Privacy Policy
|
|
</a>
|
|
<a href="/jobs/"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
Join team
|
|
</a>
|
|
<a href="https://github.com/simplex-chat/simplex-chat#please-support-us-with-your-donations"
|
|
target="_blank"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
Donate
|
|
<svg class="float-right" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a>
|
|
</div>
|
|
<div class="flex flex-col items-center lg:items-start">
|
|
<a href="https://github.com/simplex-chat/simplexmq/blob/stable/protocol/overview-tjr.md"
|
|
target="_blank"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
SimpleX Whitepaper
|
|
<svg class="float-right" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a>
|
|
<a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/protocol/simplex-chat.md"
|
|
target="_blank"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
SimpleX Chat protocol
|
|
<svg class="float-right" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a>
|
|
<a href="https://github.com/simplex-chat/simplex-chat/blob/stable/docs/CLI.md"
|
|
target="_blank"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
Terminal CLI
|
|
<svg class="float-right" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a>
|
|
<a href="https://github.com/simplex-chat/simplex-chat/tree/stable/bots"
|
|
target="_blank"
|
|
class="text-grey-black dark:text-white text-[14px] font-medium leading-[28px] tracking-[0.01em] mb-3 flex items-center gap-1">
|
|
SimpleX bots API
|
|
<svg class="float-right" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<article class="mt-10 lg:mt-0">
|
|
<div class="h-[40px] flex flex-col gap-2 justify-center">
|
|
<div class="flex gap-2 justify-center">
|
|
<a href="/news">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 54 54" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M26.585 0C11.9025 0 0 11.9025 0 26.585C0 41.2674 11.9025 53.1699 26.585 53.1699C41.2674 53.1699 53.1699 41.2674 53.1699 26.585C53.1699 11.9025 41.2674 0 26.585 0ZM11.3862 17.3518L17.6366 23.4373L23.9313 17.3088L17.6787 11.2209L20.866 8.1179L27.1187 14.2061L33.4932 8L36.6199 11.044L30.2448 17.25L36.4982 23.3379L42.8733 17.1321L46 20.1761L39.6249 26.3818L45.8789 32.4702L42.6916 35.5732L36.4376 29.4848L30.0631 35.6906L36.3171 41.7791L33.1299 44.8821L26.8759 38.7936L20.5026 45L17.3759 41.956L23.8003 35.693L17.5493 29.6073L11.1255 35.8621L8 32.8194L14.4244 26.5646L8.17397 20.4792L11.3862 17.3518ZM27.0125 32.5656L33.311 26.4408L27.0576 20.3535L27.0568 20.3516L20.7615 26.4799L27.0125 32.5656Z"/>
|
|
</svg>
|
|
</a>
|
|
<a href="https://primal.net/p/npub1exv22uulqnmlluszc4yk92jhs2e5ajcs6mu3t00a6avzjcalj9csm7d828" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512ZM348.077 268.251C347.047 271.254 346.018 274.257 344.263 277.017C337.633 287.302 327.867 292.139 315.221 292.951C302.173 293.789 289.233 295.487 276.333 297.437C274.064 297.779 271.793 298.108 269.521 298.438C258.687 300.005 247.858 301.572 237.36 304.645C189.946 318.517 148.927 341.344 115.048 374.257C109.197 379.941 103.451 385.688 98.1836 391.819C95.7632 394.637 93.0278 397.201 89.1831 398.521L89.1304 398.538C87.9731 398.938 86.7466 399.359 85.6548 398.491C84.7729 397.79 84.9731 396.874 85.1665 395.992C85.1948 395.862 85.2231 395.733 85.248 395.605C85.6963 393.277 86.7407 391.14 88.1821 389.194C90.146 386.544 92.084 383.878 94.022 381.213C99.7344 373.356 105.446 365.5 111.82 358.036C121.707 346.457 133.167 336.2 144.787 326.072C168.56 305.352 195.75 289.087 225.833 276.646C228.757 275.438 231.732 274.327 234.707 273.217C236.528 272.538 238.349 271.858 240.158 271.155C240.361 271.076 240.574 271.007 240.789 270.938C241.635 270.663 242.518 270.377 243.024 269.423C242.177 268.706 241.15 268.783 240.177 268.857C239.968 268.873 239.762 268.889 239.561 268.896C217.297 269.744 195.694 273.47 174.884 280.725C167.117 283.432 159.668 286.729 152.295 290.172C149.855 291.311 147.46 292.248 145.208 290.121C142.917 287.958 143.432 285.598 144.912 283.182C154.453 267.61 165.746 253.295 179.889 240.66C197.997 224.483 219.395 213.954 244.032 208.49C276.996 201.18 306.323 208.416 332.639 226.84L333.331 227.326C337.818 230.48 342.154 233.529 348.424 232.938C356.094 232.213 362.589 229.362 367.853 224.391C376.977 215.774 378.435 205.5 372.124 194.314C365.358 182.325 356.674 171.414 347.996 160.512L347.97 160.479C344.757 156.442 341.94 152.257 340.075 147.559C337.776 141.771 339.282 136.798 343.771 132.374C346.562 129.623 349.879 127.444 353.499 125.654C352.84 124.302 351.792 124.372 350.828 124.437C350.692 124.445 350.558 124.454 350.427 124.459C349.885 124.479 349.345 124.565 348.806 124.651C348.214 124.745 347.624 124.839 347.031 124.847C346.607 124.852 346.152 124.89 345.689 124.929C343.945 125.074 342.084 125.23 341.357 123.684C340.391 121.631 341.399 119.227 343.191 117.554C347.403 113.623 352.741 112.595 358.621 113.133C364.851 113.703 370.044 116.374 374.959 119.561C377.904 121.469 380.753 123.504 383.548 125.587C386.107 127.494 385.938 128.352 382.863 129.358C378.374 130.828 373.854 132.237 369.158 133.088C368.043 133.29 366.97 133.568 365.925 133.915C365.13 134.178 364.353 134.481 363.586 134.82C356.43 137.985 354.645 142.229 357.784 148.742C360.525 154.429 364.434 159.469 368.344 164.509C369.887 166.498 371.431 168.487 372.902 170.517C373.603 171.483 374.306 172.449 375.008 173.415C379.468 179.541 383.926 185.666 387.914 192.062C400.479 212.217 392.457 231.471 374.209 243.009C372.334 244.194 370.384 245.277 368.434 246.36C365.527 247.975 362.621 249.589 359.962 251.543C354.495 255.563 350.765 260.588 348.648 266.601C348.455 267.149 348.266 267.7 348.077 268.251ZM364.513 333.922C365.149 335.249 364.924 336.668 364.888 338.06C364.714 340.459 365.214 342.489 363.518 344.059C362.183 344.074 361.458 343.352 360.753 342.65C360.563 342.461 360.375 342.273 360.177 342.103C356.286 338.75 352.875 334.988 348.808 331.769C341.752 326.184 333.477 324.483 324.302 324.521C315.342 324.559 307.177 327.164 299.004 329.771C297.717 330.183 296.429 330.594 295.138 330.995L289.747 332.666C278.586 336.121 267.42 339.577 256.422 343.413C246.833 346.757 238.413 339.996 239.31 331.924C240.31 322.924 243.14 314.443 250.956 307.944C254.783 304.762 259.324 303.146 264.323 302.431C267.762 301.938 271.221 301.553 274.679 301.168C276.062 301.014 277.446 300.859 278.828 300.698C279.451 300.625 280.078 300.607 280.639 301.144C280.923 302.208 280.246 302.979 279.585 303.731C279.429 303.91 279.273 304.088 279.131 304.268C274.998 309.516 270.639 314.606 265.876 319.418C265.727 319.568 265.549 319.722 265.365 319.879C264.61 320.528 263.763 321.258 264.454 322.215C265.352 323.459 266.887 322.692 268.166 322.415C273.744 321.205 279.287 319.864 284.829 318.523C294.818 316.107 304.808 313.69 315.003 312.043C328.089 309.928 340.422 311.512 351.549 318.553C357.728 322.463 361.604 327.85 364.513 333.922Z" />
|
|
</svg>
|
|
</a>
|
|
<a rel="me" href="https://mastodon.social/@simplex" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512ZM339.329 99.0275C317.654 93.9388 295.564 92.2207 273.231 91.3254C272.186 91.2944 271.157 91.2596 270.14 91.2251C268.091 91.1557 266.089 91.0879 264.086 91.0567C246.35 90.7812 228.654 91.5123 210.994 93.1846C197.065 94.5035 183.244 96.4768 169.675 99.9727C162.199 101.899 154.73 103.994 147.977 107.812C134.904 115.202 125.174 125.999 117.725 138.921C108.323 155.228 103.916 173.02 103.377 191.682C102.882 208.853 102.937 226.049 103.186 243.227C103.396 257.66 104.034 272.095 104.854 286.507C105.678 300.995 107.728 315.348 110.963 329.508C114.411 344.606 119.377 359.13 127.439 372.451C138.635 390.948 154.331 403.859 174.933 410.499C187.604 414.582 200.649 417.051 213.826 418.828C237.461 422.015 261.021 421.897 284.461 417.12C294.296 415.115 303.892 412.325 313.09 408.232C314.413 407.643 314.878 406.946 314.79 405.46C314.549 401.383 314.383 397.303 314.217 393.222C314.143 391.401 314.069 389.581 313.989 387.761C313.915 386.091 313.827 384.422 313.737 382.714C313.695 381.925 313.653 381.128 313.612 380.318C313.426 380.354 313.261 380.382 313.11 380.408C312.825 380.457 312.591 380.497 312.364 380.56C294.125 385.58 275.582 388.162 256.641 387.555C245.877 387.21 235.125 386.735 224.588 384.226C217.159 382.457 210.199 379.654 204.32 374.599C197.016 368.318 193.251 360.094 191.688 350.786C191.199 347.876 190.939 344.927 190.672 341.898C190.548 340.499 190.423 339.084 190.274 337.647C190.638 337.712 190.939 337.764 191.198 337.808C191.658 337.888 191.989 337.945 192.317 338.012C193.433 338.242 194.548 338.478 195.663 338.714C197.9 339.188 200.137 339.662 202.384 340.08C217.874 342.967 233.476 344.947 249.2 346.01C261.24 346.825 273.283 346.962 285.306 346.061C292.653 345.511 299.987 344.776 307.32 344.042C310.694 343.704 314.068 343.366 317.444 343.046C329.993 341.856 342.163 339.055 353.868 334.339C368.08 328.613 381.069 320.958 391.661 309.671C397.704 303.232 402.22 295.971 403.793 287.033C406.787 270.025 408.278 252.868 409.117 235.648C409.506 227.659 409.68 219.659 409.854 211.661C409.877 210.641 409.899 209.622 409.922 208.602C410.225 194.937 409.755 181.331 406.589 167.943C402.18 149.303 393.93 132.763 380.157 119.248C373.506 112.723 366.119 107.246 357.182 104.291C351.293 102.344 345.36 100.443 339.329 99.0275ZM206.301 147.05C215.154 146.705 223.699 148.074 231.686 152.148C239.099 156.066 244.656 161.596 248.834 168.559C250.24 170.904 251.634 173.256 253.028 175.609C253.877 177.042 254.725 178.475 255.577 179.906C255.751 180.198 255.939 180.481 256.169 180.825C256.289 181.005 256.42 181.202 256.567 181.426C256.835 180.985 257.092 180.564 257.34 180.156C257.857 179.31 258.338 178.52 258.815 177.728C259.514 176.567 260.2 175.397 260.885 174.228C262.344 171.739 263.803 169.25 265.39 166.845C274.175 153.529 286.908 147.555 302.51 147.037C311.492 146.739 320.132 148.161 328.153 152.407C340.022 158.69 347.454 168.621 351.49 181.281C353.776 188.451 354.772 195.835 354.782 203.337C354.809 224.399 354.804 245.462 354.8 266.525C354.798 274.145 354.797 281.765 354.796 289.385C354.796 291.539 354.794 291.541 352.618 291.541C345.311 291.541 338.005 291.541 330.699 291.541L322.729 291.541L320.556 291.541V289.22C320.556 282.775 320.555 276.331 320.555 269.886C320.555 249.152 320.555 228.417 320.557 207.683C320.557 203.313 320.182 198.991 318.855 194.802C316.363 186.935 311.094 182.212 302.904 181.058C297.135 180.245 291.436 180.588 286.145 183.355C279.524 186.817 276.269 192.781 274.923 199.777C274.066 204.228 273.672 208.827 273.621 213.366C273.507 223.706 273.527 234.048 273.547 244.39C273.555 248.39 273.563 252.389 273.563 256.389V258.442H239.519C239.519 257.757 239.52 257.127 239.519 256.498C239.515 252.169 239.515 247.841 239.515 243.512C239.515 232.533 239.514 221.553 239.453 210.574C239.422 205.073 238.685 199.648 236.607 194.488C233.57 186.946 228.11 182.277 220.046 181.187C216.643 180.726 213.072 180.737 209.67 181.204C202.089 182.246 197.072 186.701 194.521 193.923C193.001 198.228 192.528 202.699 192.528 207.236C192.526 227.665 192.526 248.094 192.526 268.522C192.526 275.434 192.527 282.345 192.527 289.256V291.425H158.285V289.671C158.285 281.418 158.28 273.166 158.274 264.914C158.259 244.215 158.245 223.516 158.321 202.817C158.362 191.725 160.39 180.983 165.938 171.217C174.826 155.574 188.484 147.745 206.301 147.05Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="https://lemmy.ml/c/simplex" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M211.627 320.142L211.601 320.334C209.791 327.491 205.635 332.28 198.898 334.602C186.776 338.78 174.062 329.797 173.658 317.008C173.314 306.088 182.578 296.189 194.836 297.369C205.769 298.421 213.652 308.883 211.697 319.667C211.669 319.825 211.647 319.984 211.627 320.142Z" />
|
|
<path d="M330.616 332.344C330.429 332.469 330.237 332.586 330.048 332.707C318.654 339.342 304.653 333.087 301.724 320.752C299.125 309.809 306.901 298.809 318.043 297.573C326.881 296.592 335.193 301.875 338.096 309.993C341.069 318.313 338.059 327.36 330.616 332.344Z" />
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512ZM452.87 191.71C450.247 181.005 444.82 172.018 435.126 165.783C434.537 165.485 433.964 165.181 433.398 164.88C432.158 164.222 430.954 163.582 429.697 163.069C421.154 159.584 412.3 159.367 403.337 160.925C394.095 162.532 385.533 165.973 377.487 170.658C368.828 175.701 361.835 182.561 355.71 190.334C355.44 190.676 355.214 191.051 355 191.363C355.081 191.515 355.095 191.577 355.134 191.609C355.439 191.858 355.746 192.107 356.062 192.346C363.56 198.034 370.116 204.62 375.603 212.22C384.395 224.398 389.771 237.954 392.392 252.617C392.594 253.748 392.832 254.873 393.053 256C405.488 253.396 416.484 248.669 426.037 242.977C434.382 238.003 441.402 231.567 446.721 223.474C453.126 213.727 455.673 203.145 452.87 191.71ZM74.0957 168.33C80.6572 163.052 88.1533 160.554 96.373 160.085C106.582 159.503 116.192 161.954 125.519 165.865C138.758 171.419 149.13 180.436 157.59 191.798C157.645 191.872 157.697 191.947 157.747 192.024C157.788 192.089 157.828 192.155 157.864 192.222C157.899 192.287 157.922 192.359 157.951 192.452L158 192.606C136.48 208.433 124.266 229.827 119.912 256C119.671 255.981 119.437 255.979 119.21 255.962C119.12 255.956 119.031 255.947 118.944 255.935C118.893 255.927 118.842 255.917 118.791 255.906C106.863 253.306 95.7129 248.715 85.4551 242.228C75.9717 236.23 68.2236 228.434 63.2119 218.255C60.3105 212.362 58.7051 206.12 59.0449 199.556C59.6875 187.16 64.5664 176.684 74.0957 168.33ZM296.621 382.67C313.312 376.036 328.495 366.898 342.24 355.14C350.237 348.229 357.383 340.69 363.479 332.195C374.055 317.459 380.766 301.307 381.77 283.001C382.441 270.745 381.724 258.632 378.58 246.731C373.914 229.066 364.635 214.348 350.251 202.935C340.804 195.439 330.173 190.161 318.777 186.34C303.993 181.384 288.724 179.122 273.21 178.32C260.704 177.674 248.214 178.026 235.744 179.201C225.53 180.164 215.431 181.775 205.499 184.357C192.461 187.748 180.062 192.636 168.799 200.14C153.032 210.644 142.032 224.79 136.08 242.792C132.337 254.113 130.976 265.771 131 277.642C131.021 287.482 132.225 297.122 135.406 306.482C139.866 319.601 146.978 331.165 156.084 341.527C172.32 360 192.19 373.328 214.92 382.551C215.081 382.616 215.245 382.674 215.409 382.729C215.558 382.778 215.706 382.824 215.852 382.868L215.863 382.873L215.922 382.891C216.04 382.927 216.154 382.963 216.265 383C216.304 382.079 216.324 381.166 216.344 380.259C216.363 379.391 216.383 378.528 216.419 377.671C216.463 376.613 216.532 375.562 216.659 374.519C218.164 362.141 224.289 352.646 235.222 346.599C246.337 340.452 258.246 339.604 270.208 343.455C285.366 348.334 293.935 359.08 296.154 374.799C296.398 376.527 296.456 378.281 296.516 380.085L296.519 380.13V380.173C296.546 380.995 296.574 381.826 296.621 382.67ZM281.743 368.861C282.872 371.457 283.575 374.328 283.881 377.463C285.312 392.157 273.662 404.387 259.753 405.812C254.162 406.385 248.779 405.674 243.706 403.293C235.694 399.535 231.077 393.124 229.513 384.525C228.687 379.986 228.794 375.442 230.311 371.038C230.366 370.862 230.425 370.687 230.485 370.511C233.364 362.156 239.321 357.018 247.744 354.776C255.238 352.782 262.649 353.215 269.807 356.412C275.688 359.393 279.581 363.572 281.743 368.861ZM145.243 347.723C144.674 347.919 144.148 348.073 143.643 348.279L123.101 356.65C118.053 358.706 113.004 360.758 107.952 362.804C106.823 363.261 105.612 363.671 104.412 363.772C100.998 364.058 98.0098 361.874 97.0557 358.587C96.1104 355.333 97.5312 351.907 100.529 350.27C100.976 350.025 101.452 349.834 101.927 349.644L102.222 349.524L134.319 336.439C134.889 336.207 135.449 335.954 136.141 335.656C135.967 335.363 138.582 338.852 141.055 342.154L142.903 344.622C143.673 345.648 144.331 346.526 144.754 347.085C145.023 347.442 145.197 347.669 145.243 347.723ZM369.278 345.862C370.302 344.697 371.534 343.236 372.724 341.826L372.735 341.812L372.741 341.803C375.005 339.122 377.106 336.631 377.315 336.716L383.333 339.168C391.872 342.647 400.41 346.126 408.957 349.581C411.084 350.441 412.807 351.698 413.645 353.882C414.726 356.697 414.287 359.323 412.218 361.528C410.094 363.792 407.413 364.428 404.511 363.378C401.243 362.196 398.05 360.808 394.829 359.496L368.187 348.632L368.005 348.56L367.679 348.44C367.526 348.385 367.379 348.335 367.243 348.289L366.935 348.182C367.13 348.228 368.055 347.256 369.278 345.862ZM342.492 371.036C342.825 370.833 330.406 379.116 330.827 379.667C338.286 389.524 345.667 399.273 353.053 409.019L353.185 409.193L353.426 409.513C353.677 409.84 353.935 410.16 354.22 410.453C358.062 414.399 364.663 412.838 366.314 407.583C367.117 405.031 366.513 402.746 364.907 400.64C360.587 394.974 356.3 389.283 352 383.602L342.492 371.036ZM169.228 372.739C169.013 373.018 172.123 375.052 175.2 377.064C178.211 379.033 181.189 380.98 180.99 381.244L174.88 389.313C169.871 395.926 164.864 402.539 159.871 409.163C158.534 410.936 156.953 412.256 154.675 412.554C151.731 412.939 149.331 411.952 147.65 409.532C145.926 407.052 145.868 404.406 147.351 401.768C147.473 401.55 147.608 401.34 147.752 401.135C147.942 400.86 148.147 400.594 148.352 400.328L148.613 399.985L169.228 372.739Z" />
|
|
<path d="M211.584 320.586C209.815 327.718 205.697 332.587 199.022 334.947C187.008 339.195 174.408 330.062 174.009 317.062C173.668 305.961 182.848 295.898 194.995 297.097C205.829 298.167 213.642 308.802 211.704 319.765C211.665 319.99 211.64 320.217 211.584 320.586Z" />
|
|
<path d="M329.711 333.271C318.43 340.029 304.431 333.604 301.503 320.932C298.905 309.69 306.679 298.39 317.818 297.12C326.654 296.113 334.965 301.539 337.867 309.879C340.84 318.426 337.83 327.72 330.389 332.84C330.202 332.968 330.01 333.089 329.711 333.271Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="mailto:chat@simplex.chat" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M512 256C512 397.385 397.385 512 256 512C114.615 512 0 397.385 0 256C0 114.615 114.615 0 256 0C397.385 0 512 114.615 512 256ZM149.744 205.384L166.479 218.68C192.394 239.268 218.153 259.732 243.918 280.188C254.117 288.285 257.065 288.23 267.363 280.05C310.416 245.847 353.478 211.655 396.54 177.463L400.139 174.605L413.302 164.153C414.537 163.173 415.803 162.232 418.049 160.511V167.062L418.05 212.292C418.05 257.522 418.051 302.752 418.045 347.982C418.044 359.363 414.904 362.477 403.495 362.477L283.932 362.479C225.163 362.479 166.395 362.479 107.626 362.477C96.1521 362.477 93.0066 359.391 93.0051 348.06C92.9968 287.587 93.001 227.114 93.001 166.641V160.359C112.401 175.751 130.933 190.456 149.744 205.384ZM116.095 149C126.458 157.244 135.905 164.758 145.633 172.489C166.835 189.321 187.943 206.083 209.045 222.84L255.556 259.775L395.017 149H116.095Z" />
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="flex gap-2 justify-center">
|
|
<a href="https://github.com/simplex-chat" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M20.2907 0.926758C9.24635 0.926758 0.290527 10.1075 0.290527 21.4331C0.290527 30.4933 6.02118 38.18 13.9679 40.8915C14.9674 41.0813 15.3344 40.4467 15.3344 39.905C15.3344 39.4161 15.3158 37.8007 15.3072 36.0872C9.74314 37.3277 8.56906 33.6677 8.56906 33.6677C7.65927 31.2975 6.3484 30.6672 6.3484 30.6672C4.53379 29.3945 6.48519 29.4206 6.48519 29.4206C8.49355 29.5653 9.55105 31.5338 9.55105 31.5338C11.3349 34.6688 14.2298 33.7624 15.3711 33.2385C15.5506 31.9131 16.069 31.0085 16.6409 30.4964C12.1986 29.9779 7.52878 28.2195 7.52878 20.3621C7.52878 18.1232 8.31007 16.294 9.58947 14.8579C9.38181 14.3414 8.69723 12.2557 9.78322 9.43111C9.78322 9.43111 11.4627 8.87998 15.2847 11.5331C16.8801 11.0787 18.591 10.8509 20.2907 10.8431C21.9904 10.8509 23.7027 11.0787 25.301 11.5331C29.1183 8.87998 30.7955 9.43111 30.7955 9.43111C31.8842 12.2557 31.1992 14.3414 30.9916 14.8579C32.274 16.294 33.05 18.1232 33.05 20.3621C33.05 28.2382 28.3712 29.9724 23.9176
|
|
30.4801C24.635 31.1165 25.2742 32.3644 25.2742 34.2776C25.2742 37.0214 25.251 39.2296 25.251 39.905C25.251 40.4507 25.611 41.0902 26.6248 40.8888C34.5672 38.1742 40.2905 30.4903 40.2905 21.4331C40.2905 10.1075 31.336 0.926758 20.2907 0.926758Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="https://www.reddit.com/r/SimpleXChat/" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.874 40.9268C31.9197 40.9268 40.874 31.9724 40.874 20.9268C40.874 9.88108 31.9197 0.926758 20.874 0.926758C9.82834 0.926758 0.874023 9.88108 0.874023 20.9268C0.874023 31.9724 9.82834 40.9268 20.874 40.9268ZM30.4091 16.615C31.9031 16.615 33.1157 17.8276 33.1157 19.3216C33.1157 20.426 32.4445 21.3787 31.5567 21.8118C31.6 22.0716 31.6217 22.3315 31.6217 22.613C31.6217 26.7705 26.7929 30.1268 20.8165 30.1268C14.8402 30.1268 10.0114 26.7705 10.0114 22.613C10.0114 22.3315 10.0331 22.05 10.0764 21.7902C9.12362 21.3571 8.47402 20.426 8.47402 19.3216C8.47402 17.8276 9.68662 16.615 11.1807 16.615C11.8953 16.615 12.5665 16.9181 13.0429 17.3728C14.9051 16.0086 17.4819 15.1642 20.3618 15.0776L21.726 8.6248C21.7693 8.49488 21.8343 8.3866 21.9425 8.32164C22.0508 8.25668 22.1807 8.23504 22.3106 8.25668L26.7929 9.20944C27.0961 8.55984 27.7457 8.12676 28.5035 8.12676C29.5646 8.12676 30.4307 8.99292 30.4307
|
|
10.0539C30.4307 11.115 29.5646 11.9811 28.5035 11.9811C27.4642 11.9811 26.6197 11.1582 26.5764 10.1406L22.5705 9.29604L21.3362 15.0776C24.1512 15.1858 26.7063 16.052 28.5469 17.3728C29.0232 16.8964 29.6728 16.615 30.4091 16.615ZM16.5291 19.3216C15.4681 19.3216 14.602 20.1878 14.602 21.2488C14.602 22.3098 15.4681 23.176 16.5291 23.176C17.5902 23.176 18.4563 22.3098 18.4563 21.2488C18.4563 20.1878 17.5902 19.3216 16.5291 19.3216ZM20.7949 27.7449C21.5311 27.7449 24.0429 27.6582 25.3638 26.3374C25.5587 26.1425 25.5587 25.8394 25.4071 25.6228C25.2122 25.428 24.8874 25.428 24.6925 25.6228C23.848 26.4456 22.0941 26.7488 20.8165 26.7488C19.539 26.7488 17.7634 26.4456 16.9405 25.6228C16.7457 25.428 16.4209 25.428 16.226 25.6228C16.0311 25.8177 16.0311 26.1425 16.226 26.3374C17.5252 27.6366 20.0587 27.7449 20.7949 27.7449ZM23.0902 21.2488C23.0902 22.3098 23.9563 23.176 25.0173 23.176C26.0783 23.176 26.9445 22.3098 26.9445 21.2488C26.9445 20.1878 26.0783
|
|
19.3216 25.0173 19.3216C23.9563 19.3216 23.0902 20.1878 23.0902 21.2488Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="https://x.com/simplexchat" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.4575 40.9268C31.5032 40.9268 40.4575 31.9725 40.4575 20.9268C40.4575 9.88106 31.5032 0.926758 20.4575 0.926758C9.41182 0.926758 0.45752 9.88106 0.45752 20.9268C0.45752 31.9725 9.41182 40.9268 20.4575 40.9268ZM29.916 16.7766C29.916 23.1157 25.014 30.4265 16.0519 30.4265V30.423C13.4038 30.4265 10.8115 29.6795 8.58252 28.2719C8.96846 28.3174 9.35558 28.3397 9.74271 28.3409C11.9372 28.3432 14.0688 27.6182 15.7942 26.283C13.7101 26.2444 11.8802 24.9055 11.2425 22.9507C11.9716 23.0898 12.7245 23.0619 13.4418 22.869C11.1689 22.4165 9.53371 20.4504 9.53252 18.1671V18.1062C10.2106 18.478 10.9694 18.6835 11.7448 18.7057C9.60377 17.2981 8.94233 14.4948 10.2355 12.3026C12.7103 15.2992 16.3606 17.1207 20.2782 17.3147C19.8851 15.6487 20.4231 13.902 21.6878 12.7306C23.6507 10.9137 26.737 11.0073 28.5824 12.9387C29.6737 12.7271 30.7199 12.3327 31.677 11.7738C31.3125 12.8857 30.5513 13.828 29.5348 14.4277C30.5002
|
|
14.3155 31.4443 14.0609 32.3325 13.6728C31.6782 14.6362 30.8553 15.4781 29.9017 16.1562C29.916 16.362 29.916 16.5685 29.916 16.7766Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="https://www.linkedin.com/company/simplex-chat/" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M20.0408 0.926758C8.9951 0.926758 0.0407715 9.88109 0.0407715 20.9268C0.0407715 31.9724 8.9951 40.9268 20.0408 40.9268C31.0864 40.9268 40.0408 31.9724 40.0408 20.9268C40.0408 9.88109 31.0864 0.926758 20.0408 0.926758ZM9.6421 17.4916H14.1745V31.1098H9.6421V17.4916ZM14.4731 13.279C14.4437 11.9438 13.4889 10.9268 11.9383 10.9268C10.3878 10.9268 9.3741 11.9438 9.3741 13.279C9.3741 14.5866 10.3579 15.6328 11.8794 15.6328H11.9084C13.4889 15.6328 14.4731 14.5866 14.4731 13.279ZM25.3017 17.1718C28.2843 17.1718 30.5203 19.1187 30.5203 23.3015L30.5201 31.1098H25.9879V23.824C25.9879 21.994 25.3319 20.7453 23.6912 20.7453C22.439 20.7453 21.6932 21.5871 21.3656 22.4003C21.2458 22.6916 21.2164 23.0976 21.2164 23.5046V31.1101H16.6834C16.6834 31.1101 16.7431 18.7698 16.6834 17.492H21.2164V19.4208C21.8179 18.4936 22.8953 17.1718 25.3017 17.1718Z" />
|
|
</svg>
|
|
</a>
|
|
<a href="https://simplex.chat/feed.rss" target="_blank">
|
|
<svg class="fill-primary-light dark:fill-primary-dark" width="32" height="32" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M256 512C397.385 512 512 397.385 512 256C512 114.615 397.385 0 256 0C114.615 0 0 114.615 0 256C0 397.385 114.615 512 256 512ZM132.791 157.572C215.586 161.137 279.503 196.841 323.612 267.517C344.138 302.436 354.186 339.959 354.57 380.122H406.814C409.639 231.301 280.977 103.1 132.791 106.05V157.572ZM309.994 343.843C311.593 356.035 313.096 367.877 314.65 380.116H261.161C260.496 344.968 248.303 314.452 223.472 289.485C198.613 264.491 168.097 252.282 132.755 251.38V199.743C198.318 196.346 288.694 244.344 309.994 343.843ZM132.766 336.706C129.293 354.261 137.796 370.323 154.848 378.004L155.461 378.242C156.267 378.558 156.912 378.81 157.577 378.985C173.012 383.066 186.298 379.318 196.604 367.168C206.463 355.544 208.397 342.145 201.87 328.354C195.205 314.271 183.419 307.215 167.834 307.356C151.188 307.509 135.971 320.504 132.766 336.706Z" />
|
|
</svg>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</article>
|
|
</div>
|
|
<a href="#" class="text-grey-black dark:text-white text-[16px] text-center lg:ltr:text-left lg:rtl:text-right font-medium leading-[28px] tracking-[0.01em] block mt-[60px]">© 2020-2026 SimpleX Chat | Open-Source Project</a>
|
|
</div>
|
|
</section>
|
|
|
|
|
|
<script src="/js/docs.js"></script>
|
|
<script src="/js/prism.min.js"></script>
|
|
</body>
|
|
|
|
</html> |