스크롤 ↓
AI 1인 기업 빌드 · EP.03 — 토니 딘
🛠 해부하고 → 직접 만든다

AI 요금을 고객이 내게 하는
원가 0원 서비스

월 2억 TypingMind의 토니 딘을 해부하고 — 오늘 BYOK 채팅 서비스를 직접 만든다. AI 요금은 고객이 내고, 나는 '화면'만 판다.

$137K/월TypingMind (≈2.1억)
85%본인이 갖는 이익
원가 0AI 요금 = 고객 부담
직원 0명혼자 운영
① 누구인가

파도가 오기 전에
서핑보드를 들었다

베트남의 평범한 직장 개발자. 사이드 프로젝트가 월 $600일 때 퇴사해 전업 1인 개발자로. 특별한 재능이 아니라 — 미리 만드는 법을 익혀두고, ChatGPT가 대중화되자 남보다 빨리 올라탔다.

1
DevUtils (2020) — 개발자 도구
첫 유료 제품. "내 물건이 팔린다"는 증명. 지금도 $5K/월
2
Black Magic (2021) — X 성장 툴
피크 $14K/월 → 플랫폼 정책 악화되자 $128K에 매각
3
TypingMind (2023) — ChatGPT 대중화에 며칠 만에 대응
첫 주 매출 $22K → 지금 월 $137K, 고객 20,641명, 여전히 직원 0명

출처: Tony Dinh(@tdinh_me) X·뉴스레터·Indie Hackers (참고문헌)

② 대표작 · 직접 보기

TypingMind — "LLM을 위한 최고의 화면"

ChatGPT·Gemini·Claude를 한 곳에서 더 잘 쓰게 해주는 고급 채팅 UI. AI를 새로 만든 게 아니라, AI를 쓰는 경험을 판다. 대화 검색·폴더 정리·프롬프트 라이브러리·모델 전환 — 기본 ChatGPT엔 없는 편의.

20,641+고객
$137K/월월 매출 (≈2.1억)
$1M+누적 매출

🔗 typingmind.com 직접 보기 — 오늘 우리가 만들 것의 원본

③ 핵심 구조 · BYOK

AI 비용은 고객이 낸다

고객이 자기 OpenAI·Gemini API 키를 넣어서 쓴다. 이걸 BYOK(Bring Your Own Key · "네 열쇠는 네가 가져와")라 부른다. AI 사용료는 고객이 직접 부담하고, 토니는 화면과 기능만 판다.

💸

AI 원가 = 0

추론 비용을 고객이 자기 키로 부담. AI 요금 폭탄 위험이 없다.

📈

마진 85%

순수 소프트웨어라 버는 대부분이 이익.

🛡️

리스크 0

고객이 많이 써도 내 비용은 안 늘어남. AI 가격이 올라도 타격 없음.

🚰 정수기 비유 — 물(AI)은 수도국(OpenAI)이 공급하고 수도요금은 고객이 낸다. 토니는 그 물을 더 편하게 마시게 해주는 정수기를 팔 뿐. 물값이 올라도 정수기 회사 원가는 안 늘어난다.

📊 데이터 · 성장 스토리

월 $600에서 월 $137K까지

퇴사 시점 수입은 월 $600. 특별한 한 방이 아니라 — ChatGPT 대중화 타이밍에 며칠 만에 올라타 첫 주 $22K를 찍고, 꾸준한 공개 빌드로 여기까지. 출발점이 낮았다는 게 이 이야기의 핵심이다.

월매출(MRR) 추이 · 공개 자료·재현치 근사 · 환율 ₩1,560/$ (월 $137K ≈ ₩2.1억)

🏛️ 오늘의 경영 이론
유닛 이코노믹스

한 건 팔면,
얼마가 남는가

매출이 커도 망하는 회사가 있고, 작아도 튼튼한 회사가 있다. 차이는 단위 경제학 — 한 명의 고객, 한 건의 판매에서 실제로 얼마가 남느냐다. AI 시대엔 이게 더 중요하다. 추론(AI 사용) 원가가 사용자 수에 비례해 늘기 때문. 오늘 우리는 그 원가를 0으로 설계한다.

📊 데이터 · 원가는 어떻게 움직이나

사용자가 늘 때 —
BYOK는 원가가 안 는다

일반 AI 서비스는 사용자↑ → 추론 원가↑(비례). BYOK는 사용자가 아무리 늘어도 서버비 수준에 머문다. 이 두 곡선의 차이가 곧 이익이다.

개념도(상대 원가 지수) · 실제는 서비스별 상이 · 구조 비교 목적

📊 데이터 · 같은 'AI 회사'라도

마진은 하늘과 땅

총마진 = 매출 100원 중 원가 빼고 남는 비율. AI 원가를 직접 부담하는 AI 기업은 50~60원만 남는다(a16z). BYOK는 원가가 0에 가까워 ~90원이 남는다.

전통 SaaS·AI 스타트업: a16z "The New Business of AI" 통상치 · BYOK: 토니 본인 공개(85%) 근사

🛠 실습 ① · 오늘 만들 것

배웠으면 — 직접 만든다

토니의 BYOK 채팅 서비스 미니를 안티그래비티로 만든다. 고객이 자기 API 키를 넣으면 — 나만의 브랜드로 된 AI 채팅 서비스가 되고, AI 요금은 고객이 낸다.

$137K/월TypingMind 매출
원가 0고객 API 키
~100%이론상 마진 (BYOK)
오늘내 채팅 서비스 완성
🛠 실습 ② · 우리가 만들 것의 스펙

미니 버전 "MyGPT"

핵심만 담되 실제로 대화가 되고, 실제로 배포한다.

🔑

BYOK ⭐

고객이 자기 Gemini API 키를 넣는다. 키는 브라우저(localStorage)에만 저장 — 서버에 저장·로그 절대 금지. 원가 0의 핵심.

💬

채팅 UI

메시지 입력 → 스트리밍 응답(글자가 흐르듯). 마크다운·코드블록 렌더. 대화는 localStorage에 저장, 사이드바에서 다시 열기.

🎭

나만의 AI 성격

시스템 프롬프트 설정 — "너는 마케팅 카피 전문가야" 같은. 이걸로 일반 챗봇이 아닌 특화 서비스가 된다.

기술: 안티그래비티 · Next.js + Tailwind · Gemini API 스트리밍 · Vercel 배포. (여러 모델 붙이는 건 확장으로 — 오늘은 Gemini 하나로 깔끔하게)

🛠 실습 ③ · BYOK 안전 원칙 (제일 중요)

고객 키를 서버에 저장하지 마라

절대 금지 — 고객 API 키를 DB에 저장하거나 로그에 남기기. 키가 새면 고객 돈으로 남이 AI를 쓴다. 신뢰가 무너지면 서비스 끝.
올바른 방식 — 키는 고객 브라우저(localStorage)에만. 요청할 때만 서버로 넘겨서 그 1회 호출에만 쓰고, 저장·로그 안 함. (프롬프트에 이미 반영)
왜 이게 사업 모델 — 키를 안 가지니 AI 요금 책임도 없다. 그래서 원가 0. "안 가지는 게 곧 마진"이라는 게 BYOK의 핵심.
🏛️ 경영 한 수 · 그럼 뭘 파나

AI가 공짜면 — 뭘로 돈 벌지?

AI 요금을 고객이 낸다면, 고객은 왜 나에게 돈을 낼까? 답 — AI가 아니라 '화면(경험)'을 판다.

파는 것더 좋은 채팅 경험 (성격 설정·저장·정리·특화 프롬프트)
어떻게일회성 라이선스 or 월 구독 — 소프트웨어 값
원가AI 요금은 고객이 → 내 원가 ≈ 서버비뿐 → 마진 90%+

📌 특화가 핵심 — "그냥 챗GPT 화면"이 아니라 "마케팅 카피 전용 AI", "코딩 리뷰 전용 AI"처럼 시스템 프롬프트로 좁히면 값을 받을 수 있다.

🛠 실습 · 이 순서로 만든다

MyGPT 7단계 빌드

한 번에 다 만들지 않는다. 단계마다 실행해서 확인하고 다음으로 — 그래야 어디서 막혔는지 바로 안다. (마스터 프롬프트에 이 순서가 그대로 지시돼 있어요)

1
레이아웃
사이드바(새 대화·목록·설정) + 메인 채팅 화면 뼈대
2
API 키 온보딩
고객이 Gemini 키 입력 → localStorage 저장 (서버 저장 금지)
3
스트리밍 연결
/api/chat 이 고객 키로 Gemini에 스트리밍 요청 (핵심)
4
채팅 화면
메시지 스레드 + 마크다운·코드블록 + 글자 흐르듯 렌더
5
대화 저장
localStorage에 저장, 사이드바에서 다시 열기
6
AI 성격 · 특화
시스템 프롬프트 + 페르소나 프리셋(마케팅·코드리뷰·번역)
7
폴리시 + 배포
모바일 대응·에러 한국어 안내 → Vercel 배포
🛠 실습 ④ · 마스터 프롬프트

이걸 안티그래비티에 그대로 붙여넣기

복사 → 안티그래비티 → 붙여넣기. BYOK 채팅 서비스가 한 번에 나옵니다.

💬 MASTER PROMPT — 전체 복사
You are building a complete, production-ready web service. Follow this spec exactly. If a major decision is not covered, ask me before deciding. # PROJECT: MyGPT — a BYOK (bring-your-own-key) AI chat service (a mini TypingMind) ## What it does The user pastes their own Gemini API key, sets a system prompt (the AI's persona), and chats with streaming responses. Conversations are saved locally. The whole point: the AI cost is paid by the user (BYOK), so our cost is ~zero. ## Tech stack — keep it simple - Next.js 14+ (App Router) + TypeScript + Tailwind CSS. One repo, deployable to Vercel as-is. - No database, no login. All state (API key, conversations, settings) in the browser (localStorage). - One API route: /api/chat. It only proxies the streaming request to Gemini — it must NOT store or log the key. ## BYOK — the single most important rule - The user's Gemini API key is stored ONLY in localStorage on the client. - On each request the client sends the key to /api/chat; the server uses it for that one call and never stores or logs it. - If no key is set, show a friendly Korean onboarding: input field + link to https://aistudio.google.com/apikey labeled "무료 Gemini API 키 발급 (1분)", and one line: "요금은 본인 키로 청구됩니다". ## Chat — exact requirements (streaming, the SDK is new — don't improvise) - Install: npm i @google/genai - /api/chat runs on Node runtime: at the top add export const runtime = 'nodejs' and export const maxDuration = 60 - Stream with the official SDK: import { GoogleGenAI } from '@google/genai'; const ai = new GoogleGenAI({ apiKey }); // the user's key from the request body const stream = await ai.models.generateContentStream({ model: 'gemini-2.5-flash', config: { systemInstruction: systemPrompt }, contents: messages.map(m => ({ role: m.role === 'assistant' ? 'model' : 'user', parts: [{ text: m.content }] })), }); // pipe each chunk (chunk.text) to the client as it arrives (ReadableStream / Server-Sent Events) - The client renders tokens as they stream in, with markdown + code-block highlighting and a copy button on code blocks. - Errors in Korean: ① 키 없음/잘못됨 ② 무료 쿼터 초과 ③ 네트워크 실패. On an invalid-key error, point the user back to the key input. ## UI — all copy in Korean. Design: clean, dark, chat-app feel, Pretendard 1. Left sidebar: "새 대화" button, conversation list (title = first user message, click to reopen), settings (API key input, system prompt textarea, model note). 2. Main: message thread (user right / AI left), streaming assistant bubble, input box with send + Shift+Enter for newline, stop button while streaming. 3. Empty state: a hero explaining "당신의 키로, 당신만의 AI. 요금은 당신이 냅니다 (원가 0)". 4. Persona presets to showcase specialization: 마케팅 카피 / 코드 리뷰 / 이메일 답장 / 번역 — clicking one fills the system prompt. ## Quality bar - Mobile responsive. Conversations persist across reloads (localStorage). Never lose the current draft. - Clean components, Korean comments, a README with setup + Vercel deploy, and a .env.example (note: no server-side key needed — it's BYOK). - Make it crystal clear in the UI that the key never leaves the user's browser except to call Gemini. ## Working style Build in this order and after each step show me how to run and verify: 1) Scaffold + sidebar/main layout 2) API key onboarding + localStorage 3) /api/chat streaming with the user's key 4) Chat thread + markdown + streaming render 5) Conversation save/load 6) System prompt + persona presets 7) polish Never store or log the user's key. Start with step 1 now.
🛠 실습 ⑤ · 이어서 쓰는 프롬프트 3개

특화하고 배포하기

🎭 ① 특화 서비스로 좁히기
Turn this from a generic chat into ONE specialized product. Pick a niche (e.g. "마케팅 카피 전용 AI"), lock the system prompt to that persona by default, rewrite the hero and empty state to speak to that audience, and hide the raw system-prompt editor behind "고급 설정". A specialized tool sells; a generic chat doesn't. Keep BYOK intact.
🚀 ② 배포 (Vercel)
Prepare and deploy to Vercel: verify the build passes, finalize the Korean README (explain BYOK clearly), then walk me through deployment step by step. Note there is no server-side API key to set — it's all BYOK. After deploying, give me a checklist to verify streaming, key onboarding, and conversation save work in production.
🔧 ③ 트러블슈팅 (막혔을 때)
It is not working. Here is the error or wrong behavior: [여기에 에러 메시지나 증상 붙여넣기]. Diagnose the root cause first, explain it in one short Korean paragraph, then fix it. After fixing, tell me exactly how to verify. (If it's about streaming, check the ReadableStream wiring first.)
🛠 실습 ⑥ · 정산 — 팔면 얼마 남나

원가가 0에 가까우니

라이선스를 월 ₩9,900에 판다고 가정하면 —

판매가₩9,900 / 월 (또는 일회성 ₩29,000)
AI 원가0원 — 고객이 자기 키로 부담 (BYOK)
서버·결제 수수료호스팅 거의 0 + 결제 약 3%
= 남는 돈약 9,600원 — 마진 ~97%

토니가 85%를 남기는 이유 — AI 요금 부담이 없으니 버는 대부분이 이익. 추론비 폭탄 리스크 0.

✅ 타겟·결제

누구에게, 어떻게 받나

🇰🇷 한국만토스페이먼츠
🌍 해외만PayPal
🇰🇷 + 🌍Stripe

타겟은 "특화"로 좁혀요 — 그냥 챗봇 말고 "마케팅 카피 전용", "개발자 코드 리뷰 전용"처럼. 좁힐수록 값을 받기 쉽고, 그 키워드로 검색·커뮤니티에서 찾아온다. 토니처럼 과정을 공개(build in public)하면 CAC ≈ 0.

✅ 유닛 이코노믹스 정리

1건 팔면 얼마 남나?

공헌이익하나 팔 때 남는 돈. BYOK면 판 값 그대로(원가 0)
CAC (고객획득비용)광고 대신 공개 빌드로 → ≈ 0
고정비직원 0·서버비뿐 → 몇 개만 팔아도 흑자
= 결론남는 돈 최대 + 데려오는 비용 0 + 나가는 돈 최소 = 유닛 이코노믹스의 교과서
📖 토니에게 배우는 경영 원칙

AI 1인 기업 5원칙

1. AI를 만들지 말고, 감싸서 팔아라. 거대 모델은 남이 만든다. 나는 '가장 쓰기 좋게' 만드는 경험을 판다.
2. AI 요금은 고객이 내게 하라. BYOK면 원가 0·리스크 0·마진 90%+. 유닛 이코노믹스가 생사를 가른다.
3. 특화하라. 그냥 챗봇은 안 팔린다. 시스템 프롬프트로 "○○ 전용"으로 좁혀야 값을 받는다.
4. 흐름이 오기 전에 준비하라. 새 기술이 대중화됐을 때 며칠 만에 대응하려면, 미리 만들 줄 알아야 한다.
5. 과정을 공개하라. 매출·실수까지. 투명함이 신뢰가 되고, 신뢰가 오디언스가 되고, 오디언스가 유통이 된다(CAC≈0).
📚 참고문헌 · Sources

이 분석의 출처

1
Tony Dinh (@tdinh_me) — X 프로필 (제품별 실시간 MRR 공개)1차
x.com/tdinh_me
2
TypingMind — LLM 채팅 UI (오늘 만들 것의 원본)1차
typingmind.com
3
"He Made $45k/Month with ChatGPT — Tony Dinh's Story" — Indie Hackers분석
indiehackers.com
4
"The New Business of AI" — a16z (AI 기업 총마진 50~60% 분석)이론
a16z.com
5
Google Gemini API 문서 — 스트리밍 · gemini-2.5-flash · AI Studio 키 발급구현
ai.google.dev

수치는 공개 자료 기준 · 환율 ₩1,560/$ · 시점에 따라 변동

EP.03 마무리

AI를 만들지 말고 — 감싸서 팔아라

레벨스(속도)·대니(가격) 다음, 토니가 보여준 건 — 유닛 이코노믹스의 설계. 오늘 우리는 배우기만 하지 않고 — BYOK 채팅 서비스를 직접 만들었다. AI 요금을 고객이 내게 하니 원가 0, 마진 90%+. 거대한 걸 만들 필요 없다. 가장 쓰기 좋게 감싸서, 특화해서 팔아라. 이제 여러분 차례.

AI 1인 기업 빌드 · Connect AI