)]}'
{
  "log": [
    {
      "commit": "6439d448800083c5726f86240621cf2b2120e650",
      "tree": "5177fa551b6e7c25487ef31cef2a7ee500734a3b",
      "parents": [
        "59d7a823fcc0a5c52ef2f1de16754254a974689f"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Aug 03 06:18:15 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Aug 03 06:19:59 2025 +0400"
      },
      "message": "Headscale: Include last seen in node info\n\nAdd debugging API endpoint to run arbitrary headscale command.\n\nChange-Id: I713d55b44d9657971c0ecb8befc8a1408e4b76af\n"
    },
    {
      "commit": "43e0aadc734358431b604c4ebf62269ef266c415",
      "tree": "f2a3219bbf171789c68f454acd07ad8b2040961a",
      "parents": [
        "e10ba16719d9b55295e9b950cfd647b536e3b735"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Aug 01 16:17:27 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sat Aug 02 08:46:26 2025 +0000"
      },
      "message": "Canvas: Add VM/PROXY dev modes support\n\n- Update ServiceSchema to discriminate between VM and PROXY dev modes\n- Add DevDisabled, DevVM, DevProxy TypeScript types\n- Update ServiceData type in graph.ts for new dev structure\n- Update generateDodoConfig to handle both VM and PROXY modes\n- Update configToGraph to properly convert dev configurations\n- Maintain backward compatibility with existing dev configurations\n- Update UI and introduce two new DevVM and DevProxy components\n- Fetch user machine list from headscale API\n\nChange-Id: I8f9df4ab9bd34c049fffadb748115335e8260a54\n"
    },
    {
      "commit": "e10ba16719d9b55295e9b950cfd647b536e3b735",
      "tree": "6e45d4d55a1ba0105bd23fe153e2097b285f0687",
      "parents": [
        "2835615e4cd72a46289f2e14c9afb0ccc43e0ceb"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jul 31 19:52:29 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Aug 01 14:50:16 2025 +0400"
      },
      "message": "DodoApp: Implement dev proxy mode\n\nWith dev proxy user can substitute any service with their own local\nmachine. In which case dodo will run proxy server on the platform\nwhich will forward all requests to the configured address.\n\nWhen VPN is enabled, dodo will run tailscale sidecar in the proxy pod.\n\nChange-Id: I12592ae77d2e88e0582c8fe1e0f82e5fd24e02cb\n"
    },
    {
      "commit": "f55ab36eb75967020b08fa078dfad313cd2ee449",
      "tree": "0608dac568a5a637ef34b917d3bc3204814b2966",
      "parents": [
        "cbd8909ed7d8f3bdb17abd679173c137ec62169b"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Apr 11 17:48:17 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed Apr 16 16:57:09 2025 +0400"
      },
      "message": "Ingress: Improve port opening\n\nUpdate nginx replica counts and rollout strategy.\nWhat proxy-backend configmap changes and reload auto proxy nginx.\nMake ingress optional.\nUse \u003cPREFIX\u003e.\u003cCLUSTER_NAME\u003e.clusters.p.\u003cDOMAIN\u003e addresses for remote\ncluster services.\n\nChange-Id: Ideb146a8c0275822ee5cd28311c00a817f4202aa\n"
    },
    {
      "commit": "2446de060590098b8e00a49d758553a7433d065b",
      "tree": "91d6d16adc3c92ad49e5c0fa99fe62f4c63552ba",
      "parents": [
        "d78896a1f93805c7f699d2f0cfaae68e6abeb6c0"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Apr 11 11:20:39 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Apr 11 12:58:40 2025 +0400"
      },
      "message": "Build: Fix multi-arch docker builds\n\nChange-Id: I3968065215b696256ee819e2062ab1d3cadfcbcf\n"
    },
    {
      "commit": "3cabc3ea44f3c25bcca5ca9db7736f5272af6c58",
      "tree": "a6d092094db6604dfbd00efa3a1fcab1cc6af151",
      "parents": [
        "2f9ed20ed2886164383f6c71e60c6e2bd784d97c"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Oct 06 18:37:27 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Oct 06 21:38:46 2024 +0400"
      },
      "message": "PrivateNetwork: Configure cluster proxy backend\n\nChange-Id: Ieeca2da6bd69ee3a440960ff3d4cdb9371f3a8c6\n"
    },
    {
      "commit": "92116ca60f8400722a07b952bfcc259a7852f468",
      "tree": "f44889e49c0dd0f4ca2afd0812477b3bbf78fbf7",
      "parents": [
        "362fd8e2ec90531e3cf8e31ab5509f178482721e"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Oct 06 13:55:46 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Oct 06 13:55:46 2024 +0400"
      },
      "message": "Installer: Handle VM uninstall before it has had a time to boot\n\nChange-Id: I615bc949b5054b301899b1e0b7eae94a98126e61\n"
    },
    {
      "commit": "f6ad298e24e22c1fadb203d85f8b8dd6cb118e25",
      "tree": "ec764428f186cf879085d6956b20d315434408aa",
      "parents": [
        "4a3e54c86c05e4881105f7aced6f039a383ed5a1"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Aug 23 17:42:49 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Sep 20 14:19:48 2024 +0000"
      },
      "message": "ClusterManager: Implements support of remote clusters.\n\nAfter this change users will be able to:\n* Create cluster and add/remove servers to it\n* Install apps on remote cluster\n* Move already installed apps between clusters\n* Apps running on server being removed will auto-migrate\n  to another server from that same cluster\n\nThis is achieved by:\n* Installing and running minimal version of dodo on remote cluster\n* Ingress-nginx is installed automatically on new clusters\n* Next to nginx we run VPN client in the same pod, so that\n  default cluster can establish secure communication with it\n* Multiple reverse proxies are configured to get to the\n  remote cluster service from ingress installed on default cluster.\n\nNext steps:\n* Support remote clusters in dodo apps (prototype ready)\n* Clean up old cluster when moving app to the new one. Currently\n  old cluster keeps running app pods even though no ingress can\n  reach it anymore.\n\nChange-Id: Iffc908c93416d4126a8e1c2832eae7b659cb8044\n"
    },
    {
      "commit": "864b433c85eeb46dfcba5bcab2dc88bc5d467570",
      "tree": "db43e80cfbaf8ba5e1e03108ad36259bff5d7f12",
      "parents": [
        "7fbd4ad2920fa3ac2923bffb3f30c2bd2dd1a846"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Sep 05 13:56:47 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Sep 05 13:56:47 2024 +0400"
      },
      "message": "AppManager: Clean up VPN node and auth keys upon app removal\n\nChange-Id: Ie76278556247d16806ba81286621adca973e3f6e\n"
    },
    {
      "commit": "b36178fae43c466c648a928c94047605e9357808",
      "tree": "6fc5284c708a783e2d7799e1191203dcc4f1f44e",
      "parents": [
        "c76baedf55dd3e0d36ef0fd7a476601120bd57d7"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri Aug 23 18:59:15 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Aug 26 15:40:54 2024 +0000"
      },
      "message": "Headscale: Sync users and update ACLs\n\nChange-Id: Ie3488f6296567f5e2301476912d79de845299708\n"
    },
    {
      "commit": "6ec78549d803828a27b62878dfc40567913db195",
      "tree": "523d7acf7492ce5d41bb8ff65ea74f5a419dddcc",
      "parents": [
        "00077272977bee6d24c1dcedeebc19ebde23b6af"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed Jun 12 11:21:18 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed Jun 12 11:21:18 2024 +0400"
      },
      "message": "HeadscaleAPI: replace Echo server with Gorilla Mux\n\nChange-Id: Ie1109cb0a981844c91dd0948592dccf0090c1961\n"
    },
    {
      "commit": "c23530e378a525feddf0075a41889c151fae5f62",
      "tree": "05ac367df0b90d499db3e116e1734ab5f9b3fc6e",
      "parents": [
        "d809aa7ba6de31ba0df35c89ed0d9ffd992705e2"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed May 01 11:06:09 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed May 01 11:06:09 2024 +0400"
      },
      "message": "Launcher: Render help document contents using Markdown\n\nChange-Id: I580c56bff201cd508efd52ba75eed28a8869f9b1\n"
    },
    {
      "commit": "0c6b324af80de6ccca61675e2fbfff304f26767b",
      "tree": "f9680131f783932af086629c0816bd045ff2ec18",
      "parents": [
        "024757cc787b7d33ff039d42599810a64b7dc365"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "giolekva@gmail.com",
        "time": "Thu Mar 14 15:31:08 2024 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 14 15:31:08 2024 +0400"
      },
      "message": "oauth2-client: migrate apps to use oauth2-client helm chart (#90)\n\n* headscale: use oauth2-client helm chart\r\n\r\n* pihole: use oauth2-client helm chart\r\n\r\n* matrix: use oauth2-client helm chart\r\n\r\n* oauth2: pass issuer address to pihole, headscale and matrix apps\r\n\r\n* pihole: fix secret name\r\n\r\n* matrix: fix version to v1.98.0\r\n\r\n* headscale: make oauth2-client depend on auth release\r\n\r\n---------\r\n\r\nCo-authored-by: Giorgi Lekveishvili \u003clekva@gl-mbp-m1-max.local\u003e"
    },
    {
      "commit": "9d5e3f5931af72a503654a24bea1950f5f108fbc",
      "tree": "99cda7daebd9bc84b8d0aa8717ad8fb0761cd729",
      "parents": [
        "0993581136984e5f80177987b08fa11bd4ef1541"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "giolekva@gmail.com",
        "time": "Wed Mar 13 15:02:50 2024 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 13 15:02:50 2024 +0400"
      },
      "message": "env-manager: dynamically generate cidr for new env (#85)\n\n* env-manager: allocate env cidrs dynamically\r\n\r\n* fix: net.IP to netip.Addr conversion\r\n\r\n* bootstrapper: generate empty env-cidrs.yaml\r\n\r\n* fix: net.IP to netip.Addr conversion for IP pool\r\n\r\n* infra: expose provided startIP subnet via tailscale proxy\r\n\r\n* headscale: pass private network ip subnet to expose to api service\r\n\r\n* dns: make ingress IP configurable\r\n\r\n---------\r\n\r\nCo-authored-by: Giorgi Lekveishvili \u003clekva@gl-mbp-m1-max.local\u003e"
    },
    {
      "commit": "2dbce6c29b843b13f2f3b9201cc7f452d44f3312",
      "tree": "61bd166d6c4c0c71af9ff499d07cac05d493a691",
      "parents": [
        "39913697ac3878fcbec0a110b424cc2d9a5d458f"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Tue Dec 05 15:16:27 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Tue Dec 05 19:13:09 2023 +0400"
      },
      "message": "installer: combine private ingress and proxy into private-network\n"
    },
    {
      "commit": "39913697ac3878fcbec0a110b424cc2d9a5d458f",
      "tree": "bbff7059f862bb99c9916a7bbbd8cf1e3b219d45",
      "parents": [
        "6ae65d1402c77dc29905296d293fcee0ddc72d71"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Tue Dec 05 08:58:08 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Tue Dec 05 09:18:13 2023 +0400"
      },
      "message": "installer: create headscale user resource\n"
    },
    {
      "commit": "6ae65d1402c77dc29905296d293fcee0ddc72d71",
      "tree": "4ff02a2d0adc02f8105ea0a816fc4d479e748321",
      "parents": [
        "123a3675b35f1b7c6f7249f3d63a7e65a1909fe1"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Mon Dec 04 15:37:53 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Mon Dec 04 16:49:17 2023 +0400"
      },
      "message": "env: create tailscale-proxy for ingress-private IP with new env\n"
    },
    {
      "commit": "a1e7790c41fbccde0c4796c2606cf7b1734fb950",
      "tree": "6dba18f5e5987fcd0295b42e7488c13196c5f42d",
      "parents": [
        "29c95caac0f7f792bc6d3b145c7d6b075ef6612c"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Mon Nov 06 14:48:27 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Mon Nov 06 14:48:27 2023 +0400"
      },
      "message": "installer: use soft-serve keygen lib\n"
    },
    {
      "commit": "2d843c340aa4b7e31651da43e135b530e7722872",
      "tree": "1939efade6d9724f84a243035e4ad97895c52aec",
      "parents": [
        "e47fa8c00570f431d01e61724a0319905992e956"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jul 20 10:10:24 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jul 20 10:10:24 2023 +0400"
      },
      "message": "core-controllers: multi-arch container images\n"
    },
    {
      "commit": "44f9d599f546f4aaf9d42dc1db74f4989ac29513",
      "tree": "700f2443efea27736be7debf9e261d5363d56818",
      "parents": [
        "5b35646641aa1f5e3bc7d98e4f7bf4d692e60ab8"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Wed Jun 21 14:58:19 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Wed Jun 21 14:58:19 2023 +0400"
      },
      "message": "headscale-controller: add headscaleAddress to the HeadscaleUser crd\n"
    },
    {
      "commit": "027ef4382ece1481f26d8757d41dd758a6865ec9",
      "tree": "87678362f83e972011d27cac0f8d491c794199de",
      "parents": [
        "7366dbb6cfe8570a5a7a9ce9dbd405efb11fa5fc"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jun 16 12:31:25 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jun 16 12:31:25 2023 +0400"
      },
      "message": "headscale client extract last line only\n"
    },
    {
      "commit": "7366dbb6cfe8570a5a7a9ce9dbd405efb11fa5fc",
      "tree": "88a8709d6c6a1bc922398a53d42a822ab54e2606",
      "parents": [
        "488ac3b13aec0a93fc571f99b86047b7d17a7bbe"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jun 16 12:31:03 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jun 16 12:31:03 2023 +0400"
      },
      "message": "headscale controller\n"
    },
    {
      "commit": "52814d93d9c7864fea539c36c642382018a6c40c",
      "tree": "49f3ecfe82ea9fef1f057b07caeb71ca23d039f9",
      "parents": [
        "37181d00bb970b10934caf4cfa6898a3f3d8295a"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jun 15 19:30:32 2023 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jun 15 19:30:32 2023 +0400"
      },
      "message": "core: headscale api\n"
    }
  ]
}
