공개: 대안 메신저 결합 공백 항목 추가

This commit is contained in:
Ian 2026-04-16 12:54:45 +09:00
commit 88a78f32bc
6 changed files with 249 additions and 2 deletions

77
ALTERNATIVE_GAP.md Normal file
View file

@ -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 공식 문서는 자체 호스팅, 조직 데이터 통제, 온프레미스/운영 지원 사례를 제시합니다.

View file

@ -40,6 +40,14 @@ KoTalk가 다시 붙잡으려는 감각은 “메신저가 해야 할 기본기
즉, 낯선 제품 철학을 강요하기보다 익숙한 대화 문법을 현대적인 방식으로 다시 정돈하는 프로젝트입니다. 즉, 낯선 제품 철학을 강요하기보다 익숙한 대화 문법을 현대적인 방식으로 다시 정돈하는 프로젝트입니다.
## Why Existing Alternatives Still Leave A Gap
KoTalk는 “대안 메신저는 이미 많다”는 반론을 피하지 않습니다. 실제로 국내 기사에서 이동 후보로 거론되는 메신저는 존재하고, 개인보안이나 탈중앙화 같은 일부 축을 강하게 풀어낸 프로젝트도 분명히 있습니다.
다만 현재 공개 자료를 기준으로 보면, `국내 사용자 친화적인 한국어 UX`, `기관·기업용 내부망 또는 자체구축 가능성`, `탈중앙화 또는 락인 완화`, `개인보안`, `오픈소스와 공개 거버넌스에 기반한 운영 투명성`을 한 번에 붙여 보여 주는 사례는 확인되지 않습니다.
이 점은 기존 배경의 보강 문장이 아니라 KoTalk의 별도 출발점입니다. 요약이 아니라 별도 문제 정의와 비교표는 [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)에 따로 정리했습니다.
## Tone And Position ## Tone And Position
이 프로젝트는 특정 서비스를 공격하거나, “누군가를 대체하기 위해 무너져야 한다”는 식으로 접근하지 않습니다. 오히려 아래와 같은 태도에 가깝습니다. 이 프로젝트는 특정 서비스를 공격하거나, “누군가를 대체하기 위해 무너져야 한다”는 식으로 접근하지 않습니다. 오히려 아래와 같은 태도에 가깝습니다.
@ -65,6 +73,7 @@ KoTalk가 다시 붙잡으려는 감각은 “메신저가 해야 할 기본기
- YTN, `카톡 검열 논란`: <https://www.ytn.co.kr/_ln/0519_202506171620012347> - YTN, `카톡 검열 논란`: <https://www.ytn.co.kr/_ln/0519_202506171620012347>
- YTN, `카카오톡, 오전 한때 6분간 접속·메시지 전송 오류`: <https://www.ytn.co.kr/_ln/0102_202409201022119491> - YTN, `카카오톡, 오전 한때 6분간 접속·메시지 전송 오류`: <https://www.ytn.co.kr/_ln/0102_202409201022119491>
- 연합뉴스, `"최소 6만5천명 정보 유출"…카카오에 과징금 151억 '역대 최대'`: <https://www.yna.co.kr/view/AKR20240523065500530> - 연합뉴스, `"최소 6만5천명 정보 유출"…카카오에 과징금 151억 '역대 최대'`: <https://www.yna.co.kr/view/AKR20240523065500530>
- 대안 비교와 결합점 설명: [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)
- 배경 정리 장문: [문서/14-project-background-and-market-context.md](문서/14-project-background-and-market-context.md) - 배경 정리 장문: [문서/14-project-background-and-market-context.md](문서/14-project-background-and-market-context.md)
## Read More ## Read More

4
FAQ.md
View file

@ -18,6 +18,10 @@ KoTalk는 한국어 중심의 메시징 경험을 다시 설계하는 오픈소
아닙니다. 익숙한 구조는 참고하지만, 목표는 더 낮은 피로도와 더 짧은 복귀 흐름입니다. 복제보다 정제에 가깝습니다. 아닙니다. 익숙한 구조는 참고하지만, 목표는 더 낮은 피로도와 더 짧은 복귀 흐름입니다. 복제보다 정제에 가깝습니다.
## 이미 대안 메신저가 많은데 왜 또 필요한가요
국내에서 실제로 이동 후보로 거론되는 메신저는 이미 있습니다. 다만 공개 자료를 기준으로 보면, `한국어 중심 UX`, `개인보안`, `기관·기업의 내부망 또는 자체 구축`, `탈중앙화 또는 락인 완화`, `오픈소스와 운영 투명성`을 한 번에 묶어 보여 주는 사례는 아직 뚜렷하지 않습니다. 이 프로젝트는 바로 그 결합점을 목표로 둡니다. 자세한 설명은 [ALTERNATIVE_GAP.md](ALTERNATIVE_GAP.md)에 따로 정리했습니다.
## 지금 실제로 되는 것은 무엇인가요 ## 지금 실제로 되는 것은 무엇인가요
- Windows 빌드 - Windows 빌드

View file

@ -30,6 +30,7 @@
<a href="PROJECT_STATUS.md">Project Status</a> · <a href="PROJECT_STATUS.md">Project Status</a> ·
<a href="SHOWCASE.md">Showcase</a> · <a href="SHOWCASE.md">Showcase</a> ·
<a href="BACKGROUND.md">Background</a> · <a href="BACKGROUND.md">Background</a> ·
<a href="ALTERNATIVE_GAP.md">Alternative Gap</a> ·
<a href="branding/BRAND_GUIDE.md">Brand Guide</a> · <a href="branding/BRAND_GUIDE.md">Brand Guide</a> ·
<a href="FAQ.md">FAQ</a> · <a href="FAQ.md">FAQ</a> ·
<a href="RELEASING.md">Releases</a> · <a href="RELEASING.md">Releases</a> ·
@ -79,6 +80,12 @@ KoTalk는 단순히 새로운 메신저를 하나 더 만드는 시도가 아닙
KoTalk는 이 배경을 리스크 문구로 숨기지 않고, 왜 이 프로젝트가 필요한지 설명하는 핵심 맥락으로 다룹니다. 배경 요약은 [BACKGROUND.md](BACKGROUND.md), 더 긴 맥락은 [문서/14-project-background-and-market-context.md](문서/14-project-background-and-market-context.md)에 정리돼 있습니다. 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 ## What Makes KoTalk Different
| Focus | KoTalk approach | | Focus | KoTalk approach |
@ -203,6 +210,7 @@ KoTalk의 현재 구조는 지나치게 복잡한 플랫폼보다, 작은 조각
- [ROADMAP.md](ROADMAP.md) - [ROADMAP.md](ROADMAP.md)
- [BUSINESS_MODEL.md](BUSINESS_MODEL.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) - [문서/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) - [문서/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) - [문서/22-work-communication-ux-playbook.md](문서/22-work-communication-ux-playbook.md)

View file

@ -94,6 +94,7 @@ fi
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
release_root="$repo_root/release-assets/releases/$version" release_root="$repo_root/release-assets/releases/$version"
latest_root="$repo_root/release-assets/latest" 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" template_path="$repo_root/release-assets/templates/RELEASE_NOTES.ko.md"
download_base_url="${DOWNLOAD_BASE_URL:-https://download-vstalk.phy.kr}" download_base_url="${DOWNLOAD_BASE_URL:-https://download-vstalk.phy.kr}"
release_base_url="${RELEASE_BASE_URL:-}" release_base_url="${RELEASE_BASE_URL:-}"
@ -131,8 +132,8 @@ if [[ -e "$release_root" && "$force" != "true" ]]; then
exit 1 exit 1
fi fi
rm -rf "$release_root" "$latest_root" rm -rf "$release_root" "$latest_root" "$download_root"
mkdir -p "$release_root/screenshots" "$latest_root/screenshots" mkdir -p "$release_root/screenshots" "$latest_root/screenshots" "$download_root"
if [[ -n "$notes_path" ]]; then if [[ -n "$notes_path" ]]; then
cp "$notes_path" "$release_root/RELEASE_NOTES.ko.md" cp "$notes_path" "$release_root/RELEASE_NOTES.ko.md"
@ -296,6 +297,145 @@ if (( ${#latest_hash_paths[@]} > 0 )); then
) )
fi fi
windows_landing_card=""
if [[ -n "$windows_zip" ]]; then
windows_landing_card="$(cat <<EOF
<a class="card" href="/windows/latest">
<span class="eyebrow">Windows</span>
<strong>Latest Windows build</strong>
<span>ZIP package and SHA256 checksum</span>
</a>
EOF
)"
fi
android_landing_card=""
if [[ -n "$android_apk" ]]; then
android_landing_card="$(cat <<EOF
<a class="card" href="/android/latest">
<span class="eyebrow">Android</span>
<strong>Latest Android build</strong>
<span>Universal APK and SHA256 checksum</span>
</a>
EOF
)"
fi
cat > "$download_root/index.html" <<EOF
<!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>KoTalk Downloads</title>
<style>
:root {
color-scheme: light;
--bg: #f7f3ee;
--surface: #ffffff;
--surface-muted: #f1ebe4;
--border: #ddd1c4;
--text: #20242b;
--text-soft: #5f5a54;
--accent: #f05b2b;
--accent-soft: #394350;
}
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
font-family: Inter, "Segoe UI", system-ui, -apple-system, sans-serif;
background: var(--bg);
color: var(--text);
}
main {
max-width: 920px;
margin: 0 auto;
padding: 48px 24px 64px;
}
.hero {
background: var(--surface);
border: 1px solid var(--border);
padding: 24px;
}
h1 {
margin: 0 0 10px;
font-size: 34px;
line-height: 1.1;
letter-spacing: -0.04em;
}
p {
margin: 0;
color: var(--text-soft);
line-height: 1.6;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 16px;
margin-top: 20px;
}
.card {
display: flex;
flex-direction: column;
gap: 8px;
text-decoration: none;
color: inherit;
background: var(--surface);
border: 1px solid var(--border);
padding: 18px;
}
.card:hover {
border-color: var(--accent);
}
.eyebrow {
color: var(--accent-soft);
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.meta {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-top: 20px;
}
.meta a {
color: var(--accent-soft);
}
@media (max-width: 640px) {
main { padding: 24px 16px 40px; }
h1 { font-size: 28px; }
}
</style>
</head>
<body>
<main>
<section class="hero">
<h1>KoTalk Downloads</h1>
<p>KoTalk의 최신 배포 파일과 버전 메타데이터를 제공하는 공식 다운로드 표면입니다.</p>
<div class="grid">
$windows_landing_card
$android_landing_card
<a class="card" href="/latest/version.json">
<span class="eyebrow">Manifest</span>
<strong>Version manifest</strong>
<span>Current release metadata and asset URLs</span>
</a>
</div>
<div class="meta">
<p><strong>Version</strong><br>$version</p>
<p><strong>Channel</strong><br>$channel</p>
<p><strong>Published</strong><br>$published_at</p>
<p><strong>Latest notes</strong><br><a href="/latest/RELEASE_NOTES.ko.md">RELEASE_NOTES.ko.md</a></p>
</div>
</section>
</main>
</body>
</html>
EOF
mapfile -t screenshot_files < <(find "$release_root/screenshots" -maxdepth 1 -type f \( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \) | sort) mapfile -t screenshot_files < <(find "$release_root/screenshots" -maxdepth 1 -type f \( -iname '*.png' -o -iname '*.jpg' -o -iname '*.jpeg' \) | sort)
screenshots_json="[]" screenshots_json="[]"
@ -339,3 +479,4 @@ touch "$latest_root/.gitkeep"
echo "Prepared release bundle:" echo "Prepared release bundle:"
echo " release-assets/releases/$version" echo " release-assets/releases/$version"
echo " release-assets/latest" echo " release-assets/latest"
echo " release-assets/root"

View file

@ -66,6 +66,7 @@ fi
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
release_root="$repo_root/release-assets/releases/$version" release_root="$repo_root/release-assets/releases/$version"
latest_root="$repo_root/release-assets/latest" latest_root="$repo_root/release-assets/latest"
download_root="$repo_root/release-assets/root"
if [[ ! -d "$release_root" || ! -d "$latest_root" ]]; then if [[ ! -d "$release_root" || ! -d "$latest_root" ]]; then
echo "Prepared release bundle not found for version $version" >&2 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'" "${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" "$release_root"/ "$target_host:$target/releases/$version/"
rsync "${rsync_opts[@]}" -e "$rsh" "$latest_root"/ "$target_host:$target/latest/" 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 if [[ -d "$latest_root/windows" ]]; then
rsync "${rsync_opts[@]}" -e "$rsh" "$latest_root/windows/" "$target_host:$target/windows/latest/" rsync "${rsync_opts[@]}" -e "$rsh" "$latest_root/windows/" "$target_host:$target/windows/latest/"
fi fi