π«π· Version franΓ§aise
Three ways to run Orkeon
See also: Run your first example Β· Overview Β· Back to the index
Orkeon crews can be launched three ways. Pick the one that matches how much you want to install:
| Way | Prerequisites | Time to first run | Best for |
|---|---|---|---|
| 1. From source | .NET SDK β₯ 10.0.300, git clone | ~5 min (+ build) | Contributors, reading/modifying code, running any of the 100+ bundled examples |
| 2. Release binary | Nothing for the CLI packages (Windows zip/MSI, Debian .deb) β they bundle the runtime; .NET 10 runtime for the extra launchers in the multi-app archive |
~2 min | Running examples and showcases without a source checkout |
| 3. Container | Docker | ~1 min (after image pull) | CI, reproducible runs, no local .NET at all |
All three drive the same orkeon CLI and accept the same flags. The crew
config is the positional argument to orkeon run <config>; the option flags (--settings, -v,
--mount, --var, --llm-log, β¦) are documented once, in detail, in
Run your first example.
Prefer a window to a prompt? The Windows and Linux release packages also carry Orkeon Studio β a graphical front-end over that same CLI, installed alongside it. It is not a fourth way of running a crew: it edits the same configuration file and shells out to the same
orkeon run.
1. From source
Clone, build, and run any config.yaml under examples/ through the orkeon
CLI project:
git clone https://github.com/Orkeon/orkeon.git
cd orkeon
dotnet run --project src/scripting/Orkeon.Scripting.Cli -- run \
examples/01-enterprise/01-research-assistant/config.yaml \
--settings examples/appsettings/appsettings.deepseek.local.json
This is the most flexible path β it can run every example and picks up your local code changes. Full walkthrough, LLM-profile setup, and troubleshooting: Run your first example.
2. Release binary
Each GitHub Release attaches a per-platform CLI package, the historical multi-app archives, and a NuGet dotnet tool:
| Artifact | What's inside | Runtime prerequisite | Best for |
|---|---|---|---|
orkeon-cli-<version>-win-x64.zip |
the orkeon CLI + Orkeon Studio (orkeon-studio, the desktop app) + install.ps1 |
none β self-contained | Windows: the recommended download |
orkeon-<version>-win-x64.msi |
the same two, per-user MSI, with an "Orkeon Studio" Start-menu shortcut | none β self-contained | Windows, if you'd rather double-click and get an "Installed apps" entry |
orkeon_<version>_amd64.deb |
the orkeon CLI at /usr/bin/orkeon + the two Orkeon Studio terminal apps |
none β self-contained | Debian / Ubuntu: the recommended download |
orkeon-cli-<version>-osx-arm64.tar.gz / -osx-x64.tar.gz |
the orkeon CLI alone + install.sh (no Studio in V1 β the macOS onboarding channel stays CLI-only) |
none β self-contained | macOS, Apple Silicon and Intel respectively |
orkeon-<version>-<rid>.tar.gz / .zip |
every launcher (orkeon, orkeon-repl, orkeon-hostβ¦) + the Studio apps their platform supports + install.sh / install.ps1 |
mixed β see the command table below | The REPL and the service host |
dotnet tool install --global Orkeon.Scripting.Cli --prerelease |
the orkeon CLI |
.NET 10 SDK | Getting just the CLI on a dev box that already builds .NET |
<rid> is linux-x64, linux-arm64, osx-x64, osx-arm64 (.tar.gz) or
win-x64 (.zip). SHA256SUMS covers every artifact of the release except the MSI, which
has its own SHA256SUMS.msi (each file is produced by the CI job that built the artifact).
The multi-app archive is the only one that carries more than the CLI:
| Command | What it runs | Runtime |
|---|---|---|
orkeon |
The main CLI and default entry point β orkeon run <config.yaml> for any YAML crew, or orkeon run script.ork.ts for the scripting DSL |
self-contained |
orkeon-slim |
The same CLI, framework-dependent and much smaller | needs .NET 10 |
orkeon-repl |
Full interactive REPL console (all built-in tools, code analysis, local embeddings) | needs .NET 10 |
orkeon-host |
The service host daemon β registers crews and serves them long-running (systemd unit, Windows service via the bundled script or its own per-machine MSI, chat gateway, Discord channel; see the service host) | self-contained |
orkeon-studio |
Orkeon Studio, the desktop app β Windows archives only (see below) | self-contained |
orkeon-studio-config / orkeon-studio-run |
Orkeon Studio in the terminal: settings editor and crew launcher | self-contained |
Runtime prerequisite, in one line. The CLI packages (zip, MSI,
.deb), theorkeonlauncher and the Orkeon Studio apps bundle their own runtime and need no .NET install at all. Everything else in the multi-app archive β and the dotnet tool β needs the .NET 10 runtime (verify withdotnet --list-runtimes).install.shandinstall.ps1detect the case and print the install commands for your platform; they never install a runtime for you.
Windows
Two channels, both per-user (no administrator rights, nothing written outside your profile). Install one channel at a time β the MSI refuses to install over a ZIP install, so uninstall the other one first if you switch.
# Channel A β ZIP + install.ps1 (recommended)
Expand-Archive orkeon-cli-<version>-win-x64.zip -DestinationPath .
cd orkeon-cli-<version>-win-x64
.\install.ps1 # -> %LOCALAPPDATA%\Programs\Orkeon, user PATH, "Installed apps" entry
.\install.ps1 -Uninstall
# Channel B β MSI (double-click, or silently)
msiexec /i orkeon-<version>-win-x64.msi # same install dir, same PATH entry
msiexec /x orkeon-<version>-win-x64.msi /qn # uninstall
The MSI is not code-signed, so SmartScreen shows a publisher warning on first run β "More info" β "Run anyway", or use the ZIP channel.
Either way, your configuration lives in %APPDATA%\Orkeon\appsettings.json, and
both uninstallers leave it alone. (An appsettings.json left behind in an
install directory by an earlier install is migrated there on upgrade.)
Linux
The .deb is the recommended channel on Debian and Ubuntu β self-contained,
so it never pulls a dotnet-runtime package or a Microsoft repository:
sudo apt install ./orkeon_<version>_amd64.deb # installs /usr/bin/orkeon
sudo apt remove orkeon
The multi-app tar.gz + install.sh is the per-user alternative (and the only
option for linux-arm64, or when you want the REPL and the service host):
tar -xzf orkeon-<version>-linux-x64.tar.gz
cd orkeon-<version>-linux-x64
./install.sh # installs to ~/.local; --prefix /usr/local for system-wide
./install.sh --modify-path # also appends ~/.local/bin to your shell rc files
./install.sh --uninstall
Because that archive carries framework-dependent launchers, install.sh checks
for a Microsoft.NETCore.App 10.x runtime (on the PATH or under DOTNET_ROOT)
and, if it finds none, prints the exact commands for your distribution β
sudo apt install dotnet-runtime-10.0 on Ubuntu 25.10+, the
packages.microsoft.com repository registration on Debian and Ubuntu LTS, or
dotnet-install.sh --runtime dotnet --channel 10.0 under $HOME when you have
no sudo. The warning never blocks the install: the files land either way, and
orkeon itself still runs, being self-contained.
macOS
No prerequisite either way: the macOS CLI tarballs are self-contained, so no .NET install is involved.
Homebrew will be the recommended channel. The formula lives in the
repository at installers/homebrew/orkeon.rb, but the Orkeon/homebrew-tap
repository will only be published with the first tagged release β until
then the command below does not resolve, and the tar.gz route is the way in:
brew tap orkeon/tap # once the tap is published
brew install orkeon
Tarball + install.sh works today. Pick osx-arm64 on Apple Silicon,
osx-x64 on Intel:
tar -xzf orkeon-cli-<version>-osx-arm64.tar.gz
cd orkeon-cli-<version>-osx-arm64
./install.sh # installs to ~/.local; --modify-path to update your shell rc
./install.sh --uninstall
Gatekeeper. Orkeon is not signed with an Apple Developer ID, and macOS tags anything downloaded through a browser with
com.apple.quarantineβ which is what produces "cannot be opened because the developer cannot be verified".install.shhandles both halves of that on its own: it clears the quarantine attribute from the installed tree, and it ad-hoc re-signs only the bundled Mach-O files thatcodesign -vactually rejects (a valid publisher signature is never overwritten). Downloading withcurlsets no quarantine attribute in the first place, andbrewstrips it itself. If a command is still killed or refused afterwards, the manual escape hatch isxattr -dr com.apple.quarantine ~/.local/lib/orkeon.
The multi-app tar.gz (REPL, service host) is available for
both macOS architectures too, and needs the .NET 10 runtime for the
framework-dependent launchers it carries β install.sh prints the
download link when it is
missing.
First run
Open a new terminal (so the PATH change is picked up), then:
orkeon init # writes the global config: which LLM, which model, which endpoint
orkeon doctor # 9 checks: runtime, config, LLM reachability, esbuild, grammars, β¦
orkeon run path/to/crew.yaml
orkeon init is a 5-choice wizard β ollama, docker-model-runner, openai,
custom, or none β and writes %APPDATA%\Orkeon\appsettings.json on Windows,
~/.config/Orkeon/appsettings.json on Linux and macOS. It is scriptable end to
end (--provider, --base-url, --model, --api-key-env, --path, --force,
--no-probe), which is what CI uses. orkeon doctor prints β
/ β οΈ / β per
check, exits 1 as soon as one check fails, and takes --json for scripts.
No LLM configured? Orkeon does not fail and does not go quiet: it warns on stderr β "No
Llmsection configured β falling back to the echo provider β¦ Runorkeon initβ¦" β and runs the crew against the echo provider, which replays the prompt instead of answering it. That fallback is what makes the scripting demos runnable with no key and no server; it is never a working LLM. If you see that warning when you expected a real model, runorkeon init, thenorkeon doctorto confirm the endpoint is reachable.
Orkeon Studio, the graphical way in
The Windows and Linux packages install Orkeon Studio next to the CLI. It is a
front-end, not a second product: it edits the very appsettings.json that
orkeon init writes, and it launches crews by running the co-installed orkeon
binary. Anything it does can be done from the terminal, and anything it writes is
readable by the CLI β you can switch between the two at any point.
| Platform | Command | Ships in | What it gives you |
|---|---|---|---|
| Windows | orkeon-studio |
the win-x64 zip and the MSI |
A desktop window with a sidebar of screens β settings editor (presets, sections, mounts, raw JSON, diagnostic) and crew launcher (run + history) β with light/dark theme, a five-language selector (English, French, Spanish, German, Chinese) and a guided tour. The MSI also registers an "Orkeon Studio" Start-menu shortcut, so it takes no terminal at all to start |
| Linux | orkeon-studio-config |
the .deb and the linux archives |
A full-screen terminal editor for the settings file: provider presets, model and endpoint, and the VFS mount table |
| Linux | orkeon-studio-run |
the .deb and the linux archives |
Pick a target (a config.yaml, a crew directory, or a .ork.ts script), set the run options β including --validate for a dry run β then watch the output live and cancel if you need to |
| macOS | β | β | Not in V1 on the onboarding channel: the orkeon-cli-*-osx-* tarballs and Homebrew ship the CLI alone. The multi-app orkeon-<version>-osx-* archives do carry the two terminal apps (only the WPF app has a RID filter), untested on macOS in V1 |
orkeon-studio-config # write ~/.config/Orkeon/appsettings.json without the wizard
orkeon-studio-run # choose a crew, run it, watch it
On Windows, either double-click Orkeon Studio in the Start menu (MSI channel)
or run orkeon-studio from a terminal β the same window either way. Both terminal
apps also take --version and --help and print them without opening a
full-screen interface, which is what makes them scriptable and CI-checkable.
Run
The CLI resolves LLM settings the same way as from source. orkeon init covers
the common case; pass --settings to point at a specific profile instead (see
the profile matrix):
orkeon run path/to/config.yaml \
--settings path/to/appsettings.local.json \
--mount ./out:/output:rw
Settings are resolved in order: --settings, then appsettings.json sitting
next to the config file, then β walking up the parent directories β an
appsettings/appsettings.json sub-directory at each level (the shared examples
profile matrix; _shared/appsettings.json stays a deprecated fallback), then the
global per-user file written by orkeon init, then ORKEON_* environment
variables alone.
A crew can also be a directory. Point orkeon run at a
folder holding a multi-file crew β config.yaml for the crew settings, one agent
per file under agents/, one task per file under tasks/, each file name being
the entity id β and it loads exactly like a single YAML file. The legacy flat
triplet (crew.yaml + agents.yaml + tasks.yaml) is accepted too, and every
option behaves identically on a directory (--settings, -V/--var,
--initial-context, --mount, --validate, --verbose, --llm-log):
orkeon run examples/crew-multifile --validate
# VALIDATION OK: β¦/examples/crew-multifile (agents=2, tasks=2, tools resolved=0)
A directory holding both a YAML layout and a scripting entry point β any *.ork.ts
or *.ork.js sitting directly in it, whatever the file is called β is refused, naming
both candidates, and so is a directory with no recognized layout: Orkeon never guesses
which one you meant. See
YAML and builders for the layout itself.
A crew can name the folders it uses. A mounts: block in config.yaml (or
crew.yaml) lists the virtual roots the crew reads and writes β /output, or
<ulid>|/output to pin one settings entry when several declare that root (a settings
entry may carry a 26-character id before its |; Orkeon Studio writes one on every
save). orkeon run crew/ then resolves the block against the settings file with no
--mount at all, and refuses in one line when a root is missing or ambiguous;
--mount-id <ulid> picks an entry from the command line, and a plain
--mount <folder>:/output:rw replaces every settings entry of that root for the run.
You can also run a command straight from the extracted archive without
installing: ./libexec/orkeon/orkeon run β¦.
3. Container
The ghcr.io/orkeon/orkeon-runners image (built from Dockerfile.runners,
published to GHCR) has the orkeon CLI as its default entry point and ships
all the other runners plus the bundled examples β zero local .NET required.
The /workspace convention
Mount your project directory at /workspace and reference everything from
there. One volume, no extra flags:
docker run --rm -v "$PWD:/workspace" ghcr.io/orkeon/orkeon-runners \
run /workspace/crews/my-crew/config.yaml \
--settings /workspace/appsettings.local.json \
--mount /workspace/data:/data:ro /workspace/output:/output:rw
Three image conveniences make this Just Work:
- No
--allow-external-mountsneeded β the image bakesORKEON_ALLOW_EXTERNAL_MOUNTS=1, because the container boundary already sandboxes every reachable path (pass-e ORKEON_ALLOW_EXTERNAL_MOUNTS=0to restore the guard). - Writes just work β the entrypoint adopts the uid/gid that owns
/workspacebefore running, so the crew can write to your bind mount and the files it creates belong to you on the host. No--user, nochmod. (It still runs unprivileged: when nothing is mounted it falls back to the image's non-rootappuser.) /workspacealways exists β even with nothing mounted, so the same commands work in CI.
Volume mounts are how the host filesystem reaches the crew's
VFS: the Docker -v maps host β container,
the --mount flag maps container β the crew's virtual paths (/data,
/output, β¦).
Running a bundled example
The examples ship inside the image under /app/examples, along with a helper
that makes running them a one-liner. The simplest possible session:
# one-time, on the host: pull the default model (Docker Desktop β Model Runner)
docker model pull ai/granite-4.0-h-tiny
docker run -it --rm -e ORKEON_RUNNER=shell -v "$PWD/out:/output" \
ghcr.io/orkeon/orkeon-runners
# then, inside the shell:
orkeon-example list # browse the 105 bundled examples
orkeon-example run 1 # run #1 (research assistant)
orkeon-example show 42 # read an example's README first
orkeon-example run resolves the number to its config, mounts
/output for file results, and picks LLM settings for you (next section). When
a number exists in two categories (16, 102), it lists the candidates β
qualify with the category: orkeon-example run 02/16.
LLM settings inside the container β the baked default targets Docker
Model Runner on your host (host.docker.internal:12434): the
docker model pull above is the only setup, and every example then works with
zero flags. Forget it and orkeon-example run fails fast before the crew,
printing the exact pull command (and, when the endpoint serves other models,
the -e ORKEON_Llm__Model=<name> override to use one of them β
docker model list on the host shows what you have). To use something else,
pick a profile from /etc/orkeon/profiles with ORKEON_LLM_PROFILE:
-e ORKEON_LLM_PROFILE= |
Endpoint | Needs |
|---|---|---|
(unset) = host-dmr |
Docker Model Runner on the host, :12434 |
docker model pull β¦ on the host |
host-ollama |
Ollama on the host, :11434 |
ollama pull llama3.2 on the host |
openai |
OpenAI cloud | -e ORKEON_Llm__ApiKey=sk-β¦ |
local |
model embedded in the image | the local-llm image variant (below) |
ORKEON_Llm__* env vars override any profile (e.g. -e ORKEON_Llm__Model=β¦).
On a plain Linux engine (no Docker Desktop), add
--add-host=host.docker.internal:host-gateway so the host profiles resolve.
Bigger context window (host models) β Docker Model Runner serves each model with its default context size. On recent Docker Desktop versions you can raise it per model, e.g. 128K for Gemma 4:
docker model configure --context-size 131072 gemma4:latest # see: docker model configure --help
docker model configure show gemma4:latest # verify β list/inspect only show packaging metadata
A large KV cache is RAM-hungry (several extra GB at 128K) β size the host
accordingly. Llm.MaxTokens in the Orkeon settings caps the response length
and is independent of the server-side context size.
Everything local-model related (DMR pitfalls, Ollama, model switching, context sizing, troubleshooting) is consolidated in the Local models guide.
No model at all? The bundled scripting demos run on the echo LLM fallback β no
key, no server, no network. The run announces it on stderr ("No Llm section
configured β falling back to the echo provider β¦ Run orkeon init β¦"), so an
unconfigured container is never mistaken for a working model:
orkeon run /app/examples/scripting/01-hello-world.ork.ts
Fully local: bake a model into your image
Build a variant that needs no host-side model server and no API key β
llama.cpp's llama-server plus one GGUF are embedded and served inside the
container on the same URL shape the default settings already use:
# Granite 4.0 h-tiny (Apache 2.0, ~4.2 GB of weights β ~6 GB image)
docker build -f Dockerfile.runners --target local-llm \
--build-arg LOCAL_MODEL_URL=https://huggingface.co/ibm-granite/granite-4.0-h-tiny-GGUF/resolve/main/granite-4.0-h-tiny-Q4_K_M.gguf \
-t orkeon-runners:granite .
# Gemma 4 E4B with a 128K context (Gemma license β keep the image local, don't push it)
docker build -f Dockerfile.runners --target local-llm \
--build-arg LOCAL_MODEL_URL=https://huggingface.co/unsloth/gemma-4-E4B-it-qat-GGUF/resolve/main/gemma-4-E4B-it-qat-UD-Q4_K_XL.gguf \
--build-arg LOCAL_MODEL_NAME=ai/gemma4 \
--build-arg LOCAL_MODEL_CTX=131072 \
-t orkeon-runners:gemma4 .
# LOCAL_MODEL_CTX bakes the llama-server context size (default 8192); override
# per run with -e ORKEON_LOCAL_LLM_CTX=β¦ β at 128K plan several extra GB of RAM.
docker run -it --rm -m 8g -e ORKEON_RUNNER=shell orkeon-runners:granite
# the model loads at startup (30-90 s), then:
orkeon-example run 1
CPU inference: expect roughly 5β15 tokens/s and give the container memory
(-m 8g; on WSL2, raise the VM memory in .wslconfig if needed).
-e ORKEON_LOCAL_LLM=0 skips the embedded server. These variants are
build-your-own by design β no pre-built tag is published, so model-license
obligations stay on your side of the wall.
One-shot (no shell) still works β the entry point is orkeon:
docker run --rm \
-v "$PWD/out:/output" \
ghcr.io/orkeon/orkeon-runners \
run examples/01-enterprise/01-research-assistant/config.yaml \
--mount /output:/output:rw
Other runners and the interactive shell
The entry point is orkeon, so everything after the image name is CLI
arguments (run <config> β¦). To launch a different runner, set the
ORKEON_RUNNER env var β orkeon (the default), repl or shell; any other
value is rejected with a usage line:
docker run -it --rm -e ORKEON_RUNNER=repl \
-v "$PWD/appsettings.local.json:/app/appsettings.local.json:ro" \
ghcr.io/orkeon/orkeon-runners
There is no runner per example family: the finance crews are main.ork.ts
scripts the same orkeon CLI runs, like every other example.
docker run --rm \
-v "$PWD/appsettings.local.json:/app/appsettings.local.json:ro" \
ghcr.io/orkeon/orkeon-runners \
run examples/03-finance-trading/31-algo-trading/main.ork.ts \
--settings /app/appsettings.local.json
ORKEON_RUNNER=shell opens an interactive zsh inside the image (starting
in /workspace) β handy for poking at the bundled examples or debugging mounts.
A welcome banner lists the available commands and paths (suppress it with
-e ORKEON_NO_BANNER=1), and every runner is on the PATH under the same names
as the release archives (orkeon, orkeon-repl, β¦):
docker run -it --rm -e ORKEON_RUNNER=shell -v "$PWD:/workspace" \
ghcr.io/orkeon/orkeon-runners
# orkeon /workspace % orkeon-example run 1
# orkeon /workspace % orkeon run /workspace/crews/my-crew/config.yaml --validate
Which one should I use?
- Just want to see a crew run? Grab a release binary (way 2) or the container
(way 3) and point
orkeon runat anyconfig.yaml.- On Windows:
orkeon-cli-<version>-win-x64.zip+install.ps1, or the MSI if you prefer double-clicking. One channel at a time. - On Debian / Ubuntu:
sudo apt install ./orkeon_<version>_amd64.deb. - Then
orkeon initβorkeon doctorβorkeon run.
- On Windows:
- Rather not type any of that? On Windows and Linux those same packages
install Orkeon Studio β a window (or a
full-screen terminal app) over the same configuration file and the same
orkeon run. - Want the REPL or the service host? The multi-app archive (way 2) β and install the .NET 10 runtime, which those launchers need.
- Modifying Orkeon or running arbitrary examples? Run from source (way 1).
- CI / reproducible / no local toolchain? Container (way 3).
Whichever you choose, the flags and the appsettings profile story are identical
β read them once in Run your first example.