Open Lovable은 겉보기엔 평범한 채팅 화면이다. 하지만 여기에 https://stripe.com 같은 주소를 붙여넣고 "이 랜딩페이지를 클론해줘"라고 치면, 앱은 그 사이트를 실제로 방문해 내용·디자인을 읽고 → AI에게 React 코드를 짜게 하고 → 그 코드를 클라우드 컴퓨터에서 실제로 실행해 → 결과 화면을 오른쪽 미리보기 창에 띄운다. 그 다음엔 "헤더를 파란색으로 바꿔줘" 같은 후속 지시로 부분 수정도 계속할 수 있다.
보통 AI 코드 생성기는 "코드"라는 설계도만 뱉는다. 그걸 실제로 돌려보려면 사람이 직접 폴더 만들고, 패키지 설치하고, 서버 켜야 한다. Open Lovable은 그 뒷일까지 전부 자동이다 — 클라우드에 임시 컴퓨터(샌드박스)를 하나 띄우고, 생성된 코드를 거기에 심고, 필요한 부품(npm 패키지)을 알아서 설치하고, 개발 서버를 켜서 살아있는 웹페이지를 iframe으로 보여준다. "설계도 + 완공된 실물"을 한 번에 주는 셈이다.
저장소는 단일 스크립트가 아니라, 주소 → 스크랩 → 코드 생성 → 샌드박스 실행 → 미리보기 파이프라인을 이루는 27개의 서버 API 라우트와, 그것을 조립한 Next.js 프론트엔드로 구성된 완성형 웹 애플리케이션이다.
2025~2026년 가장 뜨거운 제품군이 "프롬프트 → 앱" 빌더다. Lovable.dev, Vercel v0, StackBlitz bolt.new 같은 서비스가 대표적인데, 대부분 비공개 SaaS다. Open Lovable은 "그 안에서 실제로 무슨 일이 벌어지는가"를 코드로 전부 보여준다. 특히 "AI가 코드를 짜는 부분"보다 "짠 코드를 실제로 실행해 미리보기로 띄우는 배관(plumbing)"이 훨씬 어려운데, 이 저장소는 그 배관을 통째로 공개했다.
유명 프랜차이즈 햄버거의 "특제 소스 레시피"가 공개된 것과 같다. 완성된 버거(유료 서비스 결과물)는 다들 먹어봤지만, 주방에서 재료를 어떤 순서로 어떻게 조합하는지를 처음으로 전 과정 공개한 것이다. 게다가 라이선스가 MIT라, 그 레시피로 내 가게를 차려도 된다.
이 앱을 만든 곳은 스크래핑 API 회사 Firecrawl이다. 자사 API가 얼마나 강력한지 말로 설명하는 대신, "우리 API를 쓰면 이런 킬러 앱을 만들 수 있다"를 완성품으로 증명했다. 개발자 마케팅(DevRel)의 교과서적 사례로, 결과적으로 Firecrawl 인지도와 이 저장소 인기가 함께 폭발했다.
특정 회사에 종속되지 않는다. AI 모델은 OpenAI(GPT-5) · Anthropic(Claude) · Google(Gemini 3 Pro) · Groq(Kimi K2)를 코드 한 줄 안 바꾸고 갈아끼울 수 있고, 실행 환경도 E2B ↔ Vercel Sandbox를 SANDBOX_PROVIDER 환경변수 하나로 전환한다. "실무에서 벤더 종속을 어떻게 피하는가"의 살아있는 예제다.
이 저장소의 진짜 가치는 생성된 코드를 실제로 실행 가능한 상태로 만드는 자동화에 있다 — 패키지 자동 감지·설치, Vite 개발서버 기동, 빌드 에러 자동 감지·복구, 부분 수정을 위한 "관련 파일만 골라내는" 컨텍스트 선택까지. AI 앱을 "데모"가 아니라 "돌아가는 제품"으로 만드는 노하우가 여기 다 들어있다.
| 기술 | 버전 | 역할 |
|---|---|---|
| Next.js | 15.4.3 | App Router + Turbopack. UI와 27개 API 라우트를 한 프로젝트에 담는 풀스택 프레임워크 |
| React | 19.1.0 | 채팅창·코드 뷰어·iframe 미리보기 등 UI 구성 |
| TypeScript | 5.x | 전 계층 타입 안정성. 파일·대화·샌드박스 타입을 types/에 정의 |
| Tailwind CSS | 3.4.17 | 유틸리티 CSS. colors.json·커스텀 config로 디자인 토큰 관리 |
| Radix UI | 다수 | shadcn/ui 계열 접근성 프리미티브(다이얼로그·탭·툴팁 등 25종+) |
| Jotai | 2.14 | 원자(atom) 기반 전역 상태관리. atoms/에 상태 정의 |
| Framer Motion / motion | 12.23 | 애니메이션. 코드 생성 진행 상황을 부드럽게 표현 |
| react-syntax-highlighter | 15.6 | 생성된 코드에 문법 하이라이팅 |
| 기술 | 역할 |
|---|---|
ai (Vercel AI SDK v5) | 핵심. streamText()로 LLM 응답을 토큰 단위 스트리밍. 코드가 생성되는 걸 실시간으로 보여줌 |
| @ai-sdk/openai · anthropic · google · groq | 4개 프로바이더 어댑터. provider-manager.ts가 모델 문자열을 보고 알맞은 클라이언트를 반환 |
| 기본 모델 | google/gemini-3-pro-preview. 선택지: GPT-5, Claude Sonnet 4, Kimi K2(Groq) |
| @mendable/firecrawl-js 4.3 | 웹사이트 → 마크다운·HTML·스크린샷 변환. 코드 생성의 "입력 재료" |
| Morph Fast Apply (선택) | morph-fast-apply.ts. 부분 수정 시 전체 재생성 대신 빠른 diff 적용으로 속도 향상 |
streamText({ model, prompt })라는 하나의 공통 인터페이스로 감싼다. 그래서 모델을 바꿔도 앱 코드는 그대로다. Open Lovable은 여기에 더해 AI_GATEWAY_API_KEY가 있으면 Vercel AI Gateway로 몰아 넣는 분기까지 있다.| 기술 | 역할 |
|---|---|
| @vercel/sandbox 0.0.17 | 기본 실행 환경. node22 런타임, 15분 타임아웃, 포트 3000 |
| @e2b/code-interpreter 2.0 | 대안 실행 환경. Vite 개발서버(포트 5173), 30분 타임아웃 |
| SandboxFactory / SandboxManager | 팩토리 패턴으로 프로바이더를 생성하고, 매니저 싱글턴이 샌드박스 수명주기(생성·재사용·정리)를 관리 |
| Vite | 샌드박스 안에서 생성된 React 앱을 구동하는 초고속 개발서버. 에러 로그를 앱이 감시·복구 |
세 계층을 요리에 빗대면 — Firecrawl은 시장에서 재료를 손질해 오는 사람(웹 → 깔끔한 텍스트), AI SDK는 레시피대로 요리하는 셰프(텍스트 → 코드), 샌드박스는 실제로 불을 켜고 조리하는 주방(코드 → 살아있는 앱)이다. Open Lovable의 27개 API는 이 세 사람 사이를 오가는 주문서들이다.
실행 환경(E2B/Vercel)과 AI 모델(4개 회사) 양쪽 모두 "구현을 갈아끼워도 호출부는 그대로"인 구조다. 샌드박스는 SandboxFactory.create()가 환경변수를 보고 알맞은 프로바이더 객체를 만들고, SandboxManager 싱글턴이 이를 캐싱·재사용한다.
// lib/sandbox/factory.ts — 환경변수 하나로 실행환경 전환
static create(provider?: string) {
const selected = provider || process.env.SANDBOX_PROVIDER || 'e2b';
switch (selected.toLowerCase()) {
case 'e2b': return new E2BProvider(config);
case 'vercel': return new VercelProvider(config);
}
}
가장 영리한 부분이다. "헤더 색만 바꿔줘" 같은 요청에 앱 전체를 다시 생성하면 느리고, 멀쩡한 다른 코드까지 망가진다. Open Lovable은 요청을 먼저 분석해 고쳐야 할 파일만 골라 AI에게 넘긴다.
types/file-manifest.ts에 정의.연속 편집을 지원하려면 대화 이력을 기억해야 하지만, 무한정 쌓이면 토큰 한도를 넘겨(context overflow) 비용·오류가 폭증한다. Open Lovable은 서버 전역 global.conversationState에 메시지를 저장하되, 메시지 20개 초과 시 최근 15개만 남기고 잘라낸다.
// generate-ai-code-stream — 컨텍스트 폭주 방지
if (conversationState.context.messages.length > 20) {
conversationState.context.messages =
conversationState.context.messages.slice(-15); // 최근 15개만
}
AI가 짠 코드는 종종 빌드 에러를 낸다. Open Lovable은 monitor-vite-logs로 Vite 로그를 감시하다 에러가 뜨면 report-vite-error로 수집하고, 이를 다시 AI에게 넘겨 사람 개입 없이 스스로 고치는 루프를 돈다. build-validator.ts가 적용 전 유효성을 점검한다.
스트리밍 중 응답이 잘리면 이어받는 기능이 있지만, app.config.ts에서 enableTruncationRecovery: false로 꺼져 있다. 이유가 코드에 적혀 있다 — "오탐(false positive)이 너무 많아서". 실전에서 자동 복구가 오히려 문제를 키울 수 있다는 교훈이다.
① .env.example로 어떤 외부 서비스가 필요한지 파악 → ② config/app.config.ts로 모델·샌드박스 설정을 훑고 → ③ app/api/generate-ai-code-stream/route.ts(1895줄)가 심장부이니 여기서 streamText·컨텍스트 조립 부분을 읽고 → ④ lib/sandbox/와 lib/context-selector.ts로 실행·편집 로직을 확인하면 전체 그림이 잡힌다.
streamText()로 코드가 생성되는 과정을 토큰이 나오는 즉시 화면에 흘려보내는 패턴을 배울 수 있다. "다 되면 한 번에 보여주기"와 "실시간으로 흘리기"의 UX 차이는 크다. 서버 라우트에서 ReadableStream을 반환하고 프론트가 이를 소비하는 전형이 여기 다 있다.
모델도, 실행환경도 인터페이스 뒤에 숨겼다. provider-manager.ts(모델)와 SandboxFactory(실행)를 비교해 읽으면, "교체 가능한 구현"을 어떻게 설계하는가가 손에 잡힌다. 새 모델·새 샌드박스를 추가할 때 어디만 고치면 되는지가 명확하다.
AI 앱 성능·비용의 핵심은 프롬프트에 뭘 넣느냐다. edit-intent-analyzer → context-selector 조합은 "요청과 무관한 파일은 빼고, 고칠 파일만 넣는" RAG의 코드 버전이다. 파일 매니페스트로 프로젝트를 요약하는 아이디어가 특히 배울 만하다.
AI 생성 코드를 내 서버에서 바로 돌리는 건 위험하다. 샌드박스로 격리하고, 수명주기(생성·타임아웃·정리)를 관리하는 SandboxManager는 "코드 실행 as a service"를 만들 때의 표준 패턴이다.
전체를 돌리려면 API 키가 여러 개 필요하다. 대신 한 조각만 떼어 실습하자 — (1) Firecrawl 무료 키로 scrape-url-enhanced만 호출해 임의 사이트를 마크다운으로 뽑아보기, (2) AI SDK로 "이 마크다운을 React 컴포넌트로 바꿔줘" 프롬프트만 실행해보기, (3) E2B 무료 티어로 "Hello World" 코드를 샌드박스에 심고 실행 로그 받아보기. 세 조각을 각각 이해한 뒤 연결하면 전체가 보인다.
| 항목 | 요구사항 / 비고 |
|---|---|
| 런타임 | Node.js(권장 22 계열) · pnpm(또는 npm/yarn) · bun.lock도 제공 |
| 필수 키 | FIRECRAWL_API_KEY — 스크래핑. 없으면 클론 기능 자체가 동작 안 함 |
| AI 키(택1 이상) | GEMINI / ANTHROPIC / OPENAI / GROQ 중 최소 하나. 기본값은 Gemini 3 Pro |
| 샌드박스(택1) | Vercel Sandbox(기본, OIDC 토큰 또는 PAT) 또는 E2B(E2B_API_KEY) |
| Fast Apply(선택) | MORPH_API_KEY — 부분 수정 속도 향상(없어도 동작) |
| 실행 | pnpm install → .env.local 작성 → pnpm dev → localhost:3000 |
코드는 MIT라 공짜지만, Firecrawl·LLM·샌드박스는 각각 유료 API다. 웹사이트 하나를 클론할 때마다 스크랩 1회 + 여러 번의 LLM 호출 + 샌드박스 실행 시간이 과금된다. 무료 티어로 학습은 가능하지만, 실사용 시 API 비용을 반드시 모니터링해야 한다.
저장소 없이도 가능. Firecrawl 무료 키를 발급받아 좋아하는 사이트 주소를 /v1/scrape에 formats: ['markdown','screenshot']로 보내보자. "웹페이지가 AI가 읽기 좋은 텍스트로 어떻게 바뀌는가"를 눈으로 확인하는 것이 목표.
저장소를 로컬 구동한 뒤 config/app.config.ts의 defaultModel과 availableModels를 수정해 다른 LLM으로 같은 사이트를 클론해보자. Gemini vs Claude vs GPT-5의 생성 코드 품질·속도 차이를 비교하면 프로바이더 추상화의 가치를 체감한다.
lib/edit-intent-analyzer.ts의 정규식 패턴에 새 EditType(예: "접근성 개선")을 추가하고, context-selector가 알맞은 파일을 고르게 연결해보자. "AI에게 무엇을 보여줄지 고르는 규칙"을 직접 짜보는 실습.
lib/sandbox/providers/에 SandboxProvider 인터페이스를 구현한 제3의 프로바이더(예: 로컬 Docker)를 추가하고 factory.ts에 등록해보자. 추상화가 잘 돼 있으면 호출부를 하나도 안 고치고 새 실행환경이 붙는 것을 확인.
monitor-vite-logs → report-vite-error → 재생성 루프에 "3번 실패하면 사람에게 알린다" 같은 서킷 브레이커를 넣어보자. AI 자동 복구가 무한 루프에 빠지지 않게 하는 실전 안전장치 설계.
| 주차 | 주제 | 할 일 |
|---|---|---|
| 1주차 | AI SDK 스트리밍 | Vercel AI SDK 문서로 streamText·generateObject·tool calling 학습. 간단한 스트리밍 챗 직접 구현 |
| 2주차 | 코드 실행 샌드박스 | E2B·Vercel Sandbox 공식 문서. "코드 인터프리터"를 붙인 미니 에이전트 만들기 |
| 3주차 | 컨텍스트 엔지니어링 | RAG·파일 매니페스트·컨텍스트 압축 기법. 큰 코드베이스를 요약해 LLM에 넣는 실험 |
| 4주차 | 에이전트 자가치유 | 에러 감지→재시도→검증 루프, 서킷 브레이커, 관찰가능성(observability) 설계 |
| 용어 | 뜻 |
|---|---|
| Firecrawl | 웹페이지를 AI용 마크다운·스크린샷으로 변환하는 스크래핑 서비스. 이 앱의 입력 담당 |
| Vercel AI SDK | 여러 LLM을 하나의 공통 인터페이스로 감싸는 TypeScript 라이브러리. streamText가 핵심 |
| 샌드박스 (E2B / Vercel) | AI가 짠 코드를 안전하게 격리 실행하는 클라우드 임시 컴퓨터 |
| Vite | 샌드박스 안에서 React 앱을 구동하는 초고속 개발서버 |
| 스트리밍 (streaming) | 응답 전체를 기다리지 않고 토큰이 나오는 즉시 화면에 흘려보내는 방식 |
| 팩토리 패턴 | 객체 생성을 전담 함수/클래스에 위임해 구현 교체를 쉽게 하는 설계 패턴 |
| 파일 매니페스트 | 프로젝트 모든 파일의 경로·타입·의존관계 요약. AI에게 주는 "프로젝트 지도" |
| 편집 의도 (Edit Intent) | 사용자 요청을 UPDATE_STYLE·ADD_FEATURE 등으로 분류한 것. 고칠 파일 선별의 기준 |
| surgical edit | 전체 재생성 대신 관련 파일만 정밀 수정하는 "외과수술식" 편집 |
| 컨텍스트 오버플로우 | 대화·파일이 너무 쌓여 LLM 토큰 한도를 넘는 것. 오래된 메시지를 잘라 방지 |
| 자가치유 (self-healing) | 빌드 에러를 스스로 감지·복구하는 루프 |
| Morph Fast Apply | 부분 수정 시 전체 재생성 대신 빠른 diff를 적용하는 선택적 가속기 |
| 자료 | 주소 / 위치 |
|---|---|
| 저장소 | github.com/firecrawl/open-lovable |
| 코드 생성 심장부 | app/api/generate-ai-code-stream/route.ts (1895줄) |
| 설정 총괄 | config/app.config.ts · .env.example |
| 샌드박스 추상화 | lib/sandbox/factory.ts · sandbox-manager.ts · providers/ |
| 컨텍스트 선택 | lib/context-selector.ts · edit-intent-analyzer.ts |
| 모델 해석 | lib/ai/provider-manager.ts |
| Firecrawl 문서 | firecrawl.dev · 상용 클라우드 버전: lovable.dev |
| Vercel AI SDK | sdk.vercel.ai · E2B: e2b.dev |