From 4375149e638eb1b0655aa38c4506b196ee11623f Mon Sep 17 00:00:00 2001 From: David Hill Date: Wed, 17 Dec 2025 11:43:04 +0000 Subject: [PATCH] wip: auto-detect OS and show desktop download button --- .../console/app/src/routes/download/index.tsx | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/packages/console/app/src/routes/download/index.tsx b/packages/console/app/src/routes/download/index.tsx index 7783a738a..d8d2b5bb0 100644 --- a/packages/console/app/src/routes/download/index.tsx +++ b/packages/console/app/src/routes/download/index.tsx @@ -8,6 +8,47 @@ import { Faq } from "~/component/faq" import desktopAppIcon from "../../asset/lander/opencode-desktop-icon.png" import { Legal } from "~/component/legal" import { config } from "~/config" +import { createSignal, onMount, Show, JSX } from "solid-js" + +type OS = "macOS" | "Windows" | "Linux" | null + +function detectOS(): OS { + if (typeof navigator === "undefined") return null + const platform = navigator.platform.toLowerCase() + const userAgent = navigator.userAgent.toLowerCase() + + if (platform.includes("mac") || userAgent.includes("mac")) return "macOS" + if (platform.includes("win") || userAgent.includes("win")) return "Windows" + if (platform.includes("linux") || userAgent.includes("linux")) return "Linux" + return null +} + +function getDownloadUrl(os: OS): string { + const base = "https://github.com/sst/opencode/releases/latest/download" + switch (os) { + case "macOS": + return `${base}/opencode-desktop-darwin-aarch64.dmg` + case "Windows": + return `${base}/opencode-desktop-windows-x64.exe` + case "Linux": + return `${base}/opencode-desktop-linux-amd64.deb` + default: + return `${base}/opencode-desktop-darwin-aarch64.dmg` + } +} + +function IconDownload(props: JSX.SvgSVGAttributes) { + return ( + + + + ) +} function CopyStatus() { return ( @@ -20,6 +61,12 @@ function CopyStatus() { export default function Download() { const downloadUrl = "https://github.com/sst/opencode/releases/latest/download" + const [detectedOS, setDetectedOS] = createSignal(null) + + onMount(() => { + setDetectedOS(detectOS()) + }) + const handleCopyClick = (command: string) => (event: Event) => { const button = event.currentTarget as HTMLButtonElement navigator.clipboard.writeText(command) @@ -44,6 +91,12 @@ export default function Download() {

Download OpenCode

Available in Beta for macOS, Windows, and Linux

+ + + + Download for {detectedOS()} + +