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 [email protected]
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 NSFWorAuto-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.0and newer) - relay simple proxy encrypted messages - With server-side decryption (before
2.5.0) -decrypt messages and have access to notification content and useraccess_token. It is not used from2.5.0version, 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)
- Fedi subscribes to
/api/v1/push/subscriptionwithsubscription[endpoint]set to relay server URL - Instances send web push notifications to relay server
- PushRelayFCM doesn't decrypt message
- PushRelayFCM proxies notifications to Fedi app via FCM
- 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)
- 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). Readawesome_notificationsandfirebase_messagingdocumentation 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)
- Fedi subscribes to
/api/v1/push/subscriptionwithsubscription[endpoint]set to relay server URL - Instances send Web push notifications to relay server
- PushRelayFCM decrypts notifications
- PushRelayFCM relays notifications to Fedi app via FCM
- Fedi displays notification
- PushRelayFCM has access to
title,bodyandaccess_token access_tokenis sensitive data. It is possible to login into your account if someone knowsaccess_token
Pros
- Faster push delivery. FCM message(notification type) with
notification.titleandnotification.body, which has higher priority than message withoutnotification.title¬ification.bodyfields. Actually it is more affects iOS, than Android. Readawesome_notificationsandfirebase_messagingdocumentation 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
- automatically via
flutter intlplugin - manually via
flutter intlpackage
Completed
- English, Russian
Help translate Fedi
- Help translate Fedi with Weblate
- It is easy to suggest fixes even without registering