release: ship v1.7.0 with two-way cloud sync and streaming captions
Some checks failed
ci / 정본·보안·린트·타입·테스트 (push) Successful in 52s
ci / 모바일 린트·타입·Jest (push) Successful in 41s
ci / Supabase Edge Functions + Cloudflare Worker (push) Successful in 24s
ci / .NET API 서버 테스트 (push) Successful in 11s
deploy-site / deploy (push) Successful in 44s
ci / 워크스페이스 빌드 검증 (push) Successful in 35s
release / release-windows (push) Failing after 6m37s
portable-unsigned / portable-windows (push) Failing after 21m42s

Signing in now keeps history, dictionary, meetings with memos and documents,
memo tags, user commands and templates the same on desktop, phone and web,
with offline changes queued, deletions shared and phone edits arriving live.
The desktop registers in the phone's device list and signs out when
disconnected there; local-mode records move into the first account.

Live captions stream about a second behind speech, finish lines on pauses,
are polished in context by the local model and can use their own speech
model (the speech engine is downloaded again once, minimum 1.7.0).

Fixes suggestion paste on Ctrl+Alt+Enter, click acceptance, typing detection
in growing chat boxes, one-way cloud sync and failing account exports.

Bumps the product version to 1.7.0 (Android/iOS build 1070000).
This commit is contained in:
Yun Chan 2026-09-27 14:08:18 +09:00
parent 6b06442412
commit 3d9faedf7d
24 changed files with 74 additions and 51 deletions

View file

@ -7,7 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Planned
- macOS / Linux support
- Additional Whisper model management UI
- Plugin system for custom pipelines
## [1.7.0] - 2026-09-27
> Published from an annotated tag. Installer and update metadata are served by the
> canonical Forgejo feed; no binaries are committed to this repository.
### Added
- **Your desktop and phone now stay in step.** Signing in keeps history (with titles
and favorites), the dictionary, meetings with their memos and documents, memo tags,
your own commands and dictation/meeting templates the same on the desktop, the phone
and the web. Changes made offline wait and upload later; what you delete on one
device is deleted on the others; edits from the phone appear within seconds.
- **The desktop appears in the phone's device list.** Disconnecting it from the phone
signs the desktop out; signing out on the desktop removes it from the list.
- **Records made before signing in come with you.** The first account that signs in
on this computer receives the history, dictionary and meetings kept in local mode.
- **Favorites on the desktop**, shared with the phone.
- Settings > Cloud shows how many changes are waiting to upload or were refused.
- **Live captions stream as you listen.** Words appear about a second after they are
spoken and keep updating while the sentence is in progress; the part that is no
longer changing is shown solid and the rest dimmed. A pause finishes the line, and
@ -38,12 +59,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
was taken for a different field on every keystroke, which kept blocking suggestions
as "not typing". Fields are now told apart by window and control, and a mouse click
re-checks whether you have typed since.
### Planned
- macOS / Linux support
- Additional Whisper model management UI
- Cloud-optional backup (encrypted, opt-in)
- Plugin system for custom pipelines
- **Cloud sync was mostly one-way.** Data created on the phone never reached the
desktop after signing in, only the first meeting's memos and documents were
uploaded, deletions were never shared, team meetings leaked into personal data, and
live updates never connected. All fixed.
- Exporting account data failed for accounts with meetings; the export keeps its
original format again.
## [1.6.0] - 2026-09-24

View file

@ -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.6.0"
"version": "1.7.0"
},
"servers": [
{

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/admin",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice Admin CRM — SaaS 관리 도구",
"scripts": {

View file

@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Version>1.6.0</Version>
<Version>1.7.0</Version>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/desktop",
"version": "1.6.0",
"version": "1.7.0",
"productName": "d3ro-voice",
"description": "로컬 AI 음성 어시스턴트 (Electron)",
"main": "./out/main/index.js",

View file

@ -151,8 +151,8 @@ def versionSettingsValid = configuredVersionName != null &&
configuredVersionName ==~ strictSemver &&
configuredVersionCodeValue != null &&
configuredVersionCodeValue <= 2100000000L
def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.6.0"
def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1060000
def resolvedVersionName = versionSettingsValid ? configuredVersionName : "1.7.0"
def resolvedVersionCode = versionSettingsValid ? configuredVersionCodeValue.toInteger() : 1070000
def requiredReleaseSettings = [
D3RO_RELEASE_STORE_FILE: releaseStoreFilePath,

View file

@ -257,7 +257,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1060000;
CURRENT_PROJECT_VERSION = 1070000;
ENABLE_BITCODE = NO;
INFOPLIST_FILE = D3ROVoice/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
@ -265,7 +265,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.6.0;
MARKETING_VERSION = 1.7.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@ -287,14 +287,14 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = 1060000;
CURRENT_PROJECT_VERSION = 1070000;
INFOPLIST_FILE = D3ROVoice/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.6.0;
MARKETING_VERSION = 1.7.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",

View file

@ -0,0 +1 @@
Syncing with the desktop app is fixed. The device list now shows the desktop app and lets you disconnect it. Exporting your data no longer fails for accounts with meetings.

View file

@ -0,0 +1 @@
데스크톱 앱과의 동기화를 고쳤습니다. 연결된 기기 목록에 데스크톱 앱이 함께 표시되고, 여기서 연결을 해제할 수 있습니다. 데이터 내보내기가 회의가 있는 계정에서 실패하던 문제도 수정했습니다.

View file

@ -1,12 +1,12 @@
{
"name": "@d3ro/mobile-rn",
"version": "1.6.0",
"version": "1.7.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@d3ro/mobile-rn",
"version": "1.6.0",
"version": "1.7.0",
"dependencies": {
"@d3ro/api-client": "file:../../packages/api-client",
"@d3ro/core": "file:../../packages/core",
@ -62,7 +62,7 @@
},
"../..": {
"name": "d3ro-voice-monorepo",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"workspaces": [
"apps/desktop",
@ -81,7 +81,7 @@
},
"../../packages/api-client": {
"name": "@d3ro/api-client",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"@d3ro/core": "*",
@ -98,7 +98,7 @@
},
"../../packages/core": {
"name": "@d3ro/core",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"docx": "^9.6.1"
@ -109,7 +109,7 @@
},
"../../packages/i18n": {
"name": "@d3ro/i18n",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"devDependencies": {
"@types/react": "^19.0.0"
@ -120,7 +120,7 @@
},
"../../packages/ui-native": {
"name": "@d3ro/ui-native",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"devDependencies": {
"@types/react": "*"

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/mobile-rn",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"scripts": {
"android": "react-native run-android",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/web",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice 웹 앱 — Next.js 기반 SaaS 인터페이스",
"scripts": {

View file

@ -139,7 +139,7 @@ export function Sidebar(): React.ReactElement {
</PhosphorText>
</Box>
<Box sx={{ fontSize: '10px', fontFamily: 'ui-monospace, monospace', color: d3roPalette.text.muted }}>
v1.6.0
v1.7.0
</Box>
</Box>

20
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "d3ro-voice-monorepo",
"version": "1.6.0",
"version": "1.7.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "d3ro-voice-monorepo",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"workspaces": [
"apps/desktop",
@ -25,7 +25,7 @@
},
"apps/admin": {
"name": "@d3ro/admin",
"version": "1.6.0",
"version": "1.7.0",
"dependencies": {
"@d3ro/api-client": "*",
"@d3ro/core": "*",
@ -109,7 +109,7 @@
},
"apps/desktop": {
"name": "@d3ro/desktop",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"@d3ro/core": "*",
@ -161,7 +161,7 @@
},
"apps/web": {
"name": "@d3ro/web",
"version": "1.6.0",
"version": "1.7.0",
"dependencies": {
"@d3ro/api-client": "*",
"@d3ro/core": "*",
@ -17216,7 +17216,7 @@
},
"packages/api-client": {
"name": "@d3ro/api-client",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"@d3ro/core": "*",
@ -17233,7 +17233,7 @@
},
"packages/core": {
"name": "@d3ro/core",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"docx": "^9.6.1"
@ -17244,7 +17244,7 @@
},
"packages/i18n": {
"name": "@d3ro/i18n",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"devDependencies": {
"@types/react": "^19.0.0"
@ -17255,7 +17255,7 @@
},
"packages/ui": {
"name": "@d3ro/ui",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"dependencies": {
"@d3ro/core": "*"
@ -17275,7 +17275,7 @@
},
"packages/ui-native": {
"name": "@d3ro/ui-native",
"version": "1.6.0",
"version": "1.7.0",
"license": "MIT",
"devDependencies": {
"@types/react": "*"

View file

@ -1,6 +1,6 @@
{
"name": "d3ro-voice-monorepo",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice — 멀티플랫폼 AI 음성 어시스턴트 (Monorepo)",
"author": "D3RO",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/api-client",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice API 클라이언트 — Supabase 래퍼 (web/desktop/mobile 공유)",
"license": "MIT",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/core",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice 공유 비즈니스 로직 — 타입, 에러, IPC 채널, 상수, 유틸",
"license": "MIT",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/i18n",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice 공유 i18n — 12개 locale, 타입 안전 키, Context, 포맷 유틸",
"license": "MIT",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/ui-native",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice React Native DS — MetalCard/PhosphorText/Led/WaveBars etc.",
"license": "MIT",

View file

@ -1,6 +1,6 @@
{
"name": "@d3ro/ui",
"version": "1.6.0",
"version": "1.7.0",
"private": true,
"description": "D3RO Voice 공유 UI — 디자인 시스템 컴포넌트 + 테마 토큰 + CSS 변수 맵",
"license": "MIT",

View file

@ -1,8 +1,8 @@
{
"schemaVersion": 1,
"version": "1.6.0",
"androidVersionCode": 1060000,
"iosBuildNumber": 1060000,
"releaseDate": "2026-09-24",
"version": "1.7.0",
"androidVersionCode": 1070000,
"iosBuildNumber": 1070000,
"releaseDate": "2026-09-27",
"desktopLicensePublicKeyId": "5c52b765135ee2531c681b53cd4dc0e96fff8737f496c0b04ba8334fc81a887f"
}

View file

@ -1,12 +1,12 @@
{
"name": "d3ro-voice-site",
"version": "1.6.0",
"version": "1.7.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "d3ro-voice-site",
"version": "1.6.0",
"version": "1.7.0",
"dependencies": {
"react": "^19.0.0",
"react-dom": "^19.0.0"

View file

@ -1,7 +1,7 @@
{
"name": "d3ro-voice-site",
"private": true,
"version": "1.6.0",
"version": "1.7.0",
"type": "module",
"scripts": {
"dev": "vite --port 5199 --host",

View file

@ -5,10 +5,10 @@
// NAS 배포는 바이너리를 포함하지 않으므로 `/releases/...` 같은 로컬 경로는
// 실제 배포 환경에서 404가 된다.
export const DESKTOP_VERSION = '1.6.0'
export const DESKTOP_VERSION = '1.7.0'
/** 릴리스 게시일. `release/product-version.json`의 releaseDate와 같아야 한다. */
export const DESKTOP_RELEASE_DATE = '2026-09-24'
export const DESKTOP_RELEASE_DATE = '2026-09-27'
const FORGEJO_ORIGIN = 'https://git.chanpaca.net'
const FORGEJO_OWNER = 'yunchan'