From 29f92acd772c766191b33e0a2b2bc57aaef66f1a Mon Sep 17 00:00:00 2001 From: olorin99 Date: Mon, 30 Mar 2026 16:12:57 +1000 Subject: [PATCH 1/9] Add resolve object api. Try to open activity pub links in app instead of in browser. --- lib/src/api/api.dart | 3 + lib/src/api/instance.dart | 47 +++++++++++ lib/src/api/search.dart | 96 +++++++++++++++++++++++ lib/src/controller/controller.dart | 11 +++ lib/src/controller/database/database.dart | 17 ++++ lib/src/utils/ap_urls.dart | 32 ++++++++ lib/src/widgets/markdown/markdown.dart | 10 +++ 7 files changed, 216 insertions(+) create mode 100644 lib/src/api/instance.dart diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart index 90923e3b..28447f4d 100644 --- a/lib/src/api/api.dart +++ b/lib/src/api/api.dart @@ -6,6 +6,7 @@ import 'package:interstellar/src/api/community_moderation.dart'; import 'package:interstellar/src/api/domains.dart'; import 'package:interstellar/src/api/feed.dart'; import 'package:interstellar/src/api/images.dart'; +import 'package:interstellar/src/api/instance.dart'; import 'package:interstellar/src/api/messages.dart'; import 'package:interstellar/src/api/microblogs.dart'; import 'package:interstellar/src/api/moderation.dart'; @@ -25,6 +26,7 @@ class API { community = APICommunity(client), communityModeration = APICommunityModeration(client), feed = APIFeed(client), + instance = APIInstance(client), messages = APIMessages(client), moderation = APIModeration(client), notifications = APINotifications(client), @@ -42,6 +44,7 @@ class API { final APICommunity community; final APICommunityModeration communityModeration; final APIFeed feed; + final APIInstance instance; final APIMessages messages; final APIModeration moderation; final APINotifications notifications; diff --git a/lib/src/api/instance.dart b/lib/src/api/instance.dart new file mode 100644 index 00000000..a419b619 --- /dev/null +++ b/lib/src/api/instance.dart @@ -0,0 +1,47 @@ +import 'package:interstellar/src/api/client.dart'; +import 'package:interstellar/src/controller/database/database.dart'; +import 'package:interstellar/src/controller/server.dart'; +import 'package:interstellar/src/utils/utils.dart'; + +class APIInstance { + APIInstance(this.client); + + final ServerClient client; + + Future> federated() async { + switch (client.software) { + case ServerSoftware.mbin: + const path = '/federated'; + final response = await client.get(path); + + final domains = (response.bodyJson['instances']! as List) + .map((instance) => Instance.fromJson(instance)) + .toList(); + return domains; + + case ServerSoftware.lemmy: + const path = '/federated_instances'; + + final response = await client.get(path); + + final domains = + ((response.bodyJson['federated_instances']! as JsonMap)['linked']! + as List) + .map((instance) => Instance.fromJson(instance)) + .toList(); + return domains; + + case ServerSoftware.piefed: + const path = '/federated_instances'; + + final response = await client.get(path); + + final domains = + ((response.bodyJson['federated_instances']! as JsonMap)['linked']! + as List) + .map((instance) => Instance.fromJson(instance)) + .toList(); + return domains; + } + } +} diff --git a/lib/src/api/search.dart b/lib/src/api/search.dart index 39d8eda6..e6aa6e14 100644 --- a/lib/src/api/search.dart +++ b/lib/src/api/search.dart @@ -1,7 +1,14 @@ +import 'package:extended_image/extended_image.dart'; import 'package:interstellar/src/api/client.dart'; import 'package:interstellar/src/controller/server.dart'; +import 'package:interstellar/src/models/comment.dart'; +import 'package:interstellar/src/models/community.dart'; +import 'package:interstellar/src/models/feed.dart'; +import 'package:interstellar/src/models/post.dart'; import 'package:interstellar/src/models/search.dart'; +import 'package:interstellar/src/models/user.dart'; import 'package:interstellar/src/screens/explore/explore_screen.dart'; +import 'package:interstellar/src/utils/utils.dart'; class APISearch { APISearch(this.client); @@ -98,4 +105,93 @@ class APISearch { ); } } + + Future resolveObject(String search) async { + try { + switch (client.software) { + case ServerSoftware.mbin: + // using the search api here kinda works but is slow and throws 500 errors occasionally + + const path = '/search'; + + final response = await client.get(path, queryParams: {'q': search}); + + // get first of the ap objects found. + final json = response.bodyJson; + final actor = (json['apActors']! as List).firstOrNull; + if (actor?['type'] == 'user') + return DetailedUserModel.fromMbin(actor['object'] as JsonMap); + if (actor?['type'] == 'magazine') + return DetailedCommunityModel.fromMbin(actor['object'] as JsonMap); + + final object = (json['apObjects']! as List).firstOrNull; + if (object?['itemType'] == 'entry') + return PostModel.fromMbinEntry(object as JsonMap); + if (object?['itemType'] == 'post') + return PostModel.fromMbinPost(object as JsonMap); + if (object?['itemType'] == 'entry_comment' || + object?['itemType'] == 'post_comment') + return CommentModel.fromMbin(object as JsonMap); + + return null; + + case ServerSoftware.lemmy: + const path = '/resolve_object'; + + final response = await client.get(path, queryParams: {'q': search}); + + final json = response.bodyJson; + if (json['comment'] != null) { + return CommentModel.fromPiefed( + json['comment']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['post'] != null) { + return PostModel.fromPiefed( + json['post']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['community'] != null) { + return DetailedCommunityModel.fromPiefed( + json['community']! as JsonMap, + ); + } else if (json['person'] != null) { + return DetailedUserModel.fromPiefed(json['person']! as JsonMap); + } + return null; + + case ServerSoftware.piefed: + const path = '/resolve_object'; + + final response = await client.get(path, queryParams: {'q': search}); + + final json = response.bodyJson; + if (json['comment'] != null) { + return CommentModel.fromPiefed( + json['comment']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['post'] != null) { + return PostModel.fromPiefed( + json['post']! as JsonMap, + langCodeIdPairs: await client.languageCodeIdPairs(), + ); + } else if (json['community'] != null) { + return DetailedCommunityModel.fromPiefed( + json['community']! as JsonMap, + ); + } else if (json['person'] != null) { + return DetailedUserModel.fromPiefed(json['person']! as JsonMap); + } else if (json['feed'] != null) { + return FeedModel.fromPiefed(json['feed']! as JsonMap); + } + return null; + } + } on ClientException catch (e) { + if (e.message.contains('No object found')) { + return null; + } + rethrow; + } + } } diff --git a/lib/src/controller/controller.dart b/lib/src/controller/controller.dart index acdc54f2..2c963573 100644 --- a/lib/src/controller/controller.dart +++ b/lib/src/controller/controller.dart @@ -286,6 +286,17 @@ class AppController with ChangeNotifier { _defaultDownloadsDir = await getDefaultDownloadDir(); await _updateAPI(); + + final federatedDomains = await api.instance.federated(); + + await database.transaction(() async { + for (final instance in federatedDomains) { + await database + .into(database.instances) + .insertOnConflictUpdate(instance); + } + }); + logger.i('Finished init'); } diff --git a/lib/src/controller/database/database.dart b/lib/src/controller/database/database.dart index f5771fa5..c1faba57 100644 --- a/lib/src/controller/database/database.dart +++ b/lib/src/controller/database/database.dart @@ -441,6 +441,15 @@ class UserTags extends Table { Set> get primaryKey => {user, tagId}; } +class Instances extends Table { + TextColumn get domain => text()(); + TextColumn get software => text().nullable()(); + TextColumn get version => text().nullable()(); + + @override + Set> get primaryKey => {domain}; +} + @DriftDatabase( tables: [ Accounts, @@ -456,6 +465,7 @@ class UserTags extends Table { Drafts, Tags, UserTags, + Instances, ], ) class InterstellarDatabase extends _$InterstellarDatabase { @@ -541,6 +551,13 @@ class InterstellarDatabase extends _$InterstellarDatabase { const ServersCompanion(oauthIdentifier: Value(null)), ); } + + Future knownInstance(String domain) async { + final instance = await (select( + instances, + )..where((f) => f.domain.equals(domain))).getSingleOrNull(); + return instance != null; + } } late InterstellarDatabase database; diff --git a/lib/src/utils/ap_urls.dart b/lib/src/utils/ap_urls.dart index 0120d4e4..5f58cc40 100644 --- a/lib/src/utils/ap_urls.dart +++ b/lib/src/utils/ap_urls.dart @@ -1,11 +1,14 @@ +import 'package:auto_route/auto_route.dart'; import 'package:flutter/material.dart'; import 'package:interstellar/src/controller/controller.dart'; +import 'package:interstellar/src/controller/router.gr.dart'; import 'package:interstellar/src/controller/server.dart'; import 'package:interstellar/src/models/comment.dart'; import 'package:interstellar/src/models/community.dart'; import 'package:interstellar/src/models/feed.dart'; import 'package:interstellar/src/models/post.dart'; import 'package:interstellar/src/models/user.dart'; +import 'package:interstellar/src/screens/feed/post_page.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:provider/provider.dart'; @@ -103,3 +106,32 @@ List genFeedUrls(BuildContext context, FeedModel feed) { ?apUrl, ]; } + +Future navigateApObject(BuildContext context, String apId) async { + final ac = context.read(); + + final object = await ac.api.search.resolveObject(apId); + if (object == null || !context.mounted) return false; + + switch (object) { + case final CommentModel i: + context.router.push( + PostCommentRoute(postType: i.postType, commentId: i.id), + ); + case final PostModel i: + pushPostPage( + context, + communityName: i.community.name, + postId: i.id, + postType: i.type, + initData: i, + ); + case final DetailedCommunityModel i: + context.router.push(CommunityRoute(communityName: i.name, initData: i)); + case final DetailedUserModel i: + context.router.push(UserRoute(username: i.name, initData: i)); + case final FeedModel i: + context.router.push(FeedRoute(feedName: i.name)); + } + return true; +} diff --git a/lib/src/widgets/markdown/markdown.dart b/lib/src/widgets/markdown/markdown.dart index 9a0e638a..3235f660 100644 --- a/lib/src/widgets/markdown/markdown.dart +++ b/lib/src/widgets/markdown/markdown.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart' as mdf; +import 'package:interstellar/src/controller/database/database.dart'; import 'package:interstellar/src/models/image.dart'; +import 'package:interstellar/src/utils/ap_urls.dart'; import 'package:interstellar/src/widgets/image.dart'; import 'package:interstellar/src/widgets/markdown/markdown_config_share.dart'; import 'package:interstellar/src/widgets/markdown/markdown_mention.dart'; @@ -41,6 +43,14 @@ class Markdown extends StatelessWidget { ), onTapLink: (text, href, title) async { if (href != null) { + final isKnownInstance = await database.knownInstance( + Uri.parse(href).host, + ); + if (!context.mounted) return; + if (isKnownInstance) { + if (await navigateApObject(context, href)) return; + } + if (!context.mounted) return; openWebpageSecondary(context, Uri.parse(href)); } }, From d2593fa2d6e09d43f33943cdccd1e09e61c78356 Mon Sep 17 00:00:00 2001 From: olorin99 Date: Fri, 3 Apr 2026 16:16:29 +1000 Subject: [PATCH 2/9] Add debug setting to clear instances cache. Fetch federated instances on account login/switch as well as done async so to not block ui. --- lib/l10n/app_en.arb | 1 + lib/src/controller/controller.dart | 17 ++++++++++--- .../screens/settings/debug/debug_screen.dart | 25 +++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index b3f102e2..15ec5ccf 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -386,6 +386,7 @@ "settings_debug_clearFeedCache": "Clear feed cache", "settings_debug_clearTags": "Clear user tags", "settings_debug_clearOauth": "Clear Oauth identifiers", + "settings_debug_clearInstancesCache": "Clear federated instances cache", "settings_debug_log": "Log", "profiles": "Profiles", "profile_switch": "Switch profiles", diff --git a/lib/src/controller/controller.dart b/lib/src/controller/controller.dart index 2c963573..eee47cd8 100644 --- a/lib/src/controller/controller.dart +++ b/lib/src/controller/controller.dart @@ -286,7 +286,12 @@ class AppController with ChangeNotifier { _defaultDownloadsDir = await getDefaultDownloadDir(); await _updateAPI(); + _cacheFederatedInstances(); + logger.i('Finished init'); + } + + Future _cacheFederatedInstances() async { final federatedDomains = await api.instance.federated(); await database.transaction(() async { @@ -295,9 +300,13 @@ class AppController with ChangeNotifier { .into(database.instances) .insertOnConflictUpdate(instance); } + await database + .into(database.instances) + .insertOnConflictUpdate( + InstancesCompanion.insert(domain: instanceHost), + ); }); - - logger.i('Finished init'); + logger.i('Cached instances federated with $instanceHost'); } Future _rebuildProfile() async { @@ -602,7 +611,8 @@ class AppController with ChangeNotifier { await switchAccounts(key, force: forceSwitch); } else { // The following is already done when switchAccounts is run, so only needed without switchAccounts. - _updateAPI(); + await _updateAPI(); + _cacheFederatedInstances(); notifyListeners(); } @@ -672,6 +682,7 @@ class AppController with ChangeNotifier { _selectedAccount = newAccount; await _updateAPI(); + _cacheFederatedInstances(); userMentionCache.clear(); communityMentionCache.clear(); diff --git a/lib/src/screens/settings/debug/debug_screen.dart b/lib/src/screens/settings/debug/debug_screen.dart index e5c83dd2..86c0850e 100644 --- a/lib/src/screens/settings/debug/debug_screen.dart +++ b/lib/src/screens/settings/debug/debug_screen.dart @@ -298,6 +298,31 @@ class DebugSettingsScreen extends StatelessWidget { ), ), ), + ListTile( + leading: const Icon(Symbols.device_hub_rounded), + title: Text(l(context).settings_debug_clearInstancesCache), + onTap: () => showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(l(context).settings_debug_clearInstancesCache), + actions: [ + OutlinedButton( + onPressed: () => context.router.pop(), + child: Text(l(context).cancel), + ), + FilledButton( + onPressed: () async { + await database.delete(database.instances).go(); + ac.logger.i('Cleared federated instances cache'); + if (!context.mounted) return; + context.router.pop(); + }, + child: Text(l(context).remove), + ), + ], + ), + ), + ), ListTile( leading: const Icon(Symbols.list_rounded), title: Text(l(context).settings_debug_log), From 280bf784f6be03b9f24391b59c4d7c4f0f028a3a Mon Sep 17 00:00:00 2001 From: olorin99 Date: Fri, 3 Apr 2026 16:43:54 +1000 Subject: [PATCH 3/9] Fix resolve object for lemmy. --- lib/src/api/search.dart | 26 ++++++++++++++++---------- lib/src/models/post.dart | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/src/api/search.dart b/lib/src/api/search.dart index e6aa6e14..832c9b4c 100644 --- a/lib/src/api/search.dart +++ b/lib/src/api/search.dart @@ -119,19 +119,24 @@ class APISearch { // get first of the ap objects found. final json = response.bodyJson; final actor = (json['apActors']! as List).firstOrNull; - if (actor?['type'] == 'user') + if (actor?['type'] == 'user') { return DetailedUserModel.fromMbin(actor['object'] as JsonMap); - if (actor?['type'] == 'magazine') + } + if (actor?['type'] == 'magazine') { return DetailedCommunityModel.fromMbin(actor['object'] as JsonMap); + } final object = (json['apObjects']! as List).firstOrNull; - if (object?['itemType'] == 'entry') + if (object?['itemType'] == 'entry') { return PostModel.fromMbinEntry(object as JsonMap); - if (object?['itemType'] == 'post') + } + if (object?['itemType'] == 'post') { return PostModel.fromMbinPost(object as JsonMap); + } if (object?['itemType'] == 'entry_comment' || - object?['itemType'] == 'post_comment') + object?['itemType'] == 'post_comment') { return CommentModel.fromMbin(object as JsonMap); + } return null; @@ -142,21 +147,21 @@ class APISearch { final json = response.bodyJson; if (json['comment'] != null) { - return CommentModel.fromPiefed( + return CommentModel.fromLemmy( json['comment']! as JsonMap, langCodeIdPairs: await client.languageCodeIdPairs(), ); } else if (json['post'] != null) { - return PostModel.fromPiefed( + return PostModel.fromLemmy( json['post']! as JsonMap, langCodeIdPairs: await client.languageCodeIdPairs(), ); } else if (json['community'] != null) { - return DetailedCommunityModel.fromPiefed( + return DetailedCommunityModel.fromLemmy( json['community']! as JsonMap, ); } else if (json['person'] != null) { - return DetailedUserModel.fromPiefed(json['person']! as JsonMap); + return DetailedUserModel.fromLemmy(json['person']! as JsonMap); } return null; @@ -188,7 +193,8 @@ class APISearch { return null; } } on ClientException catch (e) { - if (e.message.contains('No object found')) { + if (e.message.contains('No object found') || + e.message.contains('couldnt_find_object')) { return null; } rethrow; diff --git a/lib/src/models/post.dart b/lib/src/models/post.dart index 045a99aa..ddd2c5cb 100644 --- a/lib/src/models/post.dart +++ b/lib/src/models/post.dart @@ -208,7 +208,7 @@ abstract class PostModel with _$PostModel { JsonMap json, { required List<(String, int)> langCodeIdPairs, }) { - final postView = json['post_view']! as JsonMap; + final postView = json['post_view'] as JsonMap? ?? json; final lemmyPost = postView['post']! as JsonMap; final lemmyCounts = postView['counts'] as JsonMap?; From 2c100679736530cc6516c9f41acb4c42efe36028 Mon Sep 17 00:00:00 2001 From: olorin99 Date: Mon, 13 Apr 2026 22:02:17 +1000 Subject: [PATCH 4/9] Add database migrations. --- .../controller/database/database.steps.dart | 47 ++++++++++++++++ .../database/schemas/drift_schema_v3.json | 56 +++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/lib/src/controller/database/database.steps.dart b/lib/src/controller/database/database.steps.dart index d7874ef3..9b027bca 100644 --- a/lib/src/controller/database/database.steps.dart +++ b/lib/src/controller/database/database.steps.dart @@ -1336,6 +1336,7 @@ final class Schema3 extends i0.VersionedSchema { drafts, tags, userTags, + instances, accountUnifiedpushToken, ]; late final Shape13 accounts = Shape13( @@ -1562,6 +1563,17 @@ final class Schema3 extends i0.VersionedSchema { ), alias: null, ); + late final Shape17 instances = Shape17( + source: i0.VersionedTable( + entityName: 'instances', + withoutRowId: false, + isStrict: false, + tableConstraints: ['PRIMARY KEY(domain)'], + columns: [_column_105, _column_106, _column_107], + attachedDatabase: database, + ), + alias: null, + ); final i1.Index accountUnifiedpushToken = i1.Index( 'account_unifiedpushToken', 'CREATE INDEX account_unifiedpushToken ON accounts (unifiedpush_token)', @@ -1821,6 +1833,41 @@ i1.GeneratedColumn _column_104(String aliasedName) => 'NOT NULL DEFAULT 0 CHECK (unifiedpush_distributor_ack IN (0, 1))', defaultValue: const i1.CustomExpression('0'), ); + +class Shape17 extends i0.VersionedTable { + Shape17({required super.source, required super.alias}) : super.aliased(); + i1.GeneratedColumn get domain => + columnsByName['domain']! as i1.GeneratedColumn; + i1.GeneratedColumn get software => + columnsByName['software']! as i1.GeneratedColumn; + i1.GeneratedColumn get version => + columnsByName['version']! as i1.GeneratedColumn; +} + +i1.GeneratedColumn _column_105(String aliasedName) => + i1.GeneratedColumn( + 'domain', + aliasedName, + false, + type: i1.DriftSqlType.string, + $customConstraints: 'NOT NULL', + ); +i1.GeneratedColumn _column_106(String aliasedName) => + i1.GeneratedColumn( + 'software', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: 'NULL', + ); +i1.GeneratedColumn _column_107(String aliasedName) => + i1.GeneratedColumn( + 'version', + aliasedName, + true, + type: i1.DriftSqlType.string, + $customConstraints: 'NULL', + ); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, diff --git a/lib/src/controller/database/schemas/drift_schema_v3.json b/lib/src/controller/database/schemas/drift_schema_v3.json index 4fd6e260..1a68ba66 100644 --- a/lib/src/controller/database/schemas/drift_schema_v3.json +++ b/lib/src/controller/database/schemas/drift_schema_v3.json @@ -1878,6 +1878,53 @@ }, { "id": 13, + "references": [], + "type": "table", + "data": { + "name": "instances", + "was_declared_in_moor": false, + "columns": [ + { + "name": "domain", + "getter_name": "domain", + "moor_type": "string", + "nullable": false, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "software", + "getter_name": "software", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + }, + { + "name": "version", + "getter_name": "version", + "moor_type": "string", + "nullable": true, + "customConstraints": null, + "default_dart": null, + "default_client_dart": null, + "dsl_features": [] + } + ], + "is_virtual": false, + "without_rowid": false, + "constraints": [], + "explicit_pk": [ + "domain" + ] + } + }, + { + "id": 14, "references": [ 0 ], @@ -2014,6 +2061,15 @@ } ] }, + { + "name": "instances", + "sql": [ + { + "dialect": "sqlite", + "sql": "CREATE TABLE IF NOT EXISTS \"instances\" (\"domain\" TEXT NOT NULL, \"software\" TEXT NULL, \"version\" TEXT NULL, PRIMARY KEY (\"domain\"));" + } + ] + }, { "name": "account_unifiedpushToken", "sql": [ From dc6d2a384aec26b0af6155f7a643f7ad44416aaf Mon Sep 17 00:00:00 2001 From: olorin99 Date: Wed, 29 Apr 2026 15:39:02 +1000 Subject: [PATCH 5/9] Switch to static list of instances generated at build time rather than a dynamic list generated at runtime. Handle deeplinks. --- android/app/src/main/AndroidManifest.xml | 627 ++++++++++++++++++ lib/src/api/api.dart | 3 - lib/src/api/instance.dart | 47 -- lib/src/app.dart | 38 +- lib/src/controller/controller.dart | 24 +- lib/src/controller/database/database.dart | 17 - .../controller/database/database.steps.dart | 47 -- .../database/schemas/drift_schema_v3.json | 56 -- .../screens/settings/debug/debug_screen.dart | 25 - lib/src/utils/instances.dart | 621 +++++++++++++++++ lib/src/widgets/markdown/markdown.dart | 8 +- scripts/fetch_instances.sh | 48 ++ 12 files changed, 1338 insertions(+), 223 deletions(-) delete mode 100644 lib/src/api/instance.dart create mode 100644 lib/src/utils/instances.dart create mode 100755 scripts/fetch_instances.sh diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 2e8824fe..5a1fcc8d 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -24,6 +24,633 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/src/api/api.dart b/lib/src/api/api.dart index 28447f4d..90923e3b 100644 --- a/lib/src/api/api.dart +++ b/lib/src/api/api.dart @@ -6,7 +6,6 @@ import 'package:interstellar/src/api/community_moderation.dart'; import 'package:interstellar/src/api/domains.dart'; import 'package:interstellar/src/api/feed.dart'; import 'package:interstellar/src/api/images.dart'; -import 'package:interstellar/src/api/instance.dart'; import 'package:interstellar/src/api/messages.dart'; import 'package:interstellar/src/api/microblogs.dart'; import 'package:interstellar/src/api/moderation.dart'; @@ -26,7 +25,6 @@ class API { community = APICommunity(client), communityModeration = APICommunityModeration(client), feed = APIFeed(client), - instance = APIInstance(client), messages = APIMessages(client), moderation = APIModeration(client), notifications = APINotifications(client), @@ -44,7 +42,6 @@ class API { final APICommunity community; final APICommunityModeration communityModeration; final APIFeed feed; - final APIInstance instance; final APIMessages messages; final APIModeration moderation; final APINotifications notifications; diff --git a/lib/src/api/instance.dart b/lib/src/api/instance.dart deleted file mode 100644 index a419b619..00000000 --- a/lib/src/api/instance.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:interstellar/src/api/client.dart'; -import 'package:interstellar/src/controller/database/database.dart'; -import 'package:interstellar/src/controller/server.dart'; -import 'package:interstellar/src/utils/utils.dart'; - -class APIInstance { - APIInstance(this.client); - - final ServerClient client; - - Future> federated() async { - switch (client.software) { - case ServerSoftware.mbin: - const path = '/federated'; - final response = await client.get(path); - - final domains = (response.bodyJson['instances']! as List) - .map((instance) => Instance.fromJson(instance)) - .toList(); - return domains; - - case ServerSoftware.lemmy: - const path = '/federated_instances'; - - final response = await client.get(path); - - final domains = - ((response.bodyJson['federated_instances']! as JsonMap)['linked']! - as List) - .map((instance) => Instance.fromJson(instance)) - .toList(); - return domains; - - case ServerSoftware.piefed: - const path = '/federated_instances'; - - final response = await client.get(path); - - final domains = - ((response.bodyJson['federated_instances']! as JsonMap)['linked']! - as List) - .map((instance) => Instance.fromJson(instance)) - .toList(); - return domains; - } - } -} diff --git a/lib/src/app.dart b/lib/src/app.dart index 6188c714..c857dd27 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -1,12 +1,18 @@ import 'package:dynamic_color/dynamic_color.dart'; import 'package:flex_color_scheme/flex_color_scheme.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_localized_locales/flutter_localized_locales.dart'; import 'package:interstellar/l10n/app_localizations.dart'; import 'package:interstellar/src/controller/controller.dart'; import 'package:interstellar/src/controller/router.dart'; +import 'package:interstellar/src/models/comment.dart'; +import 'package:interstellar/src/models/community.dart'; +import 'package:interstellar/src/models/post.dart'; +import 'package:interstellar/src/models/user.dart'; import 'package:interstellar/src/screens/account/notification/notification_count_controller.dart'; import 'package:interstellar/src/utils/globals.dart'; +import 'package:interstellar/src/utils/instances.dart'; import 'package:interstellar/src/utils/utils.dart'; import 'package:intl/locale.dart' as intl_locale; import 'package:provider/provider.dart'; @@ -45,7 +51,37 @@ class App extends StatelessWidget { textScaler: TextScaler.linear(ac.profile.globalTextScale), ), child: MaterialApp.router( - routerConfig: router.config(), + routerConfig: router.config( + deepLinkTransformer: (link) async { + final knownInstance = knownInstances[link.host]; + if (knownInstance == null) return SynchronousFuture(link); + + // Ensure item is federated to current instance. + final item = await ac.api.search.resolveObject( + link.toString(), + ); + + // Construct interstellar compatible uri. + final newUri = switch (item) { + final PostModel p => Uri.parse( + '/${ac.instanceHost}/c/${p.community.name}/${p.type == PostType.thread ? 'thread' : 'microblog'}/${p.id}', + ), + final CommentModel c => Uri.parse( + '/${ac.instanceHost}/comment/${c.id}', + ), + final DetailedUserModel u => Uri.parse( + '/${ac.instanceHost}/u/${u.name}', + ), + final DetailedCommunityModel c => Uri.parse( + '/${ac.instanceHost}/c/${c.name}', + ), + Object() => link, + null => link, + }; + + return SynchronousFuture(newUri); + }, + ), restorationScopeId: 'app', localizationsDelegates: const [ ...AppLocalizations.localizationsDelegates, diff --git a/lib/src/controller/controller.dart b/lib/src/controller/controller.dart index e5708fcf..d7ecc05f 100644 --- a/lib/src/controller/controller.dart +++ b/lib/src/controller/controller.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'dart:io'; +import 'dart:math'; import 'package:auto_route/auto_route.dart'; import 'package:drift/drift.dart'; @@ -286,29 +287,10 @@ class AppController with ChangeNotifier { _defaultDownloadsDir = await getDefaultDownloadDir(); await _updateAPI(); - _cacheFederatedInstances(); logger.i('Finished init'); } - Future _cacheFederatedInstances() async { - final federatedDomains = await api.instance.federated(); - - await database.transaction(() async { - for (final instance in federatedDomains) { - await database - .into(database.instances) - .insertOnConflictUpdate(instance); - } - await database - .into(database.instances) - .insertOnConflictUpdate( - InstancesCompanion.insert(domain: instanceHost), - ); - }); - logger.i('Cached instances federated with $instanceHost'); - } - Future _rebuildProfile() async { _selectedProfileValue = await getProfile(_selectedProfile); @@ -495,7 +477,7 @@ class AppController with ChangeNotifier { }: username, 'password': password?.substring( 0, - software == ServerSoftware.lemmy ? 60 : 128, + min(password.length, software == ServerSoftware.lemmy ? 60 : 128), ), if (software == ServerSoftware.lemmy) 'totp_2fa_token': totp, }), @@ -615,7 +597,6 @@ class AppController with ChangeNotifier { } else { // The following is already done when switchAccounts is run, so only needed without switchAccounts. await _updateAPI(); - _cacheFederatedInstances(); notifyListeners(); } @@ -685,7 +666,6 @@ class AppController with ChangeNotifier { _selectedAccount = newAccount; await _updateAPI(); - _cacheFederatedInstances(); userMentionCache.clear(); communityMentionCache.clear(); diff --git a/lib/src/controller/database/database.dart b/lib/src/controller/database/database.dart index c1faba57..f5771fa5 100644 --- a/lib/src/controller/database/database.dart +++ b/lib/src/controller/database/database.dart @@ -441,15 +441,6 @@ class UserTags extends Table { Set> get primaryKey => {user, tagId}; } -class Instances extends Table { - TextColumn get domain => text()(); - TextColumn get software => text().nullable()(); - TextColumn get version => text().nullable()(); - - @override - Set> get primaryKey => {domain}; -} - @DriftDatabase( tables: [ Accounts, @@ -465,7 +456,6 @@ class Instances extends Table { Drafts, Tags, UserTags, - Instances, ], ) class InterstellarDatabase extends _$InterstellarDatabase { @@ -551,13 +541,6 @@ class InterstellarDatabase extends _$InterstellarDatabase { const ServersCompanion(oauthIdentifier: Value(null)), ); } - - Future knownInstance(String domain) async { - final instance = await (select( - instances, - )..where((f) => f.domain.equals(domain))).getSingleOrNull(); - return instance != null; - } } late InterstellarDatabase database; diff --git a/lib/src/controller/database/database.steps.dart b/lib/src/controller/database/database.steps.dart index 9b027bca..d7874ef3 100644 --- a/lib/src/controller/database/database.steps.dart +++ b/lib/src/controller/database/database.steps.dart @@ -1336,7 +1336,6 @@ final class Schema3 extends i0.VersionedSchema { drafts, tags, userTags, - instances, accountUnifiedpushToken, ]; late final Shape13 accounts = Shape13( @@ -1563,17 +1562,6 @@ final class Schema3 extends i0.VersionedSchema { ), alias: null, ); - late final Shape17 instances = Shape17( - source: i0.VersionedTable( - entityName: 'instances', - withoutRowId: false, - isStrict: false, - tableConstraints: ['PRIMARY KEY(domain)'], - columns: [_column_105, _column_106, _column_107], - attachedDatabase: database, - ), - alias: null, - ); final i1.Index accountUnifiedpushToken = i1.Index( 'account_unifiedpushToken', 'CREATE INDEX account_unifiedpushToken ON accounts (unifiedpush_token)', @@ -1833,41 +1821,6 @@ i1.GeneratedColumn _column_104(String aliasedName) => 'NOT NULL DEFAULT 0 CHECK (unifiedpush_distributor_ack IN (0, 1))', defaultValue: const i1.CustomExpression('0'), ); - -class Shape17 extends i0.VersionedTable { - Shape17({required super.source, required super.alias}) : super.aliased(); - i1.GeneratedColumn get domain => - columnsByName['domain']! as i1.GeneratedColumn; - i1.GeneratedColumn get software => - columnsByName['software']! as i1.GeneratedColumn; - i1.GeneratedColumn get version => - columnsByName['version']! as i1.GeneratedColumn; -} - -i1.GeneratedColumn _column_105(String aliasedName) => - i1.GeneratedColumn( - 'domain', - aliasedName, - false, - type: i1.DriftSqlType.string, - $customConstraints: 'NOT NULL', - ); -i1.GeneratedColumn _column_106(String aliasedName) => - i1.GeneratedColumn( - 'software', - aliasedName, - true, - type: i1.DriftSqlType.string, - $customConstraints: 'NULL', - ); -i1.GeneratedColumn _column_107(String aliasedName) => - i1.GeneratedColumn( - 'version', - aliasedName, - true, - type: i1.DriftSqlType.string, - $customConstraints: 'NULL', - ); i0.MigrationStepWithVersion migrationSteps({ required Future Function(i1.Migrator m, Schema2 schema) from1To2, required Future Function(i1.Migrator m, Schema3 schema) from2To3, diff --git a/lib/src/controller/database/schemas/drift_schema_v3.json b/lib/src/controller/database/schemas/drift_schema_v3.json index 1a68ba66..4fd6e260 100644 --- a/lib/src/controller/database/schemas/drift_schema_v3.json +++ b/lib/src/controller/database/schemas/drift_schema_v3.json @@ -1878,53 +1878,6 @@ }, { "id": 13, - "references": [], - "type": "table", - "data": { - "name": "instances", - "was_declared_in_moor": false, - "columns": [ - { - "name": "domain", - "getter_name": "domain", - "moor_type": "string", - "nullable": false, - "customConstraints": null, - "default_dart": null, - "default_client_dart": null, - "dsl_features": [] - }, - { - "name": "software", - "getter_name": "software", - "moor_type": "string", - "nullable": true, - "customConstraints": null, - "default_dart": null, - "default_client_dart": null, - "dsl_features": [] - }, - { - "name": "version", - "getter_name": "version", - "moor_type": "string", - "nullable": true, - "customConstraints": null, - "default_dart": null, - "default_client_dart": null, - "dsl_features": [] - } - ], - "is_virtual": false, - "without_rowid": false, - "constraints": [], - "explicit_pk": [ - "domain" - ] - } - }, - { - "id": 14, "references": [ 0 ], @@ -2061,15 +2014,6 @@ } ] }, - { - "name": "instances", - "sql": [ - { - "dialect": "sqlite", - "sql": "CREATE TABLE IF NOT EXISTS \"instances\" (\"domain\" TEXT NOT NULL, \"software\" TEXT NULL, \"version\" TEXT NULL, PRIMARY KEY (\"domain\"));" - } - ] - }, { "name": "account_unifiedpushToken", "sql": [ diff --git a/lib/src/screens/settings/debug/debug_screen.dart b/lib/src/screens/settings/debug/debug_screen.dart index 86c0850e..e5c83dd2 100644 --- a/lib/src/screens/settings/debug/debug_screen.dart +++ b/lib/src/screens/settings/debug/debug_screen.dart @@ -298,31 +298,6 @@ class DebugSettingsScreen extends StatelessWidget { ), ), ), - ListTile( - leading: const Icon(Symbols.device_hub_rounded), - title: Text(l(context).settings_debug_clearInstancesCache), - onTap: () => showDialog( - context: context, - builder: (context) => AlertDialog( - title: Text(l(context).settings_debug_clearInstancesCache), - actions: [ - OutlinedButton( - onPressed: () => context.router.pop(), - child: Text(l(context).cancel), - ), - FilledButton( - onPressed: () async { - await database.delete(database.instances).go(); - ac.logger.i('Cleared federated instances cache'); - if (!context.mounted) return; - context.router.pop(); - }, - child: Text(l(context).remove), - ), - ], - ), - ), - ), ListTile( leading: const Icon(Symbols.list_rounded), title: Text(l(context).settings_debug_log), diff --git a/lib/src/utils/instances.dart b/lib/src/utils/instances.dart new file mode 100644 index 00000000..1c91f65a --- /dev/null +++ b/lib/src/utils/instances.dart @@ -0,0 +1,621 @@ +import 'package:interstellar/src/controller/server.dart'; + +const Map knownInstances = { + 'agora.energieincomune.com': ServerSoftware.mbin, + 'bin.pivox.net': ServerSoftware.mbin, + 'fedia.io': ServerSoftware.mbin, + 'fedi.livi.fans': ServerSoftware.mbin, + 'ferment.site': ServerSoftware.mbin, + 'gehirneimer.de': ServerSoftware.mbin, + 'incremental.social': ServerSoftware.mbin, + 'kbin.earth': ServerSoftware.mbin, + 'kbin.melroy.org': ServerSoftware.mbin, + 'k.fe.derate.me': ServerSoftware.mbin, + 'mbin.cocopoops.com': ServerSoftware.mbin, + 'mbin.potato-guy.space': ServerSoftware.mbin, + 'mbin.xi.ht': ServerSoftware.mbin, + 'mbin.zerojay.com': ServerSoftware.mbin, + 'moist.catsweat.com': ServerSoftware.mbin, + 'rimworld.gallery': ServerSoftware.mbin, + 'socialnetworks.rodeo': ServerSoftware.mbin, + 'storhav.net': ServerSoftware.mbin, + 'thebrainbin.org': ServerSoftware.mbin, + + 'anarchist.nexus': ServerSoftware.piefed, + 'bookwyr.me': ServerSoftware.piefed, + 'cafe.coffee-break.cc': ServerSoftware.piefed, + 'cake.kobel.fyi': ServerSoftware.piefed, + 'crust.piefed.nullspace.lol': ServerSoftware.piefed, + 'crust.piefed.social': ServerSoftware.piefed, + 'das-eck.haus': ServerSoftware.piefed, + 'devel.silesia.social': ServerSoftware.piefed, + 'discuss.familie-will.at': ServerSoftware.piefed, + 'feddit.com': ServerSoftware.piefed, + 'feddit.fr': ServerSoftware.piefed, + 'feddit.mauve.haus': ServerSoftware.piefed, + 'feddit.online': ServerSoftware.piefed, + 'fedi.fsfans.club': ServerSoftware.piefed, + 'fedinsfw.app': ServerSoftware.piefed, + 'fedi.ur-mom.gay': ServerSoftware.piefed, + 'geostationary.orbiting.observer': ServerSoftware.piefed, + 'humansare.social': ServerSoftware.piefed, + 'hyper2.wandzeitung.xyz': ServerSoftware.piefed, + 'itsawonder.icu': ServerSoftware.piefed, + 'j4vcdedmiokf56h3ho4t62mlku.srv.us': ServerSoftware.piefed, + 'jolly-piefed.jomandoa.net': ServerSoftware.piefed, + 'kopitalk.net': ServerSoftware.piefed, + 'lonestarpiefed.duckdns.org': ServerSoftware.piefed, + 'multiverse.soulism.net': ServerSoftware.piefed, + 'news.erebion.eu': ServerSoftware.piefed, + 'news.heathenlab.net': ServerSoftware.piefed, + 'nord.pub': ServerSoftware.piefed, + 'nord.red': ServerSoftware.piefed, + 'ohpossum.ooo': ServerSoftware.piefed, + 'palaver.p3x.de': ServerSoftware.piefed, + 'peachpie.theatl.social': ServerSoftware.piefed, + 'pf.korako.me': ServerSoftware.piefed, + 'pie.dasneuland.de': ServerSoftware.piefed, + 'pie.eyeofthestorm.place': ServerSoftware.piefed, + 'piefed.0x0c.link': ServerSoftware.piefed, + 'piefed.alphapuggle.dev': ServerSoftware.piefed, + 'piefed.belgae.social': ServerSoftware.piefed, + 'piefed.blahaj.zone': ServerSoftware.piefed, + 'piefed.ca': ServerSoftware.piefed, + 'piefed.chrisco.me': ServerSoftware.piefed, + 'piefed.crash.cx': ServerSoftware.piefed, + 'piefed.dk': ServerSoftware.piefed, + 'piefed.doomprepper.com': ServerSoftware.piefed, + 'piefed.ee': ServerSoftware.piefed, + 'piefed.europe.pub': ServerSoftware.piefed, + 'piefed.fan': ServerSoftware.piefed, + 'piefed.foxden.party': ServerSoftware.piefed, + 'piefed.inwoodnexus.nyc': ServerSoftware.piefed, + 'piefed.iridescent.nz': ServerSoftware.piefed, + 'piefed.keyboardvagabond.com': ServerSoftware.piefed, + 'piefed.lerman-development.com': ServerSoftware.piefed, + 'piefed.malplena.net': ServerSoftware.piefed, + 'piefed.marud.fr': ServerSoftware.piefed, + 'piefed.monster': ServerSoftware.piefed, + 'piefed.muxika.org': ServerSoftware.piefed, + 'piefed.nullspace.lol': ServerSoftware.piefed, + 'piefed.ombreport.info': ServerSoftware.piefed, + 'piefed.sekretaerbaer.net': ServerSoftware.piefed, + 'piefed.socdojo.com': ServerSoftware.piefed, + 'piefed.social': ServerSoftware.piefed, + 'piefed.sysctl.io': ServerSoftware.piefed, + 'piefed.wjs018.xyz': ServerSoftware.piefed, + 'piefed.world': ServerSoftware.piefed, + 'piefed.zeromedia.vip': ServerSoftware.piefed, + 'piefeed.com': ServerSoftware.piefed, + 'px.pontual.social': ServerSoftware.piefed, + 'queer.irish': ServerSoftware.piefed, + 'quokk.au': ServerSoftware.piefed, + 'rentadrunk.org': ServerSoftware.piefed, + 'retrofed.com': ServerSoftware.piefed, + 'retro.piefed.com': ServerSoftware.piefed, + 'silesia.social': ServerSoftware.piefed, + 'social.doomprepper.com': ServerSoftware.piefed, + 'stable.wjs018.xyz': ServerSoftware.piefed, + 'tarte.nuage-libre.fr': ServerSoftware.piefed, + 'wetshav.ing': ServerSoftware.piefed, + 'wiresandlights.me': ServerSoftware.piefed, + + '0xdd.org.ru': ServerSoftware.lemmy, + 'academy.garden': ServerSoftware.lemmy, + 'adultswim.fan': ServerSoftware.lemmy, + 'aggregatet.org': ServerSoftware.lemmy, + 'alien.top': ServerSoftware.lemmy, + 'altgag.net': ServerSoftware.lemmy, + 'altmedia.house': ServerSoftware.lemmy, + 'ani.social': ServerSoftware.lemmy, + 'api-dev.rabotaem.app': ServerSoftware.lemmy, + 'ascy.mooo.com': ServerSoftware.lemmy, + 'awful.systems': ServerSoftware.lemmy, + 'badatbeing.social': ServerSoftware.lemmy, + 'baraza.africa': ServerSoftware.lemmy, + 'bdl.owu.one': ServerSoftware.lemmy, + 'beehaw.org': ServerSoftware.lemmy, + 'belgae.social': ServerSoftware.lemmy, + 'blendit.bsd.cafe': ServerSoftware.lemmy, + 'blockchained.world': ServerSoftware.lemmy, + 'bodli.mven.nl': ServerSoftware.lemmy, + 'bolha.forum': ServerSoftware.lemmy, + 'borg.chat': ServerSoftware.lemmy, + 'breakfast.haus': ServerSoftware.lemmy, + 'campfyre.nickwebster.dev': ServerSoftware.lemmy, + 'chachara.club': ServerSoftware.lemmy, + 'champserver.net': ServerSoftware.lemmy, + 'chinese.lol': ServerSoftware.lemmy, + 'civilloquy.com': ServerSoftware.lemmy, + 'collapse.cat': ServerSoftware.lemmy, + 'communick.news': ServerSoftware.lemmy, + 'corndog.social': ServerSoftware.lemmy, + 'crazypeople.online': ServerSoftware.lemmy, + 'dev.alien.cool': ServerSoftware.lemmy, + 'dev.lemmy.world': ServerSoftware.lemmy, + 'diggita.com': ServerSoftware.lemmy, + 'digipres.cafe': ServerSoftware.lemmy, + 'discover.deltanauten.de': ServerSoftware.lemmy, + 'discuss.aethelgard.space': ServerSoftware.lemmy, + 'discuss.hadan.social': ServerSoftware.lemmy, + 'discuss.icewind.me': ServerSoftware.lemmy, + 'discuss.jacen.moe': ServerSoftware.lemmy, + 'discuss.mschae23.de': ServerSoftware.lemmy, + 'discuss.tchncs.de': ServerSoftware.lemmy, + 'doomscroll.n8e.dev': ServerSoftware.lemmy, + 'downonthestreet.eu': ServerSoftware.lemmy, + 'dubvee.org': ServerSoftware.lemmy, + 'dullsters.net': ServerSoftware.lemmy, + 'enterprise.lemmy.ml': ServerSoftware.lemmy, + 'esc.ozar.dev': ServerSoftware.lemmy, + 'europe.pub': ServerSoftware.lemmy, + 'eventfrontier.com': ServerSoftware.lemmy, + 'eviltoast.org': ServerSoftware.lemmy, + 'expats.zone': ServerSoftware.lemmy, + 'fanaticus.social': ServerSoftware.lemmy, + 'fasheng.ing': ServerSoftware.lemmy, + 'feddit.bg': ServerSoftware.lemmy, + 'feddit.cl': ServerSoftware.lemmy, + 'feddit.dk': ServerSoftware.lemmy, + 'feddit.in': ServerSoftware.lemmy, + 'feddit.it': ServerSoftware.lemmy, + 'feddit.nl': ServerSoftware.lemmy, + 'feddit.nu': ServerSoftware.lemmy, + 'feddit.org': ServerSoftware.lemmy, + 'feddit.rocks': ServerSoftware.lemmy, + 'feddit.uk': ServerSoftware.lemmy, + 'feddit.world': ServerSoftware.lemmy, + 'fed.dyne.org': ServerSoftware.lemmy, + 'fedii.me': ServerSoftware.lemmy, + 'feditown.com': ServerSoftware.lemmy, + 'fenmou.cyou': ServerSoftware.lemmy, + 'fjdk.uk': ServerSoftware.lemmy, + 'foros.fediverso.gal': ServerSoftware.lemmy, + 'forum.ayom.media': ServerSoftware.lemmy, + 'forum.digitaleautonomie.org': ServerSoftware.lemmy, + 'forum.distorted-monkeys.com': ServerSoftware.lemmy, + 'forums.chippytea.uk': ServerSoftware.lemmy, + 'forums.rereading.space': ServerSoftware.lemmy, + 'forum.storstad.net': ServerSoftware.lemmy, + 'fosscad.io': ServerSoftware.lemmy, + 'fstab.sh': ServerSoftware.lemmy, + 'futurology.today': ServerSoftware.lemmy, + 'gearhead.town': ServerSoftware.lemmy, + 'gioia.news': ServerSoftware.lemmy, + 'gonzo.markets': ServerSoftware.lemmy, + 'go.ontomy.tv': ServerSoftware.lemmy, + 'gregtech.eu': ServerSoftware.lemmy, + 'group.lt': ServerSoftware.lemmy, + 'hackertalks.com': ServerSoftware.lemmy, + 'hackerz.world': ServerSoftware.lemmy, + 'hackingne.ws': ServerSoftware.lemmy, + 'halubilo.social': ServerSoftware.lemmy, + 'happysl.app': ServerSoftware.lemmy, + 'hardpass.lol': ServerSoftware.lemmy, + 'hardware.watch': ServerSoftware.lemmy, + 'healthy.community': ServerSoftware.lemmy, + 'helpos.ca': ServerSoftware.lemmy, + 'hexbear.net': ServerSoftware.lemmy, + 'hilariouschaos.com': ServerSoftware.lemmy, + 'hobbit.world': ServerSoftware.lemmy, + 'hoihoi.superboi.eu.org': ServerSoftware.lemmy, + 'indiehackers.space': ServerSoftware.lemmy, + 'indie-ver.se': ServerSoftware.lemmy, + 'info.prou.be': ServerSoftware.lemmy, + 'infosec.pub': ServerSoftware.lemmy, + 'jlai.lu': ServerSoftware.lemmy, + 'kakera.kintsugi.moe': ServerSoftware.lemmy, + 'kbin.thicknahalf.com': ServerSoftware.lemmy, + 'kitty.ly': ServerSoftware.lemmy, + 'kongkow.web.id': ServerSoftware.lemmy, + 'kutsuya.dev': ServerSoftware.lemmy, + 'kuu.kohana.fi': ServerSoftware.lemmy, + 'kyu.de': ServerSoftware.lemmy, + 'lazysoci.al': ServerSoftware.lemmy, + 'leaf.dance': ServerSoftware.lemmy, + 'lef.li': ServerSoftware.lemmy, + 'lem.afiz.org': ServerSoftware.lemmy, + 'lem.cochrun.xyz': ServerSoftware.lemmy, + 'lemdro.id': ServerSoftware.lemmy, + 'lem.free.as': ServerSoftware.lemmy, + 'leminal.space': ServerSoftware.lemmy, + 'lemming.megumin.org': ServerSoftware.lemmy, + 'lemmings.world': ServerSoftware.lemmy, + 'lemmit.nyc.what.if.ua': ServerSoftware.lemmy, + 'lemmit.online': ServerSoftware.lemmy, + 'lemmus.org': ServerSoftware.lemmy, + 'lemmy.0upti.me': ServerSoftware.lemmy, + 'lemmy.100010101.xyz': ServerSoftware.lemmy, + 'lemmy.14042003.xyz': ServerSoftware.lemmy, + 'lemmy.30p87.de': ServerSoftware.lemmy, + 'lemmy.411426.xyz': ServerSoftware.lemmy, + 'lemmy.4d2.org': ServerSoftware.lemmy, + 'lemmy.86thumbs.net': ServerSoftware.lemmy, + 'lemmy.8bitar.io': ServerSoftware.lemmy, + 'lemmy.8th.world': ServerSoftware.lemmy, + 'lemmy.963.pm': ServerSoftware.lemmy, + 'lemmy.absolutesix.com': ServerSoftware.lemmy, + 'lemmy.activitypub.academy': ServerSoftware.lemmy, + 'lemmy.ahall.se': ServerSoftware.lemmy, + 'lemmy.almostadatacenter.social': ServerSoftware.lemmy, + 'lemmy.amethyst.name': ServerSoftware.lemmy, + 'lemmy.amxl.com': ServerSoftware.lemmy, + 'lemmy.ananace.dev': ServerSoftware.lemmy, + 'lemmy.ansico.dk': ServerSoftware.lemmy, + 'lemmy-api.ten4ward.social': ServerSoftware.lemmy, + 'lemmy.asc6.org': ServerSoftware.lemmy, + 'lemmy.asudox.dev': ServerSoftware.lemmy, + 'lemmy.az.social': ServerSoftware.lemmy, + 'lemmy.baie.me': ServerSoftware.lemmy, + 'lemmy.beagle.quest': ServerSoftware.lemmy, + 'lemmy.belegost.net': ServerSoftware.lemmy, + 'lemmy.beru.co': ServerSoftware.lemmy, + 'lemmy.bestiver.se': ServerSoftware.lemmy, + 'lemmy.billiam.net': ServerSoftware.lemmy, + 'lemmy.bitflipd.com': ServerSoftware.lemmy, + 'lemmy.blackeco.com': ServerSoftware.lemmy, + 'lemmy.blahaj.zone': ServerSoftware.lemmy, + 'lemmy.bleh.au': ServerSoftware.lemmy, + 'lemmy.blehiscool.com': ServerSoftware.lemmy, + 'lemmy.blueberryicetea.com': ServerSoftware.lemmy, + 'lemmy.bmck.au': ServerSoftware.lemmy, + 'lemmy.bosio.info': ServerSoftware.lemmy, + 'lemmy.bouniet.top': ServerSoftware.lemmy, + 'lemmy.brandslisten.com': ServerSoftware.lemmy, + 'lemmy.brandyapple.com': ServerSoftware.lemmy, + 'lemmy.brdsnest.net': ServerSoftware.lemmy, + 'lemmy.brief.guru': ServerSoftware.lemmy, + 'lemmy.browntown.dev': ServerSoftware.lemmy, + 'lemmy.ca': ServerSoftware.lemmy, + 'lemmy.cafe': ServerSoftware.lemmy, + 'lemmy.caliban.io': ServerSoftware.lemmy, + 'lemmy.canthonyscott.io': ServerSoftware.lemmy, + 'lemmy.ch3n2k.com': ServerSoftware.lemmy, + 'lemmychan.org': ServerSoftware.lemmy, + 'lemmy.circenn.win': ServerSoftware.lemmy, + 'lemmy.civl.cc': ServerSoftware.lemmy, + 'lemmy.coupou.fr': ServerSoftware.lemmy, + 'lemmy.cringecollective.io': ServerSoftware.lemmy, + 'lemmy.criticalbasics.xyz': ServerSoftware.lemmy, + 'lemmy.croc.pw': ServerSoftware.lemmy, + 'lemmy.cronyakatsuki.xyz': ServerSoftware.lemmy, + 'lemmy.cryonex.net': ServerSoftware.lemmy, + 'lemmy.ctrlq.dev': ServerSoftware.lemmy, + 'lemmy.cultimean.group': ServerSoftware.lemmy, + 'lemmy.curiana.net': ServerSoftware.lemmy, + 'lemmy.cyberia9.org': ServerSoftware.lemmy, + 'lemmy.darkc0de.one': ServerSoftware.lemmy, + 'lemmy.dbzer0.com': ServerSoftware.lemmy, + 'lemmy.deadca.de': ServerSoftware.lemmy, + 'lemmy.decronym.xyz': ServerSoftware.lemmy, + 'lemmy.deedium.nl': ServerSoftware.lemmy, + 'lemmy.devr.cc': ServerSoftware.lemmy, + 'lemmy.digitalcharon.in': ServerSoftware.lemmy, + 'lemmy.digitalfall.net': ServerSoftware.lemmy, + 'lemmy.dorfrollenspiel.de': ServerSoftware.lemmy, + 'lemmy.draktis.com': ServerSoftware.lemmy, + 'lemmy.duckpond.social': ServerSoftware.lemmy, + 'lemmy.durstig.online': ServerSoftware.lemmy, + 'lemmy.eco.br': ServerSoftware.lemmy, + 'lemmy.eirides.net': ServerSoftware.lemmy, + 'lemmy.eknz.org': ServerSoftware.lemmy, + 'lemmy.electricmonk.io': ServerSoftware.lemmy, + 'lemmy.encryptionin.space': ServerSoftware.lemmy, + 'lemmy.esquiretheduke.nohost.me': ServerSoftware.lemmy, + 'lemmy.eus': ServerSoftware.lemmy, + 'lemmy.evangineer.net': ServerSoftware.lemmy, + 'lemmy.fait.ch': ServerSoftware.lemmy, + 'lemmy.federate.cc': ServerSoftware.lemmy, + 'lemmy.federate.lol': ServerSoftware.lemmy, + 'lemmy.fedifriends.social': ServerSoftware.lemmy, + 'lemmy.fedioasis.cc': ServerSoftware.lemmy, + 'lemmy.fediverse.jp': ServerSoftware.lemmy, + 'lemmy.fedi.zutto.fi': ServerSoftware.lemmy, + 'lemmy.fiftyfifty.one': ServerSoftware.lemmy, + 'lemmy.freewilltiger.page': ServerSoftware.lemmy, + 'lemmy.fromshado.ws': ServerSoftware.lemmy, + 'lemmy.frozeninferno.xyz': ServerSoftware.lemmy, + 'lemmy.funami.tech': ServerSoftware.lemmy, + 'lemmy.gf4.pw': ServerSoftware.lemmy, + 'lemmy.glasgow.social': ServerSoftware.lemmy, + 'lemmy.glue.io': ServerSoftware.lemmy, + 'lemmygrad.ml': ServerSoftware.lemmy, + 'lemmy.grey.fail': ServerSoftware.lemmy, + 'lemmy.grey.ooo': ServerSoftware.lemmy, + 'lemmy.grys.it': ServerSoftware.lemmy, + 'lemmy.halfbro.xyz': ServerSoftware.lemmy, + 'lemmy.halis.io': ServerSoftware.lemmy, + 'lemmy.hangdaan.com': ServerSoftware.lemmy, + 'lemmy.hawkinsfamily.com.au': ServerSoftware.lemmy, + 'lemmy.helios42.de': ServerSoftware.lemmy, + 'lemmy.helvetet.eu': ServerSoftware.lemmy, + 'lemmy.hogru.ch': ServerSoftware.lemmy, + 'lemmy.horwood.cloud': ServerSoftware.lemmy, + 'lemmy.hostux.net': ServerSoftware.lemmy, + 'lemmy.igl.ooo': ServerSoftware.lemmy, + 'lemmy.imagisphe.re': ServerSoftware.lemmy, + 'lemmy.inbutts.lol': ServerSoftware.lemmy, + 'lemmyis.fun': ServerSoftware.lemmy, + 'lemmy.jacaranda.club': ServerSoftware.lemmy, + 'lemmy.jann.dev': ServerSoftware.lemmy, + 'lemmy.jaypg.pw': ServerSoftware.lemmy, + 'lemmy.jelliefrontier.net': ServerSoftware.lemmy, + 'lemmy.jhjacobs.nl': ServerSoftware.lemmy, + 'lemmy.johnnei.org': ServerSoftware.lemmy, + 'lemmy.johnsonsystems.org': ServerSoftware.lemmy, + 'lemmy.k2pk.com': ServerSoftware.lemmy, + 'lemmy.karolwos.com': ServerSoftware.lemmy, + 'lemmy.kde.social': ServerSoftware.lemmy, + 'lemmy.keimai.space': ServerSoftware.lemmy, + 'lemmy.keniir.wtf': ServerSoftware.lemmy, + 'lemmy.kfed.org': ServerSoftware.lemmy, + 'lemmy.klein.ruhr': ServerSoftware.lemmy, + 'lemmy.kmoneyserver.com': ServerSoftware.lemmy, + 'lemmy.ktegl.es': ServerSoftware.lemmy, + 'lemmy.kzkr.xyz': ServerSoftware.lemmy, + 'lemmy.labfox.fr': ServerSoftware.lemmy, + 'lemmy.lacasabien.space': ServerSoftware.lemmy, + 'lemmy.lama-corp.space': ServerSoftware.lemmy, + 'lemmyland.com': ServerSoftware.lemmy, + 'lemmy.lantian.pub': ServerSoftware.lemmy, + 'lemmy.libertarianfellowship.org': ServerSoftware.lemmy, + 'lemmy.lidstah.info': ServerSoftware.lemmy, + 'lemmy.liebeleu.de': ServerSoftware.lemmy, + 'lemmy.linden.social': ServerSoftware.lemmy, + 'lemmylink.com': ServerSoftware.lemmy, + 'lemmy.linuxuserspace.show': ServerSoftware.lemmy, + 'lemmy.lobzhomelab.online': ServerSoftware.lemmy, + 'lemmy.lqx.net': ServerSoftware.lemmy, + 'lemmy.lt': ServerSoftware.lemmy, + 'lemmy.lundgrensjostrom.com': ServerSoftware.lemmy, + 'lemmy.lupiverse.com': ServerSoftware.lemmy, + 'lemmy.lynas.ca': ServerSoftware.lemmy, + 'lemmy.maechler.cloud': ServerSoftware.lemmy, + 'lemmy.makearmy.io': ServerSoftware.lemmy, + 'lemmy.manganiello.tech': ServerSoftware.lemmy, + 'lemmy.mariusdavid.fr': ServerSoftware.lemmy, + 'lemmy.masto.community': ServerSoftware.lemmy, + 'lemmy.mats.ooo': ServerSoftware.lemmy, + 'lemmy.maxynetwork.it': ServerSoftware.lemmy, + 'lemmy.mayer.rocks': ServerSoftware.lemmy, + 'lemmy.mbl.social': ServerSoftware.lemmy, + 'lemmy.mebitek.com': ServerSoftware.lemmy, + 'lemmy.meissners.me': ServerSoftware.lemmy, + 'lemmy.mengsk.org': ServerSoftware.lemmy, + 'lemmy.mesnumeriques.fr': ServerSoftware.lemmy, + 'lemmy.michaelsasser.org': ServerSoftware.lemmy, + 'lemmy.minecloud.ro': ServerSoftware.lemmy, + 'lemmy.minigubben.se': ServerSoftware.lemmy, + 'lemmy.mio19.uk': ServerSoftware.lemmy, + 'lemmy.mistyreverie.org': ServerSoftware.lemmy, + 'lemmy.mixdown.ca': ServerSoftware.lemmy, + 'lemmy.ml': ServerSoftware.lemmy, + 'lemmy.mods4ever.com': ServerSoftware.lemmy, + 'lemmy.monster': ServerSoftware.lemmy, + 'lemmy.moocloud.party': ServerSoftware.lemmy, + 'lemmy.moonling.nl': ServerSoftware.lemmy, + 'lemmy.mrm.one': ServerSoftware.lemmy, + 'lemmy.mrpostman.ch': ServerSoftware.lemmy, + 'lemmy.muffalings.com': ServerSoftware.lemmy, + 'lemmy.my-box.dev': ServerSoftware.lemmy, + 'lemmy.myjhdiy.net': ServerSoftware.lemmy, + 'lemmynal.space': ServerSoftware.lemmy, + 'lemmy.nekusoul.de': ServerSoftware.lemmy, + 'lemmy.neondystopia.world': ServerSoftware.lemmy, + 'lemmy.nerdland.xyz': ServerSoftware.lemmy, + 'lemmy.net.au': ServerSoftware.lemmy, + 'lemmy.nexus': ServerSoftware.lemmy, + 'lemmy.nocturnal.garden': ServerSoftware.lemmy, + 'lemmy.nope.ly': ServerSoftware.lemmy, + 'lemmy.norbipeti.eu': ServerSoftware.lemmy, + 'lemmy.notclickable.com': ServerSoftware.lemmy, + 'lemmy.nothavingthis.co.uk': ServerSoftware.lemmy, + 'lemmy.nrdblg.de': ServerSoftware.lemmy, + 'lemmynsfw.com': ServerSoftware.lemmy, + 'lemmy.nube-gran.de': ServerSoftware.lemmy, + 'lemmy.nz': ServerSoftware.lemmy, + 'lemmy.obrell.se': ServerSoftware.lemmy, + 'lemmy.obscuro.be': ServerSoftware.lemmy, + 'lemmy.ohaa.xyz': ServerSoftware.lemmy, + 'lemmyoh.io': ServerSoftware.lemmy, + 'lemmy.okr765.com': ServerSoftware.lemmy, + 'lemmy.one': ServerSoftware.lemmy, + 'lemmy.onlylans.io': ServerSoftware.lemmy, + 'lemmy.parodia.dev': ServerSoftware.lemmy, + 'lemmy.paulstevens.org': ServerSoftware.lemmy, + 'lemmy.piracy.social': ServerSoftware.lemmy, + 'lemmy.pixelpassport.studio': ServerSoftware.lemmy, + 'lemmy.poudlar.do': ServerSoftware.lemmy, + 'lemmy.pt': ServerSoftware.lemmy, + 'lemmy.radio': ServerSoftware.lemmy, + 'lemmy.razbot.xyz': ServerSoftware.lemmy, + 'lemmy.rhymelikedi.me': ServerSoftware.lemmy, + 'lemmy.rmict.nl': ServerSoftware.lemmy, + 'lemmy.rochegmr.com': ServerSoftware.lemmy, + 'lemmy.runesmite.com': ServerSoftware.lemmy, + 'lemmy.sal.web.tr': ServerSoftware.lemmy, + 'lemmy.scam-mail.me': ServerSoftware.lemmy, + 'lemmy.science.social': ServerSoftware.lemmy, + 'lemmy.secnd.me': ServerSoftware.lemmy, + 'lemmy.securitycafe.ca': ServerSoftware.lemmy, + 'lemmy.self-hosted.site': ServerSoftware.lemmy, + 'lemmy.selina.diy': ServerSoftware.lemmy, + 'lemmy.services.coupou.fr': ServerSoftware.lemmy, + 'lemmy.sgfault.com': ServerSoftware.lemmy, + 'lemmy.shiny-task.com': ServerSoftware.lemmy, + 'lemmy.sietch.online': ServerSoftware.lemmy, + 'lemmy.skoops.social': ServerSoftware.lemmy, + 'lemmy.skyjake.fi': ServerSoftware.lemmy, + 'lemmy.snoot.tube': ServerSoftware.lemmy, + 'lemmy.snowgoons.ro': ServerSoftware.lemmy, + 'lemmy.spaceships.me': ServerSoftware.lemmy, + 'lemmy.ssba.com': ServerSoftware.lemmy, + 'lemmy.staphup.nl': ServerSoftware.lemmy, + 'lemmy.starbase80.dev': ServerSoftware.lemmy, + 'lemmy.starlightkel.xyz': ServerSoftware.lemmy, + 'lemmy.stefanoprenna.com': ServerSoftware.lemmy, + 'lemmy.strausfuenf.de': ServerSoftware.lemmy, + 'lemmy.stuart.fun': ServerSoftware.lemmy, + 'lemmy.technowizardry.net': ServerSoftware.lemmy, + 'lemmy.tevtra.com': ServerSoftware.lemmy, + 'lemmy.tgxn.net': ServerSoftware.lemmy, + 'lemmy.thefloatinglab.world': ServerSoftware.lemmy, + 'lemmy.thewooskeys.com': ServerSoftware.lemmy, + 'lemmy.tobyvin.dev': ServerSoftware.lemmy, + 'lemmy.today': ServerSoftware.lemmy, + 'lemmy.tomateaux.com': ServerSoftware.lemmy, + 'lemmy.tomkoreny.com': ServerSoftware.lemmy, + 'lemmy.t-rg.ws': ServerSoftware.lemmy, + 'lemmy.tserts.com': ServerSoftware.lemmy, + 'lemmy.ubergeek77.chat': ServerSoftware.lemmy, + 'lemmy.uhhoh.com': ServerSoftware.lemmy, + 'lemmy.umucat.day': ServerSoftware.lemmy, + 'lemmy.unboiled.info': ServerSoftware.lemmy, + 'lemmy.uninsane.org': ServerSoftware.lemmy, + 'lemmy.unryzer.eu': ServerSoftware.lemmy, + 'lemmy.vg': ServerSoftware.lemmy, + 'lemmy.vigenere.nl': ServerSoftware.lemmy, + 'lemmy.wejustgame.org': ServerSoftware.lemmy, + 'lemmy.world': ServerSoftware.lemmy, + 'lemmy.wtf': ServerSoftware.lemmy, + 'lemmy.xeviousx.eu': ServerSoftware.lemmy, + 'lemmy.xoynq.com': ServerSoftware.lemmy, + 'lemmy.zhukov.al': ServerSoftware.lemmy, + 'lemmy.zip': ServerSoftware.lemmy, + 'lemmy.zwanenburg.info': ServerSoftware.lemmy, + 'lem.ph3j.com': ServerSoftware.lemmy, + 'lem.serkozh.me': ServerSoftware.lemmy, + 'lem.trashbrain.org': ServerSoftware.lemmy, + 'lem.ugh.im': ServerSoftware.lemmy, + 'lemy.lol': ServerSoftware.lemmy, + 'lemy.nl': ServerSoftware.lemmy, + 'le.poxiao-labs.work': ServerSoftware.lemmy, + 'level-up.zone': ServerSoftware.lemmy, + 'l.hostux.net': ServerSoftware.lemmy, + 'libretechni.ca': ServerSoftware.lemmy, + 'links.communitarium.org': ServerSoftware.lemmy, + 'links.gayfr.online': ServerSoftware.lemmy, + 'links.nadia.moe': ServerSoftware.lemmy, + 'links.openriver.net': ServerSoftware.lemmy, + 'linz.city': ServerSoftware.lemmy, + 'literature.cafe': ServerSoftware.lemmy, + 'l.mathers.fr': ServerSoftware.lemmy, + 'lm.boing.icu': ServerSoftware.lemmy, + 'l.mchome.net': ServerSoftware.lemmy, + 'lm.inu.is': ServerSoftware.lemmy, + 'lmm.azrak.io': ServerSoftware.lemmy, + 'lm.mlfh.org': ServerSoftware.lemmy, + 'lm.preferlinux.de': ServerSoftware.lemmy, + 'lm.theorionserver.com': ServerSoftware.lemmy, + 'lmy.ndu.wtf': ServerSoftware.lemmy, + 'lmy.sagf.io': ServerSoftware.lemmy, + 'l.posterdati.it': ServerSoftware.lemmy, + 'l.roofo.cc': ServerSoftware.lemmy, + 'lsmu.schmurian.xyz': ServerSoftware.lemmy, + 'l.sw0.com': ServerSoftware.lemmy, + 'lt.harding.dev': ServerSoftware.lemmy, + 'l.tta.wtf': ServerSoftware.lemmy, + 'l.twipped.social': ServerSoftware.lemmy, + 'lu.skbo.net': ServerSoftware.lemmy, + 'maga.place': ServerSoftware.lemmy, + 'making.awful.systems': ServerSoftware.lemmy, + 'mander.xyz': ServerSoftware.lemmy, + 'maple.social': ServerSoftware.lemmy, + 'martinlm.mypi.co': ServerSoftware.lemmy, + 'matchpoint.zone': ServerSoftware.lemmy, + 'metacritics.zone': ServerSoftware.lemmy, + 'midwest.social': ServerSoftware.lemmy, + 'mimiclem.me': ServerSoftware.lemmy, + 'monero.town': ServerSoftware.lemmy, + 'monero.you': ServerSoftware.lemmy, + 'monyet.cc': ServerSoftware.lemmy, + 'mouse.chitanda.moe': ServerSoftware.lemmy, + 'mujico.org': ServerSoftware.lemmy, + 'natur.23.nu': ServerSoftware.lemmy, + 'nba.space': ServerSoftware.lemmy, + 'news.abolish.capital': ServerSoftware.lemmy, + 'news.girolab.foo': ServerSoftware.lemmy, + 'news.idlestate.org': ServerSoftware.lemmy, + 'nfl.community': ServerSoftware.lemmy, + 'nodesphere.site': ServerSoftware.lemmy, + 'no.lastname.nz': ServerSoftware.lemmy, + 'notizie.bida.im': ServerSoftware.lemmy, + 'odin.lanofthedead.xyz': ServerSoftware.lemmy, + 'okaythen.lol': ServerSoftware.lemmy, + 'olla.cat': ServerSoftware.lemmy, + 'orcas.enjoying.yachts': ServerSoftware.lemmy, + 'overctrl.dbzer0.com': ServerSoftware.lemmy, + 'parenti.sh': ServerSoftware.lemmy, + 'party.lumanesence.co.uk': ServerSoftware.lemmy, + 'pawb.social': ServerSoftware.lemmy, + 'philosophy.cafe': ServerSoftware.lemmy, + 'poptalk.scrubbles.tech': ServerSoftware.lemmy, + 'poweruser.forum': ServerSoftware.lemmy, + 'programming.dev': ServerSoftware.lemmy, + 'providence.root.sx': ServerSoftware.lemmy, + 'r3dnvmbr.xyz': ServerSoftware.lemmy, + 'rblind.com': ServerSoftware.lemmy, + 'realbitcoin.cash': ServerSoftware.lemmy, + 'reddeet.com': ServerSoftware.lemmy, + 'reddit.kokomo.cloud': ServerSoftware.lemmy, + 'reddthat.com': ServerSoftware.lemmy, + 'rekabu.ru': ServerSoftware.lemmy, + 'retrolemmy.com': ServerSoftware.lemmy, + 'riskeratspizza.com': ServerSoftware.lemmy, + 'r.nf': ServerSoftware.lemmy, + 'roanoke.social': ServerSoftware.lemmy, + 'rollenspiel.forum': ServerSoftware.lemmy, + 'sammich.es': ServerSoftware.lemmy, + 'sappho.social': ServerSoftware.lemmy, + 'scribe.disroot.org': ServerSoftware.lemmy, + 'selfhosted.forum': ServerSoftware.lemmy, + 'sfw.community': ServerSoftware.lemmy, + 'sha1.nl': ServerSoftware.lemmy, + 'sh.itjust.works': ServerSoftware.lemmy, + 'slangenettet.pyjam.as': ServerSoftware.lemmy, + 'slevin.horse': ServerSoftware.lemmy, + 'slrpnk.net': ServerSoftware.lemmy, + 'soccer.forum': ServerSoftware.lemmy, + 'social.donondo.com': ServerSoftware.lemmy, + 'social.ggbox.fr': ServerSoftware.lemmy, + 'social.jears.at': ServerSoftware.lemmy, + 'social.nerdhouse.io': ServerSoftware.lemmy, + 'social.p80.se': ServerSoftware.lemmy, + 'social.sour.is': ServerSoftware.lemmy, + 'sopuli.xyz': ServerSoftware.lemmy, + 'spare.botegirl.parts': ServerSoftware.lemmy, + 'spgrn.com': ServerSoftware.lemmy, + 'startrek.website': ServerSoftware.lemmy, + 'style.land': ServerSoftware.lemmy, + 'sub.community': ServerSoftware.lemmy, + 'sublem.com': ServerSoftware.lemmy, + 'sub.wetshaving.social': ServerSoftware.lemmy, + 'supernova.place': ServerSoftware.lemmy, + 'suppo.fi': ServerSoftware.lemmy, + 'swg-empire.de': ServerSoftware.lemmy, + 'szmer.info': ServerSoftware.lemmy, + 'tabi.gay': ServerSoftware.lemmy, + 'tech.pr0n.pl': ServerSoftware.lemmy, + 'test2.lealternative.net': ServerSoftware.lemmy, + 'thelemmy.club': ServerSoftware.lemmy, + 'thinktank.brainstormes.org': ServerSoftware.lemmy, + 'tiann.plk.tw': ServerSoftware.lemmy, + 'timeperiods.fr': ServerSoftware.lemmy, + 'timesink.p3nguin.org': ServerSoftware.lemmy, + 'tkohhh.social': ServerSoftware.lemmy, + 'toast.ooo': ServerSoftware.lemmy, + 'ttrpg.network': ServerSoftware.lemmy, + 'tucson.social': ServerSoftware.lemmy, + 'ukfli.uk': ServerSoftware.lemmy, + 'unreachable.cloud': ServerSoftware.lemmy, + 'upvote.au': ServerSoftware.lemmy, + 'vargar.org': ServerSoftware.lemmy, + 'vger.social': ServerSoftware.lemmy, + 'viewfinder.pro': ServerSoftware.lemmy, + 'voyager.lemmy.ml': ServerSoftware.lemmy, + 'whatcom.social': ServerSoftware.lemmy, + 'wired.bluemarch.art': ServerSoftware.lemmy, + 'x69.org': ServerSoftware.lemmy, + 'yall.theatl.social': ServerSoftware.lemmy, + 'zegheteens.nl': ServerSoftware.lemmy, +}; diff --git a/lib/src/widgets/markdown/markdown.dart b/lib/src/widgets/markdown/markdown.dart index 3235f660..52651afa 100644 --- a/lib/src/widgets/markdown/markdown.dart +++ b/lib/src/widgets/markdown/markdown.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart' as mdf; -import 'package:interstellar/src/controller/database/database.dart'; import 'package:interstellar/src/models/image.dart'; import 'package:interstellar/src/utils/ap_urls.dart'; import 'package:interstellar/src/widgets/image.dart'; @@ -11,6 +10,7 @@ import 'package:interstellar/src/widgets/markdown/markdown_subscript_superscript import 'package:interstellar/src/widgets/markdown/markdown_video.dart'; import 'package:interstellar/src/widgets/open_webpage.dart'; import 'package:interstellar/src/widgets/video.dart'; +import 'package:interstellar/src/utils/instances.dart'; class Markdown extends StatelessWidget { const Markdown( @@ -43,11 +43,9 @@ class Markdown extends StatelessWidget { ), onTapLink: (text, href, title) async { if (href != null) { - final isKnownInstance = await database.knownInstance( - Uri.parse(href).host, - ); + final isKnownInstance = knownInstances[Uri.parse(href).host]; if (!context.mounted) return; - if (isKnownInstance) { + if (isKnownInstance != null) { if (await navigateApObject(context, href)) return; } if (!context.mounted) return; diff --git a/scripts/fetch_instances.sh b/scripts/fetch_instances.sh new file mode 100755 index 00000000..fa778b0c --- /dev/null +++ b/scripts/fetch_instances.sh @@ -0,0 +1,48 @@ +#!/bin/sh + +# Copied from https://github.com/thunder-app/thunder/blob/develop/.github/workflows/instances.yml + +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"lemmy\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > lemmy_instances.txt +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"piefed\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > piefed_instances.txt +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mbin\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > mbin_instances.txt + +# Theres a lot more mastodon instances so only include those with certain active user count. +#curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mastodon\") {domain active_users_monthly}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | select(.active_users_monthly > 100) | .domain' | sort | uniq -i > mastodon_instances.txt + +cat lemmy_instances.txt piefed_instances.txt mbin_instances.txt | sort | uniq -i > instances.txt + +cat << EOF > lib/src/utils/instances.dart +import 'package:interstellar/src/controller/server.dart'; +const Map knownInstances = { +$(awk '{ print " \047"$0"\047: ServerSoftware.mbin," }' mbin_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.piefed," }' piefed_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.lemmy," }' lemmy_instances.txt) +}; +EOF + +# Put the instances in the Android manifest file +manifestInstances="$(awk '{ print " " }' instances.txt)" +inSection=false +while IFS= read -r line; do + if [[ $line == *"#AUTO_GEN_INSTANCE_LIST_DO_NOT_TOUCH#"* ]]; then + inSection=true + fi + + if [[ $line == *"#INSTANCE_LIST_END#"* ]]; then + echo "$manifestInstances" >> android/app/src/main/AndroidManifest-new.xml + inSection=false + fi + + if [[ $line == *"android:host"* ]]; then + if [ "$inSection" = true ]; then + continue + fi + fi + + echo "$line" >> android/app/src/main/AndroidManifest-new.xml +done < android/app/src/main/AndroidManifest.xml +mv android/app/src/main/AndroidManifest-new.xml android/app/src/main/AndroidManifest.xml + +rm instances.txt lemmy_instances.txt piefed_instances.txt mbin_instances.txt \ No newline at end of file From 9851dc983706c8dc966140ad211b0464317bed9c Mon Sep 17 00:00:00 2001 From: olorin99 Date: Mon, 18 May 2026 23:15:04 +1000 Subject: [PATCH 6/9] Show snackbar on failed deeplink. --- lib/src/app.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/src/app.dart b/lib/src/app.dart index c857dd27..40ed97fc 100644 --- a/lib/src/app.dart +++ b/lib/src/app.dart @@ -61,6 +61,15 @@ class App extends StatelessWidget { link.toString(), ); + if (item == null) { + scaffoldMessengerKey.currentState?.showSnackBar( + const SnackBar( + content: Text('Failed to open link.'), + showCloseIcon: true, + ), + ); + } + // Construct interstellar compatible uri. final newUri = switch (item) { final PostModel p => Uri.parse( From 1681a844f9cf12298deacfbeb2c0c89a880e43b9 Mon Sep 17 00:00:00 2001 From: olorin99 Date: Wed, 24 Jun 2026 13:15:00 +1000 Subject: [PATCH 7/9] Update search on mbin to use v2 endpoint. --- lib/src/api/search.dart | 34 ++++--------------- lib/src/models/search.dart | 69 +++++++++++++++++++++++++------------- 2 files changed, 53 insertions(+), 50 deletions(-) diff --git a/lib/src/api/search.dart b/lib/src/api/search.dart index 832c9b4c..2ed6651f 100644 --- a/lib/src/api/search.dart +++ b/lib/src/api/search.dart @@ -24,7 +24,7 @@ class APISearch { }) async { switch (client.software) { case ServerSoftware.mbin: - const path = '/search'; + const path = '/search/v2'; final response = await client.get( path, @@ -110,35 +110,15 @@ class APISearch { try { switch (client.software) { case ServerSoftware.mbin: - // using the search api here kinda works but is slow and throws 500 errors occasionally - - const path = '/search'; + const path = '/search/v2'; - final response = await client.get(path, queryParams: {'q': search}); + final response = await client.get( + path, + queryParams: {'q': search, 'onlyAP': 'true'}, + ); // get first of the ap objects found. - final json = response.bodyJson; - final actor = (json['apActors']! as List).firstOrNull; - if (actor?['type'] == 'user') { - return DetailedUserModel.fromMbin(actor['object'] as JsonMap); - } - if (actor?['type'] == 'magazine') { - return DetailedCommunityModel.fromMbin(actor['object'] as JsonMap); - } - - final object = (json['apObjects']! as List).firstOrNull; - if (object?['itemType'] == 'entry') { - return PostModel.fromMbinEntry(object as JsonMap); - } - if (object?['itemType'] == 'post') { - return PostModel.fromMbinPost(object as JsonMap); - } - if (object?['itemType'] == 'entry_comment' || - object?['itemType'] == 'post_comment') { - return CommentModel.fromMbin(object as JsonMap); - } - - return null; + return SearchListModel.fromMbin(response.bodyJson).items.firstOrNull; case ServerSoftware.lemmy: const path = '/resolve_object'; diff --git a/lib/src/models/search.dart b/lib/src/models/search.dart index d5a57947..a53f483e 100644 --- a/lib/src/models/search.dart +++ b/lib/src/models/search.dart @@ -18,32 +18,55 @@ abstract class SearchListModel with _$SearchListModel { factory SearchListModel.fromMbin(Map json) { final items = []; - for (final actor in json['apActors']) { - final type = actor['type']; - if (type == 'user') { - items.add(DetailedUserModel.fromMbin(actor['object'] as JsonMap)); - } else if (type == 'magazine') { - items.add(DetailedCommunityModel.fromMbin(actor['object'] as JsonMap)); + final itemsJson = json['items']! as List; + final apResultsJson = json['apResults']! as List; + + for (final itemJson in itemsJson) { + if (itemJson['entry'] != null) { + items.add(PostModel.fromMbinEntry(itemJson['entry'] as JsonMap)); } - } - for (final item in json['apObjects']) { - final itemType = item['itemType']; - if (itemType == 'entry') { - items.add(PostModel.fromMbinEntry(item as JsonMap)); - } else if (itemType == 'post') { - items.add(PostModel.fromMbinPost(item as JsonMap)); - } else if (itemType == 'entry_comment' || itemType == 'post_comment') { - items.add(CommentModel.fromMbin(item as JsonMap)); + if (itemJson['entryComment'] != null) { + items.add(CommentModel.fromMbin(itemJson['entryComment'] as JsonMap)); + } + if (itemJson['post'] != null) { + items.add(PostModel.fromMbinPost(itemJson['post'] as JsonMap)); + } + if (itemJson['postComment'] != null) { + items.add(CommentModel.fromMbin(itemJson['postComment'] as JsonMap)); + } + if (itemJson['magazine'] != null) { + items.add( + DetailedCommunityModel.fromMbin(itemJson['magazine'] as JsonMap), + ); + } + if (itemJson['user'] != null) { + items.add(DetailedUserModel.fromMbin(itemJson['user'] as JsonMap)); } } - for (final item in json['items']) { - final itemType = item['itemType']; - if (itemType == 'entry') { - items.add(PostModel.fromMbinEntry(item as JsonMap)); - } else if (itemType == 'post') { - items.add(PostModel.fromMbinPost(item as JsonMap)); - } else if (itemType == 'entry_comment' || itemType == 'post_comment') { - items.add(CommentModel.fromMbin(item as JsonMap)); + for (final apResultJson in apResultsJson) { + if (apResultJson['entry'] != null) { + items.add(PostModel.fromMbinEntry(apResultJson['entry'] as JsonMap)); + } + if (apResultJson['entryComment'] != null) { + items.add( + CommentModel.fromMbin(apResultJson['entryComment'] as JsonMap), + ); + } + if (apResultJson['post'] != null) { + items.add(PostModel.fromMbinPost(apResultJson['post'] as JsonMap)); + } + if (apResultJson['postComment'] != null) { + items.add( + CommentModel.fromMbin(apResultJson['postComment'] as JsonMap), + ); + } + if (apResultJson['magazine'] != null) { + items.add( + DetailedCommunityModel.fromMbin(apResultJson['magazine'] as JsonMap), + ); + } + if (apResultJson['user'] != null) { + items.add(DetailedUserModel.fromMbin(apResultJson['user'] as JsonMap)); } } From 227634049a09d6e22b623202f67e7860e1899cc7 Mon Sep 17 00:00:00 2001 From: olorin99 Date: Mon, 29 Jun 2026 14:29:44 +1000 Subject: [PATCH 8/9] Add mastodon redirect to manifest. --- android/app/src/main/AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5a1fcc8d..7ad8f774 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -28,6 +28,10 @@ + + + + From cc25152e0f966fd2ce9473158aa0abd7dd997905 Mon Sep 17 00:00:00 2001 From: olorin99 Date: Tue, 14 Jul 2026 17:27:41 +1000 Subject: [PATCH 9/9] Add top active mastodon instances to list of deep links. --- android/app/src/main/AndroidManifest.xml | 648 +++++++++++++++++++--- lib/src/utils/instances.dart | 649 ++++++++++++++++++++--- scripts/fetch_instances.sh | 8 +- 3 files changed, 1128 insertions(+), 177 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7ad8f774..76bdee2c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -39,76 +39,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + - + + + + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + - + + + - + + + + + + + + + + + + + + + + + + + + + + + - @@ -117,91 +204,160 @@ - + + + - + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + - + - - - + + + - + - - @@ -212,28 +368,26 @@ + + - - - - @@ -241,14 +395,15 @@ + + - @@ -256,6 +411,7 @@ + @@ -264,84 +420,80 @@ + + - - + - - + + - - + - - - + - + + - - + + - - - @@ -351,7 +503,6 @@ - @@ -361,6 +512,7 @@ + @@ -370,43 +522,48 @@ + + - + + + + - + - - + + + - - - - + + + @@ -417,24 +574,20 @@ - - - + - + - - @@ -445,39 +598,41 @@ - - - + - + + + + + - + + + - - @@ -488,78 +643,232 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + - + - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + - + + + + + - - - + + + + + + + + + + + + + + + + + + + - - + - - + + + + - - + + @@ -568,91 +877,256 @@ + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + diff --git a/lib/src/utils/instances.dart b/lib/src/utils/instances.dart index 1c91f65a..ad14f1ba 100644 --- a/lib/src/utils/instances.dart +++ b/lib/src/utils/instances.dart @@ -12,24 +12,26 @@ const Map knownInstances = { 'kbin.melroy.org': ServerSoftware.mbin, 'k.fe.derate.me': ServerSoftware.mbin, 'mbin.cocopoops.com': ServerSoftware.mbin, + 'mbin.level5.dev': ServerSoftware.mbin, 'mbin.potato-guy.space': ServerSoftware.mbin, - 'mbin.xi.ht': ServerSoftware.mbin, - 'mbin.zerojay.com': ServerSoftware.mbin, 'moist.catsweat.com': ServerSoftware.mbin, 'rimworld.gallery': ServerSoftware.mbin, 'socialnetworks.rodeo': ServerSoftware.mbin, - 'storhav.net': ServerSoftware.mbin, 'thebrainbin.org': ServerSoftware.mbin, + 'alquimidia.cc': ServerSoftware.piefed, 'anarchist.nexus': ServerSoftware.piefed, + 'animaignota.com': ServerSoftware.piefed, 'bookwyr.me': ServerSoftware.piefed, 'cafe.coffee-break.cc': ServerSoftware.piefed, 'cake.kobel.fyi': ServerSoftware.piefed, - 'crust.piefed.nullspace.lol': ServerSoftware.piefed, + 'cie.mortebrume.eu': ServerSoftware.piefed, 'crust.piefed.social': ServerSoftware.piefed, 'das-eck.haus': ServerSoftware.piefed, 'devel.silesia.social': ServerSoftware.piefed, + 'discuss.amicia.net': ServerSoftware.piefed, 'discuss.familie-will.at': ServerSoftware.piefed, + 'ero.ani.social': ServerSoftware.piefed, 'feddit.com': ServerSoftware.piefed, 'feddit.fr': ServerSoftware.piefed, 'feddit.mauve.haus': ServerSoftware.piefed, @@ -37,48 +39,49 @@ const Map knownInstances = { 'fedi.fsfans.club': ServerSoftware.piefed, 'fedinsfw.app': ServerSoftware.piefed, 'fedi.ur-mom.gay': ServerSoftware.piefed, + 'forum.sf-informatique.fr': ServerSoftware.piefed, 'geostationary.orbiting.observer': ServerSoftware.piefed, 'humansare.social': ServerSoftware.piefed, 'hyper2.wandzeitung.xyz': ServerSoftware.piefed, 'itsawonder.icu': ServerSoftware.piefed, - 'j4vcdedmiokf56h3ho4t62mlku.srv.us': ServerSoftware.piefed, 'jolly-piefed.jomandoa.net': ServerSoftware.piefed, 'kopitalk.net': ServerSoftware.piefed, 'lonestarpiefed.duckdns.org': ServerSoftware.piefed, + 'meowing.twink.men': ServerSoftware.piefed, 'multiverse.soulism.net': ServerSoftware.piefed, 'news.erebion.eu': ServerSoftware.piefed, 'news.heathenlab.net': ServerSoftware.piefed, 'nord.pub': ServerSoftware.piefed, - 'nord.red': ServerSoftware.piefed, - 'ohpossum.ooo': ServerSoftware.piefed, 'palaver.p3x.de': ServerSoftware.piefed, 'peachpie.theatl.social': ServerSoftware.piefed, + 'pf.a3a2.uk': ServerSoftware.piefed, 'pf.korako.me': ServerSoftware.piefed, + 'p.hobo.social': ServerSoftware.piefed, 'pie.dasneuland.de': ServerSoftware.piefed, 'pie.eyeofthestorm.place': ServerSoftware.piefed, 'piefed.0x0c.link': ServerSoftware.piefed, 'piefed.alphapuggle.dev': ServerSoftware.piefed, - 'piefed.belgae.social': ServerSoftware.piefed, 'piefed.blahaj.zone': ServerSoftware.piefed, 'piefed.ca': ServerSoftware.piefed, - 'piefed.chrisco.me': ServerSoftware.piefed, 'piefed.crash.cx': ServerSoftware.piefed, 'piefed.dk': ServerSoftware.piefed, - 'piefed.doomprepper.com': ServerSoftware.piefed, 'piefed.ee': ServerSoftware.piefed, - 'piefed.europe.pub': ServerSoftware.piefed, + 'piefed.eurocomsocial.de': ServerSoftware.piefed, 'piefed.fan': ServerSoftware.piefed, + 'piefed.flauschbereich.de': ServerSoftware.piefed, 'piefed.foxden.party': ServerSoftware.piefed, + 'piefed.grant.rip': ServerSoftware.piefed, 'piefed.inwoodnexus.nyc': ServerSoftware.piefed, 'piefed.iridescent.nz': ServerSoftware.piefed, + 'piefed.jeena.net': ServerSoftware.piefed, 'piefed.keyboardvagabond.com': ServerSoftware.piefed, 'piefed.lerman-development.com': ServerSoftware.piefed, - 'piefed.malplena.net': ServerSoftware.piefed, 'piefed.marud.fr': ServerSoftware.piefed, - 'piefed.monster': ServerSoftware.piefed, 'piefed.muxika.org': ServerSoftware.piefed, + 'piefed.nl': ServerSoftware.piefed, 'piefed.nullspace.lol': ServerSoftware.piefed, 'piefed.ombreport.info': ServerSoftware.piefed, + 'piefed.projetretro.io': ServerSoftware.piefed, 'piefed.sekretaerbaer.net': ServerSoftware.piefed, 'piefed.socdojo.com': ServerSoftware.piefed, 'piefed.social': ServerSoftware.piefed, @@ -87,14 +90,18 @@ const Map knownInstances = { 'piefed.world': ServerSoftware.piefed, 'piefed.zeromedia.vip': ServerSoftware.piefed, 'piefeed.com': ServerSoftware.piefed, - 'px.pontual.social': ServerSoftware.piefed, + 'pie.gravitywell.xyz': ServerSoftware.piefed, + 'pie.ohpossum.ooo': ServerSoftware.piefed, + 'pie.zerojay.com': ServerSoftware.piefed, + 'pylova-test.anarchistflotilla.org': ServerSoftware.piefed, 'queer.irish': ServerSoftware.piefed, 'quokk.au': ServerSoftware.piefed, 'rentadrunk.org': ServerSoftware.piefed, 'retrofed.com': ServerSoftware.piefed, - 'retro.piefed.com': ServerSoftware.piefed, + 'seksi.jatai.de': ServerSoftware.piefed, 'silesia.social': ServerSoftware.piefed, 'social.doomprepper.com': ServerSoftware.piefed, + 'social.ozymandias.club': ServerSoftware.piefed, 'stable.wjs018.xyz': ServerSoftware.piefed, 'tarte.nuage-libre.fr': ServerSoftware.piefed, 'wetshav.ing': ServerSoftware.piefed, @@ -115,12 +122,12 @@ const Map knownInstances = { 'baraza.africa': ServerSoftware.lemmy, 'bdl.owu.one': ServerSoftware.lemmy, 'beehaw.org': ServerSoftware.lemmy, + 'belfry.rip': ServerSoftware.lemmy, 'belgae.social': ServerSoftware.lemmy, - 'blendit.bsd.cafe': ServerSoftware.lemmy, 'blockchained.world': ServerSoftware.lemmy, 'bodli.mven.nl': ServerSoftware.lemmy, + 'bohemian.social': ServerSoftware.lemmy, 'bolha.forum': ServerSoftware.lemmy, - 'borg.chat': ServerSoftware.lemmy, 'breakfast.haus': ServerSoftware.lemmy, 'campfyre.nickwebster.dev': ServerSoftware.lemmy, 'chachara.club': ServerSoftware.lemmy, @@ -131,19 +138,18 @@ const Map knownInstances = { 'communick.news': ServerSoftware.lemmy, 'corndog.social': ServerSoftware.lemmy, 'crazypeople.online': ServerSoftware.lemmy, - 'dev.alien.cool': ServerSoftware.lemmy, 'dev.lemmy.world': ServerSoftware.lemmy, 'diggita.com': ServerSoftware.lemmy, 'digipres.cafe': ServerSoftware.lemmy, 'discover.deltanauten.de': ServerSoftware.lemmy, - 'discuss.aethelgard.space': ServerSoftware.lemmy, 'discuss.hadan.social': ServerSoftware.lemmy, 'discuss.icewind.me': ServerSoftware.lemmy, 'discuss.jacen.moe': ServerSoftware.lemmy, 'discuss.mschae23.de': ServerSoftware.lemmy, + 'discuss.online': ServerSoftware.lemmy, 'discuss.tchncs.de': ServerSoftware.lemmy, - 'doomscroll.n8e.dev': ServerSoftware.lemmy, 'downonthestreet.eu': ServerSoftware.lemmy, + 'ds9.lemmy.ml': ServerSoftware.lemmy, 'dubvee.org': ServerSoftware.lemmy, 'dullsters.net': ServerSoftware.lemmy, 'enterprise.lemmy.ml': ServerSoftware.lemmy, @@ -157,23 +163,20 @@ const Map knownInstances = { 'feddit.bg': ServerSoftware.lemmy, 'feddit.cl': ServerSoftware.lemmy, 'feddit.dk': ServerSoftware.lemmy, - 'feddit.in': ServerSoftware.lemmy, 'feddit.it': ServerSoftware.lemmy, 'feddit.nl': ServerSoftware.lemmy, 'feddit.nu': ServerSoftware.lemmy, 'feddit.org': ServerSoftware.lemmy, 'feddit.rocks': ServerSoftware.lemmy, 'feddit.uk': ServerSoftware.lemmy, - 'feddit.world': ServerSoftware.lemmy, 'fed.dyne.org': ServerSoftware.lemmy, - 'fedii.me': ServerSoftware.lemmy, 'feditown.com': ServerSoftware.lemmy, 'fenmou.cyou': ServerSoftware.lemmy, 'fjdk.uk': ServerSoftware.lemmy, 'foros.fediverso.gal': ServerSoftware.lemmy, 'forum.ayom.media': ServerSoftware.lemmy, 'forum.digitaleautonomie.org': ServerSoftware.lemmy, - 'forum.distorted-monkeys.com': ServerSoftware.lemmy, + 'forum.guncadindex.com': ServerSoftware.lemmy, 'forums.chippytea.uk': ServerSoftware.lemmy, 'forums.rereading.space': ServerSoftware.lemmy, 'forum.storstad.net': ServerSoftware.lemmy, @@ -181,6 +184,7 @@ const Map knownInstances = { 'fstab.sh': ServerSoftware.lemmy, 'futurology.today': ServerSoftware.lemmy, 'gearhead.town': ServerSoftware.lemmy, + 'giesing.dev': ServerSoftware.lemmy, 'gioia.news': ServerSoftware.lemmy, 'gonzo.markets': ServerSoftware.lemmy, 'go.ontomy.tv': ServerSoftware.lemmy, @@ -189,13 +193,14 @@ const Map knownInstances = { 'hackertalks.com': ServerSoftware.lemmy, 'hackerz.world': ServerSoftware.lemmy, 'hackingne.ws': ServerSoftware.lemmy, + 'hacknest.diy': ServerSoftware.lemmy, 'halubilo.social': ServerSoftware.lemmy, - 'happysl.app': ServerSoftware.lemmy, 'hardpass.lol': ServerSoftware.lemmy, 'hardware.watch': ServerSoftware.lemmy, 'healthy.community': ServerSoftware.lemmy, 'helpos.ca': ServerSoftware.lemmy, 'hexbear.net': ServerSoftware.lemmy, + 'hikki.team': ServerSoftware.lemmy, 'hilariouschaos.com': ServerSoftware.lemmy, 'hobbit.world': ServerSoftware.lemmy, 'hoihoi.superboi.eu.org': ServerSoftware.lemmy, @@ -203,15 +208,13 @@ const Map knownInstances = { 'indie-ver.se': ServerSoftware.lemmy, 'info.prou.be': ServerSoftware.lemmy, 'infosec.pub': ServerSoftware.lemmy, + 'isawthat.fyi': ServerSoftware.lemmy, 'jlai.lu': ServerSoftware.lemmy, 'kakera.kintsugi.moe': ServerSoftware.lemmy, 'kbin.thicknahalf.com': ServerSoftware.lemmy, 'kitty.ly': ServerSoftware.lemmy, - 'kongkow.web.id': ServerSoftware.lemmy, - 'kutsuya.dev': ServerSoftware.lemmy, - 'kuu.kohana.fi': ServerSoftware.lemmy, - 'kyu.de': ServerSoftware.lemmy, 'lazysoci.al': ServerSoftware.lemmy, + 'l.cypherworld.net': ServerSoftware.lemmy, 'leaf.dance': ServerSoftware.lemmy, 'lef.li': ServerSoftware.lemmy, 'lem.afiz.org': ServerSoftware.lemmy, @@ -220,17 +223,15 @@ const Map knownInstances = { 'lem.free.as': ServerSoftware.lemmy, 'leminal.space': ServerSoftware.lemmy, 'lemming.megumin.org': ServerSoftware.lemmy, - 'lemmings.world': ServerSoftware.lemmy, 'lemmit.nyc.what.if.ua': ServerSoftware.lemmy, 'lemmit.online': ServerSoftware.lemmy, 'lemmus.org': ServerSoftware.lemmy, 'lemmy.0upti.me': ServerSoftware.lemmy, 'lemmy.100010101.xyz': ServerSoftware.lemmy, + 'lemmy.1095.me': ServerSoftware.lemmy, 'lemmy.14042003.xyz': ServerSoftware.lemmy, 'lemmy.30p87.de': ServerSoftware.lemmy, - 'lemmy.411426.xyz': ServerSoftware.lemmy, 'lemmy.4d2.org': ServerSoftware.lemmy, - 'lemmy.86thumbs.net': ServerSoftware.lemmy, 'lemmy.8bitar.io': ServerSoftware.lemmy, 'lemmy.8th.world': ServerSoftware.lemmy, 'lemmy.963.pm': ServerSoftware.lemmy, @@ -241,28 +242,26 @@ const Map knownInstances = { 'lemmy.amethyst.name': ServerSoftware.lemmy, 'lemmy.amxl.com': ServerSoftware.lemmy, 'lemmy.ananace.dev': ServerSoftware.lemmy, + 'lemmy.anhanga.com.br': ServerSoftware.lemmy, 'lemmy.ansico.dk': ServerSoftware.lemmy, 'lemmy-api.ten4ward.social': ServerSoftware.lemmy, 'lemmy.asc6.org': ServerSoftware.lemmy, 'lemmy.asudox.dev': ServerSoftware.lemmy, 'lemmy.az.social': ServerSoftware.lemmy, 'lemmy.baie.me': ServerSoftware.lemmy, + 'lemmy.balamb.fr': ServerSoftware.lemmy, 'lemmy.beagle.quest': ServerSoftware.lemmy, 'lemmy.belegost.net': ServerSoftware.lemmy, 'lemmy.beru.co': ServerSoftware.lemmy, 'lemmy.bestiver.se': ServerSoftware.lemmy, 'lemmy.billiam.net': ServerSoftware.lemmy, - 'lemmy.bitflipd.com': ServerSoftware.lemmy, 'lemmy.blackeco.com': ServerSoftware.lemmy, 'lemmy.blahaj.zone': ServerSoftware.lemmy, 'lemmy.bleh.au': ServerSoftware.lemmy, - 'lemmy.blehiscool.com': ServerSoftware.lemmy, 'lemmy.blueberryicetea.com': ServerSoftware.lemmy, 'lemmy.bmck.au': ServerSoftware.lemmy, 'lemmy.bosio.info': ServerSoftware.lemmy, - 'lemmy.bouniet.top': ServerSoftware.lemmy, 'lemmy.brandslisten.com': ServerSoftware.lemmy, - 'lemmy.brandyapple.com': ServerSoftware.lemmy, 'lemmy.brdsnest.net': ServerSoftware.lemmy, 'lemmy.brief.guru': ServerSoftware.lemmy, 'lemmy.browntown.dev': ServerSoftware.lemmy, @@ -270,14 +269,15 @@ const Map knownInstances = { 'lemmy.cafe': ServerSoftware.lemmy, 'lemmy.caliban.io': ServerSoftware.lemmy, 'lemmy.canthonyscott.io': ServerSoftware.lemmy, + 'lemmy.carl.id': ServerSoftware.lemmy, 'lemmy.ch3n2k.com': ServerSoftware.lemmy, 'lemmychan.org': ServerSoftware.lemmy, 'lemmy.circenn.win': ServerSoftware.lemmy, 'lemmy.civl.cc': ServerSoftware.lemmy, + 'lemmy.cmoser.eu': ServerSoftware.lemmy, 'lemmy.coupou.fr': ServerSoftware.lemmy, 'lemmy.cringecollective.io': ServerSoftware.lemmy, 'lemmy.criticalbasics.xyz': ServerSoftware.lemmy, - 'lemmy.croc.pw': ServerSoftware.lemmy, 'lemmy.cronyakatsuki.xyz': ServerSoftware.lemmy, 'lemmy.cryonex.net': ServerSoftware.lemmy, 'lemmy.ctrlq.dev': ServerSoftware.lemmy, @@ -285,6 +285,7 @@ const Map knownInstances = { 'lemmy.curiana.net': ServerSoftware.lemmy, 'lemmy.cyberia9.org': ServerSoftware.lemmy, 'lemmy.darkc0de.one': ServerSoftware.lemmy, + 'lemmy.darvit.nl': ServerSoftware.lemmy, 'lemmy.dbzer0.com': ServerSoftware.lemmy, 'lemmy.deadca.de': ServerSoftware.lemmy, 'lemmy.decronym.xyz': ServerSoftware.lemmy, @@ -293,84 +294,80 @@ const Map knownInstances = { 'lemmy.digitalcharon.in': ServerSoftware.lemmy, 'lemmy.digitalfall.net': ServerSoftware.lemmy, 'lemmy.dorfrollenspiel.de': ServerSoftware.lemmy, + 'lemmy.dougiepeart.co.uk': ServerSoftware.lemmy, 'lemmy.draktis.com': ServerSoftware.lemmy, + 'lemmy.drath.ru': ServerSoftware.lemmy, 'lemmy.duckpond.social': ServerSoftware.lemmy, 'lemmy.durstig.online': ServerSoftware.lemmy, - 'lemmy.eco.br': ServerSoftware.lemmy, 'lemmy.eirides.net': ServerSoftware.lemmy, 'lemmy.eknz.org': ServerSoftware.lemmy, 'lemmy.electricmonk.io': ServerSoftware.lemmy, 'lemmy.encryptionin.space': ServerSoftware.lemmy, - 'lemmy.esquiretheduke.nohost.me': ServerSoftware.lemmy, + 'lemmy.eurocomsocial.de': ServerSoftware.lemmy, 'lemmy.eus': ServerSoftware.lemmy, 'lemmy.evangineer.net': ServerSoftware.lemmy, 'lemmy.fait.ch': ServerSoftware.lemmy, 'lemmy.federate.cc': ServerSoftware.lemmy, 'lemmy.federate.lol': ServerSoftware.lemmy, - 'lemmy.fedifriends.social': ServerSoftware.lemmy, - 'lemmy.fedioasis.cc': ServerSoftware.lemmy, + 'lemmy.fedifun.eu': ServerSoftware.lemmy, + 'lemmy.fedi.ovh': ServerSoftware.lemmy, 'lemmy.fediverse.jp': ServerSoftware.lemmy, 'lemmy.fedi.zutto.fi': ServerSoftware.lemmy, 'lemmy.fiftyfifty.one': ServerSoftware.lemmy, - 'lemmy.freewilltiger.page': ServerSoftware.lemmy, 'lemmy.fromshado.ws': ServerSoftware.lemmy, 'lemmy.frozeninferno.xyz': ServerSoftware.lemmy, 'lemmy.funami.tech': ServerSoftware.lemmy, - 'lemmy.gf4.pw': ServerSoftware.lemmy, + 'lemmy.gay.amsterdam': ServerSoftware.lemmy, 'lemmy.glasgow.social': ServerSoftware.lemmy, 'lemmy.glue.io': ServerSoftware.lemmy, 'lemmygrad.ml': ServerSoftware.lemmy, 'lemmy.grey.fail': ServerSoftware.lemmy, 'lemmy.grey.ooo': ServerSoftware.lemmy, 'lemmy.grys.it': ServerSoftware.lemmy, - 'lemmy.halfbro.xyz': ServerSoftware.lemmy, - 'lemmy.halis.io': ServerSoftware.lemmy, 'lemmy.hangdaan.com': ServerSoftware.lemmy, - 'lemmy.hawkinsfamily.com.au': ServerSoftware.lemmy, 'lemmy.helios42.de': ServerSoftware.lemmy, 'lemmy.helvetet.eu': ServerSoftware.lemmy, + 'lemmy.hkserv.space': ServerSoftware.lemmy, 'lemmy.hogru.ch': ServerSoftware.lemmy, 'lemmy.horwood.cloud': ServerSoftware.lemmy, 'lemmy.hostux.net': ServerSoftware.lemmy, 'lemmy.igl.ooo': ServerSoftware.lemmy, 'lemmy.imagisphe.re': ServerSoftware.lemmy, 'lemmy.inbutts.lol': ServerSoftware.lemmy, - 'lemmyis.fun': ServerSoftware.lemmy, + 'lemmy.itsmy.social': ServerSoftware.lemmy, 'lemmy.jacaranda.club': ServerSoftware.lemmy, 'lemmy.jann.dev': ServerSoftware.lemmy, 'lemmy.jaypg.pw': ServerSoftware.lemmy, 'lemmy.jelliefrontier.net': ServerSoftware.lemmy, 'lemmy.jhjacobs.nl': ServerSoftware.lemmy, + 'lemmy.jodoktus.com': ServerSoftware.lemmy, 'lemmy.johnnei.org': ServerSoftware.lemmy, 'lemmy.johnsonsystems.org': ServerSoftware.lemmy, 'lemmy.k2pk.com': ServerSoftware.lemmy, 'lemmy.karolwos.com': ServerSoftware.lemmy, - 'lemmy.kde.social': ServerSoftware.lemmy, 'lemmy.keimai.space': ServerSoftware.lemmy, 'lemmy.keniir.wtf': ServerSoftware.lemmy, - 'lemmy.kfed.org': ServerSoftware.lemmy, + 'lemmy.killtime.online': ServerSoftware.lemmy, 'lemmy.klein.ruhr': ServerSoftware.lemmy, 'lemmy.kmoneyserver.com': ServerSoftware.lemmy, 'lemmy.ktegl.es': ServerSoftware.lemmy, 'lemmy.kzkr.xyz': ServerSoftware.lemmy, 'lemmy.labfox.fr': ServerSoftware.lemmy, 'lemmy.lacasabien.space': ServerSoftware.lemmy, + 'lemmy.laitinlok.com': ServerSoftware.lemmy, 'lemmy.lama-corp.space': ServerSoftware.lemmy, 'lemmyland.com': ServerSoftware.lemmy, 'lemmy.lantian.pub': ServerSoftware.lemmy, - 'lemmy.libertarianfellowship.org': ServerSoftware.lemmy, 'lemmy.lidstah.info': ServerSoftware.lemmy, 'lemmy.liebeleu.de': ServerSoftware.lemmy, 'lemmy.linden.social': ServerSoftware.lemmy, 'lemmylink.com': ServerSoftware.lemmy, 'lemmy.linuxuserspace.show': ServerSoftware.lemmy, - 'lemmy.lobzhomelab.online': ServerSoftware.lemmy, 'lemmy.lqx.net': ServerSoftware.lemmy, 'lemmy.lt': ServerSoftware.lemmy, 'lemmy.lundgrensjostrom.com': ServerSoftware.lemmy, 'lemmy.lupiverse.com': ServerSoftware.lemmy, 'lemmy.lynas.ca': ServerSoftware.lemmy, - 'lemmy.maechler.cloud': ServerSoftware.lemmy, 'lemmy.makearmy.io': ServerSoftware.lemmy, 'lemmy.manganiello.tech': ServerSoftware.lemmy, 'lemmy.mariusdavid.fr': ServerSoftware.lemmy, @@ -380,7 +377,6 @@ const Map knownInstances = { 'lemmy.mayer.rocks': ServerSoftware.lemmy, 'lemmy.mbl.social': ServerSoftware.lemmy, 'lemmy.mebitek.com': ServerSoftware.lemmy, - 'lemmy.meissners.me': ServerSoftware.lemmy, 'lemmy.mengsk.org': ServerSoftware.lemmy, 'lemmy.mesnumeriques.fr': ServerSoftware.lemmy, 'lemmy.michaelsasser.org': ServerSoftware.lemmy, @@ -390,6 +386,7 @@ const Map knownInstances = { 'lemmy.mistyreverie.org': ServerSoftware.lemmy, 'lemmy.mixdown.ca': ServerSoftware.lemmy, 'lemmy.ml': ServerSoftware.lemmy, + 'lemmy.mlaga97.space': ServerSoftware.lemmy, 'lemmy.mods4ever.com': ServerSoftware.lemmy, 'lemmy.monster': ServerSoftware.lemmy, 'lemmy.moocloud.party': ServerSoftware.lemmy, @@ -399,43 +396,48 @@ const Map knownInstances = { 'lemmy.muffalings.com': ServerSoftware.lemmy, 'lemmy.my-box.dev': ServerSoftware.lemmy, 'lemmy.myjhdiy.net': ServerSoftware.lemmy, + 'lemmy.myserv.one': ServerSoftware.lemmy, + 'lemmy.nahsi.dev': ServerSoftware.lemmy, 'lemmynal.space': ServerSoftware.lemmy, 'lemmy.nekusoul.de': ServerSoftware.lemmy, 'lemmy.neondystopia.world': ServerSoftware.lemmy, - 'lemmy.nerdland.xyz': ServerSoftware.lemmy, 'lemmy.net.au': ServerSoftware.lemmy, + 'lemmy.netpaws.cc': ServerSoftware.lemmy, 'lemmy.nexus': ServerSoftware.lemmy, 'lemmy.nocturnal.garden': ServerSoftware.lemmy, 'lemmy.nope.ly': ServerSoftware.lemmy, 'lemmy.norbipeti.eu': ServerSoftware.lemmy, 'lemmy.notclickable.com': ServerSoftware.lemmy, 'lemmy.nothavingthis.co.uk': ServerSoftware.lemmy, + 'lemmy.notmy.cloud': ServerSoftware.lemmy, 'lemmy.nrdblg.de': ServerSoftware.lemmy, 'lemmynsfw.com': ServerSoftware.lemmy, + 'lemmy.nu31.space': ServerSoftware.lemmy, 'lemmy.nube-gran.de': ServerSoftware.lemmy, + 'lemmy.nx.dedyn.io': ServerSoftware.lemmy, 'lemmy.nz': ServerSoftware.lemmy, - 'lemmy.obrell.se': ServerSoftware.lemmy, 'lemmy.obscuro.be': ServerSoftware.lemmy, 'lemmy.ohaa.xyz': ServerSoftware.lemmy, 'lemmyoh.io': ServerSoftware.lemmy, 'lemmy.okr765.com': ServerSoftware.lemmy, 'lemmy.one': ServerSoftware.lemmy, 'lemmy.onlylans.io': ServerSoftware.lemmy, + 'lemmy.openitco.de': ServerSoftware.lemmy, 'lemmy.parodia.dev': ServerSoftware.lemmy, - 'lemmy.paulstevens.org': ServerSoftware.lemmy, - 'lemmy.piracy.social': ServerSoftware.lemmy, + 'lemmy.pe1uca.dev': ServerSoftware.lemmy, + 'lemmy.permisuan.com': ServerSoftware.lemmy, + 'lemmy.photon-grove.net': ServerSoftware.lemmy, 'lemmy.pixelpassport.studio': ServerSoftware.lemmy, 'lemmy.poudlar.do': ServerSoftware.lemmy, 'lemmy.pt': ServerSoftware.lemmy, 'lemmy.radio': ServerSoftware.lemmy, - 'lemmy.razbot.xyz': ServerSoftware.lemmy, - 'lemmy.rhymelikedi.me': ServerSoftware.lemmy, - 'lemmy.rmict.nl': ServerSoftware.lemmy, 'lemmy.rochegmr.com': ServerSoftware.lemmy, 'lemmy.runesmite.com': ServerSoftware.lemmy, - 'lemmy.sal.web.tr': ServerSoftware.lemmy, + 'lemmy.sador.me': ServerSoftware.lemmy, 'lemmy.scam-mail.me': ServerSoftware.lemmy, 'lemmy.science.social': ServerSoftware.lemmy, + 'lemmy.sdf.org': ServerSoftware.lemmy, + 'lemmy.seattlelunarsociety.org': ServerSoftware.lemmy, 'lemmy.secnd.me': ServerSoftware.lemmy, 'lemmy.securitycafe.ca': ServerSoftware.lemmy, 'lemmy.self-hosted.site': ServerSoftware.lemmy, @@ -446,24 +448,20 @@ const Map knownInstances = { 'lemmy.sietch.online': ServerSoftware.lemmy, 'lemmy.skoops.social': ServerSoftware.lemmy, 'lemmy.skyjake.fi': ServerSoftware.lemmy, - 'lemmy.snoot.tube': ServerSoftware.lemmy, - 'lemmy.snowgoons.ro': ServerSoftware.lemmy, - 'lemmy.spaceships.me': ServerSoftware.lemmy, 'lemmy.ssba.com': ServerSoftware.lemmy, + 'lemmy.stage.anoxinon.de': ServerSoftware.lemmy, 'lemmy.staphup.nl': ServerSoftware.lemmy, 'lemmy.starbase80.dev': ServerSoftware.lemmy, 'lemmy.starlightkel.xyz': ServerSoftware.lemmy, 'lemmy.stefanoprenna.com': ServerSoftware.lemmy, 'lemmy.strausfuenf.de': ServerSoftware.lemmy, - 'lemmy.stuart.fun': ServerSoftware.lemmy, 'lemmy.technowizardry.net': ServerSoftware.lemmy, + 'lemmy.tespia.org': ServerSoftware.lemmy, 'lemmy.tevtra.com': ServerSoftware.lemmy, 'lemmy.tgxn.net': ServerSoftware.lemmy, - 'lemmy.thefloatinglab.world': ServerSoftware.lemmy, 'lemmy.thewooskeys.com': ServerSoftware.lemmy, 'lemmy.tobyvin.dev': ServerSoftware.lemmy, 'lemmy.today': ServerSoftware.lemmy, - 'lemmy.tomateaux.com': ServerSoftware.lemmy, 'lemmy.tomkoreny.com': ServerSoftware.lemmy, 'lemmy.t-rg.ws': ServerSoftware.lemmy, 'lemmy.tserts.com': ServerSoftware.lemmy, @@ -474,19 +472,16 @@ const Map knownInstances = { 'lemmy.uninsane.org': ServerSoftware.lemmy, 'lemmy.unryzer.eu': ServerSoftware.lemmy, 'lemmy.vg': ServerSoftware.lemmy, - 'lemmy.vigenere.nl': ServerSoftware.lemmy, - 'lemmy.wejustgame.org': ServerSoftware.lemmy, 'lemmy.world': ServerSoftware.lemmy, - 'lemmy.wtf': ServerSoftware.lemmy, 'lemmy.xeviousx.eu': ServerSoftware.lemmy, 'lemmy.xoynq.com': ServerSoftware.lemmy, 'lemmy.zhukov.al': ServerSoftware.lemmy, + 'lemmy.zimage.com': ServerSoftware.lemmy, 'lemmy.zip': ServerSoftware.lemmy, 'lemmy.zwanenburg.info': ServerSoftware.lemmy, 'lem.ph3j.com': ServerSoftware.lemmy, 'lem.serkozh.me': ServerSoftware.lemmy, 'lem.trashbrain.org': ServerSoftware.lemmy, - 'lem.ugh.im': ServerSoftware.lemmy, 'lemy.lol': ServerSoftware.lemmy, 'lemy.nl': ServerSoftware.lemmy, 'le.poxiao-labs.work': ServerSoftware.lemmy, @@ -494,7 +489,6 @@ const Map knownInstances = { 'l.hostux.net': ServerSoftware.lemmy, 'libretechni.ca': ServerSoftware.lemmy, 'links.communitarium.org': ServerSoftware.lemmy, - 'links.gayfr.online': ServerSoftware.lemmy, 'links.nadia.moe': ServerSoftware.lemmy, 'links.openriver.net': ServerSoftware.lemmy, 'linz.city': ServerSoftware.lemmy, @@ -503,10 +497,8 @@ const Map knownInstances = { 'lm.boing.icu': ServerSoftware.lemmy, 'l.mchome.net': ServerSoftware.lemmy, 'lm.inu.is': ServerSoftware.lemmy, - 'lmm.azrak.io': ServerSoftware.lemmy, 'lm.mlfh.org': ServerSoftware.lemmy, 'lm.preferlinux.de': ServerSoftware.lemmy, - 'lm.theorionserver.com': ServerSoftware.lemmy, 'lmy.ndu.wtf': ServerSoftware.lemmy, 'lmy.sagf.io': ServerSoftware.lemmy, 'l.posterdati.it': ServerSoftware.lemmy, @@ -516,7 +508,6 @@ const Map knownInstances = { 'lt.harding.dev': ServerSoftware.lemmy, 'l.tta.wtf': ServerSoftware.lemmy, 'l.twipped.social': ServerSoftware.lemmy, - 'lu.skbo.net': ServerSoftware.lemmy, 'maga.place': ServerSoftware.lemmy, 'making.awful.systems': ServerSoftware.lemmy, 'mander.xyz': ServerSoftware.lemmy, @@ -524,42 +515,38 @@ const Map knownInstances = { 'martinlm.mypi.co': ServerSoftware.lemmy, 'matchpoint.zone': ServerSoftware.lemmy, 'metacritics.zone': ServerSoftware.lemmy, + 'metapowers.org': ServerSoftware.lemmy, 'midwest.social': ServerSoftware.lemmy, - 'mimiclem.me': ServerSoftware.lemmy, - 'monero.town': ServerSoftware.lemmy, 'monero.you': ServerSoftware.lemmy, - 'monyet.cc': ServerSoftware.lemmy, 'mouse.chitanda.moe': ServerSoftware.lemmy, + 'mtgzone.com': ServerSoftware.lemmy, 'mujico.org': ServerSoftware.lemmy, 'natur.23.nu': ServerSoftware.lemmy, 'nba.space': ServerSoftware.lemmy, 'news.abolish.capital': ServerSoftware.lemmy, 'news.girolab.foo': ServerSoftware.lemmy, - 'news.idlestate.org': ServerSoftware.lemmy, 'nfl.community': ServerSoftware.lemmy, 'nodesphere.site': ServerSoftware.lemmy, 'no.lastname.nz': ServerSoftware.lemmy, 'notizie.bida.im': ServerSoftware.lemmy, 'odin.lanofthedead.xyz': ServerSoftware.lemmy, - 'okaythen.lol': ServerSoftware.lemmy, - 'olla.cat': ServerSoftware.lemmy, 'orcas.enjoying.yachts': ServerSoftware.lemmy, 'overctrl.dbzer0.com': ServerSoftware.lemmy, 'parenti.sh': ServerSoftware.lemmy, 'party.lumanesence.co.uk': ServerSoftware.lemmy, 'pawb.social': ServerSoftware.lemmy, 'philosophy.cafe': ServerSoftware.lemmy, + 'piefed.diffrint.org': ServerSoftware.lemmy, 'poptalk.scrubbles.tech': ServerSoftware.lemmy, + 'portal.codyslemmyworld.com': ServerSoftware.lemmy, 'poweruser.forum': ServerSoftware.lemmy, 'programming.dev': ServerSoftware.lemmy, - 'providence.root.sx': ServerSoftware.lemmy, + 'providence.werewolf.lat': ServerSoftware.lemmy, 'r3dnvmbr.xyz': ServerSoftware.lemmy, 'rblind.com': ServerSoftware.lemmy, 'realbitcoin.cash': ServerSoftware.lemmy, - 'reddeet.com': ServerSoftware.lemmy, 'reddit.kokomo.cloud': ServerSoftware.lemmy, 'reddthat.com': ServerSoftware.lemmy, - 'rekabu.ru': ServerSoftware.lemmy, 'retrolemmy.com': ServerSoftware.lemmy, 'riskeratspizza.com': ServerSoftware.lemmy, 'r.nf': ServerSoftware.lemmy, @@ -572,16 +559,17 @@ const Map knownInstances = { 'sfw.community': ServerSoftware.lemmy, 'sha1.nl': ServerSoftware.lemmy, 'sh.itjust.works': ServerSoftware.lemmy, + 'shredderfood.net': ServerSoftware.lemmy, 'slangenettet.pyjam.as': ServerSoftware.lemmy, 'slevin.horse': ServerSoftware.lemmy, 'slrpnk.net': ServerSoftware.lemmy, 'soccer.forum': ServerSoftware.lemmy, - 'social.donondo.com': ServerSoftware.lemmy, 'social.ggbox.fr': ServerSoftware.lemmy, 'social.jears.at': ServerSoftware.lemmy, 'social.nerdhouse.io': ServerSoftware.lemmy, 'social.p80.se': ServerSoftware.lemmy, 'social.sour.is': ServerSoftware.lemmy, + 'social.srx.digital': ServerSoftware.lemmy, 'sopuli.xyz': ServerSoftware.lemmy, 'spare.botegirl.parts': ServerSoftware.lemmy, 'spgrn.com': ServerSoftware.lemmy, @@ -599,7 +587,6 @@ const Map knownInstances = { 'test2.lealternative.net': ServerSoftware.lemmy, 'thelemmy.club': ServerSoftware.lemmy, 'thinktank.brainstormes.org': ServerSoftware.lemmy, - 'tiann.plk.tw': ServerSoftware.lemmy, 'timeperiods.fr': ServerSoftware.lemmy, 'timesink.p3nguin.org': ServerSoftware.lemmy, 'tkohhh.social': ServerSoftware.lemmy, @@ -615,7 +602,495 @@ const Map knownInstances = { 'voyager.lemmy.ml': ServerSoftware.lemmy, 'whatcom.social': ServerSoftware.lemmy, 'wired.bluemarch.art': ServerSoftware.lemmy, - 'x69.org': ServerSoftware.lemmy, 'yall.theatl.social': ServerSoftware.lemmy, 'zegheteens.nl': ServerSoftware.lemmy, + + '101010.pl': ServerSoftware.mbin, + '1234.as': ServerSoftware.mbin, + '2137.social': ServerSoftware.mbin, + '23.social': ServerSoftware.mbin, + '4bear.com': ServerSoftware.mbin, + '9kb.me': ServerSoftware.mbin, + 'abdl.link': ServerSoftware.mbin, + 'academiccloud.social': ServerSoftware.mbin, + 'activitypub.academy': ServerSoftware.mbin, + 'aethy.com': ServerSoftware.mbin, + 'akamdon.com': ServerSoftware.mbin, + 'alive.bar': ServerSoftware.mbin, + 'androiddev.social': ServerSoftware.mbin, + 'archaeo.social': ServerSoftware.mbin, + 'atornblad.se': ServerSoftware.mbin, + 'aus.social': ServerSoftware.mbin, + 'babka.social': ServerSoftware.mbin, + 'bahn.social': ServerSoftware.mbin, + 'baraag.net': ServerSoftware.mbin, + 'bark.lgbt': ServerSoftware.mbin, + 'beige.party': ServerSoftware.mbin, + 'berlin.social': ServerSoftware.mbin, + 'best-friends.chat': ServerSoftware.mbin, + 'better.boston': ServerSoftware.mbin, + 'bgme.me': ServerSoftware.mbin, + 'bildung.social': ServerSoftware.mbin, + 'biplus.date': ServerSoftware.mbin, + 'bitbang.social': ServerSoftware.mbin, + 'blimps.xyz': ServerSoftware.mbin, + 'blorbo.social': ServerSoftware.mbin, + 'bolha.us': ServerSoftware.mbin, + 'bonn.social': ServerSoftware.mbin, + 'brettspiel.space': ServerSoftware.mbin, + 'bsd.network': ServerSoftware.mbin, + 'burma.social': ServerSoftware.mbin, + 'burningboard.net': ServerSoftware.mbin, + 'bzh.social': ServerSoftware.mbin, + 'c7.io': ServerSoftware.mbin, + 'cathode.church': ServerSoftware.mbin, + 'channel.org': ServerSoftware.mbin, + 'chaosfem.tw': ServerSoftware.mbin, + 'chaos.social': ServerSoftware.mbin, + 'chitter.xyz': ServerSoftware.mbin, + 'ciberlandia.pt': ServerSoftware.mbin, + 'c.im': ServerSoftware.mbin, + 'climatejustice.social': ServerSoftware.mbin, + 'cloudisland.nz': ServerSoftware.mbin, + 'col.social': ServerSoftware.mbin, + 'computerfairi.es': ServerSoftware.mbin, + 'corteximplant.com': ServerSoftware.mbin, + 'cosocial.ca': ServerSoftware.mbin, + 'crazylab.online': ServerSoftware.mbin, + 'critter.cafe': ServerSoftware.mbin, + 'cubhub.social': ServerSoftware.mbin, + 'cultur.social': ServerSoftware.mbin, + 'cupoftea.social': ServerSoftware.mbin, + 'cyberplace.social': ServerSoftware.mbin, + 'cyberpunk.lol': ServerSoftware.mbin, + 'defcon.social': ServerSoftware.mbin, + 'det.social': ServerSoftware.mbin, + 'dice.camp': ServerSoftware.mbin, + 'digitalcourage.social': ServerSoftware.mbin, + 'disabled.social': ServerSoftware.mbin, + 'discuss.systems': ServerSoftware.mbin, + 'dizl.de': ServerSoftware.mbin, + 'dju.social': ServerSoftware.mbin, + 'dmv.community': ServerSoftware.mbin, + 'dobbs.town': ServerSoftware.mbin, + 'donphan.social': ServerSoftware.mbin, + 'dotnet.social': ServerSoftware.mbin, + 'dragon-fly.club': ServerSoftware.mbin, + 'dragonscave.space': ServerSoftware.mbin, + 'dresden.network': ServerSoftware.mbin, + 'dtp-mstdn.jp': ServerSoftware.mbin, + 'ecoevo.social': ServerSoftware.mbin, + 'econtwitter.net': ServerSoftware.mbin, + 'eldritch.cafe': ServerSoftware.mbin, + 'en.osm.town': ServerSoftware.mbin, + 'equestria.social': ServerSoftware.mbin, + 'esperanto.masto.host': ServerSoftware.mbin, + 'eupolicy.social': ServerSoftware.mbin, + 'expressional.social': ServerSoftware.mbin, + 'fairy.id': ServerSoftware.mbin, + 'famichiki.jp': ServerSoftware.mbin, + 'fandom.ink': ServerSoftware.mbin, + 'federatedfandom.net': ServerSoftware.mbin, + 'fedi.at': ServerSoftware.mbin, + 'fedifreu.de': ServerSoftware.mbin, + 'fedigroups.social': ServerSoftware.mbin, + 'fedihum.org': ServerSoftware.mbin, + 'fediscience.org': ServerSoftware.mbin, + 'ffxiv-mastodon.com': ServerSoftware.mbin, + 'findout.media': ServerSoftware.mbin, + 'fisting.social': ServerSoftware.mbin, + 'flipboard.social': ServerSoftware.mbin, + 'floss.social': ServerSoftware.mbin, + 'fnordon.de': ServerSoftware.mbin, + 'forume-u52257.vm.elestio.app': ServerSoftware.mbin, + 'fosstodon.org': ServerSoftware.mbin, + 'framapiaf.org': ServerSoftware.mbin, + 'freeatlantis.com': ServerSoftware.mbin, + 'freeradical.zone': ServerSoftware.mbin, + 'freiburg.social': ServerSoftware.mbin, + 'frikiverse.zone': ServerSoftware.mbin, + 'front-end.social': ServerSoftware.mbin, + 'functional.cafe': ServerSoftware.mbin, + 'fur.lgbt': ServerSoftware.mbin, + 'furries.club': ServerSoftware.mbin, + 'furry.engineer': ServerSoftware.mbin, + 'g0v.social': ServerSoftware.mbin, + 'gamepad.club': ServerSoftware.mbin, + 'gardenstate.social': ServerSoftware.mbin, + 'gaygeek.social': ServerSoftware.mbin, + 'genomic.social': ServerSoftware.mbin, + 'girlcock.club': ServerSoftware.mbin, + 'glammr.us': ServerSoftware.mbin, + 'glasgow.social': ServerSoftware.mbin, + 'graphics.social': ServerSoftware.mbin, + 'graz.social': ServerSoftware.mbin, + 'gruene.social': ServerSoftware.mbin, + 'gulp.cafe': ServerSoftware.mbin, + 'h4.io': ServerSoftware.mbin, + 'hachyderm.io': ServerSoftware.mbin, + 'handon.club': ServerSoftware.mbin, + 'hci.social': ServerSoftware.mbin, + 'heads.social': ServerSoftware.mbin, + 'hear-me.social': ServerSoftware.mbin, + 'helvede.net': ServerSoftware.mbin, + 'hessen.social': ServerSoftware.mbin, + 'hispagatos.space': ServerSoftware.mbin, + 'hkust.social': ServerSoftware.mbin, + 'hostux.social': ServerSoftware.mbin, + 'humano.social': ServerSoftware.mbin, + 'hunters.zone': ServerSoftware.mbin, + 'icosahedron.website': ServerSoftware.mbin, + 'icosahedron.website.': ServerSoftware.mbin, + 'ieji.de': ServerSoftware.mbin, + 'ika.queloud.net': ServerSoftware.mbin, + 'imastodon.net': ServerSoftware.mbin, + 'india.goonj.xyz': ServerSoftware.mbin, + 'indieapps.space': ServerSoftware.mbin, + 'indieweb.social': ServerSoftware.mbin, + 'infosec.exchange': ServerSoftware.mbin, + 'ioc.exchange': ServerSoftware.mbin, + 'iosdev.space': ServerSoftware.mbin, + 'is.nota.live': ServerSoftware.mbin, + 'jawns.club': ServerSoftware.mbin, + 'jorts.horse': ServerSoftware.mbin, + 'journa.host': ServerSoftware.mbin, + 'kafeneio.social': ServerSoftware.mbin, + 'kanoa.de': ServerSoftware.mbin, + 'kemonodon.club': ServerSoftware.mbin, + 'kind.social': ServerSoftware.mbin, + 'kinkycats.org': ServerSoftware.mbin, + 'kirakiratter.com': ServerSoftware.mbin, + 'kolektiva.social': ServerSoftware.mbin, + 'layer8.space': ServerSoftware.mbin, + 'leicester.chat': ServerSoftware.mbin, + 'lgbtqia.space': ServerSoftware.mbin, + 'library.love': ServerSoftware.mbin, + 'libretooth.gr': ServerSoftware.mbin, + 'lile.cl': ServerSoftware.mbin, + 'link.baai.ac.cn': ServerSoftware.mbin, + 'linuxrocks.online': ServerSoftware.mbin, + 'literatur.social': ServerSoftware.mbin, + 'livellosegreto.it': ServerSoftware.mbin, + 'ludosphere.fr': ServerSoftware.mbin, + 'macaw.social': ServerSoftware.mbin, + 'machteburch.social': ServerSoftware.mbin, + 'macrofurs.social': ServerSoftware.mbin, + 'm.ai6yr.org': ServerSoftware.mbin, + 'mainz.social': ServerSoftware.mbin, + 'mamot.fr': ServerSoftware.mbin, + 'mamutovo.cz': ServerSoftware.mbin, + 'mapstodon.space': ServerSoftware.mbin, + 'mapsupport.de': ServerSoftware.mbin, + 'mast.dragon-fly.club': ServerSoftware.mbin, + 'mast.hpc.social': ServerSoftware.mbin, + 'mast.lat': ServerSoftware.mbin, + 'mast.lt': ServerSoftware.mbin, + 'mas.to': ServerSoftware.mbin, + 'masto.ai': ServerSoftware.mbin, + 'mastoart.social': ServerSoftware.mbin, + 'mastobate.social': ServerSoftware.mbin, + 'masto.bg': ServerSoftware.mbin, + 'masto.bike': ServerSoftware.mbin, + 'mastodon.acm.org': ServerSoftware.mbin, + 'mastodonapp.uk': ServerSoftware.mbin, + 'mastodon.art': ServerSoftware.mbin, + 'mastodon.au': ServerSoftware.mbin, + 'mastodon-belgium.be': ServerSoftware.mbin, + 'mastodon.berlin': ServerSoftware.mbin, + 'mastodon.bida.im': ServerSoftware.mbin, + 'mastodon.bsd.cafe': ServerSoftware.mbin, + 'mastodon.cloud': ServerSoftware.mbin, + 'mastodon.coffee': ServerSoftware.mbin, + 'mastodon.com.pl': ServerSoftware.mbin, + 'mastodon.compositecomputer.club': ServerSoftware.mbin, + 'mastodon.com.tr': ServerSoftware.mbin, + 'mastodonczech.cz': ServerSoftware.mbin, + 'mastodon.de': ServerSoftware.mbin, + 'mastodon.design': ServerSoftware.mbin, + 'mastodon.energy': ServerSoftware.mbin, + 'mastodon.eus': ServerSoftware.mbin, + 'mastodon.forume.org': ServerSoftware.mbin, + 'mastodon.fun': ServerSoftware.mbin, + 'mastodon.gal': ServerSoftware.mbin, + 'mastodon.gamedev.place': ServerSoftware.mbin, + 'mastodon.gougere.fr': ServerSoftware.mbin, + 'mastodon.green': ServerSoftware.mbin, + 'mastodon.hams.social': ServerSoftware.mbin, + 'mastodon.hypnoguys.com': ServerSoftware.mbin, + 'mastodon.ie': ServerSoftware.mbin, + 'mastodon.la': ServerSoftware.mbin, + 'mastodon.london': ServerSoftware.mbin, + 'mastodon.me.uk': ServerSoftware.mbin, + 'mastodon.mim-libre.fr': ServerSoftware.mbin, + 'mastodon.ml': ServerSoftware.mbin, + 'mastodon.nl': ServerSoftware.mbin, + 'mastodon.nu': ServerSoftware.mbin, + 'mastodon.nz': ServerSoftware.mbin, + 'mastodon.online': ServerSoftware.mbin, + 'mastodon.org.uk': ServerSoftware.mbin, + 'mastodon.pnpde.social': ServerSoftware.mbin, + 'mastodon.radio': ServerSoftware.mbin, + 'mastodon.scot': ServerSoftware.mbin, + 'mastodon.sdf.org': ServerSoftware.mbin, + 'mastodon.social': ServerSoftware.mbin, + 'mastodonsweden.se': ServerSoftware.mbin, + 'mastodon-swiss.org': ServerSoftware.mbin, + 'mastodont.cat': ServerSoftware.mbin, + 'mastodontech.de': ServerSoftware.mbin, + 'mastodon.tetaneutral.net': ServerSoftware.mbin, + 'mastodon.top': ServerSoftware.mbin, + 'mastodontti.fi': ServerSoftware.mbin, + 'mastodon.uno': ServerSoftware.mbin, + 'mastodon.uy': ServerSoftware.mbin, + 'mastodon.world': ServerSoftware.mbin, + 'mastodon.xyz': ServerSoftware.mbin, + 'mastodon.zaclys.com': ServerSoftware.mbin, + 'masto.es': ServerSoftware.mbin, + 'masto.hackers.town': ServerSoftware.mbin, + 'masto.nu': ServerSoftware.mbin, + 'masto.nyc': ServerSoftware.mbin, + 'mastoot.fr': ServerSoftware.mbin, + 'masto.pt': ServerSoftware.mbin, + 'mastorol.es': ServerSoftware.mbin, + 'mastox.eu': ServerSoftware.mbin, + 'mastoxiv.page': ServerSoftware.mbin, + 'masto.yttrx.com': ServerSoftware.mbin, + 'mathstodon.xyz': ServerSoftware.mbin, + 'matx.eus': ServerSoftware.mbin, + 'm.cmx.im': ServerSoftware.mbin, + 'me.dm': ServerSoftware.mbin, + 'mementomori.social': ServerSoftware.mbin, + 'mendeddrum.org': ServerSoftware.mbin, + 'me.ns.ci': ServerSoftware.mbin, + 'mental.social': ServerSoftware.mbin, + 'meow.social': ServerSoftware.mbin, + 'merovingian.club': ServerSoftware.mbin, + 'mesmerized.online': ServerSoftware.mbin, + 'metalhead.club': ServerSoftware.mbin, + 'mindly.social': ServerSoftware.mbin, + 'mo-me.social': ServerSoftware.mbin, + 'mona.do': ServerSoftware.mbin, + 'monado.ren': ServerSoftware.mbin, + 'moresci.sale': ServerSoftware.mbin, + 'm.otter.homes': ServerSoftware.mbin, + 'mountains.social': ServerSoftware.mbin, + 'mstdn.beer': ServerSoftware.mbin, + 'mstdn.business': ServerSoftware.mbin, + 'mstdn.ca': ServerSoftware.mbin, + 'mstdn.dk': ServerSoftware.mbin, + 'mstdn.games': ServerSoftware.mbin, + 'mstdn.io': ServerSoftware.mbin, + 'mstdn.jp': ServerSoftware.mbin, + 'mstdn.kemono-friends.info': ServerSoftware.mbin, + 'mstdn.maud.io': ServerSoftware.mbin, + 'mstdn.mx': ServerSoftware.mbin, + 'mstdn.nere9.help': ServerSoftware.mbin, + 'mstdn.party': ServerSoftware.mbin, + 'mstdn.plus': ServerSoftware.mbin, + 'mstdn.science': ServerSoftware.mbin, + 'mstdn.social': ServerSoftware.mbin, + 'mstdn.tokyocameraclub.com': ServerSoftware.mbin, + 'mstdn.y-zu.org': ServerSoftware.mbin, + 'muenchen.social': ServerSoftware.mbin, + 'muenster.im': ServerSoftware.mbin, + 'muri.network': ServerSoftware.mbin, + 'musician.social': ServerSoftware.mbin, + 'musicians.today': ServerSoftware.mbin, + 'musicworld.social': ServerSoftware.mbin, + 'mustard.blog': ServerSoftware.mbin, + 'neopaquita.es': ServerSoftware.mbin, + 'nerdculture.de': ServerSoftware.mbin, + 'neurodifferent.me': ServerSoftware.mbin, + 'neuromatch.social': ServerSoftware.mbin, + 'newsie.social': ServerSoftware.mbin, + 'noauthority.social': ServerSoftware.mbin, + 'noc.social': ServerSoftware.mbin, + 'nofan.xyz': ServerSoftware.mbin, + 'norden.social': ServerSoftware.mbin, + 'nrw.social': ServerSoftware.mbin, + 'o3o.ca': ServerSoftware.mbin, + 'occm.cc': ServerSoftware.mbin, + 'occom.masto.host': ServerSoftware.mbin, + 'oc.todon.fr': ServerSoftware.mbin, + 'ohai.social': ServerSoftware.mbin, + 'oldbytes.space': ServerSoftware.mbin, + 'opalstack.social': ServerSoftware.mbin, + 'openbiblio.social': ServerSoftware.mbin, + 'organica.social': ServerSoftware.mbin, + 'oslo.town': ServerSoftware.mbin, + 'osna.social': ServerSoftware.mbin, + 'otadon.com': ServerSoftware.mbin, + 'owo.cafe': ServerSoftware.mbin, + 'pawb.fun': ServerSoftware.mbin, + 'pawoo.net': ServerSoftware.mbin, + 'pdx.social': ServerSoftware.mbin, + 'penfount.social': ServerSoftware.mbin, + 'peoplemaking.games': ServerSoftware.mbin, + 'photog.social': ServerSoftware.mbin, + 'phpc.social': ServerSoftware.mbin, + 'piaille.fr': ServerSoftware.mbin, + 'pkm.social': ServerSoftware.mbin, + 'planet.moe': ServerSoftware.mbin, + 'plush.city': ServerSoftware.mbin, + 'pnw.zone': ServerSoftware.mbin, + 'podcastindex.social': ServerSoftware.mbin, + 'podcasts.social': ServerSoftware.mbin, + 'pokemon.mastportal.info': ServerSoftware.mbin, + 'poliversity.it': ServerSoftware.mbin, + 'pone.social': ServerSoftware.mbin, + 'ponies.social': ServerSoftware.mbin, + 'pouet.chapril.org': ServerSoftware.mbin, + 'privacysafe.social': ServerSoftware.mbin, + 'pubeurope.com': ServerSoftware.mbin, + 'pullopen.xyz': ServerSoftware.mbin, + 'punkstodon.de': ServerSoftware.mbin, + 'puntarella.party': ServerSoftware.mbin, + 'qdon.space': ServerSoftware.mbin, + 'qlub.social': ServerSoftware.mbin, + 'qugo.tr': ServerSoftware.mbin, + 'quokka.city': ServerSoftware.mbin, + 'radikal.social': ServerSoftware.mbin, + 'ramen-fsm.eu.org': ServerSoftware.mbin, + 'ravenation.club': ServerSoftware.mbin, + 'rebel.ar': ServerSoftware.mbin, + 'respublicae.eu': ServerSoftware.mbin, + 'retirenow.top': ServerSoftware.mbin, + 'retro.pizza': ServerSoftware.mbin, + 'rheinneckar.social': ServerSoftware.mbin, + 'rhetos.net': ServerSoftware.mbin, + 'rivals.space': ServerSoftware.mbin, + 'rngm-zakaecommu.fedicity.net': ServerSoftware.mbin, + 'rollenspiel.social': ServerSoftware.mbin, + 'ro-mastodon.puyo.jp': ServerSoftware.mbin, + 'rpvortex.online': ServerSoftware.mbin, + 'rss-mstdn.studiofreesia.com': ServerSoftware.mbin, + 'rubber.social': ServerSoftware.mbin, + 'ruby.social': ServerSoftware.mbin, + 'ruhr.social': ServerSoftware.mbin, + 'sakurajima.moe': ServerSoftware.mbin, + 'scholar.social': ServerSoftware.mbin, + 'scicomm.xyz': ServerSoftware.mbin, + 'sciences.social': ServerSoftware.mbin, + 'seaofog.com': ServerSoftware.mbin, + 'sfba.social': ServerSoftware.mbin, + 'shakedown.social': ServerSoftware.mbin, + 'shelter.moe': ServerSoftware.mbin, + 'shrike.club': ServerSoftware.mbin, + 'sigmoid.social': ServerSoftware.mbin, + 'snabelen.no': ServerSoftware.mbin, + 'socel.net': ServerSoftware.mbin, + 'social.anoxinon.de': ServerSoftware.mbin, + 'social.bau-ha.us': ServerSoftware.mbin, + 'social.bau-ha.us.': ServerSoftware.mbin, + 'social.cologne': ServerSoftware.mbin, + 'social.coop': ServerSoftware.mbin, + 'social.darc.de': ServerSoftware.mbin, + 'social.edu.nl': ServerSoftware.mbin, + 'sociale.network': ServerSoftware.mbin, + 'social.goonj.xyz': ServerSoftware.mbin, + 'social.laoapp.la': ServerSoftware.mbin, + 'social.librem.one': ServerSoftware.mbin, + 'social.linux.pizza': ServerSoftware.mbin, + 'social.lol': ServerSoftware.mbin, + 'social.politicaconciencia.org': ServerSoftware.mbin, + 'social.prepedia.org': ServerSoftware.mbin, + 'social.roadfm.fr': ServerSoftware.mbin, + 'social.sciences.re': ServerSoftware.mbin, + 'social.spejset.org': ServerSoftware.mbin, + 'social.tchncs.de': ServerSoftware.mbin, + 'social.thej.in': ServerSoftware.mbin, + 'social.treehouse.systems': ServerSoftware.mbin, + 'social.y-gallery.net': ServerSoftware.mbin, + 'spore.social': ServerSoftware.mbin, + 'stranger.social': ServerSoftware.mbin, + 'sueden.social': ServerSoftware.mbin, + 'sunny.garden': ServerSoftware.mbin, + 'swiss.social': ServerSoftware.mbin, + 'tabletop.social': ServerSoftware.mbin, + 'tacobelllabs.net': ServerSoftware.mbin, + 'tchafia.be': ServerSoftware.mbin, + 'tea.codes': ServerSoftware.mbin, + 'techhub.social': ServerSoftware.mbin, + 'tech.lgbt': ServerSoftware.mbin, + 'tenforward.social': ServerSoftware.mbin, + 'theblower.au': ServerSoftware.mbin, + 'thecanadian.social': ServerSoftware.mbin, + 'theforkiverse.com': ServerSoftware.mbin, + 'thicc.horse': ServerSoftware.mbin, + 'thu.closed.social': ServerSoftware.mbin, + 'tilde.zone': ServerSoftware.mbin, + 'tkz.one': ServerSoftware.mbin, + 'tldr.nettime.org': ServerSoftware.mbin, + 'toad.social': ServerSoftware.mbin, + 'todon.eu': ServerSoftware.mbin, + 'todon.nl': ServerSoftware.mbin, + 'todon.ploud.fr': ServerSoftware.mbin, + 'tooot.im': ServerSoftware.mbin, + 'toot.aquilenet.fr': ServerSoftware.mbin, + 'toot.berlin': ServerSoftware.mbin, + 'toot.blue': ServerSoftware.mbin, + 'toot.cafe': ServerSoftware.mbin, + 'toot.cat': ServerSoftware.mbin, + 'toot.community': ServerSoftware.mbin, + 'tooting.ch': ServerSoftware.mbin, + 'toot.io': ServerSoftware.mbin, + 'toot.kif.rocks': ServerSoftware.mbin, + 'toot.lv': ServerSoftware.mbin, + 'toot.portes-imaginaire.org': ServerSoftware.mbin, + 'toot.si': ServerSoftware.mbin, + 'toot.wales': ServerSoftware.mbin, + 'town.voyager.blue': ServerSoftware.mbin, + 'transfur.social': ServerSoftware.mbin, + 'troet.cafe': ServerSoftware.mbin, + 'trpg.cloud': ServerSoftware.mbin, + 'trpg-o.xyz': ServerSoftware.mbin, + 'truthsocial.co.in': ServerSoftware.mbin, + 'tty0.social': ServerSoftware.mbin, + 'tuiter.rocks': ServerSoftware.mbin, + 'tweesecake.social': ServerSoftware.mbin, + 'twit.social': ServerSoftware.mbin, + 'twiukraine.com': ServerSoftware.mbin, + 'types.pl': ServerSoftware.mbin, + 'typo.social': ServerSoftware.mbin, + 'ukadon.shillest.net': ServerSoftware.mbin, + 'union.place': ServerSoftware.mbin, + 'universeodon.com': ServerSoftware.mbin, + 'unnerv.jp': ServerSoftware.mbin, + 'unredacted.social': ServerSoftware.mbin, + 'unstable.icu': ServerSoftware.mbin, + 'urbanists.social': ServerSoftware.mbin, + 'uri.life': ServerSoftware.mbin, + 'ursal.zone': ServerSoftware.mbin, + 'urusai.social': ServerSoftware.mbin, + 'utopia.cool': ServerSoftware.mbin, + 'veganism.social': ServerSoftware.mbin, + 'vis.social': ServerSoftware.mbin, + 'vkl.world': ServerSoftware.mbin, + 'vocalodon.net': ServerSoftware.mbin, + 'vt.social': ServerSoftware.mbin, + 'waag.social': ServerSoftware.mbin, + 'wandering.shop': ServerSoftware.mbin, + 'wehavecookies.social': ServerSoftware.mbin, + 'wetdry.world': ServerSoftware.mbin, + 'wien.rocks': ServerSoftware.mbin, + 'wikis.world': ServerSoftware.mbin, + 'wisskomm.social': ServerSoftware.mbin, + 'witter.cz': ServerSoftware.mbin, + 'wobbl.xyz': ServerSoftware.mbin, + 'woof.group': ServerSoftware.mbin, + 'woof.tech': ServerSoftware.mbin, + 'writing.exchange': ServerSoftware.mbin, + 'www.blimps.xyz': ServerSoftware.mbin, + 'www.kanoa.de': ServerSoftware.mbin, + 'wxw.moe': ServerSoftware.mbin, + 'xarxa.cloud': ServerSoftware.mbin, + 'xoxo.zone': ServerSoftware.mbin, + 'yakyudon.net': ServerSoftware.mbin, + 'yiff.life': ServerSoftware.mbin, + 'yttrx.com': ServerSoftware.mbin, + 'zeroes.ca': ServerSoftware.mbin, + 'zirk.us': ServerSoftware.mbin, + 'zohup.vip': ServerSoftware.mbin, + 'zpravobot.news': ServerSoftware.mbin, + 'zug.network': ServerSoftware.mbin, }; diff --git a/scripts/fetch_instances.sh b/scripts/fetch_instances.sh index fa778b0c..b15f0307 100755 --- a/scripts/fetch_instances.sh +++ b/scripts/fetch_instances.sh @@ -7,9 +7,9 @@ curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(sof curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mbin\") {domain}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | .domain' | sort | uniq -i > mbin_instances.txt # Theres a lot more mastodon instances so only include those with certain active user count. -#curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mastodon\") {domain active_users_monthly}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | select(.active_users_monthly > 100) | .domain' | sort | uniq -i > mastodon_instances.txt +curl -H 'Content-Type: application/json' -X POST -d '{"query": "query {nodes(softwarename: \"mastodon\") {domain active_users_monthly}}"}' https://api.fediverse.observer 2> /dev/null | jq -r '.data.nodes | .[] | select(.active_users_monthly > 100) | .domain' | sort | uniq -i > mastodon_instances.txt -cat lemmy_instances.txt piefed_instances.txt mbin_instances.txt | sort | uniq -i > instances.txt +cat lemmy_instances.txt piefed_instances.txt mbin_instances.txt mastodon_instances.txt | sort | uniq -i > instances.txt cat << EOF > lib/src/utils/instances.dart import 'package:interstellar/src/controller/server.dart'; @@ -19,6 +19,8 @@ $(awk '{ print " \047"$0"\047: ServerSoftware.mbin," }' mbin_instances.txt) $(awk '{ print " \047"$0"\047: ServerSoftware.piefed," }' piefed_instances.txt) $(awk '{ print " \047"$0"\047: ServerSoftware.lemmy," }' lemmy_instances.txt) + +$(awk '{ print " \047"$0"\047: ServerSoftware.mbin," }' mastodon_instances.txt) }; EOF @@ -45,4 +47,4 @@ while IFS= read -r line; do done < android/app/src/main/AndroidManifest.xml mv android/app/src/main/AndroidManifest-new.xml android/app/src/main/AndroidManifest.xml -rm instances.txt lemmy_instances.txt piefed_instances.txt mbin_instances.txt \ No newline at end of file +rm instances.txt lemmy_instances.txt piefed_instances.txt mbin_instances.txt mastodon_instances.txt