Git Product home page Git Product logo

fedisqueak's Introduction

A crudely drawn gopher with a megaphone superimposed above a nonbinary pride flag

FediSqueak

A fediverse client made primarily for use with GoToSocial instances.
Build in React Native for iOS and Android.
Very much work in progress.

Current state of the project

As it stands right now, this app cannot do most things it will have to do before becoming a client anyone would want to actually use.
Check out the MVP project board to see what it still lacks.

As it stands currently, even installing the project is a bit annoying since we've got some peer dependency mismatches that make it impossible to just run npm install, you will need to add --force, which should really be fixed...

Reasoning

Most clients available for mobile devices are made primarily for use with Mastodon. This leads to annoying bugs when encountering the things that GoToSocial does differently than Mastodon.
I also want a couple of features in my client that others don't care enough about to implement.

Once the project is production ready, I also want to include features that only some fedi backends have and hide them behind feature gates.
This could potentially make this the first intentional multi backend app for the fediverse.

Naming

Why FediSqueak?
Because my previous favourite fediverse client Toot! is named after the sound a Mastodon would make, which makes sense considering it is primarily intended for use with Mastodon.
Since everything written in Go must have a Gopher as its mascot, I thought I'd name my client after the sound those make.
The fact that GoToSocial breaks with the norm and has a sloth as its mascot did not impact this application's naming.

fedisqueak's People

Contributors

dysphoricunicorn avatar

Stargazers

 avatar  avatar

Watchers

 avatar

fedisqueak's Issues

Profile editing

Allow users to set their profile description, display name, header image, profile picture, default post visibility and if new followers must request the follow

Multi user functionality

Enable users to log in with multiple accounts, browse their timelines and interact with posts

Media posts

Add capability to create media posts, only allow sending with an image description by default

Backend specific feature selection

  • Find out which backend an account is on
  • Add an HOC for components that are only available in specific backends
  • Only render features a user can actually use
  • (Add option to show all features in case a backend has a feature added but I'm too slow to update the app to show it to their users)

Allow users to disable emojo and profile picture animations

It is possible to upload animated profile pictures and emojos. Other than many clients, FediSqueak actually does support those animations.
That is cool for many people, but may cause discomfort or even seizures for others. We should therefore add an option to disable the display of animated things app wide.

Fix NPM install

Currently, due to a mismatch in peer dependencies, you need --force to run npm install.
That is not really acceptable and should be fixed.

Mastodon compatibility

Currently trying to log into a mastodon instance causes the app to crash.
That should probably not happen.

Posting

Allow users to post new posts and replies

Remember scroll position

When the user leaves the app or switches between views/ timelines their scroll position should be remembered. This is extremely difficult to pull off because we do not know in advance what any given post's height is.

Here's an idea for how it could be implemented:

  • Add a height field to posts, it is undefined be default
  • When the post is rendered, check if it already has a height field
  • If not, get the rendered post's height and store it. This will cause a rerender :(
  • Add the prop that allows the Timeline view to figure out how heigh a post is. Check the data index and return the height if given, return 500px otherwise (this is going to be the longest height before a post is cut off)
  • Add a scroll listener to the timeline and store the current scroll position
  • Add the initialOffset prop to the view with the last value stored by the scroll listener

Post scheduling

Allow users to schedule posts.
This should be easy to implement as its already supported in the mastodon API.

TODO: check if GoToSocial also has this feature already and if not maybe send them a PR?

Cache performance

Currently the cache is very "greedy", only removing posts when the user clicks the clear cache button in settings. This will lead to caches that become extremely large and slow to load and render.

TODO:

  • Figure out a good algorithm to decide which posts to delete from cache
  • Check if it makes sense to replace @react-native-async-storage/async-storage with something more performant

Re implement FlatList

The React Native FlatList is not really intended for what we're doing with it (very large lists with entries that do not have uniform height)

Instead of spending tons of development time on working around that limitation, a new implementation would probably be a better idea

User interaction deduplication

Currently the different variables that store weather a user has favorited or boosted a post are pretty buggy. This is due to a combination of API bugs, the way boosts are implemented and the fact that we cache a ton of stuff.

We should consider adding a global deduplicated object that contains post interactions (possibly including weather or not CNs are expanded and more) and read that info from there.

The main issue with this idea is that users might use other clients to interact with posts. In this case we could get the info about those interactions from the API but we don't really know if that info is to be trusted.
Maybe this isn't as big of an issue in reality because people don't actually care that much about what color the favorite Star underneath a post has?

Cache CN expanded state

Add a CN expanded field to cached post data, so that expanded posts stay expanded even if the user leaves the app or view.

Bonus points for deduplication, meaning if a user has expanded a CN in a notification, all other notifications for that post will also have their CN expanded.

Ability to hide specific posts

Sometimes half the fediverse likes boosting the same post. That can get annoying.

Add an option to hide specific posts from the user's tl.

Detailed post/ thread view

Allow users to click posts to expand them and show replies as well as the full thread if the post is a reply itself

Timeline rendering performance improvements

Currently the timeline is rendered simply by going through all cached posts and rendering an element for it in a large ScrollView. As the app gets more and more features, this will definitely lead to performance issues.

Figure out a good way to only render posts that are actually being shown while still allowing "endless scrolling"

Theming support

Add themes:

  • dark
  • light
  • Auto default from OS preferences
  • cybre (similar to the cybre.space custom css, replaces posts with pings, favs with florps and boosts with relays)

Split caches into hot/ cold

Every time the user navigates away from a timeline screen, move a certain amount of posts into cold storage and delete them from hot storage to reduce the size of the FlatList of posts that is rendered.

If if is possible to remove data from the FlatList without loosing scroll position, this could be done regularly in the background.

If the user refreshes or loads more, at first there is a cold storage lookup to get newer/ older posts back into hot storage and if there are none, the posts are fetched from the API.

Instance forbidlist

This is going to get me a lot of hate, but I want to stop people from logging into the worst instances on the fediverse using my app

Regex filters

Allow users to create client side regex filters to hide certain posts

Timeline caching

Find a way to store the current scroll position and maybe cache rendered entities to avoid rerendering time

Admin features

Add features to administer a GoToSocial instance:

  • Manage emojos
  • Manage domain blocks
  • Set the instance description
  • Clean up old media
  • Maybe more?

App Icon

The app needs an icon.
The icon should be cute.

App settings

Add a settings menu allowing users to:

  • Manage accounts
  • Allow posting images without a description
  • Maybe more?

RSS

Maybe add the possibility to follow RSS feeds and have them show up in the home timeline

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.