오프라인 배포 버전
대상 독자: 배포를 담당하는 IT 관리자 또는 기술 책임자. 일반 사용자는 관리자가 배포한 사내 주소에 접속하시면 되며, 본 문서를 읽으실 필요는 없습니다.
적용 환경: 사내 인트라넷, 공공기관 내부망, 금융권 폐쇄망, 망분리 환경, 국방·연구기관, 캠퍼스망 등 외부망 접속이 불가능하거나 제한되는 환경.
백엔드 불필요, 계정 등록 불필요——모든 데이터는 브라우저 로컬에 저장됩니다. 배포 후 사내 팀원은 브라우저만 열면 바로 사용할 수 있습니다.
팀 사용 방식
오프라인 버전은 순수 정적 웹사이트입니다. 사내 서버에 배포한 후, 팀원은 브라우저로 사내 주소에 접속하시면 됩니다.
- 관리자가 오프라인 버전을 사내 서버에 배포합니다 (예:
http://192.168.1.100:3000) - 팀원은 브라우저로 해당 주소를 열어 프롬프트를 탐색·검색·복사합니다
- 각자의 즐겨찾기와 직접 만든 프롬프트는 본인 브라우저에 저장되며, 서로 영향을 주지 않습니다
- 계정 등록 불필요, 별도 소프트웨어 설치 불필요, 열면 바로 사용 가능
프롬프트 라이브러리(엄선된 프롬프트)는 빌드 시점에 패키징된 정적 데이터로, 모든 사용자가 동일한 내용을 보게 됩니다. 각 사용자의 즐겨찾기, 직접 만든 프롬프트, 정렬 순서, 태그는 각자 브라우저의 localStorage에 저장되어 서로 독립적입니다.
온라인 버전과의 차이점
| 기능 | 온라인 버전 | 오프라인 버전 |
|---|---|---|
| 프롬프트 탐색/검색/필터링 | ✅ | ✅ |
| 프롬프트 복사 | ✅ | ✅ |
| 즐겨찾기 관리 | 서버 저장 | 브라우저 로컬 저장 |
| 커스텀 프롬프트 | 서버 저장 | 브라우저 로컬 저장 |
| 마이 컬렉션 (드래그 정렬, 태그) | ✅ | ✅ |
| 다국어 지원 (18종) | ✅ | ✅ |
| 데이터 가져오기/내보내기 | ✅ | ✅ (포맷 호환) |
| 프롬프트 상세 페이지 | ✅ | ✅ (정적 데이터, 댓글 없음) |
| 사용자 등록/로그인 | ✅ | ❌ (계정 불필요) |
| 커뮤니티 프롬프트 목록/투표 | ✅ | ❌ |
| 댓글·피드백 | ✅ | ❌ |
데이터 저장
각 사용자의 데이터는 본인 브라우저의 localStorage에 저장되며, 서버와는 무관합니다.
| 데이터 | 저장 키 | 설명 |
|---|---|---|
| 즐겨찾기 목록 | local_favorites | 즐겨찾기한 프롬프트 ID 배열 |
| 직접 만든 프롬프트 | local_user_prompts | 사용자가 생성한 프롬프트 데이터 |
| 정렬 순서 | local_myspace_order | 마이 컬렉션 카드 정렬 순서 |
| 사용자 지정 태그 | local_custom_tags | 태그 정의 및 할당 관계 |
- 브라우저 로컬 저장소는 약 5MB 용량 상한이 있으나 일상 사용에는 충분합니다.
- 브라우저 데이터를 삭제하면 개인 데이터가 사라집니다——「내 계정 → 데이터 관리 → 내보내기」를 통해 정기적으로 백업하시기를 권장합니다.
- PC나 브라우저를 교체할 경우 데이터를 다시 가져와야 합니다.
배포
오프라인 버전은 offline 브랜치를 기반으로 합니다. 관리자가 한 번 배포해 두면 팀원은 별도 작업 없이 바로 사용할 수 있습니다.
Docker 배포 (권장)
가장 간단한 배포 방식으로, 한 줄 명령어만으로 사내 서버에서 실행할 수 있습니다.
# 사전 빌드된 오프라인 버전 이미지 사용
docker run -d -p 3000:3000 --name aishort-offline ghcr.io/rockbenben/chatgpt-shortcut:offline
# 또는 Docker Hub 사용
docker run -d -p 3000:3000 --name aishort-offline rockben/chatgpt-shortcut:offline
배포 후 팀원은 http://<서버IP>:3000에 접속하시면 됩니다.
docker-compose 사용 시:
services:
aishort-offline:
container_name: aishort-offline
image: ghcr.io/rockbenben/chatgpt-shortcut:offline
ports:
- "3000:3000"
restart: unless-stopped
소스 코드 빌드
프롬프트 내용을 커스터마이징하거나 설정을 수정하려면 다음과 같이 진행합니다.
# 오프라인 브랜치 클론
git clone -b offline https://github.com/rockbenben/ChatGPT-Shortcut.git
cd ChatGPT-Shortcut
# 의존성 설치
yarn
# 로컬 개발
yarn start
# 단일 언어 빌드 (한국어)
yarn build --locale ko
# 전체 언어 빌드
yarn build
빌드 결과물은 build/ 디렉터리에 생성되며, 임의의 정적 파일 서버(Nginx, Apache, Caddy 등)에 배포할 수 있습니다.
Nginx 설정 예시
server {
listen 3000;
server_name _;
root /path/to/build;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
플랫폼 배포
Vercel, Cloudflare Pages 등의 플랫폼에 배포할 때 offline 브랜치를 선택하시면 됩니다. 나머지 단계는 온라인 버전과 동일하며, 자세한 내용은 프로젝트 배포 문서를 참조하십시오.
데이터 가져오기·내보내기
내보내기
「내 계정 → 데이터 관리 → 내보내기」로 이동하여 개인 즐겨찾기와 직접 만든 프롬프트를 JSON 파일로 내보냅니다.
가져오기
다음 형식의 JSON 파일을 가져올 수 있습니다.
- 오프라인 버전에서 내보낸 파일: 즐겨찾기, 프롬프트, 정렬, 태그를 완전히 복원
- 온라인 버전에서 내보낸 파일: 자동 호환 처리
- 사용자 프롬프트 → 로컬에 병합 (제목 기준 중복 제거)
- 엄선 즐겨찾기(card) → 로컬 즐겨찾기에 병합
- 커뮤니티 즐겨찾기(community) → 자동으로 로컬의 직접 만든 프롬프트로 변환
- MySpace 정렬 → 로컬로 복원
- 사용자 지정 태그 → 추가 병합 (기존 항목 덮어쓰지 않음)
온라인 버전에서 마이그레이션
- 온라인 버전(aishort.top)의 「내 계정」 페이지에서 데이터를 내보냅니다
- 오프라인 버전의 「내 계정 → 데이터 관리 → 가져오기」에서 해당 JSON 파일을 가져옵니다
- 커뮤니티 즐겨찾기는 자동으로 로컬 프롬프트로 변환되며, 엄선 즐겨찾기는 정상 동기화됩니다
자주 묻는 질문
배포 후 팀은 어떻게 사용하나요?
관리자가 사내 서버에 배포한 후, 접속 주소(예: http://192.168.1.100:3000)를 팀원에게 안내하시면 됩니다. 각자 브라우저로 열기만 하면 되며, 설치나 등록은 필요하지 않습니다.
각자의 데이터가 서로 영향을 주나요?
영향을 주지 않습니다. 각자의 즐겨찾기와 직접 만든 프롬프트는 각자 브라우저의 localStorage에 저장되어 완전히 독립적입니다. 서버에는 공유 프롬프트 라이브러리(읽기 전용)만 존재합니다.
데이터가 손실될 수 있나요?
다음 작업은 개인 데이터 손실로 이어질 수 있습니다.
- 브라우저 데이터/캐시 삭제
- 시크릿/프라이빗 모드 사용
- PC 또는 브라우저 교체
중요한 데이터는 「내 계정 → 데이터 관리 → 내보내기」를 통해 정기적으로 JSON 파일로 백업하시기를 권장합니다.
팀원 간에 직접 만든 프롬프트를 공유할 수 있나요?
가능합니다. 한 사람이 JSON 파일을 내보낸 뒤, 다른 팀원이 「내 계정 → 데이터 관리 → 가져오기」에서 해당 파일을 가져오시면 자동으로 중복이 제거되어 병합됩니다.
프롬프트 라이브러리는 어떻게 업데이트하나요?
프롬프트 라이브러리는 빌드 시점에 패키징된 정적 데이터입니다. 업데이트 방식은 다음과 같습니다.
- 관리자가 최신
offline브랜치 코드를 가져옵니다 - 다시 빌드하여 배포합니다 (또는 최신 Docker 이미지를 받습니다)
- 팀원이 브라우저를 새로고침하면 새 콘텐츠를 확인할 수 있습니다 (개인 데이터에는 영향 없음)
오프라인 버전의 데이터 포맷은 온라인 버전과 호환되나요?
호환됩니다. 내보낸 JSON 포맷이 동일하여 두 버전 간에 서로 가져올 수 있습니다. 프롬프트 ID는 다르지만(온라인 버전은 서버 ID, 오프라인 버전은 타임스탬프 ID), 가져올 때 제목 기준으로 중복 제거하므로 충돌이 발생하지 않습니다.