Phanpy
Client Web Mastodon minimaliste et opiniâtre.
?️ Prononciation : /fænpi/
( FAN-pee
) ? Écouter
Il s'agit d'un client Web alternatif pour Mastodon.
- ? Réalisation : https://phanpy.social
- branche
production
- casser moins souvent
- correctifs plus lents sauf si critiques
- ?️ Développement : https://dev.phanpy.social
- branche
main
- je verrai peut-être de nouveaux trucs sympas plus tôt
- peut se briser plus souvent
- peut être réparé beaucoup plus rapidement aussi
? Suivez @phanpy sur Mastodon pour les mises à jour ✨
Tout est conçu et réalisé selon mes goûts et ma vision. Il s'agit d'un projet parallèle personnel pour moi d'en apprendre davantage sur Mastodon et d'expérimenter de nouvelles idées UI/UX.
Caractéristiques
- ? Plusieurs comptes
- ? Fenêtre pop-out/in de rédaction
- ? Thème clair/sombre/auto
- ? Notifications groupées
- ? Fil de commentaires imbriqué
- ? Récupération du brouillon non envoyé
- ? Booste le Carrousel™️
- ⚡ Raccourcis™️ avec des modes d'affichage comme plusieurs colonnes ou barre d'onglets
- #️⃣ Chronologie multi-hashtag
Décisions de conception
- Les actions de statut (réponse, boost, favori, signet, etc.) sont masquées par défaut .
Ils n'apparaissent que sur la page de statut individuelle. Il s’agit de réduire l’encombrement et les distractions. Cela peut entraîner une baisse de l’engagement, mais nous ne cherchons pas ici à chercher des chiffres. - Boost est représenté par l'icône de fusée .
L'icône à double flèche verte (retweet pour Twitter) ne correspond pas au terme « boost ». La fusée verte a l'air bizarre, alors j'utilise du violet. - Les noms d'utilisateur courts (
@username
) sont affichés dans les chronologies, au lieu du nom d'utilisateur complet du compte ( @username@instance
) .
Malgré la ligne directrice mentionnée selon laquelle « la décentralisation doit être transparente pour l'utilisateur », je ne pense pas que nous devrions la mettre en face à chaque fois. Il existe également des problèmes d'accessibilité liés au lecteur d'écran avec le nom d'utilisateur complet, bien que cette application Web ne soit malheureusement pas encore accessible. - Pas de lecture automatique pour les vidéos/GIF/quoi que ce soit dans la timeline .
La chronologie est déjà un énorme désordre avec beaucoup de personnes, de marques, d’actualités et de médias essayant d’attirer votre attention. N'aggravons pas les choses. (L'exception actuelle concernerait désormais les emojis animés.) - URL basées sur le hachage .
Cette application Web n'est pas destinée à remplacer à part entière le front-end existant de Mastodon. Il n'y a pas de référencement, de base de données, de serveur sans serveur ou de serveurs de longue durée. Je pourrais me tromper un jour.
Implémentations subtiles de l'interface utilisateur
Affichage du nom d'utilisateur
- Sur la timeline, le nom d'utilisateur s'affiche sous la forme
[NAME] @[username]
. - Pour le
@[username]
, excluez toujours le nom de domaine de l'instance. - Si le
[NAME]
ressemble au @[username]
, alors le @[username]
est également exclu.
Carrousel de boosts
- À partir des publications récupérées (par exemple, 20 publications par récupération), si le nombre de boosts est supérieur à un quart du total des publications ou à plus de 3 boosts consécutifs, l'interface utilisateur du carrousel de boosts sera déclenchée.
- Si le nombre de boosts dépasse les trois quarts du total des publications, l'interface utilisateur du carrousel de boosts sera placée à la fin du nombre total de publications récupérées (par "page").
- Sinon, l’interface utilisateur du carrousel de boosts sera insérée entre les publications.
Badge numéro de fil (par exemple fil 1/X)
- Vérifiez chaque publication pour
inReplyToId
à partir du cache ou des requêtes API supplémentaires, jusqu'à ce que la publication racine soit trouvée. - Si la publication racine est trouvée, le badge affichera le numéro d'index de la publication dans le fil de discussion.
- Limitez jusqu'à 3 requêtes API car la publication racine peut être très ancienne ou le fil de discussion est très long.
- Si le numéro d’index est introuvable, le badge affichera
Thread
sans le numéro.
Le remplissage du hashtag s'effondre
- Le premier paragraphe du contenu de la publication contenant plus de 3 hashtags sera réduit à 3 lignes maximum.
- Les paragraphes suivants après le premier paragraphe contenant plus de 3 hashtags seront réduits à 1 ligne.
- Les paragraphes adjacents avec plus d'un hashtag après les paragraphes réduits seront réduits à 1 ligne.
- S'il y a du texte autour ou entre les hashtags, ils ne seront pas réduits.
- Les hashtags réduits seront ajoutés par
...
à la fin. - Ils sont également légèrement estompés pour réduire le bruit visuel.
- L'ouverture de la vue de la publication révélera les hashtags non réduits.
Messages filtrés
- Les publications filtrées « Masquer complètement » seront masquées, sans aucune interface utilisateur pour les révéler.
- Les publications filtrées par « Masquer avec un avertissement » seront partiellement masquées, affichant le nom du filtre et le nom de l'auteur.
- Le contenu peut être partiellement révélé en survolant la publication, avec une info-bulle affichant le texte de la publication.
- En cliquant dessus, vous ouvrirez la page de publication.
- Un appui long ou un clic droit dessus « jetteront un coup d'œil » à la publication avec une interface utilisateur en bas de page.
- Sur le carrousel de boosts, ils sont triés jusqu'à la fin du carrousel.
Développement
Prérequis : Node.js 18+
-
npm install
- Installer les dépendances -
npm run dev
- Démarrer le serveur de développement et messages:extract
( clean
+ ``watch`) en parallèle -
npm run build
- Construire pour la production -
npm run preview
- Prévisualiser la version de production -
npm run fetch-instances
- Récupérez la liste des instances depuis joinmastodon.org/servers, enregistrez-la dans src/data/instances.json
-
npm run sourcemap
- Exécutez source-map-explorer
sur la version de production -
npm run messages:extract
- Extrait les messages des fichiers sources et met à jour les catalogues de messages locaux
Pile technologique
- Vite - Outil de construction
- Preact - Bibliothèque d'interface utilisateur
- Valtio - Gestion de l'État
- React Router - Routage
- masto.js - Client API Mastodon
- Iconify - Bibliothèque d'icônes
- Lingui - Internationalisation
- Vanilla CSS – Oui, je suis de la vieille école.
Certains d’entre eux pourraient changer à l’avenir. Le monde du front-end est en constante évolution.
Internationalisation
Toutes les traductions sont disponibles sous forme de fichiers gettext .po
dans le dossier src/locales
. La langue par défaut est l'anglais ( en
). Les règles plurielles CLDR sont utilisées pour la pluralisation. Les langues RTL (de droite à gauche) sont également prises en charge avec une direction de texte, un rendu d'icônes et une mise en page appropriés.
Au chargement de la page, la langue par défaut est détectée via ces méthodes, dans l'ordre (la première correspondance est utilisée) :
-
lang
du paramètre d'URL, par exemple /?lang=zh-Hant
-
lang
de la clé localStorage
-
navigator.language
du navigateur
Les utilisateurs peuvent modifier la langue dans les paramètres, ce qui définit la lang
de la clé localStorage
.
Guide pour les traducteurs
*Inspiré du manuel Translate WordPress :
- Ne traduisez pas littéralement, traduisez de manière organique.
- Essayez de garder le même niveau de formalité (ou d’informalité)
- N'utilisez pas d'argot ou de termes spécifiques au public
- Soyez attentif aux espaces réservés pour les variables. De nombreuses chaînes ont des espaces réservés, par exemple
{account}
(variable), <0>{name}0>
(balise avec variable) et #
(espace réservé au numéro). - Les points de suspension (…) sont intentionnels. Ne le supprimez pas.
- Groupe Nielsen Norman : « Inclure des points de suspension dans le texte de commande pour indiquer quand des informations supplémentaires sont requises »
- Directives d'Apple Human Interface : "Ajoutez des points de suspension à l'étiquette d'un élément de menu lorsque l'action nécessite plus d'informations avant de pouvoir être terminée. Le caractère points de suspension (…) signale que les utilisateurs doivent saisir des informations ou faire des choix supplémentaires, généralement dans une autre vue."
- Développement d'applications Windows : "Les ellipses signifient un caractère incomplet."
- Les horodatages, les plages de dates, les nombres, les noms de langues et la segmentation de texte sont gérés par l'API d'internationalisation ECMAScript.
-
Intl.DateTimeFormat
- par exemple "8 août", "08/08/2024" -
Intl.RelativeTimeFormat
- par exemple "il y a 2 jours", "dans 2 jours" -
Intl.NumberFormat
- par exemple "1 000", "10K" -
Intl.DisplayNames
- par exemple, "English" ( en
) en chinois traditionnel ( zh-Hant
) se dit "英文" -
Intl.Locale
(avec polyfill pour les anciens navigateurs) -
Intl.Segmenter
(avec polyfill pour les anciens navigateurs)
Notes techniques
Traductions bénévoles
Les traductions sont gérées sur Crowdin. Vous pouvez aider en proposant des traductions bénévoles.
Lisez la documentation d'introduction pour commencer.
Auto-hébergement
Il s'agit d'une application Web purement statique . Vous pouvez l'héberger où vous le souhaitez.
Deux façons (choisissez-en une) :
Un moyen facile
Accédez aux versions et téléchargez le dernier phanpy-dist.zip
ou phanpy-dist.tar.gz
. Il est pré-construit, vous n'avez donc pas besoin d'exécuter de commandes d'installation/construction. Extrayez-le. Servez le dossier des fichiers extraits.
Méthode de construction sur mesure
Nécessite Node.js.
Téléchargez ou git clone
ce référentiel. Utilisez la branche production
pour les versions stables , main
pour les dernières versions . Construisez-le en exécutant npm run build
(après npm install
). Servez le dossier dist
.
La personnalisation peut être effectuée en transmettant des variables d'environnement à la commande build. Exemples :
PHANPY_CLIENT_NAME= " Phanpy Dev "
PHANPY_WEBSITE= " https://dev.phanpy.social "
npm run build
PHANPY_DEFAULT_INSTANCE=hachyderm.io
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL=https://hachyderm.io/auth/sign_up
PHANPY_PRIVACY_POLICY_URL=https://hachyderm.io/privacy-policy
npm run build
Il est également possible de les paramétrer dans le fichier .env
.
Variables disponibles :
-
PHANPY_CLIENT_NAME
(facultatif, par défaut : Phanpy
) affecte :- Titre de la page Web, affiché dans la fenêtre du navigateur ou dans le titre de l'onglet
- Titre de l'application, lorsqu'elle est installée en tant que PWA, affichée sur l'écran d'accueil, le dock macOS, la barre des tâches Windows, etc.
- Titre de la carte OpenGraph, lorsqu'il est partagé sur les réseaux sociaux
- Nom du client, lors de l'enregistrement de l'application pour l'authentification et affiché comme client utilisé dans les publications de certaines applications/clients
-
PHANPY_WEBSITE
(facultatif mais recommandé, par défaut : https://phanpy.social
) affecte :- URL canonique du site
- URL de la carte OpenGraph, lorsqu'elle est partagée sur les réseaux sociaux
- Chemin racine de l'image de la carte OpenGraph
- URL du client, lors de l'enregistrement de l'application pour l'authentification et affichée en tant que client utilisé dans les publications de certaines applications/clients
-
PHANPY_DEFAULT_INSTANCE
(facultatif, aucune valeur par défaut) :- par exemple 'mastodon.social', sans
https://
- Instance par défaut pour la connexion
- Lors de la connexion, l'utilisateur sera redirigé instantanément vers la page d'authentification de l'instance au lieu d'avoir à saisir manuellement l'URL de l'instance et à la soumettre.
-
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL
(facultatif, aucune valeur par défaut) :- URL de la page d'enregistrement de l'instance
- Par exemple
https://mastodon.social/auth/sign_up
-
PHANPY_PRIVACY_POLICY_URL
(facultatif, par défaut la politique de confidentialité de l'instance officielle) :- URL de la page de politique de confidentialité
- Peut spécifier la propre politique de confidentialité de l'instance
-
PHANPY_DEFAULT_LANG
(facultatif) :- La langue par défaut est l'anglais (
en
) si elle n'est pas spécifiée. - Langue de secours après plusieurs méthodes de détection (paramètre de requête
lang
, clé lang
dans localStorage
et navigator.language
)
-
PHANPY_LINGVA_INSTANCES
(facultatif, liste séparée par des espaces, par défaut : lingva.phanpy.social [...hard-coded list of fallback instances]
):- Spécifiez une liste d'instances séparées par des espaces. La première sera utilisée par défaut avant de revenir aux instances suivantes. S'il n'y a qu'une seule instance, cela signifie qu'il n'y a pas de solution de secours.
- Peut spécifier une instance Lingva auto-hébergée, alimentée par lingva-translate ou lingva-api
- Liste des instances de secours codées en dur dans
/.env
- ↗️ Liste des instances lingva-translate
-
PHANPY_IMG_ALT_API_URL
(facultatif, aucune valeur par défaut) :- Point de terminaison d'API pour l'instance auto-hébergée de img-alt-api.
- S'il est fourni, un paramètre apparaîtra pour que les utilisateurs activent le générateur de description d'image dans le compositeur. Désactivé par défaut.
-
PHANPY_GIPHY_API_KEY
(facultatif, pas de valeur par défaut) :- Clé API pour GIPHY. Voir la documentation API.
- S'il est fourni, un paramètre apparaîtra pour permettre aux utilisateurs d'activer le sélecteur GIF dans le compositeur. Désactivé par défaut.
- Ce n'est pas auto-hébergé.
Hébergement de sites statiques
Essayez de rechercher en ligne « comment héberger automatiquement des sites statiques », car il existe de nombreuses façons de le faire.
Hébergement Lingva-translate ou lingva-api
Voir la documentation pour lingva-translate ou lingva-api.
Déploiements communautaires
Ceux-ci sont auto-hébergés par d’autres personnes formidables.
- ferengi.one par @david@weaknotes.com
- halo.mookiesplace.com par @mookie@mookiesplace.com
- phanpy.bauxite.tech par @b4ux1t3@hachyderm.io
- phanpy.blaede.family par @cassidy@blaede.family
- phanpy.crmbl.uk par @snail@crmbl.uk
- phanpy.cz par @zdendys@mamutovo.cz
- phanpy.fulda.social par @Ganneff@fulda.social
- phanpy.gotosocial.social par @admin@gotosocial.social
- phanpy.hear-me.social par @admin@hear-me.social
- phanpy.mastodon.world par @ruud@mastodon.world
- phanpy.mstdn.mx par @maop@mstdn.mx
- phanpy.social.tchncs.de par @milan@social.tchncs.de
- phanpy.tilde.zone par @ben@tilde.zone
- phanpy.vmst.io par @vmstan@vmst.io
- social.qrk.one par @kev@fosstodon.org
Remarque : ajoutez le vôtre en créant une pull request.
Frais
Coûts impliqués dans l'exécution et le développement de cette application Web :
- Nom de domaine (.social) : 23,18 USD$/an (6,87 USD$ la 1ère année)
- Hébergement : gratuit
- Développement, conception, maintenance : "Gratuit" (Mon temps précieux)
Mascotte
Phanpy est un Pokémon de type Sol.
Mainteneurs + contributeurs
- Chee Aun (mastodonte) (Twitter)
Bénévoles en traduction
- alidsds11 (arabe)
- alternative (coréen)
- BoFFire (arabe, français, kabyle)
- Brawaru (russe)
- cbasje (néerlandais)
- cbo92 (anglais)
- CDN (chinois simplifié)
- dannypsnl (chinois traditionnel)
- databio (catalan)
- Dizro (italien)
- Drift6944 (tchèque)
- drydenwu (chinois traditionnel)
- élissarc (français)
- ElPamplina (espagnol)
- Fitik (espéranto, hébreu)
- Freesia (japonais)
- ghose (galicien)
- hongminhee (coréen)
- Hugoglyphe (espéranto, espagnol)
- isard (catalan)
- Kaliuwu (polonais)
- Karlafej (tchèque)
- katullo11 (italien)
- Kytta (allemand)
- lun (thaïlandais)
- lucasofchirst (occitan, portugais, portugais, brésilien)
- LukeHong (chinois traditionnel)
- marcin.kozinski (polonais)
- mkljczkk (polonais)
- mojosoeun (coréen)
- moreal (coréen)
- MrWillCom (chinois simplifié)
- nclm (français)
- pazpi (italien)
- punkrockgirl (basque)
- radecos (anglais)
- Razem (tchèque)
- realpixelcode (allemand)
- rezahosseinzadeh (persan)
- rwmpelstilzchen (espéranto, hébreu)
- SadmL (russe)
- SadmL_AI (russe)
- shuuji3 (japonais)
- Sky_NiniKo (français)
- Steffo99 (italien)
- Su5hicz (tchèque)
- tferrermo (espagnol)
- tkbremnes (bokmal norvégien)
- smoking93 (allemand)
- Vac31. (Lituanien)
- valtlai (finnois)
- vasiriri (polonais)
- voyagercy (chinois traditionnel)
- xabi_itzultzaile (basque)
- xen4n (ukrainien)
- xqueralt (catalan)
- ZiriSut (kabyle)
- zkreml (tchèque)
Histoire
Je suis l'un des premiers utilisateurs de Twitter. Twitter a été lancé le 15 juillet 2006. Je l'ai rejoint en décembre 2006 et mon premier tweet a été publié le 18 décembre 2006.
Je sais à quoi ressemble Twitter. C'était amusant.
À l'époque, j'avais créé un clone de Twitter appelé "Twig" écrit en Python et Google App Engine. J'ai presque créé mon propre client de bureau Twitter écrit en Appcelerator Titanium. J'ai donné l'une de mes meilleures présentations sur le client Twitter lors d'une mini-conférence. J'ai construit ce truc appelé « colonnes Twitter », une application Web qui affiche votre liste de suivis, les suivis de vos suivis, vos abonnés, les abonnés de vos abonnés, etc. En 2009, j'ai écrit un article de blog intitulé "Comment j'ai débuté avec Twitter". J'ai créé deux thèmes pour DestroyTwitter (un client de bureau réalisé avec Adobe Air par Jonnie Hallman) et l'un d'eux s'appelle "Vimeo". En 2013, j'ai écrit mon propre site de sauvegarde de tweets avec un front-end pour visualiser mes tweets et un backend CouchDB pour les stocker.
Cela fait plus de 15 ans .
Et me voilà. Création d'un client Web Mastodon.
Clients Web alternatifs
- Fourchettes Phanpy ↓
- Tablier (retraité) - fourchettes ↓
- Coucou+
- Sengi
- Caisse à savon
- Elan - fourchettes ↓
- Mastodeck
- Malles
- Tooty
- Bac à litière
- Statut
- Défense
- Mastodon Glitch Edition (interface autonome)
- Mangane
- LeBureau
- Plus...
?♂️ Avis à tous les autres développeurs de clients de médias sociaux
S'il vous plaît, copiez les idées et les expériences d'interface utilisateur de cette application. Je pense que certains d’entre eux sont plutôt bons et ce serait formidable si davantage d’applications en disposaient.
Si vous n'êtes pas un développeur, veuillez parler de cette application à vos développeurs de clients de médias sociaux préférés et demandez-leur de copier les idées et les expériences de l'interface utilisateur.
Licence
MIT.