Repository navigation
Releases: ladohq/lado
Release list
LADO 0.40.0
- Install with Docker: docs/install.md has a Docker section, from nothing to an agent that pushes over ssh, with compose first (
compose.yamlof the latest release,.env,docker compose up -d), the logins, update, going back, a second LADO, removal of only its own container and volume, and what to do when something goes wrong. README and docs/install.md now present two ways to install, Docker first and recommended, then PyPI, and say how to update each. Every GitHub release now carries itscompose.yaml, and each update downloads its version's (releases/download/v<version>/compose.yaml) beforedocker compose up -d. Coming from 0.39.0 needs the newcompose.yaml: under 0.39.0's the container has no git identity (LADO_GIT_NAME,LADO_GIT_EMAIL), no ssh agent (LADO_SSH_AGENT) and nosecrets/. - LADO's image knows GitHub's ssh host keys: an agent's first
git pushover ssh from a new home volume no longer fails withHost key verification failed. - In LADO's container the web UI's Clone from URL works with an ssh address (
git@github.com:...): the UI server now uses the host's ssh agent (LADO_SSH_AGENT) as the agents do. Before, the branch list failed withgithub.com refused this machine's ssh keywhilessh -T git@github.comworked. - In LADO's container, a session folder outside the projects folder (
LADO_REPOS), which your computer does not see, gets a warning in the New session window (under Where and Clone into) and atlado start; the session still starts. Outside a container nothing changes. - The comment of a gate's answer shows once in the chat, under the run's move it made, no longer also under the closed gate. A closed gate is a folded card that says it opens (its flag, run and state, the answer's chip coloured by where the run went, by whom, a chevron); opened, it shows the question and the answer on your ground, and folds the note (6 lines, then Show more) and the supervisor's recommendation ("you agreed" or "you answered otherwise") into a line each. Your own moves in a run's group stand on your ground, as your messages do. lado.db goes to schema 30.
- Renaming a session in the UI takes its name on Tab: while the title field is empty, or holds a start of the name, the rest of the name shows grey, and Tab (or → at the end) makes the name the field's text with the caret at its end, to type on and save with Enter. The hint under the field says so; with any other text Tab leaves the field and saves it, as before.
- LADO's container takes its sessions with it:
docker compose downorstop,docker stop, or Docker's own end stops every running session aslado stopwould (docker logs:lado: the container stops: stopped sessions "app"; they resume at its start), and the container's next start, after a new image's migration too, resumes them, as it does the sessions of a container that was killed (lado: resumed session "app" at the container's start). Sessions stopped by hand stay stopped; a session that cannot be resumed stays stopped with the reason indocker logsand is not tried again. Each resumed supervisor takes one model turn at the start and starts the workers its open flow runs need. Outside a container nothing changes. - Agents get variables from a folder of files: with
LADO_ENV_DIRset to an absolute path, each file directly in it is a variable (its name the file's, its value the content), laid over the login shell's environment at every agent's start, so a new file reaches the next agent and a kit's MCP server that needs it starts. A file LADO cannot use (a reserved name such asPATHorLADO_*, not a variable name, over 64 KiB, not text) is named inlado start's warnings and bylado doctor(Variables from outside, names only), never applied. WithoutLADO_ENV_DIR, or with no folder or the null device at its path, nothing changes and nothing is said. - LADO's container gives the agents real access: variables from an optional
secrets/next to compose.yaml, mounted read-only at/run/secrets(GH_TOKEN,CLAUDE_CODE_OAUTH_TOKEN, a kit's key), never indocker inspect; git's identity fromLADO_GIT_NAMEandLADO_GIT_EMAILin.env; git over https to github.com through gh (GH_TOKENorgh auth logininside); and the host's ssh agent throughLADO_SSH_AGENTwithout root's group. compose starts withoutsecrets/, and LADO says nothing about it (lado doctorsays how to give secrets);LADO_SECRETS=./secretsin.envandmkdir -m 700 secretsenable it, and compose then refuses to start while the folder is missing. The headers say how Claude Code, OpenCode and Kilo log in. - A tab of the web UI closed or reloaded the very moment its clone shows running now cancels the clone at once too; before, the server cancelled it only after 150 s.
- The fields of the web UI's waiting card where the human writes, an own answer, a skip's comment and a gate's comment for the next step, open 3 lines high and grow with the text up to 8 lines, then scroll inside, like the composer. They have no resize handle any more, which grew a field under the Send button and off the screen; while the human types, the field's lower edge stays in view.
- The web UI's waiting card no longer cuts the focus ring of a gate's comment field on its left side, nor the ring of an own answer or of a question the human came to from the feed: the ring shows whole on every side, and nothing in the card moves.
- The UI's Activity tab: the checkbox "Show agent messages" is now a small icon at the end of the team's row, "Messages between agents", whose tooltip says whether the messages agents write to each other are shown and what a click does; the agents' chips no longer wrap for it in a narrow column.
- One-line texts may hold no hidden characters: a session's title, an agent's message summary, question and choices,
note_summaryand artifact title or summary are refused when they hold a line or paragraph separator, a bidi control (U+202A–U+202E, U+2066–U+2069) or a zero-width character (U+200B, U+FEFF), as they were for control characters, and the error names it (a title is one line of visible text: U+202E RIGHT-TO-LEFT OVERRIDE is not allowed); an emoji joined by U+200D stays. The human's chat message, gate comment,lado flow-setreason and uploaded file name are cleaned of them for their one-line form, and the whole text stays in the body (alado flow-setnote now keeps the whole reason too). - Upgrade: schema 30, restart running sessions after the update (lado update does it).
- API: each closed gate in the UI server's gates keeps the run's event that closed it (
closed_by_event).
Update with lado update, or install it with uv tool install lado==0.40.0.
Docker: docker pull ghcr.io/ladohq/lado:0.40.0.
LADO 0.40.0rc1
- Install with Docker: docs/install.md has a Docker section, from nothing to an agent that pushes over ssh, with compose first (
compose.yamlof the latest release,.env,docker compose up -d), the logins, update, going back, a second LADO, removal of only its own container and volume, and what to do when something goes wrong. README and docs/install.md now present two ways to install, Docker first and recommended, then PyPI, and say how to update each. Every GitHub release now carries itscompose.yaml, and each update downloads its version's (releases/download/v<version>/compose.yaml) beforedocker compose up -d. Coming from 0.39.0 needs the newcompose.yaml: under 0.39.0's the container has no git identity (LADO_GIT_NAME,LADO_GIT_EMAIL), no ssh agent (LADO_SSH_AGENT) and nosecrets/. - LADO's image knows GitHub's ssh host keys: an agent's first
git pushover ssh from a new home volume no longer fails withHost key verification failed. - In LADO's container the web UI's Clone from URL works with an ssh address (
git@github.com:...): the UI server now uses the host's ssh agent (LADO_SSH_AGENT) as the agents do. Before, the branch list failed withgithub.com refused this machine's ssh keywhilessh -T git@github.comworked. - In LADO's container, a session folder outside the projects folder (
LADO_REPOS), which your computer does not see, gets a warning in the New session window (under Where and Clone into) and atlado start; the session still starts. Outside a container nothing changes. - The comment of a gate's answer shows once in the chat, under the run's move it made, no longer also under the closed gate. A closed gate is a folded card that says it opens (its flag, run and state, the answer's chip coloured by where the run went, by whom, a chevron); opened, it shows the question and the answer on your ground, and folds the note (6 lines, then Show more) and the supervisor's recommendation ("you agreed" or "you answered otherwise") into a line each. Your own moves in a run's group stand on your ground, as your messages do. lado.db goes to schema 30.
- Renaming a session in the UI takes its name on Tab: while the title field is empty, or holds a start of the name, the rest of the name shows grey, and Tab (or → at the end) makes the name the field's text with the caret at its end, to type on and save with Enter. The hint under the field says so; with any other text Tab leaves the field and saves it, as before.
- LADO's container takes its sessions with it:
docker compose downorstop,docker stop, or Docker's own end stops every running session aslado stopwould (docker logs:lado: the container stops: stopped sessions "app"; they resume at its start), and the container's next start, after a new image's migration too, resumes them, as it does the sessions of a container that was killed (lado: resumed session "app" at the container's start). Sessions stopped by hand stay stopped; a session that cannot be resumed stays stopped with the reason indocker logsand is not tried again. Each resumed supervisor takes one model turn at the start and starts the workers its open flow runs need. Outside a container nothing changes. - Agents get variables from a folder of files: with
LADO_ENV_DIRset to an absolute path, each file directly in it is a variable (its name the file's, its value the content), laid over the login shell's environment at every agent's start, so a new file reaches the next agent and a kit's MCP server that needs it starts. A file LADO cannot use (a reserved name such asPATHorLADO_*, not a variable name, over 64 KiB, not text) is named inlado start's warnings and bylado doctor(Variables from outside, names only), never applied. WithoutLADO_ENV_DIR, or with no folder or the null device at its path, nothing changes and nothing is said. - LADO's container gives the agents real access: variables from an optional
secrets/next to compose.yaml, mounted read-only at/run/secrets(GH_TOKEN,CLAUDE_CODE_OAUTH_TOKEN, a kit's key), never indocker inspect; git's identity fromLADO_GIT_NAMEandLADO_GIT_EMAILin.env; git over https to github.com through gh (GH_TOKENorgh auth logininside); and the host's ssh agent throughLADO_SSH_AGENTwithout root's group. compose starts withoutsecrets/, and LADO says nothing about it (lado doctorsays how to give secrets);LADO_SECRETS=./secretsin.envandmkdir -m 700 secretsenable it, and compose then refuses to start while the folder is missing. The headers say how Claude Code, OpenCode and Kilo log in. - A tab of the web UI closed or reloaded the very moment its clone shows running now cancels the clone at once too; before, the server cancelled it only after 150 s.
- The fields of the web UI's waiting card where the human writes, an own answer, a skip's comment and a gate's comment for the next step, open 3 lines high and grow with the text up to 8 lines, then scroll inside, like the composer. They have no resize handle any more, which grew a field under the Send button and off the screen; while the human types, the field's lower edge stays in view.
- The web UI's waiting card no longer cuts the focus ring of a gate's comment field on its left side, nor the ring of an own answer or of a question the human came to from the feed: the ring shows whole on every side, and nothing in the card moves.
- The UI's Activity tab: the checkbox "Show agent messages" is now a small icon at the end of the team's row, "Messages between agents", whose tooltip says whether the messages agents write to each other are shown and what a click does; the agents' chips no longer wrap for it in a narrow column.
- One-line texts may hold no hidden characters: a session's title, an agent's message summary, question and choices,
note_summaryand artifact title or summary are refused when they hold a line or paragraph separator, a bidi control (U+202A–U+202E, U+2066–U+2069) or a zero-width character (U+200B, U+FEFF), as they were for control characters, and the error names it (a title is one line of visible text: U+202E RIGHT-TO-LEFT OVERRIDE is not allowed); an emoji joined by U+200D stays. The human's chat message, gate comment,lado flow-setreason and uploaded file name are cleaned of them for their one-line form, and the whole text stays in the body (alado flow-setnote now keeps the whole reason too). - Upgrade: schema 30, restart running sessions after the update (lado update does it).
- API: each closed gate in the UI server's gates keeps the run's event that closed it (
closed_by_event).
This is a pre-release: a LADO on a final release is not offered it. Update to it with lado update 0.40.0rc1, or install it with uv tool install lado==0.40.0rc1.
Docker: docker pull ghcr.io/ladohq/lado:0.40.0rc1.
LADO 0.39.0
- Every release publishes LADO's Docker image,
docker pull ghcr.io/ladohq/lado:<version>(linux/amd64 and linux/arm64;latestis the newest final release, a release candidate only its own tag), tested on each architecture before anything is published. It carries all four agent CLIs at the versions LADO is tested with: Claude Code, Codex CLI (only installed: its login does not reach the agents yet), OpenCode and Kilo CLI. The GitHub release names the image. docker/compose.yamlrunsghcr.io/ladohq/lado:${LADO_VERSION}: setLADO_VERSION(in.envnext to the file), update by changing it anddocker compose up -d, go back by putting the version before back. The image before an update keeps its version's tag, so nothing is kept by hand, and a second LADO, a folder of its own with its own.env, updates without touching the first.- Before LADO upgrades
lado.dbto a newer schema, by any command and wherever it runs (a new Docker image on an old home volume, a LADO upgraded by hand), it copies it toLADO_HOME/backups/lado.db.schema-<N>and says so on stderr (in a container:docker logs). When the copy cannot be written, nothing is upgraded. A migration that fails is one message, without a traceback:lado.dbis unchanged, where its backup is, and how to go back (in a container: the image of the version you ran before on the same home volume).docker/compose.yaml's header gives the steps back after a migration that succeeded. - A session can have a title, shown in the UI over its name (the list, the head, the browser tab, Needs you and notifications), the name small beside it: set it with the pencil in the session's head, Rename… in the session list's ⋯, or
lado title <session> TEXT(--clearremoves it);lado lsshows it. The name stays the session's identifier: its address, branches and CLI name do not change. The list's search finds a session by either. lado.db goes to schema 28. - After an update from the UI, the System panel no longer says an update is running and keeps its Update… button: the page's wait ends once the update has released its lock.
- In a container (
LADO_CONTAINER, which LADO's Docker image sets),lado updateand the UI's update refuse at once, stopping nothing: a new image updates LADO there. When a newer LADO is out,lado ls,lado doctorand the System panel name its image (ghcr.io/ladohq/lado:<version>) and no command.lado doctor, the System panel (acontainermark beside the version) and the system info for an issue say that LADO runs in a container. - In a container the UI server no longer warns that it is open to other machines: it notes that how the container publishes its port decides who reaches it.
lado uithere prints only the link for the host's browser and opens none, and the system info for an issue says the server runs in a container.LADO_REPOSnames the folder of your repositories: the New session window suggests its subfolders in an empty Where, a clone by URL goes there by default (lado start <git-url>too), andlado doctorshows it. - The UI colours a flow step's outcome by the order its flow declares, in the chat as in the Flows tab: green forward, orange back, so a
readyafter a review'schangesno longer turns orange. A step back has a return icon, and hovering an outcome says where the step goes and, for a step back, which states run again. - LADO's Docker image is in the repository (
docker/): LADO from the build's wheel and the agent CLIs, started with onedocker run(ordocker/compose.yaml, whoseLADO_PORTsets the port inside and on the host alike).make dockerbuilds it from a checkout; CI builds and tests it on amd64 and arm64. Your projects folder is mounted at its own path (-v "$P:$P" -e LADO_REPOS="$P"; compose does it forLADO_PROJECTS), so a worker's worktree made in the container works on the host too, and on Linux the container's user takes the folder owner's uid, so the files the agents write are yours.docker logswarns when that folder is not mounted or not writable. lado doctorwarns when LADO may not write in its repositories folder (LADO_REPOS).- Selecting text in the UI shows a small bar to copy it or quote it into the composer; a quote from an artifact names it and its lines. Code blocks and messages have a copy button that shows on hover.
- UI: in a session's chat the waiting card can be minimized to one line, so the chat has the room while you talk a gate over with the supervisor; it comes back by itself when something new waits. Its top edge can be dragged to give it another height. Both are remembered in the browser.
- Upgrade: schema 28, restart running sessions after the update (lado update does it).
- API:
PUT /api/sessions/{name}/title(TitleChange),SessionInfo.title,Limits.max_title. - API:
GET /api/repos-folder(ReposFolder). - API:
UpdateInfo.container; in a containerPOST /api/updateis refused with 409 andUpdateInfo.by_handis empty.
Update with lado update, or install it with uv tool install lado==0.39.0.
Docker: docker pull ghcr.io/ladohq/lado:0.39.0.
LADO 0.39.0rc1
- Every release publishes LADO's Docker image,
docker pull ghcr.io/ladohq/lado:<version>(linux/amd64 and linux/arm64;latestis the newest final release, a release candidate only its own tag), tested on each architecture before anything is published. It carries all four agent CLIs at the versions LADO is tested with: Claude Code, Codex CLI (only installed: its login does not reach the agents yet), OpenCode and Kilo CLI. The GitHub release names the image. docker/compose.yamlrunsghcr.io/ladohq/lado:${LADO_VERSION}: setLADO_VERSION(in.envnext to the file), update by changing it anddocker compose up -d, go back by putting the version before back. The image before an update keeps its version's tag, so nothing is kept by hand, and a second LADO, a folder of its own with its own.env, updates without touching the first.- Before LADO upgrades
lado.dbto a newer schema, by any command and wherever it runs (a new Docker image on an old home volume, a LADO upgraded by hand), it copies it toLADO_HOME/backups/lado.db.schema-<N>and says so on stderr (in a container:docker logs). When the copy cannot be written, nothing is upgraded. A migration that fails is one message, without a traceback:lado.dbis unchanged, where its backup is, and how to go back (in a container: the image of the version you ran before on the same home volume).docker/compose.yaml's header gives the steps back after a migration that succeeded. - A session can have a title, shown in the UI over its name (the list, the head, the browser tab, Needs you and notifications), the name small beside it: set it with the pencil in the session's head, Rename… in the session list's ⋯, or
lado title <session> TEXT(--clearremoves it);lado lsshows it. The name stays the session's identifier: its address, branches and CLI name do not change. The list's search finds a session by either. lado.db goes to schema 28. - After an update from the UI, the System panel no longer says an update is running and keeps its Update… button: the page's wait ends once the update has released its lock.
- In a container (
LADO_CONTAINER, which LADO's Docker image sets),lado updateand the UI's update refuse at once, stopping nothing: a new image updates LADO there. When a newer LADO is out,lado ls,lado doctorand the System panel name its image (ghcr.io/ladohq/lado:<version>) and no command.lado doctor, the System panel (acontainermark beside the version) and the system info for an issue say that LADO runs in a container. - In a container the UI server no longer warns that it is open to other machines: it notes that how the container publishes its port decides who reaches it.
lado uithere prints only the link for the host's browser and opens none, and the system info for an issue says the server runs in a container.LADO_REPOSnames the folder of your repositories: the New session window suggests its subfolders in an empty Where, a clone by URL goes there by default (lado start <git-url>too), andlado doctorshows it. - The UI colours a flow step's outcome by the order its flow declares, in the chat as in the Flows tab: green forward, orange back, so a
readyafter a review'schangesno longer turns orange. A step back has a return icon, and hovering an outcome says where the step goes and, for a step back, which states run again. - LADO's Docker image is in the repository (
docker/): LADO from the build's wheel and the agent CLIs, started with onedocker run(ordocker/compose.yaml, whoseLADO_PORTsets the port inside and on the host alike).make dockerbuilds it from a checkout; CI builds and tests it on amd64 and arm64. Your projects folder is mounted at its own path (-v "$P:$P" -e LADO_REPOS="$P"; compose does it forLADO_PROJECTS), so a worker's worktree made in the container works on the host too, and on Linux the container's user takes the folder owner's uid, so the files the agents write are yours.docker logswarns when that folder is not mounted or not writable. lado doctorwarns when LADO may not write in its repositories folder (LADO_REPOS).- Selecting text in the UI shows a small bar to copy it or quote it into the composer; a quote from an artifact names it and its lines. Code blocks and messages have a copy button that shows on hover.
- UI: in a session's chat the waiting card can be minimized to one line, so the chat has the room while you talk a gate over with the supervisor; it comes back by itself when something new waits. Its top edge can be dragged to give it another height. Both are remembered in the browser.
- Upgrade: schema 28, restart running sessions after the update (lado update does it).
- API:
PUT /api/sessions/{name}/title(TitleChange),SessionInfo.title,Limits.max_title. - API:
GET /api/repos-folder(ReposFolder). - API:
UpdateInfo.container; in a containerPOST /api/updateis refused with 409 andUpdateInfo.by_handis empty.
This is a pre-release: a LADO on a final release is not offered it. Update to it with lado update 0.39.0rc1, or install it with uv tool install lado==0.39.0rc1.
Docker: docker pull ghcr.io/ladohq/lado:0.39.0rc1.
LADO 0.38.0
lado statsprints how you used LADO on this machine in the last 30 days (--days N,--all): sessions, agents per agent CLI and per role (with its kit), turn errors, flow runs, gates and how often you answered as the lead advised, questions, undelivered messages and LADO's own errors. It sends nothing.- LADO now keeps an anonymous local record of these counts (no names, paths or texts), filled from your existing history at the upgrade, so
lado forgetno longer makes them smaller; the statistics report counts from it with the same fields.lado lognames an agent's kit in itsspawnedline. lado bug-reportand Report a bug on the UI's left menu: a report for a new GitHub issue, with the system info and LADO's errors of the last 30 days by kind, and no paths, session or repository names, nor message texts; a link opens GitHub's new issue form filled in with it (the terminal asks first), and nothing is sent until you submit it.errors.jsonlnow keeps each error's scrubbed form too.- UI: the expanded waiting card covers the session's chat (on Needs you, the page) instead of the whole window, so an artifact opened from it shows over it; Esc closes that artifact first, then folds the card. On Needs you an artifact opens over the page, keeping the answers you picked.
- Each release now also appears on GitHub (github.com/ladohq/lado/releases) with this changelog's section as its notes and the wheel and sdist attached; a release candidate is a GitHub pre-release.
- UI: the empty strip above a session's tabs is gone: the tabs start right under the top bar, level with the terminals' tabs; a start or resume notice still stands above them.
lado server stop,lado updateandlado uninstallwait until the old UI server's process has ended; a server that has stopped no longer makes~/.ladoagain afterlado uninstall.- Messages queued during an agent's turn reach it in its turn-end hook's output whenever its CLI takes that output; a race sometimes pasted them into its window.
- A gate in a session's chat always shows after the run's move that opened it.
- Upgrade: schema 27, restart running sessions after the update (lado update does it).
- API:
GET /api/bug-report.
Update with lado update, or install it with uv tool install lado==0.38.0.
LADO 0.38.0rc1
lado statsprints how you used LADO on this machine in the last 30 days (--days N,--all): sessions, agents per agent CLI and per role (with its kit), turn errors, flow runs, gates and how often you answered as the lead advised, questions, undelivered messages and LADO's own errors. It sends nothing.- LADO now keeps an anonymous local record of these counts (no names, paths or texts), filled from your existing history at the upgrade, so
lado forgetno longer makes them smaller; the statistics report counts from it with the same fields.lado lognames an agent's kit in itsspawnedline. lado bug-reportand Report a bug on the UI's left menu: a report for a new GitHub issue, with the system info and LADO's errors of the last 30 days by kind, and no paths, session or repository names, nor message texts; a link opens GitHub's new issue form filled in with it (the terminal asks first), and nothing is sent until you submit it.errors.jsonlnow keeps each error's scrubbed form too.- UI: the expanded waiting card covers the session's chat (on Needs you, the page) instead of the whole window, so an artifact opened from it shows over it; Esc closes that artifact first, then folds the card. On Needs you an artifact opens over the page, keeping the answers you picked.
- Each release now also appears on GitHub (github.com/ladohq/lado/releases) with this changelog's section as its notes and the wheel and sdist attached; a release candidate is a GitHub pre-release.
- UI: the empty strip above a session's tabs is gone: the tabs start right under the top bar, level with the terminals' tabs; a start or resume notice still stands above them.
lado server stop,lado updateandlado uninstallwait until the old UI server's process has ended; a server that has stopped no longer makes~/.ladoagain afterlado uninstall.- Messages queued during an agent's turn reach it in its turn-end hook's output whenever its CLI takes that output; a race sometimes pasted them into its window.
- A gate in a session's chat always shows after the run's move that opened it.
- Upgrade: schema 27, restart running sessions after the update (lado update does it).
- API:
GET /api/bug-report.
This is a pre-release: a LADO on a final release is not offered it. Update to it with lado update 0.38.0rc1, or install it with uv tool install lado==0.38.0rc1.