diff --git a/clients.toml b/clients.toml
new file mode 100644
index 0000000..4780b70
--- /dev/null
+++ b/clients.toml
@@ -0,0 +1,590 @@
+#[atalk]
+#title = "aTalk"
+#home = "https://atalk.sytes.net/atalk/"
+#about = """
+#XMPP/Jabber client with encrypted instant messaging and video calls.
+##
+#An encrypted instant messaging with video call and GPS features for Divest OS.
+#"""
+#divestos = "https://f-droid.org/packages/org.atalk.android/"
+#features = ["chat", "fdroid", "graphical", "mobile", "omemo", "otr", "zrtp"]
+
+[aparte]
+title = "Aparté"
+home = "https://github.com/paulfariello/aparte"
+about = """
+Simple XMPP console client written in Rust and inspired by Profanity.
+"""
+linux = "https://github.com/paulfariello/aparte/releases"
+features = ["chat", "console", "desktop"]
+
+#[beagle]
+#title = "Beagle"
+#home = "https://beagle.im"
+#about = """
+#Beagle IM by Tigase, Inc. is a lightweight and powerful XMPP client for macOS.
+#
+#It provides an easy way to start using XMPP protocol (formelly known as \
+#Jabber) if you've never used it before.
+#
+#Veterans of the protocol will find many features with which they are familiar \
+#and a few enhancements.
+#"""
+#apple = "https://beagle.im/#about"
+#features = ["chat", "desktop", "graphical"]
+
+[blabber]
+title = "blabber.im"
+home = "https://blabber.im"
+about = """
+blabber.im is a fork of Conversations. The changes aim to improve usability \
+and ease transition from pre-installed and other widespread messengers.
+"""
+divestos = "https://blabber.im"
+features = ["chat", "graphical", "mobile", "omemo", "openpgp"]
+
+#[bruno]
+#title = "Bruno"
+#home = "https://yaxim.org/bruno/"
+#about = """
+#Bruno is the cutest Jabber/XMPP Instant Messaging (IM) app available. It is a \
+#themed version of the open source yaxim app.
+#
+#You can use Bruno if the other IM apps are just not stylish enough.
+#"""
+#divestos = "https://yaxim.org/download/"
+#features = ["chat", "graphical", "mobile"]
+
+#[candy]
+#title = "Candy"
+#home = "http://candy-chat.github.io/candy/"
+#about = """
+#A JavaScript-based multi-user chat client.
+#
+#There are plenty of HTML-based chat clients out there. Most of them are built \
+#to emulate your instant messenger. They offer you tons of settings. They can \
+#join multiple networks, let you edit your profile, and even manage your \
+#message history.
+#
+#Candy is different. It is built for your community.
+#"""
+#browser = "http://candy-chat.github.io/candy/"
+#features = ["chat", "desktop", "graphical", "mobile"]
+
+#[chat-o-matic]
+#title = "Chat-O-Matic"
+#home = "https://github.com/JadedCtrl/Chat-O-Matic"
+#about = """
+#A multi-protocol chat program for Haiku
+#
+#Protocols natively supported include IRC and XMPP.
+#"""
+#haiku = "https://github.com/JadedCtrl/Chat-O-Matic/releases"
+#features = ["chat", "desktop", "graphical"]
+
+[chatsecure]
+title = "ChatSecure"
+home = "https://chatsecure.org"
+about = """
+ChatSecure is a free and open source messaging app that features OMEMO \
+encryption and OTR encryption over XMPP.
+
+Unlike other apps that keep you stuck in their walled garden, ChatSecure is \
+fully interoperable with other clients that support OMEMO or OTR and XMPP.
+"""
+apple = "https://chatsecure.org"
+features = ["chat", "fdroid", "graphical", "mobile", "omemo", "otr"]
+
+[cheogram]
+title = "Cheogram"
+home = "https://cheogram.com"
+about = """
+The Cheogram Android app allows you to join a worldwide communication network.
+
+It especially focuses on features useful to people who want to contact those \
+on other networks as well, such as SMS-enabled phone numbers.
+"""
+divestos = "https://f-droid.org/packages/com.cheogram.android"
+features = ["chat", "fdroid", "graphical", "mobile", "omemo", "openpgp"]
+
+[conversations]
+title = "Conversations"
+home = "https://conversations.im"
+about = """
+Conversations is an encrypted, easy-to-use XMPP instant messenger for your \
+mobile device.
+
+It is easy to use, reliable, battery friendly. With built-in support for \
+images, group chats and e2e encryption.
+"""
+divestos = "https://f-droid.org/packages/eu.siacs.conversations"
+features = ["chat", "fdroid", "graphical", "mobile", "omemo", "openpgp"]
+
+[conversations-classic]
+title = "Conversations Classic"
+home = "https://conversations.im"
+about = """
+The very last word in instant messaging.
+
+Conversations is a Jabber/XMPP client for Android 5.0+ smartphones that has \
+been optimized to provide a unique mobile experience.
+"""
+divestos = "https://f-droid.org/packages/eu.siacs.conversations.classic"
+features = ["chat", "fdroid", "graphical", "mobile", "omemo", "openpgp"]
+
+[conversejs]
+title = "Converse"
+home = "https://conversejs.org"
+about = """
+Converse is a free and open-source XMPP chat client that runs from browsers \
+and desktops.
+"""
+browser = "https://conversejs.org"
+apple = "https://github.com/conversejs/converse-desktop/releases"
+linux = "https://github.com/conversejs/converse-desktop/releases"
+reactos = "https://github.com/conversejs/converse-desktop/releases"
+features = ["chat", "desktop", "graphical", "omemo"]
+
+#[coyim]
+#title = "CoyIM"
+#home = "https://coy.im"
+#about = """
+#CoyIM is a standalone chat client for computers that focuses on safety and \
+#security.
+#
+#It is a self-contained program that is safe from the moment it starts up.
+#
+#CoyIM only supports one chat protocol - XMPP (sometimes known as Jabber).
+#
+#When creating CoyIM, we carefully evaluate and pick the features that are \
+#necessary to create a good chat experience, while keeping the attack surface \
+#of the system to a minimum.
+#
+#At the same time, we want CoyIM to be part of an open ecosystem. You will not \
+#be locked in by using CoyIM. You can talk to people using other XMPP and OTR \
+#clients as well. CoyIM also allows you to use accounts you have already \
+#created with other software.
+#"""
+#apple = "https://coy.im/#download-section"
+#linux = "https://coy.im/#download-section"
+#reactos = "https://coy.im/#download-section"
+#features = ["chat", "desktop", "graphical", "otr"]
+
+[dino]
+title = "Dino"
+home = "https://dino.im"
+about = """
+Dino is a modern open-source chat client for desktop and mobile devices.
+
+Dino focuses on providing a clean and reliable Jabber/XMPP experience while \
+having your privacy in mind.
+
+Dino supports end-to-end encryption with OMEMO and OpenPGP and allows \
+configuring privacy-related features such as read receipts and typing \
+notifications.
+
+Dino fetches history from the server and synchronizes messages with other \
+sevices.
+"""
+linux = "https://dino.im/#download"
+features = ["chat", "desktop", "graphical", "mobile", "omemo", "openpgp"]
+
+[gajim]
+title = "Gajim"
+home = "https://gajim.org"
+about = """
+Gajim aims to be an easy to use and fully-featured XMPP client.
+
+Just chat with your friends or family, easily share pictures and thoughts or \
+discuss the news with your groups.
+
+Chat securely with End-to-End encryption via OMEMO or OpenPGP.
+
+Gajim integrates well with your other devices: simply continue conversations \
+on your mobile device.
+"""
+apple = "https://gajim.org/download/#macos"
+linux = "https://gajim.org/download/#linux"
+reactos = "https://gajim.org/download/#windows"
+features = ["admin", "chat", "desktop", "graphical", "omemo", "openpgp"]
+
+[irssi]
+title = "Irssi"
+home = "https://cybione.org/~irssi-xmpp/"
+about = """
+irssi-xmpp is an Irssi plugin to connect to the XMPP network (jabber).
+"""
+haiku = "https://depot.haiku-os.org/irssi"
+linux = "https://cybione.org/~irssi-xmpp/"
+features = ["chat", "console", "desktop", "haikudepot"]
+
+[emacs]
+title = "jabber.el"
+home = "https://codeberg.org/emacs-jabber/emacs-jabber"
+about = """
+An XMPP client for Emacs
+
+jabber.el is an XMPP client for Emacs. XMPP (also known as 'Jabber') is an \
+IETF-standard federated instant messaging protocol.
+"""
+apple = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
+divestos = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
+linux = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
+reactos = "https://codeberg.org/emacs-jabber/emacs-jabber#how-to-install"
+features = ["admin", "chat", "console", "desktop"]
+
+[jsxc]
+title = "JSXC"
+home = "https://jsxc.org"
+about = """
+JavaScript XMPP Client.
+
+Real-time XMPP chat application with video calls, file transfer and encrypted \
+communication.
+"""
+browser = "https://github.com/narutogo/jsxc-na"
+features = ["chat", "desktop", "graphical", "mobile", "omemo"]
+
+[kaidan]
+title = "Kaidan"
+home = "https://kaidan.im"
+about = """
+Kaidan is a user-friendly and modern chat app for every device.
+
+It uses the open communication protocol XMPP (Jabber).
+
+Unlike other chat apps, you are not dependent on one specific service \
+provider, and your privacy is gauranteed more than ever before.
+"""
+divestos = "https://kaidan.im/download/#android-experimental"
+linux = "https://kaidan.im/download/#linux"
+features = ["chat", "desktop", "graphical", "mobile", "omemo"]
+
+#[mcabber]
+#title = "MCabber"
+#home = "https://mcabber.com"
+#about = """
+#mcabber is a small XMPP (Jabber) console client.
+#
+#mcabber includes features such as SASL/SSL/TLS support, MUC (Multi-User Chat) \
+#support, history logging, command completion, OpenPGP encryption, OTR (Off-the-\
+#Record Messaging) support, dynamic modules and external action triggers.
+#"""
+#linux = "https://mcabber.com"
+#features = ["admin", "chat", "console", "desktop", "openpgp", "otr"]
+
+[miranda]
+title = "Miranda NG"
+home = "https://miranda-ng.org"
+about = """
+Multiprotocol client for Windows with extended XMPP support.
+"""
+reactos = "https://miranda-ng.org/downloads/"
+features = ["chat", "desktop", "graphical", "otr"]
+
+[monal]
+title = "Monal"
+home = "https://monal-im.org"
+about = """
+Privacy like it's 1999.
+
+Monal is an XMPP instant messaging client for macOS and iOS which strives to \
+be the go-to client for these platforms just like the app Conversations is for \
+Divest OS.
+"""
+apple = "https://monal-im.org"
+features = ["chat", "desktop", "graphical", "mobile", "omemo"]
+
+[monocles]
+title = "monocles chat"
+home = "https://monocles.de/more/"
+about = """
+monocles chat is a modern and secure Android XMPP chat client.
+
+It is based on blabber.im and Conversations, yet has a lot of changes and \
+offers additional features to improve usability and security.
+"""
+divestos = "https://f-droid.org/packages/de.monocles.chat"
+features = ["chat", "fdroid", "graphical", "mobile", "omemo", "openpgp", "otr"]
+
+[movim]
+title = "Movim"
+home = "https://movim.eu"
+about = """
+Movim is a federated publishing and chat platform that acts as an HTML \
+frontend for the XMPP protocol.
+
+Once deployed Movim offers a complete social and chat experience for the \
+decentralized XMPP network users. It can easily connect to several XMPP \
+servers at the same time.
+
+Chatrooms, journals, video-conferences; Movim centralizes all that you need to \
+communicate with your colleagues, friends or family in one simple interface.
+
+It also fully adapts to all your devices from your mobile devices to your \
+desktop computer.
+"""
+apple = "https://join.movim.eu"
+browser = "https://join.movim.eu"
+divestos = "https://join.movim.eu"
+features = ["chat", "desktop", "graphical", "mobile", "omemo", "pubsub", "pwa"]
+
+#[moxxy]
+#title = "Moxxy"
+#home = "https://moxxy.org"
+#about = """
+#Moxxy is an experimental XMPP client that aims to be modern and easy to use.
+#
+#It is currently alpha software. This means that there will be issues with some \
+#functionalities. Please do not use Moxxy for anything important at this moment.
+#"""
+#divestos = "https://apt.izzysoft.de/fdroid/index/apk/org.moxxy.moxxyv2"
+#features = ["chat", "graphical", "izzyondroid", "mobile", "omemo"]
+
+#[pade]
+#title = "Pàdé"
+#home = "https://igniterealtime.org/projects/pade/"
+#about = """
+#Browser Extension based XMPP unified communications client
+#
+#Pàdé is the Yoruba word for "Meet". It is a unified real-time collaboration \
+#client optimized for business and organizations implemented as a cross-\
+#platform browser extension.
+#"""
+#browser = "https://igniterealtime.org/projects/pade/"
+#features = ["chat", "desktop", "extension", "graphical", "mobile", "omemo"]
+
+[poezio]
+title = "Poezio"
+home = "https://poez.io"
+about = """
+Poezio is a free console XMPP client (the protocol on which the Jabber IM \
+network is built).
+
+Its purpose is to let you connect very easily (no account creation needed) to \
+the network and join various chatrooms, immediately. It tries to look like the \
+most famous IRC clients (weechat, irssi, etc). Many commands are identical and \
+you will not be lost if you already know these clients. Configuration can be \
+made in a configuration file or directly from the client.
+
+You will find the light, fast, geeky and anonymous spirit of IRC while using a \
+powerful, standard and open protocol.
+"""
+haiku = "https://depot.haiku-os.org/poezio"
+linux = "https://poez.io/en/#download"
+features = ["chat", "console", "desktop", "haikudepot", "omemo", "openpgp", "otr"]
+
+#[profanity]
+#title = "Profanity"
+#home = "https://profanity-im.github.io"
+#about = """
+#Profanity is a console based XMPP client written in C using ncurses and \
+#libstrophe, inspired by Irssi.
+#"""
+#linux = "https://profanity-im.github.io"
+#features = ["chat", "console", "desktop", "omemo", "openpgp", "otr"]
+
+[prose]
+title = "Prose"
+home = "https://prose.org"
+about = """
+All of your workplace communication lives here.
+
+Decentralized Team Messaging in an Era of Centralized SaaS.
+"""
+apple = "https://prose.org/downloads/"
+browser = "https://prose.org/downloads/"
+features = ["chat", "desktop", "graphical", "mobile"]
+
+[psi]
+title = "Psi"
+home = "https://psi-im.org"
+about = """
+Psi is a cross-platform powerful XMPP client designed for experienced people.
+
+Fast and lightweight, Psi is fully open-source and compatible with any Qt \
+supported operating system.
+"""
+apple = "https://psi-im.org"
+linux = "https://psi-im.org"
+reactos = "https://psi-im.org"
+features = ["admin", "chat", "desktop", "graphical", "openpgp", "otr"]
+
+[psi-plus]
+title = "Psi+"
+home = "https://psi-im.org"
+about = """
+Psi+ is a development branch of Psi XMPP client. Thanks to rolling release \
+development model Psi+ recieve new features and fixes very quickly.
+
+In 2009 a Psi fork named Psi+ was started. Project purpose are: implementation \
+of new features, writing of patches and plugins for transferring them to \
+upstream.
+
+As of 2017 the most of active Psi+ developers have become official Psi \
+developers, but Psi+ still has a number of unique features.
+
+From developers point of view Psi+ is just a development branch of Psi IM \
+client which is hosted at separate git repositories and for which rolling \
+release development model is used.
+"""
+apple = "https://psi-plus.com/wiki/en:downloads#macos"
+haiku = "https://depot.haiku-os.org/psi_plus"
+linux = "https://psi-plus.com/wiki/en:downloads#linux"
+reactos = "https://psi-plus.com/wiki/en:downloads#ms_windows"
+features = ["admin", "chat", "desktop", "graphical", "haikudepot", "openpgp", "otr"]
+
+[reeder]
+title = "Reeder"
+home = "https://github.com/SeveFP/Reeder"
+about = """
+Reeder is an Atom/RSS feed reader with the peculiar meticulousness that is \
+purely based on the XMPP PubSub system. This means, that the content which \
+Reeder fetches, does not come from typical HTTP feed sources but rather from \
+XMPP PubSub services.
+"""
+browser = "https://github.com/SeveFP/Reeder"
+features = ["desktop", "graphical", "pubsub"]
+
+[renga]
+title = "Renga"
+home = "https://pulkomandy.tk/projects/renga"
+about = """
+A simple but powerful client for chatting on XMPP networks.
+
+Renga supports personal one-to-one chat, group chat, transports, etc. and it \
+provides a clean and easy to use interface.
+
+You can install Renga directly with HaikuDepot from your desktop.
+"""
+haiku = "https://depot.haiku-os.org/renga"
+features = ["chat", "desktop", "graphical", "haikudepot"]
+
+#[siskin]
+#title = "Siskin"
+#home = "https://siskin.im"
+#about = """
+#Siskin IM by Tigase, Inc. is a lightweight and powerful XMPP client for iPhone \
+#and iPad. It provides an easy way to talk and share moments with your friends.
+#"""
+#apple = "https://siskin.im/#about"
+#features = ["chat", "graphical", "mobile", "omemo"]
+
+#[spark]
+#title = "Spark"
+#home = "https://igniterealtime.org/projects/spark/"
+#about = """
+#Spark is an Open Source, cross-platform IM client optimized for businesses and \
+#organizations.
+#
+#It features built-in support for group chat, telephony integration, and strong \
+#security.
+#
+#It also offers a great end-user experience with features like in-line spell \
+#checking, group chat room bookmarks, and tabbed conversations.
+#"""
+#apple = "https://igniterealtime.org/projects/spark/"
+#linux = "https://igniterealtime.org/projects/spark/"
+#reactos = "https://igniterealtime.org/projects/spark/"
+#features = ["chat", "desktop", "graphical", "omemo"]
+
+#[speeqe]
+#title = "Speeqe"
+#home = "https://github.com/thepug/Speeqe"
+#about = """
+#Speeqe is an HTML based client to XMPP/MUC rooms.
+#
+#Speeqe is an HTML based, group chat client that works with the XMPP/MUC \
+#protocol. It is chat made simple. The goal is to give the user the best and \
+#easiest experience in creating chat rooms.
+#
+#It is a combination of javascript and python code using a collection of open \
+#source software and software tools. This collection is nginx or apache for a \
+#frontend. The frontend serves the HTML client which is javascript using \
+#Strophe and JQuery.
+#
+#It also proxies to Punjab for the BOSH connection to connect to XMPP XMPP \
+#based servers. To tie it all together there is a small amount of django.
+#"""
+#browser = "https://github.com/thepug/Speeqe"
+#features = ["chat", "desktop", "graphical"]
+
+[stork]
+title = "Stork"
+home = "https://stork.im"
+about = """
+Stork IM by Tigase, Inc. is a lightweight and powerful XMPP client for Android.
+
+It provides an easy way to talk and share moments with your friends.
+"""
+divestos = "https://stork.im/#about"
+features = ["chat", "graphical", "mobile", "omemo"]
+
+[swift]
+title = "Swift"
+home = "https://swift.im"
+about = """
+An elegant, secure, adaptable and intuitive XMPP Client.
+
+Swift's clean design and comprehensive feature set make it the logical choice \
+for anyone looking for a cross-platform XMPP client. Swift is free to use, \
+with optional commercial support contracts available from Isode.
+"""
+apple = "https://swift.im/downloads.html"
+linux = "https://swift.im/downloads.html"
+reactos = "https://swift.im/downloads.html"
+features = ["chat", "desktop", "graphical"]
+
+[uwpx]
+title = "UWPX"
+home = "https://uwpx.org"
+about = """
+UWPX is a app for your UWP (Windows 10 and Windows 11) devices. It implements \
+the Extensible Messaging and Presence Protocol (XMPP). At the moment UWPX is \
+in BETA stage so expect unexpected behavior sometimes.
+
+By default every connection between you and your server is encrypted via \
+TLS 1.2. This prevents attackers from reading your chat messages or metadata.
+
+OMEMO support is actively being worked on. Once implemented, OMEMO will \
+provide a multi-client end-to-end encryption so not even your own server can \
+read your chat messages any more.
+"""
+reactos = "https://uwpx.org"
+features = ["chat", "desktop", "graphical", "mobile"]
+
+[weechat]
+title = "WeeChat"
+home = "https://github.com/bqv/weechat-xmpp"
+about = """
+XMPP for power users and digital masochists.
+
+weechat-xmpp is a WeeChat plugin that extends WeeChat to support XMPP, and it \
+currently has a minimal but ideally maximal set of XEPs.
+"""
+divestos = "https://github.com/bqv/weechat-xmpp"
+haiku = "https://depot.haiku-os.org/weechat"
+linux = "https://github.com/bqv/weechat-xmpp"
+features = ["chat", "console", "desktop", "omemo", "openpgp"]
+
+#[xmpp-web]
+#title = "XMPP Web"
+#home = "https://github.com/nioc/xmpp-web"
+#about = """
+#Lightweight HTML chat client for XMPP servers.
+#"""
+#browser = "https://github.com/nioc/xmpp-web/releases"
+#features = ["chat", "desktop", "graphical", "mobile", "pwa"]
+
+[yaxim]
+title = "yaxim"
+home = "https://yaxim.org"
+about = """
+yaxim (Yet Another XMPP Instant Messenger) is a lean Jabber/XMPP client for \
+Android.
+
+It aims at usability, low overhead and security, and works on low-end Android \
+devices starting with Android 4.0.
+"""
+divestos = "https://yaxim.org/download/"
+features = ["chat", "graphical", "mobile"]
diff --git a/css/stylesheet.css b/css/stylesheet.css
index 21b804a..327dfa5 100644
--- a/css/stylesheet.css
+++ b/css/stylesheet.css
@@ -12,6 +12,13 @@ div, h1, h2, h3, h4, h5 {
h1, h2, h3 {
text-align: center;
+ margin: 0;
+ padding: 1em;
+}
+
+h3, h4, h5 {
+ padding-left: 2em;
+ padding-right: 2em;
}
html {
@@ -57,10 +64,11 @@ div:has(#bar) {
}
#bar,
+#container-of-selection,
#content > #entries > .entry,
+#profile,
#profile-top,
-#table-of-contents > ol,
-#profile {
+#table-of-contents > ol {
background: #f5f5f5;
}
@@ -163,7 +171,7 @@ label,
}
#action,
-#action-bar,
+/* #action-bar, */
#actions-compact {
margin-bottom: 1em;
}
@@ -286,9 +294,103 @@ h1 {
border-radius: 20px;
}
-h3, h4, h5 {
- padding-left: 2em;
+#selection {
+ padding-left: 1em;
padding-right: 2em;
+ padding-top: 2em;
+}
+
+#selection > dt {
+ margin-bottom: 1.5em;
+ margin-left: 0.5em;
+ margin-top: 2em;
+ /*
+ border-bottom: solid;
+ display: block;
+ width: 15em;
+ */
+}
+
+#selection > dd {
+ display: flex;
+ justify-content: space-between;
+}
+
+#selection dd {
+ font-size: 1.5em;
+}
+
+#selection > dd span.text {
+ margin-top: 1em;
+ margin-bottom: 3em;
+ white-space: break-spaces;
+}
+
+#selection img.wide {
+ border-radius: 10px;
+ margin-bottom: 3em;
+ margin-left: 2em;
+ margin-right: 2em;
+ height: 130px;
+ width: 130px;
+}
+
+#selection img.icon {
+ height: 30px;
+ width: 30px;
+}
+
+#selection > dd:last-child > span {
+ margin-bottom: 3em;
+ margin-top: 1em;
+}
+
+#selection img.narrow {
+ display: none;
+ height: 30px;
+ width: 30px;
+}
+
+#selection a {
+ font-size: 30px;
+ text-decoration: none;
+}
+
+#selection .features {
+ font-size: 80%;
+ margin: 1em;
+}
+
+#selection .features > span {
+ margin-left: 0.5em;
+ margin-right: 0.5em;
+}
+
+#security-notices {
+ display: flex;
+ justify-content: center;
+}
+
+#security-notices > .notice {
+ /* align-items: center; */
+ background: #ebebbe;
+ border-radius: 10px;
+ display: flex;
+ font-size: 1.2em;
+ margin: 1em;
+ /*
+ margin-right: 20%;
+ margin-left: 20%;
+ */
+ padding: 1em;
+ width: 500px;
+}
+
+#security-notices img {
+ height: 80px;
+ margin-left: 0.5em;
+ margin-right: 1em;
+ width: 80px;
}
#titles {
@@ -499,6 +601,14 @@ h3, h4, h5 {
}
+@media (max-width: 1150px) {
+
+ #action > #view {
+ display: none;
+ }
+
+}
+
/* NOTE This rule useful, for larger images (800x800), to switch from
background-size: 100vw;
*/
@@ -513,12 +623,28 @@ h3, h4, h5 {
}
*/
-@media (max-width: 1150px) {
+@media (max-width: 950px) {
- #action > #view {
+ #security-notices {
+ display: grid;
+ }
+
+}
+
+@media (max-width: 820px) {
+
+ #action-bar > #reactos {
display: none;
}
+ #selection img.wide {
+ display: none;
+ }
+
+ #selection img.narrow {
+ display: unset;
+ }
+
}
@media (max-width: 950px) {
@@ -594,7 +720,8 @@ h3, h4, h5 {
}
#action > #add,
- #action-bar > #add {
+ #action-bar > #add,
+ #action-bar > #haiku {
display: none;
}
@@ -672,6 +799,14 @@ h3, h4, h5 {
}
+@media (max-width: 670px) {
+
+ #action-bar > #linux {
+ display: none;
+ }
+
+}
+
@media (max-width: 572px) {
#action > a,
@@ -694,4 +829,8 @@ h3, h4, h5 {
padding-right: 1.4em;
}
+ #security-notices > .notice {
+ width: 400px;
+ }
+
}
diff --git a/fasi.py b/fasi.py
index 32bb893..751e144 100644
--- a/fasi.py
+++ b/fasi.py
@@ -613,6 +613,59 @@ class HttpInstance:
response.headers['Content-Type'] = 'application/xhtml+xml'
return response
+ @self.app.get('/download')
+ @self.app.get('/download/{software}')
+ @self.app.get('/download/{software}/{kind}')
+ async def download_get(request: Request, software=None, kind=None):
+
+ # TODO admin, advanced, console, desktop, graphical, mobile
+ if not kind: kind = 'graphical'
+
+ if not software:
+ user_agent = request.headers.get("user-agent")
+ user_agent_lower = user_agent.lower()
+ match user_agent_lower:
+ case _ if 'linux' in user_agent_lower:
+ software = 'linux'
+ case _ if 'haiku' in user_agent_lower:
+ software = 'haiku'
+ case _ if 'android' in user_agent_lower:
+ software = 'divestos'
+ case _ if 'reactos' in user_agent_lower or 'windows' in user_agent_lower:
+ software = 'reactos'
+ case _ if 'ios' in user_agent_lower or 'macos' in user_agent_lower:
+ software = 'apple'
+
+ name = software.title()
+ if 'os' in software: name = name.replace('os', 'OS')
+
+ filename_clients = 'clients.toml'
+ clients = Data.open_file_toml(filename_clients)
+ client_selection = []
+ for client in clients:
+ if software in clients[client]:
+ client_selected = {
+ 'name' : clients[client]['title'],
+ 'about' : clients[client]['about'],
+ 'features' : clients[client]['features'],
+ 'iden' : client,
+ 'href' : clients[client][software]}
+ client_selection.append(client_selected)
+
+ template_file = 'download.xhtml'
+ template_dict = {
+ 'brand_name' : brand_name,
+ 'brand_site' : brand_site,
+ 'chat_client' : chat_client,
+ 'client_selection' : client_selection,
+ 'request' : request,
+ 'software' : software,
+ 'title' : name,
+ 'url' : request.url._url}
+ response = templates.TemplateResponse(template_file, template_dict)
+ response.headers['Content-Type'] = 'application/xhtml+xml'
+ return response
+
@self.app.exception_handler(404)
def not_found_exception_handler(request: Request, exc: HTTPException):
action = 'Warning'
diff --git a/img/aparte.svg b/img/aparte.svg
new file mode 100644
index 0000000..4779a86
--- /dev/null
+++ b/img/aparte.svg
@@ -0,0 +1,295 @@
+
+
diff --git a/img/blabber.svg b/img/blabber.svg
new file mode 100644
index 0000000..ea4e997
--- /dev/null
+++ b/img/blabber.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/chatsecure.svg b/img/chatsecure.svg
new file mode 100644
index 0000000..e71c5cd
--- /dev/null
+++ b/img/chatsecure.svg
@@ -0,0 +1,46 @@
+
+
+
+
diff --git a/img/cheogram.svg b/img/cheogram.svg
new file mode 100644
index 0000000..68c403e
--- /dev/null
+++ b/img/cheogram.svg
@@ -0,0 +1,25 @@
+
diff --git a/img/conversations-classic.svg b/img/conversations-classic.svg
new file mode 100644
index 0000000..fbd86b6
--- /dev/null
+++ b/img/conversations-classic.svg
@@ -0,0 +1,430 @@
+
+
+
+
diff --git a/img/conversations.svg b/img/conversations.svg
new file mode 100644
index 0000000..9397c2b
--- /dev/null
+++ b/img/conversations.svg
@@ -0,0 +1,430 @@
+
+
+
+
diff --git a/img/conversejs.svg b/img/conversejs.svg
new file mode 100644
index 0000000..c858e5f
--- /dev/null
+++ b/img/conversejs.svg
@@ -0,0 +1,11 @@
+
diff --git a/img/dino.svg b/img/dino.svg
new file mode 100644
index 0000000..b62f8c3
--- /dev/null
+++ b/img/dino.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/divestos.svg b/img/divestos.svg
new file mode 100644
index 0000000..f1090c4
--- /dev/null
+++ b/img/divestos.svg
@@ -0,0 +1,59 @@
+
+
diff --git a/img/emacs.svg b/img/emacs.svg
new file mode 100644
index 0000000..632d53e
--- /dev/null
+++ b/img/emacs.svg
@@ -0,0 +1,286 @@
+
+
diff --git a/img/fdroid.svg b/img/fdroid.svg
new file mode 100644
index 0000000..0746785
--- /dev/null
+++ b/img/fdroid.svg
@@ -0,0 +1,310 @@
+
+
+
+
diff --git a/img/gajim.svg b/img/gajim.svg
new file mode 100644
index 0000000..d9554ff
--- /dev/null
+++ b/img/gajim.svg
@@ -0,0 +1,78 @@
+
+
diff --git a/img/haiku.svg b/img/haiku.svg
new file mode 100644
index 0000000..939bf3d
--- /dev/null
+++ b/img/haiku.svg
@@ -0,0 +1,163 @@
+
+
diff --git a/img/irssi.svg b/img/irssi.svg
new file mode 100644
index 0000000..f1e1951
--- /dev/null
+++ b/img/irssi.svg
@@ -0,0 +1,48 @@
+
+
diff --git a/img/jsxc.svg b/img/jsxc.svg
new file mode 100644
index 0000000..52d1aaf
--- /dev/null
+++ b/img/jsxc.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/miranda.svg b/img/miranda.svg
new file mode 100644
index 0000000..8eab460
--- /dev/null
+++ b/img/miranda.svg
@@ -0,0 +1,556 @@
+
+
+
+
diff --git a/img/monal.svg b/img/monal.svg
new file mode 100644
index 0000000..7dced0c
--- /dev/null
+++ b/img/monal.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/poezio.svg b/img/poezio.svg
new file mode 100644
index 0000000..7848f8c
--- /dev/null
+++ b/img/poezio.svg
@@ -0,0 +1,34 @@
+
+
+
diff --git a/img/prose.svg b/img/prose.svg
new file mode 100644
index 0000000..6c9f44f
--- /dev/null
+++ b/img/prose.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/psi-plus.svg b/img/psi-plus.svg
new file mode 100644
index 0000000..9fb8745
--- /dev/null
+++ b/img/psi-plus.svg
@@ -0,0 +1,70 @@
+
+
+
diff --git a/img/psi.svg b/img/psi.svg
new file mode 100644
index 0000000..6925a3e
--- /dev/null
+++ b/img/psi.svg
@@ -0,0 +1,47 @@
+
+
diff --git a/img/reeder.svg b/img/reeder.svg
new file mode 100644
index 0000000..39084bf
--- /dev/null
+++ b/img/reeder.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/renga.svg b/img/renga.svg
new file mode 100644
index 0000000..2de2055
--- /dev/null
+++ b/img/renga.svg
@@ -0,0 +1,52 @@
+
+
+
+
diff --git a/img/stork.svg b/img/stork.svg
new file mode 100644
index 0000000..01e66df
--- /dev/null
+++ b/img/stork.svg
@@ -0,0 +1,288 @@
+
+
diff --git a/img/swift.svg b/img/swift.svg
new file mode 100644
index 0000000..1bcc0e3
--- /dev/null
+++ b/img/swift.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/img/tux.svg b/img/tux.svg
new file mode 100644
index 0000000..6b558e7
--- /dev/null
+++ b/img/tux.svg
@@ -0,0 +1,438 @@
+
+
diff --git a/img/uwpx.svg b/img/uwpx.svg
new file mode 100644
index 0000000..142de6d
--- /dev/null
+++ b/img/uwpx.svg
@@ -0,0 +1,49 @@
+
+
\ No newline at end of file
diff --git a/img/weechat.svg b/img/weechat.svg
new file mode 100644
index 0000000..96b92b1
--- /dev/null
+++ b/img/weechat.svg
@@ -0,0 +1,170 @@
+
+
diff --git a/img/logo.svg b/img/xmpp.svg
similarity index 100%
rename from img/logo.svg
rename to img/xmpp.svg
diff --git a/img/yaxim.svg b/img/yaxim.svg
new file mode 100644
index 0000000..92d6baf
--- /dev/null
+++ b/img/yaxim.svg
@@ -0,0 +1,307 @@
+
+
+
+
diff --git a/xhtml/conference.xhtml b/xhtml/conference.xhtml
index dbc5ab1..fe93adf 100644
--- a/xhtml/conference.xhtml
+++ b/xhtml/conference.xhtml
@@ -27,7 +27,7 @@
-
+
Download
diff --git a/xhtml/disco.xhtml b/xhtml/disco.xhtml
index 317aa31..4302cf7 100644
--- a/xhtml/disco.xhtml
+++ b/xhtml/disco.xhtml
@@ -27,7 +27,7 @@
-
+
Download
diff --git a/xhtml/download.xhtml b/xhtml/download.xhtml
new file mode 100644
index 0000000..0ad315a
--- /dev/null
+++ b/xhtml/download.xhtml
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+