새 프로젝트 배포
내 프로젝트
계정 설정
API 키
Authorization: Bearer utw_... 로 프로젝트 API 를 호출할 수 있으며, 발급 시 딱 한 번만 표시됩니다.
사용 방법
이 서비스는 무엇인가요?
업로드투워크는 AI 가 만들어 준 웹페이지 파일을 인터넷에 올려 주는 서비스입니다.
파일을 올리면 /내가정한이름 같은 인터넷 주소가 생기고,
그 링크를 받은 사람은 누구나 브라우저에서 열어 볼 수 있습니다.
별도의 서버·도메인·프로그램 설치가 전혀 필요 없고, 코딩을 몰라도 사용할 수 있습니다. ChatGPT·Claude·Gemini 에게 "웹페이지 만들어줘" 라고 부탁해서 받은 결과물을 공유하고 싶을 때 쓰세요.
먼저 알아두면 좋은 단어 4개
- HTML 파일 — 웹페이지의 본체가 되는 파일입니다. 메모장으로 열면 코드가 보이지만, 브라우저로 열면 우리가 아는 웹페이지로 보입니다.
- index.html — 웹사이트의 대문 역할을 하는 파일 이름입니다. 누군가 내 주소로 들어오면 이 파일이 제일 먼저 열리기 때문에, 프로젝트에 꼭 하나 있어야 합니다. (없어도 걱정 마세요 — 배포할 때 올린 HTML 중 하나를 대문으로 지정할 수 있습니다.)
- 배포 — 내 컴퓨터에 있는 파일을 인터넷에서 볼 수 있게 올리는 일입니다. 여기서는 배포하기 버튼 한 번이면 됩니다.
- 경로(slug) — 내 페이지 주소의 마지막 부분으로, 내가 직접 정합니다.
예를 들어
my-page라고 정하면 주소는/my-page가 됩니다. 영문 소문자·숫자·하이픈(-)만 쓸 수 있고, 서비스 전체에서 하나뿐이어야 합니다 (아래 "주소(slug) 정하기" 참고).
첫 배포 따라하기
- 준비 — AI 에게 웹페이지 받기. AI 챗봇에게 예를 들어
"자기소개 페이지를 HTML 파일 하나로 만들어줘" 라고 부탁하세요.
파일 다운로드가 안 되는 경우에는 코드를 복사한 뒤 메모장(텍스트 편집기)에 붙여넣고
index.html이라는 이름으로 저장하면 됩니다. - 로그인합니다. 계정이 없으면 첫 화면에서 회원가입 탭으로 만들 수 있습니다.
- 대시보드에서 공개 경로(slug) 칸에 원하는 주소 이름을 입력합니다 (예:
my-page). 입력하는 즉시 아래에 ✓ 사용 가능 또는 ✕ 이미 사용 중이 표시되니, ✓ 가 뜨는 이름을 고르세요. - 준비한 파일·폴더·ZIP 을 점선 상자에 끌어다 놓습니다. 클릭해서 선택해도 됩니다. ZIP 은 자동으로 압축이 풀립니다.
- 올린 파일 중에
index.html이 없으면 "index.html 로 변환" 체크박스가 나타납니다 — 대문으로 쓸 HTML 파일을 골라 주세요. - 배포하기 버튼을 누르면 몇 초 안에 공개 주소가 표시됩니다. 클릭해서 확인하고, 링크를 공유하세요!
주소(slug) 정하기 — 규칙과 중복 확인
규칙 — 영문 소문자(a-z)·숫자(0-9)·하이픈(-)만, 2~40자. 대문자를 넣어도 소문자로 바뀝니다.
api·admin·login·static 같은 시스템 예약어는 쓸 수 없습니다.
하나뿐인 주소 — slug 는 모든 사용자를 통틀어 단 하나만 존재합니다. 다른 사람이 먼저 쓴 이름은 쓸 수 없고, 한 번 배포한 slug 로 다시 "배포하기"를 할 수도 없습니다(이미 사용 중이라는 안내가 뜹니다). 내용을 바꾸려면 내 프로젝트 → 관리에서 파일을 추가·덮어쓰기·편집하고, 완전히 새로 올리려면 프로젝트를 삭제한 뒤 같은 이름으로 다시 배포하면 됩니다(삭제하면 그 이름은 다시 자유로워집니다).
미리 확인하는 방법
- 대시보드 — 공개 경로 칸에 입력하면 0.5초 안에 ✓ 사용 가능 / ✕ 이미 사용 중 / ✕ 형식 오류가 표시됩니다. ✕ 상태에서는 배포 버튼이 눌리지 않습니다. 이미 내 프로젝트인 경우엔 그렇게 알려 줍니다.
- 내 프로젝트 목록 — 내가 이미 쓰고 있는 slug 는 대시보드 아래 내 프로젝트에 모두 나열됩니다.
- AI 도구 — 연동해 두었다면 "my-page 라는 주소 쓸 수 있는지 확인해줘"(
check_slug), "내 프로젝트 목록 보여줘"(list_projects) 라고 물어보면 됩니다. AI 에게 배포를 시키면 보통 알아서 먼저 확인합니다. - API —
GET /api/projects/check?slug=my-page(API·CLI 탭 참고).
누가 볼 수 있나요? — 공개 범위
모든 프로젝트는 공개로 시작합니다. 언제든 내 프로젝트 → 관리 → 공개 범위 드롭다운에서 바꿀 수 있고, 바꾸는 즉시 적용됩니다(이미 열려 있던 방문자도 새로고침하면 새 규칙을 따릅니다).
| 공개 범위 | 누가 볼 수 있나 | 어떻게 동작하나 |
|---|---|---|
| 공개 (기본) | 링크를 아는 누구나, 로그인 없이 | 주소를 열면 바로 보입니다. 검색엔진에 링크가 알려지면 검색 결과에도 나올 수 있습니다. |
| 🔒 비밀번호 | 비밀번호를 아는 사람 | 선택하면 비밀번호(4자 이상)를 정해 적용해야 저장됩니다. 방문자는 페이지 대신 비밀번호 입력 화면을 보고, 맞게 입력하면 7일간 그 브라우저에서 다시 묻지 않습니다. 이미지·CSS 등 첨부 파일도 함께 잠깁니다. 비밀번호 변경 버튼으로 바꾸면 그 순간부터 이전 비밀번호로 열어 둔 사람도 다시 입력해야 합니다. 비밀번호는 서버에 암호화 해시로만 저장되어 잊어버리면 되찾을 수 없고, 새로 정해야 합니다. |
| 🔐 비공개 | 나(소유자)와 관리자만 | 방문자에게는 "비공개 페이지입니다" 안내만 보입니다. 소유자는 대시보드의 열기 버튼으로 열면 되고, 안내 페이지의 대시보드에서 열기 링크를 눌러 로그인해도 바로 이동합니다. 한 번 열면 그 브라우저에서 7일간 주소를 직접 입력해도 열립니다. |
참고 — 비밀번호나 비공개에서 다시 공개로 바꾸면 저장된 비밀번호는 지워집니다.
나중에 다시 비밀번호로 바꿀 땐 새로 정하면 됩니다. 목록에서는 slug 옆의 🔒/🔐 배지로 현재 상태를 볼 수 있고,
AI 도구에서는 "my-page 를 비밀번호 1234 로 잠가줘" 처럼 말하면 됩니다(set_access).
자주 묻는 질문
- 누가 볼 수 있나요? — 기본은 링크를 아는 누구나입니다. 관리 → 공개 범위에서 비밀번호 또는 나만 보기(비공개)로 바꿀 수 있습니다 (위 "공개 범위" 참고).
- 원하는 주소가 "이미 사용 중"이래요. — 다른 사람이 먼저 쓴 이름이거나, 내가 예전에 배포한 이름입니다.
내 프로젝트라면 목록에 있으니 관리에서 수정하세요. 아니라면
my-page-2처럼 다른 이름을 고르세요. - 내용을 고치고 싶어요. — 같은 경로로 다시 "배포하기"는 안 됩니다(주소는 1회성). 내 프로젝트 → 관리에서 파일을 브라우저로 바로 편집하거나, + 영역에 새 파일을 드롭해 덮어쓰세요 (화면 안내 탭 참고). 통째로 새로 올리려면 삭제 후 같은 이름으로 다시 배포하면 됩니다(조회수·버전 기록은 사라집니다).
- 내리고 싶어요. — 내 프로젝트 → 삭제를 누르면 페이지와 주소가 즉시 사라집니다.
- 한도가 있나요? — 파일 하나당 20MB, 한 번에 100개까지 올릴 수 있고, 계정당 프로젝트 개수·총 저장 용량 한도는 대시보드 상단의 사용량 미터에 표시됩니다.
- 더 편하게 쓰는 방법은요? — AI 도구 연동 탭을 보세요. 한 번 연결해 두면 파일을 내려받아 올릴 필요 없이 AI 에게 "만들어서 배포해줘" 라고 말만 하면 됩니다.
아래 메뉴들은 로그인 후 상단에 표시됩니다.
대시보드
새 배포 — slug 입력 + 드래그앤드롭 + 배포하기 (시작하기 탭 참고). slug 를 입력하면 칸 아래에 ✓ 사용 가능(공개될 주소 표시) 또는 ✕ 이미 사용 중 / 형식 오류 / 예약어가 실시간으로 표시되며, ✕ 인 동안은 배포 버튼이 잠깁니다. 카드 상단의 사용량 미터에서 프로젝트 개수·저장 용량 한도를 확인할 수 있습니다.
내 프로젝트 — 프로젝트마다 누적 조회수가 표시되며:
- slug 옆 배지 — 🔒 비밀번호 / 🔐 비공개. 배지가 없으면 공개입니다.
- 열기 — 주소를 새 탭에서 확인. 비밀번호·비공개 프로젝트는 소유자 자격으로 바로 열립니다 (방문자에게 보이는 화면을 확인하려면 시크릿 창에서 주소를 열어 보세요).
- 관리 › 공개 범위 — 패널 맨 위의 드롭다운. 공개 / 비밀번호 / 비공개 중 고르면 바로 저장되고, 비밀번호를 고르면 비밀번호 입력칸이 나타나 적용을 눌러야 저장됩니다(취소하면 이전 상태 유지). 비밀번호 상태에서는 비밀번호 변경 버튼이 보입니다. 각 상태의 동작은 시작하기 탭의 "공개 범위" 표를 참고하세요.
- 관리 — 방문 통계(누적·최근 14일 일별 그래프)와 파일 목록, 버전 히스토리(변경 전 자동 저장 — 실수해도 복원 가능). 파일이 하위 폴더에 있으면 폴더 트리로 표시됩니다 — 폴더를 클릭해 접고 펼 수 있고, 폴더 단위로 이름 변경(✎)·전체 삭제(✕)도 됩니다. 배포를 다시 하지 않고 라이브 파일을 편집: 새 탭 열기(↗), HTML·CSS·JS 등 텍스트 파일은 내용 편집(✏)으로 브라우저에서 바로 수정·저장(Tab 들여쓰기·Ctrl+S 지원), 이름 변경(✎)·삭제(✕), 아래 + 추가/덮어쓰기 영역에 파일·폴더·ZIP 을 드롭하면 기존 파일에 병합됩니다. 이미지는 목록에서 썸네일로 보입니다
- 삭제 — 프로젝트와 모든 파일 삭제 (공개 주소도 즉시 내려감)
관리자는 모든 사용자의 프로젝트가 보이며 각 항목에 소유자 이메일이 함께 표시됩니다.
계정 설정
- 비밀번호 변경 — 현재 비밀번호 확인 후 변경
- API 키 — MCP·CLI 등 외부 도구용 키(
utw_...) 발급/폐기. 원문 키는 발급 시 딱 한 번만 표시되고 서버에는 해시만 저장됩니다. 계정당 최대 10개, 목록에서 마지막 사용 시각을 확인할 수 있습니다. 키가 유출되면 폐기하고 새로 발급하세요 — 키로는 키를 만들 수 없습니다.
사용자 관리 ADMIN
관리자에게만 보이는 메뉴입니다. 사용자 추가(이메일·이름·비밀번호·역할), 역할(USER/ADMIN) 변경, 비번 초기화, 삭제(해당 사용자의 프로젝트도 함께 삭제)를 할 수 있습니다.
터미널·CI 등에서 직접 REST API 를 호출하려는 개발자용 안내입니다. 일반 사용은 시작하기·AI 도구 연동 탭이면 충분합니다.
API 키로 배포하기 (CLI / CI)
로그인 후 계정 설정 → API 키에서 키를 발급하세요.
비밀번호 대신 Authorization: Bearer utw_... 헤더로 프로젝트 API 를 호출하며,
키는 발급한 계정의 프로젝트에만 접근할 수 있습니다.
BASE=
KEY=utw_... # 계정 설정 → API 키에서 발급
# 0) slug 확인 — 형식·예약어·중복 (배포 전에 먼저!)
curl "$BASE/api/projects/check?slug=my-page" -H "Authorization: Bearer $KEY"
# → {"slug":"my-page","valid":true,"available":true,"owned":false,"reason":null}
# available=false 면 reason 에 이유("이미 사용 중" 등), owned=true 면 내 프로젝트
# 1) 신규 배포 — slug 는 1회성(이미 있으면 409). 하위 경로는 paths(JSON 배열, files 와 같은 순서)
curl -X POST $BASE/api/projects/my-page/upload \
-H "Authorization: Bearer $KEY" \
-F "files=@index.html" -F "files=@app.js" \
-F 'paths=["index.html","assets/app.js"]' -F "title=My Page"
# 2) 기존 프로젝트 수정 — 파일 추가/덮어쓰기(병합) · 이름 변경 · 삭제
curl -X POST $BASE/api/projects/my-page/files \
-H "Authorization: Bearer $KEY" -F "files=@style.css"
curl -X PATCH $BASE/api/projects/my-page/files \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"from":"style.css","to":"css/style.css"}'
curl -X DELETE "$BASE/api/projects/my-page/files?path=css/style.css" -H "Authorization: Bearer $KEY"
# 3) 공개 범위 — PUBLIC(기본) · PASSWORD(password 필수, 4~72자) · PRIVATE(소유자만)
curl -X PATCH $BASE/api/projects/my-page/access \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"visibility":"PASSWORD","password":"secret1234"}'
curl -X PATCH $BASE/api/projects/my-page/access \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"visibility":"PUBLIC"}' # 또는 "PRIVATE" — 저장된 비밀번호는 지워짐
# 비공개/비밀번호 프로젝트를 소유자로 여는 1회용 URL(5분 유효) — 브라우저에서 열면 7일 쿠키 발급
curl $BASE/api/projects/my-page/open-token -H "Authorization: Bearer $KEY"
# 4) 조회 — 목록(visibility 포함) / 상세+파일 / 텍스트 파일 내용 / 방문 통계 / 버전
curl $BASE/api/projects -H "Authorization: Bearer $KEY"
curl $BASE/api/projects/my-page -H "Authorization: Bearer $KEY"
curl "$BASE/api/projects/my-page/file?path=index.html" -H "Authorization: Bearer $KEY"
curl $BASE/api/projects/my-page/stats -H "Authorization: Bearer $KEY"
curl $BASE/api/projects/my-page/versions -H "Authorization: Bearer $KEY"
curl -X POST $BASE/api/projects/my-page/versions/3/restore -H "Authorization: Bearer $KEY"
# 5) 삭제 — 주소가 즉시 내려가고 slug 는 다시 사용 가능해짐
curl -X DELETE $BASE/api/projects/my-page -H "Authorization: Bearer $KEY"
한도: 파일당 20MB · 요청당 100개 — 더 많은 파일은 upload 1회 후 files 병합을 반복하세요.
사용량은 GET /api/projects/usage 로 확인합니다.
엔드포인트 요약
| 메서드 · 경로 | 설명 |
|---|---|
GET /api/projects | 내 프로젝트 목록 — slug·title·visibility·파일 수·조회수·updatedAt (관리자는 전체) |
GET /api/projects/usage | 프로젝트 개수·저장 용량 사용량과 한도 |
GET /api/projects/check?slug= | slug 사용 가능 여부 — valid(형식·예약어) · available(중복 없음) · owned · reason |
POST /api/projects/:slug/upload | 신규 배포 (multipart files[], paths, title). 루트 index.html 필수. 기존 slug 면 409 |
GET /api/projects/:slug | 상세 — title·visibility·파일 목록 |
GET /api/projects/:slug/file?path= | 텍스트 파일 내용 (2MB 이하) |
GET /api/projects/:slug/stats | 누적 조회수 + 최근 30일 일별 |
POST /api/projects/:slug/files | 파일 추가/덮어쓰기(병합) |
PATCH /api/projects/:slug/files | 파일 이름 변경 {from,to} |
DELETE /api/projects/:slug/files?path= | 파일 하나 삭제 |
PATCH /api/projects/:slug/access | 공개 범위 {visibility: PUBLIC|PASSWORD|PRIVATE, password?} — PASSWORD 는 password 필수 |
GET /api/projects/:slug/open-token | 소유자용 열기 URL (?utw_token=, 5분) — 비공개·비밀번호 프로젝트를 브라우저에서 열 때 |
GET /api/projects/:slug/versions | 버전(스냅샷) 목록, 최신순 — 변경 전 자동 저장, 최근 10개 |
POST /api/projects/:slug/versions/:seq/restore | 해당 버전으로 복원 (복원 전 현재 상태도 저장) |
DELETE /api/projects/:slug | 프로젝트 삭제 — slug 재사용 가능 |
공개 콘텐츠 — /<slug>/ (끝 슬래시 권장, 없으면 301).
공개 범위가 비밀번호면 HTML 요청에 401 + 입력 화면, 비공개면 403 + 안내 화면, 첨부 파일은 403.
비밀번호 제출은 POST /<slug>/__gate(password, next) — IP 당 분당 10회.
오류 코드
| 코드 | 의미 · 대처 |
|---|---|
| 400 | slug 형식/예약어 오류, index.html 없음, 허용되지 않는 파일 형식, 비밀번호 길이(4~72) 오류 — message 참고 |
| 401 | API 키/토큰이 없거나 잘못됨 (폐기된 키 포함) |
| 403 | 내 프로젝트가 아님, 또는 프로젝트 개수·저장 용량 한도 초과 |
| 404 | 프로젝트/파일 없음 |
| 409 | slug 중복 — 이미 존재하는 경로. 다른 slug 를 쓰거나(check 로 미리 확인), 내 프로젝트라면 files 로 수정 |
| 413 | 파일당 20MB 또는 요청당 100개 초과 |
| 429 | 요청 과다 — /api/projects 는 IP 당 분당 100회, 로그인 10회, /mcp 60회 |
AI 도구 연동이란?
한 번 연결해 두면 파일을 내려받아 직접 올릴 필요가 없어집니다.
AI 에게 "랜딩 페이지 만들어서 myapp 으로 배포해줘" 라고 말하면
AI 가 알아서 이 서비스에 배포까지 해 주고, "myapp 파일 목록 보여줘",
"제목을 바꿔서 다시 올려줘" 처럼 대화만으로 관리할 수 있습니다.
이 연결에는 MCP 라는 표준 방식을 사용합니다 — AI 도구가 외부 서비스를 직접 조작할 수 있게 해 주는 일종의 "공용 플러그"라고 생각하면 됩니다. MCP 서버가 이 서비스에 내장되어 있어서 여러분이 설치하거나 실행할 것은 아무것도 없고, AI 도구의 설정 화면에 주소 한 줄만 등록하면 됩니다.
준비물 — API 키 발급 (1분, 로그인 필요)
API 키는 AI 도구가 내 계정임을 증명할 때 비밀번호 대신 쓰는 열쇠입니다.
- 이 사이트에 로그인 → 상단 메뉴 계정 설정 → API 키 로 이동합니다.
- 키 이름(예:
chatgpt)을 입력하고 키 발급을 누릅니다. utw_로 시작하는 긴 문자열이 표시됩니다 — 이때 딱 한 번만 보여지므로 복사해서 안전한 곳에 보관하세요. 아래 안내의utw_...자리에 이 키를 넣습니다.
등록할 주소는 이것 하나입니다:
/mcp
키를 전달하는 방법은 도구마다 둘 중 하나입니다 —
Authorization: Bearer utw_... 헤더에 넣거나, 헤더 설정이 없는 도구는
주소 뒤에 붙입니다: /mcp?key=utw_...
(이 주소 자체가 비밀 열쇠를 포함하므로 다른 사람에게 공유하면 안 됩니다).
키가 유출됐다면 계정 설정에서 폐기하고 새로 발급하면 됩니다.
ChatGPT (웹)
- ChatGPT 설정 → 커넥터 → 고급 설정에서 개발자 모드를 켭니다.
- 커넥터 만들기를 누르고 MCP 서버 URL 칸에
/mcp?key=utw_...를 입력합니다 (인증: 없음 선택 — 키가 주소에 이미 들어 있기 때문입니다). - 새 대화에서 이 커넥터를 켜고 "index.html 만들어서
my-page로 배포해줘" 라고 해 보세요.
커넥터 대신 커스텀 GPT Actions 에 REST API 를 등록(인증: API Key → Bearer,
키 값 utw_...)하는 방법도 사용할 수 있습니다.
Codex CLI 를 쓴다면 — ~/.codex/config.toml 에:
[mcp_servers.uploadtowork]
url = "/mcp"
bearer_token = "utw_..."
Claude (claude.ai · Claude Code)
claude.ai / Claude Desktop — 설정 → 커넥터 → 커스텀 커넥터 추가 에 URL
/mcp?key=utw_... 를 등록합니다.
Claude Code (터미널 도구) — 아래 한 줄을 실행합니다:
claude mcp add --scope user --transport http uploadtowork \
/mcp \
--header "Authorization: Bearer utw_..."
Gemini (Gemini CLI)
Gemini CLI — ~/.gemini/settings.json 파일에:
{
"mcpServers": {
"uploadtowork": {
"httpUrl": "/mcp",
"headers": { "Authorization": "Bearer utw_..." }
}
}
}
웹 Gemini 는 아직 원격 MCP 연결을 지원하지 않습니다 — Gemini 가 만들어 준 파일을 대시보드에 드래그앤드롭하거나, API·CLI 탭의 방법을 사용하세요.
연결한 뒤에는 이렇게 말해 보세요
- "
my-page라는 주소를 쓸 수 있는지 확인해줘" · "내가 이미 쓰고 있는 주소 목록 보여줘" — slug 는 전체 사용자 중 하나뿐이라 AI 가check_slug/list_projects로 먼저 확인합니다 - "방금 만든 HTML 을
my-page라는 이름으로 배포해줘" (이미 있는 이름이면 AI 가 다른 이름을 제안합니다) - "my-page 에 어떤 파일이 있어?" · "my-page 의 제목을 바꾸고 다시 올려줘"
- "my-page 를 비밀번호
1234로 잠가줘" · "my-page 를 나만 볼 수 있게 해줘" · "my-page 를 다시 공개로 바꿔줘" — 공개 범위(set_access) - "my-page 어제 버전으로 되돌려줘" · "my-page 프로젝트 삭제해줘"
참고 — AI 가 사용할 수 있는 기능(도구):
whoami(내 계정 확인) · list_projects(목록) · get_project(상세) ·
read_file(텍스트 파일 내용 읽기) · get_stats(방문 통계) ·
check_slug(주소 사용 가능 여부 — 형식·예약어·중복) ·
deploy_project(새 배포, index.html 필수, slug 1회성) ·
upload_files(기존 프로젝트에 파일 추가/덮어쓰기) ·
rename_file · delete_file ·
set_access(공개 범위: PUBLIC 누구나 · PASSWORD 비밀번호 필수 · PRIVATE 소유자만) ·
list_versions(버전 목록) · restore_version(버전 복원) ·
delete_project