feat(release): prepare 1.1.0 candidate

This commit is contained in:
Yun Chan 2026-08-29 18:33:45 +09:00
parent 5a34f66981
commit 5205dcdfa9
736 changed files with 115667 additions and 12203 deletions

View file

@ -1,42 +1,17 @@
import { useState, useEffect, type ChangeEvent, type DragEvent } from 'react'
import { useState, type ChangeEvent, type DragEvent } from 'react'
import { Container } from '../components/Container'
import { SectionHeader } from '../components/SectionHeader'
import { Led } from '../components/Led'
import { useI18n } from '../i18n'
const OFFICIAL_HASH = 'b0ac051443151a2e34e8192f1fcf795586bbafca6eb21f01a79170c079a53ba2'
export function Download() {
const { locale } = useI18n()
const isKo = locale === 'ko'
const [detectedOs, setDetectedOs] = useState<'windows' | 'mac' | 'linux'>('windows')
const [copied, setCopied] = useState(false)
const [verifyStatus, setVerifyStatus] = useState<'idle' | 'computing' | 'match' | 'custom'>('idle')
const [verifyStatus, setVerifyStatus] = useState<'idle' | 'computing' | 'custom'>('idle')
const [computedHash, setComputedHash] = useState('')
const [fileName, setFileName] = useState('')
const [isDragOver, setIsDragOver] = useState(false)
useEffect(() => {
if (typeof window !== 'undefined') {
const ua = window.navigator.userAgent.toLowerCase()
if (ua.includes('mac') || ua.includes('darwin')) {
setDetectedOs('mac')
} else if (ua.includes('linux')) {
setDetectedOs('linux')
} else {
setDetectedOs('windows')
}
}
}, [])
const copyHash = (hash: string) => {
navigator.clipboard.writeText(hash).then(() => {
setCopied(true)
setTimeout(() => setCopied(false), 2000)
})
}
const computeFileHash = async (file: File) => {
setFileName(`${file.name} (${(file.size / (1024 * 1024)).toFixed(1)} MB)`)
setVerifyStatus('computing')
@ -48,11 +23,7 @@ export function Download() {
const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')
setComputedHash(hashHex)
if (hashHex.toLowerCase() === OFFICIAL_HASH.toLowerCase()) {
setVerifyStatus('match')
} else {
setVerifyStatus('custom')
}
setVerifyStatus('custom')
} catch {
setVerifyStatus('custom')
}
@ -85,287 +56,238 @@ export function Download() {
}
return (
<section id="download" className="py-24 md:py-32 bg-surface-900/60 border-t border-white/[0.04] relative">
<section id="download" className="py-20 md:py-28 bg-surface-900/60 border-t border-white/[0.04] relative">
<Container>
<SectionHeader
index="06 / DOWNLOAD"
title={isKo ? 'D3RO Voice 다운로드 및 배포 센터' : 'Download D3RO Voice Desktop'}
title={isKo ? 'D3RO Voice 릴리스 준비 센터' : 'D3RO Voice Release Preparation'}
subtitle={
isKo
? '100% 로컬 Whisper 전사 엔진과 AI 음성 비서를 데스크톱에 무료로 설치하세요. 클라우드 전송 없이 프라이버시가 완벽히 보장됩니다.'
: 'Zero-latency on-device speech assistant with offline Whisper model. Instant installation for Windows, macOS, and private servers.'
? '다음 안정 버전 1.1.0의 설치 파일, 서명, 업데이트 경로를 검증하고 있습니다. 검증이 끝나기 전에는 바이너리를 제공하지 않습니다.'
: 'Version 1.1.0 installers, signatures, and update paths are being verified. No binary is offered before verification completes.'
}
/>
{/* Primary Recommended OS Download Card */}
<div className="max-w-3xl mx-auto mb-16 p-8 md:p-10 rounded-2xl bg-surface-800/90 border border-brand-amber/40 shadow-glow-md relative overflow-hidden backdrop-blur-md">
<div className="absolute top-0 right-0 w-64 h-64 bg-brand-amber/10 rounded-full blur-3xl pointer-events-none" />
<div className="max-w-3xl mx-auto mb-16 p-7 md:p-9 rounded-3xl bg-surface-800/90 border border-brand-blue/40 shadow-glow-md relative overflow-hidden backdrop-blur-2xl noise-texture">
<div className="absolute top-0 right-0 w-64 h-64 bg-brand-blue/10 rounded-full blur-3xl pointer-events-none" />
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-6 mb-8">
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-6 mb-7">
<div className="flex items-center gap-4">
<div className="w-14 h-14 rounded-xl bg-brand-amber/15 border border-brand-amber/30 flex items-center justify-center text-brand-amber shadow-sm">
<svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<div className="w-13 h-13 rounded-2xl bg-brand-blue/15 border border-brand-blue/30 flex items-center justify-center text-brand-blue shadow-sm p-3">
<svg width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5">
<path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
</svg>
</div>
<div>
<div className="flex items-center gap-2 mb-1">
<h3 className="font-display text-xl font-bold text-neutral-100">
{detectedOs === 'mac' ? 'macOS Apple Silicon' : 'Windows 64-bit Installer'}
<div className="flex items-center gap-2.5 mb-1">
<h3 className="text-xl sm:text-2xl font-medium text-neutral-50">
D3RO Voice Desktop 1.1.0
</h3>
<span className="px-2 py-0.5 rounded-full text-[10px] font-mono font-bold bg-emerald-500/20 text-emerald-400 border border-emerald-500/30">
{isKo ? '추천 빌드' : 'RECOMMENDED'}
<span className="px-2.5 py-0.5 rounded-full text-xs font-medium bg-emerald-500/20 text-emerald-300 border border-emerald-500/35">
{isKo ? '배포 준비 중' : 'RELEASE PENDING'}
</span>
</div>
<p className="font-mono text-xs text-neutral-400">
{detectedOs === 'mac'
? 'D3RO-Voice-1.0.0-arm64.dmg · 98 MB · Metal Hardware Accel'
: 'D3RO-Voice-Setup-1.0.0-x64.exe · 102 MB · NSIS Installer'}
<p className="text-xs sm:text-sm text-neutral-300 font-normal">
{isKo
? 'Windows x64 및 macOS Apple Silicon 후보 빌드 검증 중'
: 'Windows x64 and macOS Apple Silicon candidate builds under verification'}
</p>
</div>
</div>
<div className="flex items-center gap-2">
<Led color="green" pulse />
<span className="font-mono text-xs text-neutral-400">v1.0.0 STABLE</span>
<div className="flex items-center gap-2 bg-surface-700/80 px-3 py-1 rounded-full border border-white/10">
<span className="w-2 h-2 rounded-full bg-amber-400" />
<span className="text-xs font-medium text-neutral-200">v1.1.0 VERIFICATION</span>
</div>
</div>
{/* Primary Action Button */}
<div className="mb-6">
<a
href={
detectedOs === 'mac'
? 'https://git.chanpaca.net/yunchan/d3ro-voice/releases'
: 'https://git.chanpaca.net/attachments/c281a224-2538-496a-bf74-bc188938c734'
}
download={detectedOs === 'mac' ? undefined : 'D3RO-Voice-Setup-1.0.0-x64.exe'}
className="w-full py-4 px-8 rounded-xl bg-brand-amber hover:bg-brand-amber-light text-white font-mono text-sm font-bold uppercase tracking-wider flex items-center justify-center gap-3 shadow-glow-sm hover:shadow-glow-md transition-all active:scale-[0.99]"
<div className="mb-5">
<div
aria-disabled="true"
className="w-full py-4.5 sm:py-5 px-8 sm:px-10 rounded-2xl bg-surface-700 text-neutral-300 text-base sm:text-lg font-medium flex items-center justify-center gap-3 leading-normal border border-white/10 cursor-not-allowed"
>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5">
<path d="M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4" />
</svg>
<span>
{detectedOs === 'mac'
? isKo
? 'macOS용 다운로드 (v1.0.0 DMG)'
: 'Download for macOS (v1.0.0)'
: isKo
? 'Windows용 다운로드 (v1.0.0 NSIS)'
: 'Download for Windows (v1.0.0)'}
</span>
</a>
<span>{isKo ? '설치 파일 검증 후 제공' : 'Installer available after verification'}</span>
</div>
</div>
{/* SHA-256 Quick Verification Strip */}
<div className="pt-4 border-t border-white/[0.08] flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 text-xs">
<div className="flex items-center gap-2 font-mono text-neutral-400">
<span>SHA-256:</span>
<span className="text-neutral-200 truncate max-w-[280px]">b0ac051443151a2e34e8192f1fcf7955...</span>
<button
type="button"
onClick={() => copyHash(OFFICIAL_HASH)}
className="text-brand-amber hover:text-brand-amber-light underline font-sans text-xs ml-1"
>
{copied ? (isKo ? '복사됨!' : 'Copied!') : isKo ? '복사' : 'Copy'}
</button>
<div className="pt-3.5 border-t border-white/10 flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 text-xs">
<div className="flex items-center gap-2 text-neutral-300">
<span className="font-medium text-neutral-400">{isKo ? '릴리스 증거:' : 'Release evidence:'}</span>
<span className="text-neutral-200">{isKo ? '아티팩트 생성 전' : 'Artifact not yet published'}</span>
</div>
<span className="font-mono text-[11px] text-emerald-400 flex items-center gap-1.5">
<span className="w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse" />
{isKo ? '코드 서명 및 무결성 검증 완료' : 'Signed & Verified'}
<span className="text-xs text-amber-300 font-medium flex items-center gap-1.5">
<span className="w-2 h-2 rounded-full bg-amber-400" />
{isKo ? '서명 및 업데이트 검증 대기' : 'Signing and update verification pending'}
</span>
</div>
</div>
{/* All Platform Packages Bento Grid */}
<div className="mb-20">
<div className="flex items-center justify-between mb-6">
<h3 className="font-display text-lg font-bold text-neutral-200">
<div className="mb-16">
<div className="flex items-center justify-between mb-5">
<h3 className="text-xl font-medium text-neutral-100">
{isKo ? '전체 플랫폼 설치 패키지' : 'All Platform Packages'}
</h3>
<span className="font-mono text-xs text-neutral-500">Auto-Update Feed: latest.yml Active</span>
<span className="text-xs text-neutral-400 font-normal">
{isKo ? '자동 업데이트: 서명된 피드 검증 후 활성화' : 'Auto-update: activates after signed feed verification'}
</span>
</div>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Windows Package */}
<div className="p-6 rounded-xl bg-surface-800/60 border border-white/[0.06] hover:border-brand-amber/30 transition-all flex flex-col justify-between">
<div className="p-6 rounded-2xl bg-surface-800/80 border border-white/10 hover:border-brand-blue/40 shadow-glass-card backdrop-blur-xl transition-all flex flex-col justify-between">
<div>
<div className="flex items-center justify-between mb-3">
<span className="font-mono text-xs font-semibold text-brand-amber">WINDOWS 10 / 11</span>
<span className="font-mono text-[10px] text-neutral-500">x64</span>
<span className="text-xs font-medium text-brand-blue">WINDOWS 10 / 11</span>
<span className="font-mono text-xs text-neutral-400">x64</span>
</div>
<h4 className="font-display text-base font-bold text-neutral-100 mb-1">Windows Setup</h4>
<p className="text-xs text-neutral-400 mb-6 leading-relaxed">
<h4 className="text-lg font-medium text-neutral-50 mb-1.5">Windows Setup</h4>
<p className="text-xs sm:text-sm text-neutral-300 mb-5 leading-relaxed font-normal">
{isKo
? '원클릭 NSIS 설치 프로그램. 백그라운드 자동 업데이트 및 DirectML GPU 가속 지원.'
: 'One-click installer with automatic background delta updates and DirectML acceleration.'}
? 'Windows x64 후보 빌드의 설치, 서명, 업데이트 복구 경로를 검증 중입니다.'
: 'The Windows x64 candidate is undergoing installation, signing, and update-recovery verification.'}
</p>
</div>
<div className="space-y-2">
<a
href="https://git.chanpaca.net/attachments/c281a224-2538-496a-bf74-bc188938c734"
download="D3RO-Voice-Setup-1.0.0-x64.exe"
className="w-full py-2.5 px-4 rounded-lg bg-surface-700 hover:bg-surface-600 border border-white/[0.08] hover:border-brand-amber/40 text-neutral-200 font-mono text-xs flex items-center justify-between transition-all"
<div
aria-disabled="true"
className="w-full py-2.5 px-3.5 rounded-xl bg-surface-900/60 border border-white/10 text-neutral-400 text-xs font-medium flex items-center justify-between"
>
<span className="font-semibold">Setup Installer (.exe)</span>
<span className="text-neutral-400">102 MB</span>
</a>
<a
href="https://git.chanpaca.net/yunchan/d3ro-voice/releases"
target="_blank"
rel="noreferrer"
className="w-full py-2 px-4 rounded-lg bg-surface-900/40 text-neutral-500 font-mono text-[11px] flex items-center justify-between"
>
<span>Blockmap (.blockmap)</span>
<span>105 KB</span>
</a>
<span>Windows x64 installer</span>
<span>{isKo ? '검증 대기' : 'Verification pending'}</span>
</div>
</div>
</div>
{/* macOS Package */}
<div className="p-6 rounded-xl bg-surface-800/60 border border-white/[0.06] hover:border-brand-amber/30 transition-all flex flex-col justify-between">
<div className="p-6 rounded-2xl bg-surface-800/80 border border-white/10 hover:border-purple-400/40 shadow-glass-card backdrop-blur-xl transition-all flex flex-col justify-between">
<div>
<div className="flex items-center justify-between mb-3">
<span className="font-mono text-xs font-semibold text-purple-400">MACOS 12.0+</span>
<span className="font-mono text-[10px] text-neutral-500">Apple Silicon & Intel</span>
<span className="text-xs font-medium text-purple-300">MACOS 12.0+</span>
<span className="font-mono text-xs text-neutral-400">Apple Silicon</span>
</div>
<h4 className="font-display text-base font-bold text-neutral-100 mb-1">macOS DMG</h4>
<p className="text-xs text-neutral-400 mb-6 leading-relaxed">
<h4 className="text-lg font-medium text-neutral-50 mb-1.5">macOS DMG</h4>
<p className="text-xs sm:text-sm text-neutral-300 mb-5 leading-relaxed font-normal">
{isKo
? 'Apple Silicon M1~M4 Metal 가속 지원 및 Universal DMG 설치 패키지.'
: 'Universal package optimized for Apple Silicon (M1/M2/M3/M4) Metal framework.'}
? 'Apple Silicon 후보 빌드의 코드 서명과 설치 동작을 검증 중입니다.'
: 'The Apple Silicon candidate is undergoing code-signing and installation verification.'}
</p>
</div>
<div className="space-y-2">
<a
href="https://git.chanpaca.net/yunchan/d3ro-voice/releases"
target="_blank"
rel="noreferrer"
className="w-full py-2.5 px-4 rounded-lg bg-surface-700 hover:bg-surface-600 border border-white/[0.08] hover:border-purple-400/40 text-neutral-200 font-mono text-xs flex items-center justify-between transition-all"
<div
aria-disabled="true"
className="w-full py-2.5 px-3.5 rounded-xl bg-surface-900/60 border border-white/10 text-neutral-400 text-xs font-medium flex items-center justify-between"
>
<span className="font-semibold">Apple Silicon DMG (.dmg)</span>
<span className="text-neutral-400">98 MB</span>
</a>
<a
href="https://git.chanpaca.net/yunchan/d3ro-voice/releases"
target="_blank"
rel="noreferrer"
className="w-full py-2 px-4 rounded-lg bg-surface-900/40 text-neutral-500 font-mono text-[11px] flex items-center justify-between"
>
<span>Portable (.zip)</span>
<span>96 MB</span>
</a>
<span>Apple Silicon DMG</span>
<span>{isKo ? '검증 대기' : 'Verification pending'}</span>
</div>
</div>
</div>
{/* Android & iOS Mobile App Package */}
<div className="p-6 rounded-xl bg-surface-800/60 border border-white/[0.06] hover:border-brand-amber/30 transition-all flex flex-col justify-between">
{/* Android / iOS Mobile */}
<div className="p-6 rounded-2xl bg-surface-800/80 border border-white/10 hover:border-emerald-500/40 shadow-glass-card backdrop-blur-xl transition-all flex flex-col justify-between">
<div>
<div className="flex items-center justify-between mb-3">
<span className="font-mono text-xs font-semibold text-emerald-400">ANDROID & IOS</span>
<span className="font-mono text-[10px] text-neutral-500">Mobile Edition</span>
<span className="text-xs font-medium text-emerald-400">ANDROID</span>
<span className="text-xs text-neutral-400">Mobile Edition</span>
</div>
<h4 className="font-display text-base font-bold text-neutral-100 mb-1">D3RO Voice Mobile</h4>
<p className="text-xs text-neutral-400 mb-6 leading-relaxed">
<h4 className="text-lg font-medium text-neutral-50 mb-1.5">D3RO Voice Mobile</h4>
<p className="text-xs sm:text-sm text-neutral-300 mb-5 leading-relaxed font-normal">
{isKo
? '스마트폰에서도 동일하게 작동하는 로컬 음성 비서 및 실시간 마이크 연동. 이동 중에도 끊김 없는 고속 음성 기록.'
: 'On-device voice assistant for smartphones with instant mic streaming and seamless cloud sync.'}
? 'Google Play용 AAB와 스토어 메타데이터의 검증을 마친 뒤 Android 배포를 시작합니다.'
: 'Android distribution begins after the Play AAB and store metadata are verified.'}
</p>
</div>
<div className="space-y-2">
<a
href="https://git.chanpaca.net/attachments/0b015367-dd8b-488c-8cc0-4db413b51792"
download="d3ro-voice-v1.0.0-signed.apk"
className="w-full py-2.5 px-4 rounded-lg bg-surface-700 hover:bg-surface-600 border border-white/[0.08] hover:border-emerald-400/40 text-neutral-200 font-mono text-xs flex items-center justify-between transition-all"
<div
aria-disabled="true"
className="w-full py-2.5 px-3.5 rounded-xl bg-surface-900/60 border border-white/10 text-neutral-400 text-xs font-medium flex items-center justify-between"
>
<span className="font-semibold">Android Release APK (.apk)</span>
<span className="text-emerald-400">Download (47.5MB) →</span>
</a>
<a
href="#download"
className="w-full py-2 px-4 rounded-lg bg-surface-900/40 text-neutral-400 font-mono text-[11px] flex items-center justify-between"
>
<span>{isKo ? 'iOS App Store / TestFlight' : 'iOS TestFlight'}</span>
<span className="text-neutral-500">Coming Soon</span>
</a>
<span>{isKo ? 'Android 공식 APK' : 'Official Android APK'}</span>
<span>{isKo ? '서명 증거 확인 대기' : 'Unavailable — evidence pending'}</span>
</div>
<div className="w-full py-2 px-3.5 rounded-xl bg-surface-900/50 text-neutral-500 text-xs flex items-center justify-between">
<span>iOS App Store / TestFlight</span>
<span>{isKo ? '검증된 배포 없음' : 'No verified distribution'}</span>
</div>
</div>
</div>
</div>
</div>
{/* Live Client-Side SHA-256 Verifier */}
<div className="mb-20 p-8 rounded-2xl bg-surface-800/40 border border-white/[0.06] backdrop-blur-sm">
{/* Client-Side Cryptographic Verifier Box */}
<div className="p-7 md:p-8 rounded-3xl bg-surface-800/70 border border-white/10 shadow-glass-card backdrop-blur-xl mb-16">
<div className="flex flex-col md:flex-row items-start md:items-center justify-between gap-4 mb-6">
<div>
<span className="font-mono text-nano text-brand-amber uppercase tracking-widest block mb-1">
CRYPTOGRAPHIC INTEGRITY
<span className="text-xs font-medium text-brand-blue uppercase tracking-wider block mb-1">
LOCAL FILE UTILITY
</span>
<h3 className="font-display text-xl font-bold text-neutral-100">
{isKo ? '실시간 SHA-256 무결성 검증기' : 'SHA-256 Binary Integrity Verifier'}
<h3 className="text-lg sm:text-xl font-medium text-neutral-50 mb-1">
{isKo ? '로컬 SHA-256 계산기' : 'Client-Side SHA-256 Calculator'}
</h3>
<p className="text-xs text-neutral-400">
<p className="text-xs sm:text-sm text-neutral-300 font-normal">
{isKo
? '다운로드한 파일을 브라우저로 끌어다 놓아 위변조 및 해시 일치를 로컬에서 즉시 확인하세요.'
: 'Drag and drop your installer file to compute SHA-256 locally via browser WebCrypto API.'}
? '선택한 파일의 SHA-256 값을 브라우저에서 계산합니다. 공식 릴리스 판정은 제공하지 않습니다.'
: 'Compute a selected file hash locally with WebCrypto. This does not certify an official release.'}
</p>
</div>
<label className="px-4 py-2 rounded-lg bg-surface-700 hover:bg-surface-600 border border-white/[0.1] text-neutral-200 font-mono text-xs font-semibold cursor-pointer transition-all">
{isKo ? '파일 선택하여 검증' : 'Select File to Verify'}
<input type="file" className="hidden" onChange={handleFileChange} />
<label className="px-4 py-2 rounded-xl bg-surface-700 hover:bg-surface-600 border border-white/10 hover:border-brand-blue/40 text-neutral-200 text-xs font-medium cursor-pointer transition-all flex items-center gap-2">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" />
<polyline points="17 8 12 3 7 8" />
<line x1="12" y1="3" x2="12" y2="15" />
</svg>
<span>{isKo ? '파일 선택하여 검증' : 'Select File'}</span>
<input type="file" onChange={handleFileChange} className="hidden" />
</label>
</div>
{/* Drag & Drop Target Area */}
<div
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}
onDrop={handleDrop}
className={`border-2 border-dashed rounded-xl p-8 text-center transition-all ${
isDragOver ? 'border-brand-amber bg-brand-amber/10' : 'border-white/[0.08] bg-surface-900/40'
className={`p-7 rounded-2xl border-2 border-dashed transition-all text-center ${
isDragOver
? 'border-brand-blue bg-brand-blue/10'
: 'border-white/15 bg-surface-900/50 hover:border-white/25'
}`}
>
{verifyStatus === 'idle' && (
<div>
<p className="font-mono text-xs text-neutral-300 mb-1">
{isKo
? '설치 파일(.exe / .dmg / .zip)을 이곳에 끌어다 놓으세요'
: 'Drop installer file (.exe / .dmg / .zip) here'}
<div className="space-y-1.5 text-neutral-400">
<p className="text-xs sm:text-sm font-normal text-neutral-200">
{isKo ? '설치 파일(.exe / .dmg / .zip)을 이곳에 끌어다 놓으세요' : 'Drop installer file here to compute cryptographic hash'}
</p>
<p className="font-mono text-[11px] text-neutral-500">
{isKo ? '파일은 서버로 전송되지 않고 로컬에서 안전하게 계산됩니다.' : 'Processed locally in browser.'}
<p className="text-xs text-neutral-400 font-normal">
{isKo ? '파일은 서버로 전송되지 않고 로컬 브라우저에서 안전하게 계산됩니다.' : 'Calculated in-memory locally via browser WebCrypto.'}
</p>
</div>
)}
{verifyStatus !== 'idle' && (
<div className="text-left font-mono text-xs space-y-2">
<div className="flex items-center justify-between">
<span className="font-bold text-neutral-200">{fileName}</span>
{verifyStatus === 'computing' && (
<span className="px-2 py-0.5 rounded bg-amber-500/20 text-amber-300">Computing...</span>
)}
{verifyStatus === 'match' && (
<span className="px-2 py-0.5 rounded bg-emerald-500/20 text-emerald-400 font-bold">
✓ {isKo ? '공식 릴리스 일치 (정상)' : 'OFFICIAL MATCH (GENUINE)'}
</span>
)}
{verifyStatus === 'custom' && (
<span className="px-2 py-0.5 rounded bg-brand-amber/20 text-brand-amber font-bold">
✓ {isKo ? '로컬 해시 계산 완료' : 'LOCAL HASH COMPUTED'}
</span>
)}
{verifyStatus === 'computing' && (
<div className="flex items-center justify-center gap-3 text-brand-blue text-xs sm:text-sm font-medium">
<span className="w-2 h-2 rounded-full bg-brand-blue animate-ping" />
<span>{isKo ? 'SHA-256 해시 계산 중...' : 'Computing SHA-256 hash locally...'}</span>
</div>
)}
{verifyStatus === 'custom' && (
<div className="space-y-2 text-left bg-surface-950 p-4 rounded-xl border border-white/10">
<div className="flex items-center justify-between text-xs text-neutral-300">
<span className="font-medium text-brand-blue">{isKo ? '로컬 해시 계산 완료' : 'Local Hash Computed'}</span>
<span>{fileName}</span>
</div>
<div className="p-3 rounded bg-surface-950/60 border border-white/[0.04] space-y-1">
<div className="text-neutral-400">
Calculated:{' '}
<span className="text-brand-amber">{computedHash || (isKo ? '계산 중...' : 'Hashing...')}</span>
</div>
<div className="text-neutral-400">
Official:{' '}<span className="text-emerald-400">{OFFICIAL_HASH}</span>
</div>
<div className="font-mono text-xs text-neutral-200 break-all pt-1 border-t border-white/10">
{computedHash}
</div>
</div>
)}
@ -373,78 +295,81 @@ export function Download() {
</div>
{/* Release History Section */}
<div id="releases">
<div className="flex items-center justify-between mb-8">
<div>
<div className="flex items-center justify-between mb-5">
<div>
<span className="font-mono text-nano text-brand-amber uppercase tracking-widest block mb-1">
<span className="text-xs font-medium text-brand-blue uppercase tracking-wider block mb-1">
VERSION ARCHIVE
</span>
<h3 className="font-display text-xl font-bold text-neutral-100">
{isKo ? '릴리스 버전 히스토리' : 'Release Version History'}
<h3 className="text-xl font-medium text-neutral-50">
{isKo ? '릴리스 버전 히스토리' : 'Release Archive & Changelog'}
</h3>
</div>
<a
href="https://git.chanpaca.net/yunchan/d3ro-voice/releases"
target="_blank"
rel="noreferrer"
className="font-mono text-xs text-brand-amber hover:underline flex items-center gap-1"
className="text-xs text-brand-blue hover:text-brand-blue-light transition-colors font-medium flex items-center gap-1.5"
>
<span>{isKo ? 'Forgejo Git 릴리스 전체 보기' : 'Forgejo Git Releases'}</span>
<span>Forgejo Git 릴리스 전체 보기</span>
<span>→</span>
</a>
</div>
<div className="space-y-4">
{/* v1.0.0 */}
<div className="p-6 rounded-xl bg-surface-800/80 border-l-4 border-l-brand-amber border border-white/[0.06]">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-3">
{/* v1.0.0 Release */}
<div className="p-6 rounded-2xl bg-surface-800/80 border-l-4 border-l-brand-blue border border-white/10 shadow-glass-card">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-3 mb-3 pb-3 border-b border-white/[0.06]">
<div className="flex items-center gap-3">
<span className="font-mono text-base font-bold text-neutral-100">v1.0.0</span>
<span className="px-2 py-0.5 rounded text-[10px] font-mono font-bold bg-brand-amber/20 text-brand-amber border border-brand-amber/30">
LATEST STABLE
<span className="text-base font-medium text-neutral-100">v1.0.0</span>
<span className="px-2.5 py-0.5 rounded-full text-xs font-medium bg-brand-blue/15 text-brand-blue border border-brand-blue/30">
ARCHIVED · DOWNLOAD UNAVAILABLE
</span>
<span className="font-mono text-xs text-neutral-500">2026-08-20</span>
<span className="text-xs text-neutral-400">2026-08-20</span>
</div>
<a
href="/releases/1.0.0/D3RO-Voice-Setup-1.0.0-x64.exe"
download
className="px-3 py-1.5 rounded-lg bg-brand-amber/15 hover:bg-brand-amber/25 text-brand-amber font-mono text-xs font-bold border border-brand-amber/30 transition-all text-center"
<span
aria-disabled="true"
className="px-3.5 py-1.5 rounded-xl bg-surface-900/60 text-neutral-400 border border-white/10 text-xs font-medium self-start sm:self-auto"
>
Installer (.exe)
</a>
{isKo ? '과거 바이너리 미제공' : 'Historical binary unavailable'}
</span>
</div>
<ul className="text-xs text-neutral-300 space-y-1.5 mb-4 list-disc list-inside">
<li>
<strong className="text-brand-amber">10+ 글로벌 광고 미디에이션</strong>: EthicalAds, Carbon Ads, GAM, Playwire, AppLovin, Unity Ads 실시간 입찰.
<ul className="space-y-1.5 text-xs sm:text-sm text-neutral-300 mb-3.5 font-normal leading-relaxed">
<li className="flex items-start gap-2">
<span className="text-brand-blue font-medium">•</span>
<span><strong className="text-neutral-100 font-medium">10+ 글로벌 광고 미디에이션</strong>: EthicalAds, Carbon Ads, GAM, Playwire, AppLovin, Unity Ads 실시간 입찰.</span>
</li>
<li>
<strong className="text-brand-amber">무료 티어 리워드 충전</strong>: 15초 스폰서 비디오 시청 완료 시 +50 Cloud AI 토큰 자동 리필.
<li className="flex items-start gap-2">
<span className="text-brand-blue font-medium">•</span>
<span><strong className="text-neutral-100 font-medium">무료 티어 리워드 충전</strong>: 15초 스폰서 비디오 시청 완료 시 +50 Cloud AI 토큰 자동 리필.</span>
</li>
<li>
<strong className="text-brand-amber">100% 로컬 Whisper 전사 엔진</strong>: 네트워크 없이 실시간 고속 오프라인 음성 텍스트 변환.
<li className="flex items-start gap-2">
<span className="text-brand-blue font-medium">•</span>
<span><strong className="text-neutral-100 font-medium">100% 로컬 Whisper 전사 엔진</strong>: 네트워크 연결 없이 실시간 고속 오프라인 음성 텍스트 변환.</span>
</li>
<li>
<strong className="text-brand-amber">Android & iOS 모바일 앱</strong>: 스마트폰 음성 입력 및 클라우드 AI 실시간 계정 동기화.
<li className="flex items-start gap-2">
<span className="text-brand-blue font-medium">•</span>
<span><strong className="text-neutral-100 font-medium">모바일 TEST-DEMO</strong>: 공식 서명 증거와 스토어 심사가 끝날 때까지 일반 다운로드는 제공하지 않습니다.</span>
</li>
</ul>
<div className="p-2.5 rounded bg-surface-950/60 font-mono text-[11px] text-neutral-400 flex items-center justify-between">
<span className="truncate max-w-[450px]">SHA-256: b0ac051443151a2e34e8192f1fcf795586bbafca6eb21f01a79170c079a53ba2</span>
<span className="text-brand-amber">102 MB</span>
<div className="text-xs text-neutral-400 p-2.5 rounded-lg bg-surface-950 border border-white/[0.04]">
{isKo
? '이 항목은 변경 이력으로만 보존합니다. 설치 파일, 고정 해시, 용량 정보는 현재 릴리스로 제공하지 않습니다.'
: 'This entry is retained only as history. Its installer, fixed hash, and size are not offered as a current release.'}
</div>
</div>
{/* v0.2.1-alpha */}
<div className="p-5 rounded-xl bg-surface-800/40 border-l-4 border-l-neutral-700 border border-white/[0.04] opacity-80">
<div className="p-5 rounded-2xl bg-surface-800/50 border-l-4 border-l-surface-600 border border-white/5 opacity-75">
<div className="flex items-center gap-3 mb-2">
<span className="font-mono text-sm font-bold text-neutral-200">v0.2.1-alpha</span>
<span className="px-2 py-0.5 rounded text-[10px] font-mono bg-white/5 text-neutral-400">PRE-RELEASE</span>
<span className="font-mono text-xs text-neutral-500">2026-08-15</span>
<span className="text-sm font-medium text-neutral-200">v0.2.1-alpha</span>
<span className="px-2 py-0.5 rounded-full text-xs font-normal bg-white/5 text-neutral-400 border border-white/10">PRE-RELEASE</span>
<span className="text-xs text-neutral-500 font-mono">2026-08-15</span>
</div>
<p className="text-xs text-neutral-400">
Deepgram, AssemblyAI, Groq 멀티 클라우드 STT 드라이버 디스패치 및 암호화 라이선스 키 검증 엔진 탑재.
<p className="text-xs text-neutral-300 font-normal">
Deepgram, AssemblyAI, Groq 멀티 클라우드 STT 드라이버 디스패처 및 암호화 라이선스 키 검증 엔진 탑재.
</p>
</div>
</div>