diff --git a/.forgejo/workflows/portable.yml b/.forgejo/workflows/portable.yml index 205659b..4472b63 100644 --- a/.forgejo/workflows/portable.yml +++ b/.forgejo/workflows/portable.yml @@ -51,9 +51,6 @@ jobs: - name: 데스크톱 번들 빌드 run: npm run build --workspace=@d3ro/desktop - - name: 데스크톱 렌더러 번들 검증 - run: node scripts/ci/verify-desktop-renderer-bundles.mjs - - name: 휴대용 ZIP + Scoop 매니페스트 생성 run: node scripts/ci/build-portable.mjs diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index d42bffd..3159540 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -62,7 +62,6 @@ jobs: throw "로컬 개발 인증서는 production 서명 identity가 아닙니다." } npm run build --workspace=@d3ro/desktop - node scripts/ci/verify-desktop-renderer-bundles.mjs Push-Location apps/desktop npx electron-builder --win --x64 --config electron-builder.yml --publish never node scripts/ci/verify-native-abi.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0db2b41..0694180 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -169,10 +169,6 @@ jobs: - name: Build Target Workspace run: ${{ matrix.cmd }} - - name: Verify Desktop Renderer Bundles - if: matrix.target == 'desktop' - run: node scripts/ci/verify-desktop-renderer-bundles.mjs - # ────────────────────────────────────────────────────────────────── # 4. Android x86_64 artifacts and native dependency gate # ────────────────────────────────────────────────────────────────── diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 75e3d44..1e5c634 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -109,9 +109,6 @@ jobs: npm run typecheck npm run build --workspace=@d3ro/desktop - - name: Verify Desktop Renderer Bundles - run: node scripts/ci/verify-desktop-renderer-bundles.mjs - - name: Build STT Sidecar (local transcription engine) run: | # Local transcription depends on the faster-whisper sidecar; a release @@ -192,9 +189,6 @@ jobs: npm run typecheck npm run build --workspace=@d3ro/desktop - - name: Verify Desktop Renderer Bundles - run: node scripts/ci/verify-desktop-renderer-bundles.mjs - - name: Build STT Sidecar (local transcription engine) run: | # Local transcription depends on the faster-whisper sidecar; a release diff --git a/CHANGELOG.md b/CHANGELOG.md index f3aaa8c..f6f813e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,17 +13,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Cloud-optional backup (encrypted, opt-in) - Plugin system for custom pipelines -## [1.3.7] - 2026-09-19 - -### Fixed -- **Recording and live caption overlays never worked in installed builds.** Popup - pages loaded their scripts as classic ` + diff --git a/apps/desktop/src/renderer/popups/command-popup/index.html b/apps/desktop/src/renderer/popups/command-popup/index.html index 996a62f..664087f 100644 --- a/apps/desktop/src/renderer/popups/command-popup/index.html +++ b/apps/desktop/src/renderer/popups/command-popup/index.html @@ -19,7 +19,6 @@ - - + diff --git a/apps/desktop/src/renderer/popups/history-popup/index.html b/apps/desktop/src/renderer/popups/history-popup/index.html index 0a461e5..780a1fb 100644 --- a/apps/desktop/src/renderer/popups/history-popup/index.html +++ b/apps/desktop/src/renderer/popups/history-popup/index.html @@ -17,7 +17,6 @@ - - + diff --git a/apps/desktop/src/renderer/popups/recording-tip/index.html b/apps/desktop/src/renderer/popups/recording-tip/index.html index 623064c..58ea4ba 100644 --- a/apps/desktop/src/renderer/popups/recording-tip/index.html +++ b/apps/desktop/src/renderer/popups/recording-tip/index.html @@ -34,7 +34,6 @@ - - + diff --git a/apps/desktop/src/renderer/popups/result-popup/index.html b/apps/desktop/src/renderer/popups/result-popup/index.html index 6457d33..552fe47 100644 --- a/apps/desktop/src/renderer/popups/result-popup/index.html +++ b/apps/desktop/src/renderer/popups/result-popup/index.html @@ -23,7 +23,6 @@ - - + diff --git a/apps/mobile-rn/android/app/build.gradle b/apps/mobile-rn/android/app/build.gradle index b71db41..745b471 100644 --- a/apps/mobile-rn/android/app/build.gradle +++ b/apps/mobile-rn/android/app/build.gradle @@ -151,8 +151,8 @@ def versionSettingsValid = configuredVersionName != null && configuredVersionName ==~ strictSemver && configuredVersionCodeValue != null && configuredVersionCodeValue <= 2100000000L -def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.3.7" -def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1031007 +def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.3.6" +def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1031006 def requiredReleaseSettings = [ D3RO_RELEASE_STORE_FILE: releaseStoreFilePath, diff --git a/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj b/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj index 24b59d2..faf7162 100644 --- a/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj +++ b/apps/mobile-rn/ios/D3ROVoice.xcodeproj/project.pbxproj @@ -257,7 +257,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1031007; + CURRENT_PROJECT_VERSION = 1031006; ENABLE_BITCODE = NO; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; @@ -265,7 +265,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.7; + MARKETING_VERSION = 1.3.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -287,14 +287,14 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 1031007; + CURRENT_PROJECT_VERSION = 1031006; INFOPLIST_FILE = D3ROVoice/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.3.7; + MARKETING_VERSION = 1.3.6; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", diff --git a/apps/mobile-rn/metadata/android/en-US/changelogs/1031007.txt b/apps/mobile-rn/metadata/android/en-US/changelogs/1031007.txt deleted file mode 100644 index 2ea3629..0000000 --- a/apps/mobile-rn/metadata/android/en-US/changelogs/1031007.txt +++ /dev/null @@ -1 +0,0 @@ -Overlay fixes: the recording waveform/timer and live captions now display correctly. diff --git a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1031007.txt b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1031007.txt deleted file mode 100644 index 031c828..0000000 --- a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1031007.txt +++ /dev/null @@ -1 +0,0 @@ -오버레이 수정: 녹음 파형/타이머와 실시간 자막이 정상 표시됩니다. diff --git a/apps/mobile-rn/package-lock.json b/apps/mobile-rn/package-lock.json index e3cbe30..351b628 100644 --- a/apps/mobile-rn/package-lock.json +++ b/apps/mobile-rn/package-lock.json @@ -1,12 +1,12 @@ { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.3.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.3.6", "dependencies": { "@d3ro/api-client": "file:../../packages/api-client", "@d3ro/core": "file:../../packages/core", @@ -62,7 +62,7 @@ }, "../..": { "name": "d3ro-voice-monorepo", - "version": "1.3.7", + "version": "1.3.6", "license": "MIT", "workspaces": [ "apps/desktop", @@ -81,7 +81,7 @@ }, "../../packages/api-client": { "name": "@d3ro/api-client", - "version": "1.3.7", + "version": "1.3.6", "license": "MIT", "dependencies": { "@d3ro/core": "*", @@ -98,7 +98,7 @@ }, "../../packages/core": { "name": "@d3ro/core", - "version": "1.3.7", + "version": "1.3.6", "license": "MIT", "dependencies": { "docx": "^9.6.1" @@ -109,7 +109,7 @@ }, "../../packages/i18n": { "name": "@d3ro/i18n", - "version": "1.3.7", + "version": "1.3.6", "license": "MIT", "devDependencies": { "@types/react": "^19.0.0" @@ -120,7 +120,7 @@ }, "../../packages/ui-native": { "name": "@d3ro/ui-native", - "version": "1.3.7", + "version": "1.3.6", "license": "MIT", "devDependencies": { "@types/react": "*" diff --git a/apps/mobile-rn/package.json b/apps/mobile-rn/package.json index 81ef219..d18dab4 100644 --- a/apps/mobile-rn/package.json +++ b/apps/mobile-rn/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/mobile-rn", - "version": "1.3.7", + "version": "1.3.6", "private": true, "scripts": { "android": "react-native run-android", diff --git a/apps/web/package.json b/apps/web/package.json index 8fbf2a1..137143b 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "@d3ro/web", - "version": "1.3.7", + "version": "1.3.6", "private": true, "description": "D3RO Voice 웹 앱 — Next.js 기반 SaaS 인터페이스", "scripts": { diff --git a/apps/web/src/components/layout/sidebar.tsx b/apps/web/src/components/layout/sidebar.tsx index e4a0264..b678848 100644 --- a/apps/web/src/components/layout/sidebar.tsx +++ b/apps/web/src/components/layout/sidebar.tsx @@ -139,7 +139,7 @@ export function Sidebar(): React.ReactElement { - v1.3.7 + v1.3.6 diff --git a/apps/web/src/lib/desktop-release.ts b/apps/web/src/lib/desktop-release.ts index 6a81fb6..27c051b 100644 --- a/apps/web/src/lib/desktop-release.ts +++ b/apps/web/src/lib/desktop-release.ts @@ -4,10 +4,10 @@ // 설치 파일은 canonical Forgejo feed에서만 배포한다. 웹/사이트 빌드 산출물에는 // 설치 바이너리가 포함되지 않으므로 `/releases/...` 로컬 경로는 배포 환경에서 404다. -export const DESKTOP_VERSION = '1.3.7' +export const DESKTOP_VERSION = '1.2.0' /** 릴리스 게시일. `release/product-version.json`의 releaseDate와 같아야 한다. */ -export const DESKTOP_RELEASE_DATE = '2026-09-19' +export const DESKTOP_RELEASE_DATE = '2026-09-16' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan' diff --git a/docs/map/00-index.md b/docs/map/00-index.md index d3413ac..bda0005 100644 --- a/docs/map/00-index.md +++ b/docs/map/00-index.md @@ -2,8 +2,7 @@ > Status: ACTIVE > Last full audit: 2026-09-13 -> Last update: 2026-09-19 — GAP-INFRA-05 (desktop renderer popup bundle verification wired into CI); 1.3.7 published to the updater feed -> Scope: entire monorepo `D:/workspace/D3ROVoice` at product version `1.3.7` +> Scope: entire monorepo `D:/workspace/D3ROVoice` at product version `1.3.0` > Purpose: let any agent (or human) answer two questions in under a minute: > 1. **What infrastructure exists?** (build, CI, services, APIs, data, packages, deploy) > 2. **How far is each feature developed?** (per surface, with file anchors and status) diff --git a/docs/map/02-infrastructure.md b/docs/map/02-infrastructure.md index 836a6db..6411555 100644 --- a/docs/map/02-infrastructure.md +++ b/docs/map/02-infrastructure.md @@ -78,7 +78,6 @@ npm run release:metadata[:test] npm run release:forgejo[:check] # canonical Forgejo publisher/feed npm run release:tag # annotated/signed immutable release tag npm run security:secrets[:test] # hardcoded-secret scanner -npm run check:desktop-renderer[:test] # built renderer pages reference only assets on disk npm run test:e2e:red # content-report red e2e npm run release:mobile:boundary[:test] npm run release:mobile:config[:test] @@ -137,12 +136,12 @@ See [`03-shared-packages.md`](./03-shared-packages.md). Summary: ### GitLab CI (`.gitlab-ci.yml`) -Stages `validate → test → build → e2e → package → publish → deploy`. Primary pipeline for desktop Windows/macOS releases (Forgejo Generic Registry is the canonical updater feed; GitLab project 1172 is a legacy mirror) and production mobile releases (`mobile-production-release`, manual/protected). Admin NAS deploy job is intentionally **disabled**. `package-windows`/`package-macos` build the faster-whisper sidecar (`sidecar:setup` → `sidecar:build`) and run `scripts/ci/verify-sidecar-bundle.mjs` before electron-builder, so a release can never ship without the local STT engine. Every pipeline that runs `npm run build --workspace=@d3ro/desktop` (`.forgejo` release/portable, `.github` CI/release) then runs `scripts/ci/verify-desktop-renderer-bundles.mjs`, which fails packaging when a renderer page references an asset the build did not emit (GAP-INFRA-05). +Stages `validate → test → build → e2e → package → publish → deploy`. Primary pipeline for desktop Windows/macOS releases (Forgejo Generic Registry is the canonical updater feed; GitLab project 1172 is a legacy mirror) and production mobile releases (`mobile-production-release`, manual/protected). Admin NAS deploy job is intentionally **disabled**. `package-windows`/`package-macos` build the faster-whisper sidecar (`sidecar:setup` → `sidecar:build`) and run `scripts/ci/verify-sidecar-bundle.mjs` before electron-builder, so a release can never ship without the local STT engine. ### Forgejo Actions (`.forgejo/workflows/`) `portable.yml` — 태그/수동 실행으로 **서명 없이** portable 채널(95MiB 7z 분할 볼륨 + Scoop 매니페스트 + 설치 스크립트)을 게시한다. `WIN_CSC_*` 불필요, updater feed는 건드리지 않는다. -`deploy-site.yml` / `deploy-site-windows.yml` — build `site`, write release identity, deploy to Cloudflare Pages `d3ro` (`d3ro.pages.dev`), verify live commit/version, app-links, legal URLs. 커스텀 도메인 `d3ro.chanpaca.net` 은 Pages 커스텀 도메인이 DNS CNAME을 요구하므로, DNS를 건드릴 수 없는 동안은 Workers 라우트 브리지 `server/cloudflare-site-bridge/`(`d3ro.chanpaca.net/*` → Pages 프록시, 수동 `npx wrangler deploy`)가 서빙한다. CNAME을 추가한 뒤 브리지를 삭제하면 Pages 커스텀 도메인으로 직접 서빙된다(GAP-REL-09b). +`deploy-site.yml` / `deploy-site-windows.yml` — build `site`, write release identity, deploy to Cloudflare Pages `d3ro` (`d3ro.chanpaca.net`), verify live commit/version, app-links, legal URLs. `release.yml` — tag-triggered Windows build (signed) + `publish-forgejo-release.mjs` to the canonical Forgejo feed/release hub. --- @@ -159,7 +158,7 @@ Stages `validate → test → build → e2e → package → publish → deploy`. Deploy scripts: `scripts/deploy-nas.ps1`, `scripts/deploy-nas.sh`, `scripts/deploy-site-to-nas.js`, `scripts/nas-control.sh` (start/stop/restart/status/logs/backup/update). -Public endpoints (production): `https://d3ro.chanpaca.net` — **랜딩/다운로드 센터**(2026-09-19부터 Pages `d3ro` 배포본을 Workers 라우트 브리지가 서빙; 그 이전에는 바인딩이 없어 빈 404였다), `https://admin.chanpaca.net` (admin CRM). Edge: `server/cloudflare-worker` proxying to the NAS origin, plus a **Cron Trigger** (`* * * * *`) that drains the Supabase push outbox via `send-push?mode=drain` (`src/push-drain.ts`; needs `SUPABASE_URL` var + `SUPABASE_SERVICE_ROLE_KEY` secret). Tunnel: Cloudflare Tunnel `kd-nas` (NAS 포털/API는 현재 이 호스트네임에 바인딩되어 있지 않다). +Public endpoints (production): `https://d3ro.chanpaca.net` (portal/API), `https://admin.chanpaca.net` (admin CRM). Edge: `server/cloudflare-worker` proxying to the NAS origin, plus a **Cron Trigger** (`* * * * *`) that drains the Supabase push outbox via `send-push?mode=drain` (`src/push-drain.ts`; needs `SUPABASE_URL` var + `SUPABASE_SERVICE_ROLE_KEY` secret). Tunnel: Cloudflare Tunnel `kd-nas`. --- @@ -192,14 +191,13 @@ Full detail: [`09-supabase-backend.md`](./09-supabase-backend.md). | File | Purpose | |---|---| -| `release/product-version.json` | version `1.3.7`, `androidVersionCode`/`iosBuildNumber` `1031007`, releaseDate, desktop license keyId | +| `release/product-version.json` | version `1.3.0`, `androidVersionCode`/`iosBuildNumber` `1030001`, releaseDate, desktop license keyId | | `release/android-release-identity.json` | package `com.d3ro.voice`, Play app ID, app-signing SHA-256, upload cert SHA-256, evidence keyId, AdMob unit IDs | | `release/desktop-license-public.pem` | Ed25519 public key for desktop offline licenses | | `release/mobile-release-evidence-public.pem` | Ed25519 public key for mobile release evidence | | `apps/desktop/electron-builder.yml` | appId `com.d3ro.voice`, NSIS x64 (forced code signing), macOS DMG/ZIP arm64, generic Forgejo publish feed, asarUnpack native modules + `@ffmpeg-installer`, extraResources (icons, sounds, sox, **sidecar**, ffmpeg, ollama) | | `apps/desktop/src/main/update-feed.ts` | Auto-update feed SSOT (canonical Forgejo + legacy GitLab mirror, channels) | | `release/update-policy.json` | Update policy SSOT (channels, minimum supported version, forced update, delta/full, staged rollout, kill switch) | -| `apps/web/src/lib/desktop-release.ts`, `site/src/release.ts` | Download-center desktop release contract (installer filename + release date); version and date are kept on the SSOT by `npm run version:sync` (drifted to 1.2.0 once — GAP-REL-08) | | `apps/desktop/src/main/update-policy.ts` | Policy parsing/decision logic | | `scripts/ci/publish-forgejo-release.mjs` | Canonical Forgejo registry + Release + feed publisher | diff --git a/docs/map/04-desktop-app.md b/docs/map/04-desktop-app.md index 317ae42..dd6e5df 100644 --- a/docs/map/04-desktop-app.md +++ b/docs/map/04-desktop-app.md @@ -146,12 +146,6 @@ Preload exposes **`window.electronAPI`** with 33 namespaces: `platform, audio, c `windows/WindowManager.ts` creates 6 windows: main (borderless, custom TitleBar; macOS `hiddenInset`), recording-tip, result-popup, history-popup, command-popup, caption-overlay. Injects popup theme CSS + i18n strings; 2-phase resize. `windows/TrayManager.ts` — tray icon + menu + double-click show. -**Popup invariants** (each shipped broken once — do not regress): - -- 팝업 HTML의 스크립트는 반드시 `') - const goodProblems = collectProblems(goodRoot, pages) - if (goodProblems.length !== 0) { - failures.push(`complete build reported problems: ${goodProblems.join('; ')}`) - } - - const brokenRoot = path.join(tmpRoot, 'broken') - bundlePage(brokenRoot, '') - const brokenProblems = collectProblems(brokenRoot, pages) - if (!brokenProblems.some((problem) => problem.includes('missing asset'))) { - failures.push('missing asset was not detected') - } - if (!brokenProblems.some((problem) => problem.includes('classic script'))) { - failures.push('classic script tag was not detected') - } - - const missingPageProblems = collectProblems(goodRoot, ['popups/absent/index.html']) - if (!missingPageProblems.some((problem) => problem.startsWith('missing built page'))) { - failures.push('missing page was not detected') - } - } finally { - rmSync(tmpRoot, { recursive: true, force: true }) - } - - if (failures.length > 0) { - console.error('verify-desktop-renderer-bundles self-test failed:') - for (const failure of failures) console.error(`- ${failure}`) - process.exit(1) - } - console.log('verify-desktop-renderer-bundles self-test: OK') -} - -if (process.argv.slice(2).includes('--self-test')) { - selfTest() -} else if (!existsSync(builtRendererDir)) { - console.error(`Renderer build not found: ${builtRendererDir}`) - console.error(' build: npm run build --workspace=@d3ro/desktop') - process.exit(1) -} else { - const pages = expectedPages() - const problems = collectProblems(builtRendererDir, pages) - - if (problems.length > 0) { - console.error('Desktop renderer bundle verification failed:') - for (const problem of problems) console.error(`- ${problem}`) - console.error(' rebuild: npm run build --workspace=@d3ro/desktop') - process.exit(1) - } - - console.log(`Desktop renderer bundle verification passed: ${pages.length} page(s) with all assets on disk`) -} \ No newline at end of file diff --git a/server/cloudflare-site-bridge/src/index.ts b/server/cloudflare-site-bridge/src/index.ts deleted file mode 100644 index a1b34e8..0000000 --- a/server/cloudflare-site-bridge/src/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -// server/cloudflare-site-bridge/src/index.ts -// d3ro.chanpaca.net → Cloudflare Pages(d3ro.pages.dev) 프록시. -// -// Pages 커스텀 도메인은 존 DNS에 CNAME을 요구하므로, DNS를 건드릴 수 없는 동안 -// 이 워커가 도메인을 살린다. 콘텐츠 정본은 Pages 배포본 하나이므로 CI가 Pages에 -// 배포하면 도메인에도 그대로 반영된다. - -const PAGES_ORIGIN = 'https://d3ro.pages.dev' - -export default { - async fetch(request: Request): Promise { - const target = new URL(request.url) - target.protocol = 'https:' - target.hostname = new URL(PAGES_ORIGIN).hostname - target.port = '' - - const headers = new Headers(request.headers) - headers.delete('host') - - const hasBody = request.method !== 'GET' && request.method !== 'HEAD' - - return fetch(target.toString(), { - method: request.method, - headers, - body: hasBody ? request.body : undefined, - redirect: 'manual', - }) - }, -} diff --git a/server/cloudflare-site-bridge/wrangler.toml b/server/cloudflare-site-bridge/wrangler.toml deleted file mode 100644 index 9b9df39..0000000 --- a/server/cloudflare-site-bridge/wrangler.toml +++ /dev/null @@ -1,20 +0,0 @@ -# server/cloudflare-site-bridge/wrangler.toml -# -# d3ro.chanpaca.net 을 Cloudflare Pages 배포본(d3ro.pages.dev)에 연결하는 브리지. -# -# 왜 필요한가: Pages 커스텀 도메인은 존 DNS에 CNAME(d3ro → d3ro.pages.dev)을 요구한다. -# 기존 d3ro 레코드가 남아 있어 Pages가 레코드를 만들지 못하고("CNAME record not set") -# 도메인은 빈 404를 반환했다. DNS 편집 권한 없이 도메인을 살리기 위해, 이미 프록시된 -# 호스트네임에 Workers 라우트를 걸어 Pages 배포본을 그대로 서빙한다. -# -# 정리(권장): 대시보드에서 CNAME d3ro → d3ro.pages.dev 를 추가한 뒤 이 라우트와 -# 워커를 제거하면 트래픽이 Pages 커스텀 도메인으로 직접 흐른다. -# npx wrangler delete --name d3ro-site-bridge (라우트는 워커 삭제 시 함께 해제) - -name = "d3ro-site-bridge" -main = "src/index.ts" -compatibility_date = "2024-04-01" - -routes = [ - { pattern = "d3ro.chanpaca.net/*", zone_name = "chanpaca.net" } -] diff --git a/site/package-lock.json b/site/package-lock.json index 4e3c001..e3778a9 100644 --- a/site/package-lock.json +++ b/site/package-lock.json @@ -1,12 +1,12 @@ { "name": "d3ro-voice-site", - "version": "1.3.7", + "version": "1.3.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "d3ro-voice-site", - "version": "1.3.7", + "version": "1.3.6", "dependencies": { "react": "^19.0.0", "react-dom": "^19.0.0" diff --git a/site/package.json b/site/package.json index 87c082a..2a62652 100644 --- a/site/package.json +++ b/site/package.json @@ -1,7 +1,7 @@ { "name": "d3ro-voice-site", "private": true, - "version": "1.3.7", + "version": "1.3.6", "type": "module", "scripts": { "dev": "vite --port 5199 --host", diff --git a/site/src/release.ts b/site/src/release.ts index 910c795..93e0264 100644 --- a/site/src/release.ts +++ b/site/src/release.ts @@ -5,10 +5,10 @@ // NAS 배포는 바이너리를 포함하지 않으므로 `/releases/...` 같은 로컬 경로는 // 실제 배포 환경에서 404가 된다. -export const DESKTOP_VERSION = '1.3.7' +export const DESKTOP_VERSION = '1.2.0' /** 릴리스 게시일. `release/product-version.json`의 releaseDate와 같아야 한다. */ -export const DESKTOP_RELEASE_DATE = '2026-09-19' +export const DESKTOP_RELEASE_DATE = '2026-09-16' const FORGEJO_ORIGIN = 'https://git.chanpaca.net' const FORGEJO_OWNER = 'yunchan' diff --git a/site/src/sections/Hero.tsx b/site/src/sections/Hero.tsx index 550d619..3e0117a 100644 --- a/site/src/sections/Hero.tsx +++ b/site/src/sections/Hero.tsx @@ -15,7 +15,7 @@ export function Hero() { const [typedRaw, setTypedRaw] = useState('') const [typedClean, setTypedClean] = useState('') const [waveLevels, setWaveLevels] = useState([0.3, 0.5, 0.8, 1, 0.9, 0.7, 0.4, 0.6, 0.3]) - const timerRef = useRef | null>(null) + const timerRef = useRef(null) const sampleRawText = locale === 'ko' ? '어... 이번 프로젝트 배포는 다음 주 금요일까지로 잡으면 될 것 같아요.'