Mojo UpDocs
AI Workbench

Settings

Every AI Workbench setting, its default, and where you can set it.

AI Workbench has 366 settings. Most people never change more than a few, from Settings in the app; this page lists them all, for administrators and for anyone setting them in a file.

Where a setting can be set

A setting can be set in up to four layers. When the same setting is set in more than one, the most specific wins:

LayerWhere it lives
YouYour own settings in the app, for every project on this computer.
MachineOne machine you work on (this computer, a WSL distribution, a dev container or an SSH host), so each can hold its own value.
ProjectOne project, for everyone who opens it on this computer.
RepositoryThe repository's own .mojoup/settings.json file, committed with the code.

The Set in column below lists the layers each setting accepts.

An organisation's policy sits above all four: it can set a default for any setting, or lock a setting so no layer can change it. See Policies.

In files, settings are written without the mjuWorkbench. prefix, for example { "git.mergeStrategy": "ask" }.

General

SettingDefaultSet inWhat it does
backgroundNotificationsapprovalsYouNotifications shown while the workbench is not the window in front: 'approvals' = permission requests and errors, 'all' = also agent turn completions, 'off' = none. One of: approvals, all, off.
copilotCliPathYou, Machine, ProjectPath to the GitHub Copilot CLI, for agents on the Copilot runtime. Leave empty to use 'copilot' from PATH (or the COPILOT_CLI_PATH environment variable).
enableCustomAcpAgentsfalseYou, Project, RepositoryOffer a custom agent command when starting a solo agent: any program that speaks the Agent Client Protocol (ACP), such as "agy_acp_server.par --uid=".
enableLmStudioAgentsfalseYou, Project, RepositoryAllow spawning agents backed by an LM Studio endpoint. LM Studio does not authenticate by default; if you switched that on under Developer → Server Settings, paste one of its tokens into the key field under Settings → Agent backends.
enableLoopBreakertrueYou, Project, RepositoryCancel an agent's turn when it repeats the same reasoning verbatim without making progress (shows as "Operation cancelled by user" followed by a corrective prompt). Disable if local models are being cancelled while working.
enableOllamaAgentsfalseYou, Project, RepositoryAllow spawning agents backed by an Ollama endpoint.
enableUnslothAgentsfalseYou, ProjectAllow spawning agents backed by Unsloth Desktop on this machine. Unlike Ollama it authenticates every request, so it needs an API key: make one in Unsloth under Settings → API and paste it into the key field under Settings → Agent backends. Agents on it will not start until it is there.
lmstudioEndpointhttp://127.0.0.1:1234/v1You, Machine, ProjectDefault OpenAI-compatible endpoint for team members using the 'lmstudio' provider. Can be overridden per member in the team config.
officeLayout{}YouThe solo office layout (furniture, walls, floors) for ad-hoc agents. Managed by the workbench; team layouts live in .mojoup/teams/<team>.json.
ollamaEndpointhttp://127.0.0.1:11434/v1You, Machine, ProjectDefault OpenAI-compatible endpoint for team members using the 'ollama' provider. Can be overridden per member in the team config.
unslothEndpointhttp://127.0.0.1:8000/v1You, Machine, ProjectDefault OpenAI-compatible endpoint for team members using the 'unsloth' provider — the port Unsloth Desktop booted on (8000 by default, 8888 when it was started with -p 8888). Can be overridden per member in the team config.

Agents

SettingDefaultSet inWhat it does
agents.idleStopautomationYou, ProjectWhich agents are stopped after sitting idle for agents.idleStopMinutes. Members of a running team are never stopped this way; an agent waiting for your approval, or with a task still in progress, is left alone. One of: automation (Stop agents that a routine, the daily review or a task filed for a specialist started, once they sit idle.), all (Stop every idle agent outside a running team as well: chats and specialists you started yourself.), off (Never stop an agent for being idle.).
agents.idleStopMinutes10You, ProjectHow long an agent may sit idle before agents.idleStop stops it. 0 turns it off. From 0 to 1440.
agents.restart.afterUnansweredNudges3You, Project, RepositoryHow many reminders an agent can leave unanswered (status checks, requests to report on its task) before it is treated as stuck and restarted. 0 keeps reminding without restarting. From 0 to 20.
agents.restart.backoffSeconds30You, Project, RepositorySeconds to wait before the first restart. Each further restart in the same window waits twice as long. From 0 to 3600.
agents.restart.maxRestarts3You, Project, RepositoryHow many times an agent that crashes or stops responding is started again on its conversation within the time window. After that it is left stopped and you get a note in the inbox. 0 never restarts it. From 0 to 20.
agents.restart.windowMinutes30You, Project, RepositoryThe time window restarts are counted in. An agent that has run cleanly for this long gets its full number of restarts back. From 1 to 1440.
agents.stuckAfterMinutes20You, Project, RepositoryAn agent that sits idle, or waits on you, for this long while it holds a task in progress is shown as Stuck on its card, in Mission Control and on the node's dashboard. 0 never calls an agent stuck. From 0 to 1440.

Amazon Bedrock

SettingDefaultSet inWhat it does
bedrock.endpointruntimeYou, Machine, ProjectWhich of Bedrock's two OpenAI-compatible endpoints to use. One of: runtime (bedrock-runtime.<region>.amazonaws.com/openai/v1 — AWS's recommendation. Chat only: the model id is typed (an inference profile such as us.anthropic.claude-…) because this endpoint cannot list models.), mantle (bedrock-mantle.<region>.api.aws/v1 — the compatibility endpoint: lists models, and carries what runtime does not yet.).
bedrock.regionus-east-1You, Machine, ProjectAWS region whose Amazon Bedrock endpoint members with provider "bedrock" use, e.g. ap-southeast-2. The key is an Amazon Bedrock API key (Settings → Models), sent as a bearer token — no SigV4 signing.

Appearance

SettingDefaultSet inWhat it does
appearance.reduceEffectsfalseYouTurn off the moving background shapes and other decoration that is only there to look nice

Approvals

SettingDefaultSet inWhat it does
approvals.timeoutMinutes.high0You, Project, RepositoryMinutes a high-risk request (running commands or deleting files) waits for an answer before it is denied automatically. It is never allowed without you. 0, the default, waits for you however long it takes. From 0 to 10080.
approvals.timeoutMinutes.low10You, Project, RepositoryMinutes a low-risk request (reading or searching) waits for an answer before it is allowed once automatically. The decision is recorded in the audit log. 0 waits for you however long it takes. From 0 to 10080.
approvals.timeoutMinutes.medium30You, Project, RepositoryMinutes a medium-risk request (editing or moving files) waits for an answer before it is denied automatically, so the agent can carry on another way. The decision is recorded in the audit log. 0 waits for you however long it takes. From 0 to 10080.

Apps

SettingDefaultSet inWhat it does
apps.mapTileshttps://tiles.openfreemap.org/styles/libertyYouWhere an app's map gets its tiles: the address of a MapLibre style. The default is OpenFreeMap's free style, which needs no key or account. Point it at your own provider if you prefer, or write off to draw an app's places as a list. The Workbench fetches the tiles for the app, so the app itself reaches nothing; the tile provider sees which area is being viewed. Your organisation may pin this or turn it off.

Azure

SettingDefaultSet inWhat it does
azure.authkeyYou, Project, RepositoryHow requests to Azure authenticate. One of: key (An API key stored in the operating system’s keychain (Settings → Inference gateways → Azure OpenAI / AI Foundry).), entra (A Microsoft Entra token from VS Code's Microsoft account — nothing to store.).
azure.endpointYou, Machine, ProjectAzure OpenAI / AI Foundry resource endpoint, e.g. https://<resource>.openai.azure.com (normalised to the v1 surface). Used by members whose provider is "azure".

Backup

SettingDefaultSet inWhat it does
backup.folderYouWhere automatic backups are written. Empty uses the backups folder in the app's own data. A synced folder (OneDrive, Dropbox) keeps them off this computer too.
backup.keep7YouHow many automatic backups to keep. Older ones are removed; backups you made yourself are never removed. From 1 to 100.
backup.organisationtrueYouWhen you are signed in to an organisation that keeps backups, send it a copy after each backup: your settings, projects and recent chat history (never keys or tokens, at most 16 MB). A new computer can then be restored after you sign in.
backup.scheduledailyYouHow often the workbench backs itself up on this computer: your settings, your projects and each repository's chat history and runs. Daily by default; the copies go to the backups folder and the oldest are removed after backup.keep. One of: off, daily, weekly.
backup.transcriptsfalseYouAlso back up agents' full transcripts (at most 64 MB per repository, newest first). Off: chat history and runs are backed up, transcripts stay on this computer.

Built-in browser

SettingDefaultSet inWhat it does
browser.agentsShareStoragetrueYouAgents' tabs in the built-in browser use your sign-ins and site storage in the same project. Off gives agents a storage of their own in each project, so they start signed out and never see your cookies. Either way one project's browser storage is never another's.
browser.defaultEmulationYouA device new tabs start as — a device preset's id such as iphone-15 or laptop-1366, or one you saved. Empty starts them at the pane's own size.
browser.historyRetentionDays90YouHow many days the built-in browser keeps the pages you visited. 0 keeps no history at all. Each project keeps its own history, on this computer only — never in a repository. From 0 to 3650.
browser.homePageYouThe page a new tab in the built-in browser opens on. Empty opens a blank tab. A web address, or anything the address bar takes.
browser.recordingFormatwebmYouThe container the built-in browser's recordings are written in — from the toolbar's Record button and from an agent's browser_record_start, which can still ask for the other. One of: webm (WebM (VP9). Plays in every browser and in most players; always available.), mp4 (MP4 (H.264). Plays everywhere, including in chat and mail clients that refuse WebM. Encoded by the app's own Chromium; falls back to WebM, and says so, on a build that cannot.).
browser.recordingFps5YouFrames per second for recordings. Five is enough to show a feature working; more makes larger files and heavier captures. From 1 to 15.
browser.searchEngineduckduckgoYouWhere the built-in browser's address bar sends something that is not a web address. One of: duckduckgo (DuckDuckGo.), google (Google.), bing (Bing.), brave (Brave Search.).

Built-in model runner

SettingDefaultSet inWhat it does
localRunner.accelerationautoYouCompute backend for the local runner. Settings → Local models → Engine shows what was detected and which builds this machine can use; a backend that is not published for this platform falls back to Automatic. One of: auto (Detect the GPU and use the matching build: Vulkan on Linux / Windows with a Vulkan loader, Metal on Apple Silicon, CPU otherwise (and always CPU under WSL2).), gpu (Use the default GPU build even when detection is unsure — Vulkan on Linux / Windows, Metal on any Mac.), cpu (CPU build only.), vulkan (The Vulkan build: NVIDIA, AMD and Intel GPUs through the driver's Vulkan runtime.), rocm (The ROCm (HIP) build for AMD GPUs. Often faster than Vulkan where the card is supported; a large download.), cuda (The CUDA build for NVIDIA GPUs, with the CUDA runtime. Usually the fastest on NVIDIA; a large download.).
localRunner.allowBuildUpdatestrueYouLet the local runner ask GitHub for llama.cpp builds at all. Off means the build this version of the app was tested with, whatever localRunner.build says — for computers that may not contact GitHub. Every build is verified against the SHA-256 GitHub publishes.
localRunner.approvedModelsOnlyfalseYouWhen your organisation asks this machine to download a local model, take only models on the organisation's approved list. Off downloads one that is not on the list and says so in the answer; on Mojo Up AI Cloud an unlisted model is always refused.
localRunner.autoStarttrueYouStart the local runner when the workbench activates, once its build and model are downloaded.
localRunner.buildlatestYouWhich llama.cpp build runs the local model. latest (the default) follows the newest official build — downloaded from the ggml-org release and checked against the SHA-256 GitHub publishes — so new model families load without waiting for an app update; if a new build will not start, the local model goes back to the tested one. tested stays on the build this version of Mojo Up was tested with. A build number such as b10850 keeps that one build.
localRunner.contextLength0YouContext window the local runner starts the model with (0 = the model's own default). Larger costs RAM. A per-model override in Settings → Local models wins over this. From 0 to 1048576.
localRunner.deviceYouWhich GPU runs the local model, as llama.cpp names it (llama-server --list-devices: Vulkan0, CUDA1, ROCm0, MTL0). Empty is Automatic: with more than one GPU it picks a discrete card over an integrated one, so a laptop's NVIDIA or Radeon card is used rather than the Intel or AMD graphics built into the processor. all splits the model over every GPU, llama.cpp's own default. A device that is no longer there falls back to Automatic; a --device in localRunner.extraArgs wins.
localRunner.enabledtrueYouAllow the bundled local model runner (a llama.cpp server the app downloads into its private storage and supervises). Off stops it and hides it from providers.
localRunner.extraArgsYouExtra llama-server flags, space separated, passed verbatim (advanced — e.g. "-ngl 99" to offload to a GPU build you swapped in).
localRunner.gpuLayers99YouModel layers offloaded to the GPU when accelerated (llama-server -ngl); 99 = everything. Lower it if the model does not fit in GPU memory. From 0 to 999.
localRunner.huggingFace.allowGatedfalseYouAllow installing from gated or private Hugging Face repositories using the stored access token. Off refuses them, so a token cannot be spent without asking.
localRunner.huggingFace.enabledtrueYouAllow searching Hugging Face and downloading GGUF models from it in Settings → Local models. Downloads are pinned to a commit and verified against the hash the Hub reports. Off hides the browser and leaves only the built-in catalogue.
localRunner.mlxEndpointYouApple silicon only: where mlx_lm.server (the MLX model server from the mlx-lm package) answers, including /v1. Leave empty for its default, http://127.0.0.1:8080/v1. Agents reach it as the mlx provider.
localRunner.modelqwen2.5-1.5b-instructYouWhich model the local runner serves — a catalogue id, or the id of a model you added from Hugging Face or a local file. Changing it downloads the new model on the next start. Settings → Local models lists what is available.
localRunner.port8087YouLoopback port the local runner listens on (http://127.0.0.1:&lt;port&gt;/v1). From 1024 to 65535.
localRunner.serverPathYouAbsolute path to a llama-server you built yourself, used instead of the pinned llama.cpp build. The workbench still supervises it, health-checks it and shows its log. Needed for GGUFs stock llama.cpp cannot load — a new architecture, or an out-of-tree tensor format such as a ROCm FP4 build. Leave empty to use the bundled build.
localRunner.startOnRequesttrueYouStart a downloaded model the first time an agent asks for it by name, beside whatever is already running. Off means an agent's request for a model that is not running fails with a message, rather than starting it or being answered by another model.
localRunner.threads0YouCPU threads for the local runner (0 = llama.cpp decides). From 0 to 256.

Chat

SettingDefaultSet inWhat it does
chat.autoMergetrueYou, Project, RepositoryReplaced by chat.mergeWhen. While chat.mergeWhen is not set, false here still means the work waits until you press Keep it.
chat.defaultSpecialistYou, ProjectThe specialist (its id on the Teams page) a new chat starts with, pinned from the Agent menu in Chat's composer. Empty, or a specialist this project does not have = the first specialist.
chat.gitIsolationtrueYou, Project, RepositoryStart chat agents in their own git worktree (their own branch and working copy) instead of the repository's folder. Several can then edit at once safely, and Edit from here can put a turn's files back. Their work is merged into the current branch when chat.mergeWhen says: once the conversation has been idle for a while (the default), when you press Keep it, or after every turn. This is the default for an agent that is not a specialist; a conversation can choose where it runs on its composer (This checkout, Own worktree or Last worktree), and that choice wins.
chat.mergeIdleMinutes10You, Project, RepositoryWith chat.mergeWhen set to idle: how many minutes a conversation sits without a turn before its agent's work is merged. From 1 to 1440.
chat.mergeWhenidleYou, Project, RepositoryWhen a chat agent working in its own worktree has its work committed, synced with the same rebase rules as team worktrees, and merged into the repository's current branch. Until then a turn's files can be put back with Edit from here; a turn already merged cannot. Conflicts are reported in the conversation instead of merged. One of: idle (Once the conversation has been idle for chat.mergeIdleMinutes, or when you press Keep it), keep (Only when you press Keep it), every-turn (After every turn (nothing is left for Edit from here to put back)).
chat.whileRunningsteerYou, ProjectWhat the send button does with a message typed while a turn is running. Ctrl+Enter (⌘+Enter on a Mac) does the other one for that message. One of: steer (Give it to the agent without stopping its work: Claude Code and the built-in agent read it with their next step, other agents when the turn ends (the conversation says which); Team Work hands it to the operations manager.), queue (Hold it in the conversation's queue and send it when the turn finishes.).
chat.worktreeCleanuppromptYou, Project, RepositoryWhat to do with a chat/solo agent's isolated git worktree when the agent stops — mirrors the team worktree cleanup options. One of: prompt (Ask what to do with the worktree when the agent stops), auto (Remove the worktree automatically (kept if it still has uncommitted changes)), manual (Keep worktrees, to clean up by hand later).

Chat approvals

SettingDefaultSet inWhat it does
chatApprovals.highaskYou, Project, RepositoryDefault approval policy for HIGH-risk tools (delete · execute commands) of chat/solo agents that are not part of a team. Keep on "ask" unless you fully trust the repository. One of: ask, auto.
chatApprovals.lowaskYou, Project, RepositoryDefault approval policy for LOW-risk tools (read · search · fetch) of chat/solo agents that are not part of a team. Teams configure their own policy in the team config. One of: ask, auto.
chatApprovals.mediumaskYou, Project, RepositoryDefault approval policy for MEDIUM-risk tools (edit · move files) of chat/solo agents that are not part of a team. One of: ask, auto.

Conversations

SettingDefaultSet inWhat it does
conversations.richContenttrueYou, Project, RepositoryDraw rich blocks in conversations: tables, stats, steps and file lists drawn from what agents write and from the blocks they send. Off, the words an agent writes show as plain Markdown. Blocks an agent sends itself (ui_render) still draw either way, because they are its answer; only what the app would derive from its text stops. The organisation's policy can turn this off for everyone, and then it wins over this setting.

Customisations

SettingDefaultSet inWhat it does
customisations.allowOwntrueYou, Project, RepositoryLet people add their own customisations from the workbench: create or upload skills, agents, prompts and instructions, share their own into a repository, and upload or create plugins. Turned off, the Add menus offer only what your organisation publishes; what people already have stays where it is. An organisation usually sets this for everyone.
customisations.briefAgentstrueYou, Project, RepositoryTell every agent the workbench starts what customisations the repository carries — skills, prompts, agents, instructions and MCP servers, one line each with the path — so a CLI that only reads its own folders can still use the others' on request. Items the CLI discovers by itself are left out, so the briefing costs a few lines, not the files.

DesignSystem

SettingDefaultSet inWhat it does
designSystem.added[]You, Project, RepositoryDesign systems your organisation or team offers that this repository added, by id (Settings → Design systems, Add to this repository): installed for everyone who works in it, while they are offered. A repository may commit it.
designSystem.defaultYou, Project, RepositoryThe design system this repository's agents load first, by its id, when neither your organisation nor your team has a default (Settings → Design systems, Make default for this repository). A repository may commit it; your organisation's policy may lock it.
designSystem.personalAdded[]YouDesign systems your organisation or team offers that you added, by id (Settings → Design systems, Add for me): installed in every repository on this computer, while they are offered.
designSystem.personalDefaultYouYour own default design system, by its id: the one agents load first in every repository on this computer when your organisation, your team and the repository name none (Settings → Design systems, Make my default).
designSystem.useByDefaulttrueYou, Project, RepositoryTell every agent the workbench starts to load the default design system before it makes any interface, page, deck, document or picture: your organisation's, else your team's, else this repository's, else your own (Settings → Design systems). Your organisation's policy may set this; turning the design system off for a repository stops the line there too.

Dev containers

SettingDefaultSet inWhat it does
devcontainer.autoDetecttrueYouOffer to open a folder in its dev container when it contains a devcontainer.json.
devcontainer.cliPathYouCommand that runs the Dev Containers CLI (@devcontainers/cli), used to build and start a container. Leave empty to use 'devcontainer' from PATH.
devcontainer.dockerPathYouPath to the Docker CLI used for dev containers. Leave empty to use 'docker' from PATH; 'podman' works too.
devcontainer.reopenModereplaceYouWhat happens when a repository is opened in its dev container. One of: replace (Opening a repository in its dev container replaces the local copy with the one in the container.), add (The copy in the container is added to the project beside the local one.).
devcontainer.useNpxfalseYouWhen the Dev Containers CLI is not installed, fetch and run it with npx. Off by default: it downloads a package from the network each time it is needed.

Dictation

SettingDefaultSet inWhat it does
dictation.enabledautoYouLet MojoFlow dictate into Chat and Team Work: a loopback Control API endpoint for companion apps plus a discovery file MojoFlow finds on its own (under WSL also in the Windows profile). Older true/false values still work as on/off. One of: auto (Start the dictation endpoint whenever MojoFlow is installed on this machine (its settings folder exists).), on (Always start the endpoint.), off (Never start it.).
dictation.port7433You, Machine, ProjectLoopback port for the dictation companion endpoint (0 = random). Must be reachable from Windows when the workbench runs in WSL, which localhost forwarding does by default.

Display

SettingDefaultSet inWhat it does
display.clocksystemYouHow times are shown everywhere in the workbench: a 12-hour or a 24-hour clock, or as this computer's region settings have it. One of: system (Follow this computer's language and region settings.), 12h (A 12-hour clock: 2:30 pm.), 24h (A 24-hour clock: 14:30.).
display.dateOrdersystemYouThe order of the day, month and year in every date the workbench shows, or as this computer's region settings have it. One of: system (Follow this computer's language and region settings.), dmy (Day, month, year: 26/10/2026, 26 October 2026.), mdy (Month, day, year: 10/26/2026, October 26, 2026.), ymd (Year, month, day: 2026-10-26, 2026 October 26.).
display.weekStartsystemYouThe day calendars and week strips start on. One of: system (Follow this computer's language and region settings.), monday (Weeks start on Monday.), sunday (Weeks start on Sunday.).

Dlp

SettingDefaultSet inWhat it does
dlp.labels.projectMarkYou, ProjectThe project's sensitivity mark, chosen on the project's page: a level (public, internal, confidential, restricted) or one of the organisation's labels (label:<id>). It is the floor of every session in the project and the sensitivity of its memory no labelling rule labels, never lower than the organisation's default. Empty: not marked.

Docs

SettingDefaultSet inWhat it does
docs.defaultFormatokfYou, Project, RepositoryThe format a new document is written in. Existing files keep whatever they are; 'Save as OKF' converts a plain one. One of: okf (Typed Markdown: front matter and [kind] section tags, so memory can index sections and the view can check the structure.), markdown (Plain Markdown with no marker or section tags.).
docs.folders["docs"]You, Project, RepositoryFolders, relative to the repository, whose Markdown files the Library lists. READMEs at the top level, agent instruction files, ADR folders, team roles and research notes are always documents.
docs.templatesFolderdocs/templatesYou, Project, RepositoryFolder, relative to the repository, whose Markdown files are the templates the Library offers for new documents — each with 'template:' (its name), 'summary:' and 'path:' in its front matter. The Library lists the folder as Templates so they can be edited in place.

Editor

SettingDefaultSet inWhat it does
editor.askchatYouWho answers when you ask AI to write or change text where you are writing (Ctrl+K in the built-in editor and the Library). One of: chat (Your chat model answers, else your default model, else a model on this computer — the best one the workspace policy allows.), local (Only a model on this computer answers. Nothing you ask leaves this computer, and nothing is spent.), off (No Ask AI in the built-in editor or the Library.).
editor.inlineCompletionlocalYouWhether the built-in editor suggests code as you type, and which model may do it. One of: off (No inline suggestions in the built-in editor.), local (Only ever complete with a local model — the bundled runner, or a local endpoint. Never spends money.), always (Also use the configured chat model, including a hosted one.).
editor.openFilesInbuilt-inYouWhere a file opens when something in the workbench opens one — a doc, a customisation, the workspace policy, a pipeline definition. Files outside the repository always go to the external editor. One of: built-in (Open repository files in the workbench's own editor, in the right pane. The editor's toolbar still offers your external editor for any file.), external (Hand every file to the external editor chosen under Settings → Projects & Editors.).

Facilitator

SettingDefaultSet inWhat it does
facilitator.chatEndpointYou, Machine, ProjectOpenAI-compatible endpoint the built-in editor's inline completion may use in its "always" mode (with facilitator.chatModel). Empty = only the local model completes code.
facilitator.chatModelYou, Project, RepositoryModel the built-in editor's inline completion uses in its "always" mode, at facilitator.chatEndpoint (empty = no hosted completion). Chat itself runs on your default runtime or the specialist you pick; this no longer changes it.
facilitator.chatProvidercopilotYou, Project, RepositoryHosted provider whose stored API key the built-in editor's inline completion sends with requests to facilitator.chatEndpoint in its "always" mode. Chat itself runs on your default runtime or the specialist you pick; this no longer changes it. One of: "", ollama, lmstudio, llamacpp, vllm, mlx, foundry-local, azure, bedrock, anthropic, gemini, xai, openrouter, kilo-gateway, groq, together, deepinfra, fireworks, deepseek, mistral, openai-compatible, copilot, native, cline, claude-code, codex, opencode, grok, kilo, acp-command.
facilitator.opsManagerModelYou, Project, RepositoryModel for the task board orchestrator (empty = the runtime's default; a local model needs one).
facilitator.opsManagerProvidercopilotYou, Project, RepositoryThe model source of the task board orchestrator (facilitator.opsManagerRuntime): for the built-in agent and other runtimes that take one, the provider whose key and base URL it routes through (local-runner = the local model on this computer). Empty or copilot = the runtime's own sign-in, or your default runtime when no orchestrator runtime is set. One of: "", ollama, lmstudio, llamacpp, vllm, mlx, foundry-local, azure, bedrock, anthropic, gemini, xai, openrouter, kilo-gateway, groq, together, deepinfra, fireworks, deepseek, mistral, openai-compatible, copilot, native, cline, claude-code, codex, opencode, grok, kilo, acp-command.
facilitator.opsManagerRuntimeYou, Project, RepositoryTask board orchestrator: the runtime the agent that plans, hands out and reviews a team's tasks runs on when the team's operations manager does not name a runtime of its own, and the runtime the team's Facilitator chats on. Empty = your default runtime. Specialists and team members that name a runtime keep theirs. Also takes catalogue:<id> for an agent CLI from the catalogue that speaks ACP and is installed (a terminal-only CLI cannot be this: it is not governed per call). One of: "" (Your default runtime (runtimes.default)), copilot (GitHub Copilot CLI), native (Built-in agent: comes with AI Workbench and runs any model server — local or hosted — through the proxy), cline (Cline in ACP mode), claude-code (Claude Code through its ACP adapter), codex (OpenAI Codex through its ACP adapter), gemini (Google Antigravity through its official ACP server), opencode (OpenCode in ACP mode), kilo (Kilo Code in ACP mode), acp-command (Custom ACP agent command (needs mjuWorkbench.enableCustomAcpAgents)).

Foundry Local

SettingDefaultSet inWhat it does
foundryLocal.endpointYou, Machine, ProjectFoundry Local OpenAI-compatible endpoint (including /v1). Found from the running service; leave empty to use the default port.

Git

SettingDefaultSet inWhat it does
git.autoCleanuptrueYou, Project, RepositoryAutomatically remove Git worktrees when team agents stop. When false, worktrees persist and must be removed manually
git.autoFetchMinutes5You, ProjectFetch 'origin' in the background at most this often while Source Control is in use, so ahead/behind counts against the remote are current. 0 turns the automatic fetch off; Source Control's fetch and sync actions still work. From 0 to 1440.
git.branchNamePatternfeature/{teamId}/{taskId}You, ProjectBranch name template; supports {teamId}, {taskId}, {agentName} placeholders
git.branchPrefixfeat/You, Project, RepositoryThe start of the name of the branch each approved plan gets: its work merges there, and you merge it into main or open a pull request when the plan is finished. With feat/, a plan to add sales quotes works on feat/add-sales-quotes. A plan made while you are on a branch of your own uses that branch instead.
git.checkCombinedWorktrueYou, Project, RepositoryBefore approved work is merged, run the repository's test, lint and type-check commands (the ones Set up this repository for agents wrote into AGENTS.md) on the work put together, whenever a task's work is merged with work it did not have. A failure holds the merge and goes back to the member whose merge it was. Nothing is checked in a repository that names no commands, and a check that cannot run never holds anything.
git.conflictResolver.autoApprovetrueYou, Project, RepositoryLet the dedicated resolver edit and commit inside the worktree without per-tool approval prompts. Its scope is one in-progress merge in one worktree.
git.conflictResolver.endpointYou, Machine, ProjectOpenAI-compatible endpoint override for the resolver (empty = the provider's default).
git.conflictResolver.modein-sessionYou, Project, RepositoryWho resolves merge conflicts when a worktree is merged back and the merge stops on conflicts. One of: in-session (The agent already responsible (operations manager, else the assignee; the chat agent for chat merges) resolves conflicts in its own session.), dedicated (Start a one-shot resolver agent in the worktree on the runtime below (your default runtime unless you pick another); it resolves, commits and is stopped. Falls back to in-session when it cannot start or finish.).
git.conflictResolver.modelYou, Project, RepositoryModel for the dedicated resolver (empty = the backend's default; the local runner serves one model).
git.conflictResolver.providerYou, Project, RepositoryHosted or local provider the resolver's runtime routes through (inference runtimes only). Empty = the runtime's own sign-in. Set it to local-runner to use the bundled local model.
git.conflictResolver.runtimeYou, Project, RepositoryAgent runtime for the dedicated conflict resolver (same choices as a team member). Empty = your default runtime, on its own sign-in. Also takes catalogue:<id> for an agent CLI from the catalogue that speaks ACP and is installed (a terminal-only CLI cannot be this: it is not governed per call). One of: "", copilot, native, cline, claude-code, codex, gemini, opencode, kilo, acp-command.
git.conflictResolver.timeoutMinutes10You, Project, RepositoryHow long the dedicated resolver may take before the in-session fallback runs. From 1 to 120.
git.defaultBranchmainYou, Project, RepositoryBranch name for repositories the workbench initialises.
git.landingMessageModeloffYou, Machine, ProjectWho writes the commit message of the merge that brings approved work in. Off keeps git's own message. Turn it on and a named specialist (the one your routines use) reads the work's changes and writes a subject and a short body; any failure falls back to a message built from the task's title, kind and folder, and nothing is shown. The author stays you and the trailer is unchanged. One of: off (Merges keep git's own message.), cheapest (A specialist writes the merge's subject and body from the work's diff (cut to a size limit). If it fails, the message built from the task is used.).
git.mergeStrategyaskYou, Project, RepositoryHow a feature branch is merged back to the default branch from the app. One of: direct (Merge the feature branch into the default branch locally and push it), pull-request (Push the branch and open a pull request (GitHub CLI, falls back to the compare page)), ask (Ask which of the two to use each time).
git.pushAfterLandingfalseYou, Project, RepositoryPush the branch approved work merges into — the branch your checkout is on, main or a feature branch — to 'origin' after the merge. When nobody sets it, an organisation's project pushes (so the others see the work) and any other project does not: merging is local, so that branch is ahead of the remote until you push. Set it, on or off, and that wins. A branch the workspace policy protects is never pushed, and a failed push is reported and never blocks the merge.
git.useFeatureBranchesfalseYou, ProjectCreate a feature branch per task instead of working directly on a rebased default branch
git.worktreeBasePathYou, Machine, ProjectBase directory for Git worktrees. When empty, worktrees are created in a sibling '.mojoup-worktrees' folder next to the repository root
git.worktrees.cleanStaleAfterDays0You, Machine, ProjectWhen the workbench starts, remove the stale worktrees of this repository that have sat unused for this many days, and say how many in the Inbox. A worktree is stale when it has no uncommitted changes and its branch is merged, its branch is gone, or nobody has touched it for 14 days; one a running agent uses, one with changes and the main checkout are never removed. 0 turns it off; Source Control's Clean up stale button always works. From 0 to 365.

GitHub

SettingDefaultSet inWhat it does
github.oauthClientIdYouClient ID of the GitHub OAuth App used for the in-app device-flow sign-in. Empty = sign in through the GitHub CLI (gh) only.

History

SettingDefaultSet inWhat it does
history.autoArchiveIdleDays0You, ProjectArchive a Chat, Research or Team Work conversation once it has been idle this many days. Archived conversations are kept and searchable, and leave the main history list; pinned and running ones are never archived. 0 turns it off. From 0 to 365.
history.keepDays30You, Project, RepositoryHow many days of agent activity this computer keeps for Agent history and the activity graph. Every event of a session is kept for that long; parts of the history older than this are removed. From 1 to 3650.

Home

SettingDefaultSet inWhat it does
home.feedtrueYouShow the feed on Home: a day strip for the week ahead and one card at a time for what needs you, what finished and what changed. Off, Home is the board: the same things as tiles, three abreast.

Hooks

SettingDefaultSet inWhat it does
hooks.allowedeveryoneYou, Project, RepositoryWho may add hooks — commands that run at set points in an agent's work — through the workbench. One of: everyone (People may add and change their own hooks, and the organisation's are added too.), organisation (Only hooks your organisation publishes are written by the workbench: people add the ones it offers, and the ones it installs are put in place for them. Hooks already in people's files are left as they are.), off (The workbench writes no hooks and takes away the ones your organisation installed. Hooks already in people's files are left as they are.).

Identity

SettingDefaultSet inWhat it does
identity.emailYouYour email address, kept with your name on the projects this computer keeps. It is how your past work is matched to you when a project is later shared with a team or your organisation. Optional.
identity.nameYouYour name, as your work is signed: on a project's roadmap, tasks and activity, and on comments you leave. Empty: your computer's user name. When you join a team or sign in to your organisation, the name they know you by is used there.

Interface

SettingDefaultSet inWhat it does
ui.colorModeautoYouLight or dark, or follow the system’s theme. One of: auto (Follow the VS Code colour theme.), light (Always light.), dark (Always dark.).
ui.designSystemglassYouWhich Mojo Up theme the workbench uses. One of: glass (Mojo Up (Glass): translucent surfaces over a soft backdrop.), solid (Mojo Up (Solid): the opaque teal-on-mouve system MojoFlow uses.).
ui.developerViewsfalseYouShow the developer-facing Debug view. (Architecture is a view like any other and is always in the sidebar.)
ui.locationsidebarYouNot used by the desktop app, which owns its own window; kept so a value from an older settings file is recognised and ignored. One of: sidebar, panel.
ui.workspaceViewcardsYouHow the Workspace view shows running agents. One of: office (The pixel-art office: agents at desks, animated by what they do.), cards (Agent cards: who each agent is, their board task, what they are doing now and recently.).

Language models

SettingDefaultSet inWhat it does
llm.costMap.autoRefreshtrueYou, Project, RepositoryPeriodically download the LiteLLM model pricing and context-window map so cost estimates stay current. Cached locally and used offline. Turn off to use only the pricing built into the app.
llm.costMap.urlhttps://raw.githubusercontent.com/BerriAI/litellm/main/model_prices_and_context_window.jsonYou, Project, RepositorySource URL for the model pricing map. Must be HTTPS. Point at a mirror if the default is unreachable from your network.
llm.currencyYou, ProjectISO 4217 code used to display model spend (for example AUD). Leave empty to follow your computer's locale.
llm.currencyRate0You, ProjectPin the USD to display-currency rate. Zero fetches the rate automatically. At least 0.
llm.currencyRates.autoRefreshtrueYou, ProjectRefresh exchange rates automatically from the rates URL.
llm.currencyRates.urlhttps://api.frankfurter.dev/v1/latest?base=USDYou, ProjectExchange-rate source (Frankfurter-compatible JSON).
llm.dailyBudget0You, Project, RepositoryDaily spend cap across all agents on paid providers, in the currency your provider's list prices are quoted in. Requests are refused with HTTP 403 once the cap is reached. 0 disables the cap. Local providers are always free and never counted. At least 0.
llm.mcpToolProxy.allowTools[]You, Project, RepositoryWhen non-empty, only these tool names are exposed to agents. The way to give a weak local model five tools instead of forty.
llm.mcpToolProxy.denyTools[]You, Project, RepositoryTool names hidden from agents even when allowed.
llm.mcpToolProxy.enabledfalseYou, Project, RepositoryExecute MCP tool calls inside the proxy instead of passing them back to the agent. Useful for weak local models: the tool round trip never reaches the CLI. Agents on a runtime that runs its own tool servers (Claude Code, Codex, Copilot) are unaffected.
llm.mcpToolProxy.servers[]You, Machine, ProjectMCP servers the proxy aggregates and exposes to local agents.
llm.perAgentDailyBudget0You, Project, RepositoryDaily spend cap for each individual agent on paid providers. Stops one runaway agent exhausting the shared budget. 0 disables the per-agent cap. At least 0.
llm.redactPatterns[]You, Project, RepositoryYour own redaction rules, applied after the secrets and personal-data patterns to everything bound for a hosted provider: customer or ticket ids, internal hostnames, project codenames — anything a regular expression can name. Built and tried out under Settings → Security → Repository policy. A repository may commit its own, so the rules travel with the code.
llm.redactPiitrueYou, Project, RepositoryRedact personal data — email addresses, phone numbers, payment card numbers, IBANs, tax file and social security numbers — from message content before it leaves the machine for a hosted provider, alongside the secrets redaction. Pattern-based, so it needs no classifier; the classifier in .mojoup/policy.json adds names, addresses and sensitivity on top. Local providers are never redacted.
llm.redactSecretstrueYou, Project, RepositoryRedact API keys, tokens and private keys from message content before it leaves the machine for a remote provider. Local providers (Ollama / LM Studio) are never redacted — nothing leaves the machine, and an agent debugging an auth failure needs to see the credential.
llm.requestsPerMinute0You, Project, RepositoryMaximum proxied requests per minute per agent. Requests over the limit are refused with HTTP 429 so the caller retries rather than gives up. 0 disables rate limiting. At least 0.

Local context

SettingDefaultSet inWhat it does
localContext.autoCompacttrueYou, Project, RepositoryAutomatically compact a local agent's conversation (context reset + task resume prompt) when it nears the model runner's loaded context window. Prevents the truncation/empty-stream failures local models hit when the conversation outgrows num_ctx / the loaded context length.
localContext.compactThreshold0.75You, Project, RepositoryFraction of the local model's context window at which auto-compaction triggers (0.75 = compact when 75% full). From 0.4 to 0.95.
localContext.handofftrueYou, Project, RepositoryBefore compacting a full context window, ask the agent for a handoff note (kept on the task and in memory) so the fresh context starts from where it stopped.

Local model

SettingDefaultSet inWhat it does
localModel.declinedfalseYouYou said you don't want a local model on this computer. Nothing is downloaded, the local model service stays off, and the workbench stops suggesting one. Choose a local model in Settings → Setup to change your mind.
localModel.recoveryAttempts3You, Project, RepositoryHow many times the local-model proxy retries a request when the runner itself has fallen over (refused connection, HTML 500) — typically a large model being reloaded into VRAM. Raise it for slow-loading MoE models such as Qwen3; 0 fails the agent's turn on the first refusal. From 0 to 10.
localModel.recoveryMaxWaitSeconds45You, Project, RepositoryLongest the proxy waits for a crashed or reloading local model to come back, per retry. Waits ramp 5s, 20s, then this ceiling, and end early the moment the runner answers a health probe — so a higher value costs nothing when recovery is fast, and buys a slow model the time it actually needs. From 5 to 600.
localModel.sharetrueYouLet repositories in a WSL distro or container on this computer use the model this computer already serves — on Windows, the GPU-backed runner for every distro, checked for reachability from each one first. A repository whose workbench serves its own model keeps using it.
localModel.streamIdleTimeoutSeconds180You, Project, RepositorySilence between streamed chunks that means the local runner died mid-answer. Armed only after the first chunk arrives, so slow prefill is never cut short. Raise it if a model that is genuinely still generating gets cut off. From 30 to 1800.

Local proxy

SettingDefaultSet inWhat it does
localProxy.enabledtrueYou, Project, RepositoryRoute Ollama / LM Studio agents through the built-in compatibility proxy. The proxy repairs message and tool-call formats between the agent's runtime and the local server (array content, missing tool-call ids, namespaced/mangled tool names, wrong finish reasons, reasoning fields, empty streams) and records live metrics for the Inference view. Hosted members (Claude Code, Codex, Cline, every runtime that takes a model source, the built-in agent on a stored key) route through it too, so the provider key stays in the proxy rather than the agent's environment. Disable to connect agents directly to the endpoint, which hands them the key.

Loop breaker

SettingDefaultSet inWhat it does
loopBreaker.repeatThreshold6You, Project, RepositoryHow many times the same substantial line must repeat within one turn (with no completed tool call in between) before the loop breaker cancels it. Raise this if agents are being cancelled while legitimately working. From 3 to 20.

MCP servers

SettingDefaultSet inWhat it does
mcp.connectors[]YouYour own connectors (Settings → Connectors, "Just me"): MCP servers every agent the workbench starts on this computer can use, in every repository. Each is { name, transport: "http", url } for a remote server or { name, transport: "stdio", command, args, env } for a program on this computer; keys go in env as ${secret:NAME}, never as values. They always go through the workbench's tool gate, which signs in to a remote server for the agents (OAuth) and holds the token. Your organisation can lock this list.
mcp.reportInventorytrueYou, Project, RepositoryTell your organisation which tool servers (MCP servers) this repository's agents are given and which tools each one offers, so it can see what is in use and review it. Sent only when this workbench is signed in to an organisation: each server's name, how it is started or reached as the repository writes it, and its tools' names and descriptions — never a credential's value. To read a server's tool list the workbench starts it once in the background.
mcp.shareRepoServerstrueYou, Project, RepositoryAttach the repository's MCP servers (.vscode/mcp.json and .mcp.json, minus any disabledServers) to every agent session the workbench starts, whatever CLI runs it — Copilot CLI, Claude Code, Codex, Gemini or OpenCode — so instructions and skills that use an MCP tool work across runtimes. Local models on the lite toolset are excluded. VS Code-style ${env:VAR} and ${workspaceFolder} references are expanded; servers needing ${input:…} prompts are skipped.
mcp.toolPermissions{}YouWhat agents may do with each connector's tools (Settings → Connectors → Tool permissions): { <server fingerprint>: { <tool>: "allow" | "ask" | "off" } } — Always allow, Needs approval (held for a person, like any other approval) or Blocked (agents are not shown it). A tool left out gets Needs approval when its server marks it destructive, else Always allow. The workspace policy's tool rules can only make these stricter.

Media

SettingDefaultSet inWhat it does
media.images.credentialYou, ProjectWhich of the provider's named keys makes images. Empty: the provider's own key. A named key that is missing is missing — it never falls back to the provider's own.
media.images.endpointYou, Machine, ProjectFor an OpenAI-compatible service only: its address, including /v1 (https://api.openai.com/v1 for OpenAI itself). A named key's own address wins.
media.images.localYou, Machine, ProjectThe address of an image server on this computer or your network — ComfyUI, stable-diffusion.cpp's sd-server, LocalAI or Ollama (http://localhost:8188). Empty: the usual local ports are tried. Nothing is bundled; images made there cost nothing and are what a local-only policy allows.
media.images.modelYou, ProjectThe image model (on Azure, the deployment's name). Empty: the provider's usual image model.
media.images.providerYou, ProjectWhat makes AI images (covers, styled pictures, illustrations): an API provider you have a key for (azure, openai-compatible, bedrock, gemini, together, fireworks, openrouter, xai, fal, higgsfield), your ChatGPT plan through Codex (codex), the image runner the workbench downloads (image-runner: stable-diffusion.cpp on this computer, nothing leaves the machine; Settings › Local models › Images), or an image server on this computer (local-images). Empty: the first one that is ready. Your organisation's policy may turn AI images off or limit the providers.
media.video.modelYou, ProjectThe video model, as its path on the provider (fal-ai/kling-video/v2.5-turbo/pro/text-to-video). Empty: fal's usual model. Higgsfield has no usual model: name the one your account has.
media.video.providerYou, ProjectWhat makes AI video (short clips an agent such as the Designer asks for): fal or Higgsfield, with the same key that makes AI images. Empty: the first one that is ready. Your organisation's policy may turn AI media off or limit the providers.
media.video.timeoutMinutes15You, ProjectHow long one video may take before the workbench asks the provider to stop it. A clip usually takes a few minutes; a provider's queue can be longer. From 2 to 60.

Memory

SettingDefaultSet inWhat it does
memory.autoBuildtrueYou, Project, RepositoryBuild the knowledge graph automatically (local AST pass — free, offline) when the repository has none.
memory.autoInstallGitHookstrueYou, Project, RepositoryInstall graphify's post-commit/post-checkout rebuild hooks and the graph.json union-merge driver automatically, so the memory graph stays current across the whole git lifecycle.
memory.autoInstallSkillfalseYou, Project, RepositoryRetired and ignored. Earlier versions copied the graphify skill into the repository's assistant folders; agents started by the workbench are now given the project's memory directly, and nothing is installed. The key is kept so settings files that carry it stay valid.
memory.automationwatcherYou, Project, RepositoryHow the memory graph stays current. One of: watcher (The workbench watches the repository and re-indexes changed files (nothing is written to .git).), hooks (graphify's git hooks and merge driver keep the graph current across commits and checkouts (writes to .git/hooks and .git/info/attributes).), off (Update the graph manually or from the memory tools only.).
memory.autoProvisiontrueYou, Project, RepositoryAutomatically install the Graphify memory engine (PyPI package 'graphifyy') into a private Python environment the workbench manages, when it is not found on PATH.
memory.embeddingModelYouThe model this desktop's own memory (its private hub, and the hub it runs for a team) is found by meaning with, from the catalogue. Empty: the catalogue's default (nomic-embed-text-v1.5). The organisation's memory uses the model its policy names.
memory.embeddingRuntimeautoYou, Machine, ProjectWhat reads memory for meaning on this machine. It never downloads or pulls a model by itself. One of: auto (Automatic: the bundled local model, then Ollama, then LM Studio — whichever has the memory's model — and a hosted model last, only where it is allowed.), local-runner (The bundled local model runner (llama.cpp), with the model for finding by meaning downloaded from the Memory view.), ollama (Ollama, with the model pulled (ollama pull nomic-embed-text:v1.5), at mjuWorkbench.ollamaEndpoint.), lm-studio (LM Studio, with the model loaded, at mjuWorkbench.lmstudioEndpoint.), hosted (A hosted model, with its key stored in the workbench; only when the memory's model is a hosted one and it is allowed.), off (Off on this machine: nothing it writes or asks is found by meaning.).
memory.embeddingslocal-onlyYou, Project, RepositoryFind memory by meaning as well as by words: "how do we bill customers" finds the billing ledger even when it never says "bill". The organisation's policy (memory.embeddings) wins over this. One of: local-only (On this machine only: memory is found by meaning with a model on this computer (the bundled local model, Ollama or LM Studio), and by words when there is none.), allowed (A hosted model may also be used, for public and internal memory only. Confidential and restricted memory never leaves this computer to be embedded.), off (Off: memory is found by words only.).
memory.enabledtrueYou, Project, RepositoryMaster switch for the graph memory. Off: nothing is provisioned or indexed, agents are not briefed on memory tools and the memory tools answer 'disabled'. Git hooks already installed stay until you remove them from the Memory view.
memory.graphifyPathYou, Machine, ProjectPath to the graphify CLI executable. Leave empty for auto-detection (PATH, then a private environment managed by the app).
memory.knowledge.sources[]You, Machine, ProjectExtra folders whose files belong to knowledge memory wherever they are — an Obsidian project subtree, a notes folder. Absolute paths as the workbench sees them where the repository lives (a repository in WSL needs a WSL path), or paths relative to the repository. Repository docs, ADRs, plans, research, instruction files and every Markdown or text file are knowledge already.
memory.semanticBackenddefault-runtimeYou, Machine, ProjectWho reads the docs, PDFs and images for the knowledge graph. Code is always mapped on this computer, for free. The default is your default runtime, on its own sign-in; a hosted provider uses the key stored in the workbench (Settings → Models); a local model keeps everything on this computer but needs one set up. One of: default-runtime (Your default runtime reads them, on its own sign-in (Claude Code, Codex, Copilot CLI or Antigravity) — what your agents already use, at the cost you already pay. A runtime that cannot read documents leaves memory to code only and says so.), auto (Automatic: a key in the environment, a local model or local server that is running, then a provider key stored in the workbench, else code only. Can use a local model; the default does not.), env (Only use an API key from the environment (GEMINI_API_KEY, ANTHROPIC_API_KEY, OPENAI_API_KEY, …).), lmstudio (LM Studio server (uses mjuWorkbench.lmstudioEndpoint; first loaded model unless semanticModel is set).), ollama (Ollama server (uses mjuWorkbench.ollamaEndpoint; first available model unless semanticModel is set).), unsloth (Unsloth Desktop server (uses mjuWorkbench.unslothEndpoint and the API key stored in the workbench, which it requires on every request; first available model unless semanticModel is set).), local-runner (The bundled local model runner (llama.cpp) the workbench downloads and serves itself — set up in Settings → Setup. Uses the model it is serving unless semanticModel is set.), claude-code (Claude Code, on its own sign-in (a Pro / Max plan) — no API key. One chunk at a time through the claude CLI; semanticModel optional (e.g. sonnet, haiku).), codex (OpenAI Codex, on its own sign-in — no API key. Each chunk is one turn of the CLI, so it is slower than an API; semanticModel optional.), copilot (GitHub Copilot CLI, on its own sign-in — no API key. Each chunk is one turn of the CLI and spends premium requests; semanticModel optional.), antigravity (Google Antigravity, on its own sign-in — no API key. Each chunk is one turn of the CLI; semanticModel optional.), azure (Azure OpenAI / AI Foundry — needs mjuWorkbench.azure.endpoint and semanticModel.), bedrock (Amazon Bedrock — the region from mjuWorkbench.bedrock.region, a Bedrock API key and semanticModel (a Bedrock model id).), anthropic (Anthropic Claude, using the key stored in the workbench. semanticModel optional.), gemini (Google Gemini, using the key stored in the workbench. semanticModel optional.), xai (xAI (Grok) — an xAI API key and semanticModel.), openrouter (OpenRouter, using the key stored in the workbench. semanticModel required.), groq (Groq, using the key stored in the workbench. semanticModel required.), together (Together AI, using the key stored in the workbench. semanticModel required.), deepinfra (DeepInfra, using the key stored in the workbench. semanticModel required.), fireworks (Fireworks AI, using the key stored in the workbench. semanticModel required.), deepseek (DeepSeek, using the key stored in the workbench. semanticModel required.), mistral (Mistral AI, using the key stored in the workbench. semanticModel required.), openai-compatible (Custom OpenAI-compatible server — needs an endpoint and semanticModel.), off (Never run the semantic pass — index code only (docs/PDFs/images are skipped).).
memory.semanticModelYou, Machine, ProjectModel for the semantic pass. Empty = the first model the local server reports (LM Studio / Ollama), or the backend's own default (Anthropic / Gemini). Every other cloud provider needs this set explicitly. Use Select Memory Semantic Backend & Model to pick from a live model list.
memory.semanticSchedulenightlyYou, Project, RepositoryWhen the memory model reads changed documents. Code is always kept current for free; reading documents uses the model chosen for memory and can cost money. One of: nightly (Once a night (between 1 and 6 in the morning, when the workbench is running), documents changed since the last pass are read with the memory model. Agents' updates and the file watcher only refresh code, which costs nothing.), manual (Only when you press Rebuild or Update in the Memory view.).
memory.shareGraphfalseYou, Project, RepositoryShare the memory map with the repository: graphify-out/graph.json is committed (nothing else in graphify-out/), and a merge driver in .git/info/attributes joins two people's maps instead of leaving a conflict. Off: the map stays on this computer and no merge driver is installed. An organisation's project does not need it: its memory is kept with the organisation, labelled and filtered by each person's clearance; turning it off offers to stop tracking a graph.json already committed.

Mesh

SettingDefaultSet inWhat it does
mesh.autoUpdateinstallYouHow the organisation's mesh agent (aioe-mesh) keeps itself current. It is fetched from the platform this machine is signed in to — Mojo Up AI Cloud, or an Enterprise organisation's own, which offers each ring the version it approved — only when that organisation offers a mesh and the Mesh switch is on; a machine deployed without a mesh never fetches one. One of: off (Never fetch the mesh agent from the release feed: run the one this build carries, if any.), notify (Check the feed with the app's own update check and say when a newer agent is out; install it from the Updates pane.), install (Check and install a newer agent as soon as the platform offers it to this machine, restarting the agent; the previous one is put back if the new one does not start.).

Model gateway

SettingDefaultSet inWhat it does
gateway.externalUrlYou, Machine, ProjectExternal gateway base URL including /v1 (e.g. http://localhost:4000/v1 for LiteLLM). Its API key goes in the "Gateway (OpenAI-compatible)" row under Settings → Inference gateways.
gateway.modeembeddedYou, Machine, ProjectWhere the inference gateway runs. One of: embedded (The inference gateway runs inside the workbench for this repository (stops when it restarts).), sidecar (A supervised gateway process that survives restarts and can serve other tools on this computer (Claude Code, every runtime that takes a model source, curl).), external (Route hosted providers to an external OpenAI-compatible gateway such as LiteLLM (mjuWorkbench.gateway.externalUrl); local providers stay direct.).
gateway.port7432You, Machine, ProjectLoopback port for the gateway sidecar (0 = random).

Native

SettingDefaultSet inWhat it does
native.maxConsecutiveToolFailures3You, ProjectHow many malformed calls to the same tool in a row the built-in agent tolerates before it abandons the turn — a model that cannot form valid arguments does not learn to on the twentieth attempt. From 1 to 20.
native.maxToolIterations24You, ProjectHow many tool calls the built-in agent (the native runtime) makes in one turn before it stops and reports. Small local models loop; a larger budget lets a capable model finish a longer task. From 1 to 200.
native.maxToolResultChars30000You, ProjectThe longest tool result the built-in agent hands back to the model, in characters; longer ones are cut with a note. Raise it for models with a large context window. From 1000 to 400000.

Node

SettingDefaultSet inWhat it does
node.acceptsDispatchFrom[]YouHeadless node only: whom the node itself accepts work from (project:<id>, group:<name>, user:<id>, tenant). Empty leaves it to the organisation's assignment. A node can narrow its audience here, never widen it.
node.approvalHoldSeconds1800YouHeadless node only: how long a tool-permission request is held once it has reached the organisation's inbox (the person's phone and console) before the node denies it. Never shorter than the timeout above. From 10 to 3600.
node.approvalTimeoutSeconds300YouHeadless node only: how long a tool-permission request waits for a remote approval (console, phone, a paired desktop) before the node denies it. Nobody answering means no. From 10 to 3600.
node.autoUpdateinstallYouHeadless node only: whether the node looks for a new version from where it was installed, and installs it. Install is the default; an install waits while the node's agents are at work. The organisation's policy, or notify or off set here, wins. MOJOUP_DISABLE_AUTO_UPDATE=1 in the node's environment turns this off whatever it says. One of: off (Never look for a new version by itself.), notify (Look every few hours and say so in the node's log and mojoup-node status.), install (Look every few hours and install a new version once the node is idle (no agent at work, no approval waiting): it is tried first, and the node stays on the version it has if the new one does not start.).
node.computer.displayheadlessYouHeadless node only: how that computer is drawn. One of: headless, xvfb, vnc, native.
node.computer.kindoffYouHeadless node only: the remote computer use the node offers (role computer): a browser, a whole desktop, or none. One of: off, browser, desktop.
node.computer.sessions0YouHeadless node only: the most computer-use sessions at once (0 = not stated). At least 0.
node.consent.modelDownloadfalseYouHeadless node only: the answer to "download the llama.cpp build and this model?", which a desktop asks in a dialog. Off declines, so a node never downloads gigabytes nobody agreed to.
node.consent.organisationPolicyreplaceYouHeadless node only: when the organisation publishes a policy for a repository that already has its own .mojoup/policy.json, replace it with the organisation's (the default on a managed node) or keep the repository's. One of: replace, keep.
node.display.monoautoYouHeadless node only: whether mojoup-node's screens draw in plain ASCII, saved on this node (Preferences). --mono and MOJOUP_NODE_MONO win for the run they are given in. One of: auto (Plain ASCII where the terminal cannot show the glyphs (a Linux console, an old Windows console, a locale that is not UTF-8).), on (Always plain ASCII: no banner, no QR code, no special glyphs.), off (Always the full glyphs.).
node.display.mouseautoYouHeadless node only: whether mojoup-node's framed-panel (Ink) dashboard takes the mouse — click a request, a host, a choice or a palette row, scroll with the wheel, drag to select log lines — saved on this node (Preferences). While it does, Shift-drag (Option-drag in macOS Terminal and iTerm2) selects text the terminal's own way. The standard dashboard and the REPL never take it. --mouse, --no-mouse and MOJOUP_NODE_MOUSE win for the run they are given in. One of: auto (The framed-panel (Ink) dashboard takes the mouse at a desk, not over SSH.), on (The framed-panel dashboard always takes the mouse, over SSH too.), off (Never: keys only, and the terminal's own selection works without a modifier.).
node.display.quietfalseYouHeadless node only: no bell or notification when something new waits for you while the terminal is not in front (the title still counts them), saved on this node (Preferences). --quiet and MOJOUP_NODE_QUIET win for the run they are given in.
node.display.rendererinkYouHeadless node only: which renderer draws mojoup-node's dashboard and its screens, saved on this node (Preferences). ink, the framed panels, is the default (D285); it falls back to classic, saying why, on a dumb terminal and the Linux console. --renderer and MOJOUP_NODE_RENDERER win for the run they are given in. One of: ink (The dashboard and its screens as framed panels, drawn with Ink (the default).), classic (The classic dashboard in plain lines.).
node.display.screenautoYouHeadless node only: how mojoup-node's REPL uses the terminal, saved on this node (Preferences). --scrollback, --fullscreen and MOJOUP_NODE_SCREEN win for the run they are given in. One of: auto (Over SSH the REPL writes into the terminal's own scrollback; at a desk it takes the whole screen.), scrollback (Always write into the terminal's own scrollback, above a small live footer.), fullscreen (Always take the whole screen.).
node.display.themeautoYouHeadless node only: the terminal's background for mojoup-node's screens, saved on this node (Preferences in its command palette). MOJOUP_NODE_THEME wins for the run it is set in. One of: auto (Ask the terminal (COLORFGBG, a colour query) and take dark when it does not say.), light (The terminal's background is light: darker colours for muted text.), dark (The terminal's background is dark.).
node.homeYouHeadless node only (mojoup-node): the folder the node clones repositories into and runs agent runtimes from, reported to the organisation as the node's home. Empty uses the node's user home directory.
node.maxConcurrentAgents0YouHeadless node only: the most agents the node runs at once, as offered in its manifest (0 = no limit offered; the organisation's assignment quota still applies). At least 0.
node.modelServerUrlYouHeadless node only: an OpenAI-compatible model server inside the node's cluster (MOJOUP_NODE_MODEL_SERVER_URL in the container image), to be offered as the node's inference source. Empty offers none.
node.nameYouHeadless node only: the name the organisation lists this node under (mojoup-node join --name). Empty uses the hostname.
node.ownerorgYouHeadless node only: who the node is offered as belonging to in its manifest — the organisation (a shared node), the person who joins it (their own box) or one project. The approver decides; this is what the node proposes. One of: org, user, project.
node.questionTimeoutMinutes30YouHeadless node only: how long a question a job raises while it brings a project's architecture up to date (a workbench that will not start, a repository nobody can update, a redraw held for review) waits for an answer from the Inbox, the phone or the node's dashboard. Nobody answering takes the safe choice: going on without a repository that cannot be reached, and using a stale one as it stands. From 1 to 1440.
node.repositorySetuprequiredYouHeadless node only: "Set up for agents" with nobody to tick the list. Required writes only what the organisation requires (its installed hooks) into each repository the node serves, when its workbench starts and every hour, keeping the repository's own text; off writes nothing. A person sets up the rest from the workbench. One of: required (Write what the organisation requires into each repository the node serves.), off (Never write the set-up into a repository.).
node.roles["teams"]YouHeadless node only: what the node is offered for, beside what it detects. teams is always offered; inference and dlp are added when the local runner serves a model (dlp when it serves the model a repository's DLP classifier names); sandbox and computer are offered only when listed here and configured under node.sandbox.* and node.computer.*.
node.sandbox.egresspolicyYouHeadless node only: sandbox network access — through the node's policy, or none at all. One of: policy, none.
node.sandbox.engineoffYouHeadless node only: where the node runs each agent session in a sandbox. Docker (or podman) uses NVIDIA OpenShell on this machine; kubernetes runs each session in its own pod in the node's own cluster (a node deployed from the Compute view sets this); auto is kubernetes inside a cluster's pod and off elsewhere. Off offers none. One of: off, docker, podman, kubernetes, auto.
node.sandbox.images[]YouHeadless node only: the sandbox images the node offers (at most 32). Empty offers the Mojo Up agent sandbox image (ghcr.io/mojo-up/agent-sandbox:stable).
node.sandbox.maxConcurrent0YouHeadless node only: the most sandboxes at once (0 = not stated). At least 0.
node.stateDirYouHeadless node only (mojoup-node): where the node keeps its settings, projects, secrets, key file, mesh state and status.json. Read from /etc/mojoup/node.json (%ProgramData%\MojoUp\node.json on Windows) or the MOJOUP_NODE_STATE_DIR environment variable; empty uses ~/.mojoup/node, or /var/lib/mojoup/node when the node runs as root.
node.tags[]YouHeadless node only: mesh policy tags the node asks for when it joins and runs (tag:gpu, tag:linux). The approver may change them; assignment happens in the organisation's console, never here.

Notifications

SettingDefaultSet inWhat it does
notifications.muted[]YouProjects you have muted, by their id on this desktop. A muted project's notifications still arrive in the inbox, but they never raise an operating-system notification and do not count on the bell.
notifications.osunfocusedYouWhen the operating system should tell you about an agent waiting on a permission, an update, a repository's workbench that stopped, or a warning from one, while you were elsewhere. One of: unfocused (Only when the app is not the window you are in — minimised, behind something else, or in the tray.), always (Whenever it happens, even while you are looking at the workbench.), never (Never; everything stays inside the app.).
notifications.quietDays[]YouWhole days that are quiet, such as the weekend. They work like quiet hours all day long: the inbox and the bell still fill, the operating system stays silent, and an approval asked of you by name still reaches you.
notifications.quietHoursYouQuiet hours, as HH:MM-HH:MM in this computer's local time (22:00-07:00 runs across midnight). Empty means none. During quiet hours anything that needs you still arrives in the inbox and counts on the bell, but the operating system stays silent — except for an approval someone asked of you by name, which still reaches you. While you are signed in to an organisation whose platform holds your quiet hours (set on its console), those replace these and this setting waits; signed out, it applies again.

Observability

SettingDefaultSet inWhat it does
observability.otlpEndpointYouOTLP/HTTP collector base URL (e.g. http://localhost:4318). Every gateway request is exported as a span with tokens, cost, repairs and policy decisions. Empty = off.
observability.otlpHeaders{}YouExtra headers for the OTLP collector (e.g. an Authorization header).

Operations

SettingDefaultSet inWhat it does
ops.maxDispatchesPerTask3You, Project, RepositoryMaximum times an ops run may (re)dispatch the same task before flagging it needs-human-review. From 1 to 10.
ops.perTaskTokenBudget0You, Project, RepositoryTokens a single task may consume before it is stopped and flagged over-budget (0 = off). The inference policy's budgets.perTaskTokens takes precedence when set. At least 0.
ops.shapeByDefaultfalseYou, Project, RepositoryStart new Team Work conversations with "Shape first" on: the operations manager coaches you through a brief (type, sections, decisions, phases) before anything is planned. The toggle beside the team picker still overrides it per conversation.
ops.stallTimeoutMinutes30You, Project, RepositoryEnd an ops run with a timeout result when the task board sees no activity for this many minutes. From 5 to 240.
ops.testBeforeCommitadvisoryYou, Project, RepositoryRun the tests that cover a task's changed files when task_done commits its work. Advisory always commits: a failure is reported to the reviewer, not held against the agent. A suite that could not run — no node_modules, no test file for the changed unit, a timeout — is recorded as indeterminate and never counted as a failure. One of: off (Do not run anything; task_done commits as before.), advisory (Run the tests covering the task's changed files, record the result on the task and tell the reviewer — then commit either way.).

Organisation

SettingDefaultSet inWhat it does
organisation.bindTokensToDevicetrueYouWhen your organisation supports it, bind this computer's sign-in to a key that never leaves it, so a copy of its token is useless anywhere else. Takes effect at the next sign-in or token refresh. Turning it off stops new bindings; a sign-in already bound stays bound until you sign out.

Pipelines

SettingDefaultSet inWhat it does
pipelines.agentRunsaskYou, ProjectWhether agents may start, re-run or cancel GitHub Actions and Azure Pipelines runs. Reading runs and logs is always allowed; approving a deployment is never an agent's call. One of: ask (Ask each time an agent wants to start, re-run or cancel a pipeline run; no answer means no.), allow (Let agents start, re-run and cancel runs without asking (they are still on the audit log).), off (Agents may read pipelines and logs but never start, re-run or cancel a run.).
pipelines.azureDevOps.organisationYou, Project, RepositoryAzure DevOps organisation whose Azure Pipelines build this repository. Empty = derive it from a dev.azure.com origin remote. Set this and the project for a GitHub repository built by Azure Pipelines.
pipelines.azureDevOps.projectYou, Project, RepositoryAzure DevOps project whose Azure Pipelines build this repository. Empty = derive it from a dev.azure.com origin remote.
pipelines.fixCycles2You, Project, RepositoryHow many times a failing check goes back to the team member whose work it was, as a fix task with the failing output, before it comes to you: a CI run or a pull request's check on work joined to a task, or the repository's checks on the work put together before it is merged. Counted per task. 0 = every failure comes to you, as before. From 0 to 10.
pipelines.notifyOnFinishtrueYou, ProjectSay when a GitHub Actions or Azure Pipelines run the Pipelines view saw running has finished, or has started waiting for your approval, with a button to open it.

Plans

SettingDefaultSet inWhat it does
plans.unifyWaitHours24You, Project, RepositoryWhen a plan's work is finished but some of its acceptance criteria are not confirmed, the plan waits this many hours for someone to pass or fail them (or close it anyway) before it closes on its own, recording them as not confirmed. 0 never waits: the plan closes at once and says which criteria were not confirmed. From 0 to 8760.

Platform

SettingDefaultSet inWhat it does
platform.cloudUrlhttps://service.mojoup.aiYouWhere "Sign in to Mojo Up AI Cloud" finds Cloud. Change it only to try a Cloud that is not the public one (a local one while developing it).
platform.mesh.enabledtrueYouOnce signed in to an organisation that offers a mesh, join it: the desktop runs the bundled aioe-mesh agent so the console and your other machines reach this workbench through the encrypted mesh tunnel instead of the relay. Turning it off stops the agent; the platform marks the node offline and falls back to the relay.
platform.mesh.port7434YouLoopback port the desktop serves signed remote control on for the mesh agent (0 = any free port). The agent exposes it on the node's overlay address at the same port.
platform.mesh.proxyYouThe proxy the mesh agent reaches your organisation through. Empty uses the system's proxy for the platform's address (PAC and WPAD included), which is what a network that lets HTTPS out only through its proxy needs; "direct" uses none; or a proxy URL such as http://proxy.corp:8080 or socks5://host:1080. Stored as a plain setting, so do not put a password in it.
platform.organisationYouDisplay name of the organisation this desktop is signed in to (set by discovery; shown as "Managed by <organisation>" where the platform's policy applies).
platform.urlYouDefault platform URL offered when onboarding a project (.mojoup/project.json).

Plugins

SettingDefaultSet inWhat it does
plugins.allowedMarketplaces[]You, Project, RepositoryThe plugin marketplaces people may add and install plugins from, each by its name (claude-plugins-official) or by where it is (owner/repo, a git URL or a marketplace.json URL). Empty means any marketplace. Marketplaces your organisation publishes are always allowed.
plugins.blocked[]You, Project, RepositoryPlugins nobody may install or turn on, each as name@marketplace, or a bare name for that plugin from any marketplace. A blocked plugin already installed is shown as blocked and cannot be turned on again from the workbench.

Product

SettingDefaultSet inWhat it does
product.features[]YouWhat this workbench is licensed for (nodes, mesh, backups, …), from the device licence its platform issued or the edition's defaults. Worked out by the workbench, like product.tier: a value written here is put back.
product.tierfreeYouWhich edition this workbench runs as, worked out by the workbench from what it is signed in to: Enterprise with an organisation's own platform, Teams with Mojo Up AI Cloud Teams (Mojo Up's SaaS control plane for the AI Workbench) or a hub on your own network, Free otherwise. It is not a choice: a value written here is put back. One of: free, teams, enterprise.

Projects

SettingDefaultSet inWhat it does
projects.startTeamsForPartstrueYou, Project, RepositoryWhen another repository of the project sends this one part of its plan, start the team (or the specialist) the part is given to, so it is worked without anyone pressing Start. The part goes to the team named in the plan, else the team with the same id as the one that planned it, else one whose roles cover the part's role, else the specialist for that role, else this repository's own tasks. Off: the part waits on that team's board until the team is started.

Pull requests

SettingDefaultSet inWhat it does
pullRequests.apiUrlYou, Project, RepositoryThe web address of a self-managed GitLab, Forgejo or Gitea server (https://git.example.com), when it is not the origin remote's server as written: a different port, or a server under a subpath. Empty = from the origin remote.
pullRequests.hostautoYou, Project, RepositoryWhich service this repository's origin is on, for a self-managed server whose address does not say. Pull requests are read and acted on through that service's API. One of: auto (Tell the service from the origin remote's address (github.com, dev.azure.com, gitlab.com, codeberg.org, gitea.com, bitbucket.org, or a server named gitlab., forgejo. or gitea.)), gitlab (A GitLab server), forgejo (A Forgejo server), gitea (A Gitea server), bitbucket (Bitbucket Cloud).
pullRequests.settleTasksOnMergetrueYou, Project, RepositoryWhen a pull request joined to a task merges, move the task to done with a comment saying so. Off, the task only gets the comment. A pull request closed without merging never moves its task.

Remote control

SettingDefaultSet inWhat it does
remote.ipc.enabledfalseYou, Machine, ProjectServe the Control API on a local IPC endpoint (Unix socket / named pipe, owner-only) for command-line tools on this machine, such as mojoup-ctl, with full access. MojoFlow dictation does not use it: it has its own port (dictation.enabled). The token is written to the workbench's own storage for the repository (remote/ipc.json there), never into the repository.
remote.lan.allowPlainHttpfalseYou, Machine, ProjectAllow the LAN listener without TLS. Only for trusted networks: tokens travel in the clear.
remote.lan.autoTlstrueYou, MachineWhen the listener for paired devices is reachable from other machines and no certificate is set, make one for this workbench, so the connection is encrypted. Devices that pair check its fingerprint.
remote.lan.certPathYou, Machine, ProjectPEM certificate for the LAN listener (TLS).
remote.lan.enabledfalseYou, Machine, ProjectServe the Control API on a network interface for paired devices. Requires a TLS certificate unless plain HTTP is explicitly allowed.
remote.lan.host127.0.0.1You, Machine, ProjectInterface the LAN listener binds to (0.0.0.0 for every interface).
remote.lan.interfaceYou, MachineWhich network the listener for paired devices uses: "tailnet" for your private network (the mesh), the name of a network interface, or empty to use the address in remote.lan.host. This is the address other workbenches and nodes use to reach this one.
remote.lan.keyPathYou, Machine, ProjectPEM private key for the LAN listener (TLS).
remote.lan.port7431You, Machine, ProjectPort for the LAN listener (0 = random).
remote.mirror.allowControlfalseYouAlso let someone with the ui:control scope click and type into this window: a paired client, or your organisation's console and the phone app through the relay once the person has confirmed it is them. Off, and worth leaving off unless someone is actively debugging with you — it is full control of the app, and the window shows a warning the whole time it is possible. Switching it off ends every session that can drive.
remote.mirror.enabledfalseYouLet someone with the ui:view scope watch this window: a paired client over the Control API, and your organisation's console and the phone app through the relay (on Mojo Up AI Cloud Teams too, where there is no mesh). Off. While anyone is watching, a badge in the title bar says so and will not stop saying so; switching this off ends every view at once.
remote.pairing.idleDays30YouHow many days a paired device may go unused before its pairing expires and it has to be paired again. Each use starts the count again. 0 means pairings never expire. At least 0.
remote.rateLimitPerMinute120YouControl API requests per minute allowed per remote client. At least 10.
remote.relay.urlYouRelay / platform URL the workbench dials out to (no inbound ports). Your organisation sets it when you sign in.
remote.sessionControl.allSessionsfalseYouLet you control every session of yours from the web and the phone — see it live, send the next message, answer approvals and stop it — through your organisation, signed in as you. Off: you turn it on one session at a time, from the session's menu (Control from the web and phone). Only you can control your sessions; a routine's run, a task Microsoft 365 Copilot asked for and a cloud agent's run are never included. The kill switch in the tray ends every remote control at once and turns this off.
remote.shell.allowRootfalseYouOn a node whose service account is root (SYSTEM on Windows): also serve remote shells, which then run as root. Off, and such a node refuses every shell (shell_unavailable); the better answer is to run the node as an ordinary account.
remote.shell.enabledfalseYouOn a node: let someone with the shell:read scope open a shell on this machine from your organisation's console or the phone app, through the relay — no SSH key, no open port — and, with shell:write, type into it. Off. The shell runs as the node's service account in its home folder or a repository it serves, without the node's own tokens in its environment; at most two are open at once, one ends after 30 minutes without input, and the kill switch or switching this off ends them all. Every opening and closing is in the node's audit log (who, how long, how many bytes — never what was typed or shown). A desktop never serves a shell. Turn it on with mojoup-node config set remote.shell.enabled true.
remote.shell.recordingmetadataYouWhat a node keeps of each remote shell. metadata (the default) and off: the audit log's rows only (who opened it, when, for how long and how many bytes in and out — never the content). full: also the shell's output and resizes (never the keys typed) as an encrypted asciicast file under the node's data folder, kept 30 days, read back on the node only. One of: off (Only the audit log's rows for each shell: who opened it, when, for how long and how many bytes.), metadata (The same rows and nothing more (the default).), full (Also the shell's output, encrypted with a key in the node's secret store, as a file in the node's data folder, kept 30 days. It never leaves the node.).

Research

SettingDefaultSet inWhat it does
research.artifacts.folderdocs/researchYou, Project, RepositoryFolder, relative to the repository, that research artifacts are written into.
research.artifacts.formats["okf","md","html"]You, Project, RepositoryHow a finished research report is written to disk. 'okf' is the Library's typed Markdown (indexed by memory and read there); 'md' is plain Markdown with notebook-friendly front matter (what Obsidian and Gemini Notebook receive); 'html' is a self-contained page anyone can open in a browser.
research.critique.enabledfalseYou, Project, RepositoryReview every research report before it is delivered: a second model critiques the draft and the author revises it (Critique mode). On, Critique starts on for every shape. Off, it starts by the shape: on for a Specialist (the only second opinion it gets), off for a Team or a Council (whose members already challenge each other). The Research composer switches it per conversation, and the choice made there stays with that conversation.
research.critique.reviewerYou, Project, RepositoryThe specialist (its id in Teams) that reviews a research specialist's draft when the specialist names no reviewer of its own. Empty means the specialist reviews its own draft in a fresh frame.
research.defaultTargetYou, ProjectThe specialist or team (its id on the Teams page) a new research conversation starts with, pinned from the Specialist or Team menu in Research's composer. A team brings its way of researching with it (Team or Council, as set on the Teams page), so one pin covers all three. Empty, or one this project does not have = the first specialist.
research.obsidian.autofalseYou, Machine, ProjectSend every finished research report to Obsidian without being asked.
research.obsidian.enabledfalseYou, Machine, ProjectOffer to send research reports to an Obsidian vault on this machine.
research.obsidian.folderResearchYou, Machine, ProjectFolder inside the vault that research notes are written into.
research.obsidian.mirrorDocstrueYou, Machine, ProjectCopy the repository's own documents into the vault's Docs/ folder when knowledge memory is written there, so a community note links to something you can read in the vault instead of naming a repository path. They are copies: edit the repository, not the vault. Off for a repository whose docs are too large to want in a vault.
research.obsidian.openAfterExporttrueYou, Machine, ProjectOpen the note in Obsidian after sending it.
research.obsidian.projectFolderYou, Machine, ProjectThe folder inside the vault this project's notes live in — research reports, the knowledge memory's community notes, routers. Empty means 'AI Workbench/<repository folder name>'. The workbench writes nothing outside it, and inside it only the notes it generated; your Inbox/ there is read, never written.
research.obsidian.syncKnowledgefalseYou, Machine, ProjectWrite knowledge memory into the vault after every memory update — community notes, routers, lessons and the work log — as well as when you press Sync in the Memory view.
research.obsidian.vaultNameYou, Machine, ProjectThe vault's name as Obsidian shows it, for the link that opens a note. Empty uses the folder's name.
research.obsidian.vaultPathYou, Machine, ProjectThe Obsidian vault folder, as the workbench sees it where the repository lives (a repository in WSL needs a WSL path).
research.reviewTasksfalseYou, ProjectHold the tasks a research run files for your review before they are marked done. Off (the default): they go straight to Done and the report is the thing to read. A specialist set to wait for your review still waits.

Review

SettingDefaultSet inWhat it does
review.specialistYou, Project, RepositoryThe specialist (its id on the Teams page) that writes the daily review when the routine or the Run button names nobody. Empty = the default chat agent, started for the review and stopped after it.
review.strongerAttempttrueYou, Project, RepositoryWhen a team's reviewer keeps sending a task back and it would go to you for review, a stronger model first has one look: what it says to change goes back to the implementer for one last round. Once per task, only when the project's classification allows that model's provider and the budget allows it; what was tried is said on the task. Off = the task comes to you straight away.
review.strongerModelYou, Machine, ProjectThe stronger model that has one look at a task before it comes to you: a provider and a model, such as anthropic/claude-opus-4-1. It goes through this machine's model proxy. Empty = the team's operations manager's own model, when it runs through a provider rather than a CLI's own sign-in.

Routines

SettingDefaultSet inWhat it does
routines.defaultSpecialistYou, Project, RepositoryThe specialist (its id on the Teams page) that runs any routine that names nobody: a prompt routine talks to it in Chat, and the daily review is written by it unless review.specialist names someone else. Empty = the default chat agent from Settings → Models → Chat & Team Work.

Runtimes

SettingDefaultSet inWhat it does
runtimes.catalogueEnabled[]You, ProjectThe agent CLIs from the catalogue (Amp, Cursor, Kimi and the rest) you have turned on in Settings → Runtimes, as catalogue:<id>. They are the ones the runtime pickers list first, beside the built-in runtimes that are on. Empty: none. An organisation's runtimes policy can still forbid any of them.
runtimes.claude-code.commandYou, Machine, ProjectCommand (or full path) for the Claude Code ACP adapter. Empty uses "claude-agent-acp" (or the older "claude-code-acp") from PATH, and falls back to "npx -y @agentclientprotocol/claude-agent-acp" when neither is installed but Claude Code is.
runtimes.claude-code.enabledtrueYou, Machine, ProjectEnable the claude-code runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.cline.commandYou, Machine, ProjectCommand (or full path) for the Cline runtime. Empty uses "cline" from PATH.
runtimes.cline.enabledtrueYou, Machine, ProjectEnable the cline runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.codex.commandYou, Machine, ProjectCommand (or full path) for the Codex ACP adapter. Empty uses "codex-acp" from PATH, and falls back to "npx -y @agentclientprotocol/codex-acp" when Codex is installed without it.
runtimes.codex.enabledtrueYou, Machine, ProjectEnable the codex runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.copilot.commandYou, Machine, ProjectCommand (or full path) for the GitHub Copilot CLI runtime. Empty uses "copilot" from PATH.
runtimes.copilot.enabledtrueYou, Machine, ProjectEnable the Copilot runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.defaultcopilotYou, Machine, ProjectThe runtime agents use unless they choose another: new team members and specialists, Chat when you pick nobody, and the task board orchestrator while its own runtime setting is empty. Existing members keep the runtime they were saved with. Also takes catalogue:<id> for an agent CLI from the catalogue that speaks ACP and is installed (a terminal-only CLI cannot be this: it is not governed per call). One of: copilot (GitHub Copilot CLI), claude-code (Claude Code), codex (OpenAI Codex), opencode (OpenCode), kilo (Kilo Code), gemini (Google Antigravity), grok (Grok Build), cline (Cline), native (Built-in agent, with a local model or a hosted one (runtimes.defaultProvider)).
runtimes.defaultModelYou, Machine, ProjectThe model the default runtime asks its provider for (empty = the provider's or runtime's default; the bundled local model serves one model).
runtimes.defaultProviderYou, Machine, ProjectThe local or hosted provider the default runtime's model comes from, for runtimes that take one (the built-in agent, Cline, Claude Code, Codex, Kilo Code): "local-runner" for the bundled local model, "ollama", or a hosted provider id such as "openrouter" whose key is stored under Models. Empty = the runtime's own sign-in; the built-in agent then uses the bundled local model.
runtimes.gemini.commandYou, Machine, ProjectCommand (or full path) for the official Antigravity ACP server. Empty uses the server installed by Settings; legacy Gemini defaults migrate automatically.
runtimes.gemini.enabledtrueYou, Machine, ProjectEnable the Google Antigravity runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.grok.commandYou, Machine, ProjectCommand (or full path) for the Grok Build runtime. Empty uses "grok" from PATH.
runtimes.grok.enabledtrueYou, Machine, ProjectEnable the Grok Build runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.kilo.commandYou, Machine, ProjectCommand (or full path) for the Kilo Code runtime. Empty uses "kilo" from PATH.
runtimes.kilo.enabledtrueYou, Machine, ProjectEnable the Kilo Code runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.
runtimes.native.enabledtrueYou, Machine, ProjectAlways on: the built-in agent comes with the workbench, and its own features (memory, the Scribe, drafting, evaluations) run on it, so it cannot be turned off. A stored false from an earlier version is ignored and removed; writing false is refused.
runtimes.opencode.commandYou, Machine, ProjectCommand (or full path) for the OpenCode runtime. Empty uses "opencode" from PATH.
runtimes.opencode.enabledtrueYou, Machine, ProjectEnable the opencode runtime for new agent sessions, terminal profiles and Usage. Disable to hide it without uninstalling it or stopping active sessions.

Skills

SettingDefaultSet inWhat it does
skills.draftAfterReviewRounds3You, Project, RepositoryWhen a task on a board is done after more than this many review rounds, a cheap model drafts a skill from what the reviews taught, with placeholders for names, hosts and ids, and puts it in your Inbox as a suggested skill. Nothing is saved or sent to your organisation until you choose. 0 never drafts one. From 0 to 50.
skills.draftModelYou, Machine, ProjectThe model that drafts a suggested skill from a task's reviews: a provider and a model, such as ollama:qwen2.5-coder or anthropic/claude-haiku-4-5. It goes through this machine's model proxy, so the workspace's data protection and budgets apply. Empty = this machine's local model when it is running, else its default model.
skills.evaluationJudgeYou, Machine, ProjectThe model that grades a skill evaluation your organisation asks this machine for, when the request names none: a provider and a model, such as anthropic/claude-sonnet-4-5 or ollama:qwen2.5-coder. Empty = the worker model grades its own answers.
skills.turnedOff[]You, Project, RepositoryShared skills — built in, your organisation's or your team's — that agents in this repository are not offered. Set with "Turn off for this repository" on Settings → Skills; skill_load refuses them here, and agents are not told about them.

Stall nudge

SettingDefaultSet inWhat it does
stallNudge.enabledtrueYou, Project, RepositoryAutomatically prompt an agent to continue when it ends a turn describing what it is about to do without actually calling any tools — a common failure mode for local models.
stallNudge.localOnlytrueYou, Project, RepositoryOnly nudge stalled agents on a local model (Ollama, LM Studio, the built-in runner). Turn off to nudge agents on every runtime.
stallNudge.maxNudges3You, Project, RepositoryHow many times in a row a stalled agent may be nudged to continue before the workbench gives up and leaves it idle. From 1 to 10.

Targets

SettingDefaultSet inWhat it does
targets.ssh[]YouSSH machines this workbench can open repositories on, one per ~/.ssh/config alias. Each needs sshd and a POSIX shell; the app installs what it needs there (and Node, on Linux) over ssh.

Task board

SettingDefaultSet inWhat it does
taskBoard.storeautoYou, Project, RepositoryWhere this repository's task board lives. By default the organisation decides: once a project is an enterprise project (or a personal one is promoted), every member's clone uses its shared board. One of: auto (The organisation decides: an enterprise project's roots use its shared board, a personal project's board stays in .mojoup/taskboard.), local (The board lives in this repository's .mojoup/taskboard.), organisation (The board is the organisation project's shared board in AIOE: every member's workbench sees and changes the same tasks. Needs the repository's .mojoup/project.json to name an organisation project and repository, and this workbench signed in to the organisation.), hub (The board is kept by your hub: every workbench and node paired to it sees and changes the same tasks. Needs the project shared with the team on the hub.).

Tasks

SettingDefaultSet inWhat it does
tasks.archiveDoneAfterDays14You, Project, RepositoryFinished tasks leave the board for the archive after this many days in Done, so the Done column stays short. A task something unfinished depends on, one with an open review, one whose work is not merged yet, a part of a project task that is not done, and a task you restored from the archive all stay. 0 keeps finished tasks on the board until you archive them yourself. From 0 to 365.
tasks.archiveHousekeepingAfterMinutes60You, Project, RepositoryHousekeeping tasks (what a routine or a request to the scribe puts on the board) leave it for the archive this many minutes after they finish successfully. One that failed, or finished with concerns, stays as long as any other task. 0 treats housekeeping like any other task. From 0 to 10080.
tasks.azureDevOps.organisationYou, Project, RepositoryAzure DevOps organisation for the Azure Boards mirror (empty = derive from the origin remote).
tasks.azureDevOps.projectYou, Project, RepositoryAzure DevOps project for the Azure Boards mirror (empty = derive from the origin remote).
tasks.azureDevOps.workItemTypeTaskYou, Project, RepositoryWork item type created for a mirrored task (Task, User Story, Issue, Product Backlog Item…).
tasks.backendlocalYou, Project, RepositoryWhere team/solo tasks are stored. The local board is always the working store; a backend mirrors it. One of: local (Tasks live only in .mojoup/taskboard (this repository).), github (Tasks are mirrored to GitHub Issues (your GitHub sign-in).), azure-boards (Tasks are mirrored to Azure Boards work items (your Azure DevOps sign-in).), linear (Tasks are mirrored to Linear issues (your Linear API key).).
tasks.githubRepoYou, Project, RepositoryGitHub repository for issue sync as "owner/repo" (empty = derive from the origin remote).
tasks.linear.apiKeyNameYou, Project, RepositoryWhich Linear API key this repository uses, by the name you gave it. The key itself is kept in this computer's secret store, never in a settings file. Empty = the default key.
tasks.linear.teamKeyYou, Project, RepositoryLinear team for the Linear mirror, by its key: the letters before an issue number (ENG in ENG-123). Empty = the workspace's only team, when it has just one.
tasks.wakeAfterMinutes10You, Project, RepositoryHow long an agent has to pick up a task handed to it before it is reminded. If it still has not, after tasks.wakeReminders reminders the task goes to the team's operations manager and then to you, this long between each step. Every step is in the activity log and the audit trail. 0 turns reminders off. From 0 to 240.
tasks.wakeReminders2You, Project, RepositoryHow many times an agent is reminded of a task it has not picked up before the task goes to the team's operations manager. A reminder points at the task; it never sends the task again. From 0 to 10.

Team Work

SettingDefaultSet inWhat it does
teamwork.autoStartQueuedtrueYou, Project, RepositoryStart the next queued Team Work session automatically when the team's active session finishes. When off, queued sessions wait for a manual start from the queue.
teamwork.defaultTeamYou, ProjectThe team (its id on the Teams page) a new Team Work conversation starts with, pinned from the Team menu in Team Work's composer. Empty, or a team this project does not have = the only team that can run Team Work, when there is just one; otherwise you pick.
teamwork.maxConcurrentPerSubscription3YouHow many Team Work agents may work at once on the same subscription — your Claude, Copilot, Codex or Antigravity sign-in. When more tasks are ready, the rest wait on the board ("Waiting: 3 of your Claude agents are already working") and start as others finish; reviews always start. Agents on an API key or a local model are not counted. 0 means no limit. From 0 to 20.
teamwork.maxConcurrentPlans2You, Project, RepositoryHow many plans one team works on at once. The first runs with the team itself; each other plan run alongside it gets a crew — a copy of the team for that plan, on its own worktrees — and plans beyond the limit wait in the queue. A team whose members all run on local models works one plan at a time whatever this says (the machine is the limit); a team's own Plans at once value overrides both. From 1 to 8.

Teams

SettingDefaultSet inWhat it does
teams.contextProfileautoYou, Project, RepositoryHow much of each agent's context the workbench fills: Lean (shortest prompts, for small models and tight plans), Standard (the everyday balance) or Full (everything the member can use, for large-context models on an unmetered plan). Automatic chooses per member from its model and the plan it runs on. A member or a team can choose its own; your organisation can set it for everyone and lock it. One of: auto, lean, standard, full.
teams.defaultYou, Project, RepositoryThe team this project works with by default, by id: the team Home and the team wizard show it first. Set it for the whole project, or for one repository in its committed settings. Empty: no default.
teams.definitions[]You, ProjectTeam definitions stored outside the repository: saved for this workbench they are available to every project on this computer; saved for a project, to every repository in it. Managed from the Teams view; a repository's own teams live in .mojoup/teams/.
teams.designer.defaultModels{}You, ProjectThe model "Design a specialist" recommends for each kind of work: fast, standard and strong. Each is a provider and a model, such as anthropic/claude-haiku-4-5 or azure/gpt-5-mini. A kind left empty gets the workbench's own choice. Your organisation can set these for everyone. The project's classification still applies: a model it does not allow is passed over.
teams.hub.advertiseYouA host name or address other people's devices use to reach this hub instead of one of this computer's own — a DNS name, or a router that forwards the hub's port. Add the port after a colon when the router forwards a different one (hub.example.com:8443; an IPv6 address in brackets, [2001:db8::1]:8443); without one, the hub's own port. Invitations carry it. Empty: the address of the network the hub is on.
teams.hub.enabledfalseYouMake this workbench your hub (Teams edition): the other workbenches, nodes and phones of your team pair to it and share its projects, task boards and inbox over your own network.
teams.hub.fingerprintYouThe fingerprint of your hub's certificate (sha256:…), checked on every connection so this workbench only ever talks to your own hub. Filled in when you join.
teams.hub.nameYouYour team's name, as the hub shows it to the people who join.
teams.hub.urlYouThe address of your hub this workbench has joined. Filled in when you join with an invitation; empty when this workbench is not part of a hub.

Terminal

SettingDefaultSet inWhat it does
terminal.agentControlstrueYou, ProjectOpen Claude Code, Codex and GitHub Copilot CLI from the terminal menu with the workbench's controls: the repository's connectors through the tool gate and, where the CLI allows it, every tool call checked against your workspace policy and every prompt put through data protection. Your own files are never changed: the controls go only to the terminal the workbench opens. Off, the menu types the CLI's name into a plain shell. When your organisation requires the controls (terminals.requireControls in the policy), they apply whatever this says, and a CLI that cannot have its tool calls and prompts checked here is not opened.
terminal.defaultProfileYouThe shell the New terminal button opens: the id of one of the terminal's shells (this computer's, a saved one of yours). Empty opens the shell of the repository's own target. Set from the New terminal menu's Make default or Settings, Terminal.
terminal.fontSize13YouFont size of the integrated terminal, in pixels. From 8 to 32.
terminal.keepRunningfalseYouKeep new terminals running after you close them. A closed terminal moves to Running in the background, where you can bring it back. On Linux, macOS, WSL, SSH hosts and dev containers that have tmux, it also keeps running after the app quits and comes back on the next start; on Windows, and where there is no tmux, it runs until the app quits. Each terminal can also be switched from its tab's menu.
terminal.keepRunningTmuxKeysfalseYouFor people who know tmux: in terminals kept in tmux, keep tmux's own status line and its Ctrl+B prefix key. Off, a kept terminal looks and types like any other (the mouse wheel scrolls back).
terminal.profiles[]YouYour own terminal profiles, beside the shell and the agent CLIs: a name, the command to run and a tab colour. Edited from the new-terminal menu's Manage profiles….
terminal.scrollback5000YouLines the integrated terminal keeps above the visible screen. From 100 to 100000.
terminal.shellYou, MachineThe shell the integrated terminal starts: a path or a name on PATH (pwsh.exe, cmd.exe, /usr/bin/fish). Empty uses $SHELL — PowerShell on Windows. A terminal for a repository in WSL runs the distro's own login shell; set this for that distro to change it.

Turn watchdog

SettingDefaultSet inWhat it does
turnWatchdog.enabledtrueYou, Project, RepositoryCancel an agent's turn when it has produced no output, tool call or permission request for longer than the idle timeout. Catches agents wedged on a hung model server or a stuck MCP server.
turnWatchdog.idleTimeoutMinutes10You, Project, RepositoryMinutes of silence inside a turn before the watchdog cancels it. Local models on slow hardware may need a higher value. From 2 to 120.
turnWatchdog.restartAfterCanceltrueYou, Project, RepositoryIf the cancel is ignored, kill the agent process and restart it, resuming the same conversation.

Updates

SettingDefaultSet inWhat it does
updates.agentCliBadgefalseYouCount a newer version of an agent CLI from the catalogue (Hermes, Amp, Crush and the others) toward the Updates badge. Off by default: the pane still says "Update available" with the command to copy, and the app never runs it. An organisation can turn it on for its machines.
updates.allowUnsignedfalseYouInstall an update whose Authenticode signature does not check out. Off, and only worth turning on for unsigned builds from your own update source — every such install is logged as a warning.
updates.autoDownloadtrueYouDownload a new version as soon as one is found, so updating is one click. Nothing installs until you say so. Off, the Updates pane offers a Download button instead. Your organisation's command to update or roll back installs either way.
updates.channelstableYouWhich versions the app updates to. An update must match the channel; the app only installs an older version when you switch channel. MOJOUP_DISABLE_AUTO_UPDATE=1 in the app's environment turns updates off on this machine. One of: stable (Released versions only.), nightly (Nightly builds of what will become the next version, as they come out. Switching back to stable offers the newest release, even when it is older than the nightly you have.).
updates.checkIntervalHours24YouHow often the app checks for a new version, in hours. 0 turns the periodic check off; the Updates pane can still check on demand. From 0 to 720.
updates.notifytrueYouTell you when a version is ready: a notification once per version, and a dot on the app's tray and taskbar icon until you install it. Off, the Updates pane still shows it.
updates.sourceYouWhere the app looks for updates. Empty uses the Mojo Up portal. A folder — a share, a synced directory, C:\builds — holding your installers and a latest.json beside them, or an http(s) URL serving the same document. Use this to test a build before it is published.

Usage

SettingDefaultSet inWhat it does
usage.liveLimitstrueYouAsk each signed-in provider for its own usage limits (Claude Code's five-hour and weekly windows, an OpenRouter balance) using the credential that CLI already stores. Turn off to show only what this workbench metered itself.

Workspace

SettingDefaultSet inWhat it does
workspace.activeFolderYouNot used by the desktop app, which opens one repository per window; kept so a value from an older settings file is recognised and ignored.

Worktrees

SettingDefaultSet inWhat it does
worktrees.linkIgnoredFiles[]You, Project, RepositoryFiles git ignores that a new agent worktree should share with your own checkout, as globs (".env*", "config/local.json"): each match is linked into the worktree. A name without a slash matches at any depth. Files git tracks are never replaced.
worktrees.setupBlockingtrueYou, Project, RepositoryHold an agent's work until its worktree's setup has finished. When setup fails the task offers Start anyway and Retry. Off: the agent starts at once and setup runs beside it.
worktrees.setupCommands[]You, Project, RepositoryCommands to run, in order, in every new agent worktree before the agent works in it — installing dependencies, for example ("npm ci"). Each runs in the worktree without a shell unless it uses shell syntax (pipes, &&, variables), which runs through /bin/sh or cmd.exe. Output goes to a log the task links to. They run on your computer, so only commit commands you would run yourself.
worktrees.setupTimeoutMinutes10You, Project, RepositoryHow long one worktree setup command may run before it is stopped and the setup counts as failed. At least 1.

On this page