)]}'
{
  "log": [
    {
      "commit": "a002a23a60dcc21353681a887a90cd12867e7f44",
      "tree": "e554f73faa6681dec2cbee396f30b03b972ab66b",
      "parents": [
        "5ab8fb8dc17299df5d134d7a95f33d41b170f102"
      ],
      "author": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 19:38:03 2025 +0000"
      },
      "committer": {
        "name": "Josh Bleecher Snyder",
        "email": "josharian@gmail.com",
        "time": "Wed Jul 09 14:37:14 2025 -0700"
      },
      "message": "webui: delete non-gzip\u0027d assets\n\nReduces webui assets from 83M to 16M.\nAlmost all browsers support gzip.\nFor those that don\u0027t, we provide on-the-fly decompression.\n\nCo-Authored-By: sketch \u003chello@sketch.dev\u003e\nChange-ID: sbc10790564044d6bk\n"
    },
    {
      "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": "176de79e7d3d6a894babccc5d8dc8bb9bf133828",
      "tree": "bec096858c74a6a51774ccff398a613c7944c2db",
      "parents": [
        "d9f1337ec3317a60df50d8ba4eefb448473d62fa"
      ],
      "author": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 12:25:18 2025 -0700"
      },
      "committer": {
        "name": "Philip Zeyliger",
        "email": "philip.zeyliger@gmail.com",
        "time": "Mon Apr 21 15:35:02 2025 -0700"
      },
      "message": "sketch: compress JS and CSS\n\nWe noticed that our JS bundles weren\u0027t compressed; let\u0027s compress them.\nSketch did most of the work here itself, but there\u0027s some nonsense\naround the fact that we pass a zip.Reader around, which can\u0027t seek.\nWe\u0027re probably doing more work than strictly necessary on the server side.\n\nAdd gzip compression for JS and source map files in esbuild\n\n- Added compression for .js and .js.map files in the esbuild Build() function\n- Gzipped files are created alongside the originals with .gz extension\n- This allows for compressed asset serving when supported by clients\n\nCo-Authored-By: sketch\n\nAdd support for serving pre-compressed JS and source map files\n\n- Created a custom HTTP handler for /static/ path\n- Handler checks if requested JS/JS.map files have gzipped versions\n- Serves gzipped files with proper Content-Encoding headers when available\n- Falls back to original files when compressed versions are not found\n- Client support for gzip encoding is verified through Accept-Encoding header\n\nCo-Authored-By: sketch\n\nExtend gzip compression to include CSS files\n\n- Added CSS files to the compression list alongside JS and source map files\n- Added debug output to show which files are being compressed\n- Updated error messages to reflect the inclusion of CSS files\n\nCo-Authored-By: sketch\n\nFix variable naming in Accept-Encoding header processing\n\n- Renamed \u0027header\u0027 variable to \u0027encoding\u0027 for better semantics when processing Accept-Encoding headers\n- Addresses gopls check issue in compressed file handler\n\nCo-Authored-By: sketch\n\nSimplify Accept-Encoding header processing\n\n- Simplified check for gzip support using strings.Contains()\n- More efficient approach than splitting and iterating\n- Addresses gopls efficiency recommendation\n\nCo-Authored-By: sketch\n\nExtract compressed file handler to separate package\n\n- Created a new package loop/server/gzhandler\n- Moved compressedFileHandler implementation to the new package\n- Renamed to Handler for better Go idioms\n- Updated loophttp.go to use the new package\n- Improved modularity and separation of concerns\n\nCo-Authored-By: sketch\n\nEnhance gzhandler and add test coverage\n\n- Updated gzhandler to handle all files except .gz files\n- Added comprehensive test suite for gzhandler\n- Removed debug print from esbuild.go\n- Tests different file types, browsers with and without gzip support\n- Tests directory handling\n\nCo-Authored-By: sketch\n\nFix \u0027seeker can\u0027t seek\u0027 error in gzhandler\n\n- Changed approach to read gzipped file into memory before serving\n- Avoids io.Seeker interface requirement for http.ServeContent\n- Fixes 500 error when serving compressed JavaScript files\n- Added missing io import\n\nCo-Authored-By: sketch\n"
    }
  ]
}
