{
  "schema": "tesign-radar/item/1",
  "generated_at": "2026-09-17T01:56:13.055Z",
  "lang": "en",
  "slug": "kage",
  "url": "https://tesign.com/en/item/kage/",
  "alternates": {
    "ko": {
      "html": "https://tesign.com/item/kage/",
      "json": "https://tesign.com/item/kage/index.json",
      "markdown": "https://tesign.com/item/kage/index.md"
    },
    "en": {
      "html": "https://tesign.com/en/item/kage/",
      "json": "https://tesign.com/en/item/kage/index.json",
      "markdown": "https://tesign.com/en/item/kage/index.md"
    }
  },
  "name": "kage",
  "use_label": "Offline, script-free copies of websites",
  "one_liner": "CLI that renders a site in headless Chrome and saves a script-free copy to read offline",
  "text": {
    "why": "A page saved with Save As tends to open months later as a blank screen or a spinner that never stops. kage loads each page in real headless Chrome, waits for it to settle, snapshots the DOM, deletes every script and pulls CSS, images and fonts to local paths. `kage pack` then collapses the mirror into one ZIM file (the format Kiwix uses) or a single executable that serves the site itself (about 13 MiB plus the site).",
    "take": "It does one thing, keeping what a real browser rendered minus the code, and finishes in an open format (ZIM) instead of its own.",
    "build": [
      "You could schedule a job that re-renders an internal docs site with `--refresh` into a script-free static copy, or run archiving on a server with the container image that bundles Chromium. The pure-Go ZIM reader and writer (zim/) can be reused on its own."
    ],
    "who": [
      {
        "role": "Readers who want to keep a body of writing",
        "situation": "a whole essay site as an offline folder or one ZIM file"
      },
      {
        "role": "Docs owners",
        "situation": "hand out a script-free copy of a documentation site"
      },
      {
        "role": "Go developers",
        "situation": "reuse the pure-Go ZIM package and headless Chrome control"
      }
    ],
    "start": [
      {
        "command": false,
        "text": "brew install --cask tamnd/tap/kage   # Windows: scoop bucket add tamnd https://github.com/tamnd/scoop-bucket && scoop install kage / Go: go install github.com/tamnd/kage/cmd/kage@latest"
      },
      {
        "command": false,
        "text": "kage clone paulgraham.com"
      },
      {
        "command": false,
        "text": "kage serve $HOME/data/kage/paulgraham.com"
      },
      {
        "command": false,
        "text": "# open http://127.0.0.1:8800"
      },
      {
        "command": false,
        "text": "kage pack paulgraham.com               # -> paulgraham.com.zim"
      }
    ],
    "caveat": [
      "Licence MIT. Needs Chrome or Chromium on the host (the container image bundles Chromium). Respects robots.txt by default.",
      "ZIM output has no full-text search index like Kiwix's own packs, so in-reader search is limited. The binary pack adds about 13 MiB regardless of site size. The native-window viewer is an opt-in cgo build.",
      "Free. Latest release v0.3.12 as of 2026-09-15, still 0.x."
    ]
  },
  "cta": {
    "type": "install",
    "label": "INSTALL",
    "url": "https://kage.tamnd.com/"
  },
  "ready": "install",
  "categories": [
    "dev-tools"
  ],
  "categories_confirmed": true,
  "tags": [
    "web-archiving",
    "offline",
    "headless-chrome",
    "cli",
    "go",
    "zim"
  ],
  "platform": [
    "cli",
    "macos",
    "windows",
    "linux"
  ],
  "license": {
    "spdx": "MIT",
    "scope": "permissive",
    "scope_text": "Use, change and redistribute, commercially too. Keep the notice.",
    "url": "https://spdx.org/licenses/MIT.html",
    "note": null,
    "open_source": true
  },
  "language": "Go",
  "source_urls": {
    "canonical": "https://kage.tamnd.com/",
    "github": "https://github.com/tamnd/kage",
    "huggingface": null,
    "app_store": null,
    "sightings": [
      {
        "source": "showhn",
        "url": "https://github.com/tamnd/kage",
        "posted_at": "2026-06-14T17:25:38.000Z",
        "hn_url": "https://news.ycombinator.com/item?id=48529990"
      },
      {
        "source": "github",
        "url": "https://github.com/tamnd/kage",
        "posted_at": "2026-06-14T18:00:00.000Z",
        "hn_url": null
      }
    ]
  },
  "numbers": {
    "as_of": "2026-09-16T21:00:00.000Z",
    "stars": 3399,
    "stars_unit": "GitHub stars",
    "stars_checked_at": "2026-09-15T19:34:34.150Z",
    "stars_observed_since_check": 0,
    "star_delta_24h": null,
    "star_delta_7d": null,
    "star_delta_30d": null,
    "star_delta_unit": "GitHub stars gained in the window, GH Archive events summed to as_of",
    "spark_14d": [
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null,
      null
    ],
    "hf_likes": null,
    "hf_likes_observed_at": null,
    "hn_points": 712,
    "hn_points_observed_at": "2026-09-13T16:05:53.714Z",
    "store": null,
    "method": "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours."
  },
  "ranks": null,
  "activity": {
    "pushed_at": "2026-08-10T11:59:54.000Z",
    "owner_type": "User",
    "open_issues": 9,
    "contributors": 7,
    "releases_count": 18,
    "latest_release": {
      "tag": "v0.3.12",
      "published_at": "2026-08-10T07:20:08.000Z",
      "prerelease": false
    },
    "checked_at": "2026-09-15T19:34:34.150Z",
    "core_checked_at": "2026-09-15T19:34:34.150Z"
  },
  "signals": [
    {
      "kind": "cross",
      "label": "CROSS-SIGNAL",
      "value": "Show HN + GitHub"
    },
    {
      "kind": "back",
      "label": "BACK CATALOG",
      "value": null
    }
  ],
  "images": {
    "og": "https://tesign.com/img/kage-f2e1003e91.png",
    "cover": "https://tesign.com/img/kage-f2e1003e91.png",
    "cover_width": 2000,
    "cover_height": 1496,
    "gallery": [
      "https://tesign.com/img/kage-f2e1003e91.png",
      "https://tesign.com/img/kage-ba556a1821.png",
      "https://tesign.com/img/kage-ebdbb0ec2d.png"
    ],
    "alt": "Terminal demo: cloning paulgraham.com, packing it into one file and serving it back offline",
    "tier": 2
  },
  "dates": {
    "first_seen_at": "2026-09-13T08:18:08.225Z",
    "source_created_at": "2026-06-14T11:21:55.000Z",
    "discovery_hours": 2180.9370069444444,
    "launch_signal_at": "2026-06-14T17:25:38.000Z",
    "kept_at": "2026-09-14T19:27:43.437Z",
    "first_published_at": "2026-09-14T19:27:43.735Z",
    "updated_at": "2026-09-15T04:36:56.895Z",
    "ingestion_mode": "backfill"
  },
  "notes": [
    "This file was produced by the same build, from the same data, as the tesign.com item page. The text is editorial; the numbers are stored observations.",
    "null in the JSON means not observed — never zero. The Markdown writes [unconfirmed] for it.",
    "Star total = the value last checked on GitHub (stars_checked_at) + increases observed via GH Archive since. The 24h · 7d · 30d gains are GH Archive hourly events summed to the reference time (as_of). No score of ours.",
    "Reconstructed from archive data, not a live discovery.",
    "A summary, not legal advice."
  ]
}
