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 @@ + + + + + + +
+ +