Changelog
latest
-
The bubblewrap sandbox no longer bind-mounts
/opt, which exposed every third-party install tree on the host read-only. An agent installed under/optstill runs: its launcher directory and package tree are mounted individually, as they already were for installs outside the system directories. -
Base image ships bun 1.4.0 instead of 1.3.14. 1.3.14 does not export
markAsUncloneablefromnode:worker_threads, which undici 8.0.3+ requires, so recent pi releases crashed at startup withwebidl.util.markAsUncloneable is not a function. Rebuild the base image (--no-cache, or deleteorka-base:latest) to pick it up. -
Every file named
.orkashadowat any depth in a mounted directory is now always shadowed, not just the root one. Each is replaced with the read-only empty stub, so the agent cannot read which paths are hidden and cannot edit a shadow file to weaken its own coverage on a later run. A nested.orkashadowis hidden even when it is the only shadow configuration present, which now means each mounted directory is scanned on every run regardless of whether a global or root-level shadow file exists. -
THIRD_PARTY_LICENSESregenerated. It was missingclap_complete,serde_ignored,itoa, andryu, all of which are linked into the released binaries. The license texts printed by--print-licenseare no longer HTML-escaped, and the summary at the top lists each license with the number of crates using it instead of an empty line per license. -
orka scratchis an alias fororka scratchpad. -
Top-level flags are now global and accepted in any position, before or after a subcommand.
orka scratchpad foo --preset gh --dry-runpreviously failed withunexpected argument '--preset' found; it now behaves the same asorka --preset gh --dry-run scratchpad foo.--preset listis likewise handled regardless of position. -
orka is now open source under the MIT license (
LICENSE), replacing the previous binary-only terms.orka --print-licenseprints the MIT text followed byTHIRD_PARTY_LICENSES. The full source, documentation, and config templates live in one repository; topic pages moved underdocs/. -
--volume <PATH>mounts an extra host path into the container, repeatable. A bare path is mounted at the same absolute path it has on the host;HOST:CONTAINERsets the destination explicitly. Paths already mounted (the working directory, or a preset volume) are skipped rather than mounted twice.config.yamlaccepts a matchingvolumelist applied to every run. -
config.yamlacceptsharness-args: extra arguments per harness (pi,claude,codex), forwarded to the agent. They are placed ahead of anything passed after--, so a trailing prompt stays last. Removes the need to type flags such as--dangerously-skip-permissionson every run. -
config.yamlacceptspresetandenvlists, applied to every run as if passed with--presetand--env. Command-line values are appended to the configured ones. Presets are deduplicated, so naming an always-on preset again on the command line no longer produces a duplicate mount, which the container engines reject. -
config.yamlacceptsno-cache,verbose,quiet, andpreserve-containerbooleans, each setting the corresponding flag on every run. They can only turn a flag on; the flags have no negated form. -
A preset named in
config.yamlbut missing fromenvironments.yamlnow reportsconfig.yamland the offending name, instead of an error that reads as a mistyped--presetflag. -
--tmpreplaced by theorka tmpsubcommand. Same behaviour: the workdir is a freshmktemp -ddirectory that persists after the container exits. -
--scratchpad <NAME>replaced by theorka scratchpad [NAME]subcommand. Without a name, existing scratchpads are shown in an interactive fuzzy selector (type to narrow, arrows or Ctrl-N/Ctrl-P to move, Enter to select, Esc to abort).orka scratchpad --listprints the names without starting a container.orka config pathnow also prints the scratchpad root. -
Podman backend:
--useris no longer passed. It was redundant with--userns=keep-id, and it made Podman reverse-resolve the numeric UID to a username, which fails for LDAP/sssd users who are absent from/etc/passwd. Those runs failed withunknown user error looking up userand exit status 125. -
Bubblewrap backend: the agent binary’s package tree is now bind-mounted, not just its
bindirectory. npm-style installs place a relative symlink inbinpointing intolib/node_modules/...; binding onlybinleft that symlink dangling and the sandbox failed withexecvp ...: No such file or directory. The interpreter named in a script’s shebang is now mounted too. -
harness-version,pi-path,claude-path, andcodex-pathinconfig.yamlare now honoured. They were read as snake_case while the documented and shipped format is kebab-case, so all four were silently ignored. -
agent-browser and Chromium are now bundled directly into the base image (
orka-base). The separateorka-browser-baseintermediate image is gone. The base builds once and is shared across harness rebuilds as before. -
Chrome is now reachable by the container’s runtime user.
agent-browser installran as root during the base build and left the download in/root/.agent-browser/browsers, so browser tool calls failed in the running container. The download is relocated to/opt/browser-cacheand exposed throughAGENT_BROWSER_EXECUTABLE_PATH. The unusedPLAYWRIGHT_BROWSERS_PATHvariable is gone; custom base images that set it should setAGENT_BROWSER_EXECUTABLE_PATHinstead. -
Documented that the Docker backend is not restricted to Linux. orka gates no backend by platform, so
--engine dockerworks whereverdockerresolves onPATH, Docker Desktop on macOS included. Untested, and noted as such. -
--cap-drop=ALLis now passed to Apple’scontaineronly when that binary accepts it. Capability flags were added incontainer0.12.0, and earlier versions reject unknown options outright, so every run failed withError: Unknown option '--cap-drop'and exit status 64. Docker and Podman are unaffected and are not probed. -
ARM64 base images now install the Chromium build published by Playwright instead of Chrome for Testing, which has no Linux ARM64 release. The base image build previously failed on Apple silicon at the
agent-browser installstep.AGENT_BROWSER_EXECUTABLE_PATHstill points at/opt/browser-cache/chromeon both architectures. The revision is pinned by thePLAYWRIGHT_CHROMIUM_REVISIONbuild argument. -
Architecture-dependent download steps in the bundled Dockerfiles now read BuildKit’s
TARGETARCHrather thanuname -m, falling back todpkg --print-architectureon the legacy builder. Cross-builds with--platformpreviously selected binaries for the builder’s architecture instead of the image’s. -
--initreplaced byorka config init. New sibling subcommands:orka config completions <SHELL>prints a shell completion script (bash, zsh, fish, elvish, powershell), andorka config pathprints the configuration paths orka reads. -
--no-browserremoved. To run without browser support, provide a custom~/.config/orka/Dockerfile.basethat omits agent-browser.
previous
--initto write the bundled config templates (config.yaml,environments.yaml,orkashadow) to~/.config/orka/. Files that already exist are skipped.--quietto suppress image build output (build output is now shown by default; use--quietto hide it).--verbosenow passesVERBOSE=1into the container environment instead of controlling build output visibility.- Podman backend:
--userns=keep-idis now passed automatically so container file ownership matches the host user. --engine bubblewrapto run the agent in a bubblewrap user-namespace sandbox instead of a container. No image is built; the agent binary must already be installed on the host. Bind-mounts system paths, agent config directories, and user-specified volumes into the namespace. Linux only.pi-path,claude-path,codex-pathin~/.config/orka/config.yamlto set explicit paths to agent binaries that are not on PATH. Used only by the bubblewrap backend.--engineto select the container engine:docker(default) orpodman. The engine binary is used for all build and run commands.~/.config/orka/config.yamlfor persistent user defaults. Supportsengineandharness. Command-line flags always win. Copy the bundledconfig/config.yamlto get started.orkashadowfiles to hide sensitive files from the agent. Files matching patterns in~/.config/orka/orkashadow(global) or.orkashadow(per-repo, placed at the root of any mounted directory) are replaced with empty read-only stubs inside the container. The agent can see the filename but cannot read or write the content. Uses.gitignoresyntax. Copy the bundledconfig/orkashadowfor annotated examples.--file/-fto mount specific files into the container rather than the entire working directory. Repeatable. Each file is mounted at its host path; the container workdir is set to the invoking directory.--tmpto create a temporary directory withmktemp -dand use it as the container workdir. The directory persists after the container exits.--scratchpad <NAME>to create or reuse~/.local/share/orka/scratch/<NAME>as the container workdir.- Support claude-code (
--harness claude) - Support Codex (
--harness codex) --presetto mount named volume and env var sets; presets can be stacked--harness-versionto pin the agent version installed in the image--preserve-containerto keep the container after it exits (containers are removed on exit by default)--dry-runto print commands without executing them