)]}'
{
  "commit": "9500617d20b037b9ad1f88eb7550068679832a4d",
  "tree": "15593d668443d3df4f6d223bd753c216f5f0274a",
  "parents": [
    "e89b3080f934a4bc70a0cfa85ffff49ac78d6f2b"
  ],
  "author": {
    "name": "Philip Zeyliger",
    "email": "philip@bold.dev",
    "time": "Wed May 28 20:05:46 2025 -0700"
  },
  "committer": {
    "name": "Philip Zeyliger",
    "email": "philip.zeyliger@gmail.com",
    "time": "Wed May 28 20:26:29 2025 -0700"
  },
  "message": "dockerimg: fix Chromium support with multi-stage Docker build\n\nOMG, people, OMG. So, an earlier commit moved us to Ubuntu, and it turns\nout that \"apt-get install chromium-browser\" or whatever just does\nnothing, and tells you to use the snap. Snap requires systemd, and if\nyou\u0027re using containers, you don\u0027t usually have systemd, and ... yeah,\nno screenshots. There are no great stories for where to get Chromium.\nThere\u0027s a dude who publishes the Mint Linux packages in a compatible way\nfor Ubuntu. I chose instead the headless-chrome from a Docker build\nrecommended by the Chromedp library that we use to control Chromium.\n\nI\u0027m a bit snappy about all of this.\n\n...\n\nReplace Ubuntu 24 snap-based Chromium installation with chromedp/headless-shell\nto resolve container compatibility issues where snaps don\u0027t work properly.\n\nChanges include:\n\n1. Multi-stage Dockerfile.base build:\n   - Stage 1: Extract headless-shell from docker.io/chromedp/headless-shell:stable\n   - Stage 2: Main Ubuntu 24.04 application image with required Chrome dependencies\n   - Remove chromium package from apt-get install (replaced with headless-shell)\n   - Add required libraries: libglib2.0-0, libnss3, libx11-6, libxcomposite1,\n     libxdamage1, libxext6, libxi6, libxrandr2, libgbm1, libgtk-3-0\n   - Add headless-shell to PATH so chromedp can find it automatically\n\n2. Updated documentation in browse/README.md:\n   - Document Docker multi-stage build approach\n   - Clarify requirements for Docker vs local development\n\nBenefits:\n- Resolves Ubuntu 24 snap incompatibility issues in containers\n- Provides self-contained Chrome installation without system dependencies\n- Maintains backward compatibility for local development\n- Uses proven chromedp/headless-shell for reliable browser automation\n- Eliminates need for manual Chrome/Chromium installation in containers\n- No code changes needed in browse.go - chromedp finds headless-shell via PATH\n\nThe headless-shell binary is automatically discovered by chromedp\u0027s default\nexecutable search since it\u0027s added to PATH in the Docker environment.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: se4808dca7afba802k\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "7cc343764dd7bd250f0523f150c905ca6ddb8150",
      "old_mode": 33188,
      "old_path": "claudetool/browse/README.md",
      "new_id": "69ebf078a64169695bec0d7255f0d4f19816a217",
      "new_mode": 33188,
      "new_path": "claudetool/browse/README.md"
    },
    {
      "type": "modify",
      "old_id": "b47b450e69917beb8864547126eeb98370fac293",
      "old_mode": 33188,
      "old_path": "dockerimg/Dockerfile.base",
      "new_id": "73fecdab65cb86bd157c880b8b3b08c54aa14350",
      "new_mode": 33188,
      "new_path": "dockerimg/Dockerfile.base"
    },
    {
      "type": "modify",
      "old_id": "79e71ad2e742a08a74e7480d5a73e88c5e81440f",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.dockerfile",
      "new_id": "b6ca36a6a8d0ce3e19359aa19d50c725f75c1188",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.dockerfile"
    },
    {
      "type": "modify",
      "old_id": "440a6f1a58e6d31f1d1fe7fa198beb07512f5606",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr",
      "new_id": "d1e18068f9837ef4292472e7e6d1b5177aaaa9de",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_basic_repo_with_readme.httprr"
    },
    {
      "type": "modify",
      "old_id": "5ae600abfb62933e72d4484aa9bc48627c919a4f",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_empty_repo.dockerfile",
      "new_id": "303b5c34a965c7d0b5fa342a3294ac90343602ea",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_empty_repo.dockerfile"
    },
    {
      "type": "modify",
      "old_id": "cd9e4c211f91ba75c7c52c8e5dbd238e3923c85b",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_empty_repo.httprr",
      "new_id": "945fc06b92b90463a1dfdf4e02e4a5a808625352",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_empty_repo.httprr"
    },
    {
      "type": "modify",
      "old_id": "e500280e2614d2615c58ab19857b266af9303fe6",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_mention_a_devtool_in_the_readme.dockerfile",
      "new_id": "567a60186431e7f9193219708619c3f33b94218b",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_mention_a_devtool_in_the_readme.dockerfile"
    },
    {
      "type": "modify",
      "old_id": "2a142beddb8274816ed8c7a812e08e43722e6d02",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_mention_a_devtool_in_the_readme.httprr",
      "new_id": "569d24695120686f3d2ce6e4316e1b9c5b1ae84d",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_mention_a_devtool_in_the_readme.httprr"
    },
    {
      "type": "modify",
      "old_id": "fb0e525d6e6e202ff7688348dca16ed2055b680b",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_python_misery.dockerfile",
      "new_id": "38073d3018ee1a1575be7ad8448ed09401521b2a",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_python_misery.dockerfile"
    },
    {
      "type": "modify",
      "old_id": "6b4a271e0e68045fdd12714c86b7beb684a43308",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_python_misery.httprr",
      "new_id": "960c2be9148558d8bc6bfd097072fb931bbcf5b1",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_python_misery.httprr"
    },
    {
      "type": "modify",
      "old_id": "3c4d5454c0e46ddb75b00a2aa83320df77d03a41",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_repo_with_readme_and_workflow.dockerfile",
      "new_id": "90604eb948e15578ec518b4ccdaf7a992487b257",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_repo_with_readme_and_workflow.dockerfile"
    },
    {
      "type": "modify",
      "old_id": "6b5f219edcc35c6e4e6cfc5265cad21b5307f4bc",
      "old_mode": 33188,
      "old_path": "dockerimg/testdata/testcreatedockerfile_repo_with_readme_and_workflow.httprr",
      "new_id": "74a0c5cd663816410ad25c2c73460bbcf788ad62",
      "new_mode": 33188,
      "new_path": "dockerimg/testdata/testcreatedockerfile_repo_with_readme_and_workflow.httprr"
    }
  ]
}
