)]}'
{
  "log": [
    {
      "commit": "842db3f5be99c6b700072911c49c7c03f48daca6",
      "tree": "f914b4c4377fe6658fb1a5c944bd848fc3e58745",
      "parents": [
        "8fad76ab737dff9fc24d17b3b88ae491ed9af8b7"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri May 30 11:57:20 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Fri May 30 13:02:42 2025 +0400"
      },
      "message": "AppManager: Fix derived value calculation\n\nChange-Id: I97c429437b5df4ea782883190f420f9f60111ff4\n"
    },
    {
      "commit": "6481c9095aef7c7d2a0554b1d1af8a55171a89c3",
      "tree": "c82ca1b5f49c7a3247a8f0abb45092f763506673",
      "parents": [
        "b45b1866d422a31135a5d9af73ebc79381d0a0cb"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue May 20 16:16:30 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue May 20 21:55:58 2025 +0400"
      },
      "message": "DodoApp: Introduce password role\n\nAuto generate passwords for PostgreSQL and MongoDB.\n\nChange-Id: Ibd9fb900ddc8dd505c60ae4dfba73f1c951e3470\n"
    },
    {
      "commit": "838bcb82ed8d7358aa35a7fb26cb98c82ba4b6c8",
      "tree": "b69f3f31581fe08727376c5214fb5720ba3f52fc",
      "parents": [
        "451d40de49ab60f492e797d835934541f6fcba86"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu May 15 19:39:04 2025 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu May 15 19:39:04 2025 +0400"
      },
      "message": "AppManager: Handle new port forwards during app update\n\nChange-Id: I72a4c5b7ec4bd5ba6ddd32cd3f33dce023d7d9ea\n"
    },
    {
      "commit": "fc441e3383e3c6cf323c4646d2ca7eabff73ac03",
      "tree": "913b6683a6e3e6bde590d5ce75669a9c33479a3f",
      "parents": [
        "5f2f100451baee800b04a0871f6c268ed0dc7daa"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Nov 11 16:26:14 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed Apr 02 15:26:40 2025 +0400"
      },
      "message": "AppManager: Add API endpoint to install dodo app\n\nRefactors cue definitions.\n\nNext steps:\n* Needs some cleanup, namespace is hard coded ...\n* Maybe merge with regular install API\n* Support exposing ports across clusters\n\nChange-Id: Ibfc3c3f742b61f2c5874012fe6c77b958eae81d9\n"
    },
    {
      "commit": "8f2903253c51454d613c948eb10d2dbc8b55daa3",
      "tree": "f8aa032050c2e53e841151e2c5281a12989bfe6d",
      "parents": [
        "f15b9dae8da59ea970cebe865673c0b74fb05d14"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sat Sep 21 15:37:45 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sat Sep 21 17:58:03 2024 +0400"
      },
      "message": "Clusters: Support persistent storage on remote clusters.\n\nWith this merged users can request persistent volumes and PostgreSQL\ninstances on remote clusters.\n\nThis is achieved by Cluster manager installing open-iscsi on all\nremote servers and running longhorn on top of them.\n\nChange-Id: Ic1b24ede12fa32bb99f38e560207230437b45fd6\n"
    },
    {
      "commit": "f15b9dae8da59ea970cebe865673c0b74fb05d14",
      "tree": "f6ae28d7c46bd6c833ada7c436f4dacab0628876",
      "parents": [
        "f6ad298e24e22c1fadb203d85f8b8dd6cb118e25"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Sep 19 06:59:16 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sat Sep 21 11:45:45 2024 +0400"
      },
      "message": "DodoApp: Support remote clusters\n\nChange-Id: I6f4e6a0a32cc723b47c96518d83b1ffdb5169f14\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": "29f6b872c0a6b438198e0fbd3d9fc22150d378e1",
      "tree": "1de826a26d8c6c3be5e6aff48b273ae49a3c024e",
      "parents": [
        "cfb228ce21f864457a72d1fe238a336359db8a65"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Sep 08 16:14:58 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Sep 09 18:03:10 2024 +0400"
      },
      "message": "VirtualMachine: Make VPN optional\n\nChange-Id: I22c8235a651969665fc50e6b2841d710ca137109\n"
    },
    {
      "commit": "7fbd4ad2920fa3ac2923bffb3f30c2bd2dd1a846",
      "tree": "14fb607a7a45e142ea90e58751c4b7825e2a7e59",
      "parents": [
        "dd32bbcf11ff3be729efe7bcc9902761858e2b00"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue Aug 27 10:06:39 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Wed Sep 04 13:50:35 2024 +0400"
      },
      "message": "DodoApp: Support dev virtual machines\n\nChange-Id: Ib7641adb5be477bdde7cd9a06df4b45aa65a1c01\n"
    },
    {
      "commit": "36b23b3c95ddb458a3e30b147c694eeba78139cc",
      "tree": "07d0634412ebb55fa4f899b63d1b991753357b96",
      "parents": [
        "b36178fae43c466c648a928c94047605e9357808"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Sun Aug 25 12:20:54 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue Aug 27 08:46:39 2024 +0400"
      },
      "message": "VirtualMachine: Implement virtual machines using KubeVirt\n\nAuto adds new VM into given user\u0027s Tailscale network\n\nChange-Id: I16847a0b9eacc17b0e794d3b4913eb1d80a93f0a\n"
    },
    {
      "commit": "4ece99cc103001305d5e69fc83784e44629f5917",
      "tree": "64325b003697d47d4b1cafc9c95d7107a530279c",
      "parents": [
        "11617ac140a250505e177fa0e375fdcd411efe08"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jul 18 11:05:50 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jul 18 14:10:19 2024 +0000"
      },
      "message": "Installer: Implement multi network selector\n\nChange-Id: I52227a0f0e964ac48cb378ead077fad941c3315c\n"
    },
    {
      "commit": "cdfa372736902dadab00148e11a0d0e3ef2e25b2",
      "tree": "c16e3da042c9a603680fada36b61094f74f81a1a",
      "parents": [
        "bd7ab0be99524208ed4cf49b9af49dc174e5ae61"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jun 13 20:10:14 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Jun 17 13:25:38 2024 +0400"
      },
      "message": "Installer: deallocate ports upon app uninstall\n\nChange-Id: I19298537fed02de03a9e74fa351cf23f733de699\n"
    },
    {
      "commit": "efa0ed4866fc7b67652a52c1c29142542be55049",
      "tree": "1fea1aa9928dc0ef30abc31f1c7eadca43da2ead",
      "parents": [
        "f9f0beec8492e05a459bd7080ad095b4cf9292bc"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jun 13 12:31:43 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Thu Jun 13 18:59:36 2024 +0400"
      },
      "message": "Installer: dynamically generate open port requests\n\nApp config can mark any of the input (int) fields as having a role.\nFor such fields installer first will make port reservation request to\nPort Allocator, which will dynamically allocate and reserve one of the\navailable ports for the application. Once application is committed to\nconfig repository, installer makes another request to port allocator\nto actually open dynamically reserved port in the ingress service.\n\nAdded port reservation logic to Port Allocator. Reservation lasts 30\nminutes.\n\nChange-Id: Ic8caa0d04459b1a6e8a351e2ca6964ac15c7253d\n"
    },
    {
      "commit": "44f621bf542469bae8b1888765a0e5e95b4b4459",
      "tree": "e8bae41e2b6b7b8b9d18b2255cc20a85db61c5c0",
      "parents": [
        "e72b54f819a38afc6656b99010370d6f3d51c38e"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Apr 29 09:44:38 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue Apr 30 16:19:37 2024 +0400"
      },
      "message": "AppManager: clean up UI\n\nChange-Id: I8119ea81c80ff6165f4217dfdf9837e776703fc0\n"
    },
    {
      "commit": "e72b54f819a38afc6656b99010370d6f3d51c38e",
      "tree": "3da4dec10618aca7403f423005ba31ed8c3fae04",
      "parents": [
        "56f86a481e4ac0be5548c8337ea85c1af0561462"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Mon Apr 22 10:44:41 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v1.dodo.cloud",
        "time": "Tue Apr 30 16:15:43 2024 +0400"
      },
      "message": "DNS: run separate CoreDNS instance for each PCloud env.\n\nPreviously shared CoreDNS instance was used to handle all domains. This has multiple downsides, most important which is security. For example DNS-Sec keys of all domains were persisted on the same shared volume. Also key itself was generated by PCloud env-manager as part of bootstrapping new env. Which is counter to the main aspirations of PCloud, that environment internal private data must not leak outside of the environment.\n\nWith new approach implemented in this change, environment starts up it’s own CoreDNS and DNS record manager servers. Manager generates dns-sec keys internally and only exposes public information to the outside world. PCloud infrastructure runes another instance of CoreDNS which acts as a proxy service forwarding requests to individual environments based an requested domain.\n\nThis simplifies DNS based TLS challenge solvers, as private certificate issuer of each env will point directly to the DNS record manager of the same environment.\n\nChange-Id: Ifb0f36d2a133e3b53da22030cc7d6b9099136b3d\n"
    },
    {
      "commit": "ef01fbb46843e198939f9d844110f7fb6c250015",
      "tree": "76fb9adcf6d2526876cf7d1690e952e3e4184a73",
      "parents": [
        "5c44e6c105a0bb441a0494560dc6adebea623114"
      ],
      "author": {
        "name": "gio",
        "email": "gio@v0.dodo.cloud",
        "time": "Fri Apr 12 16:52:59 2024 +0400"
      },
      "committer": {
        "name": "gio",
        "email": "gio@v0.dodo.cloud",
        "time": "Mon Apr 15 17:27:27 2024 +0400"
      },
      "message": "app: remove JSON based schema, and each App returns single namespace\n\nChange-Id: I2ced82edd1251edc592f7ae0156d5ea3c81865c2\n"
    },
    {
      "commit": "b59b7c21e16cdbc0989787c075f1055a295e8235",
      "tree": "1a5553a752dfece34e5fc2f9f3fe6701bef08e73",
      "parents": [
        "c0d2bf569807c5551c98ecc08f4602c17af73ae2"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Wed Apr 03 22:17:50 2024 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Mon Apr 08 20:28:51 2024 +0400"
      },
      "message": "port-allocator: allocates ports on preconfigured ingress-nginx\n\nReplacement of /core/installer/tcp-udp-transport\n\nChange-Id: I3d116b0f4508b462398f69e980ad55771dc88b7c\n"
    },
    {
      "commit": "b6a5806f163b36847c41619339693b2f46e75847",
      "tree": "82c03e2359c3c88f69567213aebd77e86a52fa9e",
      "parents": [
        "ee15ee2ff85bd1ac46d9c199f18ce25dd2086b2e"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Tue Apr 02 16:49:19 2024 +0400"
      },
      "committer": {
        "name": "\u0027gio",
        "email": "\u0027gio@v0.dodo.cloud\u0027",
        "time": "Wed Apr 03 05:56:55 2024 +0000"
      },
      "message": "gerrit: auto configure ssh keys\n\nChange-Id: I9c3091e4bb998fa6c846c3c60c2801c7daa45bcf\n"
    },
    {
      "commit": "a09fad74443c2313bfc97f61f7b2a83c82423aef",
      "tree": "af5f1db30a2ab4d18180b3e97d52926cc5dac51e",
      "parents": [
        "618e243b36c6518a97e1d3a8ce9a6d69a5eaffad"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "giolekva@gmail.com",
        "time": "Thu Mar 21 15:24:35 2024 +0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 21 15:24:35 2024 +0400"
      },
      "message": "auth-proxy: verify group membership (#105)\n\n* auth-proxy: verify group membership\r\n\r\n* memberships: install memberships app and use it in few apps\r\n\r\n* app-repo: render auth\r\n\r\n* installer: always use external dependencies option in app configs\r\n\r\n* installer: fix auth handling\r\n\r\n* auth-proxy: configure membership-addr and groups flags in helm chart\r\n\r\n* installer: fix indentation\r\n\r\n* app-manager: fix how auth block is rendered\r\n\r\n---------\r\n\r\nCo-authored-by: Giorgi Lekveishvili \u003clekva@gl-mbp-m1-max.local\u003e"
    },
    {
      "commit": "e009a5dd3fbd34d4586d2f2f9d08347b0f31ad6b",
      "tree": "9d7550cc19de32cc82e05a631c6da62b8bfc7979",
      "parents": [
        "b00a1db3769c05f06d10aca90acec784b9e4c2ee"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jan 05 14:10:11 2024 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Wed Jan 17 12:39:32 2024 +0400"
      },
      "message": "installer: migrate apps to cuelang\n"
    },
    {
      "commit": "9b52ab9df80ef838278c7de02aed292483aa2775",
      "tree": "df58256943e8aa12edf41a38b8af2f7aa5bd3ff4",
      "parents": [
        "3f697b1b5f446a39cb5f45368cd1df06cca946a4"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jan 05 13:12:48 2024 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Fri Jan 05 13:30:55 2024 +0400"
      },
      "message": "appmanager: use cue config when available, migrate rpuppy to cue\n"
    },
    {
      "commit": "7c427602668a33eaec70a1a678a5884a555c284b",
      "tree": "07ce64790f298e73a2699ca60ff70020877ef959",
      "parents": [
        "d76414ebcf4a079b003f1edd67edbee330408c94"
      ],
      "author": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jan 04 00:13:55 2024 +0400"
      },
      "committer": {
        "name": "Giorgi Lekveishvili",
        "email": "lekva@gl-mbp-m1-max.local",
        "time": "Thu Jan 04 00:13:55 2024 +0400"
      },
      "message": "appmanager: refactor schema into interface, introduce cuelang\n"
    }
  ]
}
