diff --git a/apps/native/src/components/widget/settings/general-tab.test.tsx b/apps/native/src/components/widget/settings/general-tab.test.tsx
new file mode 100644
index 00000000..09b32a51
--- /dev/null
+++ b/apps/native/src/components/widget/settings/general-tab.test.tsx
@@ -0,0 +1,58 @@
+import { fireEvent, render, screen } from "@testing-library/react";
+import { open } from "@tauri-apps/plugin-shell";
+import { describe, expect, it, vi } from "vitest";
+import { GeneralTab } from "./general-tab";
+
+vi.mock("@tauri-apps/api/app", () => ({
+ getVersion: vi.fn().mockResolvedValue("0.0.0-test"),
+}));
+
+vi.mock("@tauri-apps/plugin-shell", () => ({
+ open: vi.fn().mockResolvedValue(undefined),
+}));
+
+vi.mock("@/components/widget/controls/directory-picker", () => ({
+ DirectoryPicker: ({ label }: { label: string }) =>
{label}
,
+}));
+
+vi.mock("@/components/widget/controls/bootstrap-config", () => ({
+ BootstrapConfig: ({ label }: { label: string }) => {label}
,
+}));
+
+vi.mock("@/tauri-api", () => ({
+ darwinAPI: {
+ ui: {
+ setPrefs: vi.fn().mockResolvedValue(undefined),
+ },
+ },
+}));
+
+const sendDiagnosticsField = {
+ state: { value: false },
+ handleChange: vi.fn(),
+};
+
+describe("GeneralTab", () => {
+ it("opens the Support Nixmac page from settings", async () => {
+ render(
+ ,
+ );
+
+ await screen.findByText("0.0.0-test");
+ expect(screen.getByText("Support Nixmac")).toBeInTheDocument();
+ expect(screen.getByText("Help fund continued development.")).toBeInTheDocument();
+
+ fireEvent.click(screen.getByRole("button", { name: "Open Support Nixmac" }));
+
+ expect(open).toHaveBeenCalledWith("https://nixmac.com/support");
+ });
+});
diff --git a/apps/native/src/components/widget/settings/general-tab.tsx b/apps/native/src/components/widget/settings/general-tab.tsx
index 722b2782..787eee58 100644
--- a/apps/native/src/components/widget/settings/general-tab.tsx
+++ b/apps/native/src/components/widget/settings/general-tab.tsx
@@ -13,8 +13,9 @@ import { getWebSiteUrl } from "@/lib/env";
import { useWidgetStore } from "@/stores/widget-store";
import { darwinAPI } from "@/tauri-api";
import { getVersion } from "@tauri-apps/api/app";
-import { open } from '@tauri-apps/plugin-shell';
+import { open } from "@tauri-apps/plugin-shell";
import type { AnyFieldApi } from "@tanstack/react-form";
+import { ExternalLink } from "lucide-react";
import { useEffect, useRef, useState } from "react";
interface GeneralTabProps {
@@ -29,6 +30,18 @@ interface GeneralTabProps {
sendDiagnosticsField: AnyFieldApi;
}
+// Support should always land on the public website, even in local app builds.
+const SUPPORT_NIXMAC_URL = "https://nixmac.com/support";
+
+async function openExternalUrl(url: string) {
+ try {
+ await open(url);
+ } catch (error) {
+ console.warn("Failed to open external URL with Tauri shell; falling back to browser window.", error);
+ window.open(url, "_blank");
+ }
+}
+
export function GeneralTab({
configDir,
hasFlake,
@@ -87,15 +100,9 @@ export function GeneralTab({
+
+
+
Support Nixmac
+
+ Help fund continued development.
+
+
+
+
+