From 04e7ccc3d73f53da3e5e69ec7c85db2c6064d878 Mon Sep 17 00:00:00 2001 From: epoberezkin Date: Sat, 20 Sep 2025 18:49:14 +0000 Subject: [PATCH] deploy: a190d4ea9bfcd6aa71ab2d0de3edd2d06a8e0fa7 --- blog/index.html | 2261 +++++++++++++++++++++--------------------- css/tailwind.css | 8 + directory/index.html | 1043 +++++++++++++++++++ img/group.svg | 12 + js/directory.js | 439 ++++++++ js/script.js | 3 +- 6 files changed, 2637 insertions(+), 1129 deletions(-) create mode 100644 directory/index.html create mode 100644 img/group.svg create mode 100644 js/directory.js diff --git a/blog/index.html b/blog/index.html index 2445763e9b..25a82c9782 100644 --- a/blog/index.html +++ b/blog/index.html @@ -397,29 +397,34 @@ window.addEventListener('scroll',changeHeaderBg); + #blog-list ul li { + list-style: disc; + margin-right: 0; + margin-left: 0; + } + + #blog-list ul { + list-style-position: inside; + overflow: auto; + } + + #blog-list ul li { + -webkit-margin-start: 1.1rem; + color: #000; + } + + .dark #blog-list ul li { + color: #fff; + } + + #blog-list ul li::marker { + color: black; + } + + .dark #blog-list ul li::marker { + color: white; + } +
@@ -428,27 +433,27 @@ window.addEventListener('scroll',changeHeaderBg); -
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. -

-

- 29 Jul 2025 -

- -
-

v6.4.1 is released:

+
+
+
+

+ SimpleX Chat v6.4.1: welcome your contacts, review members to protect groups, and more. +

+

+ 29 Jul 2025 +

+ +
+

v6.4.1 is released:

  • welcome your contacts: set your profile bio and welcome message.
  • @@ -459,64 +464,64 @@ window.addEventListener('scroll',changeHeaderBg);

    Also, we added 3 new interface languages to Android and desktop apps thanks to our users: Indonesian, Romanian and Vietnamese.

    -
-
- Read More +
-
+ Read More +
+
-
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4 -

-

- 03 Jul 2025 -

- -

Now you can start talking to your contacts much faster, as soon as you scan the link. This technical post covers the technology that enabled this new user experience — short links and associated data of messaging queues.

- -
- Read More +
+
+
+

+ SimpleX network: new experience of connecting with people — available in SimpleX Chat v6.4-beta.4 +

+

+ 03 Jul 2025 +

+ +

Now you can start talking to your contacts much faster, as soon as you scan the link. This technical post covers the technology that enabled this new user experience — short links and associated data of messaging queues.

+
-
+ Read More +
+
- -
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- SimpleX network: large groups and privacy-preserving content moderation -

-

- 14 Jan 2025 -

- -

This post explains how server operators can moderate end-to-end encrypted conversations without compromising user privacy or End-to-end encryption.

- -
- Read More +
+
+
+

+ SimpleX network: large groups and privacy-preserving content moderation +

+

+ 14 Jan 2025 +

+ +

This post explains how server operators can moderate end-to-end encrypted conversations without compromising user privacy or End-to-end encryption.

+
-
+ Read More +
+
-
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- Oppose digital IDs – they break the law and lead to mass scale surveillance -

-

- 18 Dec 2024 -

- -

Starting next year, the UK government plans to introduce digital ID cards for the young people to prove their age when visiting pubs.

- -
- Read More +
+
+
+

+ Oppose digital IDs – they break the law and lead to mass scale surveillance +

+

+ 18 Dec 2024 +

+ +

Starting next year, the UK government plans to introduce digital ID cards for the young people to prove their age when visiting pubs.

+
-
+ Read More +
+
-
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps -

-

- 10 Dec 2024 -

- -
-

v6.2 is released:

+
+
+
+

+ SimpleX network: preset servers operated by Flux, business chats and more with v6.2 of the apps +

+

+ 10 Dec 2024 +

+ +
+

v6.2 is released:

  • SimpleX Chat and Flux made an agreement to include Flux-operated servers into the app to improve metadata privacy in SimpleX network.
  • @@ -623,105 +628,105 @@ window.addEventListener('scroll',changeHeaderBg);
  • Improving notifications in iOS app.
-
-
- Read More +
-
+ Read More +
+
-
-
-
- - - - - -
+ + Read More +
+
-
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- Wired’s Attack on Privacy -

-

- 16 Oct 2024 -

- -
-

The Wired article by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in +

+
+
+

+ Wired’s Attack on Privacy +

+

+ 16 Oct 2024 +

+ +
+

The Wired article by David Gilbert focusing on neo-Nazis moving to SimpleX Chat following the Telegram's changes in privacy policy is biased and misleading. By cherry-picking information from the report by the Institute for Strategic Dialogue (ISD), Wired fails to mention that SimpleX network design prioritizes privacy in order to protect human rights defenders, journalists, and everyday users who value their privacy.

-
-
- Read More +
-
+ Read More +
+
-
-
-
- - - - - -
+
+
+
+ + + + +
-
-
-

- SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. -

-

- 14 Oct 2024 -

- -
-

New security audit!

+
+
+
+

+ SimpleX network: cryptographic design review by Trail of Bits, v6.1 released with better calls and user experience. +

+

+ 14 Oct 2024 +

+ +
+

New security audit!

Trail of Bits reviewed the cryptographic design of protocols used in SimpleX network and apps.

@@ -733,36 +738,36 @@ window.addEventListener('scroll',changeHeaderBg);
  • Better iOS notifications: improved delivery, reduced traffic usage.
  • Better user experience: switch chat profiles, customizable message shapes, forward up to 20 messages.
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. -

    -

    - 14 Aug 2024 -

    - -
    -

    SimpleX Chat vision and funding 2.0: past, present, future.

    +
    +
    +
    +

    + SimpleX network: the investment from Jack Dorsey and Asymmetric, v6.0 released with the new user experience and private message routing. +

    +

    + 14 Aug 2024 +

    + +
    +

    SimpleX Chat vision and funding 2.0: past, present, future.

    Announcing the investment from Jack Dorsey and Asymmetric.

    @@ -780,68 +785,68 @@ window.addEventListener('scroll',changeHeaderBg);
  • Improved networking and battery usage
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - The Future of Privacy: Enforcing Privacy Standards -

    -

    - 04 Jul 2024 -

    - -
    -

    It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a +

    +
    +
    +

    + The Future of Privacy: Enforcing Privacy Standards +

    +

    + 04 Jul 2024 +

    + +
    +

    It's time we shift the focus: privacy should be a non-negotiable duty of technology providers, not just a right users must fight to protect, and not something that users can be asked to consent away as a condition of access to a service.

    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX network: private message routing, v5.8 released with IP address protection and chat themes -

    -

    - 04 Jun 2024 -

    - -
    -

    v5.8 is released:

    +
    +
    +
    +

    + SimpleX network: private message routing, v5.8 released with IP address protection and chat themes +

    +

    + 04 Jun 2024 +

    + +
    +

    v5.8 is released:

    • private message routing.
    • @@ -855,67 +860,67 @@ window.addEventListener('scroll',changeHeaderBg);

      Also, we added Persian interface language*, thanks to our users and Weblate.

      * Android and desktop apps only.

      -
    -
    - Read More +
    -
    + Read More +
    +
    - -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX: Redefining Privacy by Making Hard Choices -

    -

    - 16 May 2024 -

    - -
    -

    When it comes to open source privacy tools, the status quo often dictates the limitations of +

    +
    +
    +

    + SimpleX: Redefining Privacy by Making Hard Choices +

    +

    + 16 May 2024 +

    + +
    +

    When it comes to open source privacy tools, the status quo often dictates the limitations of existing protocols and structures. However, these norms need to be challenged to radically shift how we approach genuinely private communication. This requires doing some uncomfortable things, like making hard choices as it relates to @@ -932,36 +937,36 @@ window.addEventListener('scroll',changeHeaderBg);

  • Funding and profitability.
  • Company jurisdiction.
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX network: legally binding transparency, v5.7 released with better calls and messages -

    -

    - 26 Apr 2024 -

    - -
    -

    Legally binding transparency

    +
    +
    +
    +

    + SimpleX network: legally binding transparency, v5.7 released with better calls and messages +

    +

    + 26 Apr 2024 +

    + +
    +

    Legally binding transparency

    • We published Transparency Reports, Security Policy, and Frequently Asked Questions, and updated Privacy Policy.
    • @@ -978,70 +983,70 @@ window.addEventListener('scroll',changeHeaderBg);
    • customizable profile images.
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - The dangers of metadata in messengers -

    -

    - 16 Apr 2024 -

    - -
    - By Esra'a al Shafei +
    +
    +
    +

    + The dangers of metadata in messengers +

    +

    + 16 Apr 2024 +

    + +
    + By Esra'a al Shafei

    It's important not to be complacent with the current standards of messaging, where metadata aggregation is still normalized in apps falsely and dangerously marketed as "private". This is a post exploring the fundamental differences between privacy and security.

    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - Why I joined SimpleX Chat - by Esra'a al Shafei -

    -

    - 04 Apr 2024 -

    - -
    - By Esra'a al Shafei +
    +
    +
    +

    + Why I joined SimpleX Chat - by Esra'a al Shafei +

    +

    + 04 Apr 2024 +

    + +
    + By Esra'a al Shafei

    Transitioning from a lifelong career dedicated to nonprofits, including Board roles at organizations like the Wikimedia Foundation, Access Now and Tor, @@ -1050,36 +1055,36 @@ But, as I step into this new chapter, I want to share the insights and convictio that have guided me here, shedding light on what I think sets SimpleX Chat apart and why this move feels like an essential learning opportunity.

    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration -

    -

    - 23 Mar 2024 -

    - -
    -

    SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:

    +
    +
    +
    +

    + SimpleX network: real privacy and stable profits, non-profits for protocols, v5.6 released with quantum resistant e2e encryption and simple profile migration +

    +

    + 23 Mar 2024 +

    + +
    +

    SimpleX network: deliver real privacy via a profitable business and non-profit protocol governance:

    • community and business interests are aligned.
    • @@ -1096,36 +1101,36 @@ and why this move feels like an essential learning opportunity.

    • blocking members and many other improvements.
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v5.6 (beta): adding quantum resistance to Signal Double ratchet algorithm -

    -

    - 14 Mar 2024 -

    - -
    -

    This is a major upgrade for SimpleX Chat messaging protocols!

    +
    +
    +
    +

    + SimpleX Chat v5.6 (beta): adding quantum resistance to Signal Double ratchet algorithm +

    +

    + 14 Mar 2024 +

    + +
    +

    This is a major upgrade for SimpleX Chat messaging protocols!

    This post also covers various aspects of End-to-end encryption:

    @@ -1138,36 +1143,36 @@ and why this move feels like an essential learning opportunity.

  • Next for post-quantum crypto - all direct chats, small groups and security audit
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. -

    -

    - 24 Jan 2024 -

    - -
    -

    SimpleX Chat infrastructure on Linode:

    +
    +
    +
    +

    + SimpleX Chat: free infrastructure from Linode, v5.5 released with private notes, group history and a simpler UX to connect. +

    +

    + 24 Jan 2024 +

    + +
    +

    SimpleX Chat infrastructure on Linode:

    • free infrastructure.
    • @@ -1187,36 +1192,36 @@ and why this move feels like an essential learning opportunity.

      Also, the app interface is now available in Hungarian and Turkish - thanks to our users.

      SimpleX Chat Android and desktop apps are now available in 20 languages!

      -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. -

    -

    - 25 Nov 2023 -

    - -
    -

    v5.4 is released:

    +
    +
    +
    +

    + SimpleX Chat v5.4 - link mobile and desktop apps via quantum resistant protocol, and much better groups. +

    +

    + 25 Nov 2023 +

    + +
    +

    v5.4 is released:

    • Link mobile and desktop apps via secure quantum-resistant protocol. 🔗
    • @@ -1232,36 +1237,36 @@ and why this move feels like an essential learning opportunity.

    • Many other improvements.
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    + + Read More +
    +
    - - -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb -

    -

    - 22 Apr 2023 -

    - -
    -

    SimpleX Chat vision and funding:

    +
    +
    +
    +

    + SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb +

    +

    + 22 Apr 2023 +

    + +
    +

    SimpleX Chat vision and funding:

    • why is it a commercial company?
    • @@ -1431,36 +1436,36 @@ and why this move feels like an essential learning opportunity.

      Also, the app interface is now available in Polish - thanks to our users.

      SimpleX Chat apps are now available in 10 languages!

      -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. -

    -

    - 28 Mar 2023 -

    - -
    -

    v4.6 is released:

    +
    +
    +
    +

    + SimpleX Chat v4.6 – with hidden profiles, community moderation, improved audio/video calls and reduced battery usage. +

    +

    + 28 Mar 2023 +

    + +
    +

    v4.6 is released:

    • ARMv7a and Android 8+ - 2x more supported devices!
    • @@ -1473,64 +1478,64 @@ and why this move feels like an essential learning opportunity.

      Also, the app interface is now available in Chinese and Spanish - thanks to our users!

      -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    + + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v4.5 released – with multiple chat profiles, message draft, transport isolation and Italian language! -

    -

    - 04 Feb 2023 -

    - -
    -

    v4.5 is released:

    +
    +
    +
    +

    + SimpleX Chat v4.5 released – with multiple chat profiles, message draft, transport isolation and Italian language! +

    +

    + 04 Feb 2023 +

    + +
    +

    v4.5 is released:

    • multiple chat profiles!
    • @@ -1541,36 +1546,36 @@ and why this move feels like an essential learning opportunity.

    Also, the app interface is now available in Italian - thanks to Weblate and our users!

    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language! -

    -

    - 03 Jan 2023 -

    - -
    -

    v4.4 is released:

    +
    +
    +
    +

    + SimpleX Chat v4.4 released – with disappearing messages, live messages, connection security verification and French language! +

    +

    + 03 Jan 2023 +

    + +
    +

    v4.4 is released:

    • disappearing messages!
    • @@ -1581,36 +1586,36 @@ and why this move feels like an essential learning opportunity.

      Also, the app interface is now available in French - thanks to Weblate and our users!

      -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. -

    -

    - 06 Dec 2022 -

    - -
    -

    SimpleX Chat November reviews:

    +
    +
    +
    +

    + SimpleX Chat reviews and v4.3 released – with instant voice messages, irreversible deletion of sent messages and improved server configuration. +

    +

    + 06 Dec 2022 +

    + +
    +

    SimpleX Chat November reviews:

    Privacy Guides recommendations.

    Review by Mike Kuketz.

    @@ -1626,36 +1631,36 @@ and why this move feels like an essential learning opportunity.

  • privacy and security improvements: protect app screen, SimpleX links security, etc.
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - Security assessment by Trail of Bits, the new website and v4.2 released -

    -

    - 08 Nov 2022 -

    - -
    -

    "Have you been audited or should we just ignore you?"

    +
    +
    +
    +

    + Security assessment by Trail of Bits, the new website and v4.2 released +

    +

    + 08 Nov 2022 +

    + +
    +

    "Have you been audited or should we just ignore you?"

    SimpleX Chat security has been assessed by @@ -1674,36 +1679,36 @@ and why this move feels like an essential learning opportunity.

  • manually switch contact or member to another address / server (BETA)
  • receive files faster (BETA)
  • -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v4.0 with encrypted database is released -

    -

    - 28 Sep 2022 -

    - -
    -

    Added:

    +
    +
    +
    +

    + SimpleX Chat v4.0 with encrypted database is released +

    +

    + 28 Sep 2022 +

    + +
    +

    Added:

    • encrypted local chat database — if you already use the app, you can encrypt the database in the app settings
    • support for self-hosted WebRTC ICE servers
    • @@ -1714,36 +1719,36 @@ and why this move feels like an essential learning opportunity.

    • German language in mobile apps UI
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v3.2 is released — meet Incognito mode, unique to Simplex Chat -

    -

    - 01 Sep 2022 -

    - -
    -

    Added:

    +
    +
    +
    +

    + SimpleX Chat v3.2 is released — meet Incognito mode, unique to Simplex Chat +

    +

    + 01 Sep 2022 +

    + +
    +

    Added:

    • Incognito mode — use a new random profile name for each contact
    • use .onion server addresses with Tor
    • @@ -1752,36 +1757,36 @@ and why this move feels like an essential learning opportunity.

    • reduced APK size for direct download and in F-Droid repo from 200 to 46Mb!
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    + + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX Chat v3.1-beta is released — improved battery/traffic usage -

    -

    - 23 Jul 2022 -

    - -
    -

    Added:

    +
    +
    +
    +

    + SimpleX Chat v3.1-beta is released — improved battery/traffic usage +

    +

    + 23 Jul 2022 +

    + +
    +

    Added:

    • terminal app: access to messaging servers via SOCKS5 proxy (e.g., Tor).
    • mobile apps: join and leave chat groups.
    • @@ -1827,36 +1832,36 @@ and why this move feels like an essential learning opportunity.

    • two docker configurations for self-hosted SMP servers.
    -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    +
    +
    +
    + + + + +
    -
    -
    -

    - SimpleX announces SimpleX Chat v3 — with encrypted calls and iOS push notifications -

    -

    - 11 Jul 2022 -

    - -
    -

    Added:

    +
    +
    +
    +

    + SimpleX announces SimpleX Chat v3 — with encrypted calls and iOS push notifications +

    +

    + 11 Jul 2022 +

    + +
    +

    Added:

    • chat database export and import
    • end-to-end encrypted audio/video calls
    • @@ -1866,36 +1871,36 @@ and why this move feels like an essential learning opportunity.

      Also read why having users' identifiers that all other platforms use is bad for the users, and how they reduce privacy.

      -
    -
    - Read More +
    -
    + Read More +
    +
    -
    -
    -
    - - - - - -
    + + Read More +
    +
    - - - - - - - - - -
    -
    -
    - - - - -
    +
    +
    +
    + + + +
    -
    -
    -

    - Simplex Chat -

    -

    - 22 Oct 2020 -

    - -

    The prototype of SimpleX Messaging Server implementing SMP protocol.

    - -
    - Read More +
    +
    +
    +

    + Simplex Chat +

    +

    + 22 Oct 2020 +

    + +

    The prototype of SimpleX Messaging Server implementing SMP protocol.

    +
    -
    + Read More +
    +
    diff --git a/css/tailwind.css b/css/tailwind.css index eab0c0274e..6eb2f860ad 100644 --- a/css/tailwind.css +++ b/css/tailwind.css @@ -1221,6 +1221,10 @@ video { flex: 2.5; } +.flex-grow { + flex-grow: 1; +} + .border-separate { border-collapse: separate; } @@ -2054,6 +2058,10 @@ video { box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); } +.outline { + outline-style: solid; +} + .blur { --tw-blur: blur(8px); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); diff --git a/directory/index.html b/directory/index.html new file mode 100644 index 0000000000..c7ae4df9c7 --- /dev/null +++ b/directory/index.html @@ -0,0 +1,1043 @@ + + + + + + + SimpleX Directory + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + + + + + + + + + + + + + + +
    +
    + + + + +
    + + + + + + + +
    +
    +

    SimpleX Directory

    +

    Welcome to the selected users' communities that you can join via SimpleX Chat + app.

    +

    SimpleX Directory is also available as a SimpleX chat bot.

    +

    Read about how to add your community.

    +
    + + +
    +
    + +
    +
    + + +
    + +
    + + + + + + + diff --git a/img/group.svg b/img/group.svg new file mode 100644 index 0000000000..2a262ef38a --- /dev/null +++ b/img/group.svg @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/js/directory.js b/js/directory.js new file mode 100644 index 0000000000..2eb8db71a1 --- /dev/null +++ b/js/directory.js @@ -0,0 +1,439 @@ +const directoryDataURL = 'https://directory.simplex.chat/data/'; + +// const directoryDataURL = 'http://localhost:8080/directory-data/'; + +let allEntries = []; + +let sortedEntries = []; + +let filteredEntries = []; + +let currentSortMode = ''; + +async function initDirectory() { + const listing = await fetchJSON(directoryDataURL + 'listing.json') + const liveBtn = document.querySelector('#top-pagination .live'); + const newBtn = document.querySelector('#top-pagination .new'); + const topBtn = document.querySelector('#top-pagination .top'); + const searchInput = document.getElementById('search'); + allEntries = listing.entries + renderSortedEntries('top', byMemberCountDesc, topBtn) + window.addEventListener('hashchange', renderDirectoryPage); + searchInput.addEventListener('input', (e) => renderFilteredEntries(e.target.value)); + + liveBtn.addEventListener('click', () => renderSortedEntries('live', byActiveAtDesc, liveBtn)); + newBtn.addEventListener('click', () => renderSortedEntries('new', byCreatedAtDesc, newBtn)); + topBtn.addEventListener('click', () => renderSortedEntries('top', byMemberCountDesc, topBtn)); + + function renderSortedEntries(mode, comparator, btn) { + if (currentSortMode === mode) return; + currentSortMode = mode; + if (location.hash) location.hash = ''; + liveBtn.classList.remove('active'); + newBtn.classList.remove('active'); + topBtn.classList.remove('active'); + btn.classList.add('active'); + sortedEntries = allEntries.slice().sort(comparator); + renderFilteredEntries(searchInput.value); + } +} + +function renderDirectoryPage() { + const currentEntries = addPagination(filteredEntries); + displayEntries(currentEntries); +} + +function renderFilteredEntries(s) { + const query = s.toLowerCase().trim(); + if (query === '') { + filteredEntries = sortedEntries.slice(); + } else { + filteredEntries = sortedEntries.filter(entry => + (entry.displayName || '').toLowerCase().includes(query) + || includesQuery(entry.shortDescr, query) + || includesQuery(entry.welcomeMessage, query) + ); + } + renderDirectoryPage(); +} + +function includesQuery(field, query) { + return field + && Array.isArray(field) + && field.some(ft => { + switch (ft.format?.type) { + case 'uri': return uriIncludesQuery(ft.text, query); + case 'hyperLink': return textIncludesQuery(ft.format.showText, query) || uriIncludesQuery(ft.format.linkUri, query); + case 'simplexLink': return textIncludesQuery(ft.format.showText, query); + default: return textIncludesQuery(ft.text, query); + } + }); +} + +function textIncludesQuery(text, query) { + text ? text.toLowerCase().includes(query) : false +} + +function uriIncludesQuery(uri, query) { + if (!uri) return false; + uri = uri.toLowerCase(); + return !uri.includes('simplex') && uri.includes(query); +} + +async function fetchJSON(url) { + try { + const response = await fetch(url) + if (!response.ok) throw new Error(`HTTP error! Status: ${response.status}`) + return await response.json() + } catch (error) { + console.error('Error fetching JSON:', error) + } +} + +function byMemberCountDesc(entry1, entry2) { + return entryMemberCount(entry2) - entryMemberCount(entry1); +} + +function byActiveAtDesc(entry1, entry2) { + return (roundedTs(entry2.activeAt) - roundedTs(entry1.activeAt)) * 10 + + Math.sign(byMemberCountDesc(entry1, entry2)); +} + +function byCreatedAtDesc(entry1, entry2) { + return (roundedTs(entry2.createdAt) - roundedTs(entry1.createdAt)) * 10 + + Math.sign(byMemberCountDesc(entry1, entry2)); +} + +function roundedTs(s) { + try { + // rounded to 15 minutes, which is the frequency of listing update + return Math.floor(new Date(s).valueOf() / 900000); + } catch { + return 0; + } +} + +function entryMemberCount(entry) { + return entry.entryType.type == 'group' + ? (entry.entryType.summary?.currentMembers ?? 0) + : 0 +} + +function displayEntries(entries) { + const directory = document.getElementById('directory'); + directory.innerHTML = ''; + + for (let entry of entries) { + try { + const { entryType, displayName, groupLink, shortDescr, welcomeMessage, imageFile } = entry; + const entryDiv = document.createElement('div'); + entryDiv.className = 'entry w-full flex flex-col items-start md:flex-row rounded-[4px] overflow-hidden shadow-[0px_20px_30px_rgba(0,0,0,0.12)] dark:shadow-none bg-white dark:bg-[#11182F] mb-8'; + + const textContainer = document.createElement('div'); + textContainer.className = 'text-container'; + + const nameElement = document.createElement('h2'); + nameElement.textContent = displayName; + nameElement.className = 'text-grey-black dark:text-white !text-lg md:!text-xl font-bold'; + textContainer.appendChild(nameElement); + + const welcomeMessageHTML = welcomeMessage ? renderMarkdown(welcomeMessage) : undefined; + const shortDescrHTML = shortDescr ? renderMarkdown(shortDescr) : undefined; + if (shortDescrHTML && welcomeMessageHTML?.includes(shortDescrHTML) !== true) { + const descrElement = document.createElement('p'); + descrElement.innerHTML = renderMarkdown(shortDescr); + textContainer.appendChild(descrElement); + } + + if (welcomeMessageHTML) { + const messageElement = document.createElement('p'); + messageElement.innerHTML = welcomeMessageHTML; + textContainer.appendChild(messageElement); + + const readMore = document.createElement('p'); + readMore.textContent = 'Read more'; + readMore.className = 'read-more'; + readMore.style.display = 'none'; + textContainer.appendChild(readMore); + + setTimeout(() => { + const computedStyle = window.getComputedStyle(messageElement); + const lineHeight = parseFloat(computedStyle.lineHeight); + const maxLines = 5; + const maxHeight = maxLines * lineHeight + const maxHeightPx = `${maxHeight}px`; + messageElement.style.maxHeight = maxHeightPx; + messageElement.style.overflow = 'hidden'; + + if (messageElement.scrollHeight > maxHeight + 4) { + readMore.style.display = 'block'; + readMore.addEventListener('click', () => { + if (messageElement.style.maxHeight === maxHeightPx) { + messageElement.style.maxHeight = 'none'; + readMore.className = 'read-less'; + readMore.innerHTML = '▲'; + } else { + messageElement.style.maxHeight = maxHeightPx; + readMore.className = 'read-more'; + readMore.textContent = 'Read more'; + } + }); + } + }, 0); + } + + const memberCount = entryMemberCount(entry); + if (typeof memberCount == 'number' && memberCount > 0) { + const memberCountElement = document.createElement('p'); + memberCountElement.innerText = `${memberCount} members`; + memberCountElement.classList = ['text-sm']; + textContainer.appendChild(memberCountElement); + } + + const imgElement = document.createElement('a'); + imgSource = + imageFile + ? directoryDataURL + imageFile + : "/img/group.svg"; + imgElement.innerHTML = `${displayName}`; + imgElement.href = platformSimplexUri(groupLink.connShortLink ?? groupLink.connFullLink); + if (!isCurrentSite(imgElement.href)) imgElement.target = "_blank"; + imgElement.title = `Join ${displayName}`; + entryDiv.appendChild(imgElement); + + entryDiv.appendChild(textContainer); + directory.appendChild(entryDiv); + } catch (e) { + console.log(e); + } + } + + for (let el of document.querySelectorAll('.secret')) { + el.addEventListener('click', () => el.classList.toggle('visible')); + } + + directory.style.height = ''; +} + +function goToPage(p) { + location.hash = p.toString(); +} + +function addPagination(entries) { + const entriesPerPage = 10; + const totalPages = Math.ceil(entries.length / entriesPerPage); + let currentPage = parseInt(location.hash.slice(1)) || 1; + if (currentPage < 1) currentPage = 1; + if (currentPage > totalPages) currentPage = totalPages; + + const startIndex = (currentPage - 1) * entriesPerPage; + const endIndex = Math.min(startIndex + entriesPerPage, entries.length); + const currentEntries = entries.slice(startIndex, endIndex); + + // addPaginationElements('top-pagination') + addPaginationElements('bottom-pagination') + return currentEntries; + + function addPaginationElements(paginationId) { + const pagination = document.getElementById(paginationId); + if (!pagination) { + return currentEntries; + } + pagination.innerHTML = ''; + + try { + let startPage, endPage; + const pageButtonCount = 8 + if (totalPages <= pageButtonCount) { + startPage = 1; + endPage = totalPages; + } else { + startPage = Math.max(1, currentPage - 4); + endPage = Math.min(totalPages, startPage + pageButtonCount - 1); + if (endPage - startPage + 1 < pageButtonCount) { + startPage = Math.max(1, endPage - pageButtonCount + 1); + } + } + + // if (currentPage > 1 && startPage > 1) { + // const firstBtn = document.createElement('button'); + // firstBtn.textContent = 'First'; + // firstBtn.classList.add('text-btn'); + // firstBtn.addEventListener('click', () => goToPage(1)); + // pagination.appendChild(firstBtn); + // } + + if (currentPage > 1) { + const prevBtn = document.createElement('button'); + prevBtn.textContent = 'Prev'; + prevBtn.classList.add('text-btn'); + prevBtn.addEventListener('click', () => goToPage(currentPage - 1)); + pagination.appendChild(prevBtn); + } + + for (let p = startPage; p <= endPage; p++) { + const pageBtn = document.createElement('button'); + pageBtn.textContent = p.toString(); + if (p === currentPage) { + pageBtn.classList.add('active'); + } else if (p === currentPage - 1 || p === currentPage + 1) { + pageBtn.classList.add('neighbor'); + } + pageBtn.addEventListener('click', () => goToPage(p)); + pagination.appendChild(pageBtn); + } + + if (currentPage < totalPages) { + const nextBtn = document.createElement('button'); + nextBtn.textContent = 'Next'; + nextBtn.classList.add('text-btn'); + nextBtn.addEventListener('click', () => goToPage(currentPage + 1)); + pagination.appendChild(nextBtn); + } + + // if (endPage < totalPages) { + // const lastBtn = document.createElement('button'); + // lastBtn.textContent = 'Last'; + // lastBtn.classList.add('text-btn'); + // lastBtn.addEventListener('click', () => goToPage(totalPages)); + // pagination.appendChild(lastBtn); + // } + + } catch (e) { + console.log(e); + } + } +} + +if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initDirectory); +} else { + initDirectory(); +} + +function escapeHtml(text) { + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'") + .replace(/\n/g, "
    "); +} + +function getSimplexLinkDescr(linkType) { + switch (linkType) { + case 'contact': return 'SimpleX contact address'; + case 'invitation': return 'SimpleX one-time invitation'; + case 'group': return 'SimpleX group link'; + case 'channel': return 'SimpleX channel link'; + case 'relay': return 'SimpleX relay link'; + default: return 'SimpleX link'; + } +} + +function viaHost(smpHosts) { + const first = smpHosts[0] ?? '?'; + return `via ${first}`; +} + +function isCurrentSite(uri) { + return uri.startsWith("https://simplex.chat") || uri.startsWith("https://www.simplex.chat") +} + +function targetBlank(uri) { + return isCurrentSite(uri) ? '' : ' target="_blank"' +} + +function platformSimplexUri(uri) { + if (isMobile.any()) return uri; + if (uri.startsWith('simplex:/g#')) { + const prefixLength = 'simplex:/g#'.length; + const fragment = uri.substring(prefixLength); + const queryIndex = fragment.indexOf('?'); + if (queryIndex === -1) return uri; + const hashPart = fragment.substring(0, queryIndex); + const queryStr = fragment.substring(queryIndex + 1); + const params = new URLSearchParams(queryStr); + const host = params.get('h'); + if (!host) return uri; + params.delete('h'); + let newFragment = hashPart; + const remainingParams = params.toString(); + if (remainingParams) newFragment += '?' + remainingParams; + return `https://${host}:/g#${newFragment}`; + } else if(uri.startsWith('simplex:/')) { + const prefixLength = 'simplex:/'.length; + return 'https://simplex.chat/' + uri.substring(prefixLength); + } else { + return uri; + } +} + +function renderMarkdown(fts) { + let html = ''; + for (const ft of fts) { + const { format, text } = ft; + if (!format) { + html += escapeHtml(text); + continue; + } + try { + switch (format.type) { + case 'bold': + html += `${escapeHtml(text)}`; + break; + case 'italic': + html += `${escapeHtml(text)}`; + break; + case 'strikeThrough': + html += `${escapeHtml(text)}`; + break; + case 'snippet': + html += `${escapeHtml(text)}`; + break; + case 'secret': + html += `${escapeHtml(text)}`; + break; + case 'colored': + html += `${escapeHtml(text)}`; + break; + case 'uri': + let href = text.startsWith('http://') || text.startsWith('https://') || text.startsWith('simplex:/') ? text : 'https://' + text; + html += `${escapeHtml(text)}`; + break; + case 'hyperLink': { + const { showText, linkUri } = format; + html += `${escapeHtml(showText ?? linkUri)}`; + break; + } + case 'simplexLink': { + const { showText, linkType, simplexUri, smpHosts } = format; + const linkText = showText ? escapeHtml(showText) : getSimplexLinkDescr(linkType); + html += `${linkText} (${viaHost(smpHosts)})`; + break; + } + case 'command': + html += `${escapeHtml(text)}`; + break; + case 'mention': + html += `${escapeHtml(text)}`; + break; + case 'email': + html += `${escapeHtml(text)}`; + break; + case 'phone': + html += `${escapeHtml(text)}`; + break; + case 'unknown': + html += escapeHtml(text); + break; + default: + html += escapeHtml(text); + } + } catch { + html += escapeHtml(text); + } + } + return html; +} diff --git a/js/script.js b/js/script.js index 5f863f48ee..cf240dd375 100644 --- a/js/script.js +++ b/js/script.js @@ -26,7 +26,8 @@ const uniqueSwiper = new Swiper('.unique-swiper', { const isMobile = { Android: () => navigator.userAgent.match(/Android/i), - iOS: () => navigator.userAgent.match(/iPhone|iPad|iPod/i) + iOS: () => navigator.userAgent.match(/iPhone|iPad|iPod/i), + any: () => navigator.userAgent.match(/Android|iPhone|iPad|iPod/i) }; const privateSwiper = new Swiper('.private-swiper', {