diff --git a/src/clients/Weechat.tsx b/src/clients/Weechat.tsx
index e88dc24506e5136f5a366c6fca258257609440d6..a29c150d3d41c36a31b2f7feb233c3b05d59b095 100644
--- a/src/clients/Weechat.tsx
+++ b/src/clients/Weechat.tsx
@@ -57,6 +57,17 @@ const Weechat: TextClient = {
                 return <span>Weechat doesn't support this kind of link</span>;
         }
     },
+    copyString: (link) => {
+        switch (link.kind) {
+            case LinkKind.Alias:
+            case LinkKind.RoomId:
+                return `/join ${link.identifier}`;
+            case LinkKind.UserId:
+                return `/invite ${link.identifier}`;
+            default:
+                return '';
+        }
+    },
     description: 'Commandline Matrix interface using Weechat',
 };
 
diff --git a/src/clients/types.ts b/src/clients/types.ts
index 2df503be8c9d45d782b437c51e7b737679673c51..cdaed2785dd5ce19106ca277e3ff99bf940fa9e7 100644
--- a/src/clients/types.ts
+++ b/src/clients/types.ts
@@ -81,6 +81,7 @@ export interface LinkedClient extends ClientDescription {
 export interface TextClient extends ClientDescription {
     kind: ClientKind.TEXT_CLIENT;
     toInviteString(parsedLink: SafeLink): JSX.Element;
+    copyString(parsedLink: SafeLink): string;
 }
 
 /*
diff --git a/src/components/ClientTile.tsx b/src/components/ClientTile.tsx
index 7644782c187f1500c598c4dbb63623cafdbf6c6b..ba3e57d24dd926a186271016d5853952a3be0bde 100644
--- a/src/components/ClientTile.tsx
+++ b/src/components/ClientTile.tsx
@@ -42,7 +42,16 @@ const ClientTile: React.FC<IProps> = ({ client, link }: IProps) => {
     const inviteButton =
         client.kind === ClientKind.LINKED_CLIENT ? (
             <Button>Accept invite</Button>
-        ) : null;
+        ) : (
+            <Button
+                onClick={() =>
+                    navigator.clipboard.writeText(client.copyString(link))
+                }
+                flashChildren="Invite copied"
+            >
+                Copy invite
+            </Button>
+        );
 
     let clientTile = (
         <Tile className={className}>
diff --git a/src/components/InviteTile.tsx b/src/components/InviteTile.tsx
index 1311f9f39710d9c8f1b79c03123aea77a51740c1..a35b2c7472140166d894796c8184b6fea2965fea 100644
--- a/src/components/InviteTile.tsx
+++ b/src/components/InviteTile.tsx
@@ -61,6 +61,7 @@ const InviteTile: React.FC<IProps> = ({ children, client, link }: IProps) => {
             case ClientKind.TEXT_CLIENT:
                 // TODO: copy to clipboard
                 invite = <p>{client.toInviteString(link)}</p>;
+                navigator.clipboard.writeText(client.copyString(link));
                 inviteUseString = `These are instructions for ${client.name}.`;
                 break;
         }