From 88a78f32bcccb96d824e3739a1a1fa8a0f3dc285 Mon Sep 17 00:00:00 2001 From: ian Date: Thu, 16 Apr 2026 12:54:45 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B3=B5=EA=B0=9C:=20=EB=8C=80=EC=95=88=20?= =?UTF-8?q?=EB=A9=94=EC=8B=A0=EC=A0=80=20=EA=B2=B0=ED=95=A9=20=EA=B3=B5?= =?UTF-8?q?=EB=B0=B1=20=ED=95=AD=EB=AA=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ALTERNATIVE_GAP.md | 77 ++++++++++++ BACKGROUND.md | 9 ++ FAQ.md | 4 + README.md | 8 ++ scripts/release/release-prepare-assets.sh | 145 +++++++++++++++++++++- scripts/release/release-upload-assets.sh | 8 ++ 6 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 ALTERNATIVE_GAP.md diff --git a/ALTERNATIVE_GAP.md b/ALTERNATIVE_GAP.md new file mode 100644 index 0000000..a39d788 --- /dev/null +++ b/ALTERNATIVE_GAP.md @@ -0,0 +1,77 @@ +# Why Existing Alternatives Still Leave A Gap + +KoTalk가 말하는 문제의식은 단순히 “카카오톡 말고 다른 앱도 있다”는 수준이 아닙니다. 실제로 국내에서 대안으로 거론되는 서비스는 여럿 있습니다. 다만 현재 공개적으로 확인되는 자료를 기준으로 보면, 아래 축을 **한 번에** 충족하는 사례는 아직 보이지 않습니다. + +- 한국어 사용자 습관과 국내 업무형 소통에 맞는 제품 표면 +- 기관·기업이 내부망 또는 자체 인프라에 올릴 수 있는 배포 선택권 +- 특정 사업자에 묶이지 않는 탈중앙화 또는 벤더 락인 완화 방향 +- 개인보안과 프라이버시를 전면에 둔 기술적 설계 +- 오픈소스, 커뮤니티 기여, 운영 설명 책임, 공개 거버넌스 같은 투명성 + +이 문서의 요지는 특정 대안을 폄하하는 것이 아닙니다. 오히려 각 대안은 분명한 장점이 있습니다. 문제는 **현재 국내에서 실제로 이동 후보로 거론되는 대안들**과 **보안·자체구축 관점에서 이상형으로 자주 언급되는 대안들**이 서로 다른 축을 잘 풀고 있다는 점입니다. KoTalk는 바로 그 끊어진 축들을 하나의 제품 표면으로 다시 묶으려 합니다. + +## What The Publicly Discussed Alternatives Prove + +2025년 가을 국내 기사 기준으로, 실제 “카카오톡에서 옮겨갈 수 있는 앱”으로 대중에게 가장 먼저 거론된 축은 LINE, NateOn, WhatsApp, Telegram 같은 소비자용 메신저였습니다. 즉, 시장은 이미 “대안 앱을 찾는 움직임” 자체는 보여 주었습니다.[^ytn-alt] + +Telegram은 이 이동 후보 가운데 특히 흥미로운 사례입니다. Telegram 공식 자료는 앱 소스 공개와 reproducible builds를 전면에 둡니다.[^telegram-apps] 동시에 같은 공식 FAQ는 Telegram을 cloud-based messenger로 설명하고, 기술 FAQ에서는 cloud chats의 기본 구조가 client-server encryption이며 end-to-end encryption은 Secret Chats에 해당한다고 구분합니다.[^telegram-cloud][^telegram-tech] 즉, Telegram은 검증 가능성과 사용성 일부에서는 강점을 보이지만, 그것만으로 `자체 구축 + 탈중앙화 + 조직 통제권`까지 해결되지는 않습니다. + +동시에 개인정보, 개인보안, 코드 검증 가능성 같은 축에서는 Signal이 꾸준히 강한 참고점으로 언급됩니다. Signal은 공식 지원 문서에서 기본 E2EE와 클라이언트·서버 소스 공개를 분명히 밝힙니다.[^signal-trust] 다만 같은 공식 문서에서 기존 전화번호와 SMS 또는 통화 기반 등록을 요구한다는 점도 분명히 설명합니다.[^signal-phone] + +반면 자체 구축, 탈중앙화, 개방형 거버넌스, 조직 통제권 같은 축에서는 Matrix가 가장 강한 기준점입니다. Matrix는 공식 소개에서 자신을 “decentralised, secure communications”를 위한 오픈 프로토콜로 규정하고, 재단의 공개 거버넌스 모델을 전면에 둡니다.[^matrix-about] 또한 공식 호스팅 문서는 자체 호스팅, 조직 데이터 통제, 온프레미스 지원을 명시합니다.[^matrix-hosting] + +즉, 현재 공개적으로 보이는 시장은 대략 이렇게 나뉩니다. + +- **이동이 쉬운 소비자용 대안**은 존재한다. +- **개인보안과 코드 검증성**을 강하게 보여 주는 대안도 존재한다. +- **자체 구축, 탈중앙화, 공개 거버넌스**를 강하게 보여 주는 대안도 존재한다. + +하지만 이 세 묶음이 **한국어 중심의 실제 대중 메신저 표면**에서 한 번에 붙어 있지는 않습니다. + +## The Gap KoTalk Is Explicitly Targeting + +KoTalk가 강조하는 차별점은 “조금 더 예쁜 메신저”가 아닙니다. 아래의 조합을 하나의 제품 경험으로 붙이는 것입니다. + +| Axis | What exists now | Why KoTalk still sees a gap | +|---|---|---| +| 대중적 이동 가능성 | 국내 기사에서 실제로 라인, 네이트온, 왓츠앱, 텔레그램 같은 대안 이동 흐름이 관측됩니다.[^ytn-alt] | 실제 이동 후보로 거론되는 앱들이 곧바로 `자체 구축 + 공개 거버넌스 + 소스 투명성`까지 함께 제공하는 것은 아닙니다. | +| 공개 검증성과 사용성의 절충 | Telegram은 공식적으로 앱 소스 공개와 reproducible builds를 제공하고, 대중적 이동 후보로도 반복 언급됩니다.[^telegram-apps][^ytn-alt] | 그러나 공식 설명 자체가 cloud-based 구조와 cloud chats/secret chats 분리를 전제로 하므로, 기관형 자체구축·탈중앙화 문제까지 한 번에 풀어 주는 해답은 아닙니다.[^telegram-cloud][^telegram-tech] | +| 개인보안 | Signal은 기본 E2EE, 소스 공개, 안전번호 검증을 분명히 제시합니다.[^signal-trust] | 그러나 한국어 중심 대중 메신저 전환 표면, 기관용 내부망 배치, 국내 업무 흐름 친화 UX까지 한 번에 해결한다고 보긴 어렵습니다. | +| 조직 통제권 | Matrix는 탈중앙화, 자체 호스팅, 온프레미스, 공개 거버넌스를 강하게 제공합니다.[^matrix-about][^matrix-hosting] | 하지만 현재 국내 대중이 “카톡 대안”으로 바로 이동하는 소비자용 표면과는 거리가 있습니다. | +| 투명성 | Signal, Matrix는 각각 소스 공개나 공개 거버넌스 측면에서 강점이 있습니다.[^signal-trust][^matrix-about] | 반대로 국내에서 쉽게 떠올리는 대중 메신저 대안은 이 투명성 축을 전면 가치로 제시하지 않는 경우가 많습니다. | + +## The Claim, Stated Carefully + +KoTalk는 이 점을 분명히 말합니다. + +> **현재 국내에서 대안으로 공개적으로 거론되는 서비스들과, 보안·자체구축 관점에서 이상형으로 참조되는 서비스들을 함께 놓고 보더라도, `한국어 중심 UX + 개인보안 + 내부망/자체구축 + 탈중앙화/락인 완화 + 커뮤니티 기반 투명성`을 한 번에 충족하는 사례는 공개 자료 기준으로 확인되지 않았습니다.** + +이 문장은 시장 전체를 영원히 단정하는 선언이 아닙니다. 다만 **현재 공개적으로 확인 가능한 자료와 국내 대중 이동 담론**을 놓고 보면, KoTalk가 겨냥하는 결합점이 여전히 비어 있다는 뜻입니다. + +## Why This Matters + +이 차이는 단순한 포지셔닝 문구가 아니라 제품 방향에 직접 연결됩니다. + +- 사내/기관 보안: 외부 SaaS에만 의존하지 않고 내부망·자체 인프라 선택권을 열어야 합니다. +- 개인보안: 대화 상대, 장치, 세션, 전송 실패, 재연결, 검증 가능한 암호화 흐름을 기본값으로 다뤄야 합니다. +- 투명성: 기능보다 먼저 정책·상태·데이터 경계를 설명할 수 있어야 합니다. +- 커뮤니티성: 폐쇄적 단일 결정 구조보다 공개 저장소, 이슈, 릴리즈, 문서, 피드백 반영 기록이 남아야 합니다. + +KoTalk는 이 네 가지를 보조 가치가 아니라 **핵심 가치**로 둡니다. + +## Read Next + +- 배경 맥락: [BACKGROUND.md](BACKGROUND.md) +- 현재 상태: [PROJECT_STATUS.md](PROJECT_STATUS.md) +- 신뢰 표면: [TRUST_CENTER.md](TRUST_CENTER.md) +- 배포 모드: [DEPLOYMENT_MODES.md](DEPLOYMENT_MODES.md) +- 마스터 플랜: [문서/README.md](문서/README.md) + +[^ytn-alt]: YTN, `["나 간다?"...급기야 카톡 탈출 움직임](https://www.ytn.co.kr/_ln/0103_202509301503327210_001)` (2025-09-30). 기사에는 LINE, NateOn, WhatsApp, Telegram 등이 실제 대체 메신저 후보로 급부상한 흐름이 정리돼 있습니다. +[^telegram-apps]: Telegram, [`Telegram Applications`](https://telegram.org/apps?setln=be). Telegram은 앱 소스 공개와 reproducible builds를 공식적으로 설명합니다. +[^telegram-cloud]: Telegram, [`Telegram Messenger`](https://telegram.org/help/settings). Telegram은 자신을 cloud-based mobile and desktop messaging app으로 설명합니다. +[^telegram-tech]: Telegram, [`FAQ for the Technically Inclined`](https://core.telegram.org/techfaq). Telegram은 cloud chats의 client-server encryption과 Secret Chats의 end-to-end encryption을 구분해 설명합니다. +[^signal-trust]: Signal Support, [`Is it private? Can I trust it?`](https://support.signal.org/hc/en-us/articles/360007320391-Is-it-private-Can-I-trust-it). Signal은 기본 E2EE와 클라이언트/서버 소스 공개를 공식적으로 설명합니다. +[^signal-phone]: Signal Support, [`Register a phone number`](https://support.signal.org/hc/en-us/articles/360007318691-Register-a-phone-number). Signal은 기존 전화번호와 SMS/통화 기반 등록을 요구한다고 설명합니다. +[^matrix-about]: Matrix.org Foundation, [`About Matrix`](https://matrix.org/foundation/about/). Matrix는 자신을 분산형 보안 통신 오픈 프로토콜로 소개하고, 공개 거버넌스를 명시합니다. +[^matrix-hosting]: Matrix.org, [`Hosting`](https://matrix.org/ecosystem/hosting/). Matrix 공식 문서는 자체 호스팅, 조직 데이터 통제, 온프레미스/운영 지원 사례를 제시합니다. diff --git a/BACKGROUND.md b/BACKGROUND.md index 43e78e6..1f6a535 100644 --- a/BACKGROUND.md +++ b/BACKGROUND.md @@ -40,6 +40,14 @@ KoTalk가 다시 붙잡으려는 감각은 “메신저가 해야 할 기본기 즉, 낯선 제품 철학을 강요하기보다 익숙한 대화 문법을 현대적인 방식으로 다시 정돈하는 프로젝트입니다. +## Why Existing Alternatives Still Leave A Gap + +KoTalk는 “대안 메신저는 이미 많다”는 반론을 피하지 않습니다. 실제로 국내 기사에서 이동 후보로 거론되는 메신저는 존재하고, 개인보안이나 탈중앙화 같은 일부 축을 강하게 풀어낸 프로젝트도 분명히 있습니다. + +다만 현재 공개 자료를 기준으로 보면, `국내 사용자 친화적인 한국어 UX`, `기관·기업용 내부망 또는 자체구축 가능성`, `탈중앙화 또는 락인 완화`, `개인보안`, `오픈소스와 공개 거버넌스에 기반한 운영 투명성`을 한 번에 붙여 보여 주는 사례는 확인되지 않습니다. + +이 점은 기존 배경의 보강 문장이 아니라 KoTalk의 별도 출발점입니다. 요약이 아니라 별도 문제 정의와 비교표는 [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)에 따로 정리했습니다. + ## Tone And Position 이 프로젝트는 특정 서비스를 공격하거나, “누군가를 대체하기 위해 무너져야 한다”는 식으로 접근하지 않습니다. 오히려 아래와 같은 태도에 가깝습니다. @@ -65,6 +73,7 @@ KoTalk가 다시 붙잡으려는 감각은 “메신저가 해야 할 기본기 - YTN, `카톡 검열 논란`: - YTN, `카카오톡, 오전 한때 6분간 접속·메시지 전송 오류`: - 연합뉴스, `"최소 6만5천명 정보 유출"…카카오에 과징금 151억 '역대 최대'`: +- 대안 비교와 결합점 설명: [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md) - 배경 정리 장문: [문서/14-project-background-and-market-context.md](문서/14-project-background-and-market-context.md) ## Read More diff --git a/FAQ.md b/FAQ.md index 7eb933f..edfeed6 100644 --- a/FAQ.md +++ b/FAQ.md @@ -18,6 +18,10 @@ KoTalk는 한국어 중심의 메시징 경험을 다시 설계하는 오픈소 아닙니다. 익숙한 구조는 참고하지만, 목표는 더 낮은 피로도와 더 짧은 복귀 흐름입니다. 복제보다 정제에 가깝습니다. +## 이미 대안 메신저가 많은데 왜 또 필요한가요 + +국내에서 실제로 이동 후보로 거론되는 메신저는 이미 있습니다. 다만 공개 자료를 기준으로 보면, `한국어 중심 UX`, `개인보안`, `기관·기업의 내부망 또는 자체 구축`, `탈중앙화 또는 락인 완화`, `오픈소스와 운영 투명성`을 한 번에 묶어 보여 주는 사례는 아직 뚜렷하지 않습니다. 이 프로젝트는 바로 그 결합점을 목표로 둡니다. 자세한 설명은 [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)에 따로 정리했습니다. + ## 지금 실제로 되는 것은 무엇인가요 - Windows 빌드 diff --git a/README.md b/README.md index fb246f3..7f0179e 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Project Status · Showcase · Background · + Alternative Gap · Brand Guide · FAQ · Releases · @@ -79,6 +80,12 @@ KoTalk는 단순히 새로운 메신저를 하나 더 만드는 시도가 아닙 KoTalk는 이 배경을 리스크 문구로 숨기지 않고, 왜 이 프로젝트가 필요한지 설명하는 핵심 맥락으로 다룹니다. 배경 요약은 [BACKGROUND.md](BACKGROUND.md), 더 긴 맥락은 [문서/14-project-background-and-market-context.md](문서/14-project-background-and-market-context.md)에 정리돼 있습니다. +## Why Current Alternatives Still Leave A Gap + +국내에서 실제로 대안으로 거론되는 메신저는 이미 존재합니다. 하지만 공개적으로 확인되는 자료를 기준으로 보면, `한국어 중심 UX`, `기관·기업의 내부망 또는 자체 인프라 배포`, `탈중앙화 또는 벤더 락인 완화`, `개인보안`, `오픈소스와 커뮤니티 기반 투명성`을 한 번에 묶어 보여 주는 사례는 아직 보이지 않습니다. + +KoTalk는 바로 그 비어 있는 결합점을 목표로 둡니다. 이 항목은 기존 배경 설명의 보조 문장이 아니라, 프로젝트의 별도 문제 정의입니다. 자세한 비교와 근거는 [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)에서 따로 설명합니다. + ## What Makes KoTalk Different | Focus | KoTalk approach | @@ -203,6 +210,7 @@ KoTalk의 현재 구조는 지나치게 복잡한 플랫폼보다, 작은 조각 - [ROADMAP.md](ROADMAP.md) - [BUSINESS_MODEL.md](BUSINESS_MODEL.md) +- [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md) - [문서/01-product-strategy-and-mvp.md](문서/01-product-strategy-and-mvp.md) - [문서/18-white-material-compact-ui-system.md](문서/18-white-material-compact-ui-system.md) - [문서/22-work-communication-ux-playbook.md](문서/22-work-communication-ux-playbook.md) diff --git a/scripts/release/release-prepare-assets.sh b/scripts/release/release-prepare-assets.sh index c899884..3a3d752 100755 --- a/scripts/release/release-prepare-assets.sh +++ b/scripts/release/release-prepare-assets.sh @@ -94,6 +94,7 @@ fi repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" release_root="$repo_root/release-assets/releases/$version" latest_root="$repo_root/release-assets/latest" +download_root="$repo_root/release-assets/root" template_path="$repo_root/release-assets/templates/RELEASE_NOTES.ko.md" download_base_url="${DOWNLOAD_BASE_URL:-https://download-vstalk.phy.kr}" release_base_url="${RELEASE_BASE_URL:-}" @@ -131,8 +132,8 @@ if [[ -e "$release_root" && "$force" != "true" ]]; then exit 1 fi -rm -rf "$release_root" "$latest_root" -mkdir -p "$release_root/screenshots" "$latest_root/screenshots" +rm -rf "$release_root" "$latest_root" "$download_root" +mkdir -p "$release_root/screenshots" "$latest_root/screenshots" "$download_root" if [[ -n "$notes_path" ]]; then cp "$notes_path" "$release_root/RELEASE_NOTES.ko.md" @@ -296,6 +297,145 @@ if (( ${#latest_hash_paths[@]} > 0 )); then ) fi +windows_landing_card="" +if [[ -n "$windows_zip" ]]; then + windows_landing_card="$(cat < + Windows + Latest Windows build + ZIP package and SHA256 checksum + +EOF +)" +fi + +android_landing_card="" +if [[ -n "$android_apk" ]]; then + android_landing_card="$(cat < + Android + Latest Android build + Universal APK and SHA256 checksum + +EOF +)" +fi + +cat > "$download_root/index.html" < + + + + + KoTalk Downloads + + + +
+
+

KoTalk Downloads

+

KoTalk의 최신 배포 파일과 버전 메타데이터를 제공하는 공식 다운로드 표면입니다.

+
+$windows_landing_card +$android_landing_card + + Manifest + Version manifest + Current release metadata and asset URLs + +
+
+

Version
$version

+

Channel
$channel

+

Published
$published_at

+

Latest notes
RELEASE_NOTES.ko.md

+
+
+
+ + +EOF + mapfile -t screenshot_files < <(find "$release_root/screenshots" -maxdepth 1 -type f \( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \) | sort) screenshots_json="[]" @@ -339,3 +479,4 @@ touch "$latest_root/.gitkeep" echo "Prepared release bundle:" echo " release-assets/releases/$version" echo " release-assets/latest" +echo " release-assets/root" diff --git a/scripts/release/release-upload-assets.sh b/scripts/release/release-upload-assets.sh index 3cb205d..4fc9419 100755 --- a/scripts/release/release-upload-assets.sh +++ b/scripts/release/release-upload-assets.sh @@ -66,6 +66,7 @@ fi repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" release_root="$repo_root/release-assets/releases/$version" latest_root="$repo_root/release-assets/latest" +download_root="$repo_root/release-assets/root" if [[ ! -d "$release_root" || ! -d "$latest_root" ]]; then echo "Prepared release bundle not found for version $version" >&2 @@ -90,6 +91,13 @@ rsh="${ssh_cmd[*]}" "${ssh_cmd[@]}" "$target_host" "mkdir -p '$target/releases/$version' '$target/latest' '$target/windows/latest' '$target/android/latest'" rsync "${rsync_opts[@]}" -e "$rsh" "$release_root"/ "$target_host:$target/releases/$version/" rsync "${rsync_opts[@]}" -e "$rsh" "$latest_root"/ "$target_host:$target/latest/" +if [[ -f "$download_root/index.html" ]]; then + root_rsync_opts=(-az) + if [[ "$dry_run" == "true" ]]; then + root_rsync_opts+=(--dry-run) + fi + rsync "${root_rsync_opts[@]}" -e "$rsh" "$download_root/index.html" "$target_host:$target/index.html" +fi if [[ -d "$latest_root/windows" ]]; then rsync "${rsync_opts[@]}" -e "$rsh" "$latest_root/windows/" "$target_host:$target/windows/latest/" fi