import { useState, useEffect, 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 [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') try { const arrayBuffer = await file.arrayBuffer() const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer) const hashArray = Array.from(new Uint8Array(hashBuffer)) 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') } } catch { setVerifyStatus('custom') } } const handleFileChange = (e: ChangeEvent) => { const files = e.target.files if (files && files.length > 0) { void computeFileHash(files[0]) } } const handleDragOver = (e: DragEvent) => { e.preventDefault() setIsDragOver(true) } const handleDragLeave = (e: DragEvent) => { e.preventDefault() setIsDragOver(false) } const handleDrop = (e: DragEvent) => { e.preventDefault() setIsDragOver(false) const files = e.dataTransfer.files if (files && files.length > 0) { void computeFileHash(files[0]) } } return (
{/* Primary Recommended OS Download Card */}

{detectedOs === 'mac' ? 'macOS Apple Silicon' : 'Windows 64-bit Installer'}

{isKo ? '추천 빌드' : 'RECOMMENDED'}

{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'}

v1.0.0 STABLE
{/* Primary Action Button */} {/* SHA-256 Quick Verification Strip */}
SHA-256: b0ac051443151a2e34e8192f1fcf7955...
{isKo ? '코드 서명 및 무결성 검증 완료' : 'Signed & Verified'}
{/* All Platform Packages Bento Grid */}

{isKo ? '전체 플랫폼 설치 패키지' : 'All Platform Packages'}

Auto-Update Feed: latest.yml Active
{/* Windows Package */}
WINDOWS 10 / 11 x64

Windows Setup

{isKo ? '원클릭 NSIS 설치 프로그램. 백그라운드 자동 업데이트 및 DirectML GPU 가속 지원.' : 'One-click installer with automatic background delta updates and DirectML acceleration.'}

{/* macOS Package */}
MACOS 12.0+ Apple Silicon & Intel

macOS DMG

{isKo ? 'Apple Silicon M1~M4 Metal 가속 지원 및 Universal DMG 설치 패키지.' : 'Universal package optimized for Apple Silicon (M1/M2/M3/M4) Metal framework.'}

{/* Android & iOS Mobile App Package */}
ANDROID & IOS Mobile Edition

D3RO Voice Mobile

{isKo ? '스마트폰에서도 동일하게 작동하는 로컬 음성 비서 및 실시간 마이크 연동. 이동 중에도 끊김 없는 고속 음성 기록.' : 'On-device voice assistant for smartphones with instant mic streaming and seamless cloud sync.'}

{/* Live Client-Side SHA-256 Verifier */}
CRYPTOGRAPHIC INTEGRITY

{isKo ? '실시간 SHA-256 무결성 검증기' : 'SHA-256 Binary Integrity Verifier'}

{isKo ? '다운로드한 파일을 브라우저로 끌어다 놓아 위변조 및 해시 일치를 로컬에서 즉시 확인하세요.' : 'Drag and drop your installer file to compute SHA-256 locally via browser WebCrypto API.'}

{verifyStatus === 'idle' && (

{isKo ? '설치 파일(.exe / .dmg / .zip)을 이곳에 끌어다 놓으세요' : 'Drop installer file (.exe / .dmg / .zip) here'}

{isKo ? '파일은 서버로 전송되지 않고 로컬에서 안전하게 계산됩니다.' : 'Processed locally in browser.'}

)} {verifyStatus !== 'idle' && (
{fileName} {verifyStatus === 'computing' && ( Computing... )} {verifyStatus === 'match' && ( ✓ {isKo ? '공식 릴리스 일치 (정상)' : 'OFFICIAL MATCH (GENUINE)'} )} {verifyStatus === 'custom' && ( ✓ {isKo ? '로컬 해시 계산 완료' : 'LOCAL HASH COMPUTED'} )}
Calculated:{' '} {computedHash || (isKo ? '계산 중...' : 'Hashing...')}
Official:{' '}{OFFICIAL_HASH}
)}
{/* Release History Section */}
VERSION ARCHIVE

{isKo ? '릴리스 버전 히스토리' : 'Release Version History'}

{isKo ? 'Forgejo Git 릴리스 전체 보기' : 'Forgejo Git Releases'}
{/* v1.0.0 */}
v1.0.0 LATEST STABLE 2026-08-20
Installer (.exe)
  • 10+ 글로벌 광고 미디에이션: EthicalAds, Carbon Ads, GAM, Playwire, AppLovin, Unity Ads 실시간 입찰.
  • 무료 티어 리워드 충전: 15초 스폰서 비디오 시청 완료 시 +50 Cloud AI 토큰 자동 리필.
  • 100% 로컬 Whisper 전사 엔진: 네트워크 없이 실시간 고속 오프라인 음성 텍스트 변환.
  • Android & iOS 모바일 앱: 스마트폰 음성 입력 및 클라우드 AI 실시간 계정 동기화.
SHA-256: b0ac051443151a2e34e8192f1fcf795586bbafca6eb21f01a79170c079a53ba2 102 MB
{/* v0.2.1-alpha */}
v0.2.1-alpha PRE-RELEASE 2026-08-15

Deepgram, AssemblyAI, Groq 멀티 클라우드 STT 드라이버 디스패치 및 암호화 라이선스 키 검증 엔진 탑재.

) }