diff --git a/images/client-icons/fractal.png b/images/client-icons/fractal.png
new file mode 100644
index 0000000..e60c89c
Binary files /dev/null and b/images/client-icons/fractal.png differ
diff --git a/images/client-icons/nheko.svg b/images/client-icons/nheko.svg
new file mode 100644
index 0000000..ce3ec40
--- /dev/null
+++ b/images/client-icons/nheko.svg
@@ -0,0 +1,155 @@
+
+
+
+
diff --git a/images/flathub-badge.svg b/images/flathub-badge.svg
new file mode 100644
index 0000000..ad3b04a
--- /dev/null
+++ b/images/flathub-badge.svg
@@ -0,0 +1,62 @@
+
+
+
\ No newline at end of file
diff --git a/src/open/clients/Fractal.js b/src/open/clients/Fractal.js
new file mode 100644
index 0000000..be51744
--- /dev/null
+++ b/src/open/clients/Fractal.js
@@ -0,0 +1,51 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import {Maturity, Platform, LinkKind, FlathubLink} from "../types.js";
+
+/**
+ * Information on how to deep link to a given matrix client.
+ */
+export class Fractal {
+ get id() { return "fractal"; }
+ getName(platform) { return "Fractal"; }
+ get icon() { return "images/client-icons/fractal.png"; }
+ get author() { return "Daniel Garcia Moreno"; }
+ get homepage() { return "https://gitlab.gnome.org/GNOME/fractal"; }
+ get platforms() { return [Platform.Linux]; }
+ get description() { return 'Fractal is a Matrix Client written in Rust'; }
+ getMaturity(platform) { return Maturity.Beta; }
+ getDeepLink(platform, link) {}
+ canInterceptMatrixToLinks(platform) { return false; }
+
+ getLinkInstructions(platform, link) {
+ if (link.kind === LinkKind.User || link.kind === LinkKind.Room) {
+ return "Click the '+' button in the top right and paste the identifier";
+ }
+ }
+
+ getCopyString(platform, link) {
+ if (link.kind === LinkKind.User || link.kind === LinkKind.Room) {
+ return link.identifier;
+ }
+ }
+
+ getInstallLinks(platform) {
+ if (platform === Platform.Linux) {
+ return [new FlathubLink("org.gnome.Fractal")];
+ }
+ }
+}
diff --git a/src/open/clients/Nheko.js b/src/open/clients/Nheko.js
new file mode 100644
index 0000000..064f6bd
--- /dev/null
+++ b/src/open/clients/Nheko.js
@@ -0,0 +1,53 @@
+/*
+Copyright 2020 The Matrix.org Foundation C.I.C.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import {Maturity, Platform, LinkKind, FlathubLink} from "../types.js";
+
+/**
+ * Information on how to deep link to a given matrix client.
+ */
+export class Nheko {
+ get id() { return "nheko"; }
+ getName(platform) { return "Nheko"; }
+ get icon() { return "images/client-icons/nheko.svg"; }
+ get author() { return "mujx, red_sky, deepbluev7, Konstantinos Sideris"; }
+ get homepage() { return "https://github.com/Nheko-Reborn/nheko"; }
+ get platforms() { return [Platform.Windows, Platform.macOS, Platform.Linux]; }
+ get description() { return 'A native desktop app for Matrix that feels more like a mainstream chat app.'; }
+ getMaturity(platform) { return Maturity.Beta; }
+ getDeepLink(platform, link) {}
+ canInterceptMatrixToLinks(platform) { return false; }
+
+ getLinkInstructions(platform, link) {
+ switch (link.kind) {
+ case LinkKind.User: return `Type /invite ${link.identifier}`;
+ case LinkKind.Room: return `Type /join ${link.identifier}`;
+ }
+ }
+
+ getCopyString(platform, link) {
+ switch (link.kind) {
+ case LinkKind.User: return `/invite ${link.identifier}`;
+ case LinkKind.Room: return `/join ${link.identifier}`;
+ }
+ }
+
+ getInstallLinks(platform) {
+ if (platform === Platform.Linux) {
+ return [new FlathubLink("io.github.NhekoReborn.Nheko")];
+ }
+ }
+}
diff --git a/src/open/types.js b/src/open/types.js
index 443d769..52472d6 100644
--- a/src/open/types.js
+++ b/src/open/types.js
@@ -74,6 +74,23 @@ export class FDroidLink {
}
}
+export class FlathubLink {
+ constructor(appId) {
+ this._appId = appId;
+ }
+
+ createInstallURL(link) {
+ return `https://flathub.org/apps/details/${encodeURIComponent(this._appId)}`;
+ }
+
+ get channelId() {
+ return "flathub";
+ }
+
+ get description() {
+ return "Get it on Flathub";
+ }
+}
export class WebsiteLink {
constructor(url) {
@@ -91,4 +108,4 @@ export class WebsiteLink {
get description() {
return `Download from ${new URL(this._url).hostname}`;
}
-}
\ No newline at end of file
+}