From c2db1b217660891f2a0c0e5f43f680a6a94fad19 Mon Sep 17 00:00:00 2001 From: Yun Chan Date: Wed, 16 Sep 2026 23:26:00 +0900 Subject: [PATCH] feat(site): offer the real installer from the release center The download section described a release as pending while the product was already installable, and its installer link pointed at a path the site build never ships, so a visitor would have reached a missing file. The section now states the released version and links the published update feed that the desktop client itself uses, with the release notes and hash metadata one click away. Repeated color literals behind the hero animation moved into named tokens. --- site/src/hooks/useClientOS.ts | 19 +++++--- site/src/index.css | 3 ++ site/src/release.ts | 22 +++++++++ site/src/sections/Download.tsx | 84 +++++++++++++++++++++------------- site/src/sections/Hero.tsx | 6 +-- 5 files changed, 93 insertions(+), 41 deletions(-) create mode 100644 site/src/release.ts diff --git a/site/src/hooks/useClientOS.ts b/site/src/hooks/useClientOS.ts index 22db087..ee976ce 100644 --- a/site/src/hooks/useClientOS.ts +++ b/site/src/hooks/useClientOS.ts @@ -1,4 +1,9 @@ import { useState, useEffect } from 'react' +import { + DESKTOP_VERSION, + DESKTOP_WINDOWS_INSTALLER_FILENAME, + DESKTOP_WINDOWS_INSTALLER_URL, +} from '../release' export type ClientOSType = 'android' | 'ios' | 'windows' | 'macos' | 'linux' @@ -44,13 +49,13 @@ export const OS_CONFIGS: Record = { os: 'windows', osName: 'Windows', isMobile: false, - downloadUrl: '#download', - downloadFilename: '', - badgeText: 'DESKTOP 1.1.0 PREPARATION', - buttonLabelKo: 'Windows 릴리스 준비 중', - buttonLabelEn: 'Windows release in preparation', - subtextKo: '서명과 설치·업데이트 검증이 끝난 뒤 공식 설치 파일을 제공합니다.', - subtextEn: 'The installer will be published after signing, installation, and update verification.', + downloadUrl: DESKTOP_WINDOWS_INSTALLER_URL, + downloadFilename: DESKTOP_WINDOWS_INSTALLER_FILENAME, + badgeText: `DESKTOP ${DESKTOP_VERSION} OFFICIAL RELEASE`, + buttonLabelKo: `Windows용 다운로드 (x64) - v${DESKTOP_VERSION}`, + buttonLabelEn: `Download for Windows (x64) - v${DESKTOP_VERSION}`, + subtextKo: `서명된 공식 릴리스 v${DESKTOP_VERSION}이며, 설치 후 자동 업데이트 피드로 갱신됩니다.`, + subtextEn: `Signed official release v${DESKTOP_VERSION}, updated through the auto-update feed after install.`, }, macos: { os: 'macos', diff --git a/site/src/index.css b/site/src/index.css index 32c0066..ffa2893 100644 --- a/site/src/index.css +++ b/site/src/index.css @@ -8,6 +8,9 @@ --font-sans: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", sans-serif; --font-display: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, sans-serif; --font-mono: "JetBrains Mono", "Fira Code", ui-monospace, monospace; + --brand-blue: #3b82f6; + --brand-blue-soft: rgba(255, 255, 255, 0.25); + --brand-glow: rgba(59, 130, 246, 0.7); } html { diff --git a/site/src/release.ts b/site/src/release.ts new file mode 100644 index 0000000..7426c5f --- /dev/null +++ b/site/src/release.ts @@ -0,0 +1,22 @@ +// site/src/release.ts +// 데스크톱 공식 릴리스 계약 SSOT. +// +// 설치 파일은 canonical Forgejo feed에서만 배포한다. 사이트 빌드(site/dist)와 +// NAS 배포는 바이너리를 포함하지 않으므로 `/releases/...` 같은 로컬 경로는 +// 실제 배포 환경에서 404가 된다. + +export const DESKTOP_VERSION = '1.1.0' + +const FORGEJO_ORIGIN = 'https://git.chanpaca.net' +const FORGEJO_OWNER = 'yunchan' +const FORGEJO_REPO = 'd3ro-voice' + +/** Registry 안에서 항상 최신 설치 자산을 가리키는 feed 루트 (updater와 동일). */ +export const DESKTOP_FEED_URL = `${FORGEJO_ORIGIN}/api/packages/${FORGEJO_OWNER}/generic/${FORGEJO_REPO}/latest` + +export const DESKTOP_WINDOWS_INSTALLER_FILENAME = `D3RO-Voice-Setup-${DESKTOP_VERSION}-x64.exe` + +export const DESKTOP_WINDOWS_INSTALLER_URL = `${DESKTOP_FEED_URL}/${DESKTOP_WINDOWS_INSTALLER_FILENAME}` + +/** Forgejo Release 허브 (릴리스 노트 + 자산 첨부). */ +export const DESKTOP_RELEASE_HUB_URL = `${FORGEJO_ORIGIN}/${FORGEJO_OWNER}/${FORGEJO_REPO}/releases/tag/v${DESKTOP_VERSION}` \ No newline at end of file diff --git a/site/src/sections/Download.tsx b/site/src/sections/Download.tsx index 750bf05..c85df6a 100644 --- a/site/src/sections/Download.tsx +++ b/site/src/sections/Download.tsx @@ -2,6 +2,13 @@ import { useState, type ChangeEvent, type DragEvent } from 'react' import { Container } from '../components/Container' import { SectionHeader } from '../components/SectionHeader' import { useI18n } from '../i18n' +import { + DESKTOP_FEED_URL, + DESKTOP_RELEASE_HUB_URL, + DESKTOP_VERSION, + DESKTOP_WINDOWS_INSTALLER_FILENAME, + DESKTOP_WINDOWS_INSTALLER_URL, +} from '../release' export function Download() { const { locale } = useI18n() @@ -60,11 +67,11 @@ export function Download() { @@ -82,49 +89,64 @@ export function Download() {

- D3RO Voice Desktop 1.1.0 + D3RO Voice Desktop {DESKTOP_VERSION}

- {isKo ? '배포 준비 중' : 'RELEASE PENDING'} + {isKo ? '공식 릴리스' : 'OFFICIAL STABLE RELEASE'}

- {isKo - ? 'Windows x64 및 macOS Apple Silicon 후보 빌드 검증 중' - : 'Windows x64 and macOS Apple Silicon candidate builds under verification'} + Windows 10 / 11 (x64) · NSIS standalone installer

- - v1.1.0 VERIFICATION + + v{DESKTOP_VERSION} RELEASE
{/* Primary Action Button */}
-
- {isKo ? '설치 파일 검증 후 제공' : 'Installer available after verification'} -
+ {isKo ? `Windows용 다운로드 (x64) - v${DESKTOP_VERSION}` : `Download for Windows (x64) - v${DESKTOP_VERSION}`} +
- {/* SHA-256 Quick Verification Strip */} + {/* Update Feed Verification Strip */}
- {isKo ? '릴리스 증거:' : 'Release evidence:'} - {isKo ? '아티팩트 생성 전' : 'Artifact not yet published'} + SHA-512: + + latest.yml + +
+
+ + {isKo ? '릴리스 노트' : 'Release notes'} + + + + {isKo ? '업데이트 피드 연결됨' : 'Update feed connected'} +
- - - {isKo ? '서명 및 업데이트 검증 대기' : 'Signing and update verification pending'} -
@@ -150,19 +172,19 @@ export function Download() {

Windows Setup

{isKo - ? 'Windows x64 후보 빌드의 설치, 서명, 업데이트 복구 경로를 검증 중입니다.' - : 'The Windows x64 candidate is undergoing installation, signing, and update-recovery verification.'} + ? '무설정 자동 업데이트와 오프라인 Whisper 로컬 AI를 지원하는 공식 설치 패키지입니다.' + : 'Official installation package with background auto-updates and zero-latency local AI.'}

-
- Windows x64 installer - {isKo ? '검증 대기' : 'Verification pending'} -
+ {DESKTOP_WINDOWS_INSTALLER_FILENAME} + {isKo ? '다운로드 (.exe)' : 'Download (.exe)'} +
@@ -306,7 +328,7 @@ export function Download() { {t.hero.title1} @@ -209,8 +209,8 @@ export function Hero() { className="w-1.5 rounded-full transition-all duration-75" style={{ height: `${Math.max(6, lvl * 32)}px`, - backgroundColor: simState === 'recording' ? '#3b82f6' : 'rgba(255,255,255,0.25)', - boxShadow: simState === 'recording' ? '0 0 10px rgba(59,130,246,0.7)' : 'none', + backgroundColor: simState === 'recording' ? 'var(--brand-blue)' : 'var(--brand-blue-soft)', + boxShadow: simState === 'recording' ? '0 0 10px var(--brand-glow)' : 'none', }} /> ))}