)]}'
{
  "log": [
    {
      "commit": "4936de3834a2c70db563d19975c072bb42d953cc",
      "tree": "b4e4e9eb513236636c523ca70d7e2983157af156",
      "parents": [
        "593ca6455ea14bf48f6ae4ff6f5d3296c6befa7b"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 13:50:04 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed May 07 14:02:13 2025 -0700"
      },
      "message": "all: make update_tests.sh scripts location-independent\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "31f152493929b3b171c140c2e0e22dbcf9059cac",
      "tree": "80eefea2e5f1977e89d7bec71efc0c85562bc77d",
      "parents": [
        "4962f153fa0d6812543addd690be8dba8c04a406"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 16:03:49 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Tue May 06 16:10:02 2025 -0700"
      },
      "message": "dockerimg: always show build output\n\nThe previous --progress\u003dplain was a bit too quiet, it also depended\non installing buildx which brew does not do by default.\n"
    },
    {
      "commit": "33d282f80db786cc60ba521a38ed5166f23239ed",
      "tree": "9ed1f15c6d3081d5bef7d16b9d72e78a2c7780cf",
      "parents": [
        "a9d87aa69cfefdc91ec7aaa6bc42907749748e76"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Sat May 03 04:01:54 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue May 06 10:23:39 2025 -0700"
      },
      "message": "Add browse tool support.\n\nI reviewed some MCPs (using OpenAI\u0027s deep research to help), and it\nhelped me choose chromedp as the relevant library and helped me come up\nwith an interface. This commit adds chrome to the Docker image which is\nkind of big. (I\u0027ve noticed that it\u0027s smaller on Ubuntu, where it doesn\u0027t\npull in X11.) go-playwright was a library contender as well.\n\nImplement browser automation tooling using chromedp\n\nThis implementation adds browser automation capabilities to the system via the chromedp library,\nenabling Claude to interact with web content effectively.\n\nKey features include:\n\n1. Core browser automation functionality:\n   - Created new browsertools package in claudetool/browser\n   - Implemented tools for navigating, clicking, typing, waiting for elements,\n     getting text, evaluating JavaScript, taking screenshots, and scrolling\n   - Added lazy browser initialization that defers until first use\n   - Integrated with the agent to expose these tools to Claude\n\n2. Screenshot handling and display:\n   - Implemented screenshot storage with UUID-based IDs in /tmp/sketch-screenshots\n   - Added endpoint to serve screenshots via /screenshot/{id}\n   - Created dedicated UI component for displaying screenshots\n   - Ensured proper responsive design with loading states and error handling\n   - Fixed URL paths for proper rehomed URL support\n   - Modified tool calls component to auto-expand screenshot results\n\n3. Error handling and reliability:\n   - Added graceful error handling for browser initialization failures\n   - Implemented proper cleanup of browser resources\n\nThe browser automation tools provide a powerful way for Claude to interact with web content,\nmaking it possible to scrape data, test web applications, and automate web-based tasks.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "b1cca6f19bf38a7c22793648012598b6a2baf9fb",
      "tree": "82af4bf88162497862d862b8831fdd12820fd26f",
      "parents": [
        "29fea840fbe3c279e1480d5f78cff4be697b7ca5"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue May 06 01:52:55 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 18:54:20 2025 -0700"
      },
      "message": "dockerimg: pass -x flag to inner sketch to enable experimental features\n\nThe -x flag needs to be passed from the outer sketch process to the inner sketch process\nto ensure experimental features are correctly enabled across both processes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "3659d8714d31bad050d36043b67efd76a8d53b77",
      "tree": "2803c54c63628e397e63bdbbe4fa2647a4d5f556",
      "parents": [
        "021557a7d33dacd4fedb9a4677fc93c48569d57a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:23 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 17:52:27 2025 -0700"
      },
      "message": "all: more gemini key plumbing\n"
    },
    {
      "commit": "5a7b3698b523365fe070ffcd1019c704c2c3a7b5",
      "tree": "1b90d8fd84b6e9c24a6a131e1a89afc4416e0b52",
      "parents": [
        "f53875fa18db64d5fa73f3b163314c1bb021db34"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 16:49:15 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 16:50:08 2025 -0700"
      },
      "message": "cmd/sketch, dockerimg: more gemini key plumbing\n\nNext up: SKETCH_* env vars\n\nFor #60\n"
    },
    {
      "commit": "1dc21374a34fab022eb9138a73ad6b7b566701ec",
      "tree": "37e6edd33743e35bd62d1d6b3ed4166e3464cd42",
      "parents": [
        "8fd510465d87574f64135c16d67f4b6d519a9a83"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 19:54:44 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon May 05 13:13:33 2025 -0700"
      },
      "message": "Add docker-args flag to pass arguments to docker create command\n\nThis change allows users to pass additional arguments to the docker create command,\nwhich can be useful for customizing the container environment (e.g. adding volumes,\nsetting resource limits, etc).\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n\nUpdate docker-args flag to handle space-separated arguments with escaping\n\n- Created parseDockerArgs function to handle space-separated arguments with quotes and escaping\n- Added comprehensive tests for argument parsing\n- Updated CLI help text to reflect the new format\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "8fd510465d87574f64135c16d67f4b6d519a9a83",
      "tree": "65a17d20a1a8e514e8545941dfd4ca264700a2e0",
      "parents": [
        "a4b19f822c6c46bd46e4b0f47983a3ee72374d72"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 12:52:43 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 12:56:58 2025 -0700"
      },
      "message": "dockerimg: do not include tmp-sketch-dockerfile in image\n\nFixes #39\n"
    },
    {
      "commit": "995704692a260e7792a6116d19882bc1943e08b4",
      "tree": "54d2b592cb77cf09cc462da3df92849a7095ea37",
      "parents": [
        "50608b1df40053cb18d91a8493872a7ce9243655"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:14 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:26:21 2025 -0700"
      },
      "message": "dockerimg: remove configurability from open browser request\n\nInnie is untrusted, so we can\u0027t let it provide a url to open (duh).\nThere\u0027s a chicken-and-egg problem here: we need to start the git\nserver before launching the container, but we need the container\nport information to store the ps1URL on the git server.\nSolve it with a little sync/atomic. There\u0027s a logical race here,\nbut if we lose the race, the behavior is that nothing happens,\nat which point the user tries again and it works.\nGood enough for now.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "50608b1df40053cb18d91a8493872a7ce9243655",
      "tree": "d2955631951755d2a6f69aa2bfd26f2ca073ac5c",
      "parents": [
        "b7a066339b6a4c032524ae772aab3619edcc9c65"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Sat May 03 22:55:49 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon May 05 10:19:34 2025 -0700"
      },
      "message": "dockerimg: fix typo in SSHTheater name"
    },
    {
      "commit": "b7a066339b6a4c032524ae772aab3619edcc9c65",
      "tree": "6c8cb3cf9aa54c3e509ba79ad272668d9c08b458",
      "parents": [
        "b2064de1fff42fe1f34c28a3eb0c61ee220c967d"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:52:20 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:52:20 2025 -0700"
      },
      "message": "dockerimg: update tests for last commit\n"
    },
    {
      "commit": "b2064de1fff42fe1f34c28a3eb0c61ee220c967d",
      "tree": "5681149ab83059f4cd6757f89c5def153edd282c",
      "parents": [
        "66cf74eb3912a3b8edbff6e3d9b2d93f43e037a7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:12:19 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 09:12:20 2025 -0700"
      },
      "message": "dockerimg: more Dockerfile robustness\n\nLLM-generated RUN commands such as\n\n\tRUN . .venv/bin/activate \u0026\u0026 uv pip sync requirements.txt || true\n\nwere failing when .venv didn\u0027t exist, because under the default\ndebian shell (dash), sourcing a non-existant file causes a command\nto fail even with `|| true`.\n\nMake things a little easier for the LLM by switching to bash.\nAdditionally, configure bash with set +e for the duration of the\nLLM-generated extra_cmds.\n"
    },
    {
      "commit": "66cf74eb3912a3b8edbff6e3d9b2d93f43e037a7",
      "tree": "8cb4690778c2bbd78d827a9a61e4e24a10634704",
      "parents": [
        "93fec60318b49e975e311f0980ed6f166fd6af45"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:48:39 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:48:39 2025 -0700"
      },
      "message": "dockerimg: do not allocate a TTY in one-shot mode\n"
    },
    {
      "commit": "b5f6a00fb7e274681ef67600e9d9969a6161add7",
      "tree": "1ace0bfd616105c14e7c87dc5a7bb3b7028fe182",
      "parents": [
        "5a23406f6959384e3edc402eaf9c271648195786"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:16 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Mon May 05 08:27:17 2025 -0700"
      },
      "message": "dockerimg: use --progress\u003dquiet to always show docker build failure\n\nIn non-verbose mode, --progress\u003dquiet is very quiet when everything\nworks, but prints an actual error when something fails (e.g. the\ndockerfile is bad or you ran out of space).\n\nWhile here, remove the partial stdout/stderr plumbing that did not\nquite work (because the code sometimes used os.Stdout/os.Stderr\ndirectly).\n\nFor #37\nFor #41\n"
    },
    {
      "commit": "4bdd9aaaa4156bcf9863df9eadb809c0bd7a0573",
      "tree": "f4a7a6b28a833b573376aba2deced94c534bae05",
      "parents": [
        "c7e7796dec4b12e0009705eaa563ee85b7a27f08"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 21:33:09 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 22:24:36 2025 +0000"
      },
      "message": "dockerimg: simplify pushdockerimg by requiring it run on linux\n\nReplace the complex Mac/Colima-based Docker build script with a simpler\nversion that works on vanilla Ubuntu. The new script:\n\n1. Provides setup instructions for Ubuntu environments\n2. Builds and pushes multi-architecture images in a single command\n3. Eliminates the need for multiple VMs/contexts\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nSigned-off-by: David Crawshaw \u003cdavid@zentus.com\u003e\n"
    },
    {
      "commit": "c7e7796dec4b12e0009705eaa563ee85b7a27f08",
      "tree": "40d6f7047740554f5ea776a611148e6444457ecf",
      "parents": [
        "ca535584da37312f2f826c2c6bb8fec81f22b4ef"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:20:18 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:22:56 2025 -0700"
      },
      "message": "dockerimg: remove tmp-sketch-binary-linux\n\nThis is a remnant from when we tried to include the sketch\nbinary in the container image we built. Instead of doing\nthat, we `docker cp` the sketch binary into the container\nevery time we run it. (This is to make sure that sketch is\nalways fresh when we are developing it, and do not find\nourselves stuck on the docker image cache.)\n\nBecause of the docker cp step, there is no longer any\nneed to give the binary a funny name and include it in the\ndirectory we build the container from. So stop doing that.\n\nA bonus is that sketch will stop accidentally adding it\nto commits.\n\nFixes #39\n"
    },
    {
      "commit": "ca535584da37312f2f826c2c6bb8fec81f22b4ef",
      "tree": "8a84914e564e7a8edf0eb2aeaba9b2b93838d971",
      "parents": [
        "99231ba279ce3ebf5cb87494c3cde1f6e27257fc"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:04:34 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 13:06:55 2025 -0700"
      },
      "message": "dockerimg: set http.postBuffer for git inside container\n\nWe sometimes see failures with git push from the innie to the outie.\nIt appears to be when there is a big binary in the commit\n(which is usually because of a different bug).\nThe internet suggests the HTTP POST limit in the git client\nmay be an issue (1MB in the git version in debian bookworm),\nso let\u0027s bump it up.\n"
    },
    {
      "commit": "99231ba279ce3ebf5cb87494c3cde1f6e27257fc",
      "tree": "c3ec8e1e62e772d3c51d86769476586328ab402c",
      "parents": [
        "ab50e9b5718ccc211266b95587634f688425b745"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:48:26 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat May 03 10:48:28 2025 -0700"
      },
      "message": "dockerimg: be more robust to http connection errors\n\nE.g. on linux you can see \"read: connection reset by peer\" when\nthe server is in startup.\n"
    },
    {
      "commit": "6234a8d9d229904994f49a5edacca05e54b26d1f",
      "tree": "02465eaa4a3162b25ab4f952f782f92b2c5d9222",
      "parents": [
        "25f6ff1b44e739e64d8b86cc4ea11bf8c631265c"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:31:20 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Fri May 02 14:35:31 2025 -0700"
      },
      "message": "Sketch inception wiring: make it easier to run unsafe sketch inside Sketch\n\nBy renaming the api key env variable, you can run \"sketch -unsafe\"\nboth with and without skaband without removing /.dockerenv and\nre-writing env variables. Previously this was painful. We\u0027re using\n\"--outside-hostname\" to indicate the fact that we\u0027re an \"inside sketch\".\n"
    },
    {
      "commit": "4f84ab729ddbf428b0e891940f08f70b4edee05c",
      "tree": "f2e52e4a01c188ada1f5acf8b2a013029b999495",
      "parents": [
        "44f9b4cec11e269a52fbfc099989ab425b8e125f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 16:40:54 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri May 02 12:57:44 2025 -0700"
      },
      "message": "all: support openai-compatible models\n\nThe support is rather minimal at this point:\nOnly hard-coded models, only -unsafe, only -skabandaddr\u003d\"\".\n\nThe \"shared\" LLM package is strongly Claude-flavored.\n\nWe can fix all of this and more over time, if we are inspired to.\n(Maybe we\u0027ll switch to https://github.com/maruel/genai?)\n\nThe goal for now is to get the rough structure in place.\nI\u0027ve rebased and rebuilt this more times than I care to remember.\n"
    },
    {
      "commit": "fa67fe5ec3ac9ad434054035285d4d53f9211d7f",
      "tree": "5b7e5c85d71e5927a580213ca11398973e544e13",
      "parents": [
        "a352ca65720f937cdc733414bce393d22f9a787c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 20:42:08 2025 +0000"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri May 02 09:08:37 2025 -0700"
      },
      "message": "dockerimg: remove buildx dependencies from Dockerfile\n\nMain changes:\n1. Removed --mount\u003dtype\u003dcache for apt-get operations and added cleanup steps\n2. Removed --mount\u003dtype\u003dcache for Go tools installation\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "4d5e9978fce2feb262663b9d0455c06546723ddc",
      "tree": "dfa4824a78b33a01c5c0d72d4077cfec78010a62",
      "parents": [
        "2772f63c725cdc47f644f68a9e684e798e54b543"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 15:56:37 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 16:09:09 2025 -0700"
      },
      "message": "all: make tests accept OUTER_SKETCH_ANTHROPIC_API_KEY\n\nInner sketch already has an ANTHROPIC_API_KEY...but it is the\nsketch anthropic key, not the anthropic anthropic key. Blarg!\n\n"
    },
    {
      "commit": "2772f63c725cdc47f644f68a9e684e798e54b543",
      "tree": "de19240644faff057235a90933c8ace9e71c72cf",
      "parents": [
        "e2c7f722803ef4d483a21859e8fc6329645851e0"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 21:42:35 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 16:09:09 2025 -0700"
      },
      "message": "dockerimg: add support for passing env vars to Docker via git config\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "a3dcd86d1c05e95ee9c058a43262458a92160898",
      "tree": "86a49759e93940a80c940703a0d03a7084a90dd1",
      "parents": [
        "8da3d456505ec29a27d73720731a929cfab46b3f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 19:47:16 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 12:39:18 2025 -0700"
      },
      "message": "ant: improve encapsulation\n\n- Replace string literals with package constants for message roles and content types.\n- Create UserStringMessage helper function to simplify user message creation\n- Replace manual Content creation with ant.StringContent()\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "5228b5850d8453c225e5611918fcd00b747c65cc",
      "tree": "f51bd5eb893b7830987a8593ab42f76a812e9bd5",
      "parents": [
        "a1e0e49213c07f74618f0e0f324e707792858e0c"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 11:18:12 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu May 01 12:02:42 2025 -0700"
      },
      "message": "dockerimg: add SKETCH\u003d1 to sketch container\n\nAlso remove some extra files debian.\n"
    },
    {
      "commit": "c76a392d48f0070ccb011b04cbf25114671a8af4",
      "tree": "f8efdf643ac4cb6eef2acfb0227127887e8903a7",
      "parents": [
        "bc4947e41d50b5e1a8089600808047715b828305"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu May 01 01:18:56 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 18:25:41 2025 -0700"
      },
      "message": "dockerimg: restore sketch_context docker label\n\nThe sketch_context label was removed in commit 2a5bd6d (switch to debian base image)\nbut the code that reads this label in findOrBuildDockerImage was left intact.\n\nThis was causing Docker to always rebuild images since the label it was checking\nfor no longer existed in the Dockerfile template.\n\nRestore the label and updates the template.Execute call to pass the required\nInitFilesHash parameter.\n\nUpdates #43\n"
    },
    {
      "commit": "3e2111b1e18a39a4eba4a0afa0327b6a67acf802",
      "tree": "6add6c3a0583877f173f1f2baf6ceeb8c39b3f69",
      "parents": [
        "e54b00af5cf711c2171a26ed0f29a8ce83d50fb4"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:53:28 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:13:18 2025 -0700"
      },
      "message": "all: support popping a browser from termui\n\n- Add \u0027browser\u0027, \u0027open\u0027, and \u0027b\u0027 command aliases to termui\n- Open the current conversation URL in default browser\n- Add help documentation for the new command\n\nAdd browser launch endpoint to Git server for Docker support.\n\nWe\u0027ll probably want to set up a proper mux for the no-longer-just-git\nserver pretty soon.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "e54b00af5cf711c2171a26ed0f29a8ce83d50fb4",
      "tree": "e34f4ce054e3cbb8ae3dce09e4cc906977a86ec9",
      "parents": [
        "93bb66a204ba666fbef0e8590b9f210c267fe5f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:48:02 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 17:13:09 2025 -0700"
      },
      "message": "browser: simplify API\n\nThe context is doing nothing here."
    },
    {
      "commit": "78707d6ea7bcd323719358dee3445130fa719037",
      "tree": "5d51a7c3c33e61d13b32dc7b4dca273c788079d8",
      "parents": [
        "96b60dd7e71c7db55dfe4cff86265eab02e54e9f"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 21:06:49 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 16:21:05 2025 -0700"
      },
      "message": "browser: small new package\n\nMove browser opening functionality from dockerimg to a new browser package.\nUpdated all references to use browser.Open directly.\nThis avoids importing dockerimg widely.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e"
    },
    {
      "commit": "bce3a13a7c16ffdb602b66550e6b3479d34fb9b0",
      "tree": "b83cf1209a5add2b71bc8b5a58d389bed460dd24",
      "parents": [
        "2a5bd6d3e22db146385bea9902e9dd9bc982377d"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Wed Apr 30 22:03:39 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Wed Apr 30 22:10:21 2025 +0000"
      },
      "message": "Modernize and streamline Sketch top bar UI\n\nComprehensive improvements to the top bar interface:\n\nRemoved Elements:\n- Poll checkbox and all polling UI controls\n- Network status indicator and all status messages\n- Dotted underlines from tooltip elements\n\nButton Improvements:\n- Added SVG icons to Restart and Stop buttons\n- Made buttons responsive (text hides below 1400px)\n- Stop button now disabled when no active calls\n\nLayout Simplification:\n- Simplified hostname display (outside hostname only)\n- Simplified working directory display (outside directory only)\n- Repositioned tab chooser for better layout\n- Improved responsive behavior across viewport sizes\n\nEnhanced Features:\n- Added GitHub repo auto-detection with clickable links\n- Improved VSCode integration with button styling\n- Changed \u0027SSH Connection\u0027 to \u0027Connect to Container\u0027\n- Enhanced tooltips with more descriptive text\n\nThe UI is now cleaner, more responsive, and provides a better user experience\nacross different screen sizes.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "2a5bd6d3e22db146385bea9902e9dd9bc982377d",
      "tree": "0d51ce5180913d1fc9d0acba122aed1894c546b7",
      "parents": [
        "320113391429ba3531aa772e4e32ba41998afbaa"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Apr 30 14:29:46 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Wed Apr 30 15:05:04 2025 -0700"
      },
      "message": "dockerimg: switch to a debian base image\n\nDeveloping on a musl-based alpine image seems to suck.\nA lot of python stuff doesn\u0027t work.\nEven when told it\u0027s alpine, LLMs still want to apt-get install things.\n\nAlong with switching to debian, simplify everything.\nWe *always* use debian bookwork now. If there are python\nthings, the LLM needs to install them on top of the model.\nThis will make fallback mode easier: if a build fails, then we\ndrop ExtraCmds and try again. (Future work.)\n\nWhile here: avoid using docker buildx in tests because\nit seems to vary a lot version-to-version.\n"
    },
    {
      "commit": "3cae7d97036513e4743083da7bb232a2aa566e82",
      "tree": "bd75e33df4f46fc4ea8f59a03268904dd178d1fb",
      "parents": [
        "e634d266ace9afe0f8485c13ed0aae6bcfc0a8f8"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 09:54:29 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 11:13:16 2025 -0700"
      },
      "message": "cmd/sketch: make -open default to true"
    },
    {
      "commit": "0d95d3a268ffad82b7c645200804fb43ed088a81",
      "tree": "ac9a63b6648a2555382769bcd9ce157170291224",
      "parents": [
        "9c0fc89eea578d71389edb4fd7d92eb73816f528"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 16:22:28 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 16:22:35 2025 +0000"
      },
      "message": "Improve SSH config file safety in dockerimg/ssh_theater.go\n\n- Add SafeWriteFile method to the FileSystem interface that:\n  - Writes data to a temporary file first\n  - Syncs to disk to ensure data is written\n  - Creates a backup of the original file (if it exists)\n  - Safely renames the temporary file to the target\n\n- Update all file modification operations to use SafeWriteFile:\n  - addContainerToSSHConfig\n  - removeContainerFromSSHConfig\n  - addContainerToKnownHosts\n  - removeContainerFromKnownHosts\n  - CheckForIncludeWithFS\n\nThis change reduces the risk of corruption if the process is interrupted\nwhile modifying configuration files.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "9c0fc89eea578d71389edb4fd7d92eb73816f528",
      "tree": "b5537fe6f3456ec941dde88d1bb65792212875f8",
      "parents": [
        "c796e7fb2df221dbef753556a3077da81a7fbe0c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:48:42 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:48:42 2025 -0700"
      },
      "message": "fmt\n"
    },
    {
      "commit": "c796e7fb2df221dbef753556a3077da81a7fbe0c",
      "tree": "652c542588c3bba3ad9897c4f5e5d231fbde7aed",
      "parents": [
        "78520f50d518f331c6608cfd0dff7bb4a75dc93b"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:44:06 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 30 08:44:55 2025 -0700"
      },
      "message": "ssh_theater: fix tests\n"
    },
    {
      "commit": "3b0795b1c52d9b470f361299e9cd359c53704a04",
      "tree": "9fab2d27f829cb93fba774f65f4a1426fec3ce05",
      "parents": [
        "74b012128c939c8fd119a4af2205451105a19ad3"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:09:23 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:39:22 2025 -0700"
      },
      "message": "ssh_theater: auto-add Include to ~/.ssh/config\n"
    },
    {
      "commit": "74b012128c939c8fd119a4af2205451105a19ad3",
      "tree": "a1b3d989ec446adc6a2b6233452c64324546ec1f",
      "parents": [
        "fff269b875d14dd6fbd1b90050739679f4bc2061"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 18:40:53 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Tue Apr 29 19:27:20 2025 -0700"
      },
      "message": "ssh_theather: use ~/.config/sketch not ~/.sketch\n"
    },
    {
      "commit": "e2d24ab80f34e25f602b306ea8e8b765101d8585",
      "tree": "0ba0f2f3874069024baf1af857ec67d045ea813d",
      "parents": [
        "dbe02304e804066bb32fcf6f41690336a98e6531"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 30 00:01:41 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 29 17:41:18 2025 -0700"
      },
      "message": "dockerimg: add \u0027apk add grep\u0027\n\nClaude wants to use lots of grep features that the busybox version lacks.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "c72fff52ad6c5436fa8469f049fa232f2f6be5ed",
      "tree": "2f42838fc0af2f4954a64b8edcc4c8e09ec08af4",
      "parents": [
        "d3906e2e0a18197148089f384b188135b07559be"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 20:17:54 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 16:24:19 2025 -0700"
      },
      "message": "Add SSH connection information to web UI\n\nThis commit implements:\n1. Added SSH information display to the web UI info button\n2. Shows SSH connection information only when running inside Docker container\n3. Constructs the full SSH hostname as \"sketch-[session_id]\"\n4. Added copy-to-clipboard buttons for SSH commands\n5. Styles the VSCode URL as a proper clickable link\n6. Shows a warning message when SSH is not available\n7. Modified container naming to use only SessionID instead of imgName+SessionID\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "1b47aa2aa46bf1aad16c79d36a9baf60fc69e905",
      "tree": "10cfc03414feef2c7adf723be101b136a7c387c5",
      "parents": [
        "2dc86b9bda41cf30926833b044d8669d92273b20"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Mon Apr 28 19:25:38 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip@bold.dev",
        "time": "Tue Apr 29 11:24:29 2025 -0700"
      },
      "message": "Add initial-commit CLI flag for specifying git reference\n\nThis adds a new -initial-commit flag to the sketch CLI which allows specifying\na different git reference besides HEAD as the starting point. The flag is\nincompatible with -unsafe mode and will show an error if both are used.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "ea3fc200402ef92fb2d35c9b56ab77e77a983338",
      "tree": "c95a9faf8d5cebb0e22d96cef4f17aec02089145",
      "parents": [
        "015b882721adf65cad5a11838d1d72c98e99c6f6"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:53:37 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Mon Apr 28 12:54:22 2025 -0700"
      },
      "message": "dockerimg: fix vscode:// links\n\nThis adds an undocumented parameter that makes vsc open a new window\ninstead of replacing your current vsc window with the link.\n"
    },
    {
      "commit": "0dcebe1bf2ec5d6f85aa71fb46367e2adf8f4947",
      "tree": "03bb39dc484e95c56f9dd5b4a6c75aa295736cdd",
      "parents": [
        "fefde5770a9f6484e23c926b408f86ca8aa388ae"
      ],
      "author": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon Apr 28 14:51:04 2025 +0100"
      },
      "committer": {
        "name": "Pokey Rule",
        "email": "755842+pokey@users.noreply.github.com",
        "time": "Mon Apr 28 14:51:04 2025 +0100"
      },
      "message": "Add support for passing prompt without -one-shot\n\nAdded `-prompt` option\n"
    },
    {
      "commit": "5bff650e0d5603dc77efccb4b4610648aa83cbf6",
      "tree": "5475e933d40bb3577c01952772d0f49301d37b60",
      "parents": [
        "1112949adc2bb120a001a925c0c4e9e18def0ee6"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Apr 26 09:11:40 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Sat Apr 26 09:11:40 2025 -0700"
      },
      "message": "fix oddball formatter complaints\n"
    },
    {
      "commit": "1112949adc2bb120a001a925c0c4e9e18def0ee6",
      "tree": "591396d3d0932a475dc1db5d79b2b96b649daaba",
      "parents": [
        "5fdd024fa3d3df5fe5a2c216672d912b6aade60a"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 20:41:53 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 25 20:43:00 2025 -0700"
      },
      "message": "dockerimg: use a default image from a public registry\n\nIf the LLM chooses our default alpine Go image, we save some\nwork by instead starting from a sketch docker image pushed\nto ghcr.io.\n"
    },
    {
      "commit": "b74c4f6e1c93afca3d37a6b68c717d41a51fa612",
      "tree": "8e5c31de6634a56bec23e026d8fd8515d92eb173",
      "parents": [
        "833a0f83af52be33eed3baf0f67ffa3ddab55cb4"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:18:49 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 19:38:09 2025 -0700"
      },
      "message": "make -one-shot command line work with both -unsafe and regular\n\nThe \"-one\" option had atrophied in a variety of ways, against both\nunsafe and dockerized environments. I resurrected it, and simplified\nthe flag handling slightly by using just one flag.\n"
    },
    {
      "commit": "0cbd976940708c94eb8b644b14bfda3f19087997",
      "tree": "c52d063201ece6aa1b9691e2dac5a5d31ceab1a3",
      "parents": [
        "33f717263a1b7172ed8e0182481adb1b1ededb7a"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:30:20 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:30:20 2025 -0700"
      },
      "message": "rename a file that was driving me crazy\n"
    },
    {
      "commit": "33f717263a1b7172ed8e0182481adb1b1ededb7a",
      "tree": "6c3e212689dc203318fff3d4be6e6a5eb750f226",
      "parents": [
        "2cba69514b40c49a7a71102962b917c8a9eb4194"
      ],
      "author": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Apr 25 23:23:22 2025 +0000"
      },
      "committer": {
        "name": "Autoformatter",
        "email": "bot@sketch.dev",
        "time": "Fri Apr 25 23:23:22 2025 +0000"
      },
      "message": "all: fix formatting\n"
    },
    {
      "commit": "2cba69514b40c49a7a71102962b917c8a9eb4194",
      "tree": "b623b2f6dca84a875a40758361617111b724edda",
      "parents": [
        "6f2bf8aa1d1105d292b8fb7961fc30b41d15cc79"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 20:32:10 2025 +0000"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 16:19:49 2025 -0700"
      },
      "message": "Add unit tests for dockerimg/sshtheater.go with refactoring for testability\n\nRefactored the code to use dependency injection to make it more testable, including:\n- Created FileSystem and KeyGenerator interfaces\n- Added RealFileSystem and RealKeyGenerator implementations\n- Refactored SSHTheater to use these interfaces\n- Added comprehensive unit tests for all functionality\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\n"
    },
    {
      "commit": "6f2bf8aa1d1105d292b8fb7961fc30b41d15cc79",
      "tree": "87b89de8e93958c878f92bafeb32e67d0f407134",
      "parents": [
        "5c70bfe5601e9919e598025ac56984e1b2e21040"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 15:29:46 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 15:32:56 2025 -0700"
      },
      "message": "sketch: fix double space in SSH warning\n"
    },
    {
      "commit": "df2d3dccd3f2f97fd4b8ab3bd153fbef15becea0",
      "tree": "fd3749e53b40131d8b9e6da9045c59fbcbc31ef2",
      "parents": [
        "6e42f32893e061a36f67aa0abbb8c62b402262c2"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Apr 25 12:31:35 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Fri Apr 25 13:23:52 2025 -0700"
      },
      "message": "dockerimg: add extra space for terminals that render emojis wide"
    },
    {
      "commit": "176a5105d3f5e515ea782b054f1ab853a8afc399",
      "tree": "591e6bd3eebe72b4706a86977ff29c23dcdd72de",
      "parents": [
        "6bc2eb24313de1455fc5b6c2ea231b86fb5d1329"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Thu Apr 24 20:32:37 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Fri Apr 25 11:43:58 2025 -0700"
      },
      "message": "Add force-rebuild flag to allow user to rebuild docker container explicitly.\n"
    },
    {
      "commit": "f5e28f67b3f569c73b1b020b5783872371bd0c3c",
      "tree": "174b42b12dadc6bbd96257aa0f7cdde722d09609",
      "parents": [
        "faa39bec76f463c0e2c9b06f567a596d47af0d50"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 10:48:00 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 25 10:48:00 2025 -0700"
      },
      "message": "sshtheater: check for Include line in ~/.ssh/config\n"
    },
    {
      "commit": "7d5a6301a256823ab4b26a68dbd166f0d0737409",
      "tree": "99abfc40814eb152f9e3442d7f75ef8a5e306002",
      "parents": [
        "4854c6535a320f6fbfe8baee02af509367e4236c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 21:27:51 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 21:29:46 2025 -0700"
      },
      "message": "SSHTheater: fix known_hosts update issue\n"
    },
    {
      "commit": "4854c6535a320f6fbfe8baee02af509367e4236c",
      "tree": "6ef13e82fb6597c443b31c350af8e390a8d0062f",
      "parents": [
        "53786efbbbb2fbc3edb91ba639894e713b293140"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 18:37:02 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Thu Apr 24 20:49:55 2025 -0700"
      },
      "message": "dockerimg: +SSHTheater, auto-configures local ssh\n\n- removes the old cli flags for pointing sketch at existing ssh key files\n- generates key pairs for both the container ssh server and the user if\n  these don\u0027t already exist in ~/.sketch/\n- automatically edits ~/.sketch/known_hosts and ~/.sketch/ssh_config to\n  add entries when you start a sketch container and remove them when you\u0027re\n  done\n- does not make any edits to default ~/.ssh/config files, so you\u0027ll have\n  to manually add line to you default ssh config file like:\n  `Include HOME_DIR/.sketch/ssh_config`\n  in order to have your ssh tools pick up what sketch is putting down.\n"
    },
    {
      "commit": "53786efbbbb2fbc3edb91ba639894e713b293140",
      "tree": "1442ed25c365a61cd35f9c2a0052cebb6fa66083",
      "parents": [
        "f91095a6a873a4d2faa91d075e93abd4761bc7b5"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 12:52:51 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 12:52:55 2025 -0700"
      },
      "message": "dockerimg: use emoji in container debug info\n\nThis should potentially be removed (or moved to --verbose) but I am\nstill using it semi-reguarly during debugging.\nShould probably be removed in a few weeks by default.\n"
    },
    {
      "commit": "094e4d291369d5a04375e1fd9c95f17a236532a0",
      "tree": "f9321e4ecaf73a0d764225012847f8ef6916fd9f",
      "parents": [
        "1d06132f5a79950ab8a64eb72219363fb63ca92f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 11:35:14 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 24 11:35:17 2025 -0700"
      },
      "message": "cmd/sketch, dockerimg: remove unhelpful initial debug messages\n"
    },
    {
      "commit": "7660e4e48978ed32452ed444514238c41c27c0c9",
      "tree": "ae9c6be37e2c2d4b593d5cc75eeb73457d911771",
      "parents": [
        "fe3e9f7d8480ea2ed8cfa68a310a7d8bf6162160"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:34:17 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Thu Apr 24 10:34:17 2025 -0700"
      },
      "message": "dockerimg: use more modern APIs\n\n- bytes.Lines instead of bufio.NewScanner\n- bytes.CutPrefix instead of HasPrefix/TrimPrefix\n\nSimpler, cheaper.\n\nThere is a slight change in that bytes.Lines includes the\ntrailing newline, and bufio.Scanner does not.\nBut we only do prefix work to start, and then we do a TrimSpace,\nso this ends up being a wash.\n"
    },
    {
      "commit": "6ed6adbe65a26268ef8f74c99b4bc777417f500c",
      "tree": "9083c17b22b0a699556b20f660bd3911fffd4c22",
      "parents": [
        "5d6af87c7c4f2ccdfe9d2ba2d0d74356b213d1d5"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:56:38 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:56:38 2025 -0700"
      },
      "message": "Fix -open to point to skaband addr when configured for the container case\n\nWe were opening on the skaband address if using -unsafe but\nnot doing the same in the container case.\n"
    },
    {
      "commit": "5d6af87c7c4f2ccdfe9d2ba2d0d74356b213d1d5",
      "tree": "79ccaf9095d50c100935d05af3158e018fe537ac",
      "parents": [
        "2032b1c1971ceb85ca14b20273a3783729fba3e3"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:48:34 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:48:34 2025 -0700"
      },
      "message": "Only print Dockerfile in verbose mode\n\nThis is sneaky because verbose controls where stdout/stderr goes, for\nbetter or worse.\n"
    },
    {
      "commit": "2032b1c1971ceb85ca14b20273a3783729fba3e3",
      "tree": "0486e9222643ffcbbd34286148f4a7913a169668",
      "parents": [
        "4f50a68ac73677c0022b2b3da8b4667cee01c11b"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:40:42 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:40:42 2025 -0700"
      },
      "message": "Move webui from /loop/webui to /webui\n\nThanks, perl (and git mv):\n\n\tperl -pi -e s,loop/webui,webui,g $(git grep -l loop/webui)\n"
    },
    {
      "commit": "cc3ba220373b62dd5a098180ea6797af76407525",
      "tree": "f2e5dcea13fb8da2b652d79d7f5f0bf762c8a395",
      "parents": [
        "18532b212b8c108cc1c8bfcbaf5804a5c4156655"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 14:52:21 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:28:10 2025 -0700"
      },
      "message": "sketch: Add python3 to our container image\n"
    },
    {
      "commit": "18532b212b8c108cc1c8bfcbaf5804a5c4156655",
      "tree": "3667714104cdd0bc0f8078a0ea619676e0764c7f",
      "parents": [
        "d013131a2892d175fcecc270d51e526c617dc170"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 21:11:46 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:28:10 2025 -0700"
      },
      "message": "Rename Host/Runtime hostname fields to Outside/Inside pattern\n\nThis renames all hostname/OS/working directory fields to follow the\nOutside/Inside naming pattern rather than Host/Runtime naming pattern.\n\n- HostHostname -\u003e OutsideHostname\n- RuntimeHostname -\u003e InsideHostname\n- HostOS -\u003e OutsideOS\n- RuntimeOS -\u003e InsideOS\n- HostWorkingDir -\u003e OutsideWorkingDir\n- RuntimeWorkingDir -\u003e InsideWorkingDir\n\nThis includes related method names, struct fields, and JavaScript properties.\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "d013131a2892d175fcecc270d51e526c617dc170",
      "tree": "60e67016511ba28c67848ed84cc99e65467712ed",
      "parents": [
        "e4fa0e35235147cc76c7011f7aa91fa03a5b05bc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 21:14:01 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:22:24 2025 -0700"
      },
      "message": "Use bufio.Scanner instead of strings.Split for line iteration\n\nImprove efficiency when iterating over log lines by using bufio.Scanner\ninstead of splitting the entire log string and then iterating over it.\n\nCo-Authored-By: sketch\n"
    },
    {
      "commit": "e4fa0e35235147cc76c7011f7aa91fa03a5b05bc",
      "tree": "5043a0cdd1c1222e01aaf255cffd7d8f659ee49d",
      "parents": [
        "ae3480fee8b8ebf867a1097868d0032ff4b51324"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 14:15:55 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 19:22:24 2025 -0700"
      },
      "message": "sketch: print Dockerfile contents\n\nIt\u0027s a bit of inside baseball, but building the Docker image\nis slow enough that it\u0027d be nice to stare at what it\u0027s doing,\neven in the simplest form.\n"
    },
    {
      "commit": "ae3480fee8b8ebf867a1097868d0032ff4b51324",
      "tree": "468d02673f8e9fff21fd33d9a343ef4125d646ac",
      "parents": [
        "5544d146e1ebe2747ae282e611f8d0a2c23f2b6c"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 15:28:20 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 15:57:49 2025 -0700"
      },
      "message": "allow random (ephemeral) host ports for ssh server\n\nalso fixes an issue with authorized_keys files that\ncontain multiple pks: it now checks all of them not\njust the first one it parses.\n"
    },
    {
      "commit": "5544d146e1ebe2747ae282e611f8d0a2c23f2b6c",
      "tree": "23af22bf29c6df663dda31b35d88e04a2a6ba60b",
      "parents": [
        "73db6056606c17e78973e124681a86754ed466d9"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 23 14:15:45 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Apr 23 14:16:45 2025 -0700"
      },
      "message": "dockerimg: clean up linux binary"
    },
    {
      "commit": "baa2b590cc3a5f63bc52c3324f2835666b9ae450",
      "tree": "69b313aab41b2f3d3cd27c72ce7d09f6b6453aa6",
      "parents": [
        "97188fc1955f036e57c42a2f345b3c01fc5f0dc0"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Wed Apr 23 10:40:08 2025 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 23 10:40:08 2025 -0700"
      },
      "message": "sketch: initial container ssh support (#15)\n\nAdds an in-process ssh server to the sketch agent running inside\nthe container.\n\nThe ssh server implementation uses https://github.com/gliderlabs/ssh/\n\nThis change does not automatically generate any keys (this may come later).\nYou specify the server identity private key and the user\u0027s authorized public\nkeys on the sketch command line.\n\nThe host sketch process reads these files from the cli flags at startup. Once\nthe container is launched, it passes these keys to to the container\nsketch process via new /init POST body fields."
    },
    {
      "commit": "d140295fa7d794f5b30feb4eee2f45f9cc9ff383",
      "tree": "659e3d00a94eb2aee0da202efaf2e33477c0e895",
      "parents": [
        "37dc4cf04df5dee6feff005d68a4a24e55be8990"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 03:54:37 2025 +0000"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Wed Apr 23 06:40:17 2025 -0700"
      },
      "message": "sketch: Propagate host vs. runtime OS/WorkingDir/Hostname\n\nIf you have a bunch of sketch sessions, you need to know where they were\nlaunched. The container hostnames (some random thing) and working dirs (always /app)\naren\u0027t very helpful, so we want to keep around both. I\u0027ve updated the UI\nto show them as well.\n\nThis commit chooses \"Host\" and \"Runtime\" as the names of the \"Outside\"\nand \"Inside\" sketch. I\u0027m open to suggestions for better names.\n\nCo-Authored-By: sketch, but it did a so-so job\n"
    },
    {
      "commit": "9f6a998f9ac9eda8a5ef6e3bc468b21ec741455a",
      "tree": "2c6986c6a07d002bdbed888a6e47777a9a6819b5",
      "parents": [
        "5cef9db41207acbe29b6d265c5ecd08acce2941a"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 17:34:15 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Tue Apr 22 17:34:15 2025 -0700"
      },
      "message": "dockerimg: clean up password matching code\n\nMinor fixes:\n\n* use crypto/rand.Text instead of hand-rolling one\n* avoid converting the password during checking, that\u0027s not constant time\n* don\u0027t use constant time comparisons against a constant string, there\u0027s no point\n"
    },
    {
      "commit": "5e227dd8f494194284b4b545c02e09bc79909d41",
      "tree": "cbe3fb6cb160fea4379e822fcca2cfcbe5bc51cf",
      "parents": [
        "e8d6b80c8804353641c0d999d1897e29b068bbdc"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:55:29 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 20:04:53 2025 -0700"
      },
      "message": "sketch: Linux support\n\nTogether with 8a89e1cbd3e7c9bbe1c561e88141527a0c894e06, this\nshould resolve https://github.com/boldsoftware/sketch/issues/3,\nin supporting Linux.\n\nTo test on a Mac, run \"limactl shell default go run ./cmd/sketch -verbose\", assuming\nyou have a lima default VM with sketch\u0027s dependencies already prepped.\n\nThe issues we encountered were:\n\n1. Explicit checks for \"is Colima installed\", \"is docker installed\",\n   etc. Easy enough to fix these.\n\n2. When go\u0027s toolchain builds, it puts the output in different places\n   depending whether it\u0027s cross-compiled or not. Fine, we adapt.\n   Note that os.Rename() doesn\u0027t always work, and we fall back to\n   copy/delete. Mode has to be set appropriately to, to make the\n   /bin/sketch executable executable.\n\n   Re-building is kind of silly: we could use /proc/self/exe, for\n   example, or cross-mount the binary into the container, or any\n   number of other things. That said, here we keep the paths the same.\n\n3. Docker networking setup for the git server. The host git repo\n   is served with git\u0027s cgi-bin wrapper. host.docker.internal\n   seems to work different in colima vs Ubuntu\u0027s docker.io, so\n   an extra command line flag to docker was added. Then,\n   it turns out that our git server checks that the remote is\n   127.0.0.1, which seems to be how Colima does its networking,\n   but isn\u0027t the case for Docker in general. To handle this, we\n   use HTTP Basic Auth with a random password. (Git also has\n   an \"http.extraHeader\" configuration, but basic auth seems just\n   as good and more obvious.)\n\nIncidentally, I\u0027m also adding the git remote as a git remote\nnamed \"sketch-host\" to make it easier to work with in the terminal,\nif necessary.\n"
    },
    {
      "commit": "fae1757ffae063830d5f789258bebee62727b1b4",
      "tree": "8ae6b4a6d1d2d80830b3d7c86e207199d0d48a83",
      "parents": [
        "64d329991f8577311ff5bea692b8fbc711b97b32"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 21 11:48:05 2025 -0700"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Mon Apr 21 11:48:05 2025 -0700"
      },
      "message": "dockerimg: unset GOBIN when installing"
    },
    {
      "commit": "f5bb3d3f1aa33e2a066c4139675f096f73c1f9d4",
      "tree": "186963b48527831888af9054c5e400c9198297de",
      "parents": [
        "8a617cb963b73d6dd38b44289720b1808278f9b7"
      ],
      "author": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 18 10:47:59 2025 -0700"
      },
      "committer": {
        "name": "Sean McCullough",
        "email": "banksean@gmail.com",
        "time": "Fri Apr 18 10:57:48 2025 -0700"
      },
      "message": "dockerimg: make sure webui build exists before copying it\n"
    },
    {
      "commit": "8a617cb963b73d6dd38b44289720b1808278f9b7",
      "tree": "7d1a040d452c4e7aad460758a9b60d53d71a69f6",
      "parents": [
        "8bff16a56b85ae53977350984c3376b8a2eff989"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:28:43 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:28:44 2025 -0700"
      },
      "message": "dockerimg: reuse a cached gopath for cross compiling\n\nAlso build using sources in the currently checked out sketch.dev go\nmodule if sketch is invoked inside one.\nThis is useful when develping sketch.\n"
    },
    {
      "commit": "8bff16a56b85ae53977350984c3376b8a2eff989",
      "tree": "5b7e94021dda0c9adc7b585ea5b150f823fc9d0a",
      "parents": [
        "be10fa9661f7382453dd1bf9b63eb3615c48e2e7"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:16:49 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:17:59 2025 -0700"
      },
      "message": "webui, dockerimg: store the webui assets in a zip and cp them into the container\n"
    },
    {
      "commit": "be10fa9661f7382453dd1bf9b63eb3615c48e2e7",
      "tree": "d147e67682c51b2b66d562bf4271edb513064609",
      "parents": [
        "b9eaef5da7b64da01637bb4fe60bea43bba75ede"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:16:00 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Fri Apr 18 01:17:59 2025 -0700"
      },
      "message": "dockerimg: mkdir .cache in the base template and rebuild when the template changes\n"
    },
    {
      "commit": "b9eaef5da7b64da01637bb4fe60bea43bba75ede",
      "tree": "3a6cea0c5dc448c3a817bfe262166e8fd242f401",
      "parents": [
        "993a3fcbad8df15e5a735798d260316350ce151f"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 15:23:18 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 15:23:19 2025 -0700"
      },
      "message": "dockerimg: set GOTOOLCHAIN\u003dauto for cross compiling\n\nWithout this, if a user sets GOTOOLCHAIN\u003dlocal in their host env the\nbuild will fail.\n"
    },
    {
      "commit": "993a3fcbad8df15e5a735798d260316350ce151f",
      "tree": "0de32b37978c0cffc9f5a0fdb14173b2838a3f42",
      "parents": [
        "69c67317a8730d2573689b56a98949a5e4e956c9"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 13:51:45 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 13:51:45 2025 -0700"
      },
      "message": "dokerimg: clean up temp dir\n"
    },
    {
      "commit": "69c67317a8730d2573689b56a98949a5e4e956c9",
      "tree": "79c2e12800fc7bb513d038ed6b5926d522aea96b",
      "parents": [
        "2e463fb649fcff14d4025ddb91f630a98e7da526"
      ],
      "author": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 13:42:00 2025 -0700"
      },
      "committer": {
        "name": "David Crawshaw",
        "email": "david@zentus.com",
        "time": "Thu Apr 17 13:42:00 2025 -0700"
      },
      "message": "dockerimg: fix cross compile command\n"
    },
    {
      "commit": "2e463fb649fcff14d4025ddb91f630a98e7da526",
      "tree": "0e86854d80d2759a913870655f13226c31f9d30c",
      "parents": [],
      "author": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:22:22 2025 -0700"
      },
      "committer": {
        "name": "Earl Lee",
        "email": "earl.lee@sketch.dev",
        "time": "Thu Apr 17 11:35:33 2025 -0700"
      },
      "message": "Initial commit\n"
    }
  ]
}
