Show HN: Kage – 웹사이트를 한 파일 바이너리로 오프라인 뷰어
kage (影, “shadow”)는 웹사이트를 스크립트를 제거한 채 오프라인에서 볼 수 있는 폴더로 복제합니다. 실제 헤드리스 Chrome을 열어 페이지가 완전히 로드될 때까지 대기하고, 인간이 보는 DOM을 캡처한 뒤 JavaScript를 모두 삭제하고 CSS, 이미지, 폰트를 로컬 경로에 가져옵니다. 디스크에 저장된 결과는 실제 사이트와 같으며 코드가 실행되지 않습니다.
kage (影, “shadow”) clones a website into a folder you can browse offline, with every script stripped out. It opens each page in real headless Chrome, waits for the page to settle, snapshots the DOM a human would have seen, then deletes all the JavaScript and pulls the CSS, images, and fonts down to local paths. What lands on disk looks like the live site and runs no code.
설치 • 빠른 시작 • 명령어 • 복제 • 포장 (한 파일에 압축) • 실제 창 • 작동 원리
You already know the problem. You hit “Save As” on a page you want to keep, and six months later you open it to find a blank screen, a spinner that never stops, or a copy that still tries to phone home to an analytics server that no longer exists. The page was never really yours. It was a thin client for someone else’s JavaScript.
kage takes the other road. It drives a real browser, lets the page finish doing whatever it does, grabs the finished result, and then rips every script out of it. No tracking, no network calls, no surprises. Just .html files you can open straight off disk, hand to a friend, or pack into a single file and forget about for a decade.
설치
go install github.com/tamnd/kage/cmd/kage@latest
프리빌드 바이너리를 원하시면 아카이브, .deb/.rpm/.apk 파일, 또는 체크섬을 releases에서 받아보세요. Chrome을 직접 설치하지 않고 컨테이너 이미지를 사용하면 됩니다. 이 이미지는 Chromium을 포함하고 있습니다:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
kage는 실제 브라우저를 구동하므로 호스트에 Chrome 또는 Chromium이 필요합니다. 스스로 시스템 설치를 감지하고, --chrome 옵션이나 KAGE_CHROME 환경 변수로 특정 경로를 지정할 수 있습니다. 컨테이너는 추가 설치가 필요 없습니다.
쉘 완료 기능은 기본 제공됩니다: kage completion bash|zsh|fish|powershell.
빠른 시작
Paul Graham의 에세이를 복제해 비행기 안, 와이파이 없는 노트북, 아니면 사이트가 디자인을 바꾼 2050년 후에도 로컬에서 읽을 수 있게 합니다:
1. 사이트를 $HOME/data/kage/paulgraham.com/에 복제합니다
kage clone paulgraham.com
2. 브라우저에서 오프라인으로 읽어보세요
kage serve $HOME/data/kage/paulgraham.com
open http://127.0.0.1:8800
이것이 전체 루프입니다. 모든 에세이, 이미지, 스타일시트가 디스크에 고정되고 네트워크 없이 실행됩니다. 다음 두 단계는 선택 사항이지만 좋습니다: 전체를 하나의 파일에 압축하고, 자체 창에서 열어 보세요.
paulgraham.com.zim
kage open paulgraham.com.zim
4. 또는 사이트 자체가 되는 단일 실행 파일로 변환합니다
kage pack paulgraham.com —format binary -o paulgraham
./paulgraham # serves itself, needs nothing installed
명령어
| 명령어 | 기능 |
|---|---|
kage clone | headless Chrome로 사이트를 렌더링하고 스크립트 없이 볼 수 있는 미러를 작성합니다 |
kage serve [dir] | 복제된 폴더를 로컬 HTTP 서버로 미리보기 |
kage pack | 미러를 ZIM 아카이브 또는 self‑contained 실행 파일 하나로 압축 |
kage open | 포장된 ZIM을 오프라인에서 읽기 위해 제공 |
복제
/
kage clone https://paulgraham.com
# 빠른 맛을 위해 첫 50 페이지, 두 링크 깊이만
kage clone paulgraham.com --max-pages 50 --max-depth 2
# 큰 사이트의 한 섹션만
kage clone go.dev --scope-prefix /doc
# 하위 도메인도 포함하고, 각 페이지를 스크롤해 로지컬로드 이미지를 트리거합니다
kage clone example.com --subdomains --scroll
# 다음 달에 돌아와서 --refresh 옵션으로 새 에세이를 포착하며 원위치에서 재렌더링합니다
kage clone paulgraham.com --refresh
플래그 및 기본값
| 플래그 | 기본값 | 의미 |
|---|---|---|
-o, --out | $HOME/data/kage | 출력 루트; 미러가 해당 경로에 저장됩니다. |
-p, --max-pages | 0 | N 페이지 후 종료 (0은 무제한). |
-d, --max-depth | 0 | 팔로우할 링크 깊이(0은 무제한). |
--scope-prefix | — | 이 접두사로 시작하는 경로만 크롤합니다. |
--subdomains | false | 씨드 호스트의 하위 도메인을 범위에 포함합니다. |
--exclude | — | 스킵할 경로 접두사(반복 가능). |
--scroll | false | 각 페이지를 자동으로 스크롤해 로지컬 이미지 로드 트리거. |
--workers | 4 | 동시 렌더링할 페이지 수. |
--no-robots | false | robots.txt 무시(예의 바름). |
-f, --force | false | 기존 미러를 먼저 삭제합니다. |
--chrome | — | Chrome/Chromium 바이너리 경로. |
미리 보기
kage serve는 복제된 폴더 위에 작은 정적 파일 서버를 실행해 실제 호스트와 같은 링크와 자산 해상도를 제공합니다:
kage serve $HOME/data/kage/paulgraham.com
# open http://127.0.0.1:8800
한 파일에 압축
미러는 폴더 형태이며, 브라우징에는 좋지만 이동하기엔 불편합니다. 수천 개의 작은 파일을 복사하는 것은 느리고, “여기 이 폴더를 가져와”라고 전하려는 것은 누군가에게 어색합니다. kage pack은 전체 미러를 하나의 아티팩트로 압축하고, 선택할 수 있는 형태는 개방형 ZIM 아카이브이거나, 사이트 자체가 되는 단일 실행 파일입니다.
단일 ZIM 파일
paulgraham.com.zim
kage open paulgraham.com.zim
작동 원리
kage는 실제 브라우저를 구동하므로 호스트에 Chrome 또는 Chromium이 필요합니다. 자체적으로 시스템 설치를 감지하고, --chrome 옵션이나 KAGE_CHROME 환경 변수로 특정 경로를 지정할 수 있습니다. 컨테이너는 추가 설치가 필요 없습니다.