diff --git a/crates/core/src/catalog.rs b/crates/core/src/catalog.rs
--- a/crates/core/src/catalog.rs
+++ b/crates/core/src/catalog.rs
@@ -164,7 +164,7 @@ pub const SOCIAL: [(&str, &str); 5] = [
 ];
 
 /// The ArtCraft community on Discord.
-pub const DISCORD_URL: &str = "https://discord.gg/artcraft";
+pub const DISCORD_URL: &str = "https://discord.com/invite/artcraft";
 /// Deep link into the Discord application for the ArtCraft server invite.
 pub const DISCORD_APP_URL: &str = "discord://-/invite/artcraft";
 
diff --git a/crates/native/src/process.rs b/crates/native/src/process.rs
--- a/crates/native/src/process.rs
+++ b/crates/native/src/process.rs
@@ -185,10 +185,10 @@ pub fn is_discord_installed() -> bool {
     DISCORD_HANDLER_DETECTED.load(Ordering::Relaxed)
 }
 
-/// The URL to use for Discord links: deep-links to the app if a handler is registered,
-/// else the web invite. Non-blocking (detection runs in the background).
+/// The URL to use for Discord links. Use the web invite because some Linux handlers
+/// misinterpret Discord's custom URI scheme as an HTTP URL.
 pub fn discord_url() -> &'static str {
-    if is_discord_installed() { artcraft_launcher_core::catalog::DISCORD_APP_URL } else { artcraft_launcher_core::catalog::DISCORD_URL }
+    artcraft_launcher_core::catalog::DISCORD_URL
 }
 
 #[cfg(windows)]
@@ -644,10 +644,9 @@ mod discord_tests {
     }
 
     #[test]
-    fn discord_url_gives_app_or_web_url() {
-        use artcraft_launcher_core::catalog::{DISCORD_APP_URL, DISCORD_URL};
-        let url = discord_url();
-        assert!(url == DISCORD_URL || url == DISCORD_APP_URL);
+    fn discord_url_uses_web_invite() {
+        use artcraft_launcher_core::catalog::DISCORD_URL;
+        assert_eq!(discord_url(), DISCORD_URL);
     }
 }
 
diff --git a/crates/ui-egui/tests/ui.rs b/crates/ui-egui/tests/ui.rs
--- a/crates/ui-egui/tests/ui.rs
+++ b/crates/ui-egui/tests/ui.rs
@@ -1283,7 +1283,7 @@ fn all_opened(h: &mut Harness<'_, Option<LauncherUi>>, label: &str) -> Vec<Strin
 fn links_open_the_right_pages() {
     let (mut h, _) = harness(ViewMode::Grid, egui::Theme::Dark, true);
     h.run_steps(6);
-    assert_eq!(click_opens(&mut h, "Discord").as_deref(), Some("https://discord.gg/artcraft"));
+    assert_eq!(click_opens(&mut h, "Discord").as_deref(), Some("https://discord.com/invite/artcraft"));
     // The footer's ArtCraft links and each card's own pages.
     let github = all_opened(&mut h, "GitHub");
     assert!(github.contains(&"https://github.com/storytold".to_string()), "{github:?}");
@@ -1338,10 +1338,10 @@ fn hostile_release_asset_urls_never_reach_the_opener() {
 }
 
 #[test]
-fn discord_link_opens_app_when_discord_is_installed() {
-    let (mut h, _) = harness_with_discord(Some(artcraft_launcher_core::catalog::DISCORD_APP_URL));
+fn discord_link_uses_the_host_web_invite() {
+    let (mut h, _) = harness_with_discord(Some(artcraft_launcher_core::catalog::DISCORD_URL));
     h.run_steps(6);
-    assert_eq!(click_opens(&mut h, "Discord").as_deref(), Some("discord://-/invite/artcraft"));
+    assert_eq!(click_opens(&mut h, "Discord").as_deref(), Some("https://discord.com/invite/artcraft"));
 }
 
 #[test]
