본문으로 건너뛰기
dreamdock
Dreamdock creator guide

만든 작품을,
드림독에서도 편하게.

업로드 준비부터 저장·음악 연결까지.
필요한 기능을 골라 적용하고, 확인 방법으로 점검해 보세요.

2026.10 기준 · 제작자 안내
필요한 기능만 연결하면 돼요.

보기 모드와 지원되는 다운로드 방식은 드림독이 처리해요. 작업 상태 저장과 YouTube 음악은 작품에 연결 코드가 필요해요.

작품에 필요한 파일을 함께 담아주세요

드림독의 작품은 외부 서버와 직접 통신하지 않는 환경에서 실행돼요. 이미지·스크립트·폰트·데이터를 작품 파일에 포함해 주세요.

fetch·XMLHttpRequest·WebSocket·EventSource 호출은 발행 검사에서 거부돼요. 라이브러리에 포함된 호출도 확인해야 해요.

드림독이 주입하는 window.dreamdock(음악)은 단독 실행에서는 없을 수 있어요. 해당 API를 호출하기 전에 존재 여부를 확인해 주세요. 저장은 작품에 포함한 dreamdock.js가 안팎을 알아서 구분해요.

어디에 코드가 필요한가요?

기능준비할 것안내
작품 실행·보기 모드추가 연동 없음지원 형식으로 업로드
파일 다운로드자동 연결지원되는 다운로드 패턴 사용
작업 상태 저장·복원코드 필요dreamdock.js 포함 · Thing Storage 연결
YouTube 음악코드 필요Media Bridge 연결
갤러리 저장(Maker)코드 필요 + 신청postMessage 연결 · 테스트 후 승인
고정 캔버스 크기meta 한 줄반응형 작품은 생략 가능
웹폰트파일 포함외부 링크 대신 임베드

HTML 한 파일, 또는 ZIP으로

단일 HTML 파일이나 index.html과 상대경로 CSS·JS·이미지·폰트를 담은 ZIP을 올릴 수 있어요. ZIP은 하나의 실행본으로 병합되며, 병합한 뒤 크기가 4MB 이하여야 해요.

<script type="module">은 사용할 수 없어요. 모듈을 사용하는 프로젝트는 IIFE 형식으로 번들하고, 최종 HTML에서 type="module"을 제거해 주세요. 실행 스크립트는 </body> 직전에 배치해요.

작품 소개에는 Markdown을 쓸 수 있어요. 썸네일은 직접 등록하거나 자동 캡처를 사용할 수 있고, 자동 캡처는 발행 후 수십 초 걸릴 수 있어요.

공개 상태는 공개·링크만·점검중·비공개 중에서 선택해요. 점검중으로 바꾸면 방문자에게는 안내만 표시돼요.

Markdown 도움말 ↗
Connect what you need

필요한 기능부터 연결해요

새로고침해도 작업을 이어가게

dreamdock.js를 작품에 포함하고, 저장할 상태를 Dreamdock.save에 넘기고 앱 시작 시 Dreamdock.load로 복원해요. 저장 한도는 작품당 10MB이며 같은 브라우저에서만 유지돼요. 전체 200MB를 넘으면 오래 사용하지 않은 작품의 저장 데이터부터 정리돼요.

HTML · dreamdock.js 파일을 작품에 포함 (외부 URL로 불러오면 차단)
<!-- 1) /dreamdock.js 를 받아 작품 폴더에 넣고 (ZIP이면 함께 묶기), HTML 한 파일이라면 파일 내용을 <script> 안에 그대로 붙이세요 -->
<script src="dreamdock.js"></script>

<script>
  // 2) 복원: 시작할 때 한 번. 저장된 문자열 또는 null
  const saved = await Dreamdock.load();
  let state = { level: 1, coins: 0 };
  try { if (saved) state = JSON.parse(saved); } catch { /* 깨진 저장값은 기본 상태로 */ }

  // 3) 저장: 문자열 또는 JSON으로 만들 수 있는 객체. 성공하면 true
  const ok = await Dreamdock.save(state);
  if (!ok) showSaveFailed(); // 저장 실패 시 작업 내용은 그대로 유지
</script>

Dreamdock 밖(내 컴퓨터에서 직접 열기)에서는 dreamdock.js가 localStorage로 동작해 그대로 테스트할 수 있어요. 단독 실행 저장 키는 하나로 고정되어 있어 같은 폴더에서 여러 작품을 열면 서로 덮어쓸 수 있어요.

dreamdock.js 내려받기 (3KB) ↓

AI에게 이렇게 요청하세요

이 앱의 localStorage 저장/불러오기를 프로젝트에 포함된 dreamdock.js의 Dreamdock.save(obj) / await Dreamdock.load()로 바꿔줘. 둘 다 Promise를 반환해. 앱 시작 시 Dreamdock.load() 결과로 상태를 복원하고(문자열 또는 null, JSON 파싱 오류도 처리), 복원이 끝나기 전에는 기본 상태를 자동 저장하지 마. 상태가 바뀔 때마다 400ms 디바운스로 Dreamdock.save를 호출하고, false가 돌아오면 작업 내용은 유지한 채 저장 실패를 표시해. 작품 안에 1,000,000바이트 같은 기존 상한이 있으면 새 10MB 규격에 맞게 수정하고, 큰 이미지는 압축해서 저장해줘. dreamdock.js는 <script src="dreamdock.js">로 파일에서 불러오고 외부 URL은 쓰지 마.

연결 확인하기

Dreamdock에서 입력 → 새로고침 → 입력이 남는지 확인해요. 작품 위에 “💾 저장 데이터가 있어요” 표시가 뜨는지도 확인하세요.

처음부터 AI에게 만들게 할 때

Claude · GPT · Cursor 등에 작품을 만들게 할 때, 첫 요청에 아래를 함께 붙이세요. 위 규칙이 처음부터 반영돼요.

AI 첫 요청에 함께 붙이기
이 작품은 Dreamdock(dreamdock.co)에 올릴 거야. Dreamdock은 작품을 격리된 sandbox iframe에서 실행해서 아래 제약이 있어. 코드를 이 규칙에 맞춰 만들어 줘.

1. 외부 리소스 금지: CDN 스크립트, 웹폰트 URL, fetch/XHR/WebSocket/EventSource, 외부 이미지 URL 모두 차단됨. 필요한 라이브러리·폰트·이미지는 파일에 포함하거나 인라인(data URL)으로.
2. localStorage / sessionStorage / cookie / IndexedDB 직접 사용 금지. 저장이 필요하면 프로젝트에 포함된 dreamdock.js의 Dreamdock.save(value) / Dreamdock.load() 를 써. 둘 다 Promise를 반환하고, 저장 값은 문자열 또는 JSON 직렬화 가능한 객체야(작품당 10MB). 앱 시작 시 load()로 복원하고(문자열 또는 null, 파싱 오류 처리), 복원 전에는 자동 저장하지 말고, 상태가 바뀔 때 디바운스해서 save() 해. false가 오면 작업은 유지하고 실패를 표시해.
3. 파일 내려받기는 Blob + <a download> 클릭 패턴으로 만들면 Dreamdock이 자동으로 "파일 저장" 버튼으로 바꿔 줘. window.open이나 showSaveFilePicker는 쓰지 마.
4. 최종 결과물은 브라우저에서 바로 여는 HTML(+ 상대경로 CSS/JS)이어야 해. ES 모듈(type="module", import/export)이 남아 있으면 발행이 거부되니 번들러를 쓰면 IIFE로 출력하고 type="module"을 제거해. 페이지 이동·새 창 열기·폼 submit도 하지 마 (모두 차단됨).
5. 크기는 두 가지 중 하나로 정해 줘.
   (a) 고정 캔버스(게임·픽셀아트 등)라면 <head>에 <meta name="dreamdock-size" content="가로x세로">로 본래 크기를 선언해. 플레이어가 그 비율로 자리를 잡고 화면에 맞춰 통째로 축소·확대해 주니까, 그 크기 안에서만 그리면 돼.
   (b) 반응형(도구·에디터 등)이라면 선언하지 말고 100% × 100%(또는 100dvh) 레이아웃으로 만들어. 플레이어 안에서는 뷰포트가 대략 "글 폭 × 화면 높이의 70%" 정도이고, 전체화면·시어터·새 창에서는 창 전체가 뷰포트야. 세로 400px 정도에서도 핵심 조작이 보이게 하고, 툴바는 접히거나 스크롤되게 해 줘.
6. 작품이 iframe 안에서 실행되니 브라우저 창 크기가 아니라 자기 뷰포트(innerWidth/innerHeight) 기준으로 레이아웃하고, 마우스 없이 터치로도 조작되게 해 줘.
7. 유튜브 음악·영상을 틀어야 하면 <iframe>이나 YouTube API를 쓰지 말고(둘 다 차단됨) 실행 환경이 제공하는 window.dreamdock.media 를 써. load(videoId, {title, autoplay}) / play() / pause() / seek(sec) / volume(0~100) / stop() / onState(fn) / anchor(el) 이 전부야. 영상은 작품 밖(프레임 아래 바)에 200×200으로 보이고, 첫 재생은 방문자가 그 바의 ▶를 눌러야 시작되니 UI에 "아래 ▶를 눌러 시작" 안내를 넣어 줘. 내 컴퓨터에서 열 땐 dreamdock 객체가 없으니 존재 여부를 확인하고 호출해.

파일 다운로드는 자동으로 연결돼요

URL.createObjectURL → <a download> → click(), data URL, msSaveBlob 방식은 드림독이 다운로드 요청을 받아 처리해요. 별도의 드림독 API로 바꿀 필요가 없어요.

작품의 저장 버튼을 누르면 작품 위에 패널이 나타나요. 이용자는 “파일 저장” 또는 지원되는 환경의 “공유·사진에 저장”을 눌러 파일을 받을 수 있어요.

지원 형식: png · jpg · webp · gif · svg · json · txt · html · css · csv · md · zip. 최대 12MB이며 실행파일류는 차단돼요.

화면 캡처 라이브러리도 확인해 주세요

html2canvas 등 사용하는 라이브러리에 fetch 호출이 포함되어 있으면 NETWORK_CALL 검사에 걸릴 수 있어요. 순수 canvas나 SVG foreignObject 방식 등을 검토하고, 이미지·폰트·저장 결과를 실제로 확인해 주세요.

갤러리 저장 기능 (Maker) 연결하기

작품이 만든 결과물(컬렉션)을 방문자가 드림독 갤러리에 게시하고, 나중에 다시 열어 감상·수정할 수 있게 하는 기능이에요. 작품은 sandbox 안에서 postMessage만 쓰고, 저장·검증·접근 제어는 드림독이 해요.

연결 코드를 넣은 뒤 작품 수정 → 03 갤러리 저장 기능 → 연결 테스트 · 신청에서 게시와 다시 열기를 확인하고 신청하면, 관리자가 승인해요. 승인은 작품 단위이고 새 버전을 올려도 유지돼요. 기존 컬렉션은 게시 당시 버전에 고정되니 작품을 고쳐도 깨지지 않아요.

AI 첫 요청에 함께 붙이기
let gallery = null, viewing = null;
addEventListener("message", (e) => {
  const d = e.data; if (!d || d.source !== "dreamdock-runtime") return;
  if (d.type === "pd-gallery-ready") {
    gallery = d; publishBtn.hidden = false; publishBtn.disabled = !d.loggedIn;
    publishBtn.textContent = d.editing ? "새 버전으로 저장" : (d.loggedIn ? "갤러리에 게시" : "게시하려면 드림독 로그인");
  }
  if (d.type === "pd-publish-result") toast(d.ok ? (d.updated ? "저장됐어요" : "게시됐어요 → " + d.url) : "실패: " + d.error);
  if (d.type === "pd-creation-load") { viewing = d; load(d.project); if (d.readOnly) enterViewMode(); else enterEditMode(); }
  if (d.type === "pd-creation-list") renderMyList(d.items);
});
publishBtn.onclick = () => parent.postMessage({ source: "dreamdock-thing", type: "pd-publish", project: getProject() }, "*");
// 스크립트가 늦게 떴다면 (감상 페이지에서 load를 놓쳤을 때):
parent.postMessage({ source: "dreamdock-thing", type: "pd-creation-request" }, "*");
// 내 컬렉션 목록(선택): parent.postMessage({ source: "dreamdock-thing", type: "pd-creation-list", scope: "mine" }, "*");
메시지방향언제
pd-gallery-ready드림독 → 작품로드 직후 1회. loggedIn이 true일 때만 게시 버튼을 켜요.
pd-publish { project }작품 → 드림독게시 버튼을 눌렀을 때. 이미지는 data:image/… 문자열로 그대로.
pd-publish-result드림독 → 작품게시 결과. ok가 true일 때만 "게시됨"을 표시해요.
pd-creation-load드림독 → 작품감상/수정 페이지 로드 직후. 이 데이터로 화면을 그려요. readOnly면 감상 모드.
pd-creation-request작품 → 드림독스크립트가 늦게 떠서 load를 놓쳤을 때 다시 요청.
pd-creation-list양방향내 컬렉션 목록(선택).

한도: project JSON 400KB(이미지 제외) · 이미지 PNG/JPG/WEBP/GIF 장당 2MB·합계 12MB·120장 · 제목 1~60자 · 게시 60회/일. project.gallery = { title, description, thumbnail, visibility }로 게시 시트 기본값을 줄 수 있어요(선택).

AI에게 이렇게 요청하세요

이 앱의 결과물을 Dreamdock 갤러리에 게시할 수 있게 연결해줘. 부모 창에서 오는 message 중 data.source가 "dreamdock-runtime"인 것만 처리해. pd-gallery-ready를 받으면 게시 버튼을 보이게 하고 loggedIn이 false면 비활성화해. 게시 버튼을 누르면 현재 결과물을 JSON 객체(이미지는 data:image/* 문자열)로 만들어 parent.postMessage({ source: "dreamdock-thing", type: "pd-publish", project }, "*")로 보내고, pd-publish-result의 ok가 true일 때만 "게시됨"을 표시해. pd-creation-load를 받으면 그 project로 화면을 복원하고 readOnly면 편집 UI를 숨겨. 앱 시작 시 pd-creation-request도 한 번 보내. project JSON은 400KB(이미지 제외) 안에 들어가게 해줘.

신청 전 확인

연결 테스트 화면에서 ① 게시 버튼이 켜지고 pd-publish가 검사를 통과하는지, ② 같은 데이터를 수정 모드·감상 모드로 다시 넣었을 때 화면이 제대로 그려지는지 둘 다 확인해요. 테스트에서 누른 게시는 저장되지 않아요.

원하는 글꼴도 파일 안에

Google Fonts나 CDN 링크는 발행되더라도 실행 중에는 차단돼요. 글꼴 파일을 base64 data URL로 바꾸고 @font-face로 CSS 안에 포함해 주세요.

AI에게 이렇게 요청하세요

이 프로젝트의 Google Fonts 링크를 제거하고, 첨부한 woff2를 base64 data URL @font-face로 CSS에 넣어줘. 필요한 글자와 굵기를 확인하고, 최종 병합 파일이 4MB 이내인지 점검해줘.

서브셋을 만들면 용량을 줄일 수 있지만, 포함하지 않은 글자는 다른 글꼴로 표시될 수 있어요. 사용자가 입력할 한글·기호도 확인해 주세요.

서로 다른 네 가지 용량 한도

항목최대 크기기준
업로드 작품4MBZIP은 병합 후 실행본
직접 등록 썸네일4MBPNG · JPG · WEBP
내려받을 파일12MB다운로드 브릿지
작업 상태 저장10MBThing Storage · IndexedDB · 작품별

작품 업로드 용량과 작업 상태 저장 용량은 달라요. 큰 이미지는 압축해서 저장해 주세요. 10MB는 IndexedDB 저장 경로의 작품별 한도이며 브라우저가 공간을 보장하는 값은 아니에요.

저장 공간은 이렇게 관리돼요

Thing Storage는 브라우저 안의 IndexedDB를 사용해요. 작품당 최대 10MB까지 저장하며, 전체 저장량이 200MB를 넘으면 가장 오래 사용하지 않은 작품의 저장 데이터부터 정리해요. 현재 보고 있는 작품의 데이터는 이 자동 정리에서 제외돼요.

기존 저장 데이터는 작품을 처음 열 때 자동으로 이전돼요. IndexedDB를 사용할 수 없는 환경에서는 기존 저장 방식으로 폴백하므로, 10MB 저장이 가능하다고 가정하지 말고 저장 결과와 실패 안내를 처리해 주세요.

기존 연동 API는 그대로예요

드림독 저장소 변경만으로 작품의 연동 코드를 바꿀 필요는 없어요. 다만 작품 자체에 1,000,000바이트처럼 낮은 상한을 둔 경우에는 제작자가 별도로 수정해야 해요. 큰 이미지는 압축하고, 저장 실패 시 작업 내용을 유지해 주세요.

올리기 전에 한 번만 확인해요

0 / 4 확인했어요

막히는 부분이 있나요?

localStorage를 그대로 사용해도 되나요?

드림독의 작품 실행 환경에서는 직접 접근할 수 없어요. 작품에 포함한 dreamdock.js의 Dreamdock.save / load로 바꿔 주세요. dreamdock.js는 최상위 창에서 단독 실행할 때만 localStorage를 사용해요. 다른 사이트의 iframe에 넣는 경우까지 자동 지원하는 코드는 아니에요.

저장한 내용이 다른 기기에서도 보이나요?

Thing Storage는 브라우저 안에 저장돼요. 같은 브라우저에서 이어갈 수 있고, 기기 간 동기화는 지원하지 않아요. “저장 데이터 지우기”나 브라우저 데이터 삭제, 전체 200MB 초과에 따른 자동 정리로 저장 내용이 없어질 수 있어요. 현재 보는 작품을 자동 정리에서 제외하는 것은 영구 보관을 보장한다는 뜻은 아니에요.

코드를 복사해서 HTML에 바로 넣으면 되나요?

작품 크기 meta는 head에 넣으면 돼요. 저장은 dreamdock.js 파일을 작품에 포함한 뒤(HTML 한 파일이면 내용을 script 안에 붙여 넣기) Dreamdock.save / load를 호출하면 돼요 — 별도 번들은 필요 없어요. 음악 코드는 API 참조로, 실제 영상 ID와 숫자로 바꾸고 필요한 메서드만 연결하세요.

음악이 자동으로 시작되지 않아요

첫 재생은 이용자가 작품 아래 바의 “▶ 재생 시작”을 눌러야 해요. 이후 재생은 작품에서 제어할 수 있어요. Dreamdock 밖에서 Media Bridge가 없으면 재생을 사용할 수 없다는 안내를 보여주세요.

작품 안에서 안 되는 것을 한눈에 보고 싶어요

외부 URL 전부(CDN·웹폰트·fetch/XHR·외부 이미지), 유튜브 iframe·YouTube API 직접 호출, localStorage·sessionStorage·cookie·IndexedDB 직접 접근, 페이지 이동·새 창·폼 submit, type="module"과 import/export가 남은 결과물, showSaveFilePicker()·window.open(blobUrl) 같은 직접 다운로드 API. 모두 방문자를 지키기 위한 제약이라 예외를 두지 않아요.

발행했는데 ‘검토중’으로 표시돼요

외부 URL 참조, 난독화로 의심되는 패턴, 비밀번호 입력란 등이 있으면 관리자 확인 대상으로 표시될 수 있어요. 발행 거부와는 다른 상태예요. 정상적인 작품이라면 피드백으로 알려주세요. 외부 URL은 검토 상태와 별개로 실행 환경에서 차단될 수 있어요.

발행이 거부되면 무엇을 확인하나요?

NETWORK_CALL은 외부 통신 호출이 있는지, ESM_MODULE은 script type="module"이 남아 있는지 확인해 주세요. 사용하는 라이브러리와 최종 빌드 결과도 함께 살펴보세요.

← 작품 올리기로 돌아가기

제작자 가이드 — Dreamdock