• Stars
    star
    1,070
  • Rank 43,204 (Top 0.9 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created almost 2 years ago
  • Updated 26 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A minimalistic opinionated Mastodon web client

Phanpy

Minimalistic opinionated Mastodon web client.


🗣️ Pronunciation: /fænpi/ (FAN-pee) 🔊 Listen

This is an alternative web client for Mastodon.

  • 🏢 Production: https://phanpy.social
    • production branch
    • break less often
    • slower fixes unless critical
  • 🏗️ Development: https://dev.phanpy.social
    • main branch
    • may see new cool stuff sooner
    • may break more often
    • may be fixed much faster too

🐘 Follow @phanpy on Mastodon for updates

Everything is designed and engineered following my taste and vision. This is a personal side project for me to learn about Mastodon and experiment with new UI/UX ideas.

Features

  • 👪 Multiple accounts
  • 🪟 Compose window pop-out/in
  • 🌗 Light/dark/auto theme
  • 🔔 Grouped notifications
  • 🪺 Nested comments thread
  • 📬 Unsent draft recovery
  • 🎠 Boosts Carousel™️
  • ⚡ Shortcuts™️ with view modes like multi-column or tab bar
  • #️⃣ Multi-hashtag timeline

Design decisions

  • Status actions (reply, boost, favourite, bookmark, etc) are hidden by default.
    They only appear in individual status page. This is to reduce clutter and distraction. It may result in lower engagement, but we're not chasing numbers here.
  • Boost is represented with the rocket icon.
    The green double arrow icon (retweet for Twitter) doesn't look right for the term "boost". Green rocket looks weird, so I use purple.
  • Short usernames (@username) are displayed in timelines, instead of the full account username (@username@instance).
    Despite the guideline mentioned that "Decentralization must be transparent to the user", I don't think we should shove it to the face every single time. There are also some screen-reader-related accessibility concerns with the full username, though this web app is unfortunately not accessible yet.
  • No autoplay for video/GIF/whatever in timeline.
    The timeline is already a huge mess with lots of people, brands, news and media trying to grab your attention. Let's not make it worse. (Current exception now would be animated emojis.)
  • Hash-based URLs.
    This web app is not meant to be a full-fledged replacement to Mastodon's existing front-end. There's no SEO, database, serverless or any long-running servers. I could be wrong one day.

Subtle UI implementations

User name display

User name display

  • On the timeline, the user name is displayed as [NAME] @[username].
  • For the @[username], always exclude the instance domain name.
  • If the [NAME] looks the same as the @[username], then the @[username] is excluded as well.

Boosts Carousel

Boosts Carousel

  • From the fetched posts (e.g. 20 posts per fetch), if number of boosts are more than quarter of total posts or more than 3 consecutive boosts, boosts carousel UI will be triggered.
  • If number of boosts are more than 3 quarters of total posts, boosts carousel UI will be slotted at the end of total posts fetched (per "page").
  • Else, boosts carousel UI will be slotted in between the posts.

Thread number badge (e.g. Thread 1/X)

Thread number badge

  • Check every post for inReplyToId from cache or additional API requests, until the root post is found.
  • If root post is found, badge will show the index number of the post in the thread.
  • Limit up to 3 API requests as the root post may be very old or the thread is super long.
  • If index number couldn't be found, badge will fallback to showing Thread without the number.

Filtered posts

  • "Hide completely"-filtered posts will be hidden, with no UI to reveal it.
  • "Hide with a warning"-filtered posts will be partially hidden, showing the filter name and author name.
    • Content can be partially revealed by hovering over the post, with tooltip showing the post text.
    • Clicking it will open the Post page.
    • Long-pressing or right-clicking it will "peek" the post with a bottom sheet UI.
    • On boosts carousel, they are not partially hidden, but sorted to the end of the carousel.

Development

Prerequisites: Node.js 18+

  • npm install - Install dependencies
  • npm run dev - Start development server
  • npm run build - Build for production
  • npm run preview - Preview the production build
  • npm run fetch-instances - Fetch instances list from instances.social, save it to src/data/instances.json
    • requires .env.dev file with INSTANCES_SOCIAL_SECRET_TOKEN variable set
  • npm run sourcemap - Run source-map-explorer on the production build

Self-hosting

This is a pure static web app. You can host it anywhere you want. Build it by running npm run build and serve the dist folder.

Try search for "how to self-host static sites" as there are many ways to do it.

Tech stack

Some of these may change in the future. The front-end world is ever-changing.

Mascot

Phanpy is a Ground-type Pokémon.

Maintainers

Backstory

I am one of the earliest users of Twitter. Twitter was launched on 15 July 2006. I joined on December 2006 and my first tweet was posted on 18 December 2006.

I know how early Twitter looks like. It was fun.

Back then, I made a Twitter clone called "Twig" written in Python and Google App Engine. I almost made my own Twitter desktop client written in Appcelerator Titanium. I gave one of my best talks about the Twitter client in a mini-conference. I built this thing called "Twitter Columns", a web app that shows your list of followings, your followings' followings, your followers, your followers' followers and so on. In 2009, I wrote a blog post titled "How I got started with Twitter". I created two themes for DestroyTwitter (a desktop client made with Adobe Air by Jonnie Hallman) and one of them is called "Vimeo". In 2013, I wrote my own tweets backup site with a front-end to view my tweets and a CouchDB backend to store them.

It's been more than 15 years.

And here I am. Building a Mastodon web client.

Alternative web clients

💁‍♂️ Notice to all other social media client developers

Please, please copy the UI ideas and experiments from this app. I think some of them are pretty good and it would be great if more apps have them.

If you're not a developer, please tell your favourite social media client developers about this app and ask them to copy the UI ideas and experiments.

License

MIT.

More Repositories

1

life

Life - a timeline of important events in my life
HTML
2,715
star
2

hackerweb

A simply readable Hacker News web app
CSS
1,210
star
3

mooeditable

[DISCONTINUED] A simple web-based WYSIWYG editor, written in MooTools.
JavaScript
1,047
star
4

awesome-hacker-news

Awesome Hacker News: a collection of awesome Hacker News apps, libraries, resources and shiny things.
887
star
5

javascript-error-logging

A collection of JavaScript error logging services, resources and shiny things.
551
star
6

puppetron

Puppeteer (Headless Chrome Node API)-based rendering solution.
JavaScript
527
star
7

repokemon

Showcase of GitHub repos with Pokémon names
CSS
338
star
8

node-hnapi

Unofficial Hacker News API
JavaScript
332
star
9

tappable

A simple, standalone library to invoke the tap event for touch-friendly web browsers.
JavaScript
310
star
10

busrouter-sg

BusRouter SG: Singapore Bus Routes Explorer
JavaScript
302
star
11

hackerweb-native

A simply readable Hacker News app for iOS & Android, built with React Native. V2 now over here https://github.com/cheeaun/hackerweb-native-2
JavaScript
184
star
12

exploretrees-sg

🌳 Explore Trees in Singapore 🇸🇬
JavaScript
133
star
13

earth

🌏 A map of places I've checked in on Earth.
JavaScript
121
star
14

neat-bookmarks

A neat bookmarks tree popup extension for Chrome [DISCONTINUED]
JavaScript
106
star
15

arrivelah

Fast simple API for bus arrival times in Singapore.
JavaScript
90
star
16

chengyu-wordle

Wordle, for Chinese idioms - 成语 (chéngyǔ)
JavaScript
85
star
17

kyoku

A tiny app that shows iTunes current playing song on Mac menu bar
JavaScript
85
star
18

3d-earth

🌏🌎🌍 3D Earth with Mapbox GL, D3.js and Three.js
HTML
76
star
19

steepless

An app to find the flattest routes and avoid the hilliest routes
JavaScript
69
star
20

3d-touch-canvas

3D Touch Canvas, for iPhone 6S, 6S Plus and iPad Pro
HTML
62
star
21

hackerweb-native-2

HackerWeb 2: A read-only Hacker News client.
JavaScript
59
star
22

jquery.livefilter

Slightly advanced live filtering jQuery plugin
JavaScript
54
star
23

react-native-cache-store

A localStorage-like wrapper around React Native's AsyncStorage with cache expiration.
JavaScript
45
star
24

railrouter-sg

A progressive web app that lets you explore MRT and LRT rail routes in Singapore
JavaScript
43
star
25

photorealistic-3d-deckgl

Deck.GL with Google Maps Photorealistic 3D Tiles demo - lighting with shadows and post-processing effects
HTML
39
star
26

checkweather-sg

☀️🌧 Yet another weather app for Singapore
JavaScript
39
star
27

sgbusdata

Singapore Bus data
JavaScript
36
star
28

kanade

A Mobile web app to list anime series for every season, with scores and stuff for easy comparison.
JavaScript
31
star
29

taxirouter-sg

A web app that lets you explore available taxis and taxi stands in Singapore
JavaScript
30
star
30

moodoco

HTML5 Offline Documentation for MooTools Core and More.
25
star
31

mooj

jQuery-like syntax for Mootools.
JavaScript
25
star
32

sgraildata

Singapore Rail data
JavaScript
20
star
33

octofication

A nifty little Chrome extension for displaying GitHub notifications.
JavaScript
17
star
34

rain-geojson-sg

Straight-forward API server to convert rain area radar images (Singapore) to GeoJSON
JavaScript
16
star
35

getSelector.js

Get the shortest possible CSS selector path of an element.
JavaScript
14
star
36

tweet2md

Convert a tweet to Markdown
HTML
12
star
37

aimp-mobile-web-ctl

AIMP Mobile Web Control interface.
JavaScript
11
star
38

npm-star

Star GitHub repositories of your project's npm dependencies
JavaScript
11
star
39

om3d

Demo of Singapore buildings 3D tiles from OneMap on Mapbox GL JS.
JavaScript
11
star
40

pinpoint

Pinpoint is a Chrome extension that allows you to link to any part of a page.
JavaScript
11
star
41

whathappen-sg

What's Happening in Singapore
HTML
10
star
42

phoenity-icons

Simple icons for everyone.
10
star
43

connectionsmy

Tech things aggregator for Malaysia
HTML
10
star
44

sgtreesdata

Singapore Trees data
JavaScript
10
star
45

macos-quick-actions

A list of macOS Quick Actions / Services that I use on my machine
9
star
46

cheeaun.github.com

cheeaungit
9
star
47

hackerwebapp.com

HackerWeb
HTML
9
star
48

tweets

An off-site archive of tweets from Twitter
JavaScript
9
star
49

cacss

CSS in its simplest form.
JavaScript
9
star
50

chidori

A simple Twitter client, created with Titanium.
8
star
51

max-tabs

A no-restart Firefox extension to set maximum number of opened tabs in a window.
JavaScript
8
star
52

tweet-couch

Archive your tweets in a relaxing way.
JavaScript
8
star
53

cheeaun.com

cheeaun's web site
HTML
8
star
54

nobita

📜📍 Script to check in to a Foursquare (Swarm) location when user is within range. Uses CoreLocation. Only for macOS.
JavaScript
7
star
55

streetview-fun

Having fun with Google Maps StreetView API
JavaScript
7
star
56

kopi.guide

A helpful guide on how to order Kopi in Singapore and some say Malaysia too.
HTML
7
star
57

img-alt-api

Simple API endpoint for image alt description generation, powered by OpenAI GPT-4 with Vision
JavaScript
7
star
58

example-fx

An example Firefox extension for anyone to fork.
JavaScript
6
star
59

psi-sg

A web app that displays PSI readings in Singapore
HTML
6
star
60

gh-starred-repos-feed

A Cloudflare Worker that returns the starred repos of a GitHub user as a RSS feed
JavaScript
6
star
61

mapwalker

JavaScript
6
star
62

mangafeeder

Latest manga chapters from Mangareader.net, available in JSON and RSS formats.
JavaScript
6
star
63

checkweather-sg-native

☀️🌧 Yet another weather app for Singapore
JavaScript
6
star
64

moohub

GitHub API wrapper, in MooTools.
JavaScript
5
star
65

bgcolorful

A simple page for showing how browsers render the color value of 'bgcolor' attribute
5
star
66

ndp2020-wishes

Map and word cloud of wishes made during National Day Parade 2020 in Singapore
JavaScript
5
star
67

ca-generator

A web-based cheeaun logo generator, with configurable shapes, colors and dimensions.
HTML
5
star
68

slakoth

A Slack bot that auto-post daily tech events in Singapore
JavaScript
5
star
69

iosconfsg-2017-design

Design files for iOSConf SG 2017
OpenSCAD
5
star
70

twitter-clients-chart

Twitter clients distribution in real-time, based on the work by Dan Zajdband, twitter-clients.herokuapp.com
5
star
71

alba-ewaste-sg-dropoff-locations

ALBA E-Waste Drop-off Locations
TypeScript
5
star
72

sgnightfest

SG Night Fest Map
JavaScript
5
star
73

branding

Branding for myself
5
star
74

the-sexy-curls-jquery-plugin

A page-turning plugin for jQuery
JavaScript
5
star
75

pagezoom

A MooTools class to zoom in anything in a page
JavaScript
4
star
76

f1sg

A 2.5D map of the Singapore F1 Grand Prix circuit with landmarks around
HTML
4
star
77

jquery.tabscrollify

scrollify your tabs, baby
JavaScript
4
star
78

pentagoo

The popular Pentago game by MindTwister, written in Javascript.
PHP
4
star
79

toransureto

Any Language → Japanese → Romaji translation service, powered by Google App Engine
Python
4
star
80

rainshot

A serverless puppeteer instance to capture rain radar image of Singapore.
HTML
4
star
81

shuffletext.js

shuffleText.js - Class for creating text shuffling effects
JavaScript
4
star
82

gh-proxy

Cloudflare Worker ⚡ gh-proxy - Set up a (sub)-domain proxy for Github Pages.
JavaScript
4
star
83

lingva-api

Simple API endpoint based on Lingva Translate
JavaScript
4
star
84

nakeddayjs

nakedDay.js for the CSS Naked Day.
3
star
85

venusaur

iCal as a Service
3
star
86

urly

URL shortener for Google App Engine
Python
3
star
87

malaysia-flag-css

Pure CSS Malaysia Flag
3
star
88

jquery.spacetagging

slight feature rip-off of HeadSpace2 http://urbangiraffe.com/plugins/headspace2/
JavaScript
3
star
89

barcampkl-hub

The Hub, for KL BarCampers.
JavaScript
3
star
90

Fx.TransMorph

Just like Fx.Morph, but allows per-property transitions.
JavaScript
3
star
91

bubble-wrap

A rather satisfying bubble wrap popping game.
JavaScript
3
star
92

sg3rdata

Singapore 3R data
TypeScript
3
star
93

sg-rain-radar-scribbler

An experimental web app to load rain radar images from weather.gov.sg and allow scribbling of the images at 5-minute intervals while generating a JSON output of the radar with a "Download" button.
HTML
3
star
94

talks

My talks
HTML
3
star
95

moneygowhere

JavaScript
3
star
96

pentagoo-wave

Pentagoo on Wave
3
star
97

mootools-search-chrome

Chrome extension to search MooTools' blogs, demos, documentation, forums and tutorials
2
star
98

hnmobile

Hacker News web app [MOVED]
2
star
99

cheeaun

My special repository
2
star
100

.github

Global .github
2
star