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
orAuto-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 useraccess_token
. It is not used from2.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
)
- Fedi subscribes to
/api/v1/push/subscription
withsubscription[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_notifications
andfirebase_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
)
- Fedi subscribes to
/api/v1/push/subscription
withsubscription[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
,body
andaccess_token
access_token
is sensitive data. It is possible to login into your account if someone knowsaccess_token
Pros
- Faster push delivery. FCM message(notification type) with
notification.title
andnotification.body
, which has higher priority than message withoutnotification.title
¬ification.body
fields. Actually it is more affects iOS, than Android. Readawesome_notifications
andfirebase_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
- automatically via
flutter intl
plugin - manually via
flutter intl
package
Completed
- English, Russian
Help translate Fedi
- Help translate Fedi with Weblate
- It is easy to suggest fixes even without registering