···23232424๐ Follow [@phanpy on Mastodon](https://hachyderm.io/@phanpy) for updates โจ
25252626-Everything is designed and engineered for my own use case, following my taste and vision. This is a personal side project for me to learn about Mastodon and experiment with new UI/UX ideas.
2727-2828-๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง
2929-3030-**๐ This is an early ALPHA project. Many features are missing, many bugs are present. Please report issues as detailed as possible. Thanks ๐**
3131-3232-๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง๐ง
2626+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.
33273428## Features
3529···3731- ๐ช Compose window pop-out/in
3832- ๐ Light/dark/auto theme
3933- ๐ Grouped notifications
4040-- ๐ชบ Nested replies view
3434+- ๐ชบ Nested comments thread
4135- ๐ฌย Unsent draft recovery
4236- ๐ ย Boosts Carouselโข๏ธ
4337- โก Shortcutsโข๏ธ with view modes like multi-column or tab bar
···5145- **No autoplay for video/GIF/whatever in timeline**.<br>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.)
5246- **Hash-based URLs**.<br>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.
53474848+## Subtle UI implementations
4949+5050+### User name display
5151+5252+
5353+5454+- On the timeline, the user name is displayed as `[NAME] @[username]`.
5555+- For the `@[username]`, always exclude the instance domain name.
5656+- If the `[NAME]` *looks the same* as the `@[username]`, then the `@[username]` is excluded as well.
5757+5858+### Boosts Carousel
5959+6060+
6161+6262+- 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.
6363+- 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").
6464+- Else, boosts carousel UI will be slotted in between the posts.
6565+6666+### Thread number badge (e.g. Thread 1/X)
6767+6868+
6969+7070+- Check every post for `inReplyToId` from cache or additional API requests, until the root post is found.
7171+- If root post is found, badge will show the index number of the post in the thread.
7272+- Limit up to 3 API requests as the root post may be very old or the thread is super long.
7373+- If index number couldn't be found, badge will fallback to showing `Thread` without the number.
7474+5475## Development
55765677Prerequisites: Node.js 18+
···6283- `npm run fetch-instances` - Fetch instances list from [instances.social](https://instances.social/), save it to `src/data/instances.json`
6384 - requires `.env.dev` file with `INSTANCES_SOCIAL_SECRET_TOKEN` variable set
6485- `npm run sourcemap` - Run `source-map-explorer` on the production build
8686+8787+## Self-hosting
8888+8989+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.
9090+9191+Try search for "how to self-host static sites" as there are many ways to do it.
65926693## Tech stack
6794