A client for Pleroma and Mastodon instances written using Flutter

Fedi for Pleroma and Mastodon

Fedi is open-source client for Pleroma and Mastodon social networks written using Flutter.

Pleroma and Mastodon are parts of Fediverse (decentralized social network). The main idea of Fediverse - nobody owns Fediverse. Anybody can run their server instance and use it to communicate with other people.

So Fedi is an open-source mobile client for social networks and has features similar to Twitter.

Follow us on Fediverse fediapp@fedi.app

Features

  • Pleroma and Mastodon support
  • Offline mode. Access to cached data even without network
  • Custom emojis. With emoji reactions support on Pleroma
  • Customizable home timelines
  • Multi-account support
  • Push notifications via PushRelayFCM and FCM
  • Supports receive and send share intends
  • Scheduled and Draft Statuses
  • Filters
  • Instance details, announcements, trends, activity history, limits
  • Day & Night theme
  • Bookmarks, Hashtags, Lists, Featured tags, Suggestions
  • Messenger-like UI for Conversations(DM) and Pleroma chats
  • Customizable real-time notifications & timeline updates via WebSockets and Push Notifications
  • Fetch data from Remote instances via Public API. So you can access full data on remote instance if currently logged instance hasn't synchronized all data yet
  • A lot of settings options(global or per-instance). For example: Always show NSFW or Auto-load media content
  • Threads & Polls
  • Special UI for media-only timelines
  • Mutes & Blocks
  • Editing profile
  • Sign up support

Coming soon

  • Admin API;
  • Support other Fediverse instances: Pixelfed, Misskey, Peertube, GNU Social, Friendica and others;
  • Pleroma: scrobbles, mascot and recently added new features;
  • Mastodon: recently added new features.
  • Adopt UI for large screens;
  • Display timelines from different instances on single Home page(currently you should switch instances to see related data);
  • Remember timeline position via Markers API;
  • OnBoarding & Tutorial. Popular instances suggestions;
  • A lot of minor UX improvements in backlog.

Feel free to open issues if you have suggestions

Known issues

  • Text is not selectable, but you can copy or share whole statuses
  • Instances with special chars like ü are not supported

Data gathering

Fedi doesn't use any special analytics service to track users.
However Fedi uses Firebase services for PushNotifications(optional) and CrashReporting(optional).

You can completely remove Firebase via manual building from source.

Crash reports via Firebase Crashlytics

Fedi gathers crashes and non-fatal errors to make app more stable.

  • You can build app from source and remove Crashlytics library via .env config(details below)
  • You can disable gathering via settings inside app(option is disabled by default)

Push notifications

Push notifications are implemented via PushRelayFCM server

PushRelayFCM is Ruby on Rails server which handles web pushes and relays them to FCM.

From 2.5.0 version Fedi uses PushRelayFCM mode without decryption on server-side. So all private data is safe.

PushRelayFCM and Fedi can work in two modes:

  • Without server-side decryption (2.5.0 and newer) - relay simple proxy encrypted messages
  • With server-side decryption (before 2.5.0) -decrypt messages and have access to notification content and user access_token. It is not used from 2.5.0 version, but is still supported in Fedi(see below why you still may want to use it).

Without server-side decryption way

(Used in AppStore/GooglePlay versions from 2.5.0)

  1. Fedi subscribes to /api/v1/push/subscription with subscription[endpoint] set to relay server URL
  2. Instances send web push notifications to relay server
  3. PushRelayFCM doesn't decrypt message
  4. PushRelayFCM proxies notifications to Fedi app via FCM
  5. Fedi doesn't decrypt message and use FCM message with encrypted data as simple trigger to load latest notification via REST API (this will be improved in future releases)
  6. Fedi displays notification

Since PushRelayServer doesn't know private decryption keys, it can't access any private data.

Pros
  • Doesn't have access to user private data
  • Uses rich notifications layouts and actions provided by awesome_notifications
Cons
  • Delivery may be delayed. Because PushRelayFCM sends FCM push message without notification (FCM calls it data message). Read awesome_notifications and firebase_messaging documentation for details. Fedi uses :mutable_content=>true, :content_available=>true, :priority=>"high", to increase delivery priority
Why Fedi doesn't decrypt message on client-side?

Because it is hard to implement with Flutter. There are no 3rd party Flutter libraries to decrypt ECDH p256v1 by now.
It is possible to decrypt it in Kotlin/Swift and it will be done in the future.

With server-side decryption way

(It is not used in AppStore/GooglePlay versions from 2.5.0)

  1. Fedi subscribes to /api/v1/push/subscription with subscription[endpoint] set to relay server URL
  2. Instances send Web push notifications to relay server
  3. PushRelayFCM decrypts notifications
  4. PushRelayFCM relays notifications to Fedi app via FCM
  5. Fedi displays notification
  • PushRelayFCM has access to title, body and access_token
  • access_token is sensitive data. It is possible to login into your account if someone knows access_token
Pros
  • Faster push delivery. FCM message(notification type) with notification.title and notification.body, which has higher priority than message without notification.title & notification.body fields. Actually it is more affects iOS, than Android. Read awesome_notifications and firebase_messaging documentation for details.
Cons
  • Private data access is main reason why Fedi moved to Without server-side decryption way
  • Doesn't use rich notifications layouts and actions provided by awesome_notifications

Localization

App uses flutter_localization API bundle with Flutter SDK.

It uses .arb files located in lib/l10n and generates .dart classes in /lib/generated/ folder.

After you make changes in .arb files you should do additional actions to regenerate Dart classes

Completed

  • English, Russian

Help translate Fedi

  • Help translate Fedi with Weblate
  • It is easy to suggest fixes even without registering

GitHub

https://github.com/Big-Fig/Fediverse.app