Phanpy
Minimalistischer Mastodon-Webclient mit eigener Meinung.
?️ Aussprache : /fænpi/
( FAN-pee
) ? Hören
Dies ist ein alternativer Web-Client für Mastodon.
- ? Produktion : https://phanpy.social
-
production
- brechen seltener
- Langsamere Korrekturen, sofern nicht kritisch
- ?️ Entwicklung : https://dev.phanpy.social
-
main
- Vielleicht sehe ich früher neue coole Sachen
- kann häufiger kaputt gehen
- kann auch viel schneller behoben werden
? Folgen Sie @phanpy auf Mastodon für Updates ✨
Alles ist nach meinem Geschmack und meiner Vision entworfen und konstruiert. Für mich ist dies ein persönliches Nebenprojekt, um etwas über Mastodon zu lernen und mit neuen UI/UX-Ideen zu experimentieren.
Merkmale
- ? Mehrere Konten
- ? Pop-Out/In des Fensters „Erstellen“.
- ? Hell/Dunkel/Auto-Thema
- ? Gruppierte Benachrichtigungen
- ? Verschachtelter Kommentarthread
- ? Nicht gesendeter Wiederherstellungsentwurf
- ? Steigert Carousel™️
- ⚡ Shortcuts™️ mit Ansichtsmodi wie mehrspaltig oder Tab-Leiste
- #️⃣ Zeitleiste mit mehreren Hashtags
Designentscheidungen
- Statusaktionen (Antworten, Boosten, Favorit, Lesezeichen usw.) sind standardmäßig ausgeblendet .
Sie erscheinen nur auf der einzelnen Statusseite. Dies dient dazu, Unordnung und Ablenkung zu reduzieren. Dies könnte zu einem geringeren Engagement führen, aber wir jagen hier nicht nach Zahlen. - Boost wird durch das Raketensymbol dargestellt .
Das grüne Doppelpfeilsymbol (Retweet für Twitter) sieht für den Begriff „Boost“ nicht richtig aus. Grüne Rakete sieht seltsam aus, also verwende ich Lila. - Anstelle des vollständigen Kontobenutzernamens (
@username@instance
) werden in Zeitleisten kurze Benutzernamen ( @username
) angezeigt .
Obwohl in der Richtlinie erwähnt wird, dass „Dezentralisierung für den Benutzer transparent sein muss“, denke ich nicht, dass wir sie jedes Mal aufs Neue unterdrücken sollten. Es gibt auch einige Bedenken hinsichtlich der Barrierefreiheit des Bildschirmlesegeräts mit dem vollständigen Benutzernamen, obwohl diese Web-App leider noch nicht zugänglich ist. - Keine automatische Wiedergabe für Video/GIF/was auch immer in der Timeline .
Die Zeitleiste ist bereits ein riesiges Durcheinander, da viele Menschen, Marken, Nachrichten und Medien versuchen, Ihre Aufmerksamkeit zu erregen. Machen wir es nicht noch schlimmer. (Die aktuelle Ausnahme wären jetzt animierte Emojis.) - Hash-basierte URLs .
Diese Web-App ist nicht als vollwertiger Ersatz für das bestehende Frontend von Mastodon gedacht. Es gibt kein SEO, keine Datenbank, keine serverlosen oder lang laufenden Server. Ich könnte mich eines Tages irren.
Subtile UI-Implementierungen
Anzeige des Benutzernamens
- Auf der Zeitleiste wird der Benutzername als
[NAME] @[username]
angezeigt. - Schließen Sie für
@[username]
immer den Instanzdomänennamen aus. - Wenn der
[NAME]
genauso aussieht wie der @[username]
, wird auch der @[username]
ausgeschlossen.
Steigert das Karussell
- Wenn die Anzahl der Boosts aus den abgerufenen Beiträgen (z. B. 20 Beiträge pro Abruf) mehr als ein Viertel der Gesamtbeiträge oder mehr als drei aufeinanderfolgende Boosts beträgt, wird die Boost-Karussell-Benutzeroberfläche ausgelöst.
- Wenn die Anzahl der Boosts mehr als drei Viertel der Gesamtbeiträge beträgt, wird die Benutzeroberfläche des Boost-Karussells am Ende der Gesamtzahl der abgerufenen Beiträge (pro „Seite“) eingefügt.
- Andernfalls wird die Boost-Karussell-Benutzeroberfläche zwischen den Beiträgen eingefügt.
Thread-Nummernschild (z. B. Thread 1/X)
- Überprüfen Sie jeden Beitrag auf
inReplyToId
aus dem Cache oder zusätzliche API-Anfragen, bis der Stammbeitrag gefunden wird. - Wenn ein Stammbeitrag gefunden wird, zeigt Badge die Indexnummer des Beitrags im Thread an.
- Beschränken Sie die Anzahl der API-Anfragen auf 3, da der Root-Beitrag möglicherweise sehr alt oder der Thread sehr lang ist.
- Wenn die Indexnummer nicht gefunden werden konnte, zeigt Badge
Thread
ohne die Nummer an.
Hashtag-Stuffing kollabiert
- Der erste Absatz des Beitragsinhalts mit mehr als 3 Hashtags wird auf maximal 3 Zeilen reduziert.
- Nachfolgende Absätze nach dem ersten Absatz mit mehr als 3 Hashtags werden auf eine Zeile reduziert.
- Angrenzende Absätze mit mehr als einem Hashtag nach der Reduzierung der Absätze werden auf eine Zeile reduziert.
- Wenn sich um oder zwischen den Hashtags Text befindet, werden diese nicht ausgeblendet.
- Reduzierte Hashtags werden am Ende mit
...
angehängt. - Sie sind außerdem leicht ausgeblendet, um visuelles Rauschen zu reduzieren.
- Wenn Sie die Beitragsansicht öffnen, werden die Hashtags nicht minimiert angezeigt.
Gefilterte Beiträge
- Durch „Vollständig ausblenden“ gefilterte Beiträge werden ausgeblendet, ohne dass eine Benutzeroberfläche dies anzeigen könnte.
- Durch „Mit Warnung ausblenden“ gefilterte Beiträge werden teilweise ausgeblendet und zeigen den Filternamen und den Namen des Autors an.
- Der Inhalt kann teilweise angezeigt werden, indem Sie mit der Maus über den Beitrag fahren, wobei der Tooltip den Beitragstext anzeigt.
- Wenn Sie darauf klicken, wird die Beitragsseite geöffnet.
- Wenn Sie lange darauf drücken oder mit der rechten Maustaste darauf klicken, wird der Beitrag mit einer unteren Benutzeroberfläche angezeigt.
- Auf dem Boost-Karussell werden sie bis zum Ende des Karussells sortiert.
Entwicklung
Voraussetzungen: Node.js 18+
-
npm install
– Abhängigkeiten installieren -
npm run dev
– Entwicklungsserver und messages:extract
( clean
+ „watch“) parallel starten -
npm run build
– Build für die Produktion -
npm run preview
– Vorschau des Produktions-Builds -
npm run fetch-instances
– Instanzenliste von joinmastodon.org/servers abrufen und in src/data/instances.json
speichern -
npm run sourcemap
– Führen Sie source-map-explorer
auf dem Produktions-Build aus -
npm run messages:extract
– Extrahieren Sie Nachrichten aus Quelldateien und aktualisieren Sie die lokalen Nachrichtenkataloge
Tech-Stack
- Vite – Build-Tool
- Preact – UI-Bibliothek
- Valtio - Staatsmanagement
- React Router – Routing
- masto.js – Mastodon API-Client
- Iconify – Symbolbibliothek
- Lingui - Internationalisierung
- Vanilla CSS – Ja, ich bin altmodisch.
Einige davon können sich in Zukunft ändern. Die Front-End-Welt verändert sich ständig.
Internationalisierung
Alle Übersetzungen sind als gettext .po
Dateien im Ordner src/locales
verfügbar. Die Standardsprache ist Englisch ( en
). Zur Pluralisierung werden CLDR-Pluralregeln verwendet. RTL-Sprachen (von rechts nach links) werden ebenfalls mit der richtigen Textrichtung, Symboldarstellung und dem richtigen Layout unterstützt.
Beim Laden der Seite wird die Standardsprache über diese Methoden in der Reihenfolge erkannt (erster Treffer wird verwendet):
- URL-Parameter
lang
/?lang=zh-Hant
-
localStorage
lang
-
navigator.language
des Browsers
Benutzer können die Sprache in den Einstellungen ändern, wodurch der localStorage
-Schlüssel lang
festgelegt wird.
Leitfaden für Übersetzer
*Inspiriert durch Translate WordPress Handbook:
- Übersetzen Sie nicht wörtlich, sondern organisch.
- Versuchen Sie, das gleiche Maß an Formalität (oder Informalität) beizubehalten.
- Verwenden Sie keine umgangssprachlichen oder zielgruppenspezifischen Begriffe
- Achten Sie auf Platzhalter für Variablen. Viele Zeichenfolgen haben Platzhalter, z. B.
{account}
(Variable), <0>{name}0>
(Tag mit Variable) und #
(Nummernplatzhalter). - Auslassungspunkte (…) sind beabsichtigt. Entfernen Sie es nicht.
- Nielsen Norman Group: „Fügen Sie Ellipsen in den Befehlstext ein, um anzuzeigen, wann weitere Informationen erforderlich sind“
- Apple Human Interface-Richtlinien: „Fügen Sie ein Auslassungszeichen an die Beschriftung eines Menüelements an, wenn für die Aktion weitere Informationen erforderlich sind, bevor sie abgeschlossen werden kann. Das Auslassungszeichen (…) signalisiert, dass Benutzer Informationen eingeben oder zusätzliche Auswahlmöglichkeiten treffen müssen, normalerweise in einer anderen Ansicht.“
- Windows-App-Entwicklung: „Ellipsen bedeuten Unvollständigkeit.“
- Datumszeitstempel, Datumsbereiche, Zahlen, Sprachnamen und Textsegmentierung werden von der ECMAScript Internationalization API verarbeitet.
-
Intl.DateTimeFormat
– z. B. „8. August“, „08.08.2024“ -
Intl.RelativeTimeFormat
– z. B. „vor 2 Tagen“, „in 2 Tagen“ -
Intl.NumberFormat
– z. B. „1.000“, „10K“ -
Intl.DisplayNames
– z. B. „Englisch“ ( en
) im traditionellen Chinesisch ( zh-Hant
) ist „英文“ -
Intl.Locale
(mit Polyfill für ältere Browser) -
Intl.Segmenter
(mit Polyfill für ältere Browser)
Technische Hinweise
Freiwillige Übersetzungen
Übersetzungen werden auf Crowdin verwaltet. Sie können helfen, indem Sie ehrenamtlich Übersetzungen anbieten.
Lesen Sie die Einführungsdokumentation, um loszulegen.
Selbsthosting
Dies ist eine rein statische Web-App . Sie können es überall hosten, wo Sie möchten.
Zwei Möglichkeiten (wählen Sie eine):
Einfacher Weg
Gehen Sie zu „Releases“ und laden Sie die neueste Version phanpy-dist.zip
oder phanpy-dist.tar.gz
herunter. Es ist vorgefertigt, sodass keine Installations-/Build-Befehle ausgeführt werden müssen. Extrahieren Sie es. Stellen Sie den Ordner mit den extrahierten Dateien bereit.
Maßgeschneiderte Art und Weise
Erfordert Node.js.
Laden Sie dieses Repository herunter oder git clone
. Verwenden Sie production
für stabile Versionen, main
für die neuesten . Erstellen Sie es, indem Sie npm run build
ausführen (nach npm install
). Stellen Sie den dist
-Ordner bereit.
Die Anpassung kann durch die Übergabe von Umgebungsvariablen an den Build-Befehl erfolgen. Beispiele:
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
Es ist auch möglich, sie in der .env
Datei festzulegen.
Verfügbare Variablen:
-
PHANPY_CLIENT_NAME
(optional, Standard: Phanpy
) betrifft:- Titel der Webseite, angezeigt im Browserfenster oder Tab-Titel
- App-Titel wird bei Installation als PWA auf dem Startbildschirm, im macOS-Dock, in der Windows-Taskleiste usw. angezeigt
- Titel der OpenGraph-Karte, wenn sie in sozialen Netzwerken geteilt wird
- Clientname, wenn die App für die Authentifizierung registriert wird und als Client angezeigt wird, der in Beiträgen in einigen Apps/Clients verwendet wird
-
PHANPY_WEBSITE
(optional, aber empfohlen, Standard: https://phanpy.social
) betrifft:- Kanonische URL der Website
- OpenGraph-Karten-URL, wenn sie in sozialen Netzwerken geteilt wird
- Stammpfad für das OpenGraph-Kartenbild
- Client-URL, wenn die App für die Authentifizierung registriert wird und als Client angezeigt wird, der in Beiträgen in einigen Apps/Clients verwendet wird
-
PHANPY_DEFAULT_INSTANCE
(optional, keine Standardeinstellungen):- zB 'mastodon.social', ohne
https://
- Standardinstanz für die Anmeldung
- Beim Anmelden wird der Benutzer sofort zur Authentifizierungsseite der Instanz weitergeleitet, anstatt die Instanz-URL manuell eingeben und absenden zu müssen
-
PHANPY_DEFAULT_INSTANCE_REGISTRATION_URL
(optional, keine Standardeinstellungen):- URL der Instanzregistrierungsseite
- ZB
https://mastodon.social/auth/sign_up
-
PHANPY_PRIVACY_POLICY_URL
(optional, standardmäßig die Datenschutzrichtlinie der offiziellen Instanz):- URL der Seite mit den Datenschutzrichtlinien
- Kann die eigene Datenschutzrichtlinie der Instanz angeben
-
PHANPY_DEFAULT_LANG
(optional):- Die Standardsprache ist Englisch (
en
), sofern nicht angegeben. - Fallback-Sprache nach mehreren Erkennungsmethoden (
lang
Abfrageparameter, lang
Schlüssel in localStorage
und navigator.language
)
-
PHANPY_LINGVA_INSTANCES
(optional, durch Leerzeichen getrennte Liste, Standard: lingva.phanpy.social [...hard-coded list of fallback instances]
):- Geben Sie eine durch Leerzeichen getrennte Liste von Instanzen an. Zuerst wird als Standard verwendet, bevor auf die nachfolgenden Instanzen zurückgegriffen wird. Wenn es nur eine Instanz gibt, bedeutet dies, dass kein Fallback vorhanden ist.
- Kann eine selbstgehostete Lingva-Instanz angeben, die entweder von lingva-translate oder lingva-api unterstützt wird
- Liste der in
/.env
fest codierten Fallback-Instanzen - ↗️ Liste der lingva-translate-Instanzen
-
PHANPY_IMG_ALT_API_URL
(optional, keine Standardeinstellungen):- API-Endpunkt für selbstgehostete Instanz von img-alt-api.
- Falls bereitgestellt, wird eine Einstellung angezeigt, mit der Benutzer den Bildbeschreibungsgenerator im Composer aktivieren können. Standardmäßig deaktiviert.
-
PHANPY_GIPHY_API_KEY
(optional, keine Standardeinstellungen):- API-Schlüssel für GIPHY. Siehe API-Dokumente.
- Falls angegeben, wird eine Einstellung angezeigt, mit der Benutzer die GIF-Auswahl im Composer aktivieren können. Standardmäßig deaktiviert.
- Dies ist nicht selbst gehostet.
Statisches Site-Hosting
Versuchen Sie es mit einer Online-Suche nach „So hosten Sie statische Websites selbst“, da es dafür viele Möglichkeiten gibt.
Lingva-Translate- oder Lingva-API-Hosting
Siehe Dokumentation für lingva-translate oder lingva-api.
Community-Bereitstellungen
Diese werden von anderen wunderbaren Leuten selbst veranstaltet.
- ferengi.one von @david@weaknotes.com
- halo.mookiesplace.com von @mookie@mookiesplace.com
- phanpy.bauxite.tech von @b4ux1t3@hachyderm.io
- phanpy.blaede.family von @cassidy@blaede.family
- phanpy.crmbl.uk von @snail@crmbl.uk
- phanpy.cz von @zdendys@mamutovo.cz
- phanpy.fulda.social von @Ganneff@fulda.social
- phanpy.gotosocial.social von @admin@gotosocial.social
- phanpy.hear-me.social von @admin@hear-me.social
- phanpy.mastodon.world von @ruud@mastodon.world
- phanpy.mstdn.mx von @maop@mstdn.mx
- phanpy.social.tchncs.de von @milan@social.tchncs.de
- phanpy.tilde.zone von @ben@tilde.zone
- phanpy.vmst.io von @vmstan@vmst.io
- social.qrk.one von @kev@fosstodon.org
Hinweis: Fügen Sie Ihre hinzu, indem Sie eine Pull-Anfrage erstellen.
Kosten
Kosten für den Betrieb und die Entwicklung dieser Web-App:
- Domainname (.social): 23,18 USD/Jahr (6,87 USD im 1. Jahr)
- Hosting: Kostenlos
- Entwicklung, Design, Wartung: „Kostenlos“ (meine kostbare Zeit)
Maskottchen
Phanpy ist ein Boden-Pokémon.
Betreuer + Mitwirkende
- Chee Aun (Mastodon) (Twitter)
Freiwillige Übersetzer
- alidsds11 (Arabisch)
- Alternative (Koreanisch)
- BoFFire (Arabisch, Französisch, Kabyle)
- Brawaru (Russisch)
- cbasje (Niederländisch)
- cbo92 (Französisch)
- CDN (vereinfachtes Chinesisch)
- dannypsnl (traditionelles Chinesisch)
- databio (Katalanisch)
- Dizro (Italienisch)
- Drift6944 (Tschechisch)
- drydenwu (traditionelles Chinesisch)
- elissar (Französisch)
- ElPamplina (Spanisch)
- Fitik (Esperanto, Hebräisch)
- Freeesia (Japanisch)
- ghose (Galizisch)
- hongminhee (Koreanisch)
- Hugoglyphe (Esperanto, Spanisch)
- isard (Katalanisch)
- kaliuwu (Polnisch)
- karlafej (Tschechisch)
- katullo11 (Italienisch)
- Kytta (Deutsch)
- llun (Thai)
- lucasofchirst (Okkitanisch, Portugiesisch, Portugiesisch, Brasilianisch)
- LukeHong (traditionelles Chinesisch)
- marcin.kozinski (Polnisch)
- mkljczkk (Polnisch)
- mojosoeun (Koreanisch)
- moreal (Koreanisch)
- MrWillCom (Chinesisch vereinfacht)
- nclm (Französisch)
- pazpi (Italienisch)
- punkrockgirl (Baskisch)
- radecos (Französisch)
- Razem (Tschechisch)
- Realpixelcode (Deutsch)
- rezahosseinzadeh (Persisch)
- rwmpelstilzchen (Esperanto, Hebräisch)
- SadmL (Russisch)
- SadmL_AI (Russisch)
- shuuji3 (Japanisch)
- Sky_NiniKo (Französisch)
- Steffo99 (Italienisch)
- Su5hicz (Tschechisch)
- tferrermo (Spanisch)
- tkbremnes (norwegisches Bokmal)
- tux93 (Deutsch)
- Vac31. (Litauisch)
- valtlai (Finnisch)
- vasiriri (Polnisch)
- Voyagercy (traditionelles Chinesisch)
- xabi_itzultzaile (Baskisch)
- xen4n (Ukrainisch)
- xqueralt (Katalanisch)
- ZiriSut (Kabyle)
- zkreml (Tschechisch)
Hintergrundgeschichte
Ich bin einer der ersten Twitter-Nutzer. Twitter wurde am 15. Juli 2006 gestartet. Ich bin im Dezember 2006 beigetreten und mein erster Tweet wurde am 18. Dezember 2006 gepostet.
Ich weiß, wie früh Twitter aussieht. Es hat Spaß gemacht.
Damals habe ich einen Twitter-Klon namens „Twig“ erstellt, der in Python und Google App Engine geschrieben wurde. Ich habe fast meinen eigenen Twitter-Desktop-Client erstellt, der in Appcelerator Titanium geschrieben wurde. Einen meiner besten Vorträge über den Twitter-Client habe ich in einer Minikonferenz gehalten. Ich habe dieses Ding namens „Twitter Columns“ erstellt, eine Web-App, die Ihre Follower-Liste, die Follower Ihrer Follower, Ihre Follower, die Follower Ihrer Follower usw. anzeigt. Im Jahr 2009 schrieb ich einen Blogbeitrag mit dem Titel „Wie ich mit Twitter angefangen habe“. Ich habe zwei Themes für DestroyTwitter (einen Desktop-Client, der mit Adobe Air von Jonnie Hallman erstellt wurde) erstellt und eines davon heißt „Vimeo“. Im Jahr 2013 habe ich meine eigene Tweets-Backup-Site mit einem Frontend zum Anzeigen meiner Tweets und einem CouchDB-Backend zum Speichern dieser erstellt.
Es ist mehr als 15 Jahre her.
Und hier bin ich. Erstellen eines Mastodon-Webclients.
Alternative Web-Clients
- Phanpy-Gabeln ↓
- Schürze (im Ruhestand) – Gabeln ↓
- Kuckuck+
- Sengi
- Seifenkiste
- Elch - Gabeln ↓
- Mastodeck
- Badehosen
- Tooty
- Katzentoilette
- Statuer
- Stoßzähne
- Mastodon Glitch Edition (eigenständiges Frontend)
- Mangan
- Der Schreibtisch
- Mehr...
?♂️ Hinweis für alle anderen Social-Media-Client-Entwickler
Bitte kopieren Sie die UI-Ideen und Experimente aus dieser App. Ich denke, einige davon sind ziemlich gut und es wäre großartig, wenn mehr Apps sie hätten.
Wenn Sie kein Entwickler sind, informieren Sie bitte Ihre bevorzugten Social-Media-Client-Entwickler über diese App und bitten Sie sie, die Ideen und Experimente zur Benutzeroberfläche zu kopieren.
Lizenz
MIT.