nodmix 2026.5.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11573 -0
- package/LICENSE +21 -0
- package/README.md +486 -0
- package/docs/.i18n/README.md +81 -0
- package/docs/.i18n/ar-navigation.json +18 -0
- package/docs/.i18n/de-navigation.json +18 -0
- package/docs/.i18n/es-navigation.json +18 -0
- package/docs/.i18n/fr-navigation.json +18 -0
- package/docs/.i18n/glossary.ar.json +78 -0
- package/docs/.i18n/glossary.de.json +78 -0
- package/docs/.i18n/glossary.es.json +78 -0
- package/docs/.i18n/glossary.fa.json +78 -0
- package/docs/.i18n/glossary.fr.json +78 -0
- package/docs/.i18n/glossary.id.json +78 -0
- package/docs/.i18n/glossary.it.json +78 -0
- package/docs/.i18n/glossary.ja-JP.json +98 -0
- package/docs/.i18n/glossary.ko.json +78 -0
- package/docs/.i18n/glossary.nl.json +78 -0
- package/docs/.i18n/glossary.pl.json +78 -0
- package/docs/.i18n/glossary.pt-BR.json +78 -0
- package/docs/.i18n/glossary.th.json +78 -0
- package/docs/.i18n/glossary.tr.json +78 -0
- package/docs/.i18n/glossary.uk.json +78 -0
- package/docs/.i18n/glossary.vi.json +78 -0
- package/docs/.i18n/glossary.zh-CN.json +1002 -0
- package/docs/.i18n/glossary.zh-TW.json +78 -0
- package/docs/.i18n/id-navigation.json +18 -0
- package/docs/.i18n/it-navigation.json +18 -0
- package/docs/.i18n/ja-navigation.json +18 -0
- package/docs/.i18n/ko-navigation.json +18 -0
- package/docs/.i18n/pl-navigation.json +18 -0
- package/docs/.i18n/pt-BR-navigation.json +18 -0
- package/docs/.i18n/tr-navigation.json +18 -0
- package/docs/.i18n/translation-workflow.md +111 -0
- package/docs/.i18n/zh-Hans-navigation.json +542 -0
- package/docs/AGENTS.md +36 -0
- package/docs/announcements/bluebubbles-imessage.md +79 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.png +0 -0
- package/docs/assets/openclaw-logo-text-dark.svg +418 -0
- package/docs/assets/openclaw-logo-text.png +0 -0
- package/docs/assets/openclaw-logo-text.svg +418 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/pr/quick-settings-browser-tools.png +0 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith-light.svg +14 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex-light.svg +16 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/github-light.svg +3 -0
- package/docs/assets/sponsors/github.svg +3 -0
- package/docs/assets/sponsors/nvidia-dark.svg +9 -0
- package/docs/assets/sponsors/nvidia.svg +9 -0
- package/docs/assets/sponsors/openai-light.svg +3 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel-light.svg +5 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +124 -0
- package/docs/automation/auth-monitoring.md +11 -0
- package/docs/automation/clawflow.md +12 -0
- package/docs/automation/cron-jobs.md +500 -0
- package/docs/automation/cron-vs-heartbeat.md +11 -0
- package/docs/automation/gmail-pubsub.md +11 -0
- package/docs/automation/hooks.md +365 -0
- package/docs/automation/index.md +135 -0
- package/docs/automation/poll.md +12 -0
- package/docs/automation/standing-orders.md +250 -0
- package/docs/automation/taskflow.md +155 -0
- package/docs/automation/tasks.md +374 -0
- package/docs/automation/troubleshooting.md +12 -0
- package/docs/automation/webhook.md +12 -0
- package/docs/brave-search.md +11 -0
- package/docs/channels/access-groups.md +201 -0
- package/docs/channels/ambient-room-events.md +214 -0
- package/docs/channels/bot-loop-protection.md +131 -0
- package/docs/channels/broadcast-groups.md +472 -0
- package/docs/channels/channel-routing.md +162 -0
- package/docs/channels/clickclack.md +138 -0
- package/docs/channels/discord.md +1762 -0
- package/docs/channels/feishu.md +502 -0
- package/docs/channels/googlechat.md +284 -0
- package/docs/channels/group-messages.md +95 -0
- package/docs/channels/groups.md +519 -0
- package/docs/channels/imessage-from-bluebubbles.md +259 -0
- package/docs/channels/imessage.md +813 -0
- package/docs/channels/index.md +64 -0
- package/docs/channels/irc.md +253 -0
- package/docs/channels/line.md +243 -0
- package/docs/channels/location.md +71 -0
- package/docs/channels/matrix-migration.md +370 -0
- package/docs/channels/matrix-presentation.md +77 -0
- package/docs/channels/matrix-push-rules.md +150 -0
- package/docs/channels/matrix.md +921 -0
- package/docs/channels/mattermost.md +542 -0
- package/docs/channels/msteams.md +1042 -0
- package/docs/channels/nextcloud-talk.md +176 -0
- package/docs/channels/nostr.md +253 -0
- package/docs/channels/pairing.md +214 -0
- package/docs/channels/qqbot.md +309 -0
- package/docs/channels/signal.md +400 -0
- package/docs/channels/slack.md +1564 -0
- package/docs/channels/synology-chat.md +187 -0
- package/docs/channels/telegram.md +1107 -0
- package/docs/channels/tlon.md +296 -0
- package/docs/channels/troubleshooting.md +161 -0
- package/docs/channels/twitch.md +431 -0
- package/docs/channels/wechat.md +171 -0
- package/docs/channels/whatsapp.md +739 -0
- package/docs/channels/yuanbao.md +416 -0
- package/docs/channels/zalo.md +253 -0
- package/docs/channels/zalouser.md +199 -0
- package/docs/ci.md +612 -0
- package/docs/clawhub/publishing.md +96 -0
- package/docs/cli/acp.md +370 -0
- package/docs/cli/agent.md +103 -0
- package/docs/cli/agents.md +232 -0
- package/docs/cli/approvals.md +190 -0
- package/docs/cli/backup.md +97 -0
- package/docs/cli/browser.md +307 -0
- package/docs/cli/channels.md +154 -0
- package/docs/cli/clawbot.md +25 -0
- package/docs/cli/commitments.md +90 -0
- package/docs/cli/completion.md +39 -0
- package/docs/cli/config.md +504 -0
- package/docs/cli/configure.md +77 -0
- package/docs/cli/crestodian.md +332 -0
- package/docs/cli/cron.md +281 -0
- package/docs/cli/daemon.md +67 -0
- package/docs/cli/dashboard.md +33 -0
- package/docs/cli/devices.md +204 -0
- package/docs/cli/directory.md +68 -0
- package/docs/cli/dns.md +53 -0
- package/docs/cli/docs.md +73 -0
- package/docs/cli/doctor.md +237 -0
- package/docs/cli/flows.md +52 -0
- package/docs/cli/gateway.md +567 -0
- package/docs/cli/health.md +43 -0
- package/docs/cli/hooks.md +345 -0
- package/docs/cli/index.md +396 -0
- package/docs/cli/infer.md +364 -0
- package/docs/cli/logs.md +65 -0
- package/docs/cli/mcp.md +529 -0
- package/docs/cli/memory.md +183 -0
- package/docs/cli/message.md +317 -0
- package/docs/cli/migrate.md +290 -0
- package/docs/cli/models.md +224 -0
- package/docs/cli/node.md +177 -0
- package/docs/cli/nodes.md +76 -0
- package/docs/cli/onboard.md +245 -0
- package/docs/cli/pairing.md +77 -0
- package/docs/cli/path.md +502 -0
- package/docs/cli/plugins.md +454 -0
- package/docs/cli/policy.md +418 -0
- package/docs/cli/proxy.md +89 -0
- package/docs/cli/qr.md +56 -0
- package/docs/cli/reset.md +39 -0
- package/docs/cli/sandbox.md +208 -0
- package/docs/cli/secrets.md +202 -0
- package/docs/cli/security.md +124 -0
- package/docs/cli/sessions.md +164 -0
- package/docs/cli/setup.md +59 -0
- package/docs/cli/skills.md +102 -0
- package/docs/cli/status.md +45 -0
- package/docs/cli/system.md +89 -0
- package/docs/cli/tasks.md +111 -0
- package/docs/cli/tui.md +89 -0
- package/docs/cli/uninstall.md +44 -0
- package/docs/cli/update.md +242 -0
- package/docs/cli/voicecall.md +204 -0
- package/docs/cli/webhooks.md +117 -0
- package/docs/cli/wiki.md +256 -0
- package/docs/concepts/active-memory.md +856 -0
- package/docs/concepts/agent-loop.md +185 -0
- package/docs/concepts/agent-runtimes.md +243 -0
- package/docs/concepts/agent-workspace.md +230 -0
- package/docs/concepts/agent.md +136 -0
- package/docs/concepts/architecture.md +154 -0
- package/docs/concepts/channel-docking.md +145 -0
- package/docs/concepts/commitments.md +150 -0
- package/docs/concepts/compaction.md +203 -0
- package/docs/concepts/context-engine.md +306 -0
- package/docs/concepts/context.md +199 -0
- package/docs/concepts/delegate-architecture.md +319 -0
- package/docs/concepts/dreaming.md +261 -0
- package/docs/concepts/experimental-features.md +108 -0
- package/docs/concepts/features.md +91 -0
- package/docs/concepts/mantis-slack-desktop-runbook.md +202 -0
- package/docs/concepts/mantis.md +740 -0
- package/docs/concepts/markdown-formatting.md +139 -0
- package/docs/concepts/memory-builtin.md +146 -0
- package/docs/concepts/memory-honcho.md +144 -0
- package/docs/concepts/memory-qmd.md +271 -0
- package/docs/concepts/memory-search.md +166 -0
- package/docs/concepts/memory.md +258 -0
- package/docs/concepts/message-lifecycle-refactor.md +1128 -0
- package/docs/concepts/messages.md +214 -0
- package/docs/concepts/model-failover.md +385 -0
- package/docs/concepts/model-providers.md +715 -0
- package/docs/concepts/models.md +370 -0
- package/docs/concepts/multi-agent.md +619 -0
- package/docs/concepts/oauth.md +198 -0
- package/docs/concepts/openclaw-sdk.md +323 -0
- package/docs/concepts/parallel-specialist-lanes.md +127 -0
- package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
- package/docs/concepts/presence.md +117 -0
- package/docs/concepts/progress-drafts.md +362 -0
- package/docs/concepts/qa-e2e-automation.md +820 -0
- package/docs/concepts/qa-matrix.md +139 -0
- package/docs/concepts/queue-steering.md +90 -0
- package/docs/concepts/queue.md +122 -0
- package/docs/concepts/retry.md +86 -0
- package/docs/concepts/session-pruning.md +104 -0
- package/docs/concepts/session-tool.md +190 -0
- package/docs/concepts/session.md +164 -0
- package/docs/concepts/soul.md +116 -0
- package/docs/concepts/streaming.md +251 -0
- package/docs/concepts/system-prompt.md +310 -0
- package/docs/concepts/timezone.md +47 -0
- package/docs/concepts/typebox.md +309 -0
- package/docs/concepts/typing-indicators.md +88 -0
- package/docs/concepts/usage-tracking.md +66 -0
- package/docs/date-time.md +126 -0
- package/docs/debug/node-issue.md +90 -0
- package/docs/diagnostics/flags.md +138 -0
- package/docs/docs.json +1832 -0
- package/docs/gateway/authentication.md +239 -0
- package/docs/gateway/background-process.md +147 -0
- package/docs/gateway/bonjour.md +303 -0
- package/docs/gateway/bridge-protocol.md +94 -0
- package/docs/gateway/cli-backends.md +420 -0
- package/docs/gateway/config-agents.md +1514 -0
- package/docs/gateway/config-channels.md +945 -0
- package/docs/gateway/config-tools.md +769 -0
- package/docs/gateway/configuration-examples.md +705 -0
- package/docs/gateway/configuration-reference.md +1393 -0
- package/docs/gateway/configuration.md +737 -0
- package/docs/gateway/diagnostics.md +213 -0
- package/docs/gateway/discovery.md +154 -0
- package/docs/gateway/doctor.md +574 -0
- package/docs/gateway/gateway-lock.md +37 -0
- package/docs/gateway/health.md +73 -0
- package/docs/gateway/heartbeat.md +493 -0
- package/docs/gateway/index.md +383 -0
- package/docs/gateway/local-model-services.md +205 -0
- package/docs/gateway/local-models.md +355 -0
- package/docs/gateway/logging.md +149 -0
- package/docs/gateway/multiple-gateways.md +178 -0
- package/docs/gateway/network-model.md +15 -0
- package/docs/gateway/openai-http-api.md +350 -0
- package/docs/gateway/openresponses-http-api.md +347 -0
- package/docs/gateway/openshell.md +316 -0
- package/docs/gateway/opentelemetry.md +404 -0
- package/docs/gateway/operator-scopes.md +111 -0
- package/docs/gateway/pairing.md +207 -0
- package/docs/gateway/prometheus.md +230 -0
- package/docs/gateway/protocol.md +803 -0
- package/docs/gateway/remote-gateway-readme.md +169 -0
- package/docs/gateway/remote.md +280 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +146 -0
- package/docs/gateway/sandboxing.md +545 -0
- package/docs/gateway/secrets-plan-contract.md +114 -0
- package/docs/gateway/secrets.md +609 -0
- package/docs/gateway/security/audit-checks.md +127 -0
- package/docs/gateway/security/index.md +1326 -0
- package/docs/gateway/security/secure-file-operations.md +76 -0
- package/docs/gateway/tailscale.md +156 -0
- package/docs/gateway/tools-invoke-http-api.md +169 -0
- package/docs/gateway/troubleshooting.md +772 -0
- package/docs/gateway/trusted-proxy-auth.md +451 -0
- package/docs/help/debugging.md +344 -0
- package/docs/help/environment.md +214 -0
- package/docs/help/faq-first-run.md +867 -0
- package/docs/help/faq-models.md +553 -0
- package/docs/help/faq.md +1975 -0
- package/docs/help/gpt55-codex-agentic-parity-maintainers.md +196 -0
- package/docs/help/gpt55-codex-agentic-parity.md +230 -0
- package/docs/help/index.md +39 -0
- package/docs/help/scripts.md +56 -0
- package/docs/help/testing-live.md +580 -0
- package/docs/help/testing-updates-plugins.md +291 -0
- package/docs/help/testing.md +928 -0
- package/docs/help/troubleshooting.md +424 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-get-group-id.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +233 -0
- package/docs/install/azure.md +315 -0
- package/docs/install/bun.md +59 -0
- package/docs/install/clawdock.md +112 -0
- package/docs/install/development-channels.md +135 -0
- package/docs/install/digitalocean.md +174 -0
- package/docs/install/docker-vm-runtime.md +154 -0
- package/docs/install/docker.md +562 -0
- package/docs/install/exe-dev.md +201 -0
- package/docs/install/fly.md +524 -0
- package/docs/install/gcp.md +418 -0
- package/docs/install/hetzner.md +285 -0
- package/docs/install/hostinger.md +98 -0
- package/docs/install/index.md +221 -0
- package/docs/install/installer.md +455 -0
- package/docs/install/kubernetes.md +196 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-claude.md +165 -0
- package/docs/install/migrating-hermes.md +177 -0
- package/docs/install/migrating.md +137 -0
- package/docs/install/nix.md +112 -0
- package/docs/install/node.md +142 -0
- package/docs/install/northflank.mdx +44 -0
- package/docs/install/oracle.md +218 -0
- package/docs/install/podman.md +210 -0
- package/docs/install/railway.mdx +92 -0
- package/docs/install/raspberry-pi.md +234 -0
- package/docs/install/render.mdx +167 -0
- package/docs/install/uninstall.md +131 -0
- package/docs/install/updating.md +280 -0
- package/docs/logging.md +318 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +72 -0
- package/docs/nodes/audio.md +215 -0
- package/docs/nodes/camera.md +166 -0
- package/docs/nodes/images.md +77 -0
- package/docs/nodes/index.md +439 -0
- package/docs/nodes/location-command.md +102 -0
- package/docs/nodes/media-understanding.md +469 -0
- package/docs/nodes/talk.md +154 -0
- package/docs/nodes/troubleshooting.md +123 -0
- package/docs/nodes/voicewake.md +93 -0
- package/docs/perplexity.md +11 -0
- package/docs/pi-dev.md +82 -0
- package/docs/pi.md +573 -0
- package/docs/plan/codex-context-engine-harness.md +624 -0
- package/docs/plan/ui-channels.md +284 -0
- package/docs/platforms/android.md +285 -0
- package/docs/platforms/digitalocean.md +12 -0
- package/docs/platforms/index.md +60 -0
- package/docs/platforms/ios.md +283 -0
- package/docs/platforms/linux.md +141 -0
- package/docs/platforms/mac/bundled-gateway.md +79 -0
- package/docs/platforms/mac/canvas.md +128 -0
- package/docs/platforms/mac/child-process.md +72 -0
- package/docs/platforms/mac/dev-setup.md +112 -0
- package/docs/platforms/mac/health.md +39 -0
- package/docs/platforms/mac/icon.md +36 -0
- package/docs/platforms/mac/logging.md +62 -0
- package/docs/platforms/mac/menu-bar.md +93 -0
- package/docs/platforms/mac/peekaboo.md +92 -0
- package/docs/platforms/mac/permissions.md +53 -0
- package/docs/platforms/mac/remote.md +123 -0
- package/docs/platforms/mac/signing.md +52 -0
- package/docs/platforms/mac/skills.md +43 -0
- package/docs/platforms/mac/voice-overlay.md +66 -0
- package/docs/platforms/mac/voicewake.md +73 -0
- package/docs/platforms/mac/webchat.md +54 -0
- package/docs/platforms/mac/xpc.md +66 -0
- package/docs/platforms/macos.md +226 -0
- package/docs/platforms/oracle.md +12 -0
- package/docs/platforms/raspberry-pi.md +13 -0
- package/docs/platforms/windows.md +286 -0
- package/docs/plugins/adding-capabilities.md +133 -0
- package/docs/plugins/admin-http-rpc.md +216 -0
- package/docs/plugins/agent-tools.md +13 -0
- package/docs/plugins/architecture-internals.md +1195 -0
- package/docs/plugins/architecture.md +481 -0
- package/docs/plugins/building-extensions.md +13 -0
- package/docs/plugins/building-plugins.md +330 -0
- package/docs/plugins/bundles.md +310 -0
- package/docs/plugins/cli-backend-plugins.md +310 -0
- package/docs/plugins/codex-computer-use.md +293 -0
- package/docs/plugins/codex-harness-reference.md +409 -0
- package/docs/plugins/codex-harness-runtime.md +247 -0
- package/docs/plugins/codex-harness.md +746 -0
- package/docs/plugins/codex-native-plugins.md +276 -0
- package/docs/plugins/community.md +77 -0
- package/docs/plugins/compatibility.md +164 -0
- package/docs/plugins/dependency-resolution.md +143 -0
- package/docs/plugins/google-meet.md +1737 -0
- package/docs/plugins/hooks.md +459 -0
- package/docs/plugins/install-overrides.md +80 -0
- package/docs/plugins/manage-plugins.md +210 -0
- package/docs/plugins/manifest.md +1359 -0
- package/docs/plugins/memory-lancedb.md +385 -0
- package/docs/plugins/memory-wiki.md +529 -0
- package/docs/plugins/message-presentation.md +473 -0
- package/docs/plugins/oc-path.md +166 -0
- package/docs/plugins/plugin-inventory.md +182 -0
- package/docs/plugins/reference/acpx.md +23 -0
- package/docs/plugins/reference/admin-http-rpc.md +23 -0
- package/docs/plugins/reference/alibaba.md +23 -0
- package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
- package/docs/plugins/reference/amazon-bedrock.md +23 -0
- package/docs/plugins/reference/anthropic-vertex.md +19 -0
- package/docs/plugins/reference/anthropic.md +23 -0
- package/docs/plugins/reference/arcee.md +23 -0
- package/docs/plugins/reference/azure-speech.md +23 -0
- package/docs/plugins/reference/bonjour.md +19 -0
- package/docs/plugins/reference/brave.md +23 -0
- package/docs/plugins/reference/browser.md +23 -0
- package/docs/plugins/reference/byteplus.md +19 -0
- package/docs/plugins/reference/canvas.md +19 -0
- package/docs/plugins/reference/cerebras.md +23 -0
- package/docs/plugins/reference/chutes.md +23 -0
- package/docs/plugins/reference/clickclack.md +23 -0
- package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
- package/docs/plugins/reference/codex.md +23 -0
- package/docs/plugins/reference/comfy.md +23 -0
- package/docs/plugins/reference/copilot-proxy.md +19 -0
- package/docs/plugins/reference/deepgram.md +23 -0
- package/docs/plugins/reference/deepinfra.md +23 -0
- package/docs/plugins/reference/deepseek.md +23 -0
- package/docs/plugins/reference/diagnostics-otel.md +19 -0
- package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
- package/docs/plugins/reference/diffs.md +19 -0
- package/docs/plugins/reference/discord.md +23 -0
- package/docs/plugins/reference/document-extract.md +23 -0
- package/docs/plugins/reference/duckduckgo.md +23 -0
- package/docs/plugins/reference/elevenlabs.md +23 -0
- package/docs/plugins/reference/exa.md +23 -0
- package/docs/plugins/reference/fal.md +23 -0
- package/docs/plugins/reference/feishu.md +23 -0
- package/docs/plugins/reference/file-transfer.md +19 -0
- package/docs/plugins/reference/firecrawl.md +23 -0
- package/docs/plugins/reference/fireworks.md +23 -0
- package/docs/plugins/reference/github-copilot.md +23 -0
- package/docs/plugins/reference/google-meet.md +23 -0
- package/docs/plugins/reference/google.md +23 -0
- package/docs/plugins/reference/googlechat.md +23 -0
- package/docs/plugins/reference/gradium.md +23 -0
- package/docs/plugins/reference/groq.md +23 -0
- package/docs/plugins/reference/huggingface.md +23 -0
- package/docs/plugins/reference/imessage.md +23 -0
- package/docs/plugins/reference/inworld.md +23 -0
- package/docs/plugins/reference/irc.md +23 -0
- package/docs/plugins/reference/kilocode.md +23 -0
- package/docs/plugins/reference/kimi.md +23 -0
- package/docs/plugins/reference/line.md +23 -0
- package/docs/plugins/reference/litellm.md +23 -0
- package/docs/plugins/reference/llm-task.md +19 -0
- package/docs/plugins/reference/lmstudio.md +23 -0
- package/docs/plugins/reference/lobster.md +19 -0
- package/docs/plugins/reference/matrix.md +23 -0
- package/docs/plugins/reference/mattermost.md +23 -0
- package/docs/plugins/reference/memory-core.md +19 -0
- package/docs/plugins/reference/memory-lancedb.md +23 -0
- package/docs/plugins/reference/memory-wiki.md +23 -0
- package/docs/plugins/reference/microsoft-foundry.md +19 -0
- package/docs/plugins/reference/microsoft.md +19 -0
- package/docs/plugins/reference/migrate-claude.md +19 -0
- package/docs/plugins/reference/migrate-hermes.md +19 -0
- package/docs/plugins/reference/minimax.md +23 -0
- package/docs/plugins/reference/mistral.md +23 -0
- package/docs/plugins/reference/moonshot.md +23 -0
- package/docs/plugins/reference/msteams.md +23 -0
- package/docs/plugins/reference/nextcloud-talk.md +23 -0
- package/docs/plugins/reference/nostr.md +23 -0
- package/docs/plugins/reference/nvidia.md +23 -0
- package/docs/plugins/reference/oc-path.md +23 -0
- package/docs/plugins/reference/ollama.md +23 -0
- package/docs/plugins/reference/open-prose.md +19 -0
- package/docs/plugins/reference/openai.md +23 -0
- package/docs/plugins/reference/opencode-go.md +23 -0
- package/docs/plugins/reference/opencode.md +23 -0
- package/docs/plugins/reference/openrouter.md +23 -0
- package/docs/plugins/reference/openshell.md +19 -0
- package/docs/plugins/reference/perplexity.md +23 -0
- package/docs/plugins/reference/policy.md +23 -0
- package/docs/plugins/reference/qa-channel.md +23 -0
- package/docs/plugins/reference/qa-lab.md +19 -0
- package/docs/plugins/reference/qa-matrix.md +19 -0
- package/docs/plugins/reference/qianfan.md +23 -0
- package/docs/plugins/reference/qqbot.md +23 -0
- package/docs/plugins/reference/qwen.md +23 -0
- package/docs/plugins/reference/runway.md +23 -0
- package/docs/plugins/reference/searxng.md +19 -0
- package/docs/plugins/reference/senseaudio.md +23 -0
- package/docs/plugins/reference/sglang.md +23 -0
- package/docs/plugins/reference/signal.md +23 -0
- package/docs/plugins/reference/skill-workshop.md +23 -0
- package/docs/plugins/reference/slack.md +23 -0
- package/docs/plugins/reference/stepfun.md +23 -0
- package/docs/plugins/reference/synology-chat.md +23 -0
- package/docs/plugins/reference/synthetic.md +23 -0
- package/docs/plugins/reference/tavily.md +23 -0
- package/docs/plugins/reference/telegram.md +23 -0
- package/docs/plugins/reference/tencent.md +23 -0
- package/docs/plugins/reference/tlon.md +23 -0
- package/docs/plugins/reference/together.md +23 -0
- package/docs/plugins/reference/tokenjuice.md +23 -0
- package/docs/plugins/reference/tts-local-cli.md +19 -0
- package/docs/plugins/reference/twitch.md +23 -0
- package/docs/plugins/reference/venice.md +23 -0
- package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
- package/docs/plugins/reference/vllm.md +23 -0
- package/docs/plugins/reference/voice-call.md +23 -0
- package/docs/plugins/reference/volcengine.md +23 -0
- package/docs/plugins/reference/voyage.md +19 -0
- package/docs/plugins/reference/vydra.md +23 -0
- package/docs/plugins/reference/web-readability.md +19 -0
- package/docs/plugins/reference/webhooks.md +23 -0
- package/docs/plugins/reference/whatsapp.md +23 -0
- package/docs/plugins/reference/xai.md +23 -0
- package/docs/plugins/reference/xiaomi.md +23 -0
- package/docs/plugins/reference/zai.md +23 -0
- package/docs/plugins/reference/zalo.md +23 -0
- package/docs/plugins/reference/zalouser.md +24 -0
- package/docs/plugins/reference.md +138 -0
- package/docs/plugins/sdk-agent-harness.md +339 -0
- package/docs/plugins/sdk-channel-ingress.md +137 -0
- package/docs/plugins/sdk-channel-message.md +458 -0
- package/docs/plugins/sdk-channel-plugins.md +762 -0
- package/docs/plugins/sdk-channel-turn.md +580 -0
- package/docs/plugins/sdk-entrypoints.md +333 -0
- package/docs/plugins/sdk-migration.md +949 -0
- package/docs/plugins/sdk-overview.md +501 -0
- package/docs/plugins/sdk-provider-plugins.md +807 -0
- package/docs/plugins/sdk-runtime.md +676 -0
- package/docs/plugins/sdk-setup.md +550 -0
- package/docs/plugins/sdk-subpaths.md +396 -0
- package/docs/plugins/sdk-testing.md +401 -0
- package/docs/plugins/skill-workshop.md +713 -0
- package/docs/plugins/tool-plugins.md +411 -0
- package/docs/plugins/voice-call.md +943 -0
- package/docs/plugins/webhooks.md +192 -0
- package/docs/plugins/zalouser.md +86 -0
- package/docs/prose.md +137 -0
- package/docs/providers/alibaba.md +158 -0
- package/docs/providers/anthropic.md +344 -0
- package/docs/providers/arcee.md +144 -0
- package/docs/providers/azure-speech.md +119 -0
- package/docs/providers/bedrock-mantle.md +211 -0
- package/docs/providers/bedrock.md +414 -0
- package/docs/providers/cerebras.md +130 -0
- package/docs/providers/chutes.md +153 -0
- package/docs/providers/claude-max-api-proxy.md +188 -0
- package/docs/providers/cloudflare-ai-gateway.md +119 -0
- package/docs/providers/comfy.md +362 -0
- package/docs/providers/deepgram.md +184 -0
- package/docs/providers/deepinfra.md +87 -0
- package/docs/providers/deepseek.md +146 -0
- package/docs/providers/ds4.md +309 -0
- package/docs/providers/elevenlabs.md +130 -0
- package/docs/providers/fal.md +204 -0
- package/docs/providers/fireworks.md +144 -0
- package/docs/providers/github-copilot.md +225 -0
- package/docs/providers/glm.md +137 -0
- package/docs/providers/google.md +472 -0
- package/docs/providers/gradium.md +123 -0
- package/docs/providers/groq.md +180 -0
- package/docs/providers/huggingface.md +235 -0
- package/docs/providers/index.md +102 -0
- package/docs/providers/inferrs.md +272 -0
- package/docs/providers/inworld.md +120 -0
- package/docs/providers/kilocode.md +135 -0
- package/docs/providers/litellm.md +234 -0
- package/docs/providers/lmstudio.md +224 -0
- package/docs/providers/minimax.md +505 -0
- package/docs/providers/mistral.md +235 -0
- package/docs/providers/models.md +65 -0
- package/docs/providers/moonshot.md +413 -0
- package/docs/providers/nvidia.md +140 -0
- package/docs/providers/ollama.md +1180 -0
- package/docs/providers/openai.md +1057 -0
- package/docs/providers/opencode-go.md +123 -0
- package/docs/providers/opencode.md +149 -0
- package/docs/providers/openrouter.md +349 -0
- package/docs/providers/perplexity-provider.md +123 -0
- package/docs/providers/qianfan.md +132 -0
- package/docs/providers/qwen.md +332 -0
- package/docs/providers/runway.md +103 -0
- package/docs/providers/senseaudio.md +68 -0
- package/docs/providers/sglang.md +161 -0
- package/docs/providers/stepfun.md +229 -0
- package/docs/providers/synthetic.md +154 -0
- package/docs/providers/tencent.md +130 -0
- package/docs/providers/together.md +141 -0
- package/docs/providers/venice.md +315 -0
- package/docs/providers/vercel-ai-gateway.md +128 -0
- package/docs/providers/vllm.md +383 -0
- package/docs/providers/volcengine.md +199 -0
- package/docs/providers/vydra.md +180 -0
- package/docs/providers/xai.md +560 -0
- package/docs/providers/xiaomi.md +188 -0
- package/docs/providers/zai.md +203 -0
- package/docs/refactor/access.md +9 -0
- package/docs/refactor/acp.md +298 -0
- package/docs/refactor/canvas.md +131 -0
- package/docs/refactor/ingress-core.md +341 -0
- package/docs/reference/AGENTS.default.md +129 -0
- package/docs/reference/RELEASING.md +767 -0
- package/docs/reference/api-usage-costs.md +202 -0
- package/docs/reference/application-modernization-plan.md +208 -0
- package/docs/reference/code-mode.md +757 -0
- package/docs/reference/credits.md +33 -0
- package/docs/reference/device-models.md +50 -0
- package/docs/reference/full-release-validation.md +202 -0
- package/docs/reference/memory-config.md +630 -0
- package/docs/reference/openclaw-sdk-api-design.md +390 -0
- package/docs/reference/prompt-caching.md +358 -0
- package/docs/reference/rich-output-protocol.md +79 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +159 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +663 -0
- package/docs/reference/session-management-compaction.md +461 -0
- package/docs/reference/templates/AGENTS.dev.md +89 -0
- package/docs/reference/templates/AGENTS.md +225 -0
- package/docs/reference/templates/BOOT.md +16 -0
- package/docs/reference/templates/BOOTSTRAP.md +66 -0
- package/docs/reference/templates/HEARTBEAT.md +16 -0
- package/docs/reference/templates/IDENTITY.dev.md +52 -0
- package/docs/reference/templates/IDENTITY.md +34 -0
- package/docs/reference/templates/SOUL.dev.md +82 -0
- package/docs/reference/templates/SOUL.md +49 -0
- package/docs/reference/templates/TOOLS.dev.md +29 -0
- package/docs/reference/templates/TOOLS.md +51 -0
- package/docs/reference/templates/USER.dev.md +23 -0
- package/docs/reference/templates/USER.md +28 -0
- package/docs/reference/test.md +239 -0
- package/docs/reference/token-use.md +233 -0
- package/docs/reference/transcript-hygiene.md +214 -0
- package/docs/reference/wizard.md +252 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
- package/docs/security/formal-verification.md +170 -0
- package/docs/security/incident-response.md +59 -0
- package/docs/security/network-proxy.md +268 -0
- package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
- package/docs/snippets/plugin-publish/minimal-package.json +16 -0
- package/docs/start/bootstrapping.md +49 -0
- package/docs/start/docs-directory.md +69 -0
- package/docs/start/getting-started.md +152 -0
- package/docs/start/hubs.md +201 -0
- package/docs/start/lore.md +223 -0
- package/docs/start/onboarding-overview.md +72 -0
- package/docs/start/onboarding.md +95 -0
- package/docs/start/openclaw.md +244 -0
- package/docs/start/quickstart.md +25 -0
- package/docs/start/setup.md +178 -0
- package/docs/start/showcase.md +383 -0
- package/docs/start/wizard-cli-automation.md +232 -0
- package/docs/start/wizard-cli-reference.md +331 -0
- package/docs/start/wizard.md +141 -0
- package/docs/style.css +184 -0
- package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +316 -0
- package/docs/tools/acp-agents-setup.md +352 -0
- package/docs/tools/acp-agents.md +847 -0
- package/docs/tools/agent-send.md +112 -0
- package/docs/tools/apply-patch.md +64 -0
- package/docs/tools/brave-search.md +139 -0
- package/docs/tools/browser-control.md +391 -0
- package/docs/tools/browser-linux-troubleshooting.md +173 -0
- package/docs/tools/browser-login.md +77 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
- package/docs/tools/browser.md +769 -0
- package/docs/tools/btw.md +159 -0
- package/docs/tools/capability-cookbook.md +12 -0
- package/docs/tools/clawhub.md +5 -0
- package/docs/tools/code-execution.md +173 -0
- package/docs/tools/creating-skills.md +120 -0
- package/docs/tools/diffs.md +506 -0
- package/docs/tools/duckduckgo-search.md +109 -0
- package/docs/tools/elevated.md +128 -0
- package/docs/tools/exa-search.md +152 -0
- package/docs/tools/exec-approvals-advanced.md +360 -0
- package/docs/tools/exec-approvals.md +474 -0
- package/docs/tools/exec.md +282 -0
- package/docs/tools/firecrawl.md +155 -0
- package/docs/tools/gemini-search.md +114 -0
- package/docs/tools/grok-search.md +113 -0
- package/docs/tools/image-generation.md +433 -0
- package/docs/tools/index.md +178 -0
- package/docs/tools/kimi-search.md +105 -0
- package/docs/tools/llm-task.md +137 -0
- package/docs/tools/lobster.md +365 -0
- package/docs/tools/loop-detection.md +154 -0
- package/docs/tools/media-overview.md +157 -0
- package/docs/tools/minimax-search.md +102 -0
- package/docs/tools/multi-agent-sandbox-tools.md +409 -0
- package/docs/tools/music-generation.md +371 -0
- package/docs/tools/ollama-search.md +153 -0
- package/docs/tools/pdf.md +195 -0
- package/docs/tools/perplexity-search.md +220 -0
- package/docs/tools/plugin.md +327 -0
- package/docs/tools/reactions.md +100 -0
- package/docs/tools/searxng-search.md +141 -0
- package/docs/tools/skills-config.md +195 -0
- package/docs/tools/skills.md +535 -0
- package/docs/tools/slash-commands.md +488 -0
- package/docs/tools/steer.md +84 -0
- package/docs/tools/subagents.md +650 -0
- package/docs/tools/tavily.md +162 -0
- package/docs/tools/thinking.md +140 -0
- package/docs/tools/tokenjuice.md +81 -0
- package/docs/tools/tool-search.md +269 -0
- package/docs/tools/trajectory.md +229 -0
- package/docs/tools/tts.md +1004 -0
- package/docs/tools/video-generation.md +552 -0
- package/docs/tools/web-fetch.md +195 -0
- package/docs/tools/web.md +459 -0
- package/docs/tts.md +11 -0
- package/docs/vps.md +139 -0
- package/docs/web/control-ui.md +503 -0
- package/docs/web/dashboard.md +107 -0
- package/docs/web/index.md +133 -0
- package/docs/web/tui.md +246 -0
- package/docs/web/webchat.md +99 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/nodmix.mjs +487 -0
- package/package.json +1852 -0
- package/patches/.gitkeep +0 -0
- package/patches/@agentclientprotocol__claude-agent-acp@0.36.1.patch +41 -0
- package/pnpm-workspace.yaml +63 -0
- package/scripts/crabbox-wrapper.mjs +353 -0
- package/scripts/lib/official-external-channel-catalog.json +559 -0
- package/scripts/lib/official-external-plugin-catalog.json +192 -0
- package/scripts/lib/official-external-provider-catalog.json +117 -0
- package/scripts/lib/package-dist-imports.mjs +171 -0
- package/scripts/npm-runner.mjs +91 -0
- package/scripts/postinstall-bundled-plugins.mjs +978 -0
- package/scripts/preinstall-package-manager-warning.mjs +64 -0
- package/scripts/windows-cmd-helpers.mjs +20 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +78 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +149 -0
- package/skills/diagram-maker/SKILL.md +53 -0
- package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
- package/skills/diagram-maker/references/svg-template.md +112 -0
- package/skills/discord/SKILL.md +136 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +47 -0
- package/skills/gh-issues/SKILL.md +213 -0
- package/skills/gifgrep/SKILL.md +85 -0
- package/skills/github/SKILL.md +84 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +105 -0
- package/skills/himalaya/SKILL.md +80 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/meme-maker/SKILL.md +42 -0
- package/skills/meme-maker/references/templates.json +358 -0
- package/skills/meme-maker/scripts/meme.mjs +398 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +319 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/node-inspect-debugger/SKILL.md +85 -0
- package/skills/notion/SKILL.md +150 -0
- package/skills/obsidian/SKILL.md +119 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +71 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +126 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/pyproject.toml +10 -0
- package/skills/python-debugpy/SKILL.md +73 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +151 -0
- package/skills/sherpa-onnx-tts/SKILL.md +109 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +78 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +169 -0
- package/skills/skill-creator/scripts/test_package_skill.py +161 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
- package/skills/slack/SKILL.md +78 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spike/SKILL.md +51 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/taskflow/SKILL.md +149 -0
- package/skills/taskflow/examples/inbox-triage.lobster +33 -0
- package/skills/taskflow/examples/pr-intake.lobster +32 -0
- package/skills/taskflow-inbox-triage/SKILL.md +119 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +91 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +108 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +64 -0
- package/skills/xurl/SKILL.md +120 -0
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Model authentication: OAuth, API keys, Claude CLI reuse, and Anthropic setup-token"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging model auth or OAuth expiry
|
|
5
|
+
- Documenting authentication or credential storage
|
|
6
|
+
title: "Authentication"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<Note>
|
|
10
|
+
This page is the **model provider** authentication reference (API keys, OAuth, Claude CLI reuse, and Anthropic setup-token). For **gateway connection** authentication (token, password, trusted-proxy), see [Configuration](/gateway/configuration) and [Trusted Proxy Auth](/gateway/trusted-proxy-auth).
|
|
11
|
+
</Note>
|
|
12
|
+
|
|
13
|
+
Nodmix supports OAuth and API keys for model providers. For always-on gateway
|
|
14
|
+
hosts, API keys are usually the most predictable option. Subscription/OAuth
|
|
15
|
+
flows are also supported when they match your provider account model.
|
|
16
|
+
|
|
17
|
+
See [/concepts/oauth](/concepts/oauth) for the full OAuth flow and storage
|
|
18
|
+
layout.
|
|
19
|
+
For SecretRef-based auth (`env`/`file`/`exec` providers), see [Secrets Management](/gateway/secrets).
|
|
20
|
+
For credential eligibility/reason-code rules used by `models status --probe`, see
|
|
21
|
+
[Auth Credential Semantics](/auth-credential-semantics).
|
|
22
|
+
|
|
23
|
+
## Recommended setup (API key, any provider)
|
|
24
|
+
|
|
25
|
+
If you're running a long-lived gateway, start with an API key for your chosen
|
|
26
|
+
provider.
|
|
27
|
+
For Anthropic specifically, API key auth is still the most predictable server
|
|
28
|
+
setup, but Nodmix also supports reusing a local Claude CLI login.
|
|
29
|
+
|
|
30
|
+
1. Create an API key in your provider console.
|
|
31
|
+
2. Put it on the **gateway host** (the machine running `nodmix gateway`).
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
export <PROVIDER>_API_KEY="..."
|
|
35
|
+
nodmix models status
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
3. If the Gateway runs under systemd/launchd, prefer putting the key in
|
|
39
|
+
`~/.nodmix/.env` so the daemon can read it:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cat >> ~/.nodmix/.env <<'EOF'
|
|
43
|
+
<PROVIDER>_API_KEY=...
|
|
44
|
+
EOF
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Then restart the daemon (or restart your Gateway process) and re-check:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
nodmix models status
|
|
51
|
+
nodmix doctor
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
If you'd rather not manage env vars yourself, onboarding can store
|
|
55
|
+
API keys for daemon use: `nodmix onboard`.
|
|
56
|
+
|
|
57
|
+
See [Help](/help) for details on env inheritance (`env.shellEnv`,
|
|
58
|
+
`~/.nodmix/.env`, systemd/launchd).
|
|
59
|
+
|
|
60
|
+
## Anthropic: Claude CLI and token compatibility
|
|
61
|
+
|
|
62
|
+
Anthropic setup-token auth is still available in Nodmix as a supported token
|
|
63
|
+
path. Anthropic staff has since told us that Nodmix-style Claude CLI usage is
|
|
64
|
+
allowed again, so Nodmix treats Claude CLI reuse and `claude -p` usage as
|
|
65
|
+
sanctioned for this integration unless Anthropic publishes a new policy. When
|
|
66
|
+
Claude CLI reuse is available on the host, that is now the preferred path.
|
|
67
|
+
|
|
68
|
+
For long-lived gateway hosts, an Anthropic API key is still the most predictable
|
|
69
|
+
setup. If you want to reuse an existing Claude login on the same host, use the
|
|
70
|
+
Anthropic Claude CLI path in onboarding/configure.
|
|
71
|
+
|
|
72
|
+
Recommended host setup for Claude CLI reuse:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# Run on the gateway host
|
|
76
|
+
claude auth login
|
|
77
|
+
claude auth status --text
|
|
78
|
+
nodmix models auth login --provider anthropic --method cli --set-default
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
This is a two-step setup:
|
|
82
|
+
|
|
83
|
+
1. Log Claude Code itself into Anthropic on the gateway host.
|
|
84
|
+
2. Tell Nodmix to switch Anthropic model selection to the local `claude-cli`
|
|
85
|
+
backend and store the matching Nodmix auth profile.
|
|
86
|
+
|
|
87
|
+
If `claude` is not on `PATH`, either install Claude Code first or set
|
|
88
|
+
`agents.defaults.cliBackends.claude-cli.command` to the real binary path.
|
|
89
|
+
|
|
90
|
+
Manual token entry (any provider; writes `auth-profiles.json` + updates config):
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
nodmix models auth paste-token --provider openrouter
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`auth-profiles.json` stores credentials only. The canonical shape is:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"version": 1,
|
|
101
|
+
"profiles": {
|
|
102
|
+
"openrouter:default": {
|
|
103
|
+
"type": "api_key",
|
|
104
|
+
"provider": "openrouter",
|
|
105
|
+
"key": "OPENROUTER_API_KEY"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Nodmix expects the canonical `version` + `profiles` shape at runtime. If an older install still has a flat file such as `{ "openrouter": { "apiKey": "..." } }`, run `nodmix doctor --fix` to rewrite it as an `openrouter:default` API-key profile; doctor keeps a `.legacy-flat.*.bak` copy beside the original. Endpoint details such as `baseUrl`, `api`, model ids, headers, and timeouts belong under `models.providers.<id>` in `nodmix.json` or `models.json`, not in `auth-profiles.json`.
|
|
112
|
+
|
|
113
|
+
External auth routes such as Bedrock `auth: "aws-sdk"` are also not credentials. If you want a named Bedrock route, put `auth.profiles.<id>.mode: "aws-sdk"` in `nodmix.json`; do not write `type: "aws-sdk"` into `auth-profiles.json`. `nodmix doctor --fix` moves legacy AWS SDK markers from the credential store into config metadata.
|
|
114
|
+
|
|
115
|
+
Auth profile refs are also supported for static credentials:
|
|
116
|
+
|
|
117
|
+
- `api_key` credentials can use `keyRef: { source, provider, id }`
|
|
118
|
+
- `token` credentials can use `tokenRef: { source, provider, id }`
|
|
119
|
+
- OAuth-mode profiles do not support SecretRef credentials; if `auth.profiles.<id>.mode` is set to `"oauth"`, SecretRef-backed `keyRef`/`tokenRef` input for that profile is rejected.
|
|
120
|
+
|
|
121
|
+
Automation-friendly check (exit `1` when expired/missing, `2` when expiring):
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
nodmix models status --check
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Live auth probes:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
nodmix models status --probe
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Notes:
|
|
134
|
+
|
|
135
|
+
- Probe rows can come from auth profiles, env credentials, or `models.json`.
|
|
136
|
+
- If explicit `auth.order.<provider>` omits a stored profile, probe reports
|
|
137
|
+
`excluded_by_auth_order` for that profile instead of trying it.
|
|
138
|
+
- If auth exists but Nodmix cannot resolve a probeable model candidate for
|
|
139
|
+
that provider, probe reports `status: no_model`.
|
|
140
|
+
- Rate-limit cooldowns can be model-scoped. A profile cooling down for one
|
|
141
|
+
model can still be usable for a sibling model on the same provider.
|
|
142
|
+
|
|
143
|
+
Optional ops scripts (systemd/Termux) are documented here:
|
|
144
|
+
[Auth monitoring scripts](/help/scripts#auth-monitoring-scripts)
|
|
145
|
+
|
|
146
|
+
## Anthropic note
|
|
147
|
+
|
|
148
|
+
The Anthropic `claude-cli` backend is supported again.
|
|
149
|
+
|
|
150
|
+
- Anthropic staff told us this Nodmix integration path is allowed again.
|
|
151
|
+
- Nodmix therefore treats Claude CLI reuse and `claude -p` usage as sanctioned
|
|
152
|
+
for Anthropic-backed runs unless Anthropic publishes a new policy.
|
|
153
|
+
- Anthropic API keys remain the most predictable choice for long-lived gateway
|
|
154
|
+
hosts and explicit server-side billing control.
|
|
155
|
+
|
|
156
|
+
## Checking model auth status
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
nodmix models status
|
|
160
|
+
nodmix doctor
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## API key rotation behavior (gateway)
|
|
164
|
+
|
|
165
|
+
Some providers support retrying a request with alternative keys when an API call
|
|
166
|
+
hits a provider rate limit.
|
|
167
|
+
|
|
168
|
+
- Priority order:
|
|
169
|
+
- `NODMIX_LIVE_<PROVIDER>_KEY` (single override)
|
|
170
|
+
- `<PROVIDER>_API_KEYS`
|
|
171
|
+
- `<PROVIDER>_API_KEY`
|
|
172
|
+
- `<PROVIDER>_API_KEY_*`
|
|
173
|
+
- Google providers also include `GOOGLE_API_KEY` as an additional fallback.
|
|
174
|
+
- The same key list is deduplicated before use.
|
|
175
|
+
- Nodmix retries with the next key only for rate-limit errors (for example
|
|
176
|
+
`429`, `rate_limit`, `quota`, `resource exhausted`, `Too many concurrent
|
|
177
|
+
requests`, `ThrottlingException`, `concurrency limit reached`, or
|
|
178
|
+
`workers_ai ... quota limit exceeded`).
|
|
179
|
+
- Non-rate-limit errors are not retried with alternate keys.
|
|
180
|
+
- If all keys fail, the final error from the last attempt is returned.
|
|
181
|
+
|
|
182
|
+
## Removing provider auth while the gateway is running
|
|
183
|
+
|
|
184
|
+
When provider auth is removed through the Gateway control plane, Nodmix deletes
|
|
185
|
+
the saved auth profiles for that provider and aborts active chat or agent runs
|
|
186
|
+
whose selected model provider matches the removed provider. The aborted runs emit
|
|
187
|
+
the normal chat cancellation and lifecycle events with
|
|
188
|
+
`stopReason: "auth-revoked"`, so connected clients can show that the run was
|
|
189
|
+
stopped because credentials were removed.
|
|
190
|
+
|
|
191
|
+
Removing saved auth does not revoke keys at the provider. Rotate or revoke the
|
|
192
|
+
key in the provider dashboard when you need provider-side invalidation.
|
|
193
|
+
|
|
194
|
+
## Controlling which credential is used
|
|
195
|
+
|
|
196
|
+
### Per-session (chat command)
|
|
197
|
+
|
|
198
|
+
Use `/model <alias-or-id>@<profileId>` to pin a specific provider credential for the current session (example profile ids: `anthropic:default`, `anthropic:work`).
|
|
199
|
+
|
|
200
|
+
Use `/model` (or `/model list`) for a compact picker; use `/model status` for the full view (candidates + next auth profile, plus provider endpoint details when configured).
|
|
201
|
+
|
|
202
|
+
### Per-agent (CLI override)
|
|
203
|
+
|
|
204
|
+
Set an explicit auth profile order override for an agent (stored in that agent's `auth-state.json`):
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
nodmix models auth order get --provider anthropic
|
|
208
|
+
nodmix models auth order set --provider anthropic anthropic:default
|
|
209
|
+
nodmix models auth order clear --provider anthropic
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Use `--agent <id>` to target a specific agent; omit it to use the configured default agent.
|
|
213
|
+
When you debug order issues, `nodmix models status --probe` shows omitted
|
|
214
|
+
stored profiles as `excluded_by_auth_order` instead of silently skipping them.
|
|
215
|
+
When you debug cooldown issues, remember that rate-limit cooldowns can be tied
|
|
216
|
+
to one model id rather than the whole provider profile.
|
|
217
|
+
|
|
218
|
+
## Troubleshooting
|
|
219
|
+
|
|
220
|
+
### "No credentials found"
|
|
221
|
+
|
|
222
|
+
If the Anthropic profile is missing, configure an Anthropic API key on the
|
|
223
|
+
**gateway host** or set up the Anthropic setup-token path, then re-check:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
nodmix models status
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Token expiring/expired
|
|
230
|
+
|
|
231
|
+
Run `nodmix models status` to confirm which profile is expiring. If an
|
|
232
|
+
Anthropic token profile is missing or expired, refresh that setup via
|
|
233
|
+
setup-token or migrate to an Anthropic API key.
|
|
234
|
+
|
|
235
|
+
## Related
|
|
236
|
+
|
|
237
|
+
- [Secrets management](/gateway/secrets)
|
|
238
|
+
- [Remote access](/gateway/remote)
|
|
239
|
+
- [Auth storage](/concepts/oauth)
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Background exec execution and process management"
|
|
3
|
+
read_when:
|
|
4
|
+
- Adding or modifying background exec behavior
|
|
5
|
+
- Debugging long-running exec tasks
|
|
6
|
+
title: "Background exec and process tool"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Nodmix runs shell commands through the `exec` tool and keeps long-running tasks in memory. The `process` tool manages those background sessions.
|
|
10
|
+
|
|
11
|
+
## exec tool
|
|
12
|
+
|
|
13
|
+
Key parameters:
|
|
14
|
+
|
|
15
|
+
- `command` (required)
|
|
16
|
+
- `yieldMs` (default 10000): auto-background after this delay
|
|
17
|
+
- `background` (bool): background immediately
|
|
18
|
+
- `timeout` (seconds, default `tools.exec.timeoutSec`): kill the process after this timeout; set `timeout: 0` only to disable the exec process timeout for that call
|
|
19
|
+
- `elevated` (bool): run outside the sandbox if elevated mode is enabled/allowed (`gateway` by default, or `node` when the exec target is `node`)
|
|
20
|
+
- Need a real TTY? Set `pty: true`.
|
|
21
|
+
- `workdir`, `env`
|
|
22
|
+
|
|
23
|
+
Behavior:
|
|
24
|
+
|
|
25
|
+
- Foreground runs return output directly.
|
|
26
|
+
- When backgrounded (explicit or timeout), the tool returns `status: "running"` + `sessionId` and a short tail.
|
|
27
|
+
- Background and `yieldMs` runs inherit `tools.exec.timeoutSec` unless the call provides an explicit `timeout`.
|
|
28
|
+
- Output is kept in memory until the session is polled or cleared.
|
|
29
|
+
- If the `process` tool is disallowed, `exec` runs synchronously and ignores `yieldMs`/`background`.
|
|
30
|
+
- Spawned exec commands receive `NODMIX_SHELL=exec` for context-aware shell/profile rules.
|
|
31
|
+
- For long-running work that starts now, start it once and rely on automatic
|
|
32
|
+
completion wake when it is enabled and the command emits output or fails.
|
|
33
|
+
- If automatic completion wake is unavailable, or you need quiet-success
|
|
34
|
+
confirmation for a command that exited cleanly without output, use `process`
|
|
35
|
+
to confirm completion.
|
|
36
|
+
- Do not emulate reminders or delayed follow-ups with `sleep` loops or repeated
|
|
37
|
+
polling; use cron for future work.
|
|
38
|
+
|
|
39
|
+
## Child process bridging
|
|
40
|
+
|
|
41
|
+
When spawning long-running child processes outside the exec/process tools (for example, CLI respawns or gateway helpers), attach the child-process bridge helper so termination signals are forwarded and listeners are detached on exit/error. This avoids orphaned processes on systemd and keeps shutdown behavior consistent across platforms.
|
|
42
|
+
|
|
43
|
+
Environment overrides:
|
|
44
|
+
|
|
45
|
+
- `PI_BASH_YIELD_MS`: default yield (ms)
|
|
46
|
+
- `PI_BASH_MAX_OUTPUT_CHARS`: in-memory output cap (chars)
|
|
47
|
+
- `NODMIX_BASH_PENDING_MAX_OUTPUT_CHARS`: pending stdout/stderr cap per stream (chars)
|
|
48
|
+
- `PI_BASH_JOB_TTL_MS`: TTL for finished sessions (ms, bounded to 1m–3h)
|
|
49
|
+
- `NODMIX_PROCESS_INPUT_WAIT_IDLE_MS`: idle-output threshold before writable background sessions are marked as likely waiting for input (default 15000 ms)
|
|
50
|
+
|
|
51
|
+
Config (preferred):
|
|
52
|
+
|
|
53
|
+
- `tools.exec.backgroundMs` (default 10000)
|
|
54
|
+
- `tools.exec.timeoutSec` (default 1800)
|
|
55
|
+
- `tools.exec.cleanupMs` (default 1800000)
|
|
56
|
+
- `tools.exec.notifyOnExit` (default true): enqueue a system event + request heartbeat when a backgrounded exec exits.
|
|
57
|
+
- `tools.exec.notifyOnExitEmptySuccess` (default false): when true, also enqueue completion events for successful backgrounded runs that produced no output.
|
|
58
|
+
|
|
59
|
+
## process tool
|
|
60
|
+
|
|
61
|
+
Actions:
|
|
62
|
+
|
|
63
|
+
- `list`: running + finished sessions
|
|
64
|
+
- `poll`: drain new output for a session (also reports exit status)
|
|
65
|
+
- `log`: read the aggregated output and show input recovery hints (supports `offset` + `limit`)
|
|
66
|
+
- `write`: send stdin (`data`, optional `eof`)
|
|
67
|
+
- `send-keys`: send explicit key tokens or bytes to a PTY-backed session
|
|
68
|
+
- `submit`: send Enter / carriage return to a PTY-backed session
|
|
69
|
+
- `paste`: send literal text, optionally wrapped in bracketed paste mode
|
|
70
|
+
- `kill`: terminate a background session
|
|
71
|
+
- `clear`: remove a finished session from memory
|
|
72
|
+
- `remove`: kill if running, otherwise clear if finished
|
|
73
|
+
|
|
74
|
+
Notes:
|
|
75
|
+
|
|
76
|
+
- Only backgrounded sessions are listed/persisted in memory.
|
|
77
|
+
- Sessions are lost on process restart (no disk persistence).
|
|
78
|
+
- Session logs are only saved to chat history if you run `process poll/log` and the tool result is recorded.
|
|
79
|
+
- `process` is scoped per agent; it only sees sessions started by that agent.
|
|
80
|
+
- Use `poll` / `log` for status, logs, quiet-success confirmation, or
|
|
81
|
+
completion confirmation when automatic completion wake is unavailable.
|
|
82
|
+
- Use `log` before recovering an interactive CLI so the current transcript,
|
|
83
|
+
stdin state, and input-wait hint are visible together.
|
|
84
|
+
- Use `write` / `send-keys` / `submit` / `paste` / `kill` when you need input
|
|
85
|
+
or intervention.
|
|
86
|
+
- `process list` includes a derived `name` (command verb + target) for quick scans.
|
|
87
|
+
- `process list`, `poll`, and `log` report `waitingForInput` only
|
|
88
|
+
when the session still has writable stdin and has been idle longer than the
|
|
89
|
+
input-wait threshold.
|
|
90
|
+
- `process log` uses line-based `offset`/`limit`.
|
|
91
|
+
- When both `offset` and `limit` are omitted, it returns the last 200 lines and includes a paging hint.
|
|
92
|
+
- When `offset` is provided and `limit` is omitted, it returns from `offset` to the end (not capped to 200).
|
|
93
|
+
- Polling is for on-demand status, not wait-loop scheduling. If the work should
|
|
94
|
+
happen later, use cron instead.
|
|
95
|
+
|
|
96
|
+
## Examples
|
|
97
|
+
|
|
98
|
+
Run a long task and poll later:
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{ "tool": "exec", "command": "sleep 5 && echo done", "yieldMs": 1000 }
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```json
|
|
105
|
+
{ "tool": "process", "action": "poll", "sessionId": "<id>" }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Inspect an interactive session before sending input:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{ "tool": "process", "action": "log", "sessionId": "<id>" }
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Start immediately in background:
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{ "tool": "exec", "command": "npm run build", "background": true }
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Send stdin:
|
|
121
|
+
|
|
122
|
+
```json
|
|
123
|
+
{ "tool": "process", "action": "write", "sessionId": "<id>", "data": "y\n" }
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Send PTY keys:
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{ "tool": "process", "action": "send-keys", "sessionId": "<id>", "keys": ["C-c"] }
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Submit current line:
|
|
133
|
+
|
|
134
|
+
```json
|
|
135
|
+
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Paste literal text:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Related
|
|
145
|
+
|
|
146
|
+
- [Exec tool](/tools/exec)
|
|
147
|
+
- [Exec approvals](/tools/exec-approvals)
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: "Bonjour/mDNS discovery + debugging (Gateway beacons, clients, and common failure modes)"
|
|
3
|
+
read_when:
|
|
4
|
+
- Debugging Bonjour discovery issues on macOS/iOS
|
|
5
|
+
- Changing mDNS service types, TXT records, or discovery UX
|
|
6
|
+
title: "Bonjour discovery"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Nodmix can use Bonjour (mDNS / DNS-SD) to discover an active Gateway (WebSocket endpoint).
|
|
10
|
+
Multicast `local.` browsing is a **LAN-only convenience**. The bundled `bonjour`
|
|
11
|
+
plugin owns LAN advertising. It auto-starts on macOS hosts and is opt-in on
|
|
12
|
+
Linux, Windows, and containerized Gateway deployments. For cross-network discovery, the same
|
|
13
|
+
beacon can also be published through a configured wide-area DNS-SD domain. Discovery
|
|
14
|
+
is still best-effort and does **not** replace SSH or Tailnet-based connectivity.
|
|
15
|
+
|
|
16
|
+
## Wide-area Bonjour (Unicast DNS-SD) over Tailscale
|
|
17
|
+
|
|
18
|
+
If the node and gateway are on different networks, multicast mDNS won't cross the
|
|
19
|
+
boundary. You can keep the same discovery UX by switching to **unicast DNS-SD**
|
|
20
|
+
("Wide-Area Bonjour") over Tailscale.
|
|
21
|
+
|
|
22
|
+
High-level steps:
|
|
23
|
+
|
|
24
|
+
1. Run a DNS server on the gateway host (reachable over Tailnet).
|
|
25
|
+
2. Publish DNS-SD records for `_nodmix-gw._tcp` under a dedicated zone
|
|
26
|
+
(example: `nodmix.internal.`).
|
|
27
|
+
3. Configure Tailscale **split DNS** so your chosen domain resolves via that
|
|
28
|
+
DNS server for clients (including iOS).
|
|
29
|
+
|
|
30
|
+
Nodmix supports any discovery domain; `nodmix.internal.` is just an example.
|
|
31
|
+
iOS/Android nodes browse both `local.` and your configured wide-area domain.
|
|
32
|
+
|
|
33
|
+
### Gateway config (recommended)
|
|
34
|
+
|
|
35
|
+
```json5
|
|
36
|
+
{
|
|
37
|
+
gateway: { bind: "tailnet" }, // tailnet-only (recommended)
|
|
38
|
+
discovery: { wideArea: { enabled: true } }, // enables wide-area DNS-SD publishing
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### One-time DNS server setup (gateway host)
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
nodmix dns setup --apply
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This installs CoreDNS and configures it to:
|
|
49
|
+
|
|
50
|
+
- listen on port 53 only on the gateway's Tailscale interfaces
|
|
51
|
+
- serve your chosen domain (example: `nodmix.internal.`) from `~/.nodmix/dns/<domain>.db`
|
|
52
|
+
|
|
53
|
+
Validate from a tailnet-connected machine:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
dns-sd -B _nodmix-gw._tcp nodmix.internal.
|
|
57
|
+
dig @<TAILNET_IPV4> -p 53 _nodmix-gw._tcp.nodmix.internal PTR +short
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Tailscale DNS settings
|
|
61
|
+
|
|
62
|
+
In the Tailscale admin console:
|
|
63
|
+
|
|
64
|
+
- Add a nameserver pointing at the gateway's tailnet IP (UDP/TCP 53).
|
|
65
|
+
- Add split DNS so your discovery domain uses that nameserver.
|
|
66
|
+
|
|
67
|
+
Once clients accept tailnet DNS, iOS nodes and CLI discovery can browse
|
|
68
|
+
`_nodmix-gw._tcp` in your discovery domain without multicast.
|
|
69
|
+
|
|
70
|
+
### Gateway listener security (recommended)
|
|
71
|
+
|
|
72
|
+
The Gateway WS port (default `18789`) binds to loopback by default. For LAN/tailnet
|
|
73
|
+
access, bind explicitly and keep auth enabled.
|
|
74
|
+
|
|
75
|
+
For tailnet-only setups:
|
|
76
|
+
|
|
77
|
+
- Set `gateway.bind: "tailnet"` in `~/.nodmix/nodmix.json`.
|
|
78
|
+
- Restart the Gateway (or restart the macOS menubar app).
|
|
79
|
+
|
|
80
|
+
## What advertises
|
|
81
|
+
|
|
82
|
+
Only the Gateway advertises `_nodmix-gw._tcp`. LAN multicast advertising is
|
|
83
|
+
provided by the bundled `bonjour` plugin when the plugin is enabled; wide-area
|
|
84
|
+
DNS-SD publishing remains Gateway-owned.
|
|
85
|
+
|
|
86
|
+
## Service types
|
|
87
|
+
|
|
88
|
+
- `_nodmix-gw._tcp` - gateway transport beacon (used by macOS/iOS/Android nodes).
|
|
89
|
+
|
|
90
|
+
## TXT keys (non-secret hints)
|
|
91
|
+
|
|
92
|
+
The Gateway advertises small non-secret hints to make UI flows convenient:
|
|
93
|
+
|
|
94
|
+
- `role=gateway`
|
|
95
|
+
- `displayName=<friendly name>`
|
|
96
|
+
- `lanHost=<hostname>.local`
|
|
97
|
+
- `gatewayPort=<port>` (Gateway WS + HTTP)
|
|
98
|
+
- `gatewayTls=1` (only when TLS is enabled)
|
|
99
|
+
- `gatewayTlsSha256=<sha256>` (only when TLS is enabled and fingerprint is available)
|
|
100
|
+
- `canvasPort=<port>` (only when the canvas host is enabled; currently the same as `gatewayPort`)
|
|
101
|
+
- `transport=gateway`
|
|
102
|
+
- `tailnetDns=<magicdns>` (mDNS full mode only, optional hint when Tailnet is available)
|
|
103
|
+
- `sshPort=<port>` (full mode only; omitted in minimal and off modes)
|
|
104
|
+
- `cliPath=<path>` (full mode only; omitted in minimal and off modes)
|
|
105
|
+
|
|
106
|
+
Security notes:
|
|
107
|
+
|
|
108
|
+
- Bonjour/mDNS TXT records are **unauthenticated**. Clients must not treat TXT as authoritative routing.
|
|
109
|
+
- Clients should route using the resolved service endpoint (SRV + A/AAAA). Treat `lanHost`, `tailnetDns`, `gatewayPort`, and `gatewayTlsSha256` as hints only.
|
|
110
|
+
- SSH auto-targeting should likewise use the resolved service host, not TXT-only hints.
|
|
111
|
+
- TLS pinning must never allow an advertised `gatewayTlsSha256` to override a previously stored pin.
|
|
112
|
+
- iOS/Android nodes should treat discovery-based direct connects as **TLS-only** and require explicit user confirmation before trusting a first-time fingerprint.
|
|
113
|
+
|
|
114
|
+
## Debugging on macOS
|
|
115
|
+
|
|
116
|
+
Useful built-in tools:
|
|
117
|
+
|
|
118
|
+
- Browse instances:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
dns-sd -B _nodmix-gw._tcp local.
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- Resolve one instance (replace `<instance>`):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
dns-sd -L "<instance>" _nodmix-gw._tcp local.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
If browsing works but resolving fails, you're usually hitting a LAN policy or
|
|
131
|
+
mDNS resolver issue.
|
|
132
|
+
|
|
133
|
+
## Debugging in Gateway logs
|
|
134
|
+
|
|
135
|
+
The Gateway writes a rolling log file (printed on startup as
|
|
136
|
+
`gateway log file: ...`). Look for `bonjour:` lines, especially:
|
|
137
|
+
|
|
138
|
+
- `bonjour: advertise failed ...`
|
|
139
|
+
- `bonjour: suppressing ciao cancellation ...`
|
|
140
|
+
- `bonjour: ... name conflict resolved` / `hostname conflict resolved`
|
|
141
|
+
- `bonjour: watchdog detected non-announced service ...`
|
|
142
|
+
- `bonjour: disabling advertiser after ... failed restarts ...`
|
|
143
|
+
|
|
144
|
+
The watchdog treats active `probing`, `announcing`, and fresh conflict-renames as
|
|
145
|
+
in-progress states. If the service never reaches `announced`, Nodmix eventually
|
|
146
|
+
recreates the advertiser and, after repeated failures, disables Bonjour for that
|
|
147
|
+
Gateway process instead of re-advertising forever.
|
|
148
|
+
|
|
149
|
+
Bonjour uses the system hostname for the advertised `.local` host when it is a
|
|
150
|
+
valid DNS label. If the system hostname contains spaces, underscores, or another
|
|
151
|
+
invalid DNS-label character, Nodmix falls back to `nodmix.local`. Set
|
|
152
|
+
`NODMIX_MDNS_HOSTNAME=<name>` before starting the Gateway when you need an
|
|
153
|
+
explicit host label.
|
|
154
|
+
|
|
155
|
+
## Debugging on iOS node
|
|
156
|
+
|
|
157
|
+
The iOS node uses `NWBrowser` to discover `_nodmix-gw._tcp`.
|
|
158
|
+
|
|
159
|
+
To capture logs:
|
|
160
|
+
|
|
161
|
+
- Settings → Gateway → Advanced → **Discovery Debug Logs**
|
|
162
|
+
- Settings → Gateway → Advanced → **Discovery Logs** → reproduce → **Copy**
|
|
163
|
+
|
|
164
|
+
The log includes browser state transitions and result-set changes.
|
|
165
|
+
|
|
166
|
+
## When to enable Bonjour
|
|
167
|
+
|
|
168
|
+
Bonjour auto-starts for empty-config Gateway startup on macOS hosts because the
|
|
169
|
+
local app and nearby iOS/Android nodes commonly rely on same-LAN discovery.
|
|
170
|
+
|
|
171
|
+
Enable Bonjour explicitly when same-LAN auto-discovery is useful on Linux,
|
|
172
|
+
Windows, or another non-macOS host:
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
nodmix plugins enable bonjour
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
When enabled, Bonjour uses `discovery.mdns.mode` to decide how much TXT metadata
|
|
179
|
+
to publish. The same mode controls optional TXT hints in wide-area DNS-SD records.
|
|
180
|
+
The default mode is `minimal`; use `full` only when clients need `cliPath` or
|
|
181
|
+
`sshPort` hints. Use `off` to suppress LAN multicast without changing plugin
|
|
182
|
+
enablement; wide-area DNS-SD can still publish the minimal Gateway beacon when
|
|
183
|
+
`discovery.wideArea.enabled` is true.
|
|
184
|
+
|
|
185
|
+
## When to disable Bonjour
|
|
186
|
+
|
|
187
|
+
Leave Bonjour disabled when LAN multicast advertising is unnecessary, unavailable,
|
|
188
|
+
or harmful. The common cases are non-macOS servers, Docker bridge networking,
|
|
189
|
+
WSL, or a network policy that drops mDNS multicast. In those environments the
|
|
190
|
+
Gateway is still reachable through its published URL, SSH, Tailnet, or wide-area
|
|
191
|
+
DNS-SD, but LAN auto-discovery is not reliable.
|
|
192
|
+
|
|
193
|
+
Prefer the existing environment override when the problem is deployment-scoped:
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
NODMIX_DISABLE_BONJOUR=1
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
That disables LAN multicast advertising without changing plugin configuration.
|
|
200
|
+
It is safe for Docker images, service files, launch scripts, and one-off
|
|
201
|
+
debugging because the setting disappears when the environment does.
|
|
202
|
+
|
|
203
|
+
Use plugin configuration when you intentionally want to turn off the bundled LAN
|
|
204
|
+
discovery plugin for that Nodmix config:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
nodmix plugins disable bonjour
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Docker gotchas
|
|
211
|
+
|
|
212
|
+
The bundled Bonjour plugin auto-disables LAN multicast advertising in detected
|
|
213
|
+
containers when `NODMIX_DISABLE_BONJOUR` is unset. Docker bridge networks
|
|
214
|
+
usually do not forward mDNS multicast (`224.0.0.251:5353`) between the container
|
|
215
|
+
and the LAN, so advertising from the container rarely makes discovery work.
|
|
216
|
+
|
|
217
|
+
Important gotchas:
|
|
218
|
+
|
|
219
|
+
- Bonjour auto-starts on macOS hosts and is opt-in elsewhere. Leaving it
|
|
220
|
+
disabled does not stop the Gateway; it only skips LAN multicast advertising.
|
|
221
|
+
- Disabling Bonjour does not change `gateway.bind`; Docker still defaults to
|
|
222
|
+
`NODMIX_GATEWAY_BIND=lan` so the published host port can work.
|
|
223
|
+
- Disabling Bonjour does not disable wide-area DNS-SD. Use wide-area discovery
|
|
224
|
+
or Tailnet when the Gateway and node are not on the same LAN.
|
|
225
|
+
- Reusing the same `NODMIX_CONFIG_DIR` outside Docker does not persist the
|
|
226
|
+
container auto-disable policy.
|
|
227
|
+
- Set `NODMIX_DISABLE_BONJOUR=0` only for host networking, macvlan, or another
|
|
228
|
+
network where mDNS multicast is known to pass; set it to `1` to force-disable.
|
|
229
|
+
|
|
230
|
+
## Troubleshooting disabled Bonjour
|
|
231
|
+
|
|
232
|
+
If a node no longer auto-discovers the Gateway after Docker setup:
|
|
233
|
+
|
|
234
|
+
1. Confirm whether the Gateway is running in auto, forced-on, or forced-off mode:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
docker compose config | grep NODMIX_DISABLE_BONJOUR
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
2. Confirm the Gateway itself is reachable through the published port:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
curl -fsS http://127.0.0.1:18789/healthz
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
3. Use a direct target when Bonjour is disabled:
|
|
247
|
+
- Control UI or local tools: `http://127.0.0.1:18789`
|
|
248
|
+
- LAN clients: `http://<gateway-host>:18789`
|
|
249
|
+
- Cross-network clients: Tailnet MagicDNS, Tailnet IP, SSH tunnel, or
|
|
250
|
+
wide-area DNS-SD
|
|
251
|
+
|
|
252
|
+
4. If you deliberately enabled the Bonjour plugin in Docker and forced advertising
|
|
253
|
+
with `NODMIX_DISABLE_BONJOUR=0`, test multicast from the host:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
dns-sd -B _nodmix-gw._tcp local.
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
If browsing is empty or the Gateway logs show repeated ciao watchdog
|
|
260
|
+
cancellations, restore `NODMIX_DISABLE_BONJOUR=1` and use a direct or
|
|
261
|
+
Tailnet route.
|
|
262
|
+
|
|
263
|
+
## Common failure modes
|
|
264
|
+
|
|
265
|
+
- **Bonjour doesn't cross networks**: use Tailnet or SSH.
|
|
266
|
+
- **Multicast blocked**: some Wi-Fi networks disable mDNS.
|
|
267
|
+
- **Advertiser stuck in probing/announcing**: hosts with blocked multicast,
|
|
268
|
+
container bridges, WSL, or interface churn can leave the ciao advertiser in a
|
|
269
|
+
non-announced state. Nodmix retries a few times and then disables Bonjour
|
|
270
|
+
for the current Gateway process instead of restarting the advertiser forever.
|
|
271
|
+
- **Docker bridge networking**: Bonjour auto-disables in detected containers.
|
|
272
|
+
Set `NODMIX_DISABLE_BONJOUR=0` only for host, macvlan, or another
|
|
273
|
+
mDNS-capable network.
|
|
274
|
+
- **Sleep / interface churn**: macOS may temporarily drop mDNS results; retry.
|
|
275
|
+
- **Browse works but resolve fails**: keep machine names simple (avoid emojis or
|
|
276
|
+
punctuation), then restart the Gateway. The service instance name derives from
|
|
277
|
+
the host name, so overly complex names can confuse some resolvers.
|
|
278
|
+
|
|
279
|
+
## Escaped instance names (`\032`)
|
|
280
|
+
|
|
281
|
+
Bonjour/DNS-SD often escapes bytes in service instance names as decimal `\DDD`
|
|
282
|
+
sequences (e.g. spaces become `\032`).
|
|
283
|
+
|
|
284
|
+
- This is normal at the protocol level.
|
|
285
|
+
- UIs should decode for display (iOS uses `BonjourEscapes.decode`).
|
|
286
|
+
|
|
287
|
+
## Enabling / disabling / configuration
|
|
288
|
+
|
|
289
|
+
- macOS hosts auto-start the bundled LAN discovery plugin by default.
|
|
290
|
+
- `nodmix plugins enable bonjour` enables the bundled LAN discovery plugin on hosts where it is not default-enabled.
|
|
291
|
+
- `nodmix plugins disable bonjour` disables LAN multicast advertising by disabling the bundled plugin.
|
|
292
|
+
- `NODMIX_DISABLE_BONJOUR=1` disables LAN multicast advertising without changing plugin config; accepted truthy values are `1`, `true`, `yes`, and `on` (legacy: `NODMIX_DISABLE_BONJOUR`).
|
|
293
|
+
- `NODMIX_DISABLE_BONJOUR=0` forces LAN multicast advertising on, including inside detected containers; accepted falsy values are `0`, `false`, `no`, and `off`.
|
|
294
|
+
- When the Bonjour plugin is enabled and `NODMIX_DISABLE_BONJOUR` is unset, Bonjour advertises on normal hosts and auto-disables inside detected containers.
|
|
295
|
+
- `gateway.bind` in `~/.nodmix/nodmix.json` controls the Gateway bind mode.
|
|
296
|
+
- `NODMIX_SSH_PORT` overrides the SSH port when `sshPort` is advertised (legacy: `NODMIX_SSH_PORT`).
|
|
297
|
+
- `NODMIX_TAILNET_DNS` publishes a MagicDNS hint in TXT when mDNS full mode is enabled (legacy: `NODMIX_TAILNET_DNS`).
|
|
298
|
+
- `NODMIX_CLI_PATH` overrides the advertised CLI path (legacy: `NODMIX_CLI_PATH`).
|
|
299
|
+
|
|
300
|
+
## Related docs
|
|
301
|
+
|
|
302
|
+
- Discovery policy and transport selection: [Discovery](/gateway/discovery)
|
|
303
|
+
- Node pairing + approvals: [Gateway pairing](/gateway/pairing)
|