# RunCoach 워치앱 랜딩페이지 — AI와 함께 기획부터 Vercel 배포까지 한 번에
---
## 소개
### 시도하고자 했던 것과 그 이유
갤럭시 워치5 전용 AI 러닝 코칭 앱 **RunCoach**를 만들었는데, 앱만 있으면 아무도 모르잖아요.
앱을 소개하고 실제로 판매까지 연결할 수 있는 **랜딩페이지**가 필요했습니다. 근데 막상 만들려고 하니 고민이 생겼어요.
> "어떤 기능을 앞에 내세워야 할까?"
> "타깃을 어떻게 설정하지?"
> "가격은 구독으로 해야 할까, 일회성 구매로 해야 할까?"
그냥 Claude한테 "랜딩페이지 만들어줘" 라고 하면 일반적인 SaaS 템플릿 같은 게 나올 것 같았어요. 그래서 이번엔 `/thinking-partner` 모드로 먼저 **기획을 함께 설계**하고, 그 다음에 코드를 만들어보기로 했습니다.
목표는 하나였어요.
**"코드 한 줄 안 쓰고, 기획~디자인~개발~배포까지 오늘 안에 끝낸다."**
---
## 진행 방법
### 사용 도구
- **Claude Code** — 기획, 코드 구현, 배포 안내 전 과정
- **`/thinking-partner`** — 랜딩페이지 구조 설계를 위한 질문 중심 대화
- **Vercel CLI** — `vercel --prod` 한 줄로 배포
---
### Step 1. Thinking Partner로 기획 먼저
바로 만들지 않고, `/thinking-partner` 모드로 전환해서 질문을 받으며 구조를 잡았어요.
Claude가 답을 주는 게 아니라 **저에게 질문**을 던집니다.
```
💬 Claude: "이 랜딩페이지의 방문자는 누구인가요?
달리기를 막 시작한 초보자? 기존 러닝앱에서 갈아타려는 사람?
갤럭시 워치5를 가지고 있는데 활용 못 하고 있는 사람?"
```
```
💬 Claude: "방문자가 페이지에 들어왔을 때, 처음 5초 안에
무슨 말을 들어야 '이거 나한테 필요한 앱이네'라고 느낄까요?
후보를 하나 드리면 —
'매주 일요일, 손목에서 시작하는 나만의 러닝 코치'
이 문장이 맞는 방향인가요?"
```
이 과정에서 제가 직접 ��뽑은 메인 카피:
> **"항상 당신과 함께 달리는 런코치, 개인비서처럼 당신의 러닝습관을 브리핑하자!"**
그리고 가격 모델도 이 대화에서 결정했어요.
- ❌ 월정액 구독
- ✅ **무료 10회 체험 + 일회성 구매 ₩9,900**
질문을 통해 나온 최종 설계:
| 항목 | 결정 내용 |
|------|----------|
| 타깃 | 40~50대 주말러너, Galaxy Watch 5/6/7/8 사용자 |
| 핵심 차별점 | 기록 앱이 아니라 AI 러닝 코치 |
| 브리핑 스타일 | 숫자 중심 ❌ → 전략 중심 ✅ |
| 가격 | 무료 10회 + 일회성 ₩9,900 |
---
### Step 2. 랜딩페이지 제작
기획이 확정되자마자 Claude Code가 바로 `index.html` 단일 파일로 전체 랜딩페이지를 만들었습니다.
**10개 섹션 구성:**
| # | 섹션 | 내용 |
|---|------|------|
| 1 | 네비게이션 | 로고 + 무료로 시작 CTA |
| 2 | 히어로 | 메인 카피 + 워치 CSS 목업 |
| 3 | AI 브리핑 | 러닝 전/후 샘플 카드 + 재생 버튼 |
| 4 | 워치 커스터마이저 | 객관식 선택 → 실시간 워치 미리보기 |
| 5 | 핵심 기능 | 6개 카드 |
| 6 | 앱 플로우 | 5단계 워치 화면 흐름 |
| 7 | 페르소나 | 40~50대 공감 카드 2인 |
| 8 | 가격 | 무료 10회 vs ₩9,900 평생권 |
| 9 | FAQ | 아코디언 5개 |
| 10 | 하단 CTA | 최종 전환 유도 |
특히 **워치 커스터마이저 섹션**이 재미있어요. 방문자가 폰트·색상·버튼 위치를 직접 선택하면 오른쪽 워치 화면이 실시간으로 바뀝니다.
```javascript
// 커스터마이저 실시간 반영 핵심 코드
function setOption(btn, group, val) {
document.querySelectorAll(`[data-group="${group}"]`)
.forEach(b => b.classList.remove('active'));
btn.classList.add('active');
state[group] = val;
updatePreview(); // 워치 미리보기 즉시 반영
}
```
---
### Step 3. Vercel 배포
```bash
# 1. 프리뷰 배포
vercel
# 2. 프로덕션 배포
vercel --prod
```
두 줄로 끝났습니다.
**배포 URL:** https://deploy-iota-opal.vercel.app
한 가지 주의할 점이 있었어요. 처음 `vercel.json`에 `builds` 설정을 넣었더니 경고가 발생했습니다. 정적 HTML 사이트는 아래처럼 단순하게 두는 게 좋습니다.
```json
{
"cleanUrls": true,
"trailingSlash": false
}
```
---
### Step 4. 실제 음성 재생 기능
브리핑 카드에 ▶ 버튼이 있지만 처음엔 인터랙션만 있고 소리가 없었어요. 브라우저 내장 **Web Speech API**를 써서 실제 한국어 음성 재생을 구현했습니다. 외부 API나 오디오 파일이 전혀 필요 없습니다.
```javascript
const utterance = new SpeechSynthesisUtterance(script);
utterance.lang = 'ko-KR';
utterance.rate = 0.95;
utterance.pitch = 1.05;
window.speechSynthesis.speak(utterance);
```
---
### Step 5. 코치 스타일 5종 선택 기능
여기서 가장 재미있었던 부분입니다. 단순히 TTS pitch/rate 값만 바꾸는 게 아니라, **스타일마다 스크립트 문체 자체를 다르게** 작성했어요.
| 스타일 | 실제 멘트 예시 |
|--------|-------------|
| 🌸 귀여운 여성 | "지난주에 5.1킬로 달리셨잖아요. 대박이에요! 화이팅!" |
| 🎸 중저음 남성 | "오늘 목표는 5.3킬로미터. 오늘도 완주합시다." |
| 💼 카랑카랑 비서 | "직전 세션, 5.1킬로미터, 완주. 브리핑 종료. 출발하십시오." |
| 🚇 아나운서 | "안내 말씀 드리겠습니다. 건강하고 안전한 러닝 되시기 바랍니다." |
| 😤 까칠한 배우자 | "맨날 초반에 힘 빼가지고... 이번엔 제대로 해봐. 씻어." |
까칠한 배우자 스타일이 제일 인기 있을 것 같습니다 😄
```javascript
const VOICE_STYLES = {
cute: { pitch: 1.45, rate: 1.08, pre: "안녕하세요~! 완전 기대돼요!..." },
deep: { pitch: 0.55, rate: 0.82, pre: "오늘 러닝을 시작합니다..." },
secretary: { pitch: 1.12, rate: 1.18, pre: "오늘 러닝 브리핑입니다..." },
announcer: { pitch: 0.88, rate: 0.78, pre: "안내 말씀 드리겠습니다..." },
spouse: { pitch: 1.02, rate: 1.06, pre: "어, 또 뛰러 가?..." }
};
```
---
## 결과와 배운 점
### 배운 점
**1. Thinking Partner 먼저, 코드는 나중에**
"랜딩페이지 만들어줘" 한 마디로 시작했다면 일반적인 결과물이 나왔을 거예요. `/thinking-partner`로 5분 동안 대화한 것만으로 타깃, 카피, 가격 모델이 전부 정해졌습니다. 설계가 명확하니 코드도 수정이 거의 없었어요.
**2. Web Speech API는 생각보다 강력하다**
외부 TTS API 쓰면 비용도 들고 키 관리도 해야 하는데, 브라우저 내장 API로 한국어 음성이 충분히 나옵니다. pitch/rate 파라미터로 캐릭터도 만들 수 있어요.
**3. 기획 질문 하나가 방향을 바꾼다**
"러닝 전 브리핑에서 가장 듣고 싶은 말이 뭔가요?" 라는 질문에 A(숫자), B(전략), C(컨디션) 중 **B(전략 중심)** 을 선택한 것이 앱의 핵심 메시지가 됐습니다. 이 선택 하나로 카피, 섹션 구성, 스크립트 문체가 전부 맞춰졌어요.
---
### 시행착오
- **vercel.json builds 경고**: 처음에 `@vercel/static` builds 설정을 넣었더니 배포 경고 발생. 정적 사이트는 `cleanUrls`만 있으면 충분.
- **Chrome TTS 버그**: 긴 텍스트를 읽다가 중간에 멈추는 Chrome 버그가 있음. 5초마다 `speechSynthesis.resume()` 호출로 해결.
- **iOS Safari TTS**: 사용자 터치 없이는 TTS가 동작 안 함. 버튼 탭으로 시작하는 구조라 문제없지만, 자동재생은 불가.
---
### 앞으로의 계획
- [ ] Google Play 실제 구매 링크 연결
- [ ] 개인정보처리방침 / 이용약관 페이지
- [ ] OG 태그 추가 (SNS 공유 미리보기)
- [ ] 커스터마이즈 설정 LocalStorage 저장
- [ ] 모바일 실기기 테스트
---
## 도움 받은 글 (옵션)
- Web Speech API MDN 문서: https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API
- Vercel 정적 사이트 배포: https://vercel.com/docs/deployments/overview
- 이전 작업 정리: `오늘작업_260321.md` (워치앱 구현 가이드)
https://deploy-iota-opal.vercel.app/#briefing
** 추후계획 : 금주 토요일 결재붙이기 페이지 참석요건 만족하기!