diff --git a/electron/index.js b/electron/index.js
index c73564965..ec7cc01d1 100644
--- a/electron/index.js
+++ b/electron/index.js
@@ -45,9 +45,15 @@ let daemon;
 let lbryFirst;
 
 const appState = {};
+const PROTOCOL = 'lbry';
 
-if (process.platform !== 'linux') {
-  app.setAsDefaultProtocolClient('lbry');
+if (isDev && process.platform === 'win32') {
+  // Setting this is required to get this working in dev mode.
+  app.setAsDefaultProtocolClient(PROTOCOL, process.execPath, [
+    path.resolve(process.argv[1]),
+  ]);
+} else {
+  app.setAsDefaultProtocolClient(PROTOCOL);
 }
 
 app.name = 'LBRY';
@@ -149,9 +155,15 @@ if (!gotSingleInstanceLock) {
   app.on('second-instance', (event, argv) => {
     // Send the url to the app to navigate first, then focus
     if (rendererWindow) {
-      if ((process.platform === 'win32' || process.platform === 'linux') && String(argv[1]).startsWith('lbry')) {
-        let URI = argv[1];
-
+      // External uri (last item on argv):
+      const EXTERNAL_URI = (argv.length) ? argv[argv.length - 1] : '';
+      // Handle protocol requests for windows and linux
+      const platforms = (process.platform === 'win32' || process.platform === 'linux');
+      // Is LBRY protocol
+      const isProtocolURI = String(EXTERNAL_URI).startsWith(PROTOCOL + '://');
+      // External protocol requested:
+      if (platforms  && isProtocolURI) {
+        let URI = EXTERNAL_URI;
         // Keep only command line / deep linked arguments
         // Windows normalizes URIs when they're passed in from other apps. On Windows, this tries to
         // restore the original URI that was typed.
diff --git a/static/app-strings.json b/static/app-strings.json
index 654782b45..6d17868dc 100644
--- a/static/app-strings.json
+++ b/static/app-strings.json
@@ -2058,14 +2058,15 @@
   "Only select creators can receive tips at this time": "Only select creators can receive tips at this time",
   "The payment will be made from your saved card": "The payment will be made from your saved card",
   "Commenting...": "Commenting...",
-  "Show %count% replies": "Show %count% replies",
-  "Show reply": "Show reply",
   "added to": "added to",
   "removed from": "removed from",
   "Skip Navigation": "Skip Navigation",
   "Reset": "Reset",
   "Reset to original (previous) publish date": "Reset to original (previous) publish date",
   "Search for something...": "Search for something...",
+  "Open in Desktop": "Open in Desktop",
+  "Show %count% replies": "Show %count% replies",
+  "Show reply": "Show reply",
   "Confirm Comment Deletion": "Confirm Comment Deletion",
   "Remove Comment": "Remove Comment",
   "Are you sure you want to remove this comment?": "Are you sure you want to remove this comment?",
diff --git a/ui/component/claimMenuList/view.jsx b/ui/component/claimMenuList/view.jsx
index 2a9d930a6..0ca12126e 100644
--- a/ui/component/claimMenuList/view.jsx
+++ b/ui/component/claimMenuList/view.jsx
@@ -9,6 +9,7 @@ import { Menu, MenuButton, MenuList, MenuItem } from '@reach/menu-button';
 import Icon from 'component/common/icon';
 import { generateShareUrl, generateRssUrl, generateLbryContentUrl } from 'util/url';
 import { useHistory } from 'react-router';
+import { useIsMobile } from 'effects/use-screensize';
 import { buildURI, parseURI, COLLECTIONS_CONSTS } from 'lbry-redux';
 
 const SHARE_DOMAIN = SHARE_DOMAIN_URL || URL;
@@ -94,6 +95,7 @@ function ClaimMenuList(props: Props) {
     editedCollection,
     isAuthenticated,
   } = props;
+  const isMobile = useIsMobile();
   const incognitoClaim = contentChannelUri && !contentChannelUri.includes('@');
   const isChannel = !incognitoClaim && !contentSigningChannel;
   const { channelName } = parseURI(contentChannelUri);
@@ -229,6 +231,10 @@ function ClaimMenuList(props: Props) {
     push(`/$/${PAGES.REPORT_CONTENT}?claimId=${contentClaim && contentClaim.claim_id}`);
   }
 
+  function handleOpenInDesktop() {
+    window.open(claim.permanent_url, '_top');
+  }
+
   return (
     <Menu>
       <MenuButton
@@ -410,6 +416,15 @@ function ClaimMenuList(props: Props) {
           </MenuItem>
         )}
 
+        {IS_WEB && !isMobile && (
+          <MenuItem className="comment__menu-option" onSelect={handleOpenInDesktop}>
+            <div className="menu__link">
+              <Icon aria-hidden icon={ICONS.DESKTOP} />
+              {__('Open in Desktop')}
+            </div>
+          </MenuItem>
+        )}
+
         {!claimIsMine && !isMyCollection && (
           <MenuItem className="comment__menu-option" onSelect={handleReportContent}>
             <div className="menu__link">
diff --git a/ui/component/common/icon-custom.jsx b/ui/component/common/icon-custom.jsx
index 27bcf99fb..a9dd7df43 100644
--- a/ui/component/common/icon-custom.jsx
+++ b/ui/component/common/icon-custom.jsx
@@ -2331,4 +2331,11 @@ export const icons = {
       <path d="M4.954 14.753l3.535 3.535-1.768 1.768-3.535-3.535z" />
     </g>
   ),
+  [ICONS.DESKTOP]: buildIcon(
+    <g>
+      <rect x="2" y="3" width="20" height="14" rx="2" ry="2" />
+      <line x1="8" y1="21" x2="16" y2="21" />
+      <line x1="12" y1="17" x2="12" y2="21" />
+    </g>
+  ),
 };
diff --git a/ui/component/fileActions/view.jsx b/ui/component/fileActions/view.jsx
index 5ce189b7b..a2e32dc31 100644
--- a/ui/component/fileActions/view.jsx
+++ b/ui/component/fileActions/view.jsx
@@ -113,6 +113,10 @@ function FileActions(props: Props) {
     }
   }
 
+  function handleOpenInDesktop() {
+    window.open(claim.permanent_url, '_top');
+  }
+
   const lhsSection = (
     <>
       {ENABLE_FILE_REACTIONS && !reactionsDisabled && <FileReactions uri={uri} livestream={isLivestreamClaim} />}
@@ -188,6 +192,14 @@ function FileActions(props: Props) {
               </MenuItem>
             )}
             {/* @endif */}
+            {IS_WEB && !isMobile && (
+              <MenuItem className="comment__menu-option" onSelect={handleOpenInDesktop}>
+                <div className="menu__link">
+                  <Icon aria-hidden icon={ICONS.DESKTOP} />
+                  {__('Open in Desktop')}
+                </div>
+              </MenuItem>
+            )}
             {!claimIsMine && (
               <MenuItem
                 className="comment__menu-option"
diff --git a/ui/constants/icons.js b/ui/constants/icons.js
index db057e8f1..2613fe156 100644
--- a/ui/constants/icons.js
+++ b/ui/constants/icons.js
@@ -165,3 +165,4 @@ export const GLOBE = 'globe';
 export const RSS = 'rss';
 export const STAR = 'star';
 export const MUSIC = 'MusicCategory';
+export const DESKTOP = 'desktop';