• Stars
    star
    863
  • Rank 50,967 (Top 2 %)
  • Language
    JavaScript
  • License
    MIT License
  • Created over 1 year ago
  • Updated 11 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.
840
star
5

javascript-error-logging

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

puppetron

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

repokemon

Showcase of GitHub repos with Pokémon names
CSS
335
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
183
star
12

exploretrees-sg

🌳 Explore Trees in Singapore 🇸🇬
JavaScript
128
star
13

earth

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

neat-bookmarks

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

kyoku

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

arrivelah

Fast simple API for bus arrival times in Singapore.
JavaScript
82
star
17

chengyu-wordle

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

3d-earth

🌏🌎🌍 3D Earth with Mapbox GL, D3.js and Three.js
HTML
73
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
61
star
21

hackerweb-native-2

HackerWeb 2: A read-only Hacker News client.
JavaScript
58
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
42
star
25

checkweather-sg

☀️🌧 Yet another weather app for Singapore
JavaScript
38
star
26

photorealistic-3d-deckgl

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

sgbusdata

Singapore Bus data
JavaScript
32
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
28
star
30

moodoco

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

mooj

jQuery-like syntax for Mootools.
JavaScript
25
star
32

octofication

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

sgraildata

Singapore Rail data
JavaScript
16
star
34

rain-geojson-sg

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

getSelector.js

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

aimp-mobile-web-ctl

AIMP Mobile Web Control interface.
JavaScript
11
star
37

tweet2md

Convert a tweet to Markdown
HTML
11
star
38

npm-star

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

pinpoint

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

connectionsmy

Tech things aggregator for Malaysia
HTML
10
star
41

phoenity-icons

Simple icons for everyone.
10
star
42

om3d

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

sgtreesdata

Singapore Trees data
JavaScript
10
star
44

whathappen-sg

What's Happening in Singapore
HTML
9
star
45

macos-quick-actions

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

cacss

CSS in its simplest form.
JavaScript
9
star
47

cheeaun.github.com

cheeaungit
9
star
48

hackerwebapp.com

HackerWeb
HTML
9
star
49

tweets

An off-site archive of tweets from Twitter
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

example-fx

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

psi-sg

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

ndp2020-wishes

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

gh-starred-repos-feed

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

kopi.guide

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

mangafeeder

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

checkweather-sg-native

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

img-alt-api

Simple API endpoint for image alt description generation, powered by OpenAI GPT-4 with Vision
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

slakoth

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

iosconfsg-2017-design

Design files for iOSConf SG 2017
OpenSCAD
5
star
68

twitter-clients-chart

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

alba-ewaste-sg-dropoff-locations

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

branding

Branding for myself
5
star
71

the-sexy-curls-jquery-plugin

A page-turning plugin for jQuery
JavaScript
5
star
72

pagezoom

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

f1sg

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

jquery.tabscrollify

scrollify your tabs, baby
JavaScript
4
star
75

pentagoo

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

toransureto

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

rainshot

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

ca-generator

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

sgnightfest

SG Night Fest Map
JavaScript
4
star
80

shuffletext.js

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

mapwalker

JavaScript
4
star
82

nakeddayjs

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

venusaur

iCal as a Service
3
star
84

pentagoo-wave

Pentagoo on Wave
3
star
85

urly

URL shortener for Google App Engine
Python
3
star
86

malaysia-flag-css

Pure CSS Malaysia Flag
3
star
87

jquery.spacetagging

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

barcampkl-hub

The Hub, for KL BarCampers.
JavaScript
3
star
89

Fx.TransMorph

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

bubble-wrap

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

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
92

talks

My talks
HTML
3
star
93

moneygowhere

JavaScript
3
star
94

hnmobile

Hacker News web app [MOVED]
2
star
95

cheeaun

My special repository
2
star
96

mootools-search-chrome

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

.github

Global .github
2
star
98

xbar-plugins

My plugins for Xbar
Shell
2
star
99

fourcircle

Your Foursquare to-do venues plotted on a map
JavaScript
2
star
100

motiontext

Some sort of text flipping effect.
JavaScript
2
star