diff --git a/CHANGELOG.md b/CHANGELOG.md
index 353c849..842a6d8 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,38 @@ 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.2.0] - 2026-09-16
+
+> Published from an annotated tag through CI. Installer and update metadata are
+> served by the canonical Forgejo feed; no binaries are committed to this repository.
+
+### Added
+- **Canonical desktop release channel**: desktop auto-update now reads one Forgejo Generic Package Registry feed, published by a version-agnostic publisher (`scripts/ci/publish-forgejo-release.mjs`) from tag-triggered Forgejo Actions, GitLab, and GitHub pipelines. The GitLab registry stays a legacy mirror for pre-Forgejo installs.
+- **Update policy SSOT** (`release/update-policy.json`): channels (`latest`/`beta`/`alpha`), minimum supported version, forced install, full-installer thresholds, staged rollout percentage, and a remote kill switch, enforced at runtime by `apps/desktop/src/main/update-policy.ts`.
+- **Dictionary import/export on desktop and web**: round-trip import with per-entry conflict reporting, a web dictionary client, and an expanded knowledge add form.
+- **Multi-transport push delivery**: Web Push (VAPID) and token-based Apple Push (APNs) transports join Firebase Cloud Messaging, with a Cloudflare Worker cron drain over an outbox table.
+- **Team activity feed**: team activity events, migration, and the web feed component.
+- **Shared entitlement gating** in `@d3ro/core` for free/paid feature boundaries.
+- **Infrastructure map** (`docs/map/`) documenting the infrastructure and feature status per platform, with an update protocol so feature work and the map stay in step.
+- 21 unit tests for update policy decisions and feed helpers, plus tests for dictionary I/O, entitlements, push drain, Web Push, and APNs payloads.
+
+### Changed
+- Desktop runtime updater feed moved from GitLab project 1172 to the canonical Forgejo registry; `electron-builder.yml`, the metadata verifier, and both CI publishers now enforce the canonical/mirror split.
+- Release metadata verifier self-test expanded to negative cases covering the feed contract, policy schema, and Forgejo publisher invariants.
+- The canonical publisher refuses to re-publish a version whose registry assets already hold different bytes, so a same-version re-release fails closed instead of overwriting a shipped installer.
+- Landing site and web console download centers now link the canonical Forgejo feed instead of repository-local installer paths, which are not part of any deploy artifact.
+- Admin console data views (models, pipelines, users, subscriptions, audit log) read live back-office data, with a unified sidebar and console theme.
+- Desktop settings, ad surfaces, license, and meeting-export UI aligned on the shared theme tokens; meeting export filenames now go through one sanitizer.
+- Developer-only automation, scratch captures, .NET build output, and Playwright run output left the release checkout.
+- Product version moved to `1.2.0` with Android version code and iOS build number `1020001`.
+
+### Fixed
+- Desktop configuration writes fail explicitly when the config store is unavailable instead of falling back to a throwaway in-memory store.
+- Speech provider and model failures reach the UI as errors instead of surfacing as empty transcriptions.
+- Removed the Forgejo release-publishing prohibition; the legacy hardcoded-version script is replaced by a version-gated publisher.
+- Dropped a stale admin bundle from the API server web root.
+- Mobile team, meeting, memo, template, command, and dictionary screens follow the server contract, and report submission no longer hangs without confirming to the user.
+
## [1.1.0] - 2026-08-29
### Added
@@ -22,13 +54,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Generated-content safety controls**: added generation receipts, shared generative-AI safety instructions, and an authenticated report flow for owned AI-generated meeting documents.
- **Release verification tooling**: added Android artifact, App Links, production Firebase/AdMob configuration, Play asset, secret scanning, signed provenance, and publication-boundary checks.
- **Complete mobile icon set**: added canonical Android legacy/adaptive/monochrome launchers, the 512px Play icon, and all required iPhone, iPad, and App Store marketing icon slots.
-- **Canonical desktop release channel**: desktop auto-update now reads one Forgejo Generic Package Registry feed, published by a version-agnostic publisher (`scripts/ci/publish-forgejo-release.mjs`) from a tag-triggered Forgejo Actions workflow. GitLab CI and GitHub Actions converge on the same publisher, and the GitLab registry stays a legacy mirror for pre-Forgejo installs.
-- **Update policy SSOT** (`release/update-policy.json`): channels (`latest`/`beta`/`alpha`), minimum supported version, forced install, full-installer thresholds, staged rollout percentage, and a remote kill switch, enforced at runtime by `apps/desktop/src/main/update-policy.ts`.
-- **Dictionary import/export on desktop and web**: round-trip import with per-entry conflict reporting, a web dictionary client, and an expanded knowledge add form.
-- **Multi-transport push delivery**: Web Push (VAPID) and token-based Apple Push (APNs) transports join Firebase Cloud Messaging, with a Cloudflare Worker cron drain over an outbox table.
-- **Team activity feed**: team activity events, migration, and the web feed component.
-- **Shared entitlement gating** in `@d3ro/core` for free/paid feature boundaries.
-- 21 unit tests for update policy decisions and feed helpers, plus tests for dictionary I/O, entitlements, push drain, Web Push, and APNs payloads.
### Changed
- Unified mobile authentication and invitation links on the canonical `d3ro-voice` app scheme and added fail-closed verification for the HTTPS App Links contract.
@@ -39,18 +64,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Finalized benchmarked `ko-KR`/`en-US` Play listing copy and a Console-previewed
1024×500 canonical feature graphic with preserved generation prompt, source,
output, and hashes.
-- Desktop runtime updater feed moved from GitLab project 1172 to the canonical
- Forgejo registry; `electron-builder.yml`, the metadata verifier, and both CI
- publishers now enforce the canonical/mirror split.
-- Release metadata verifier self-test expanded to 13 negative cases covering the
- feed contract, policy schema, and Forgejo publisher invariants.
-- Landing site and web console download centers now link the canonical Forgejo feed
- instead of repository-local installer paths, which are not part of any deploy
- artifact.
-- Admin console data views (models, pipelines, users, subscriptions, audit log) read
- live back-office data, with a unified sidebar and console theme.
-- Desktop settings, ad surfaces, license, and meeting-export UI aligned on the shared
- theme tokens; meeting export filenames now go through one sanitizer.
### Security
- Added atomic authorization and replay protection for teams, invitations, push delivery, transcription quotas, billing, ad rewards, administrative actions, data portability, and content reports.
@@ -62,11 +75,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Corrected realtime Edge Function model routing and type checks for team and enterprise tiers.
- Removed the legacy `d3ro://` deep-link surface to prevent divergent authentication callback identities.
-- Removed the Forgejo release-publishing prohibition; the legacy hardcoded-version
- script is replaced by a version-gated publisher.
-- Dropped a stale admin bundle from the API server web root, and stopped tracking
- .NET build output, Playwright run output, and developer-only automation scripts in
- the release checkout.
## [0.2.1-alpha] - 2026-07-22
diff --git a/apps/admin-swagger/openapi.json b/apps/admin-swagger/openapi.json
index 385711a..140aded 100644
--- a/apps/admin-swagger/openapi.json
+++ b/apps/admin-swagger/openapi.json
@@ -3,7 +3,7 @@
"info": {
"title": "D3RO-VOICE Admin API",
"description": "Admin CRM Edge Functions for user management, subscription CRUD, payment history, and audit logs.",
- "version": "1.1.0"
+ "version": "1.2.0"
},
"servers": [
{
diff --git a/apps/admin/package.json b/apps/admin/package.json
index c1e58ae..74e1de4 100644
--- a/apps/admin/package.json
+++ b/apps/admin/package.json
@@ -1,6 +1,6 @@
{
"name": "@d3ro/admin",
- "version": "1.1.0",
+ "version": "1.2.0",
"private": true,
"description": "D3RO Voice Admin CRM — SaaS 관리 도구",
"scripts": {
diff --git a/apps/api-server/D3ROVoice.Api.csproj b/apps/api-server/D3ROVoice.Api.csproj
index d7685cf..c62425c 100644
--- a/apps/api-server/D3ROVoice.Api.csproj
+++ b/apps/api-server/D3ROVoice.Api.csproj
@@ -2,7 +2,7 @@
net10.0
- 1.1.0
+ 1.2.0enableenable
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index ebf4195..376115a 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -1,6 +1,6 @@
{
"name": "@d3ro/desktop",
- "version": "1.1.0",
+ "version": "1.2.0",
"productName": "d3ro-voice",
"description": "로컬 AI 음성 어시스턴트 (Electron)",
"main": "./out/main/index.js",
diff --git a/apps/mobile-rn/android/app/build.gradle b/apps/mobile-rn/android/app/build.gradle
index 76c9498..8f1c98a 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.1.0"
-def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1010001
+def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.2.0"
+def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1020001
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 cd5c985..2eaba84 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 = 1010001;
+ CURRENT_PROJECT_VERSION = 1020001;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = D3ROVoice/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
@@ -265,7 +265,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.1.0;
+ MARKETING_VERSION = 1.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -287,14 +287,14 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 1010001;
+ CURRENT_PROJECT_VERSION = 1020001;
INFOPLIST_FILE = D3ROVoice/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.1.0;
+ MARKETING_VERSION = 1.2.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
diff --git a/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt b/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt
new file mode 100644
index 0000000..7750638
--- /dev/null
+++ b/apps/mobile-rn/metadata/android/en-US/changelogs/1020001.txt
@@ -0,0 +1 @@
+Team, meeting, memo, template, command, and dictionary screens now use server responses directly, so lists and edits stay in sync. Reporting a generated document confirms completion instead of hanging.
\ No newline at end of file
diff --git a/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt
new file mode 100644
index 0000000..0961c21
--- /dev/null
+++ b/apps/mobile-rn/metadata/android/ko-KR/changelogs/1020001.txt
@@ -0,0 +1 @@
+팀·회의·메모·템플릿·명령·사전 화면이 서버 응답을 그대로 사용해 목록과 수정 내용이 어긋나지 않습니다. 생성 문서 신고가 멈추지 않고 완료 확인을 표시합니다.
\ No newline at end of file
diff --git a/apps/mobile-rn/package-lock.json b/apps/mobile-rn/package-lock.json
index c274b58..6d68878 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.1.0",
+ "version": "1.2.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@d3ro/mobile-rn",
- "version": "1.1.0",
+ "version": "1.2.0",
"dependencies": {
"@d3ro/api-client": "file:../../packages/api-client",
"@d3ro/core": "file:../../packages/core",
@@ -62,7 +62,7 @@
},
"../..": {
"name": "d3ro-voice-monorepo",
- "version": "1.1.0",
+ "version": "1.2.0",
"license": "MIT",
"workspaces": [
"apps/desktop",
@@ -81,7 +81,7 @@
},
"../../packages/api-client": {
"name": "@d3ro/api-client",
- "version": "1.1.0",
+ "version": "1.2.0",
"license": "MIT",
"dependencies": {
"@d3ro/core": "*",
@@ -98,7 +98,7 @@
},
"../../packages/core": {
"name": "@d3ro/core",
- "version": "1.1.0",
+ "version": "1.2.0",
"license": "MIT",
"dependencies": {
"docx": "^9.6.1"
@@ -109,7 +109,7 @@
},
"../../packages/i18n": {
"name": "@d3ro/i18n",
- "version": "1.1.0",
+ "version": "1.2.0",
"license": "MIT",
"devDependencies": {
"@types/react": "^19.0.0"
@@ -120,7 +120,7 @@
},
"../../packages/ui-native": {
"name": "@d3ro/ui-native",
- "version": "1.1.0",
+ "version": "1.2.0",
"license": "MIT",
"devDependencies": {
"@types/react": "*"
diff --git a/apps/mobile-rn/package.json b/apps/mobile-rn/package.json
index 25f1180..7ea08ee 100644
--- a/apps/mobile-rn/package.json
+++ b/apps/mobile-rn/package.json
@@ -1,6 +1,6 @@
{
"name": "@d3ro/mobile-rn",
- "version": "1.1.0",
+ "version": "1.2.0",
"private": true,
"scripts": {
"android": "react-native run-android",
diff --git a/apps/web/package.json b/apps/web/package.json
index 48b54a6..c6cbf8b 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -1,6 +1,6 @@
{
"name": "@d3ro/web",
- "version": "1.1.0",
+ "version": "1.2.0",
"private": true,
"description": "D3RO Voice 웹 앱 — Next.js 기반 SaaS 인터페이스",
"scripts": {
diff --git a/apps/web/src/app/download/page.tsx b/apps/web/src/app/download/page.tsx
index 1b5cbb1..1135786 100644
--- a/apps/web/src/app/download/page.tsx
+++ b/apps/web/src/app/download/page.tsx
@@ -24,6 +24,7 @@ import {
DESKTOP_FEED_URL,
DESKTOP_RELEASE_HUB_URL,
DESKTOP_RELEASES_URL,
+ DESKTOP_RELEASE_DATE,
DESKTOP_VERSION,
DESKTOP_WINDOWS_INSTALLER_FILENAME,
DESKTOP_WINDOWS_INSTALLER_URL,
@@ -539,7 +540,7 @@ export default function DownloadPage(): React.ReactElement {
fontWeight: 500,
}}
/>
- 2026-08-29
+ {DESKTOP_RELEASE_DATE}