Merge branch 'main' into qianfan
commit
3997316fb0
|
|
@ -0,0 +1,185 @@
|
||||||
|
---
|
||||||
|
name: merge-pr
|
||||||
|
description: Merge a GitHub PR via squash after /preparepr. Use when asked to merge a ready PR. Do not push to main or modify code. Ensure the PR ends in MERGED state and clean up worktrees after success.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Merge PR
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Merge a prepared PR via `gh pr merge --squash` and clean up the worktree after success.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- Ask for PR number or URL.
|
||||||
|
- If missing, auto-detect from conversation.
|
||||||
|
- If ambiguous, ask.
|
||||||
|
|
||||||
|
## Safety
|
||||||
|
|
||||||
|
- Use `gh pr merge --squash` as the only path to `main`.
|
||||||
|
- Do not run `git push` at all during merge.
|
||||||
|
- Do not run gateway stop commands. Do not kill processes. Do not touch port 18792.
|
||||||
|
|
||||||
|
## Execution Rule
|
||||||
|
|
||||||
|
- Execute the workflow. Do not stop after printing the TODO checklist.
|
||||||
|
- If delegating, require the delegate to run commands and capture outputs.
|
||||||
|
|
||||||
|
## Known Footguns
|
||||||
|
|
||||||
|
- If you see "fatal: not a git repository", you are in the wrong directory. Use `~/Development/openclaw`, not `~/openclaw`.
|
||||||
|
- Read `.local/review.md` and `.local/prep.md` in the worktree. Do not skip.
|
||||||
|
- Clean up the real worktree directory `.worktrees/pr-<PR>` only after a successful merge.
|
||||||
|
- Expect cleanup to remove `.local/` artifacts.
|
||||||
|
|
||||||
|
## Completion Criteria
|
||||||
|
|
||||||
|
- Ensure `gh pr merge` succeeds.
|
||||||
|
- Ensure PR state is `MERGED`, never `CLOSED`.
|
||||||
|
- Record the merge SHA.
|
||||||
|
- Run cleanup only after merge success.
|
||||||
|
|
||||||
|
## First: Create a TODO Checklist
|
||||||
|
|
||||||
|
Create a checklist of all merge steps, print it, then continue and execute the commands.
|
||||||
|
|
||||||
|
## Setup: Use a Worktree
|
||||||
|
|
||||||
|
Use an isolated worktree for all merge work.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/Development/openclaw
|
||||||
|
# Sanity: confirm you are in the repo
|
||||||
|
git rev-parse --show-toplevel
|
||||||
|
|
||||||
|
WORKTREE_DIR=".worktrees/pr-<PR>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Run all commands inside the worktree directory.
|
||||||
|
|
||||||
|
## Load Local Artifacts (Mandatory)
|
||||||
|
|
||||||
|
Expect these files from earlier steps:
|
||||||
|
|
||||||
|
- `.local/review.md` from `/reviewpr`
|
||||||
|
- `.local/prep.md` from `/preparepr`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls -la .local || true
|
||||||
|
|
||||||
|
if [ -f .local/review.md ]; then
|
||||||
|
echo "Found .local/review.md"
|
||||||
|
sed -n '1,120p' .local/review.md
|
||||||
|
else
|
||||||
|
echo "Missing .local/review.md. Stop and run /reviewpr, then /preparepr."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f .local/prep.md ]; then
|
||||||
|
echo "Found .local/prep.md"
|
||||||
|
sed -n '1,120p' .local/prep.md
|
||||||
|
else
|
||||||
|
echo "Missing .local/prep.md. Stop and run /preparepr first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Identify PR meta
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr view <PR> --json number,title,state,isDraft,author,headRefName,baseRefName,headRepository,body --jq '{number,title,state,isDraft,author:.author.login,head:.headRefName,base:.baseRefName,headRepo:.headRepository.nameWithOwner,body}'
|
||||||
|
contrib=$(gh pr view <PR> --json author --jq .author.login)
|
||||||
|
head=$(gh pr view <PR> --json headRefName --jq .headRefName)
|
||||||
|
head_repo_url=$(gh pr view <PR> --json headRepository --jq .headRepository.url)
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Run sanity checks
|
||||||
|
|
||||||
|
Stop if any are true:
|
||||||
|
|
||||||
|
- PR is a draft.
|
||||||
|
- Required checks are failing.
|
||||||
|
- Branch is behind main.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Checks
|
||||||
|
gh pr checks <PR>
|
||||||
|
|
||||||
|
# Check behind main
|
||||||
|
git fetch origin main
|
||||||
|
git fetch origin pull/<PR>/head:pr-<PR>
|
||||||
|
git merge-base --is-ancestor origin/main pr-<PR> || echo "PR branch is behind main, run /preparepr"
|
||||||
|
```
|
||||||
|
|
||||||
|
If anything is failing or behind, stop and say to run `/preparepr`.
|
||||||
|
|
||||||
|
3. Merge PR and delete branch
|
||||||
|
|
||||||
|
If checks are still running, use `--auto` to queue the merge.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check status first
|
||||||
|
check_status=$(gh pr checks <PR> 2>&1)
|
||||||
|
if echo "$check_status" | grep -q "pending\|queued"; then
|
||||||
|
echo "Checks still running, using --auto to queue merge"
|
||||||
|
gh pr merge <PR> --squash --delete-branch --auto
|
||||||
|
echo "Merge queued. Monitor with: gh pr checks <PR> --watch"
|
||||||
|
else
|
||||||
|
gh pr merge <PR> --squash --delete-branch
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
If merge fails, report the error and stop. Do not retry in a loop.
|
||||||
|
If the PR needs changes beyond what `/preparepr` already did, stop and say to run `/preparepr` again.
|
||||||
|
|
||||||
|
4. Get merge SHA
|
||||||
|
|
||||||
|
```sh
|
||||||
|
merge_sha=$(gh pr view <PR> --json mergeCommit --jq '.mergeCommit.oid')
|
||||||
|
echo "merge_sha=$merge_sha"
|
||||||
|
```
|
||||||
|
|
||||||
|
5. Optional comment
|
||||||
|
|
||||||
|
Use a literal multiline string or heredoc for newlines.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr comment <PR> -F - <<'EOF'
|
||||||
|
Merged via squash.
|
||||||
|
|
||||||
|
- Merge commit: $merge_sha
|
||||||
|
|
||||||
|
Thanks @$contrib!
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Verify PR state is MERGED
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr view <PR> --json state --jq .state
|
||||||
|
```
|
||||||
|
|
||||||
|
7. Clean up worktree only on success
|
||||||
|
|
||||||
|
Run cleanup only if step 6 returned `MERGED`.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/Development/openclaw
|
||||||
|
|
||||||
|
git worktree remove ".worktrees/pr-<PR>" --force
|
||||||
|
|
||||||
|
git branch -D temp/pr-<PR> 2>/dev/null || true
|
||||||
|
git branch -D pr-<PR> 2>/dev/null || true
|
||||||
|
```
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
|
||||||
|
- Worktree only.
|
||||||
|
- Do not close PRs.
|
||||||
|
- End in MERGED state.
|
||||||
|
- Clean up only after merge success.
|
||||||
|
- Never push to main. Use `gh pr merge --squash` only.
|
||||||
|
- Do not run `git push` at all in this command.
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
interface:
|
||||||
|
display_name: "Merge PR"
|
||||||
|
short_description: "Merge GitHub PRs via squash"
|
||||||
|
default_prompt: "Use $merge-pr to merge a GitHub PR via squash after preparation."
|
||||||
|
|
@ -0,0 +1,248 @@
|
||||||
|
---
|
||||||
|
name: prepare-pr
|
||||||
|
description: Prepare a GitHub PR for merge by rebasing onto main, fixing review findings, running gates, committing fixes, and pushing to the PR head branch. Use after /reviewpr. Never merge or push to main.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Prepare PR
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Prepare a PR branch for merge with review fixes, green gates, and an updated head branch.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- Ask for PR number or URL.
|
||||||
|
- If missing, auto-detect from conversation.
|
||||||
|
- If ambiguous, ask.
|
||||||
|
|
||||||
|
## Safety
|
||||||
|
|
||||||
|
- Never push to `main` or `origin/main`. Push only to the PR head branch.
|
||||||
|
- Never run `git push` without specifying remote and branch explicitly. Do not run bare `git push`.
|
||||||
|
- Do not run gateway stop commands. Do not kill processes. Do not touch port 18792.
|
||||||
|
- Do not run `git clean -fdx`.
|
||||||
|
- Do not run `git add -A` or `git add .`. Stage only specific files changed.
|
||||||
|
|
||||||
|
## Execution Rule
|
||||||
|
|
||||||
|
- Execute the workflow. Do not stop after printing the TODO checklist.
|
||||||
|
- If delegating, require the delegate to run commands and capture outputs.
|
||||||
|
|
||||||
|
## Known Footguns
|
||||||
|
|
||||||
|
- If you see "fatal: not a git repository", you are in the wrong directory. Use `~/openclaw`.
|
||||||
|
- Do not run `git clean -fdx`.
|
||||||
|
- Do not run `git add -A` or `git add .`.
|
||||||
|
|
||||||
|
## Completion Criteria
|
||||||
|
|
||||||
|
- Rebase PR commits onto `origin/main`.
|
||||||
|
- Fix all BLOCKER and IMPORTANT items from `.local/review.md`.
|
||||||
|
- Run gates and pass.
|
||||||
|
- Commit prep changes.
|
||||||
|
- Push the updated HEAD back to the PR head branch.
|
||||||
|
- Write `.local/prep.md` with a prep summary.
|
||||||
|
- Output exactly: `PR is ready for /mergepr`.
|
||||||
|
|
||||||
|
## First: Create a TODO Checklist
|
||||||
|
|
||||||
|
Create a checklist of all prep steps, print it, then continue and execute the commands.
|
||||||
|
|
||||||
|
## Setup: Use a Worktree
|
||||||
|
|
||||||
|
Use an isolated worktree for all prep work.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/openclaw
|
||||||
|
# Sanity: confirm you are in the repo
|
||||||
|
git rev-parse --show-toplevel
|
||||||
|
|
||||||
|
WORKTREE_DIR=".worktrees/pr-<PR>"
|
||||||
|
```
|
||||||
|
|
||||||
|
Run all commands inside the worktree directory.
|
||||||
|
|
||||||
|
## Load Review Findings (Mandatory)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
if [ -f .local/review.md ]; then
|
||||||
|
echo "Found review findings from /reviewpr"
|
||||||
|
else
|
||||||
|
echo "Missing .local/review.md. Run /reviewpr first and save findings."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Read it
|
||||||
|
sed -n '1,200p' .local/review.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Identify PR meta (author, head branch, head repo URL)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr view <PR> --json number,title,author,headRefName,baseRefName,headRepository,body --jq '{number,title,author:.author.login,head:.headRefName,base:.baseRefName,headRepo:.headRepository.nameWithOwner,body}'
|
||||||
|
contrib=$(gh pr view <PR> --json author --jq .author.login)
|
||||||
|
head=$(gh pr view <PR> --json headRefName --jq .headRefName)
|
||||||
|
head_repo_url=$(gh pr view <PR> --json headRepository --jq .headRepository.url)
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Fetch the PR branch tip into a local ref
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git fetch origin pull/<PR>/head:pr-<PR>
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Rebase PR commits onto latest main
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Move worktree to the PR tip first
|
||||||
|
git reset --hard pr-<PR>
|
||||||
|
|
||||||
|
# Rebase onto current main
|
||||||
|
git fetch origin main
|
||||||
|
git rebase origin/main
|
||||||
|
```
|
||||||
|
|
||||||
|
If conflicts happen:
|
||||||
|
|
||||||
|
- Resolve each conflicted file.
|
||||||
|
- Run `git add <resolved_file>` for each file.
|
||||||
|
- Run `git rebase --continue`.
|
||||||
|
|
||||||
|
If the rebase gets confusing or you resolve conflicts 3 or more times, stop and report.
|
||||||
|
|
||||||
|
4. Fix issues from `.local/review.md`
|
||||||
|
|
||||||
|
- Fix all BLOCKER and IMPORTANT items.
|
||||||
|
- NITs are optional.
|
||||||
|
- Keep scope tight.
|
||||||
|
|
||||||
|
Keep a running log in `.local/prep.md`:
|
||||||
|
|
||||||
|
- List which review items you fixed.
|
||||||
|
- List which files you touched.
|
||||||
|
- Note behavior changes.
|
||||||
|
|
||||||
|
5. Update `CHANGELOG.md` if flagged in review
|
||||||
|
|
||||||
|
Check `.local/review.md` section H for guidance.
|
||||||
|
If flagged and user-facing:
|
||||||
|
|
||||||
|
- Check if `CHANGELOG.md` exists.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls CHANGELOG.md 2>/dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
- Follow existing format.
|
||||||
|
- Add a concise entry with PR number and contributor.
|
||||||
|
|
||||||
|
6. Update docs if flagged in review
|
||||||
|
|
||||||
|
Check `.local/review.md` section G for guidance.
|
||||||
|
If flagged, update only docs related to the PR changes.
|
||||||
|
|
||||||
|
7. Commit prep fixes
|
||||||
|
|
||||||
|
Stage only specific files:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git add <file1> <file2> ...
|
||||||
|
```
|
||||||
|
|
||||||
|
Preferred commit tool:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
committer "fix: <summary> (#<PR>) (thanks @$contrib)" <changed files>
|
||||||
|
```
|
||||||
|
|
||||||
|
If `committer` is not found:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git commit -m "fix: <summary> (#<PR>) (thanks @$contrib)"
|
||||||
|
```
|
||||||
|
|
||||||
|
8. Run full gates before pushing
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
pnpm ui:build
|
||||||
|
pnpm check
|
||||||
|
pnpm test
|
||||||
|
```
|
||||||
|
|
||||||
|
Require all to pass. If something fails, fix, commit, and rerun. Allow at most 3 fix and rerun cycles. If gates still fail after 3 attempts, stop and report the failures. Do not loop indefinitely.
|
||||||
|
|
||||||
|
9. Push updates back to the PR head branch
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Ensure remote for PR head exists
|
||||||
|
git remote add prhead "$head_repo_url.git" 2>/dev/null || git remote set-url prhead "$head_repo_url.git"
|
||||||
|
|
||||||
|
# Use force with lease after rebase
|
||||||
|
# Double check: $head must NOT be "main" or "master"
|
||||||
|
echo "Pushing to branch: $head"
|
||||||
|
if [ "$head" = "main" ] || [ "$head" = "master" ]; then
|
||||||
|
echo "ERROR: head branch is main/master. This is wrong. Stopping."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
git push --force-with-lease prhead HEAD:$head
|
||||||
|
```
|
||||||
|
|
||||||
|
10. Verify PR is not behind main (Mandatory)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git fetch origin main
|
||||||
|
git fetch origin pull/<PR>/head:pr-<PR>-verify --force
|
||||||
|
git merge-base --is-ancestor origin/main pr-<PR>-verify && echo "PR is up to date with main" || echo "ERROR: PR is still behind main, rebase again"
|
||||||
|
git branch -D pr-<PR>-verify 2>/dev/null || true
|
||||||
|
```
|
||||||
|
|
||||||
|
If still behind main, repeat steps 2 through 9.
|
||||||
|
|
||||||
|
11. Write prep summary artifacts (Mandatory)
|
||||||
|
|
||||||
|
Update `.local/prep.md` with:
|
||||||
|
|
||||||
|
- Current HEAD sha from `git rev-parse HEAD`.
|
||||||
|
- Short bullet list of changes.
|
||||||
|
- Gate results.
|
||||||
|
- Push confirmation.
|
||||||
|
- Rebase verification result.
|
||||||
|
|
||||||
|
Create or overwrite `.local/prep.md` and verify it exists and is non-empty:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git rev-parse HEAD
|
||||||
|
ls -la .local/prep.md
|
||||||
|
wc -l .local/prep.md
|
||||||
|
```
|
||||||
|
|
||||||
|
12. Output
|
||||||
|
|
||||||
|
Include a diff stat summary:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git diff --stat origin/main..HEAD
|
||||||
|
git diff --shortstat origin/main..HEAD
|
||||||
|
```
|
||||||
|
|
||||||
|
Report totals: X files changed, Y insertions(+), Z deletions(-).
|
||||||
|
|
||||||
|
If gates passed and push succeeded, print exactly:
|
||||||
|
|
||||||
|
```
|
||||||
|
PR is ready for /mergepr
|
||||||
|
```
|
||||||
|
|
||||||
|
Otherwise, list remaining failures and stop.
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
|
||||||
|
- Worktree only.
|
||||||
|
- Do not delete the worktree on success. `/mergepr` may reuse it.
|
||||||
|
- Do not run `gh pr merge`.
|
||||||
|
- Never push to main. Only push to the PR head branch.
|
||||||
|
- Run and pass all gates before pushing.
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
interface:
|
||||||
|
display_name: "Prepare PR"
|
||||||
|
short_description: "Prepare GitHub PRs for merge"
|
||||||
|
default_prompt: "Use $prepare-pr to prep a GitHub PR for merge without merging."
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
---
|
||||||
|
name: review-pr
|
||||||
|
description: Review-only GitHub pull request analysis with the gh CLI. Use when asked to review a PR, provide structured feedback, or assess readiness to land. Do not merge, push, or make code changes you intend to keep.
|
||||||
|
---
|
||||||
|
|
||||||
|
# Review PR
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
Perform a thorough review-only PR assessment and return a structured recommendation on readiness for /preparepr.
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
|
||||||
|
- Ask for PR number or URL.
|
||||||
|
- If missing, always ask. Never auto-detect from conversation.
|
||||||
|
- If ambiguous, ask.
|
||||||
|
|
||||||
|
## Safety
|
||||||
|
|
||||||
|
- Never push to `main` or `origin/main`, not during review, not ever.
|
||||||
|
- Do not run `git push` at all during review. Treat review as read only.
|
||||||
|
- Do not stop or kill the gateway. Do not run gateway stop commands. Do not kill processes on port 18792.
|
||||||
|
|
||||||
|
## Execution Rule
|
||||||
|
|
||||||
|
- Execute the workflow. Do not stop after printing the TODO checklist.
|
||||||
|
- If delegating, require the delegate to run commands and capture outputs, not a plan.
|
||||||
|
|
||||||
|
## Known Failure Modes
|
||||||
|
|
||||||
|
- If you see "fatal: not a git repository", you are in the wrong directory. Use `~/openclaw`.
|
||||||
|
- Do not stop after printing the checklist. That is not completion.
|
||||||
|
|
||||||
|
## Writing Style for Output
|
||||||
|
|
||||||
|
- Write casual and direct.
|
||||||
|
- Avoid em dashes and en dashes. Use commas or separate sentences.
|
||||||
|
|
||||||
|
## Completion Criteria
|
||||||
|
|
||||||
|
- Run the commands in the worktree and inspect the PR directly.
|
||||||
|
- Produce the structured review sections A through J.
|
||||||
|
- Save the full review to `.local/review.md` inside the worktree.
|
||||||
|
|
||||||
|
## First: Create a TODO Checklist
|
||||||
|
|
||||||
|
Create a checklist of all review steps, print it, then continue and execute the commands.
|
||||||
|
|
||||||
|
## Setup: Use a Worktree
|
||||||
|
|
||||||
|
Use an isolated worktree for all review work.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd ~/Development/openclaw
|
||||||
|
# Sanity: confirm you are in the repo
|
||||||
|
git rev-parse --show-toplevel
|
||||||
|
|
||||||
|
WORKTREE_DIR=".worktrees/pr-<PR>"
|
||||||
|
git fetch origin main
|
||||||
|
|
||||||
|
# Reuse existing worktree if it exists, otherwise create new
|
||||||
|
if [ -d "$WORKTREE_DIR" ]; then
|
||||||
|
cd "$WORKTREE_DIR"
|
||||||
|
git checkout temp/pr-<PR> 2>/dev/null || git checkout -b temp/pr-<PR>
|
||||||
|
git fetch origin main
|
||||||
|
git reset --hard origin/main
|
||||||
|
else
|
||||||
|
git worktree add "$WORKTREE_DIR" -b temp/pr-<PR> origin/main
|
||||||
|
cd "$WORKTREE_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create local scratch space that persists across /reviewpr to /preparepr to /mergepr
|
||||||
|
mkdir -p .local
|
||||||
|
```
|
||||||
|
|
||||||
|
Run all commands inside the worktree directory.
|
||||||
|
Start on `origin/main` so you can check for existing implementations before looking at PR code.
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. Identify PR meta and context
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr view <PR> --json number,title,state,isDraft,author,baseRefName,headRefName,headRepository,url,body,labels,assignees,reviewRequests,files,additions,deletions --jq '{number,title,url,state,isDraft,author:.author.login,base:.baseRefName,head:.headRefName,headRepo:.headRepository.nameWithOwner,additions,deletions,files:.files|length,body}'
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Check if this already exists in main before looking at the PR branch
|
||||||
|
|
||||||
|
- Identify the core feature or fix from the PR title and description.
|
||||||
|
- Search for existing implementations using keywords from the PR title, changed file paths, and function or component names from the diff.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Use keywords from the PR title and changed files
|
||||||
|
rg -n "<keyword_from_pr_title>" -S src packages apps ui || true
|
||||||
|
rg -n "<function_or_component_name>" -S src packages apps ui || true
|
||||||
|
|
||||||
|
git log --oneline --all --grep="<keyword_from_pr_title>" | head -20
|
||||||
|
```
|
||||||
|
|
||||||
|
If it already exists, call it out as a BLOCKER or at least IMPORTANT.
|
||||||
|
|
||||||
|
3. Claim the PR
|
||||||
|
|
||||||
|
Assign yourself so others know someone is reviewing. Skip if the PR looks like spam or is a draft you plan to recommend closing.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh_user=$(gh api user --jq .login)
|
||||||
|
gh pr edit <PR> --add-assignee "$gh_user"
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Read the PR description carefully
|
||||||
|
|
||||||
|
Use the body from step 1. Summarize goal, scope, and missing context.
|
||||||
|
|
||||||
|
5. Read the diff thoroughly
|
||||||
|
|
||||||
|
Minimum:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
gh pr diff <PR>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you need full code context locally, fetch the PR head to a local ref and diff it. Do not create a merge commit.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git fetch origin pull/<PR>/head:pr-<PR>
|
||||||
|
# Show changes without modifying the working tree
|
||||||
|
|
||||||
|
git diff --stat origin/main..pr-<PR>
|
||||||
|
git diff origin/main..pr-<PR>
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to browse the PR version of files directly, temporarily check out `pr-<PR>` in the worktree. Do not commit or push. Return to `temp/pr-<PR>` and reset to `origin/main` afterward.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Use only if needed
|
||||||
|
# git checkout pr-<PR>
|
||||||
|
# ...inspect files...
|
||||||
|
|
||||||
|
git checkout temp/pr-<PR>
|
||||||
|
git reset --hard origin/main
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Validate the change is needed and valuable
|
||||||
|
|
||||||
|
Be honest. Call out low value AI slop.
|
||||||
|
|
||||||
|
7. Evaluate implementation quality
|
||||||
|
|
||||||
|
Review correctness, design, performance, and ergonomics.
|
||||||
|
|
||||||
|
8. Perform a security review
|
||||||
|
|
||||||
|
Assume OpenClaw subagents run with full disk access, including git, gh, and shell. Check auth, input validation, secrets, dependencies, tool safety, and privacy.
|
||||||
|
|
||||||
|
9. Review tests and verification
|
||||||
|
|
||||||
|
Identify what exists, what is missing, and what would be a minimal regression test.
|
||||||
|
|
||||||
|
10. Check docs
|
||||||
|
|
||||||
|
Check if the PR touches code with related documentation such as README, docs, inline API docs, or config examples.
|
||||||
|
|
||||||
|
- If docs exist for the changed area and the PR does not update them, flag as IMPORTANT.
|
||||||
|
- If the PR adds a new feature or config option with no docs, flag as IMPORTANT.
|
||||||
|
- If the change is purely internal with no user-facing impact, skip this.
|
||||||
|
|
||||||
|
11. Check changelog
|
||||||
|
|
||||||
|
Check if `CHANGELOG.md` exists and whether the PR warrants an entry.
|
||||||
|
|
||||||
|
- If the project has a changelog and the PR is user-facing, flag missing entry as IMPORTANT.
|
||||||
|
- Leave the change for /preparepr, only flag it here.
|
||||||
|
|
||||||
|
12. Answer the key question
|
||||||
|
|
||||||
|
Decide if /preparepr can fix issues or the contributor must update the PR.
|
||||||
|
|
||||||
|
13. Save findings to the worktree
|
||||||
|
|
||||||
|
Write the full structured review sections A through J to `.local/review.md`.
|
||||||
|
Create or overwrite the file and verify it exists and is non-empty.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ls -la .local/review.md
|
||||||
|
wc -l .local/review.md
|
||||||
|
```
|
||||||
|
|
||||||
|
14. Output the structured review
|
||||||
|
|
||||||
|
Produce a review that matches what you saved to `.local/review.md`.
|
||||||
|
|
||||||
|
A) TL;DR recommendation
|
||||||
|
|
||||||
|
- One of: READY FOR /preparepr | NEEDS WORK | NEEDS DISCUSSION | NOT USEFUL (CLOSE)
|
||||||
|
- 1 to 3 sentences.
|
||||||
|
|
||||||
|
B) What changed
|
||||||
|
|
||||||
|
C) What is good
|
||||||
|
|
||||||
|
D) Security findings
|
||||||
|
|
||||||
|
E) Concerns or questions (actionable)
|
||||||
|
|
||||||
|
- Numbered list.
|
||||||
|
- Mark each item as BLOCKER, IMPORTANT, or NIT.
|
||||||
|
- For each, point to file or area and propose a concrete fix.
|
||||||
|
|
||||||
|
F) Tests
|
||||||
|
|
||||||
|
G) Docs status
|
||||||
|
|
||||||
|
- State if related docs are up to date, missing, or not applicable.
|
||||||
|
|
||||||
|
H) Changelog
|
||||||
|
|
||||||
|
- State if `CHANGELOG.md` needs an entry and which category.
|
||||||
|
|
||||||
|
I) Follow ups (optional)
|
||||||
|
|
||||||
|
J) Suggested PR comment (optional)
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
|
||||||
|
- Worktree only.
|
||||||
|
- Do not delete the worktree after review.
|
||||||
|
- Review only, do not merge, do not push.
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
interface:
|
||||||
|
display_name: "Review PR"
|
||||||
|
short_description: "Review GitHub PRs without merging"
|
||||||
|
default_prompt: "Use $review-pr to perform a thorough, review-only GitHub PR review."
|
||||||
|
|
@ -2,7 +2,7 @@ blank_issues_enabled: true
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: Onboarding
|
- name: Onboarding
|
||||||
url: https://discord.gg/clawd
|
url: https://discord.gg/clawd
|
||||||
about: New to Clawdbot? Join Discord for setup guidance from Krill in #help.
|
about: New to Clawdbot? Join Discord for setup guidance from Krill in \#help.
|
||||||
- name: Support
|
- name: Support
|
||||||
url: https://discord.gg/clawd
|
url: https://discord.gg/clawd
|
||||||
about: Get help from Krill and the community on Discord in #help.
|
about: Get help from Krill and the community on Discord in \#help.
|
||||||
|
|
|
||||||
|
|
@ -64,10 +64,14 @@ apps/ios/*.mobileprovision
|
||||||
|
|
||||||
# Local untracked files
|
# Local untracked files
|
||||||
.local/
|
.local/
|
||||||
.vscode/
|
|
||||||
IDENTITY.md
|
IDENTITY.md
|
||||||
USER.md
|
USER.md
|
||||||
.tgz
|
.tgz
|
||||||
|
|
||||||
# local tooling
|
# local tooling
|
||||||
.serena/
|
.serena/
|
||||||
|
|
||||||
|
# Agent credentials and memory (NEVER COMMIT)
|
||||||
|
memory/
|
||||||
|
.agent/*.json
|
||||||
|
!.agent/workflows/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"recommendations": ["oxc.oxc-vscode"]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
{
|
||||||
|
"editor.formatOnSave": true,
|
||||||
|
"files.insertFinalNewline": true,
|
||||||
|
"files.trimFinalNewlines": true,
|
||||||
|
"[javascript]": {
|
||||||
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
|
},
|
||||||
|
"[typescriptreact]": {
|
||||||
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
|
},
|
||||||
|
"[typescript]": {
|
||||||
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
|
},
|
||||||
|
"[json]": {
|
||||||
|
"editor.defaultFormatter": "oxc.oxc-vscode"
|
||||||
|
},
|
||||||
|
"typescript.preferences.importModuleSpecifierEnding": "js",
|
||||||
|
"typescript.reportStyleChecksAsWarnings": false,
|
||||||
|
"typescript.updateImportsOnFileMove.enabled": "always",
|
||||||
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
|
"typescript.experimental.useTsgo": true
|
||||||
|
}
|
||||||
|
|
@ -58,6 +58,7 @@
|
||||||
- Node remains supported for running built output (`dist/*`) and production installs.
|
- Node remains supported for running built output (`dist/*`) and production installs.
|
||||||
- Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. Release checklist: `docs/platforms/mac/release.md`.
|
- Mac packaging (dev): `scripts/package-mac-app.sh` defaults to current arch. Release checklist: `docs/platforms/mac/release.md`.
|
||||||
- Type-check/build: `pnpm build`
|
- Type-check/build: `pnpm build`
|
||||||
|
- TypeScript checks: `pnpm tsgo`
|
||||||
- Lint/format: `pnpm check`
|
- Lint/format: `pnpm check`
|
||||||
- Tests: `pnpm test` (vitest); coverage: `pnpm test:coverage`
|
- Tests: `pnpm test` (vitest); coverage: `pnpm test:coverage`
|
||||||
|
|
||||||
|
|
@ -94,6 +95,8 @@
|
||||||
- Group related changes; avoid bundling unrelated refactors.
|
- Group related changes; avoid bundling unrelated refactors.
|
||||||
- Changelog workflow: keep latest released version at top (no `Unreleased`); after publishing, bump version and start a new top section.
|
- Changelog workflow: keep latest released version at top (no `Unreleased`); after publishing, bump version and start a new top section.
|
||||||
- PRs should summarize scope, note testing performed, and mention any user-facing changes or new flags.
|
- PRs should summarize scope, note testing performed, and mention any user-facing changes or new flags.
|
||||||
|
- Read this when submitting a PR: `docs/help/submitting-a-pr.md` ([Submitting a PR](https://docs.openclaw.ai/help/submitting-a-pr))
|
||||||
|
- Read this when submitting an issue: `docs/help/submitting-an-issue.md` ([Submitting an Issue](https://docs.openclaw.ai/help/submitting-an-issue))
|
||||||
- PR review flow: when given a PR link, review via `gh pr view`/`gh pr diff` and do **not** change branches.
|
- PR review flow: when given a PR link, review via `gh pr view`/`gh pr diff` and do **not** change branches.
|
||||||
- PR review calls: prefer a single `gh pr view --json ...` to batch metadata/comments; run `gh pr diff` only when needed.
|
- PR review calls: prefer a single `gh pr view --json ...` to batch metadata/comments; run `gh pr diff` only when needed.
|
||||||
- Before starting a review when a GH Issue/PR is pasted: run `git pull`; if there are local changes or unpushed commits, stop and alert the user before reviewing.
|
- Before starting a review when a GH Issue/PR is pasted: run `git pull`; if there are local changes or unpushed commits, stop and alert the user before reviewing.
|
||||||
|
|
|
||||||
36
CHANGELOG.md
36
CHANGELOG.md
|
|
@ -2,17 +2,29 @@
|
||||||
|
|
||||||
Docs: https://docs.openclaw.ai
|
Docs: https://docs.openclaw.ai
|
||||||
|
|
||||||
## 2026.2.3
|
## 2026.2.4
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|
||||||
|
- Agents: bump pi-mono packages to 0.52.5. (#9949) Thanks @gumadeiras.
|
||||||
|
- Models: default Anthropic model to `anthropic/claude-opus-4-6`. (#9853) Thanks @TinyTb.
|
||||||
|
- Models/Onboarding: refresh provider defaults, update OpenAI/OpenAI Codex wizard defaults, and harden model allowlist initialization for first-time configs with matching docs/tests. (#9911) Thanks @gumadeiras.
|
||||||
|
- Telegram: auto-inject forum topic `threadId` in message tool and subagent announce so media, buttons, and subagent results land in the correct topic instead of General. (#7235) Thanks @Lukavyi.
|
||||||
|
- Security: add skill/plugin code safety scanner that detects dangerous patterns (command injection, eval, data exfiltration, obfuscated code, crypto mining, env harvesting) in installed extensions. Integrated into `openclaw security audit --deep` and plugin install flow; scan failures surface as warnings. (#9806) Thanks @abdelsfane.
|
||||||
|
- CLI: sort `openclaw --help` commands (and options) alphabetically. (#8068) Thanks @deepsoumya617.
|
||||||
- Telegram: remove last `@ts-nocheck` from `bot-handlers.ts`, use Grammy types directly, deduplicate `StickerMetadata`. Zero `@ts-nocheck` remaining in `src/telegram/`. (#9206)
|
- Telegram: remove last `@ts-nocheck` from `bot-handlers.ts`, use Grammy types directly, deduplicate `StickerMetadata`. Zero `@ts-nocheck` remaining in `src/telegram/`. (#9206)
|
||||||
- Telegram: remove `@ts-nocheck` from `bot-message.ts`, type deps via `Omit<BuildTelegramMessageContextParams>`, widen `allMedia` to `TelegramMediaRef[]`. (#9180)
|
- Telegram: remove `@ts-nocheck` from `bot-message.ts`, type deps via `Omit<BuildTelegramMessageContextParams>`, widen `allMedia` to `TelegramMediaRef[]`. (#9180)
|
||||||
- Telegram: remove `@ts-nocheck` from `bot.ts`, fix duplicate `bot.catch` error handler (Grammy overrides), remove dead reaction `message_thread_id` routing, harden sticker cache guard. (#9077)
|
- Telegram: remove `@ts-nocheck` from `bot.ts`, fix duplicate `bot.catch` error handler (Grammy overrides), remove dead reaction `message_thread_id` routing, harden sticker cache guard. (#9077)
|
||||||
|
- Telegram: allow per-group and per-topic `groupPolicy` overrides under `channels.telegram.groups`. (#9775) Thanks @nicolasstanley.
|
||||||
|
- Feishu: expand channel handling (posts with images, doc links, routing, reactions/typing, replies, native commands). (#8975) Thanks @jiulingyun.
|
||||||
- Onboarding: add Cloudflare AI Gateway provider setup and docs. (#7914) Thanks @roerohan.
|
- Onboarding: add Cloudflare AI Gateway provider setup and docs. (#7914) Thanks @roerohan.
|
||||||
- Onboarding: add Moonshot (.cn) auth choice and keep the China base URL when preserving defaults. (#7180) Thanks @waynelwz.
|
- Onboarding: add Moonshot (.cn) auth choice and keep the China base URL when preserving defaults. (#7180) Thanks @waynelwz.
|
||||||
|
- Onboarding: add xAI (Grok) auth choice and provider defaults. (#9885) Thanks @grp06.
|
||||||
- Docs: clarify tmux send-keys for TUI by splitting text and Enter. (#7737) Thanks @Wangnov.
|
- Docs: clarify tmux send-keys for TUI by splitting text and Enter. (#7737) Thanks @Wangnov.
|
||||||
|
- Web UI: add Token Usage dashboard with session analytics. (#8462) Thanks @mcinteerj.
|
||||||
- Docs: mirror the landing page revamp for zh-CN (features, quickstart, docs directory, network model, credits). (#8994) Thanks @joshp123.
|
- Docs: mirror the landing page revamp for zh-CN (features, quickstart, docs directory, network model, credits). (#8994) Thanks @joshp123.
|
||||||
|
- Docs: strengthen secure DM mode guidance for multi-user inboxes with an explicit warning and example. (#9377) Thanks @Shrinija17.
|
||||||
|
- Docs: document `activeHours` heartbeat field with timezone resolution chain and example. (#9366) Thanks @unisone.
|
||||||
- Messages: add per-channel and per-account responsePrefix overrides across channels. (#9001) Thanks @mudrii.
|
- Messages: add per-channel and per-account responsePrefix overrides across channels. (#9001) Thanks @mudrii.
|
||||||
- Cron: add announce delivery mode for isolated jobs (CLI + Control UI) and delivery mode config.
|
- Cron: add announce delivery mode for isolated jobs (CLI + Control UI) and delivery mode config.
|
||||||
- Cron: default isolated jobs to announce delivery; accept ISO 8601 `schedule.at` in tool inputs.
|
- Cron: default isolated jobs to announce delivery; accept ISO 8601 `schedule.at` in tool inputs.
|
||||||
|
|
@ -23,15 +35,33 @@ Docs: https://docs.openclaw.ai
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
- Control UI: add hardened fallback for asset resolution in global npm installs. (#4855) Thanks @anapivirtua.
|
||||||
|
- Update: remove dead restore control-ui step that failed on gitignored dist/ output.
|
||||||
|
- Update: avoid wiping prebuilt Control UI assets during dev auto-builds (`tsdown --no-clean`), run update doctor via `openclaw.mjs`, and auto-restore missing UI assets after doctor. (#10146) Thanks @gumadeiras.
|
||||||
|
- Models: add forward-compat fallback for `openai-codex/gpt-5.3-codex` when model registry hasn't discovered it yet. (#9989) Thanks @w1kke.
|
||||||
|
- Auto-reply/Docs: normalize `extra-high` (and spaced variants) to `xhigh` for Codex thinking levels, and align Codex 5.3 FAQ examples. (#9976) Thanks @slonce70.
|
||||||
|
- Compaction: remove orphaned `tool_result` messages during history pruning to prevent session corruption from aborted tool calls. (#9868, fixes #9769, #9724, #9672)
|
||||||
|
- Telegram: pass `parentPeer` for forum topic binding inheritance so group-level bindings apply to all topics within the group. (#9789, fixes #9545, #9351)
|
||||||
|
- CLI: pass `--disable-warning=ExperimentalWarning` as a Node CLI option when respawning (avoid disallowed `NODE_OPTIONS` usage; fixes npm pack). (#9691) Thanks @18-RAJAT.
|
||||||
|
- CLI: resolve bundled Chrome extension assets by walking up to the nearest assets directory; add resolver and clipboard tests. (#8914) Thanks @kelvinCB.
|
||||||
|
- Tests: stabilize Windows ACL coverage with deterministic os.userInfo mocking. (#9335) Thanks @M00N7682.
|
||||||
|
- Exec approvals: coerce bare string allowlist entries to objects to prevent allowlist corruption. (#9903, fixes #9790) Thanks @mcaxtr.
|
||||||
- Heartbeat: allow explicit accountId routing for multi-account channels. (#8702) Thanks @lsh411.
|
- Heartbeat: allow explicit accountId routing for multi-account channels. (#8702) Thanks @lsh411.
|
||||||
- TUI/Gateway: handle non-streaming finals, refresh history for non-local chat runs, and avoid event gap warnings for targeted tool streams. (#8432) Thanks @gumadeiras.
|
- TUI/Gateway: handle non-streaming finals, refresh history for non-local chat runs, and avoid event gap warnings for targeted tool streams. (#8432) Thanks @gumadeiras.
|
||||||
|
- Security: stop exposing Gateway auth tokens via URL query parameters in Control UI entrypoints, and reject hook tokens in query parameters. (#9436) Thanks @coygeek.
|
||||||
- Shell completion: auto-detect and migrate slow dynamic patterns to cached files for faster terminal startup; add completion health checks to doctor/update/onboard.
|
- Shell completion: auto-detect and migrate slow dynamic patterns to cached files for faster terminal startup; add completion health checks to doctor/update/onboard.
|
||||||
- Telegram: honor session model overrides in inline model selection. (#8193) Thanks @gildo.
|
- Telegram: honor session model overrides in inline model selection. (#8193) Thanks @gildo.
|
||||||
- Web UI: fix agent model selection saves for default/non-default agents and wrap long workspace paths. Thanks @Takhoffman.
|
- Web UI: fix agent model selection saves for default/non-default agents and wrap long workspace paths. Thanks @Takhoffman.
|
||||||
- Web UI: resolve header logo path when `gateway.controlUi.basePath` is set. (#7178) Thanks @Yeom-JinHo.
|
- Web UI: resolve header logo path when `gateway.controlUi.basePath` is set. (#7178) Thanks @Yeom-JinHo.
|
||||||
- Web UI: apply button styling to the new-messages indicator.
|
- Web UI: apply button styling to the new-messages indicator.
|
||||||
- Onboarding: infer auth choice from non-interactive API key flags. (#8484) Thanks @f-trycua.
|
- Onboarding: infer auth choice from non-interactive API key flags. (#8484) Thanks @f-trycua.
|
||||||
|
- Usage: include estimated cost when breakdown is missing and keep `usage.cost` days support. (#8462) Thanks @mcinteerj.
|
||||||
- Security: keep untrusted channel metadata out of system prompts (Slack/Discord). Thanks @KonstantinMirin.
|
- Security: keep untrusted channel metadata out of system prompts (Slack/Discord). Thanks @KonstantinMirin.
|
||||||
|
- Security: redact channel credentials (tokens, passwords, API keys, secrets) from gateway config APIs and preserve secrets during Control UI round-trips. (#9858) Thanks @abdelsfane.
|
||||||
|
- Discord: treat allowlisted senders as owner for system-prompt identity hints while keeping channel topics untrusted.
|
||||||
|
- Slack: strip `<@...>` mention tokens before command matching so `/new` and `/reset` work when prefixed with a mention. (#9971) Thanks @ironbyte-rgb.
|
||||||
|
- Agents: cap `sessions_history` tool output and strip oversized fields to prevent context overflow. (#10000) Thanks @gut-puncture.
|
||||||
|
- Security: normalize code safety finding paths in `openclaw security audit --deep` output for cross-platform consistency. (#10000) Thanks @gut-puncture.
|
||||||
- Security: enforce sandboxed media paths for message tool attachments. (#9182) Thanks @victormier.
|
- Security: enforce sandboxed media paths for message tool attachments. (#9182) Thanks @victormier.
|
||||||
- Security: require explicit credentials for gateway URL overrides to prevent credential leakage. (#8113) Thanks @victormier.
|
- Security: require explicit credentials for gateway URL overrides to prevent credential leakage. (#8113) Thanks @victormier.
|
||||||
- Security: gate `whatsapp_login` tool to owner senders and default-deny non-owner contexts. (#8768) Thanks @victormier.
|
- Security: gate `whatsapp_login` tool to owner senders and default-deny non-owner contexts. (#8768) Thanks @victormier.
|
||||||
|
|
@ -39,9 +69,13 @@ Docs: https://docs.openclaw.ai
|
||||||
- Voice call: add regression coverage for anonymous inbound caller IDs with allowlist policy. (#8104) Thanks @victormier.
|
- Voice call: add regression coverage for anonymous inbound caller IDs with allowlist policy. (#8104) Thanks @victormier.
|
||||||
- Cron: accept epoch timestamps and 0ms durations in CLI `--at` parsing.
|
- Cron: accept epoch timestamps and 0ms durations in CLI `--at` parsing.
|
||||||
- Cron: reload store data when the store file is recreated or mtime changes.
|
- Cron: reload store data when the store file is recreated or mtime changes.
|
||||||
|
- Cron: prevent `recomputeNextRuns` from skipping due jobs when timer fires late by reordering `onTimer` flow. (#9823, fixes #9788) Thanks @pycckuu.
|
||||||
- Cron: deliver announce runs directly, honor delivery mode, and respect wakeMode for summaries. (#8540) Thanks @tyler6204.
|
- Cron: deliver announce runs directly, honor delivery mode, and respect wakeMode for summaries. (#8540) Thanks @tyler6204.
|
||||||
|
- Cron: correct announce delivery inference for thread session keys and null delivery inputs. (#9733) Thanks @tyler6204.
|
||||||
- Telegram: include forward_from_chat metadata in forwarded messages and harden cron delivery target checks. (#8392) Thanks @Glucksberg.
|
- Telegram: include forward_from_chat metadata in forwarded messages and harden cron delivery target checks. (#8392) Thanks @Glucksberg.
|
||||||
|
- Telegram: preserve DM topic threadId in deliveryContext. (#9039) Thanks @lailoo.
|
||||||
- macOS: fix cron payload summary rendering and ISO 8601 formatter concurrency safety.
|
- macOS: fix cron payload summary rendering and ISO 8601 formatter concurrency safety.
|
||||||
|
- Security: require gateway auth for Canvas host and A2UI assets. (#9518) Thanks @coygeek.
|
||||||
|
|
||||||
## 2026.2.2-3
|
## 2026.2.2-3
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ Welcome to the lobster tank! 🦞
|
||||||
- **Christoph Nakazawa** - JS Infra
|
- **Christoph Nakazawa** - JS Infra
|
||||||
- GitHub: [@cpojer](https://github.com/cpojer) · X: [@cnakazawa](https://x.com/cnakazawa)
|
- GitHub: [@cpojer](https://github.com/cpojer) · X: [@cnakazawa](https://x.com/cnakazawa)
|
||||||
|
|
||||||
|
- **Gustavo Madeira Santana** - Multi-agents, CLI, web UI
|
||||||
|
- GitHub: [@gumadeiras](https://github.com/gumadeiras) · X: [@gumadeiras](https://x.com/gumadeiras)
|
||||||
|
|
||||||
## How to Contribute
|
## How to Contribute
|
||||||
|
|
||||||
1. **Bugs & small fixes** → Open a PR!
|
1. **Bugs & small fixes** → Open a PR!
|
||||||
|
|
|
||||||
89
README.md
89
README.md
|
|
@ -34,7 +34,7 @@ New install? Start here: [Getting started](https://docs.openclaw.ai/start/gettin
|
||||||
- **[Anthropic](https://www.anthropic.com/)** (Claude Pro/Max)
|
- **[Anthropic](https://www.anthropic.com/)** (Claude Pro/Max)
|
||||||
- **[OpenAI](https://openai.com/)** (ChatGPT/Codex)
|
- **[OpenAI](https://openai.com/)** (ChatGPT/Codex)
|
||||||
|
|
||||||
Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.5** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.openclaw.ai/start/onboarding).
|
Model note: while any model is supported, I strongly recommend **Anthropic Pro/Max (100/200) + Opus 4.6** for long‑context strength and better prompt‑injection resistance. See [Onboarding](https://docs.openclaw.ai/start/onboarding).
|
||||||
|
|
||||||
## Models (selection + auth)
|
## Models (selection + auth)
|
||||||
|
|
||||||
|
|
@ -316,7 +316,7 @@ Minimal `~/.openclaw/openclaw.json` (model + defaults):
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agent: {
|
agent: {
|
||||||
model: "anthropic/claude-opus-4-5",
|
model: "anthropic/claude-opus-4-6",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
@ -496,44 +496,49 @@ Special thanks to Adam Doppelt for lobster.bot.
|
||||||
Thanks to all clawtributors:
|
Thanks to all clawtributors:
|
||||||
|
|
||||||
<p align="left">
|
<p align="left">
|
||||||
<a href="https://github.com/steipete"><img src="https://avatars.githubusercontent.com/u/58493?v=4&s=48" width="48" height="48" alt="steipete" title="steipete"/></a> <a href="https://github.com/cpojer"><img src="https://avatars.githubusercontent.com/u/13352?v=4&s=48" width="48" height="48" alt="cpojer" title="cpojer"/></a> <a href="https://github.com/plum-dawg"><img src="https://avatars.githubusercontent.com/u/5909950?v=4&s=48" width="48" height="48" alt="plum-dawg" title="plum-dawg"/></a> <a href="https://github.com/bohdanpodvirnyi"><img src="https://avatars.githubusercontent.com/u/31819391?v=4&s=48" width="48" height="48" alt="bohdanpodvirnyi" title="bohdanpodvirnyi"/></a> <a href="https://github.com/iHildy"><img src="https://avatars.githubusercontent.com/u/25069719?v=4&s=48" width="48" height="48" alt="iHildy" title="iHildy"/></a> <a href="https://github.com/jaydenfyi"><img src="https://avatars.githubusercontent.com/u/213395523?v=4&s=48" width="48" height="48" alt="jaydenfyi" title="jaydenfyi"/></a> <a href="https://github.com/joshp123"><img src="https://avatars.githubusercontent.com/u/1497361?v=4&s=48" width="48" height="48" alt="joshp123" title="joshp123"/></a> <a href="https://github.com/joaohlisboa"><img src="https://avatars.githubusercontent.com/u/8200873?v=4&s=48" width="48" height="48" alt="joaohlisboa" title="joaohlisboa"/></a> <a href="https://github.com/mneves75"><img src="https://avatars.githubusercontent.com/u/2423436?v=4&s=48" width="48" height="48" alt="mneves75" title="mneves75"/></a> <a href="https://github.com/MatthieuBizien"><img src="https://avatars.githubusercontent.com/u/173090?v=4&s=48" width="48" height="48" alt="MatthieuBizien" title="MatthieuBizien"/></a>
|
<a href="https://github.com/steipete"><img src="https://avatars.githubusercontent.com/u/58493?v=4&s=48" width="48" height="48" alt="steipete" title="steipete"/></a> <a href="https://github.com/joshp123"><img src="https://avatars.githubusercontent.com/u/1497361?v=4&s=48" width="48" height="48" alt="joshp123" title="joshp123"/></a> <a href="https://github.com/cpojer"><img src="https://avatars.githubusercontent.com/u/13352?v=4&s=48" width="48" height="48" alt="cpojer" title="cpojer"/></a> <a href="https://github.com/mbelinky"><img src="https://avatars.githubusercontent.com/u/132747814?v=4&s=48" width="48" height="48" alt="Mariano Belinky" title="Mariano Belinky"/></a> <a href="https://github.com/plum-dawg"><img src="https://avatars.githubusercontent.com/u/5909950?v=4&s=48" width="48" height="48" alt="plum-dawg" title="plum-dawg"/></a> <a href="https://github.com/bohdanpodvirnyi"><img src="https://avatars.githubusercontent.com/u/31819391?v=4&s=48" width="48" height="48" alt="bohdanpodvirnyi" title="bohdanpodvirnyi"/></a> <a href="https://github.com/sebslight"><img src="https://avatars.githubusercontent.com/u/19554889?v=4&s=48" width="48" height="48" alt="sebslight" title="sebslight"/></a> <a href="https://github.com/iHildy"><img src="https://avatars.githubusercontent.com/u/25069719?v=4&s=48" width="48" height="48" alt="iHildy" title="iHildy"/></a> <a href="https://github.com/jaydenfyi"><img src="https://avatars.githubusercontent.com/u/213395523?v=4&s=48" width="48" height="48" alt="jaydenfyi" title="jaydenfyi"/></a> <a href="https://github.com/joaohlisboa"><img src="https://avatars.githubusercontent.com/u/8200873?v=4&s=48" width="48" height="48" alt="joaohlisboa" title="joaohlisboa"/></a>
|
||||||
<a href="https://github.com/MaudeBot"><img src="https://avatars.githubusercontent.com/u/255777700?v=4&s=48" width="48" height="48" alt="MaudeBot" title="MaudeBot"/></a> <a href="https://github.com/Glucksberg"><img src="https://avatars.githubusercontent.com/u/80581902?v=4&s=48" width="48" height="48" alt="Glucksberg" title="Glucksberg"/></a> <a href="https://github.com/rahthakor"><img src="https://avatars.githubusercontent.com/u/8470553?v=4&s=48" width="48" height="48" alt="rahthakor" title="rahthakor"/></a> <a href="https://github.com/vrknetha"><img src="https://avatars.githubusercontent.com/u/20596261?v=4&s=48" width="48" height="48" alt="vrknetha" title="vrknetha"/></a> <a href="https://github.com/radek-paclt"><img src="https://avatars.githubusercontent.com/u/50451445?v=4&s=48" width="48" height="48" alt="radek-paclt" title="radek-paclt"/></a> <a href="https://github.com/vignesh07"><img src="https://avatars.githubusercontent.com/u/1436853?v=4&s=48" width="48" height="48" alt="vignesh07" title="vignesh07"/></a> <a href="https://github.com/tobiasbischoff"><img src="https://avatars.githubusercontent.com/u/711564?v=4&s=48" width="48" height="48" alt="Tobias Bischoff" title="Tobias Bischoff"/></a> <a href="https://github.com/sebslight"><img src="https://avatars.githubusercontent.com/u/19554889?v=4&s=48" width="48" height="48" alt="sebslight" title="sebslight"/></a> <a href="https://github.com/czekaj"><img src="https://avatars.githubusercontent.com/u/1464539?v=4&s=48" width="48" height="48" alt="czekaj" title="czekaj"/></a> <a href="https://github.com/mukhtharcm"><img src="https://avatars.githubusercontent.com/u/56378562?v=4&s=48" width="48" height="48" alt="mukhtharcm" title="mukhtharcm"/></a>
|
<a href="https://github.com/mneves75"><img src="https://avatars.githubusercontent.com/u/2423436?v=4&s=48" width="48" height="48" alt="mneves75" title="mneves75"/></a> <a href="https://github.com/MatthieuBizien"><img src="https://avatars.githubusercontent.com/u/173090?v=4&s=48" width="48" height="48" alt="MatthieuBizien" title="MatthieuBizien"/></a> <a href="https://github.com/Glucksberg"><img src="https://avatars.githubusercontent.com/u/80581902?v=4&s=48" width="48" height="48" alt="Glucksberg" title="Glucksberg"/></a> <a href="https://github.com/MaudeBot"><img src="https://avatars.githubusercontent.com/u/255777700?v=4&s=48" width="48" height="48" alt="MaudeBot" title="MaudeBot"/></a> <a href="https://github.com/gumadeiras"><img src="https://avatars.githubusercontent.com/u/5599352?v=4&s=48" width="48" height="48" alt="gumadeiras" title="gumadeiras"/></a> <a href="https://github.com/tyler6204"><img src="https://avatars.githubusercontent.com/u/64381258?v=4&s=48" width="48" height="48" alt="tyler6204" title="tyler6204"/></a> <a href="https://github.com/rahthakor"><img src="https://avatars.githubusercontent.com/u/8470553?v=4&s=48" width="48" height="48" alt="rahthakor" title="rahthakor"/></a> <a href="https://github.com/vrknetha"><img src="https://avatars.githubusercontent.com/u/20596261?v=4&s=48" width="48" height="48" alt="vrknetha" title="vrknetha"/></a> <a href="https://github.com/vignesh07"><img src="https://avatars.githubusercontent.com/u/1436853?v=4&s=48" width="48" height="48" alt="vignesh07" title="vignesh07"/></a> <a href="https://github.com/radek-paclt"><img src="https://avatars.githubusercontent.com/u/50451445?v=4&s=48" width="48" height="48" alt="radek-paclt" title="radek-paclt"/></a>
|
||||||
<a href="https://github.com/maxsumrall"><img src="https://avatars.githubusercontent.com/u/628843?v=4&s=48" width="48" height="48" alt="maxsumrall" title="maxsumrall"/></a> <a href="https://github.com/xadenryan"><img src="https://avatars.githubusercontent.com/u/165437834?v=4&s=48" width="48" height="48" alt="xadenryan" title="xadenryan"/></a> <a href="https://github.com/VACInc"><img src="https://avatars.githubusercontent.com/u/3279061?v=4&s=48" width="48" height="48" alt="VACInc" title="VACInc"/></a> <a href="https://github.com/mbelinky"><img src="https://avatars.githubusercontent.com/u/132747814?v=4&s=48" width="48" height="48" alt="Mariano Belinky" title="Mariano Belinky"/></a> <a href="https://github.com/rodrigouroz"><img src="https://avatars.githubusercontent.com/u/384037?v=4&s=48" width="48" height="48" alt="rodrigouroz" title="rodrigouroz"/></a> <a href="https://github.com/tyler6204"><img src="https://avatars.githubusercontent.com/u/64381258?v=4&s=48" width="48" height="48" alt="tyler6204" title="tyler6204"/></a> <a href="https://github.com/juanpablodlc"><img src="https://avatars.githubusercontent.com/u/92012363?v=4&s=48" width="48" height="48" alt="juanpablodlc" title="juanpablodlc"/></a> <a href="https://github.com/conroywhitney"><img src="https://avatars.githubusercontent.com/u/249891?v=4&s=48" width="48" height="48" alt="conroywhitney" title="conroywhitney"/></a> <a href="https://github.com/hsrvc"><img src="https://avatars.githubusercontent.com/u/129702169?v=4&s=48" width="48" height="48" alt="hsrvc" title="hsrvc"/></a> <a href="https://github.com/magimetal"><img src="https://avatars.githubusercontent.com/u/36491250?v=4&s=48" width="48" height="48" alt="magimetal" title="magimetal"/></a>
|
<a href="https://github.com/abdelsfane"><img src="https://avatars.githubusercontent.com/u/32418586?v=4&s=48" width="48" height="48" alt="abdelsfane" title="abdelsfane"/></a> <a href="https://github.com/tobiasbischoff"><img src="https://avatars.githubusercontent.com/u/711564?v=4&s=48" width="48" height="48" alt="Tobias Bischoff" title="Tobias Bischoff"/></a> <a href="https://github.com/christianklotz"><img src="https://avatars.githubusercontent.com/u/69443?v=4&s=48" width="48" height="48" alt="christianklotz" title="christianklotz"/></a> <a href="https://github.com/czekaj"><img src="https://avatars.githubusercontent.com/u/1464539?v=4&s=48" width="48" height="48" alt="czekaj" title="czekaj"/></a> <a href="https://github.com/ethanpalm"><img src="https://avatars.githubusercontent.com/u/56270045?v=4&s=48" width="48" height="48" alt="ethanpalm" title="ethanpalm"/></a> <a href="https://github.com/mukhtharcm"><img src="https://avatars.githubusercontent.com/u/56378562?v=4&s=48" width="48" height="48" alt="mukhtharcm" title="mukhtharcm"/></a> <a href="https://github.com/maxsumrall"><img src="https://avatars.githubusercontent.com/u/628843?v=4&s=48" width="48" height="48" alt="maxsumrall" title="maxsumrall"/></a> <a href="https://github.com/xadenryan"><img src="https://avatars.githubusercontent.com/u/165437834?v=4&s=48" width="48" height="48" alt="xadenryan" title="xadenryan"/></a> <a href="https://github.com/VACInc"><img src="https://avatars.githubusercontent.com/u/3279061?v=4&s=48" width="48" height="48" alt="VACInc" title="VACInc"/></a> <a href="https://github.com/rodrigouroz"><img src="https://avatars.githubusercontent.com/u/384037?v=4&s=48" width="48" height="48" alt="rodrigouroz" title="rodrigouroz"/></a>
|
||||||
<a href="https://github.com/zerone0x"><img src="https://avatars.githubusercontent.com/u/39543393?v=4&s=48" width="48" height="48" alt="zerone0x" title="zerone0x"/></a> <a href="https://github.com/meaningfool"><img src="https://avatars.githubusercontent.com/u/2862331?v=4&s=48" width="48" height="48" alt="meaningfool" title="meaningfool"/></a> <a href="https://github.com/patelhiren"><img src="https://avatars.githubusercontent.com/u/172098?v=4&s=48" width="48" height="48" alt="patelhiren" title="patelhiren"/></a> <a href="https://github.com/NicholasSpisak"><img src="https://avatars.githubusercontent.com/u/129075147?v=4&s=48" width="48" height="48" alt="NicholasSpisak" title="NicholasSpisak"/></a> <a href="https://github.com/jonisjongithub"><img src="https://avatars.githubusercontent.com/u/86072337?v=4&s=48" width="48" height="48" alt="jonisjongithub" title="jonisjongithub"/></a> <a href="https://github.com/AbhisekBasu1"><img src="https://avatars.githubusercontent.com/u/40645221?v=4&s=48" width="48" height="48" alt="abhisekbasu1" title="abhisekbasu1"/></a> <a href="https://github.com/jamesgroat"><img src="https://avatars.githubusercontent.com/u/2634024?v=4&s=48" width="48" height="48" alt="jamesgroat" title="jamesgroat"/></a> <a href="https://github.com/claude"><img src="https://avatars.githubusercontent.com/u/81847?v=4&s=48" width="48" height="48" alt="claude" title="claude"/></a> <a href="https://github.com/JustYannicc"><img src="https://avatars.githubusercontent.com/u/52761674?v=4&s=48" width="48" height="48" alt="JustYannicc" title="JustYannicc"/></a> <a href="https://github.com/Hyaxia"><img src="https://avatars.githubusercontent.com/u/36747317?v=4&s=48" width="48" height="48" alt="Hyaxia" title="Hyaxia"/></a>
|
<a href="https://github.com/juanpablodlc"><img src="https://avatars.githubusercontent.com/u/92012363?v=4&s=48" width="48" height="48" alt="juanpablodlc" title="juanpablodlc"/></a> <a href="https://github.com/conroywhitney"><img src="https://avatars.githubusercontent.com/u/249891?v=4&s=48" width="48" height="48" alt="conroywhitney" title="conroywhitney"/></a> <a href="https://github.com/hsrvc"><img src="https://avatars.githubusercontent.com/u/129702169?v=4&s=48" width="48" height="48" alt="hsrvc" title="hsrvc"/></a> <a href="https://github.com/magimetal"><img src="https://avatars.githubusercontent.com/u/36491250?v=4&s=48" width="48" height="48" alt="magimetal" title="magimetal"/></a> <a href="https://github.com/zerone0x"><img src="https://avatars.githubusercontent.com/u/39543393?v=4&s=48" width="48" height="48" alt="zerone0x" title="zerone0x"/></a> <a href="https://github.com/Takhoffman"><img src="https://avatars.githubusercontent.com/u/781889?v=4&s=48" width="48" height="48" alt="Takhoffman" title="Takhoffman"/></a> <a href="https://github.com/meaningfool"><img src="https://avatars.githubusercontent.com/u/2862331?v=4&s=48" width="48" height="48" alt="meaningfool" title="meaningfool"/></a> <a href="https://github.com/mudrii"><img src="https://avatars.githubusercontent.com/u/220262?v=4&s=48" width="48" height="48" alt="mudrii" title="mudrii"/></a> <a href="https://github.com/patelhiren"><img src="https://avatars.githubusercontent.com/u/172098?v=4&s=48" width="48" height="48" alt="patelhiren" title="patelhiren"/></a> <a href="https://github.com/NicholasSpisak"><img src="https://avatars.githubusercontent.com/u/129075147?v=4&s=48" width="48" height="48" alt="NicholasSpisak" title="NicholasSpisak"/></a>
|
||||||
<a href="https://github.com/dantelex"><img src="https://avatars.githubusercontent.com/u/631543?v=4&s=48" width="48" height="48" alt="dantelex" title="dantelex"/></a> <a href="https://github.com/SocialNerd42069"><img src="https://avatars.githubusercontent.com/u/118244303?v=4&s=48" width="48" height="48" alt="SocialNerd42069" title="SocialNerd42069"/></a> <a href="https://github.com/daveonkels"><img src="https://avatars.githubusercontent.com/u/533642?v=4&s=48" width="48" height="48" alt="daveonkels" title="daveonkels"/></a> <a href="https://github.com/apps/google-labs-jules"><img src="https://avatars.githubusercontent.com/in/842251?v=4&s=48" width="48" height="48" alt="google-labs-jules[bot]" title="google-labs-jules[bot]"/></a> <a href="https://github.com/lc0rp"><img src="https://avatars.githubusercontent.com/u/2609441?v=4&s=48" width="48" height="48" alt="lc0rp" title="lc0rp"/></a> <a href="https://github.com/mousberg"><img src="https://avatars.githubusercontent.com/u/57605064?v=4&s=48" width="48" height="48" alt="mousberg" title="mousberg"/></a> <a href="https://github.com/adam91holt"><img src="https://avatars.githubusercontent.com/u/9592417?v=4&s=48" width="48" height="48" alt="adam91holt" title="adam91holt"/></a> <a href="https://github.com/hougangdev"><img src="https://avatars.githubusercontent.com/u/105773686?v=4&s=48" width="48" height="48" alt="hougangdev" title="hougangdev"/></a> <a href="https://github.com/gumadeiras"><img src="https://avatars.githubusercontent.com/u/5599352?v=4&s=48" width="48" height="48" alt="gumadeiras" title="gumadeiras"/></a> <a href="https://github.com/shakkernerd"><img src="https://avatars.githubusercontent.com/u/165377636?v=4&s=48" width="48" height="48" alt="shakkernerd" title="shakkernerd"/></a>
|
<a href="https://github.com/jonisjongithub"><img src="https://avatars.githubusercontent.com/u/86072337?v=4&s=48" width="48" height="48" alt="jonisjongithub" title="jonisjongithub"/></a> <a href="https://github.com/AbhisekBasu1"><img src="https://avatars.githubusercontent.com/u/40645221?v=4&s=48" width="48" height="48" alt="abhisekbasu1" title="abhisekbasu1"/></a> <a href="https://github.com/jamesgroat"><img src="https://avatars.githubusercontent.com/u/2634024?v=4&s=48" width="48" height="48" alt="jamesgroat" title="jamesgroat"/></a> <a href="https://github.com/BunsDev"><img src="https://avatars.githubusercontent.com/u/68980965?v=4&s=48" width="48" height="48" alt="BunsDev" title="BunsDev"/></a> <a href="https://github.com/claude"><img src="https://avatars.githubusercontent.com/u/81847?v=4&s=48" width="48" height="48" alt="claude" title="claude"/></a> <a href="https://github.com/JustYannicc"><img src="https://avatars.githubusercontent.com/u/52761674?v=4&s=48" width="48" height="48" alt="JustYannicc" title="JustYannicc"/></a> <a href="https://github.com/Hyaxia"><img src="https://avatars.githubusercontent.com/u/36747317?v=4&s=48" width="48" height="48" alt="Hyaxia" title="Hyaxia"/></a> <a href="https://github.com/dantelex"><img src="https://avatars.githubusercontent.com/u/631543?v=4&s=48" width="48" height="48" alt="dantelex" title="dantelex"/></a> <a href="https://github.com/SocialNerd42069"><img src="https://avatars.githubusercontent.com/u/118244303?v=4&s=48" width="48" height="48" alt="SocialNerd42069" title="SocialNerd42069"/></a> <a href="https://github.com/daveonkels"><img src="https://avatars.githubusercontent.com/u/533642?v=4&s=48" width="48" height="48" alt="daveonkels" title="daveonkels"/></a>
|
||||||
<a href="https://github.com/mteam88"><img src="https://avatars.githubusercontent.com/u/84196639?v=4&s=48" width="48" height="48" alt="mteam88" title="mteam88"/></a> <a href="https://github.com/hirefrank"><img src="https://avatars.githubusercontent.com/u/183158?v=4&s=48" width="48" height="48" alt="hirefrank" title="hirefrank"/></a> <a href="https://github.com/joeynyc"><img src="https://avatars.githubusercontent.com/u/17919866?v=4&s=48" width="48" height="48" alt="joeynyc" title="joeynyc"/></a> <a href="https://github.com/orlyjamie"><img src="https://avatars.githubusercontent.com/u/6668807?v=4&s=48" width="48" height="48" alt="orlyjamie" title="orlyjamie"/></a> <a href="https://github.com/dbhurley"><img src="https://avatars.githubusercontent.com/u/5251425?v=4&s=48" width="48" height="48" alt="dbhurley" title="dbhurley"/></a> <a href="https://github.com/omniwired"><img src="https://avatars.githubusercontent.com/u/322761?v=4&s=48" width="48" height="48" alt="Eng. Juan Combetto" title="Eng. Juan Combetto"/></a> <a href="https://github.com/TSavo"><img src="https://avatars.githubusercontent.com/u/877990?v=4&s=48" width="48" height="48" alt="TSavo" title="TSavo"/></a> <a href="https://github.com/aerolalit"><img src="https://avatars.githubusercontent.com/u/17166039?v=4&s=48" width="48" height="48" alt="aerolalit" title="aerolalit"/></a> <a href="https://github.com/julianengel"><img src="https://avatars.githubusercontent.com/u/10634231?v=4&s=48" width="48" height="48" alt="julianengel" title="julianengel"/></a> <a href="https://github.com/bradleypriest"><img src="https://avatars.githubusercontent.com/u/167215?v=4&s=48" width="48" height="48" alt="bradleypriest" title="bradleypriest"/></a>
|
<a href="https://github.com/apps/google-labs-jules"><img src="https://avatars.githubusercontent.com/in/842251?v=4&s=48" width="48" height="48" alt="google-labs-jules[bot]" title="google-labs-jules[bot]"/></a> <a href="https://github.com/lc0rp"><img src="https://avatars.githubusercontent.com/u/2609441?v=4&s=48" width="48" height="48" alt="lc0rp" title="lc0rp"/></a> <a href="https://github.com/adam91holt"><img src="https://avatars.githubusercontent.com/u/9592417?v=4&s=48" width="48" height="48" alt="adam91holt" title="adam91holt"/></a> <a href="https://github.com/mousberg"><img src="https://avatars.githubusercontent.com/u/57605064?v=4&s=48" width="48" height="48" alt="mousberg" title="mousberg"/></a> <a href="https://github.com/hougangdev"><img src="https://avatars.githubusercontent.com/u/105773686?v=4&s=48" width="48" height="48" alt="hougangdev" title="hougangdev"/></a> <a href="https://github.com/shakkernerd"><img src="https://avatars.githubusercontent.com/u/165377636?v=4&s=48" width="48" height="48" alt="shakkernerd" title="shakkernerd"/></a> <a href="https://github.com/coygeek"><img src="https://avatars.githubusercontent.com/u/65363919?v=4&s=48" width="48" height="48" alt="coygeek" title="coygeek"/></a> <a href="https://github.com/mteam88"><img src="https://avatars.githubusercontent.com/u/84196639?v=4&s=48" width="48" height="48" alt="mteam88" title="mteam88"/></a> <a href="https://github.com/hirefrank"><img src="https://avatars.githubusercontent.com/u/183158?v=4&s=48" width="48" height="48" alt="hirefrank" title="hirefrank"/></a> <a href="https://github.com/M00N7682"><img src="https://avatars.githubusercontent.com/u/170746674?v=4&s=48" width="48" height="48" alt="M00N7682" title="M00N7682"/></a>
|
||||||
<a href="https://github.com/benithors"><img src="https://avatars.githubusercontent.com/u/20652882?v=4&s=48" width="48" height="48" alt="benithors" title="benithors"/></a> <a href="https://github.com/rohannagpal"><img src="https://avatars.githubusercontent.com/u/4009239?v=4&s=48" width="48" height="48" alt="rohannagpal" title="rohannagpal"/></a> <a href="https://github.com/timolins"><img src="https://avatars.githubusercontent.com/u/1440854?v=4&s=48" width="48" height="48" alt="timolins" title="timolins"/></a> <a href="https://github.com/f-trycua"><img src="https://avatars.githubusercontent.com/u/195596869?v=4&s=48" width="48" height="48" alt="f-trycua" title="f-trycua"/></a> <a href="https://github.com/benostein"><img src="https://avatars.githubusercontent.com/u/31802821?v=4&s=48" width="48" height="48" alt="benostein" title="benostein"/></a> <a href="https://github.com/elliotsecops"><img src="https://avatars.githubusercontent.com/u/141947839?v=4&s=48" width="48" height="48" alt="elliotsecops" title="elliotsecops"/></a> <a href="https://github.com/christianklotz"><img src="https://avatars.githubusercontent.com/u/69443?v=4&s=48" width="48" height="48" alt="christianklotz" title="christianklotz"/></a> <a href="https://github.com/Nachx639"><img src="https://avatars.githubusercontent.com/u/71144023?v=4&s=48" width="48" height="48" alt="nachx639" title="nachx639"/></a> <a href="https://github.com/pvoo"><img src="https://avatars.githubusercontent.com/u/20116814?v=4&s=48" width="48" height="48" alt="pvoo" title="pvoo"/></a> <a href="https://github.com/sreekaransrinath"><img src="https://avatars.githubusercontent.com/u/50989977?v=4&s=48" width="48" height="48" alt="sreekaransrinath" title="sreekaransrinath"/></a>
|
<a href="https://github.com/joeynyc"><img src="https://avatars.githubusercontent.com/u/17919866?v=4&s=48" width="48" height="48" alt="joeynyc" title="joeynyc"/></a> <a href="https://github.com/orlyjamie"><img src="https://avatars.githubusercontent.com/u/6668807?v=4&s=48" width="48" height="48" alt="orlyjamie" title="orlyjamie"/></a> <a href="https://github.com/dbhurley"><img src="https://avatars.githubusercontent.com/u/5251425?v=4&s=48" width="48" height="48" alt="dbhurley" title="dbhurley"/></a> <a href="https://github.com/omniwired"><img src="https://avatars.githubusercontent.com/u/322761?v=4&s=48" width="48" height="48" alt="Eng. Juan Combetto" title="Eng. Juan Combetto"/></a> <a href="https://github.com/TSavo"><img src="https://avatars.githubusercontent.com/u/877990?v=4&s=48" width="48" height="48" alt="TSavo" title="TSavo"/></a> <a href="https://github.com/aerolalit"><img src="https://avatars.githubusercontent.com/u/17166039?v=4&s=48" width="48" height="48" alt="aerolalit" title="aerolalit"/></a> <a href="https://github.com/julianengel"><img src="https://avatars.githubusercontent.com/u/10634231?v=4&s=48" width="48" height="48" alt="julianengel" title="julianengel"/></a> <a href="https://github.com/bradleypriest"><img src="https://avatars.githubusercontent.com/u/167215?v=4&s=48" width="48" height="48" alt="bradleypriest" title="bradleypriest"/></a> <a href="https://github.com/benithors"><img src="https://avatars.githubusercontent.com/u/20652882?v=4&s=48" width="48" height="48" alt="benithors" title="benithors"/></a> <a href="https://github.com/lsh411"><img src="https://avatars.githubusercontent.com/u/6801488?v=4&s=48" width="48" height="48" alt="lsh411" title="lsh411"/></a>
|
||||||
<a href="https://github.com/gupsammy"><img src="https://avatars.githubusercontent.com/u/20296019?v=4&s=48" width="48" height="48" alt="gupsammy" title="gupsammy"/></a> <a href="https://github.com/cristip73"><img src="https://avatars.githubusercontent.com/u/24499421?v=4&s=48" width="48" height="48" alt="cristip73" title="cristip73"/></a> <a href="https://github.com/stefangalescu"><img src="https://avatars.githubusercontent.com/u/52995748?v=4&s=48" width="48" height="48" alt="stefangalescu" title="stefangalescu"/></a> <a href="https://github.com/nachoiacovino"><img src="https://avatars.githubusercontent.com/u/50103937?v=4&s=48" width="48" height="48" alt="nachoiacovino" title="nachoiacovino"/></a> <a href="https://github.com/vsabavat"><img src="https://avatars.githubusercontent.com/u/50385532?v=4&s=48" width="48" height="48" alt="Vasanth Rao Naik Sabavat" title="Vasanth Rao Naik Sabavat"/></a> <a href="https://github.com/petter-b"><img src="https://avatars.githubusercontent.com/u/62076402?v=4&s=48" width="48" height="48" alt="petter-b" title="petter-b"/></a> <a href="https://github.com/thewilloftheshadow"><img src="https://avatars.githubusercontent.com/u/35580099?v=4&s=48" width="48" height="48" alt="thewilloftheshadow" title="thewilloftheshadow"/></a> <a href="https://github.com/leszekszpunar"><img src="https://avatars.githubusercontent.com/u/13106764?v=4&s=48" width="48" height="48" alt="leszekszpunar" title="leszekszpunar"/></a> <a href="https://github.com/scald"><img src="https://avatars.githubusercontent.com/u/1215913?v=4&s=48" width="48" height="48" alt="scald" title="scald"/></a> <a href="https://github.com/andranik-sahakyan"><img src="https://avatars.githubusercontent.com/u/8908029?v=4&s=48" width="48" height="48" alt="andranik-sahakyan" title="andranik-sahakyan"/></a>
|
<a href="https://github.com/gut-puncture"><img src="https://avatars.githubusercontent.com/u/75851986?v=4&s=48" width="48" height="48" alt="gut-puncture" title="gut-puncture"/></a> <a href="https://github.com/rohannagpal"><img src="https://avatars.githubusercontent.com/u/4009239?v=4&s=48" width="48" height="48" alt="rohannagpal" title="rohannagpal"/></a> <a href="https://github.com/timolins"><img src="https://avatars.githubusercontent.com/u/1440854?v=4&s=48" width="48" height="48" alt="timolins" title="timolins"/></a> <a href="https://github.com/f-trycua"><img src="https://avatars.githubusercontent.com/u/195596869?v=4&s=48" width="48" height="48" alt="f-trycua" title="f-trycua"/></a> <a href="https://github.com/benostein"><img src="https://avatars.githubusercontent.com/u/31802821?v=4&s=48" width="48" height="48" alt="benostein" title="benostein"/></a> <a href="https://github.com/elliotsecops"><img src="https://avatars.githubusercontent.com/u/141947839?v=4&s=48" width="48" height="48" alt="elliotsecops" title="elliotsecops"/></a> <a href="https://github.com/Nachx639"><img src="https://avatars.githubusercontent.com/u/71144023?v=4&s=48" width="48" height="48" alt="nachx639" title="nachx639"/></a> <a href="https://github.com/pvoo"><img src="https://avatars.githubusercontent.com/u/20116814?v=4&s=48" width="48" height="48" alt="pvoo" title="pvoo"/></a> <a href="https://github.com/sreekaransrinath"><img src="https://avatars.githubusercontent.com/u/50989977?v=4&s=48" width="48" height="48" alt="sreekaransrinath" title="sreekaransrinath"/></a> <a href="https://github.com/gupsammy"><img src="https://avatars.githubusercontent.com/u/20296019?v=4&s=48" width="48" height="48" alt="gupsammy" title="gupsammy"/></a>
|
||||||
<a href="https://github.com/davidguttman"><img src="https://avatars.githubusercontent.com/u/431696?v=4&s=48" width="48" height="48" alt="davidguttman" title="davidguttman"/></a> <a href="https://github.com/sleontenko"><img src="https://avatars.githubusercontent.com/u/7135949?v=4&s=48" width="48" height="48" alt="sleontenko" title="sleontenko"/></a> <a href="https://github.com/denysvitali"><img src="https://avatars.githubusercontent.com/u/4939519?v=4&s=48" width="48" height="48" alt="denysvitali" title="denysvitali"/></a> <a href="https://github.com/sircrumpet"><img src="https://avatars.githubusercontent.com/u/4436535?v=4&s=48" width="48" height="48" alt="sircrumpet" title="sircrumpet"/></a> <a href="https://github.com/peschee"><img src="https://avatars.githubusercontent.com/u/63866?v=4&s=48" width="48" height="48" alt="peschee" title="peschee"/></a> <a href="https://github.com/nonggialiang"><img src="https://avatars.githubusercontent.com/u/14367839?v=4&s=48" width="48" height="48" alt="nonggialiang" title="nonggialiang"/></a> <a href="https://github.com/rafaelreis-r"><img src="https://avatars.githubusercontent.com/u/57492577?v=4&s=48" width="48" height="48" alt="rafaelreis-r" title="rafaelreis-r"/></a> <a href="https://github.com/dominicnunez"><img src="https://avatars.githubusercontent.com/u/43616264?v=4&s=48" width="48" height="48" alt="dominicnunez" title="dominicnunez"/></a> <a href="https://github.com/lploc94"><img src="https://avatars.githubusercontent.com/u/28453843?v=4&s=48" width="48" height="48" alt="lploc94" title="lploc94"/></a> <a href="https://github.com/ratulsarna"><img src="https://avatars.githubusercontent.com/u/105903728?v=4&s=48" width="48" height="48" alt="ratulsarna" title="ratulsarna"/></a>
|
<a href="https://github.com/cristip73"><img src="https://avatars.githubusercontent.com/u/24499421?v=4&s=48" width="48" height="48" alt="cristip73" title="cristip73"/></a> <a href="https://github.com/stefangalescu"><img src="https://avatars.githubusercontent.com/u/52995748?v=4&s=48" width="48" height="48" alt="stefangalescu" title="stefangalescu"/></a> <a href="https://github.com/nachoiacovino"><img src="https://avatars.githubusercontent.com/u/50103937?v=4&s=48" width="48" height="48" alt="nachoiacovino" title="nachoiacovino"/></a> <a href="https://github.com/vsabavat"><img src="https://avatars.githubusercontent.com/u/50385532?v=4&s=48" width="48" height="48" alt="Vasanth Rao Naik Sabavat" title="Vasanth Rao Naik Sabavat"/></a> <a href="https://github.com/petter-b"><img src="https://avatars.githubusercontent.com/u/62076402?v=4&s=48" width="48" height="48" alt="petter-b" title="petter-b"/></a> <a href="https://github.com/thewilloftheshadow"><img src="https://avatars.githubusercontent.com/u/35580099?v=4&s=48" width="48" height="48" alt="thewilloftheshadow" title="thewilloftheshadow"/></a> <a href="https://github.com/leszekszpunar"><img src="https://avatars.githubusercontent.com/u/13106764?v=4&s=48" width="48" height="48" alt="leszekszpunar" title="leszekszpunar"/></a> <a href="https://github.com/scald"><img src="https://avatars.githubusercontent.com/u/1215913?v=4&s=48" width="48" height="48" alt="scald" title="scald"/></a> <a href="https://github.com/pycckuu"><img src="https://avatars.githubusercontent.com/u/1489583?v=4&s=48" width="48" height="48" alt="pycckuu" title="pycckuu"/></a> <a href="https://github.com/andranik-sahakyan"><img src="https://avatars.githubusercontent.com/u/8908029?v=4&s=48" width="48" height="48" alt="andranik-sahakyan" title="andranik-sahakyan"/></a>
|
||||||
<a href="https://github.com/sfo2001"><img src="https://avatars.githubusercontent.com/u/103369858?v=4&s=48" width="48" height="48" alt="sfo2001" title="sfo2001"/></a> <a href="https://github.com/lutr0"><img src="https://avatars.githubusercontent.com/u/76906369?v=4&s=48" width="48" height="48" alt="lutr0" title="lutr0"/></a> <a href="https://github.com/kiranjd"><img src="https://avatars.githubusercontent.com/u/25822851?v=4&s=48" width="48" height="48" alt="kiranjd" title="kiranjd"/></a> <a href="https://github.com/danielz1z"><img src="https://avatars.githubusercontent.com/u/235270390?v=4&s=48" width="48" height="48" alt="danielz1z" title="danielz1z"/></a> <a href="https://github.com/AdeboyeDN"><img src="https://avatars.githubusercontent.com/u/65312338?v=4&s=48" width="48" height="48" alt="AdeboyeDN" title="AdeboyeDN"/></a> <a href="https://github.com/Alg0rix"><img src="https://avatars.githubusercontent.com/u/53804949?v=4&s=48" width="48" height="48" alt="Alg0rix" title="Alg0rix"/></a> <a href="https://github.com/Takhoffman"><img src="https://avatars.githubusercontent.com/u/781889?v=4&s=48" width="48" height="48" alt="Takhoffman" title="Takhoffman"/></a> <a href="https://github.com/papago2355"><img src="https://avatars.githubusercontent.com/u/68721273?v=4&s=48" width="48" height="48" alt="papago2355" title="papago2355"/></a> <a href="https://github.com/apps/clawdinator"><img src="https://avatars.githubusercontent.com/in/2607181?v=4&s=48" width="48" height="48" alt="clawdinator[bot]" title="clawdinator[bot]"/></a> <a href="https://github.com/emanuelst"><img src="https://avatars.githubusercontent.com/u/9994339?v=4&s=48" width="48" height="48" alt="emanuelst" title="emanuelst"/></a>
|
<a href="https://github.com/davidguttman"><img src="https://avatars.githubusercontent.com/u/431696?v=4&s=48" width="48" height="48" alt="davidguttman" title="davidguttman"/></a> <a href="https://github.com/sleontenko"><img src="https://avatars.githubusercontent.com/u/7135949?v=4&s=48" width="48" height="48" alt="sleontenko" title="sleontenko"/></a> <a href="https://github.com/denysvitali"><img src="https://avatars.githubusercontent.com/u/4939519?v=4&s=48" width="48" height="48" alt="denysvitali" title="denysvitali"/></a> <a href="https://github.com/apps/clawdinator"><img src="https://avatars.githubusercontent.com/in/2607181?v=4&s=48" width="48" height="48" alt="clawdinator[bot]" title="clawdinator[bot]"/></a> <a href="https://github.com/TinyTb"><img src="https://avatars.githubusercontent.com/u/5957298?v=4&s=48" width="48" height="48" alt="TinyTb" title="TinyTb"/></a> <a href="https://github.com/sircrumpet"><img src="https://avatars.githubusercontent.com/u/4436535?v=4&s=48" width="48" height="48" alt="sircrumpet" title="sircrumpet"/></a> <a href="https://github.com/peschee"><img src="https://avatars.githubusercontent.com/u/63866?v=4&s=48" width="48" height="48" alt="peschee" title="peschee"/></a> <a href="https://github.com/nicolasstanley"><img src="https://avatars.githubusercontent.com/u/60584925?v=4&s=48" width="48" height="48" alt="nicolasstanley" title="nicolasstanley"/></a> <a href="https://github.com/davidiach"><img src="https://avatars.githubusercontent.com/u/28102235?v=4&s=48" width="48" height="48" alt="davidiach" title="davidiach"/></a> <a href="https://github.com/nonggialiang"><img src="https://avatars.githubusercontent.com/u/14367839?v=4&s=48" width="48" height="48" alt="nonggialiang" title="nonggialiang"/></a>
|
||||||
<a href="https://github.com/evanotero"><img src="https://avatars.githubusercontent.com/u/13204105?v=4&s=48" width="48" height="48" alt="evanotero" title="evanotero"/></a> <a href="https://github.com/KristijanJovanovski"><img src="https://avatars.githubusercontent.com/u/8942284?v=4&s=48" width="48" height="48" alt="KristijanJovanovski" title="KristijanJovanovski"/></a> <a href="https://github.com/jlowin"><img src="https://avatars.githubusercontent.com/u/153965?v=4&s=48" width="48" height="48" alt="jlowin" title="jlowin"/></a> <a href="https://github.com/rdev"><img src="https://avatars.githubusercontent.com/u/8418866?v=4&s=48" width="48" height="48" alt="rdev" title="rdev"/></a> <a href="https://github.com/rhuanssauro"><img src="https://avatars.githubusercontent.com/u/164682191?v=4&s=48" width="48" height="48" alt="rhuanssauro" title="rhuanssauro"/></a> <a href="https://github.com/joshrad-dev"><img src="https://avatars.githubusercontent.com/u/62785552?v=4&s=48" width="48" height="48" alt="joshrad-dev" title="joshrad-dev"/></a> <a href="https://github.com/obviyus"><img src="https://avatars.githubusercontent.com/u/22031114?v=4&s=48" width="48" height="48" alt="obviyus" title="obviyus"/></a> <a href="https://github.com/osolmaz"><img src="https://avatars.githubusercontent.com/u/2453968?v=4&s=48" width="48" height="48" alt="osolmaz" title="osolmaz"/></a> <a href="https://github.com/adityashaw2"><img src="https://avatars.githubusercontent.com/u/41204444?v=4&s=48" width="48" height="48" alt="adityashaw2" title="adityashaw2"/></a> <a href="https://github.com/CashWilliams"><img src="https://avatars.githubusercontent.com/u/613573?v=4&s=48" width="48" height="48" alt="CashWilliams" title="CashWilliams"/></a>
|
<a href="https://github.com/ironbyte-rgb"><img src="https://avatars.githubusercontent.com/u/230665944?v=4&s=48" width="48" height="48" alt="ironbyte-rgb" title="ironbyte-rgb"/></a> <a href="https://github.com/rafaelreis-r"><img src="https://avatars.githubusercontent.com/u/57492577?v=4&s=48" width="48" height="48" alt="rafaelreis-r" title="rafaelreis-r"/></a> <a href="https://github.com/dominicnunez"><img src="https://avatars.githubusercontent.com/u/43616264?v=4&s=48" width="48" height="48" alt="dominicnunez" title="dominicnunez"/></a> <a href="https://github.com/lploc94"><img src="https://avatars.githubusercontent.com/u/28453843?v=4&s=48" width="48" height="48" alt="lploc94" title="lploc94"/></a> <a href="https://github.com/ratulsarna"><img src="https://avatars.githubusercontent.com/u/105903728?v=4&s=48" width="48" height="48" alt="ratulsarna" title="ratulsarna"/></a> <a href="https://github.com/sfo2001"><img src="https://avatars.githubusercontent.com/u/103369858?v=4&s=48" width="48" height="48" alt="sfo2001" title="sfo2001"/></a> <a href="https://github.com/lutr0"><img src="https://avatars.githubusercontent.com/u/76906369?v=4&s=48" width="48" height="48" alt="lutr0" title="lutr0"/></a> <a href="https://github.com/kiranjd"><img src="https://avatars.githubusercontent.com/u/25822851?v=4&s=48" width="48" height="48" alt="kiranjd" title="kiranjd"/></a> <a href="https://github.com/danielz1z"><img src="https://avatars.githubusercontent.com/u/235270390?v=4&s=48" width="48" height="48" alt="danielz1z" title="danielz1z"/></a> <a href="https://github.com/Iranb"><img src="https://avatars.githubusercontent.com/u/49674669?v=4&s=48" width="48" height="48" alt="Iranb" title="Iranb"/></a>
|
||||||
<a href="https://github.com/search?q=sheeek"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="sheeek" title="sheeek"/></a> <a href="https://github.com/ryancontent"><img src="https://avatars.githubusercontent.com/u/39743613?v=4&s=48" width="48" height="48" alt="ryancontent" title="ryancontent"/></a> <a href="https://github.com/jasonsschin"><img src="https://avatars.githubusercontent.com/u/1456889?v=4&s=48" width="48" height="48" alt="jasonsschin" title="jasonsschin"/></a> <a href="https://github.com/artuskg"><img src="https://avatars.githubusercontent.com/u/11966157?v=4&s=48" width="48" height="48" alt="artuskg" title="artuskg"/></a> <a href="https://github.com/onutc"><img src="https://avatars.githubusercontent.com/u/152018508?v=4&s=48" width="48" height="48" alt="onutc" title="onutc"/></a> <a href="https://github.com/pauloportella"><img src="https://avatars.githubusercontent.com/u/22947229?v=4&s=48" width="48" height="48" alt="pauloportella" title="pauloportella"/></a> <a href="https://github.com/HirokiKobayashi-R"><img src="https://avatars.githubusercontent.com/u/37167840?v=4&s=48" width="48" height="48" alt="HirokiKobayashi-R" title="HirokiKobayashi-R"/></a> <a href="https://github.com/ThanhNguyxn"><img src="https://avatars.githubusercontent.com/u/74597207?v=4&s=48" width="48" height="48" alt="ThanhNguyxn" title="ThanhNguyxn"/></a> <a href="https://github.com/kimitaka"><img src="https://avatars.githubusercontent.com/u/167225?v=4&s=48" width="48" height="48" alt="kimitaka" title="kimitaka"/></a> <a href="https://github.com/yuting0624"><img src="https://avatars.githubusercontent.com/u/32728916?v=4&s=48" width="48" height="48" alt="yuting0624" title="yuting0624"/></a>
|
<a href="https://github.com/AdeboyeDN"><img src="https://avatars.githubusercontent.com/u/65312338?v=4&s=48" width="48" height="48" alt="AdeboyeDN" title="AdeboyeDN"/></a> <a href="https://github.com/Alg0rix"><img src="https://avatars.githubusercontent.com/u/53804949?v=4&s=48" width="48" height="48" alt="Alg0rix" title="Alg0rix"/></a> <a href="https://github.com/obviyus"><img src="https://avatars.githubusercontent.com/u/22031114?v=4&s=48" width="48" height="48" alt="obviyus" title="obviyus"/></a> <a href="https://github.com/papago2355"><img src="https://avatars.githubusercontent.com/u/68721273?v=4&s=48" width="48" height="48" alt="papago2355" title="papago2355"/></a> <a href="https://github.com/emanuelst"><img src="https://avatars.githubusercontent.com/u/9994339?v=4&s=48" width="48" height="48" alt="emanuelst" title="emanuelst"/></a> <a href="https://github.com/evanotero"><img src="https://avatars.githubusercontent.com/u/13204105?v=4&s=48" width="48" height="48" alt="evanotero" title="evanotero"/></a> <a href="https://github.com/KristijanJovanovski"><img src="https://avatars.githubusercontent.com/u/8942284?v=4&s=48" width="48" height="48" alt="KristijanJovanovski" title="KristijanJovanovski"/></a> <a href="https://github.com/jlowin"><img src="https://avatars.githubusercontent.com/u/153965?v=4&s=48" width="48" height="48" alt="jlowin" title="jlowin"/></a> <a href="https://github.com/rdev"><img src="https://avatars.githubusercontent.com/u/8418866?v=4&s=48" width="48" height="48" alt="rdev" title="rdev"/></a> <a href="https://github.com/rhuanssauro"><img src="https://avatars.githubusercontent.com/u/164682191?v=4&s=48" width="48" height="48" alt="rhuanssauro" title="rhuanssauro"/></a>
|
||||||
<a href="https://github.com/neooriginal"><img src="https://avatars.githubusercontent.com/u/54811660?v=4&s=48" width="48" height="48" alt="neooriginal" title="neooriginal"/></a> <a href="https://github.com/ManuelHettich"><img src="https://avatars.githubusercontent.com/u/17690367?v=4&s=48" width="48" height="48" alt="manuelhettich" title="manuelhettich"/></a> <a href="https://github.com/minghinmatthewlam"><img src="https://avatars.githubusercontent.com/u/14224566?v=4&s=48" width="48" height="48" alt="minghinmatthewlam" title="minghinmatthewlam"/></a> <a href="https://github.com/baccula"><img src="https://avatars.githubusercontent.com/u/22080883?v=4&s=48" width="48" height="48" alt="baccula" title="baccula"/></a> <a href="https://github.com/manikv12"><img src="https://avatars.githubusercontent.com/u/49544491?v=4&s=48" width="48" height="48" alt="manikv12" title="manikv12"/></a> <a href="https://github.com/myfunc"><img src="https://avatars.githubusercontent.com/u/19294627?v=4&s=48" width="48" height="48" alt="myfunc" title="myfunc"/></a> <a href="https://github.com/travisirby"><img src="https://avatars.githubusercontent.com/u/5958376?v=4&s=48" width="48" height="48" alt="travisirby" title="travisirby"/></a> <a href="https://github.com/buddyh"><img src="https://avatars.githubusercontent.com/u/31752869?v=4&s=48" width="48" height="48" alt="buddyh" title="buddyh"/></a> <a href="https://github.com/connorshea"><img src="https://avatars.githubusercontent.com/u/2977353?v=4&s=48" width="48" height="48" alt="connorshea" title="connorshea"/></a> <a href="https://github.com/kyleok"><img src="https://avatars.githubusercontent.com/u/58307870?v=4&s=48" width="48" height="48" alt="kyleok" title="kyleok"/></a>
|
<a href="https://github.com/joshrad-dev"><img src="https://avatars.githubusercontent.com/u/62785552?v=4&s=48" width="48" height="48" alt="joshrad-dev" title="joshrad-dev"/></a> <a href="https://github.com/osolmaz"><img src="https://avatars.githubusercontent.com/u/2453968?v=4&s=48" width="48" height="48" alt="osolmaz" title="osolmaz"/></a> <a href="https://github.com/adityashaw2"><img src="https://avatars.githubusercontent.com/u/41204444?v=4&s=48" width="48" height="48" alt="adityashaw2" title="adityashaw2"/></a> <a href="https://github.com/CashWilliams"><img src="https://avatars.githubusercontent.com/u/613573?v=4&s=48" width="48" height="48" alt="CashWilliams" title="CashWilliams"/></a> <a href="https://github.com/search?q=sheeek"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="sheeek" title="sheeek"/></a> <a href="https://github.com/ryancontent"><img src="https://avatars.githubusercontent.com/u/39743613?v=4&s=48" width="48" height="48" alt="ryancontent" title="ryancontent"/></a> <a href="https://github.com/jasonsschin"><img src="https://avatars.githubusercontent.com/u/1456889?v=4&s=48" width="48" height="48" alt="jasonsschin" title="jasonsschin"/></a> <a href="https://github.com/artuskg"><img src="https://avatars.githubusercontent.com/u/11966157?v=4&s=48" width="48" height="48" alt="artuskg" title="artuskg"/></a> <a href="https://github.com/onutc"><img src="https://avatars.githubusercontent.com/u/152018508?v=4&s=48" width="48" height="48" alt="onutc" title="onutc"/></a> <a href="https://github.com/pauloportella"><img src="https://avatars.githubusercontent.com/u/22947229?v=4&s=48" width="48" height="48" alt="pauloportella" title="pauloportella"/></a>
|
||||||
<a href="https://github.com/mcinteerj"><img src="https://avatars.githubusercontent.com/u/3613653?v=4&s=48" width="48" height="48" alt="mcinteerj" title="mcinteerj"/></a> <a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4&s=48" width="48" height="48" alt="dependabot[bot]" title="dependabot[bot]"/></a> <a href="https://github.com/amitbiswal007"><img src="https://avatars.githubusercontent.com/u/108086198?v=4&s=48" width="48" height="48" alt="amitbiswal007" title="amitbiswal007"/></a> <a href="https://github.com/John-Rood"><img src="https://avatars.githubusercontent.com/u/62669593?v=4&s=48" width="48" height="48" alt="John-Rood" title="John-Rood"/></a> <a href="https://github.com/timkrase"><img src="https://avatars.githubusercontent.com/u/38947626?v=4&s=48" width="48" height="48" alt="timkrase" title="timkrase"/></a> <a href="https://github.com/uos-status"><img src="https://avatars.githubusercontent.com/u/255712580?v=4&s=48" width="48" height="48" alt="uos-status" title="uos-status"/></a> <a href="https://github.com/gerardward2007"><img src="https://avatars.githubusercontent.com/u/3002155?v=4&s=48" width="48" height="48" alt="gerardward2007" title="gerardward2007"/></a> <a href="https://github.com/roshanasingh4"><img src="https://avatars.githubusercontent.com/u/88576930?v=4&s=48" width="48" height="48" alt="roshanasingh4" title="roshanasingh4"/></a> <a href="https://github.com/tosh-hamburg"><img src="https://avatars.githubusercontent.com/u/58424326?v=4&s=48" width="48" height="48" alt="tosh-hamburg" title="tosh-hamburg"/></a> <a href="https://github.com/azade-c"><img src="https://avatars.githubusercontent.com/u/252790079?v=4&s=48" width="48" height="48" alt="azade-c" title="azade-c"/></a>
|
<a href="https://github.com/HirokiKobayashi-R"><img src="https://avatars.githubusercontent.com/u/37167840?v=4&s=48" width="48" height="48" alt="HirokiKobayashi-R" title="HirokiKobayashi-R"/></a> <a href="https://github.com/ThanhNguyxn"><img src="https://avatars.githubusercontent.com/u/74597207?v=4&s=48" width="48" height="48" alt="ThanhNguyxn" title="ThanhNguyxn"/></a> <a href="https://github.com/18-RAJAT"><img src="https://avatars.githubusercontent.com/u/78920780?v=4&s=48" width="48" height="48" alt="18-RAJAT" title="18-RAJAT"/></a> <a href="https://github.com/kimitaka"><img src="https://avatars.githubusercontent.com/u/167225?v=4&s=48" width="48" height="48" alt="kimitaka" title="kimitaka"/></a> <a href="https://github.com/yuting0624"><img src="https://avatars.githubusercontent.com/u/32728916?v=4&s=48" width="48" height="48" alt="yuting0624" title="yuting0624"/></a> <a href="https://github.com/neooriginal"><img src="https://avatars.githubusercontent.com/u/54811660?v=4&s=48" width="48" height="48" alt="neooriginal" title="neooriginal"/></a> <a href="https://github.com/ManuelHettich"><img src="https://avatars.githubusercontent.com/u/17690367?v=4&s=48" width="48" height="48" alt="manuelhettich" title="manuelhettich"/></a> <a href="https://github.com/minghinmatthewlam"><img src="https://avatars.githubusercontent.com/u/14224566?v=4&s=48" width="48" height="48" alt="minghinmatthewlam" title="minghinmatthewlam"/></a> <a href="https://github.com/unisone"><img src="https://avatars.githubusercontent.com/u/32521398?v=4&s=48" width="48" height="48" alt="unisone" title="unisone"/></a> <a href="https://github.com/baccula"><img src="https://avatars.githubusercontent.com/u/22080883?v=4&s=48" width="48" height="48" alt="baccula" title="baccula"/></a>
|
||||||
<a href="https://github.com/badlogic"><img src="https://avatars.githubusercontent.com/u/514052?v=4&s=48" width="48" height="48" alt="badlogic" title="badlogic"/></a> <a href="https://github.com/dlauer"><img src="https://avatars.githubusercontent.com/u/757041?v=4&s=48" width="48" height="48" alt="dlauer" title="dlauer"/></a> <a href="https://github.com/JonUleis"><img src="https://avatars.githubusercontent.com/u/7644941?v=4&s=48" width="48" height="48" alt="JonUleis" title="JonUleis"/></a> <a href="https://github.com/shivamraut101"><img src="https://avatars.githubusercontent.com/u/110457469?v=4&s=48" width="48" height="48" alt="shivamraut101" title="shivamraut101"/></a> <a href="https://github.com/bjesuiter"><img src="https://avatars.githubusercontent.com/u/2365676?v=4&s=48" width="48" height="48" alt="bjesuiter" title="bjesuiter"/></a> <a href="https://github.com/cheeeee"><img src="https://avatars.githubusercontent.com/u/21245729?v=4&s=48" width="48" height="48" alt="cheeeee" title="cheeeee"/></a> <a href="https://github.com/robbyczgw-cla"><img src="https://avatars.githubusercontent.com/u/239660374?v=4&s=48" width="48" height="48" alt="robbyczgw-cla" title="robbyczgw-cla"/></a> <a href="https://github.com/YuriNachos"><img src="https://avatars.githubusercontent.com/u/19365375?v=4&s=48" width="48" height="48" alt="YuriNachos" title="YuriNachos"/></a> <a href="https://github.com/j1philli"><img src="https://avatars.githubusercontent.com/u/3744255?v=4&s=48" width="48" height="48" alt="Josh Phillips" title="Josh Phillips"/></a> <a href="https://github.com/pookNast"><img src="https://avatars.githubusercontent.com/u/14242552?v=4&s=48" width="48" height="48" alt="pookNast" title="pookNast"/></a>
|
<a href="https://github.com/manikv12"><img src="https://avatars.githubusercontent.com/u/49544491?v=4&s=48" width="48" height="48" alt="manikv12" title="manikv12"/></a> <a href="https://github.com/myfunc"><img src="https://avatars.githubusercontent.com/u/19294627?v=4&s=48" width="48" height="48" alt="myfunc" title="myfunc"/></a> <a href="https://github.com/travisirby"><img src="https://avatars.githubusercontent.com/u/5958376?v=4&s=48" width="48" height="48" alt="travisirby" title="travisirby"/></a> <a href="https://github.com/fujiwara-tofu-shop"><img src="https://avatars.githubusercontent.com/u/259415332?v=4&s=48" width="48" height="48" alt="fujiwara-tofu-shop" title="fujiwara-tofu-shop"/></a> <a href="https://github.com/buddyh"><img src="https://avatars.githubusercontent.com/u/31752869?v=4&s=48" width="48" height="48" alt="buddyh" title="buddyh"/></a> <a href="https://github.com/connorshea"><img src="https://avatars.githubusercontent.com/u/2977353?v=4&s=48" width="48" height="48" alt="connorshea" title="connorshea"/></a> <a href="https://github.com/bjesuiter"><img src="https://avatars.githubusercontent.com/u/2365676?v=4&s=48" width="48" height="48" alt="bjesuiter" title="bjesuiter"/></a> <a href="https://github.com/kyleok"><img src="https://avatars.githubusercontent.com/u/58307870?v=4&s=48" width="48" height="48" alt="kyleok" title="kyleok"/></a> <a href="https://github.com/slonce70"><img src="https://avatars.githubusercontent.com/u/130596182?v=4&s=48" width="48" height="48" alt="slonce70" title="slonce70"/></a> <a href="https://github.com/mcinteerj"><img src="https://avatars.githubusercontent.com/u/3613653?v=4&s=48" width="48" height="48" alt="mcinteerj" title="mcinteerj"/></a>
|
||||||
<a href="https://github.com/Whoaa512"><img src="https://avatars.githubusercontent.com/u/1581943?v=4&s=48" width="48" height="48" alt="Whoaa512" title="Whoaa512"/></a> <a href="https://github.com/chriseidhof"><img src="https://avatars.githubusercontent.com/u/5382?v=4&s=48" width="48" height="48" alt="chriseidhof" title="chriseidhof"/></a> <a href="https://github.com/ngutman"><img src="https://avatars.githubusercontent.com/u/1540134?v=4&s=48" width="48" height="48" alt="ngutman" title="ngutman"/></a> <a href="https://github.com/ysqander"><img src="https://avatars.githubusercontent.com/u/80843820?v=4&s=48" width="48" height="48" alt="ysqander" title="ysqander"/></a> <a href="https://github.com/search?q=Yurii%20Chukhlib"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Yurii Chukhlib" title="Yurii Chukhlib"/></a> <a href="https://github.com/aj47"><img src="https://avatars.githubusercontent.com/u/8023513?v=4&s=48" width="48" height="48" alt="aj47" title="aj47"/></a> <a href="https://github.com/kennyklee"><img src="https://avatars.githubusercontent.com/u/1432489?v=4&s=48" width="48" height="48" alt="kennyklee" title="kennyklee"/></a> <a href="https://github.com/superman32432432"><img src="https://avatars.githubusercontent.com/u/7228420?v=4&s=48" width="48" height="48" alt="superman32432432" title="superman32432432"/></a> <a href="https://github.com/grp06"><img src="https://avatars.githubusercontent.com/u/1573959?v=4&s=48" width="48" height="48" alt="grp06" title="grp06"/></a> <a href="https://github.com/Hisleren"><img src="https://avatars.githubusercontent.com/u/83217244?v=4&s=48" width="48" height="48" alt="Hisleren" title="Hisleren"/></a>
|
<a href="https://github.com/badlogic"><img src="https://avatars.githubusercontent.com/u/514052?v=4&s=48" width="48" height="48" alt="badlogic" title="badlogic"/></a> <a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4&s=48" width="48" height="48" alt="dependabot[bot]" title="dependabot[bot]"/></a> <a href="https://github.com/amitbiswal007"><img src="https://avatars.githubusercontent.com/u/108086198?v=4&s=48" width="48" height="48" alt="amitbiswal007" title="amitbiswal007"/></a> <a href="https://github.com/John-Rood"><img src="https://avatars.githubusercontent.com/u/62669593?v=4&s=48" width="48" height="48" alt="John-Rood" title="John-Rood"/></a> <a href="https://github.com/timkrase"><img src="https://avatars.githubusercontent.com/u/38947626?v=4&s=48" width="48" height="48" alt="timkrase" title="timkrase"/></a> <a href="https://github.com/uos-status"><img src="https://avatars.githubusercontent.com/u/255712580?v=4&s=48" width="48" height="48" alt="uos-status" title="uos-status"/></a> <a href="https://github.com/gerardward2007"><img src="https://avatars.githubusercontent.com/u/3002155?v=4&s=48" width="48" height="48" alt="gerardward2007" title="gerardward2007"/></a> <a href="https://github.com/roshanasingh4"><img src="https://avatars.githubusercontent.com/u/88576930?v=4&s=48" width="48" height="48" alt="roshanasingh4" title="roshanasingh4"/></a> <a href="https://github.com/tosh-hamburg"><img src="https://avatars.githubusercontent.com/u/58424326?v=4&s=48" width="48" height="48" alt="tosh-hamburg" title="tosh-hamburg"/></a> <a href="https://github.com/azade-c"><img src="https://avatars.githubusercontent.com/u/252790079?v=4&s=48" width="48" height="48" alt="azade-c" title="azade-c"/></a>
|
||||||
<a href="https://github.com/shatner"><img src="https://avatars.githubusercontent.com/u/17735435?v=4&s=48" width="48" height="48" alt="shatner" title="shatner"/></a> <a href="https://github.com/antons"><img src="https://avatars.githubusercontent.com/u/129705?v=4&s=48" width="48" height="48" alt="antons" title="antons"/></a> <a href="https://github.com/austinm911"><img src="https://avatars.githubusercontent.com/u/31991302?v=4&s=48" width="48" height="48" alt="austinm911" title="austinm911"/></a> <a href="https://github.com/apps/blacksmith-sh"><img src="https://avatars.githubusercontent.com/in/807020?v=4&s=48" width="48" height="48" alt="blacksmith-sh[bot]" title="blacksmith-sh[bot]"/></a> <a href="https://github.com/damoahdominic"><img src="https://avatars.githubusercontent.com/u/4623434?v=4&s=48" width="48" height="48" alt="damoahdominic" title="damoahdominic"/></a> <a href="https://github.com/dan-dr"><img src="https://avatars.githubusercontent.com/u/6669808?v=4&s=48" width="48" height="48" alt="dan-dr" title="dan-dr"/></a> <a href="https://github.com/GHesericsu"><img src="https://avatars.githubusercontent.com/u/60202455?v=4&s=48" width="48" height="48" alt="GHesericsu" title="GHesericsu"/></a> <a href="https://github.com/HeimdallStrategy"><img src="https://avatars.githubusercontent.com/u/223014405?v=4&s=48" width="48" height="48" alt="HeimdallStrategy" title="HeimdallStrategy"/></a> <a href="https://github.com/imfing"><img src="https://avatars.githubusercontent.com/u/5097752?v=4&s=48" width="48" height="48" alt="imfing" title="imfing"/></a> <a href="https://github.com/jalehman"><img src="https://avatars.githubusercontent.com/u/550978?v=4&s=48" width="48" height="48" alt="jalehman" title="jalehman"/></a>
|
<a href="https://github.com/dlauer"><img src="https://avatars.githubusercontent.com/u/757041?v=4&s=48" width="48" height="48" alt="dlauer" title="dlauer"/></a> <a href="https://github.com/grp06"><img src="https://avatars.githubusercontent.com/u/1573959?v=4&s=48" width="48" height="48" alt="grp06" title="grp06"/></a> <a href="https://github.com/JonUleis"><img src="https://avatars.githubusercontent.com/u/7644941?v=4&s=48" width="48" height="48" alt="JonUleis" title="JonUleis"/></a> <a href="https://github.com/shivamraut101"><img src="https://avatars.githubusercontent.com/u/110457469?v=4&s=48" width="48" height="48" alt="shivamraut101" title="shivamraut101"/></a> <a href="https://github.com/cheeeee"><img src="https://avatars.githubusercontent.com/u/21245729?v=4&s=48" width="48" height="48" alt="cheeeee" title="cheeeee"/></a> <a href="https://github.com/robbyczgw-cla"><img src="https://avatars.githubusercontent.com/u/239660374?v=4&s=48" width="48" height="48" alt="robbyczgw-cla" title="robbyczgw-cla"/></a> <a href="https://github.com/YuriNachos"><img src="https://avatars.githubusercontent.com/u/19365375?v=4&s=48" width="48" height="48" alt="YuriNachos" title="YuriNachos"/></a> <a href="https://github.com/j1philli"><img src="https://avatars.githubusercontent.com/u/3744255?v=4&s=48" width="48" height="48" alt="Josh Phillips" title="Josh Phillips"/></a> <a href="https://github.com/Wangnov"><img src="https://avatars.githubusercontent.com/u/48670012?v=4&s=48" width="48" height="48" alt="Wangnov" title="Wangnov"/></a> <a href="https://github.com/kaizen403"><img src="https://avatars.githubusercontent.com/u/134706404?v=4&s=48" width="48" height="48" alt="kaizen403" title="kaizen403"/></a>
|
||||||
<a href="https://github.com/jarvis-medmatic"><img src="https://avatars.githubusercontent.com/u/252428873?v=4&s=48" width="48" height="48" alt="jarvis-medmatic" title="jarvis-medmatic"/></a> <a href="https://github.com/kkarimi"><img src="https://avatars.githubusercontent.com/u/875218?v=4&s=48" width="48" height="48" alt="kkarimi" title="kkarimi"/></a> <a href="https://github.com/mahmoudashraf93"><img src="https://avatars.githubusercontent.com/u/9130129?v=4&s=48" width="48" height="48" alt="mahmoudashraf93" title="mahmoudashraf93"/></a> <a href="https://github.com/pkrmf"><img src="https://avatars.githubusercontent.com/u/1714267?v=4&s=48" width="48" height="48" alt="pkrmf" title="pkrmf"/></a> <a href="https://github.com/RandyVentures"><img src="https://avatars.githubusercontent.com/u/149904821?v=4&s=48" width="48" height="48" alt="RandyVentures" title="RandyVentures"/></a> <a href="https://github.com/robhparker"><img src="https://avatars.githubusercontent.com/u/7404740?v=4&s=48" width="48" height="48" alt="robhparker" title="robhparker"/></a> <a href="https://github.com/search?q=Ryan%20Lisse"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ryan Lisse" title="Ryan Lisse"/></a> <a href="https://github.com/dougvk"><img src="https://avatars.githubusercontent.com/u/401660?v=4&s=48" width="48" height="48" alt="dougvk" title="dougvk"/></a> <a href="https://github.com/erikpr1994"><img src="https://avatars.githubusercontent.com/u/6299331?v=4&s=48" width="48" height="48" alt="erikpr1994" title="erikpr1994"/></a> <a href="https://github.com/fal3"><img src="https://avatars.githubusercontent.com/u/6484295?v=4&s=48" width="48" height="48" alt="fal3" title="fal3"/></a>
|
<a href="https://github.com/pookNast"><img src="https://avatars.githubusercontent.com/u/14242552?v=4&s=48" width="48" height="48" alt="pookNast" title="pookNast"/></a> <a href="https://github.com/Whoaa512"><img src="https://avatars.githubusercontent.com/u/1581943?v=4&s=48" width="48" height="48" alt="Whoaa512" title="Whoaa512"/></a> <a href="https://github.com/chriseidhof"><img src="https://avatars.githubusercontent.com/u/5382?v=4&s=48" width="48" height="48" alt="chriseidhof" title="chriseidhof"/></a> <a href="https://github.com/ngutman"><img src="https://avatars.githubusercontent.com/u/1540134?v=4&s=48" width="48" height="48" alt="ngutman" title="ngutman"/></a> <a href="https://github.com/therealZpoint-bot"><img src="https://avatars.githubusercontent.com/u/258706705?v=4&s=48" width="48" height="48" alt="therealZpoint-bot" title="therealZpoint-bot"/></a> <a href="https://github.com/wangai-studio"><img src="https://avatars.githubusercontent.com/u/256938352?v=4&s=48" width="48" height="48" alt="wangai-studio" title="wangai-studio"/></a> <a href="https://github.com/ysqander"><img src="https://avatars.githubusercontent.com/u/80843820?v=4&s=48" width="48" height="48" alt="ysqander" title="ysqander"/></a> <a href="https://github.com/search?q=Yurii%20Chukhlib"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Yurii Chukhlib" title="Yurii Chukhlib"/></a> <a href="https://github.com/aj47"><img src="https://avatars.githubusercontent.com/u/8023513?v=4&s=48" width="48" height="48" alt="aj47" title="aj47"/></a> <a href="https://github.com/kennyklee"><img src="https://avatars.githubusercontent.com/u/1432489?v=4&s=48" width="48" height="48" alt="kennyklee" title="kennyklee"/></a>
|
||||||
<a href="https://github.com/search?q=Ghost"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ghost" title="Ghost"/></a> <a href="https://github.com/jonasjancarik"><img src="https://avatars.githubusercontent.com/u/2459191?v=4&s=48" width="48" height="48" alt="jonasjancarik" title="jonasjancarik"/></a> <a href="https://github.com/search?q=Keith%20the%20Silly%20Goose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Keith the Silly Goose" title="Keith the Silly Goose"/></a> <a href="https://github.com/search?q=L36%20Server"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="L36 Server" title="L36 Server"/></a> <a href="https://github.com/search?q=Marc"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Marc" title="Marc"/></a> <a href="https://github.com/mitschabaude-bot"><img src="https://avatars.githubusercontent.com/u/247582884?v=4&s=48" width="48" height="48" alt="mitschabaude-bot" title="mitschabaude-bot"/></a> <a href="https://github.com/mkbehr"><img src="https://avatars.githubusercontent.com/u/1285?v=4&s=48" width="48" height="48" alt="mkbehr" title="mkbehr"/></a> <a href="https://github.com/neist"><img src="https://avatars.githubusercontent.com/u/1029724?v=4&s=48" width="48" height="48" alt="neist" title="neist"/></a> <a href="https://github.com/sibbl"><img src="https://avatars.githubusercontent.com/u/866535?v=4&s=48" width="48" height="48" alt="sibbl" title="sibbl"/></a> <a href="https://github.com/abhijeet117"><img src="https://avatars.githubusercontent.com/u/192859219?v=4&s=48" width="48" height="48" alt="abhijeet117" title="abhijeet117"/></a>
|
<a href="https://github.com/superman32432432"><img src="https://avatars.githubusercontent.com/u/7228420?v=4&s=48" width="48" height="48" alt="superman32432432" title="superman32432432"/></a> <a href="https://github.com/Hisleren"><img src="https://avatars.githubusercontent.com/u/83217244?v=4&s=48" width="48" height="48" alt="Hisleren" title="Hisleren"/></a> <a href="https://github.com/shatner"><img src="https://avatars.githubusercontent.com/u/17735435?v=4&s=48" width="48" height="48" alt="shatner" title="shatner"/></a> <a href="https://github.com/antons"><img src="https://avatars.githubusercontent.com/u/129705?v=4&s=48" width="48" height="48" alt="antons" title="antons"/></a> <a href="https://github.com/austinm911"><img src="https://avatars.githubusercontent.com/u/31991302?v=4&s=48" width="48" height="48" alt="austinm911" title="austinm911"/></a> <a href="https://github.com/apps/blacksmith-sh"><img src="https://avatars.githubusercontent.com/in/807020?v=4&s=48" width="48" height="48" alt="blacksmith-sh[bot]" title="blacksmith-sh[bot]"/></a> <a href="https://github.com/damoahdominic"><img src="https://avatars.githubusercontent.com/u/4623434?v=4&s=48" width="48" height="48" alt="damoahdominic" title="damoahdominic"/></a> <a href="https://github.com/dan-dr"><img src="https://avatars.githubusercontent.com/u/6669808?v=4&s=48" width="48" height="48" alt="dan-dr" title="dan-dr"/></a> <a href="https://github.com/GHesericsu"><img src="https://avatars.githubusercontent.com/u/60202455?v=4&s=48" width="48" height="48" alt="GHesericsu" title="GHesericsu"/></a> <a href="https://github.com/HeimdallStrategy"><img src="https://avatars.githubusercontent.com/u/223014405?v=4&s=48" width="48" height="48" alt="HeimdallStrategy" title="HeimdallStrategy"/></a>
|
||||||
<a href="https://github.com/chrisrodz"><img src="https://avatars.githubusercontent.com/u/2967620?v=4&s=48" width="48" height="48" alt="chrisrodz" title="chrisrodz"/></a> <a href="https://github.com/search?q=Friederike%20Seiler"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Friederike Seiler" title="Friederike Seiler"/></a> <a href="https://github.com/gabriel-trigo"><img src="https://avatars.githubusercontent.com/u/38991125?v=4&s=48" width="48" height="48" alt="gabriel-trigo" title="gabriel-trigo"/></a> <a href="https://github.com/Iamadig"><img src="https://avatars.githubusercontent.com/u/102129234?v=4&s=48" width="48" height="48" alt="iamadig" title="iamadig"/></a> <a href="https://github.com/itsjling"><img src="https://avatars.githubusercontent.com/u/2521993?v=4&s=48" width="48" height="48" alt="itsjling" title="itsjling"/></a> <a href="https://github.com/jdrhyne"><img src="https://avatars.githubusercontent.com/u/7828464?v=4&s=48" width="48" height="48" alt="Jonathan D. Rhyne (DJ-D)" title="Jonathan D. Rhyne (DJ-D)"/></a> <a href="https://github.com/search?q=Joshua%20Mitchell"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Joshua Mitchell" title="Joshua Mitchell"/></a> <a href="https://github.com/search?q=Kit"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kit" title="Kit"/></a> <a href="https://github.com/koala73"><img src="https://avatars.githubusercontent.com/u/996596?v=4&s=48" width="48" height="48" alt="koala73" title="koala73"/></a> <a href="https://github.com/manmal"><img src="https://avatars.githubusercontent.com/u/142797?v=4&s=48" width="48" height="48" alt="manmal" title="manmal"/></a>
|
<a href="https://github.com/imfing"><img src="https://avatars.githubusercontent.com/u/5097752?v=4&s=48" width="48" height="48" alt="imfing" title="imfing"/></a> <a href="https://github.com/jalehman"><img src="https://avatars.githubusercontent.com/u/550978?v=4&s=48" width="48" height="48" alt="jalehman" title="jalehman"/></a> <a href="https://github.com/jarvis-medmatic"><img src="https://avatars.githubusercontent.com/u/252428873?v=4&s=48" width="48" height="48" alt="jarvis-medmatic" title="jarvis-medmatic"/></a> <a href="https://github.com/kkarimi"><img src="https://avatars.githubusercontent.com/u/875218?v=4&s=48" width="48" height="48" alt="kkarimi" title="kkarimi"/></a> <a href="https://github.com/Lukavyi"><img src="https://avatars.githubusercontent.com/u/1013690?v=4&s=48" width="48" height="48" alt="Lukavyi" title="Lukavyi"/></a> <a href="https://github.com/mahmoudashraf93"><img src="https://avatars.githubusercontent.com/u/9130129?v=4&s=48" width="48" height="48" alt="mahmoudashraf93" title="mahmoudashraf93"/></a> <a href="https://github.com/pkrmf"><img src="https://avatars.githubusercontent.com/u/1714267?v=4&s=48" width="48" height="48" alt="pkrmf" title="pkrmf"/></a> <a href="https://github.com/RandyVentures"><img src="https://avatars.githubusercontent.com/u/149904821?v=4&s=48" width="48" height="48" alt="RandyVentures" title="RandyVentures"/></a> <a href="https://github.com/robhparker"><img src="https://avatars.githubusercontent.com/u/7404740?v=4&s=48" width="48" height="48" alt="robhparker" title="robhparker"/></a> <a href="https://github.com/search?q=Ryan%20Lisse"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ryan Lisse" title="Ryan Lisse"/></a>
|
||||||
<a href="https://github.com/ogulcancelik"><img src="https://avatars.githubusercontent.com/u/7064011?v=4&s=48" width="48" height="48" alt="ogulcancelik" title="ogulcancelik"/></a> <a href="https://github.com/pasogott"><img src="https://avatars.githubusercontent.com/u/23458152?v=4&s=48" width="48" height="48" alt="pasogott" title="pasogott"/></a> <a href="https://github.com/petradonka"><img src="https://avatars.githubusercontent.com/u/7353770?v=4&s=48" width="48" height="48" alt="petradonka" title="petradonka"/></a> <a href="https://github.com/rubyrunsstuff"><img src="https://avatars.githubusercontent.com/u/246602379?v=4&s=48" width="48" height="48" alt="rubyrunsstuff" title="rubyrunsstuff"/></a> <a href="https://github.com/siddhantjain"><img src="https://avatars.githubusercontent.com/u/4835232?v=4&s=48" width="48" height="48" alt="siddhantjain" title="siddhantjain"/></a> <a href="https://github.com/spiceoogway"><img src="https://avatars.githubusercontent.com/u/105812383?v=4&s=48" width="48" height="48" alt="spiceoogway" title="spiceoogway"/></a> <a href="https://github.com/suminhthanh"><img src="https://avatars.githubusercontent.com/u/2907636?v=4&s=48" width="48" height="48" alt="suminhthanh" title="suminhthanh"/></a> <a href="https://github.com/svkozak"><img src="https://avatars.githubusercontent.com/u/31941359?v=4&s=48" width="48" height="48" alt="svkozak" title="svkozak"/></a> <a href="https://github.com/wes-davis"><img src="https://avatars.githubusercontent.com/u/16506720?v=4&s=48" width="48" height="48" alt="wes-davis" title="wes-davis"/></a> <a href="https://github.com/zats"><img src="https://avatars.githubusercontent.com/u/2688806?v=4&s=48" width="48" height="48" alt="zats" title="zats"/></a>
|
<a href="https://github.com/Yeom-JinHo"><img src="https://avatars.githubusercontent.com/u/81306489?v=4&s=48" width="48" height="48" alt="Yeom-JinHo" title="Yeom-JinHo"/></a> <a href="https://github.com/doodlewind"><img src="https://avatars.githubusercontent.com/u/7312949?v=4&s=48" width="48" height="48" alt="doodlewind" title="doodlewind"/></a> <a href="https://github.com/dougvk"><img src="https://avatars.githubusercontent.com/u/401660?v=4&s=48" width="48" height="48" alt="dougvk" title="dougvk"/></a> <a href="https://github.com/erikpr1994"><img src="https://avatars.githubusercontent.com/u/6299331?v=4&s=48" width="48" height="48" alt="erikpr1994" title="erikpr1994"/></a> <a href="https://github.com/fal3"><img src="https://avatars.githubusercontent.com/u/6484295?v=4&s=48" width="48" height="48" alt="fal3" title="fal3"/></a> <a href="https://github.com/search?q=Ghost"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ghost" title="Ghost"/></a> <a href="https://github.com/hyf0-agent"><img src="https://avatars.githubusercontent.com/u/258783736?v=4&s=48" width="48" height="48" alt="hyf0-agent" title="hyf0-agent"/></a> <a href="https://github.com/jonasjancarik"><img src="https://avatars.githubusercontent.com/u/2459191?v=4&s=48" width="48" height="48" alt="jonasjancarik" title="jonasjancarik"/></a> <a href="https://github.com/search?q=Keith%20the%20Silly%20Goose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Keith the Silly Goose" title="Keith the Silly Goose"/></a> <a href="https://github.com/search?q=L36%20Server"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="L36 Server" title="L36 Server"/></a>
|
||||||
<a href="https://github.com/24601"><img src="https://avatars.githubusercontent.com/u/1157207?v=4&s=48" width="48" height="48" alt="24601" title="24601"/></a> <a href="https://github.com/ameno-"><img src="https://avatars.githubusercontent.com/u/2416135?v=4&s=48" width="48" height="48" alt="ameno-" title="ameno-"/></a> <a href="https://github.com/bonald"><img src="https://avatars.githubusercontent.com/u/12394874?v=4&s=48" width="48" height="48" alt="bonald" title="bonald"/></a> <a href="https://github.com/bravostation"><img src="https://avatars.githubusercontent.com/u/257991910?v=4&s=48" width="48" height="48" alt="bravostation" title="bravostation"/></a> <a href="https://github.com/search?q=Chris%20Taylor"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Chris Taylor" title="Chris Taylor"/></a> <a href="https://github.com/dguido"><img src="https://avatars.githubusercontent.com/u/294844?v=4&s=48" width="48" height="48" alt="dguido" title="dguido"/></a> <a href="https://github.com/djangonavarro220"><img src="https://avatars.githubusercontent.com/u/251162586?v=4&s=48" width="48" height="48" alt="Django Navarro" title="Django Navarro"/></a> <a href="https://github.com/evalexpr"><img src="https://avatars.githubusercontent.com/u/23485511?v=4&s=48" width="48" height="48" alt="evalexpr" title="evalexpr"/></a> <a href="https://github.com/henrino3"><img src="https://avatars.githubusercontent.com/u/4260288?v=4&s=48" width="48" height="48" alt="henrino3" title="henrino3"/></a> <a href="https://github.com/humanwritten"><img src="https://avatars.githubusercontent.com/u/206531610?v=4&s=48" width="48" height="48" alt="humanwritten" title="humanwritten"/></a>
|
<a href="https://github.com/search?q=Marc"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Marc" title="Marc"/></a> <a href="https://github.com/mitschabaude-bot"><img src="https://avatars.githubusercontent.com/u/247582884?v=4&s=48" width="48" height="48" alt="mitschabaude-bot" title="mitschabaude-bot"/></a> <a href="https://github.com/mkbehr"><img src="https://avatars.githubusercontent.com/u/1285?v=4&s=48" width="48" height="48" alt="mkbehr" title="mkbehr"/></a> <a href="https://github.com/neist"><img src="https://avatars.githubusercontent.com/u/1029724?v=4&s=48" width="48" height="48" alt="neist" title="neist"/></a> <a href="https://github.com/sibbl"><img src="https://avatars.githubusercontent.com/u/866535?v=4&s=48" width="48" height="48" alt="sibbl" title="sibbl"/></a> <a href="https://github.com/zats"><img src="https://avatars.githubusercontent.com/u/2688806?v=4&s=48" width="48" height="48" alt="zats" title="zats"/></a> <a href="https://github.com/abhijeet117"><img src="https://avatars.githubusercontent.com/u/192859219?v=4&s=48" width="48" height="48" alt="abhijeet117" title="abhijeet117"/></a> <a href="https://github.com/chrisrodz"><img src="https://avatars.githubusercontent.com/u/2967620?v=4&s=48" width="48" height="48" alt="chrisrodz" title="chrisrodz"/></a> <a href="https://github.com/search?q=Friederike%20Seiler"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Friederike Seiler" title="Friederike Seiler"/></a> <a href="https://github.com/gabriel-trigo"><img src="https://avatars.githubusercontent.com/u/38991125?v=4&s=48" width="48" height="48" alt="gabriel-trigo" title="gabriel-trigo"/></a>
|
||||||
<a href="https://github.com/larlyssa"><img src="https://avatars.githubusercontent.com/u/13128869?v=4&s=48" width="48" height="48" alt="larlyssa" title="larlyssa"/></a> <a href="https://github.com/Lukavyi"><img src="https://avatars.githubusercontent.com/u/1013690?v=4&s=48" width="48" height="48" alt="Lukavyi" title="Lukavyi"/></a> <a href="https://github.com/mitsuhiko"><img src="https://avatars.githubusercontent.com/u/7396?v=4&s=48" width="48" height="48" alt="mitsuhiko" title="mitsuhiko"/></a> <a href="https://github.com/odysseus0"><img src="https://avatars.githubusercontent.com/u/8635094?v=4&s=48" width="48" height="48" alt="odysseus0" title="odysseus0"/></a> <a href="https://github.com/oswalpalash"><img src="https://avatars.githubusercontent.com/u/6431196?v=4&s=48" width="48" height="48" alt="oswalpalash" title="oswalpalash"/></a> <a href="https://github.com/pcty-nextgen-service-account"><img src="https://avatars.githubusercontent.com/u/112553441?v=4&s=48" width="48" height="48" alt="pcty-nextgen-service-account" title="pcty-nextgen-service-account"/></a> <a href="https://github.com/pi0"><img src="https://avatars.githubusercontent.com/u/5158436?v=4&s=48" width="48" height="48" alt="pi0" title="pi0"/></a> <a href="https://github.com/rmorse"><img src="https://avatars.githubusercontent.com/u/853547?v=4&s=48" width="48" height="48" alt="rmorse" title="rmorse"/></a> <a href="https://github.com/search?q=Roopak%20Nijhara"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Roopak Nijhara" title="Roopak Nijhara"/></a> <a href="https://github.com/Syhids"><img src="https://avatars.githubusercontent.com/u/671202?v=4&s=48" width="48" height="48" alt="Syhids" title="Syhids"/></a>
|
<a href="https://github.com/Iamadig"><img src="https://avatars.githubusercontent.com/u/102129234?v=4&s=48" width="48" height="48" alt="iamadig" title="iamadig"/></a> <a href="https://github.com/itsjling"><img src="https://avatars.githubusercontent.com/u/2521993?v=4&s=48" width="48" height="48" alt="itsjling" title="itsjling"/></a> <a href="https://github.com/jdrhyne"><img src="https://avatars.githubusercontent.com/u/7828464?v=4&s=48" width="48" height="48" alt="Jonathan D. Rhyne (DJ-D)" title="Jonathan D. Rhyne (DJ-D)"/></a> <a href="https://github.com/search?q=Joshua%20Mitchell"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Joshua Mitchell" title="Joshua Mitchell"/></a> <a href="https://github.com/kelvinCB"><img src="https://avatars.githubusercontent.com/u/50544379?v=4&s=48" width="48" height="48" alt="kelvinCB" title="kelvinCB"/></a> <a href="https://github.com/search?q=Kit"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kit" title="Kit"/></a> <a href="https://github.com/koala73"><img src="https://avatars.githubusercontent.com/u/996596?v=4&s=48" width="48" height="48" alt="koala73" title="koala73"/></a> <a href="https://github.com/manmal"><img src="https://avatars.githubusercontent.com/u/142797?v=4&s=48" width="48" height="48" alt="manmal" title="manmal"/></a> <a href="https://github.com/mattqdev"><img src="https://avatars.githubusercontent.com/u/115874885?v=4&s=48" width="48" height="48" alt="mattqdev" title="mattqdev"/></a> <a href="https://github.com/mitsuhiko"><img src="https://avatars.githubusercontent.com/u/7396?v=4&s=48" width="48" height="48" alt="mitsuhiko" title="mitsuhiko"/></a>
|
||||||
<a href="https://github.com/search?q=Ubuntu"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ubuntu" title="Ubuntu"/></a> <a href="https://github.com/search?q=xiaose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="xiaose" title="xiaose"/></a> <a href="https://github.com/search?q=Aaron%20Konyer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Aaron Konyer" title="Aaron Konyer"/></a> <a href="https://github.com/aaronveklabs"><img src="https://avatars.githubusercontent.com/u/225997828?v=4&s=48" width="48" height="48" alt="aaronveklabs" title="aaronveklabs"/></a> <a href="https://github.com/andreabadesso"><img src="https://avatars.githubusercontent.com/u/3586068?v=4&s=48" width="48" height="48" alt="andreabadesso" title="andreabadesso"/></a> <a href="https://github.com/search?q=Andrii"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Andrii" title="Andrii"/></a> <a href="https://github.com/cash-echo-bot"><img src="https://avatars.githubusercontent.com/u/252747386?v=4&s=48" width="48" height="48" alt="cash-echo-bot" title="cash-echo-bot"/></a> <a href="https://github.com/search?q=Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawd" title="Clawd"/></a> <a href="https://github.com/search?q=ClawdFx"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ClawdFx" title="ClawdFx"/></a> <a href="https://github.com/danballance"><img src="https://avatars.githubusercontent.com/u/13839912?v=4&s=48" width="48" height="48" alt="danballance" title="danballance"/></a>
|
<a href="https://github.com/ogulcancelik"><img src="https://avatars.githubusercontent.com/u/7064011?v=4&s=48" width="48" height="48" alt="ogulcancelik" title="ogulcancelik"/></a> <a href="https://github.com/pasogott"><img src="https://avatars.githubusercontent.com/u/23458152?v=4&s=48" width="48" height="48" alt="pasogott" title="pasogott"/></a> <a href="https://github.com/petradonka"><img src="https://avatars.githubusercontent.com/u/7353770?v=4&s=48" width="48" height="48" alt="petradonka" title="petradonka"/></a> <a href="https://github.com/rubyrunsstuff"><img src="https://avatars.githubusercontent.com/u/246602379?v=4&s=48" width="48" height="48" alt="rubyrunsstuff" title="rubyrunsstuff"/></a> <a href="https://github.com/siddhantjain"><img src="https://avatars.githubusercontent.com/u/4835232?v=4&s=48" width="48" height="48" alt="siddhantjain" title="siddhantjain"/></a> <a href="https://github.com/spiceoogway"><img src="https://avatars.githubusercontent.com/u/105812383?v=4&s=48" width="48" height="48" alt="spiceoogway" title="spiceoogway"/></a> <a href="https://github.com/suminhthanh"><img src="https://avatars.githubusercontent.com/u/2907636?v=4&s=48" width="48" height="48" alt="suminhthanh" title="suminhthanh"/></a> <a href="https://github.com/svkozak"><img src="https://avatars.githubusercontent.com/u/31941359?v=4&s=48" width="48" height="48" alt="svkozak" title="svkozak"/></a> <a href="https://github.com/wes-davis"><img src="https://avatars.githubusercontent.com/u/16506720?v=4&s=48" width="48" height="48" alt="wes-davis" title="wes-davis"/></a> <a href="https://github.com/24601"><img src="https://avatars.githubusercontent.com/u/1157207?v=4&s=48" width="48" height="48" alt="24601" title="24601"/></a>
|
||||||
<a href="https://github.com/EnzeD"><img src="https://avatars.githubusercontent.com/u/9866900?v=4&s=48" width="48" height="48" alt="EnzeD" title="EnzeD"/></a> <a href="https://github.com/erik-agens"><img src="https://avatars.githubusercontent.com/u/80908960?v=4&s=48" width="48" height="48" alt="erik-agens" title="erik-agens"/></a> <a href="https://github.com/Evizero"><img src="https://avatars.githubusercontent.com/u/10854026?v=4&s=48" width="48" height="48" alt="Evizero" title="Evizero"/></a> <a href="https://github.com/fcatuhe"><img src="https://avatars.githubusercontent.com/u/17382215?v=4&s=48" width="48" height="48" alt="fcatuhe" title="fcatuhe"/></a> <a href="https://github.com/itsjaydesu"><img src="https://avatars.githubusercontent.com/u/220390?v=4&s=48" width="48" height="48" alt="itsjaydesu" title="itsjaydesu"/></a> <a href="https://github.com/ivancasco"><img src="https://avatars.githubusercontent.com/u/2452858?v=4&s=48" width="48" height="48" alt="ivancasco" title="ivancasco"/></a> <a href="https://github.com/ivanrvpereira"><img src="https://avatars.githubusercontent.com/u/183991?v=4&s=48" width="48" height="48" alt="ivanrvpereira" title="ivanrvpereira"/></a> <a href="https://github.com/search?q=Jarvis"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis" title="Jarvis"/></a> <a href="https://github.com/jayhickey"><img src="https://avatars.githubusercontent.com/u/1676460?v=4&s=48" width="48" height="48" alt="jayhickey" title="jayhickey"/></a> <a href="https://github.com/jeffersonwarrior"><img src="https://avatars.githubusercontent.com/u/89030989?v=4&s=48" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a>
|
<a href="https://github.com/ameno-"><img src="https://avatars.githubusercontent.com/u/2416135?v=4&s=48" width="48" height="48" alt="ameno-" title="ameno-"/></a> <a href="https://github.com/bonald"><img src="https://avatars.githubusercontent.com/u/12394874?v=4&s=48" width="48" height="48" alt="bonald" title="bonald"/></a> <a href="https://github.com/bravostation"><img src="https://avatars.githubusercontent.com/u/257991910?v=4&s=48" width="48" height="48" alt="bravostation" title="bravostation"/></a> <a href="https://github.com/search?q=Chris%20Taylor"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Chris Taylor" title="Chris Taylor"/></a> <a href="https://github.com/dguido"><img src="https://avatars.githubusercontent.com/u/294844?v=4&s=48" width="48" height="48" alt="dguido" title="dguido"/></a> <a href="https://github.com/djangonavarro220"><img src="https://avatars.githubusercontent.com/u/251162586?v=4&s=48" width="48" height="48" alt="Django Navarro" title="Django Navarro"/></a> <a href="https://github.com/evalexpr"><img src="https://avatars.githubusercontent.com/u/23485511?v=4&s=48" width="48" height="48" alt="evalexpr" title="evalexpr"/></a> <a href="https://github.com/henrino3"><img src="https://avatars.githubusercontent.com/u/4260288?v=4&s=48" width="48" height="48" alt="henrino3" title="henrino3"/></a> <a href="https://github.com/humanwritten"><img src="https://avatars.githubusercontent.com/u/206531610?v=4&s=48" width="48" height="48" alt="humanwritten" title="humanwritten"/></a> <a href="https://github.com/j2h4u"><img src="https://avatars.githubusercontent.com/u/39818683?v=4&s=48" width="48" height="48" alt="j2h4u" title="j2h4u"/></a>
|
||||||
<a href="https://github.com/search?q=jeffersonwarrior"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a> <a href="https://github.com/jverdi"><img src="https://avatars.githubusercontent.com/u/345050?v=4&s=48" width="48" height="48" alt="jverdi" title="jverdi"/></a> <a href="https://github.com/longmaba"><img src="https://avatars.githubusercontent.com/u/9361500?v=4&s=48" width="48" height="48" alt="longmaba" title="longmaba"/></a> <a href="https://github.com/MarvinCui"><img src="https://avatars.githubusercontent.com/u/130876763?v=4&s=48" width="48" height="48" alt="MarvinCui" title="MarvinCui"/></a> <a href="https://github.com/mjrussell"><img src="https://avatars.githubusercontent.com/u/1641895?v=4&s=48" width="48" height="48" alt="mjrussell" title="mjrussell"/></a> <a href="https://github.com/odnxe"><img src="https://avatars.githubusercontent.com/u/403141?v=4&s=48" width="48" height="48" alt="odnxe" title="odnxe"/></a> <a href="https://github.com/optimikelabs"><img src="https://avatars.githubusercontent.com/u/31423109?v=4&s=48" width="48" height="48" alt="optimikelabs" title="optimikelabs"/></a> <a href="https://github.com/p6l-richard"><img src="https://avatars.githubusercontent.com/u/18185649?v=4&s=48" width="48" height="48" alt="p6l-richard" title="p6l-richard"/></a> <a href="https://github.com/philipp-spiess"><img src="https://avatars.githubusercontent.com/u/458591?v=4&s=48" width="48" height="48" alt="philipp-spiess" title="philipp-spiess"/></a> <a href="https://github.com/search?q=Pocket%20Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Pocket Clawd" title="Pocket Clawd"/></a>
|
<a href="https://github.com/larlyssa"><img src="https://avatars.githubusercontent.com/u/13128869?v=4&s=48" width="48" height="48" alt="larlyssa" title="larlyssa"/></a> <a href="https://github.com/odysseus0"><img src="https://avatars.githubusercontent.com/u/8635094?v=4&s=48" width="48" height="48" alt="odysseus0" title="odysseus0"/></a> <a href="https://github.com/oswalpalash"><img src="https://avatars.githubusercontent.com/u/6431196?v=4&s=48" width="48" height="48" alt="oswalpalash" title="oswalpalash"/></a> <a href="https://github.com/pcty-nextgen-service-account"><img src="https://avatars.githubusercontent.com/u/112553441?v=4&s=48" width="48" height="48" alt="pcty-nextgen-service-account" title="pcty-nextgen-service-account"/></a> <a href="https://github.com/pi0"><img src="https://avatars.githubusercontent.com/u/5158436?v=4&s=48" width="48" height="48" alt="pi0" title="pi0"/></a> <a href="https://github.com/rmorse"><img src="https://avatars.githubusercontent.com/u/853547?v=4&s=48" width="48" height="48" alt="rmorse" title="rmorse"/></a> <a href="https://github.com/search?q=Roopak%20Nijhara"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Roopak Nijhara" title="Roopak Nijhara"/></a> <a href="https://github.com/Syhids"><img src="https://avatars.githubusercontent.com/u/671202?v=4&s=48" width="48" height="48" alt="Syhids" title="Syhids"/></a> <a href="https://github.com/search?q=Ubuntu"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ubuntu" title="Ubuntu"/></a> <a href="https://github.com/search?q=xiaose"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="xiaose" title="xiaose"/></a>
|
||||||
<a href="https://github.com/robaxelsen"><img src="https://avatars.githubusercontent.com/u/13132899?v=4&s=48" width="48" height="48" alt="robaxelsen" title="robaxelsen"/></a> <a href="https://github.com/search?q=Sash%20Catanzarite"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Sash Catanzarite" title="Sash Catanzarite"/></a> <a href="https://github.com/Suksham-sharma"><img src="https://avatars.githubusercontent.com/u/94667656?v=4&s=48" width="48" height="48" alt="Suksham-sharma" title="Suksham-sharma"/></a> <a href="https://github.com/T5-AndyML"><img src="https://avatars.githubusercontent.com/u/22801233?v=4&s=48" width="48" height="48" alt="T5-AndyML" title="T5-AndyML"/></a> <a href="https://github.com/tewatia"><img src="https://avatars.githubusercontent.com/u/22875334?v=4&s=48" width="48" height="48" alt="tewatia" title="tewatia"/></a> <a href="https://github.com/thejhinvirtuoso"><img src="https://avatars.githubusercontent.com/u/258521837?v=4&s=48" width="48" height="48" alt="thejhinvirtuoso" title="thejhinvirtuoso"/></a> <a href="https://github.com/travisp"><img src="https://avatars.githubusercontent.com/u/165698?v=4&s=48" width="48" height="48" alt="travisp" title="travisp"/></a> <a href="https://github.com/search?q=VAC"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="VAC" title="VAC"/></a> <a href="https://github.com/search?q=william%20arzt"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="william arzt" title="william arzt"/></a> <a href="https://github.com/zknicker"><img src="https://avatars.githubusercontent.com/u/1164085?v=4&s=48" width="48" height="48" alt="zknicker" title="zknicker"/></a>
|
<a href="https://github.com/search?q=Aaron%20Konyer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Aaron Konyer" title="Aaron Konyer"/></a> <a href="https://github.com/aaronveklabs"><img src="https://avatars.githubusercontent.com/u/225997828?v=4&s=48" width="48" height="48" alt="aaronveklabs" title="aaronveklabs"/></a> <a href="https://github.com/aldoeliacim"><img src="https://avatars.githubusercontent.com/u/17973757?v=4&s=48" width="48" height="48" alt="aldoeliacim" title="aldoeliacim"/></a> <a href="https://github.com/andreabadesso"><img src="https://avatars.githubusercontent.com/u/3586068?v=4&s=48" width="48" height="48" alt="andreabadesso" title="andreabadesso"/></a> <a href="https://github.com/search?q=Andrii"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Andrii" title="Andrii"/></a> <a href="https://github.com/BinaryMuse"><img src="https://avatars.githubusercontent.com/u/189606?v=4&s=48" width="48" height="48" alt="BinaryMuse" title="BinaryMuse"/></a> <a href="https://github.com/bqcfjwhz85-arch"><img src="https://avatars.githubusercontent.com/u/239267175?v=4&s=48" width="48" height="48" alt="bqcfjwhz85-arch" title="bqcfjwhz85-arch"/></a> <a href="https://github.com/cash-echo-bot"><img src="https://avatars.githubusercontent.com/u/252747386?v=4&s=48" width="48" height="48" alt="cash-echo-bot" title="cash-echo-bot"/></a> <a href="https://github.com/search?q=Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawd" title="Clawd"/></a> <a href="https://github.com/search?q=ClawdFx"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ClawdFx" title="ClawdFx"/></a>
|
||||||
<a href="https://github.com/0oAstro"><img src="https://avatars.githubusercontent.com/u/79555780?v=4&s=48" width="48" height="48" alt="0oAstro" title="0oAstro"/></a> <a href="https://github.com/abhaymundhara"><img src="https://avatars.githubusercontent.com/u/62872231?v=4&s=48" width="48" height="48" alt="abhaymundhara" title="abhaymundhara"/></a> <a href="https://github.com/aduk059"><img src="https://avatars.githubusercontent.com/u/257603478?v=4&s=48" width="48" height="48" alt="aduk059" title="aduk059"/></a> <a href="https://github.com/aldoeliacim"><img src="https://avatars.githubusercontent.com/u/17973757?v=4&s=48" width="48" height="48" alt="aldoeliacim" title="aldoeliacim"/></a> <a href="https://github.com/search?q=alejandro%20maza"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="alejandro maza" title="alejandro maza"/></a> <a href="https://github.com/Alex-Alaniz"><img src="https://avatars.githubusercontent.com/u/88956822?v=4&s=48" width="48" height="48" alt="Alex-Alaniz" title="Alex-Alaniz"/></a> <a href="https://github.com/alexanderatallah"><img src="https://avatars.githubusercontent.com/u/1011391?v=4&s=48" width="48" height="48" alt="alexanderatallah" title="alexanderatallah"/></a> <a href="https://github.com/alexstyl"><img src="https://avatars.githubusercontent.com/u/1665273?v=4&s=48" width="48" height="48" alt="alexstyl" title="alexstyl"/></a> <a href="https://github.com/andrewting19"><img src="https://avatars.githubusercontent.com/u/10536704?v=4&s=48" width="48" height="48" alt="andrewting19" title="andrewting19"/></a> <a href="https://github.com/anpoirier"><img src="https://avatars.githubusercontent.com/u/1245729?v=4&s=48" width="48" height="48" alt="anpoirier" title="anpoirier"/></a>
|
<a href="https://github.com/search?q=damaozi"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="damaozi" title="damaozi"/></a> <a href="https://github.com/danballance"><img src="https://avatars.githubusercontent.com/u/13839912?v=4&s=48" width="48" height="48" alt="danballance" title="danballance"/></a> <a href="https://github.com/Elarwei001"><img src="https://avatars.githubusercontent.com/u/168552401?v=4&s=48" width="48" height="48" alt="Elarwei001" title="Elarwei001"/></a> <a href="https://github.com/EnzeD"><img src="https://avatars.githubusercontent.com/u/9866900?v=4&s=48" width="48" height="48" alt="EnzeD" title="EnzeD"/></a> <a href="https://github.com/erik-agens"><img src="https://avatars.githubusercontent.com/u/80908960?v=4&s=48" width="48" height="48" alt="erik-agens" title="erik-agens"/></a> <a href="https://github.com/Evizero"><img src="https://avatars.githubusercontent.com/u/10854026?v=4&s=48" width="48" height="48" alt="Evizero" title="Evizero"/></a> <a href="https://github.com/fcatuhe"><img src="https://avatars.githubusercontent.com/u/17382215?v=4&s=48" width="48" height="48" alt="fcatuhe" title="fcatuhe"/></a> <a href="https://github.com/gildo"><img src="https://avatars.githubusercontent.com/u/133645?v=4&s=48" width="48" height="48" alt="gildo" title="gildo"/></a> <a href="https://github.com/hclsys"><img src="https://avatars.githubusercontent.com/u/7755017?v=4&s=48" width="48" height="48" alt="hclsys" title="hclsys"/></a> <a href="https://github.com/itsjaydesu"><img src="https://avatars.githubusercontent.com/u/220390?v=4&s=48" width="48" height="48" alt="itsjaydesu" title="itsjaydesu"/></a>
|
||||||
<a href="https://github.com/araa47"><img src="https://avatars.githubusercontent.com/u/22760261?v=4&s=48" width="48" height="48" alt="araa47" title="araa47"/></a> <a href="https://github.com/arthyn"><img src="https://avatars.githubusercontent.com/u/5466421?v=4&s=48" width="48" height="48" alt="arthyn" title="arthyn"/></a> <a href="https://github.com/Asleep123"><img src="https://avatars.githubusercontent.com/u/122379135?v=4&s=48" width="48" height="48" alt="Asleep123" title="Asleep123"/></a> <a href="https://github.com/search?q=Ayush%20Ojha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ayush Ojha" title="Ayush Ojha"/></a> <a href="https://github.com/Ayush10"><img src="https://avatars.githubusercontent.com/u/7945279?v=4&s=48" width="48" height="48" alt="Ayush10" title="Ayush10"/></a> <a href="https://github.com/bguidolim"><img src="https://avatars.githubusercontent.com/u/987360?v=4&s=48" width="48" height="48" alt="bguidolim" title="bguidolim"/></a> <a href="https://github.com/bolismauro"><img src="https://avatars.githubusercontent.com/u/771999?v=4&s=48" width="48" height="48" alt="bolismauro" title="bolismauro"/></a> <a href="https://github.com/championswimmer"><img src="https://avatars.githubusercontent.com/u/1327050?v=4&s=48" width="48" height="48" alt="championswimmer" title="championswimmer"/></a> <a href="https://github.com/chenyuan99"><img src="https://avatars.githubusercontent.com/u/25518100?v=4&s=48" width="48" height="48" alt="chenyuan99" title="chenyuan99"/></a> <a href="https://github.com/Chloe-VP"><img src="https://avatars.githubusercontent.com/u/257371598?v=4&s=48" width="48" height="48" alt="Chloe-VP" title="Chloe-VP"/></a>
|
<a href="https://github.com/ivancasco"><img src="https://avatars.githubusercontent.com/u/2452858?v=4&s=48" width="48" height="48" alt="ivancasco" title="ivancasco"/></a> <a href="https://github.com/ivanrvpereira"><img src="https://avatars.githubusercontent.com/u/183991?v=4&s=48" width="48" height="48" alt="ivanrvpereira" title="ivanrvpereira"/></a> <a href="https://github.com/search?q=Jarvis"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis" title="Jarvis"/></a> <a href="https://github.com/jayhickey"><img src="https://avatars.githubusercontent.com/u/1676460?v=4&s=48" width="48" height="48" alt="jayhickey" title="jayhickey"/></a> <a href="https://github.com/jeffersonwarrior"><img src="https://avatars.githubusercontent.com/u/89030989?v=4&s=48" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a> <a href="https://github.com/search?q=jeffersonwarrior"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="jeffersonwarrior" title="jeffersonwarrior"/></a> <a href="https://github.com/jverdi"><img src="https://avatars.githubusercontent.com/u/345050?v=4&s=48" width="48" height="48" alt="jverdi" title="jverdi"/></a> <a href="https://github.com/lailoo"><img src="https://avatars.githubusercontent.com/u/20536249?v=4&s=48" width="48" height="48" alt="lailoo" title="lailoo"/></a> <a href="https://github.com/longmaba"><img src="https://avatars.githubusercontent.com/u/9361500?v=4&s=48" width="48" height="48" alt="longmaba" title="longmaba"/></a> <a href="https://github.com/search?q=Marco%20Marandiz"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Marco Marandiz" title="Marco Marandiz"/></a>
|
||||||
<a href="https://github.com/search?q=Clawdbot%20Maintainers"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawdbot Maintainers" title="Clawdbot Maintainers"/></a> <a href="https://github.com/conhecendoia"><img src="https://avatars.githubusercontent.com/u/82890727?v=4&s=48" width="48" height="48" alt="conhecendoia" title="conhecendoia"/></a> <a href="https://github.com/dasilva333"><img src="https://avatars.githubusercontent.com/u/947827?v=4&s=48" width="48" height="48" alt="dasilva333" title="dasilva333"/></a> <a href="https://github.com/David-Marsh-Photo"><img src="https://avatars.githubusercontent.com/u/228404527?v=4&s=48" width="48" height="48" alt="David-Marsh-Photo" title="David-Marsh-Photo"/></a> <a href="https://github.com/search?q=Developer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Developer" title="Developer"/></a> <a href="https://github.com/search?q=Dimitrios%20Ploutarchos"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Dimitrios Ploutarchos" title="Dimitrios Ploutarchos"/></a> <a href="https://github.com/search?q=Drake%20Thomsen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Drake Thomsen" title="Drake Thomsen"/></a> <a href="https://github.com/dylanneve1"><img src="https://avatars.githubusercontent.com/u/31746704?v=4&s=48" width="48" height="48" alt="dylanneve1" title="dylanneve1"/></a> <a href="https://github.com/search?q=Felix%20Krause"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Felix Krause" title="Felix Krause"/></a> <a href="https://github.com/foeken"><img src="https://avatars.githubusercontent.com/u/13864?v=4&s=48" width="48" height="48" alt="foeken" title="foeken"/></a>
|
<a href="https://github.com/MarvinCui"><img src="https://avatars.githubusercontent.com/u/130876763?v=4&s=48" width="48" height="48" alt="MarvinCui" title="MarvinCui"/></a> <a href="https://github.com/mattezell"><img src="https://avatars.githubusercontent.com/u/361409?v=4&s=48" width="48" height="48" alt="mattezell" title="mattezell"/></a> <a href="https://github.com/mjrussell"><img src="https://avatars.githubusercontent.com/u/1641895?v=4&s=48" width="48" height="48" alt="mjrussell" title="mjrussell"/></a> <a href="https://github.com/odnxe"><img src="https://avatars.githubusercontent.com/u/403141?v=4&s=48" width="48" height="48" alt="odnxe" title="odnxe"/></a> <a href="https://github.com/optimikelabs"><img src="https://avatars.githubusercontent.com/u/31423109?v=4&s=48" width="48" height="48" alt="optimikelabs" title="optimikelabs"/></a> <a href="https://github.com/p6l-richard"><img src="https://avatars.githubusercontent.com/u/18185649?v=4&s=48" width="48" height="48" alt="p6l-richard" title="p6l-richard"/></a> <a href="https://github.com/philipp-spiess"><img src="https://avatars.githubusercontent.com/u/458591?v=4&s=48" width="48" height="48" alt="philipp-spiess" title="philipp-spiess"/></a> <a href="https://github.com/search?q=Pocket%20Clawd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Pocket Clawd" title="Pocket Clawd"/></a> <a href="https://github.com/robaxelsen"><img src="https://avatars.githubusercontent.com/u/13132899?v=4&s=48" width="48" height="48" alt="robaxelsen" title="robaxelsen"/></a> <a href="https://github.com/search?q=Sash%20Catanzarite"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Sash Catanzarite" title="Sash Catanzarite"/></a>
|
||||||
<a href="https://github.com/frankekn"><img src="https://avatars.githubusercontent.com/u/4488090?v=4&s=48" width="48" height="48" alt="frankekn" title="frankekn"/></a> <a href="https://github.com/fredheir"><img src="https://avatars.githubusercontent.com/u/3304869?v=4&s=48" width="48" height="48" alt="fredheir" title="fredheir"/></a> <a href="https://github.com/search?q=ganghyun%20kim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ganghyun kim" title="ganghyun kim"/></a> <a href="https://github.com/grrowl"><img src="https://avatars.githubusercontent.com/u/907140?v=4&s=48" width="48" height="48" alt="grrowl" title="grrowl"/></a> <a href="https://github.com/gtsifrikas"><img src="https://avatars.githubusercontent.com/u/8904378?v=4&s=48" width="48" height="48" alt="gtsifrikas" title="gtsifrikas"/></a> <a href="https://github.com/HassanFleyah"><img src="https://avatars.githubusercontent.com/u/228002017?v=4&s=48" width="48" height="48" alt="HassanFleyah" title="HassanFleyah"/></a> <a href="https://github.com/HazAT"><img src="https://avatars.githubusercontent.com/u/363802?v=4&s=48" width="48" height="48" alt="HazAT" title="HazAT"/></a> <a href="https://github.com/hclsys"><img src="https://avatars.githubusercontent.com/u/7755017?v=4&s=48" width="48" height="48" alt="hclsys" title="hclsys"/></a> <a href="https://github.com/hrdwdmrbl"><img src="https://avatars.githubusercontent.com/u/554881?v=4&s=48" width="48" height="48" alt="hrdwdmrbl" title="hrdwdmrbl"/></a> <a href="https://github.com/hugobarauna"><img src="https://avatars.githubusercontent.com/u/2719?v=4&s=48" width="48" height="48" alt="hugobarauna" title="hugobarauna"/></a>
|
<a href="https://github.com/Suksham-sharma"><img src="https://avatars.githubusercontent.com/u/94667656?v=4&s=48" width="48" height="48" alt="Suksham-sharma" title="Suksham-sharma"/></a> <a href="https://github.com/T5-AndyML"><img src="https://avatars.githubusercontent.com/u/22801233?v=4&s=48" width="48" height="48" alt="T5-AndyML" title="T5-AndyML"/></a> <a href="https://github.com/tewatia"><img src="https://avatars.githubusercontent.com/u/22875334?v=4&s=48" width="48" height="48" alt="tewatia" title="tewatia"/></a> <a href="https://github.com/thejhinvirtuoso"><img src="https://avatars.githubusercontent.com/u/258521837?v=4&s=48" width="48" height="48" alt="thejhinvirtuoso" title="thejhinvirtuoso"/></a> <a href="https://github.com/travisp"><img src="https://avatars.githubusercontent.com/u/165698?v=4&s=48" width="48" height="48" alt="travisp" title="travisp"/></a> <a href="https://github.com/search?q=VAC"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="VAC" title="VAC"/></a> <a href="https://github.com/search?q=william%20arzt"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="william arzt" title="william arzt"/></a> <a href="https://github.com/yudshj"><img src="https://avatars.githubusercontent.com/u/16971372?v=4&s=48" width="48" height="48" alt="yudshj" title="yudshj"/></a> <a href="https://github.com/zknicker"><img src="https://avatars.githubusercontent.com/u/1164085?v=4&s=48" width="48" height="48" alt="zknicker" title="zknicker"/></a> <a href="https://github.com/0oAstro"><img src="https://avatars.githubusercontent.com/u/79555780?v=4&s=48" width="48" height="48" alt="0oAstro" title="0oAstro"/></a>
|
||||||
<a href="https://github.com/iamEvanYT"><img src="https://avatars.githubusercontent.com/u/47493765?v=4&s=48" width="48" height="48" alt="iamEvanYT" title="iamEvanYT"/></a> <a href="https://github.com/search?q=Jamie%20Openshaw"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jamie Openshaw" title="Jamie Openshaw"/></a> <a href="https://github.com/search?q=Jane"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jane" title="Jane"/></a> <a href="https://github.com/search?q=Jarvis%20Deploy"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis Deploy" title="Jarvis Deploy"/></a> <a href="https://github.com/search?q=Jefferson%20Nunn"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jefferson Nunn" title="Jefferson Nunn"/></a> <a href="https://github.com/jogi47"><img src="https://avatars.githubusercontent.com/u/1710139?v=4&s=48" width="48" height="48" alt="jogi47" title="jogi47"/></a> <a href="https://github.com/kentaro"><img src="https://avatars.githubusercontent.com/u/3458?v=4&s=48" width="48" height="48" alt="kentaro" title="kentaro"/></a> <a href="https://github.com/search?q=Kevin%20Lin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kevin Lin" title="Kevin Lin"/></a> <a href="https://github.com/kira-ariaki"><img src="https://avatars.githubusercontent.com/u/257352493?v=4&s=48" width="48" height="48" alt="kira-ariaki" title="kira-ariaki"/></a> <a href="https://github.com/kitze"><img src="https://avatars.githubusercontent.com/u/1160594?v=4&s=48" width="48" height="48" alt="kitze" title="kitze"/></a>
|
<a href="https://github.com/abhaymundhara"><img src="https://avatars.githubusercontent.com/u/62872231?v=4&s=48" width="48" height="48" alt="abhaymundhara" title="abhaymundhara"/></a> <a href="https://github.com/aduk059"><img src="https://avatars.githubusercontent.com/u/257603478?v=4&s=48" width="48" height="48" alt="aduk059" title="aduk059"/></a> <a href="https://github.com/aisling404"><img src="https://avatars.githubusercontent.com/u/211950534?v=4&s=48" width="48" height="48" alt="aisling404" title="aisling404"/></a> <a href="https://github.com/akramcodez"><img src="https://avatars.githubusercontent.com/u/179671552?v=4&s=48" width="48" height="48" alt="akramcodez" title="akramcodez"/></a> <a href="https://github.com/search?q=alejandro%20maza"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="alejandro maza" title="alejandro maza"/></a> <a href="https://github.com/Alex-Alaniz"><img src="https://avatars.githubusercontent.com/u/88956822?v=4&s=48" width="48" height="48" alt="Alex-Alaniz" title="Alex-Alaniz"/></a> <a href="https://github.com/alexanderatallah"><img src="https://avatars.githubusercontent.com/u/1011391?v=4&s=48" width="48" height="48" alt="alexanderatallah" title="alexanderatallah"/></a> <a href="https://github.com/alexstyl"><img src="https://avatars.githubusercontent.com/u/1665273?v=4&s=48" width="48" height="48" alt="alexstyl" title="alexstyl"/></a> <a href="https://github.com/AlexZhangji"><img src="https://avatars.githubusercontent.com/u/3280924?v=4&s=48" width="48" height="48" alt="AlexZhangji" title="AlexZhangji"/></a> <a href="https://github.com/andrewting19"><img src="https://avatars.githubusercontent.com/u/10536704?v=4&s=48" width="48" height="48" alt="andrewting19" title="andrewting19"/></a>
|
||||||
<a href="https://github.com/Kiwitwitter"><img src="https://avatars.githubusercontent.com/u/25277769?v=4&s=48" width="48" height="48" alt="Kiwitwitter" title="Kiwitwitter"/></a> <a href="https://github.com/levifig"><img src="https://avatars.githubusercontent.com/u/1605?v=4&s=48" width="48" height="48" alt="levifig" title="levifig"/></a> <a href="https://github.com/search?q=Lloyd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Lloyd" title="Lloyd"/></a> <a href="https://github.com/loganaden"><img src="https://avatars.githubusercontent.com/u/1688420?v=4&s=48" width="48" height="48" alt="loganaden" title="loganaden"/></a> <a href="https://github.com/longjos"><img src="https://avatars.githubusercontent.com/u/740160?v=4&s=48" width="48" height="48" alt="longjos" title="longjos"/></a> <a href="https://github.com/loukotal"><img src="https://avatars.githubusercontent.com/u/18210858?v=4&s=48" width="48" height="48" alt="loukotal" title="loukotal"/></a> <a href="https://github.com/louzhixian"><img src="https://avatars.githubusercontent.com/u/7994361?v=4&s=48" width="48" height="48" alt="louzhixian" title="louzhixian"/></a> <a href="https://github.com/martinpucik"><img src="https://avatars.githubusercontent.com/u/5503097?v=4&s=48" width="48" height="48" alt="martinpucik" title="martinpucik"/></a> <a href="https://github.com/search?q=Matt%20mini"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Matt mini" title="Matt mini"/></a> <a href="https://github.com/mertcicekci0"><img src="https://avatars.githubusercontent.com/u/179321902?v=4&s=48" width="48" height="48" alt="mertcicekci0" title="mertcicekci0"/></a>
|
<a href="https://github.com/anpoirier"><img src="https://avatars.githubusercontent.com/u/1245729?v=4&s=48" width="48" height="48" alt="anpoirier" title="anpoirier"/></a> <a href="https://github.com/araa47"><img src="https://avatars.githubusercontent.com/u/22760261?v=4&s=48" width="48" height="48" alt="araa47" title="araa47"/></a> <a href="https://github.com/arthyn"><img src="https://avatars.githubusercontent.com/u/5466421?v=4&s=48" width="48" height="48" alt="arthyn" title="arthyn"/></a> <a href="https://github.com/Asleep123"><img src="https://avatars.githubusercontent.com/u/122379135?v=4&s=48" width="48" height="48" alt="Asleep123" title="Asleep123"/></a> <a href="https://github.com/search?q=Ayush%20Ojha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Ayush Ojha" title="Ayush Ojha"/></a> <a href="https://github.com/Ayush10"><img src="https://avatars.githubusercontent.com/u/7945279?v=4&s=48" width="48" height="48" alt="Ayush10" title="Ayush10"/></a> <a href="https://github.com/bguidolim"><img src="https://avatars.githubusercontent.com/u/987360?v=4&s=48" width="48" height="48" alt="bguidolim" title="bguidolim"/></a> <a href="https://github.com/bolismauro"><img src="https://avatars.githubusercontent.com/u/771999?v=4&s=48" width="48" height="48" alt="bolismauro" title="bolismauro"/></a> <a href="https://github.com/caelum0x"><img src="https://avatars.githubusercontent.com/u/130079063?v=4&s=48" width="48" height="48" alt="caelum0x" title="caelum0x"/></a> <a href="https://github.com/championswimmer"><img src="https://avatars.githubusercontent.com/u/1327050?v=4&s=48" width="48" height="48" alt="championswimmer" title="championswimmer"/></a>
|
||||||
<a href="https://github.com/search?q=Miles"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Miles" title="Miles"/></a> <a href="https://github.com/mrdbstn"><img src="https://avatars.githubusercontent.com/u/58957632?v=4&s=48" width="48" height="48" alt="mrdbstn" title="mrdbstn"/></a> <a href="https://github.com/MSch"><img src="https://avatars.githubusercontent.com/u/7475?v=4&s=48" width="48" height="48" alt="MSch" title="MSch"/></a> <a href="https://github.com/search?q=Mustafa%20Tag%20Eldeen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mustafa Tag Eldeen" title="Mustafa Tag Eldeen"/></a> <a href="https://github.com/mylukin"><img src="https://avatars.githubusercontent.com/u/1021019?v=4&s=48" width="48" height="48" alt="mylukin" title="mylukin"/></a> <a href="https://github.com/nathanbosse"><img src="https://avatars.githubusercontent.com/u/4040669?v=4&s=48" width="48" height="48" alt="nathanbosse" title="nathanbosse"/></a> <a href="https://github.com/ndraiman"><img src="https://avatars.githubusercontent.com/u/12609607?v=4&s=48" width="48" height="48" alt="ndraiman" title="ndraiman"/></a> <a href="https://github.com/nexty5870"><img src="https://avatars.githubusercontent.com/u/3869659?v=4&s=48" width="48" height="48" alt="nexty5870" title="nexty5870"/></a> <a href="https://github.com/Noctivoro"><img src="https://avatars.githubusercontent.com/u/183974570?v=4&s=48" width="48" height="48" alt="Noctivoro" title="Noctivoro"/></a> <a href="https://github.com/ozgur-polat"><img src="https://avatars.githubusercontent.com/u/26483942?v=4&s=48" width="48" height="48" alt="ozgur-polat" title="ozgur-polat"/></a>
|
<a href="https://github.com/chenyuan99"><img src="https://avatars.githubusercontent.com/u/25518100?v=4&s=48" width="48" height="48" alt="chenyuan99" title="chenyuan99"/></a> <a href="https://github.com/Chloe-VP"><img src="https://avatars.githubusercontent.com/u/257371598?v=4&s=48" width="48" height="48" alt="Chloe-VP" title="Chloe-VP"/></a> <a href="https://github.com/search?q=Clawdbot%20Maintainers"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Clawdbot Maintainers" title="Clawdbot Maintainers"/></a> <a href="https://github.com/conhecendoia"><img src="https://avatars.githubusercontent.com/u/82890727?v=4&s=48" width="48" height="48" alt="conhecendoia" title="conhecendoia"/></a> <a href="https://github.com/dasilva333"><img src="https://avatars.githubusercontent.com/u/947827?v=4&s=48" width="48" height="48" alt="dasilva333" title="dasilva333"/></a> <a href="https://github.com/David-Marsh-Photo"><img src="https://avatars.githubusercontent.com/u/228404527?v=4&s=48" width="48" height="48" alt="David-Marsh-Photo" title="David-Marsh-Photo"/></a> <a href="https://github.com/deepsoumya617"><img src="https://avatars.githubusercontent.com/u/80877391?v=4&s=48" width="48" height="48" alt="deepsoumya617" title="deepsoumya617"/></a> <a href="https://github.com/search?q=Developer"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Developer" title="Developer"/></a> <a href="https://github.com/search?q=Dimitrios%20Ploutarchos"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Dimitrios Ploutarchos" title="Dimitrios Ploutarchos"/></a> <a href="https://github.com/search?q=Drake%20Thomsen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Drake Thomsen" title="Drake Thomsen"/></a>
|
||||||
<a href="https://github.com/ppamment"><img src="https://avatars.githubusercontent.com/u/2122919?v=4&s=48" width="48" height="48" alt="ppamment" title="ppamment"/></a> <a href="https://github.com/prathamdby"><img src="https://avatars.githubusercontent.com/u/134331217?v=4&s=48" width="48" height="48" alt="prathamdby" title="prathamdby"/></a> <a href="https://github.com/ptn1411"><img src="https://avatars.githubusercontent.com/u/57529765?v=4&s=48" width="48" height="48" alt="ptn1411" title="ptn1411"/></a> <a href="https://github.com/reeltimeapps"><img src="https://avatars.githubusercontent.com/u/637338?v=4&s=48" width="48" height="48" alt="reeltimeapps" title="reeltimeapps"/></a> <a href="https://github.com/RLTCmpe"><img src="https://avatars.githubusercontent.com/u/10762242?v=4&s=48" width="48" height="48" alt="RLTCmpe" title="RLTCmpe"/></a> <a href="https://github.com/search?q=Rony%20Kelner"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rony Kelner" title="Rony Kelner"/></a> <a href="https://github.com/ryancnelson"><img src="https://avatars.githubusercontent.com/u/347171?v=4&s=48" width="48" height="48" alt="ryancnelson" title="ryancnelson"/></a> <a href="https://github.com/search?q=Samrat%20Jha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Samrat Jha" title="Samrat Jha"/></a> <a href="https://github.com/senoldogann"><img src="https://avatars.githubusercontent.com/u/45736551?v=4&s=48" width="48" height="48" alt="senoldogann" title="senoldogann"/></a> <a href="https://github.com/Seredeep"><img src="https://avatars.githubusercontent.com/u/22802816?v=4&s=48" width="48" height="48" alt="Seredeep" title="Seredeep"/></a>
|
<a href="https://github.com/dvrshil"><img src="https://avatars.githubusercontent.com/u/81693876?v=4&s=48" width="48" height="48" alt="dvrshil" title="dvrshil"/></a> <a href="https://github.com/dxd5001"><img src="https://avatars.githubusercontent.com/u/1886046?v=4&s=48" width="48" height="48" alt="dxd5001" title="dxd5001"/></a> <a href="https://github.com/dylanneve1"><img src="https://avatars.githubusercontent.com/u/31746704?v=4&s=48" width="48" height="48" alt="dylanneve1" title="dylanneve1"/></a> <a href="https://github.com/search?q=Felix%20Krause"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Felix Krause" title="Felix Krause"/></a> <a href="https://github.com/foeken"><img src="https://avatars.githubusercontent.com/u/13864?v=4&s=48" width="48" height="48" alt="foeken" title="foeken"/></a> <a href="https://github.com/frankekn"><img src="https://avatars.githubusercontent.com/u/4488090?v=4&s=48" width="48" height="48" alt="frankekn" title="frankekn"/></a> <a href="https://github.com/fredheir"><img src="https://avatars.githubusercontent.com/u/3304869?v=4&s=48" width="48" height="48" alt="fredheir" title="fredheir"/></a> <a href="https://github.com/search?q=ganghyun%20kim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ganghyun kim" title="ganghyun kim"/></a> <a href="https://github.com/grrowl"><img src="https://avatars.githubusercontent.com/u/907140?v=4&s=48" width="48" height="48" alt="grrowl" title="grrowl"/></a> <a href="https://github.com/gtsifrikas"><img src="https://avatars.githubusercontent.com/u/8904378?v=4&s=48" width="48" height="48" alt="gtsifrikas" title="gtsifrikas"/></a>
|
||||||
<a href="https://github.com/sergical"><img src="https://avatars.githubusercontent.com/u/3760543?v=4&s=48" width="48" height="48" alt="sergical" title="sergical"/></a> <a href="https://github.com/shiv19"><img src="https://avatars.githubusercontent.com/u/9407019?v=4&s=48" width="48" height="48" alt="shiv19" title="shiv19"/></a> <a href="https://github.com/shiyuanhai"><img src="https://avatars.githubusercontent.com/u/1187370?v=4&s=48" width="48" height="48" alt="shiyuanhai" title="shiyuanhai"/></a> <a href="https://github.com/siraht"><img src="https://avatars.githubusercontent.com/u/73152895?v=4&s=48" width="48" height="48" alt="siraht" title="siraht"/></a> <a href="https://github.com/snopoke"><img src="https://avatars.githubusercontent.com/u/249606?v=4&s=48" width="48" height="48" alt="snopoke" title="snopoke"/></a> <a href="https://github.com/search?q=techboss"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="techboss" title="techboss"/></a> <a href="https://github.com/testingabc321"><img src="https://avatars.githubusercontent.com/u/8577388?v=4&s=48" width="48" height="48" alt="testingabc321" title="testingabc321"/></a> <a href="https://github.com/search?q=The%20Admiral"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="The Admiral" title="The Admiral"/></a> <a href="https://github.com/thesash"><img src="https://avatars.githubusercontent.com/u/1166151?v=4&s=48" width="48" height="48" alt="thesash" title="thesash"/></a> <a href="https://github.com/search?q=Vibe%20Kanban"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vibe Kanban" title="Vibe Kanban"/></a>
|
<a href="https://github.com/HassanFleyah"><img src="https://avatars.githubusercontent.com/u/228002017?v=4&s=48" width="48" height="48" alt="HassanFleyah" title="HassanFleyah"/></a> <a href="https://github.com/HazAT"><img src="https://avatars.githubusercontent.com/u/363802?v=4&s=48" width="48" height="48" alt="HazAT" title="HazAT"/></a> <a href="https://github.com/hrdwdmrbl"><img src="https://avatars.githubusercontent.com/u/554881?v=4&s=48" width="48" height="48" alt="hrdwdmrbl" title="hrdwdmrbl"/></a> <a href="https://github.com/hugobarauna"><img src="https://avatars.githubusercontent.com/u/2719?v=4&s=48" width="48" height="48" alt="hugobarauna" title="hugobarauna"/></a> <a href="https://github.com/iamEvanYT"><img src="https://avatars.githubusercontent.com/u/47493765?v=4&s=48" width="48" height="48" alt="iamEvanYT" title="iamEvanYT"/></a> <a href="https://github.com/ichbinlucaskim"><img src="https://avatars.githubusercontent.com/u/125564751?v=4&s=48" width="48" height="48" alt="ichbinlucaskim" title="ichbinlucaskim"/></a> <a href="https://github.com/search?q=Jamie%20Openshaw"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jamie Openshaw" title="Jamie Openshaw"/></a> <a href="https://github.com/search?q=Jane"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jane" title="Jane"/></a> <a href="https://github.com/search?q=Jarvis%20Deploy"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jarvis Deploy" title="Jarvis Deploy"/></a> <a href="https://github.com/search?q=Jefferson%20Nunn"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Jefferson Nunn" title="Jefferson Nunn"/></a>
|
||||||
<a href="https://github.com/voidserf"><img src="https://avatars.githubusercontent.com/u/477673?v=4&s=48" width="48" height="48" alt="voidserf" title="voidserf"/></a> <a href="https://github.com/search?q=Vultr-Clawd%20Admin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vultr-Clawd Admin" title="Vultr-Clawd Admin"/></a> <a href="https://github.com/search?q=Wimmie"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Wimmie" title="Wimmie"/></a> <a href="https://github.com/search?q=wolfred"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="wolfred" title="wolfred"/></a> <a href="https://github.com/wstock"><img src="https://avatars.githubusercontent.com/u/1394687?v=4&s=48" width="48" height="48" alt="wstock" title="wstock"/></a> <a href="https://github.com/YangHuang2280"><img src="https://avatars.githubusercontent.com/u/201681634?v=4&s=48" width="48" height="48" alt="YangHuang2280" title="YangHuang2280"/></a> <a href="https://github.com/yazinsai"><img src="https://avatars.githubusercontent.com/u/1846034?v=4&s=48" width="48" height="48" alt="yazinsai" title="yazinsai"/></a> <a href="https://github.com/yevhen"><img src="https://avatars.githubusercontent.com/u/107726?v=4&s=48" width="48" height="48" alt="yevhen" title="yevhen"/></a> <a href="https://github.com/YiWang24"><img src="https://avatars.githubusercontent.com/u/176262341?v=4&s=48" width="48" height="48" alt="YiWang24" title="YiWang24"/></a> <a href="https://github.com/search?q=ymat19"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ymat19" title="ymat19"/></a>
|
<a href="https://github.com/jogi47"><img src="https://avatars.githubusercontent.com/u/1710139?v=4&s=48" width="48" height="48" alt="jogi47" title="jogi47"/></a> <a href="https://github.com/kentaro"><img src="https://avatars.githubusercontent.com/u/3458?v=4&s=48" width="48" height="48" alt="kentaro" title="kentaro"/></a> <a href="https://github.com/search?q=Kevin%20Lin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Kevin Lin" title="Kevin Lin"/></a> <a href="https://github.com/kira-ariaki"><img src="https://avatars.githubusercontent.com/u/257352493?v=4&s=48" width="48" height="48" alt="kira-ariaki" title="kira-ariaki"/></a> <a href="https://github.com/kitze"><img src="https://avatars.githubusercontent.com/u/1160594?v=4&s=48" width="48" height="48" alt="kitze" title="kitze"/></a> <a href="https://github.com/Kiwitwitter"><img src="https://avatars.githubusercontent.com/u/25277769?v=4&s=48" width="48" height="48" alt="Kiwitwitter" title="Kiwitwitter"/></a> <a href="https://github.com/levifig"><img src="https://avatars.githubusercontent.com/u/1605?v=4&s=48" width="48" height="48" alt="levifig" title="levifig"/></a> <a href="https://github.com/search?q=Lloyd"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Lloyd" title="Lloyd"/></a> <a href="https://github.com/loganaden"><img src="https://avatars.githubusercontent.com/u/1688420?v=4&s=48" width="48" height="48" alt="loganaden" title="loganaden"/></a> <a href="https://github.com/longjos"><img src="https://avatars.githubusercontent.com/u/740160?v=4&s=48" width="48" height="48" alt="longjos" title="longjos"/></a>
|
||||||
<a href="https://github.com/search?q=Zach%20Knickerbocker"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Zach Knickerbocker" title="Zach Knickerbocker"/></a> <a href="https://github.com/zackerthescar"><img src="https://avatars.githubusercontent.com/u/38077284?v=4&s=48" width="48" height="48" alt="zackerthescar" title="zackerthescar"/></a> <a href="https://github.com/0xJonHoldsCrypto"><img src="https://avatars.githubusercontent.com/u/81202085?v=4&s=48" width="48" height="48" alt="0xJonHoldsCrypto" title="0xJonHoldsCrypto"/></a> <a href="https://github.com/aaronn"><img src="https://avatars.githubusercontent.com/u/1653630?v=4&s=48" width="48" height="48" alt="aaronn" title="aaronn"/></a> <a href="https://github.com/Alphonse-arianee"><img src="https://avatars.githubusercontent.com/u/254457365?v=4&s=48" width="48" height="48" alt="Alphonse-arianee" title="Alphonse-arianee"/></a> <a href="https://github.com/atalovesyou"><img src="https://avatars.githubusercontent.com/u/3534502?v=4&s=48" width="48" height="48" alt="atalovesyou" title="atalovesyou"/></a> <a href="https://github.com/search?q=Azade"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Azade" title="Azade"/></a> <a href="https://github.com/carlulsoe"><img src="https://avatars.githubusercontent.com/u/34673973?v=4&s=48" width="48" height="48" alt="carlulsoe" title="carlulsoe"/></a> <a href="https://github.com/search?q=ddyo"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ddyo" title="ddyo"/></a> <a href="https://github.com/search?q=Erik"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Erik" title="Erik"/></a>
|
<a href="https://github.com/loukotal"><img src="https://avatars.githubusercontent.com/u/18210858?v=4&s=48" width="48" height="48" alt="loukotal" title="loukotal"/></a> <a href="https://github.com/louzhixian"><img src="https://avatars.githubusercontent.com/u/7994361?v=4&s=48" width="48" height="48" alt="louzhixian" title="louzhixian"/></a> <a href="https://github.com/search?q=mac%20mimi"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="mac mimi" title="mac mimi"/></a> <a href="https://github.com/martinpucik"><img src="https://avatars.githubusercontent.com/u/5503097?v=4&s=48" width="48" height="48" alt="martinpucik" title="martinpucik"/></a> <a href="https://github.com/search?q=Matt%20mini"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Matt mini" title="Matt mini"/></a> <a href="https://github.com/mcaxtr"><img src="https://avatars.githubusercontent.com/u/7562095?v=4&s=48" width="48" height="48" alt="mcaxtr" title="mcaxtr"/></a> <a href="https://github.com/mertcicekci0"><img src="https://avatars.githubusercontent.com/u/179321902?v=4&s=48" width="48" height="48" alt="mertcicekci0" title="mertcicekci0"/></a> <a href="https://github.com/search?q=Miles"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Miles" title="Miles"/></a> <a href="https://github.com/mrdbstn"><img src="https://avatars.githubusercontent.com/u/58957632?v=4&s=48" width="48" height="48" alt="mrdbstn" title="mrdbstn"/></a> <a href="https://github.com/MSch"><img src="https://avatars.githubusercontent.com/u/7475?v=4&s=48" width="48" height="48" alt="MSch" title="MSch"/></a>
|
||||||
<a href="https://github.com/latitudeki5223"><img src="https://avatars.githubusercontent.com/u/119656367?v=4&s=48" width="48" height="48" alt="latitudeki5223" title="latitudeki5223"/></a> <a href="https://github.com/search?q=Manuel%20Maly"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Manuel Maly" title="Manuel Maly"/></a> <a href="https://github.com/search?q=Mourad%20Boustani"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mourad Boustani" title="Mourad Boustani"/></a> <a href="https://github.com/odrobnik"><img src="https://avatars.githubusercontent.com/u/333270?v=4&s=48" width="48" height="48" alt="odrobnik" title="odrobnik"/></a> <a href="https://github.com/pcty-nextgen-ios-builder"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="pcty-nextgen-ios-builder" title="pcty-nextgen-ios-builder"/></a> <a href="https://github.com/search?q=Quentin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Quentin" title="Quentin"/></a> <a href="https://github.com/search?q=Randy%20Torres"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Randy Torres" title="Randy Torres"/></a> <a href="https://github.com/rhjoh"><img src="https://avatars.githubusercontent.com/u/105699450?v=4&s=48" width="48" height="48" alt="rhjoh" title="rhjoh"/></a> <a href="https://github.com/search?q=Rolf%20Fredheim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rolf Fredheim" title="Rolf Fredheim"/></a> <a href="https://github.com/ronak-guliani"><img src="https://avatars.githubusercontent.com/u/23518228?v=4&s=48" width="48" height="48" alt="ronak-guliani" title="ronak-guliani"/></a>
|
<a href="https://github.com/search?q=Mustafa%20Tag%20Eldeen"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mustafa Tag Eldeen" title="Mustafa Tag Eldeen"/></a> <a href="https://github.com/mylukin"><img src="https://avatars.githubusercontent.com/u/1021019?v=4&s=48" width="48" height="48" alt="mylukin" title="mylukin"/></a> <a href="https://github.com/nathanbosse"><img src="https://avatars.githubusercontent.com/u/4040669?v=4&s=48" width="48" height="48" alt="nathanbosse" title="nathanbosse"/></a> <a href="https://github.com/ndraiman"><img src="https://avatars.githubusercontent.com/u/12609607?v=4&s=48" width="48" height="48" alt="ndraiman" title="ndraiman"/></a> <a href="https://github.com/nexty5870"><img src="https://avatars.githubusercontent.com/u/3869659?v=4&s=48" width="48" height="48" alt="nexty5870" title="nexty5870"/></a> <a href="https://github.com/Noctivoro"><img src="https://avatars.githubusercontent.com/u/183974570?v=4&s=48" width="48" height="48" alt="Noctivoro" title="Noctivoro"/></a> <a href="https://github.com/Omar-Khaleel"><img src="https://avatars.githubusercontent.com/u/240748662?v=4&s=48" width="48" height="48" alt="Omar-Khaleel" title="Omar-Khaleel"/></a> <a href="https://github.com/ozgur-polat"><img src="https://avatars.githubusercontent.com/u/26483942?v=4&s=48" width="48" height="48" alt="ozgur-polat" title="ozgur-polat"/></a> <a href="https://github.com/ppamment"><img src="https://avatars.githubusercontent.com/u/2122919?v=4&s=48" width="48" height="48" alt="ppamment" title="ppamment"/></a> <a href="https://github.com/prathamdby"><img src="https://avatars.githubusercontent.com/u/134331217?v=4&s=48" width="48" height="48" alt="prathamdby" title="prathamdby"/></a>
|
||||||
<a href="https://github.com/search?q=William%20Stock"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="William Stock" title="William Stock"/></a> <a href="https://github.com/roerohan"><img src="https://avatars.githubusercontent.com/u/42958812?v=4&s=48" width="48" height="48" alt="roerohan" title="roerohan"/></a>
|
<a href="https://github.com/ptn1411"><img src="https://avatars.githubusercontent.com/u/57529765?v=4&s=48" width="48" height="48" alt="ptn1411" title="ptn1411"/></a> <a href="https://github.com/rafelbev"><img src="https://avatars.githubusercontent.com/u/467120?v=4&s=48" width="48" height="48" alt="rafelbev" title="rafelbev"/></a> <a href="https://github.com/reeltimeapps"><img src="https://avatars.githubusercontent.com/u/637338?v=4&s=48" width="48" height="48" alt="reeltimeapps" title="reeltimeapps"/></a> <a href="https://github.com/RLTCmpe"><img src="https://avatars.githubusercontent.com/u/10762242?v=4&s=48" width="48" height="48" alt="RLTCmpe" title="RLTCmpe"/></a> <a href="https://github.com/search?q=Rony%20Kelner"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rony Kelner" title="Rony Kelner"/></a> <a href="https://github.com/ryancnelson"><img src="https://avatars.githubusercontent.com/u/347171?v=4&s=48" width="48" height="48" alt="ryancnelson" title="ryancnelson"/></a> <a href="https://github.com/search?q=Samrat%20Jha"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Samrat Jha" title="Samrat Jha"/></a> <a href="https://github.com/senoldogann"><img src="https://avatars.githubusercontent.com/u/45736551?v=4&s=48" width="48" height="48" alt="senoldogann" title="senoldogann"/></a> <a href="https://github.com/Seredeep"><img src="https://avatars.githubusercontent.com/u/22802816?v=4&s=48" width="48" height="48" alt="Seredeep" title="Seredeep"/></a> <a href="https://github.com/sergical"><img src="https://avatars.githubusercontent.com/u/3760543?v=4&s=48" width="48" height="48" alt="sergical" title="sergical"/></a>
|
||||||
|
<a href="https://github.com/shiv19"><img src="https://avatars.githubusercontent.com/u/9407019?v=4&s=48" width="48" height="48" alt="shiv19" title="shiv19"/></a> <a href="https://github.com/shiyuanhai"><img src="https://avatars.githubusercontent.com/u/1187370?v=4&s=48" width="48" height="48" alt="shiyuanhai" title="shiyuanhai"/></a> <a href="https://github.com/Shrinija17"><img src="https://avatars.githubusercontent.com/u/199155426?v=4&s=48" width="48" height="48" alt="Shrinija17" title="Shrinija17"/></a> <a href="https://github.com/siraht"><img src="https://avatars.githubusercontent.com/u/73152895?v=4&s=48" width="48" height="48" alt="siraht" title="siraht"/></a> <a href="https://github.com/snopoke"><img src="https://avatars.githubusercontent.com/u/249606?v=4&s=48" width="48" height="48" alt="snopoke" title="snopoke"/></a> <a href="https://github.com/stephenchen2025"><img src="https://avatars.githubusercontent.com/u/218387130?v=4&s=48" width="48" height="48" alt="stephenchen2025" title="stephenchen2025"/></a> <a href="https://github.com/search?q=techboss"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="techboss" title="techboss"/></a> <a href="https://github.com/testingabc321"><img src="https://avatars.githubusercontent.com/u/8577388?v=4&s=48" width="48" height="48" alt="testingabc321" title="testingabc321"/></a> <a href="https://github.com/search?q=The%20Admiral"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="The Admiral" title="The Admiral"/></a> <a href="https://github.com/thesash"><img src="https://avatars.githubusercontent.com/u/1166151?v=4&s=48" width="48" height="48" alt="thesash" title="thesash"/></a>
|
||||||
|
<a href="https://github.com/search?q=Vibe%20Kanban"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vibe Kanban" title="Vibe Kanban"/></a> <a href="https://github.com/vincentkoc"><img src="https://avatars.githubusercontent.com/u/25068?v=4&s=48" width="48" height="48" alt="vincentkoc" title="vincentkoc"/></a> <a href="https://github.com/voidserf"><img src="https://avatars.githubusercontent.com/u/477673?v=4&s=48" width="48" height="48" alt="voidserf" title="voidserf"/></a> <a href="https://github.com/search?q=Vultr-Clawd%20Admin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Vultr-Clawd Admin" title="Vultr-Clawd Admin"/></a> <a href="https://github.com/search?q=Wimmie"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Wimmie" title="Wimmie"/></a> <a href="https://github.com/search?q=wolfred"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="wolfred" title="wolfred"/></a> <a href="https://github.com/wstock"><img src="https://avatars.githubusercontent.com/u/1394687?v=4&s=48" width="48" height="48" alt="wstock" title="wstock"/></a> <a href="https://github.com/wytheme"><img src="https://avatars.githubusercontent.com/u/5009358?v=4&s=48" width="48" height="48" alt="wytheme" title="wytheme"/></a> <a href="https://github.com/YangHuang2280"><img src="https://avatars.githubusercontent.com/u/201681634?v=4&s=48" width="48" height="48" alt="YangHuang2280" title="YangHuang2280"/></a> <a href="https://github.com/yazinsai"><img src="https://avatars.githubusercontent.com/u/1846034?v=4&s=48" width="48" height="48" alt="yazinsai" title="yazinsai"/></a>
|
||||||
|
<a href="https://github.com/yevhen"><img src="https://avatars.githubusercontent.com/u/107726?v=4&s=48" width="48" height="48" alt="yevhen" title="yevhen"/></a> <a href="https://github.com/YiWang24"><img src="https://avatars.githubusercontent.com/u/176262341?v=4&s=48" width="48" height="48" alt="YiWang24" title="YiWang24"/></a> <a href="https://github.com/search?q=ymat19"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ymat19" title="ymat19"/></a> <a href="https://github.com/search?q=Zach%20Knickerbocker"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Zach Knickerbocker" title="Zach Knickerbocker"/></a> <a href="https://github.com/zackerthescar"><img src="https://avatars.githubusercontent.com/u/38077284?v=4&s=48" width="48" height="48" alt="zackerthescar" title="zackerthescar"/></a> <a href="https://github.com/0xJonHoldsCrypto"><img src="https://avatars.githubusercontent.com/u/81202085?v=4&s=48" width="48" height="48" alt="0xJonHoldsCrypto" title="0xJonHoldsCrypto"/></a> <a href="https://github.com/aaronn"><img src="https://avatars.githubusercontent.com/u/1653630?v=4&s=48" width="48" height="48" alt="aaronn" title="aaronn"/></a> <a href="https://github.com/Alphonse-arianee"><img src="https://avatars.githubusercontent.com/u/254457365?v=4&s=48" width="48" height="48" alt="Alphonse-arianee" title="Alphonse-arianee"/></a> <a href="https://github.com/atalovesyou"><img src="https://avatars.githubusercontent.com/u/3534502?v=4&s=48" width="48" height="48" alt="atalovesyou" title="atalovesyou"/></a> <a href="https://github.com/search?q=Azade"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Azade" title="Azade"/></a>
|
||||||
|
<a href="https://github.com/carlulsoe"><img src="https://avatars.githubusercontent.com/u/34673973?v=4&s=48" width="48" height="48" alt="carlulsoe" title="carlulsoe"/></a> <a href="https://github.com/search?q=ddyo"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="ddyo" title="ddyo"/></a> <a href="https://github.com/search?q=Erik"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Erik" title="Erik"/></a> <a href="https://github.com/jiulingyun"><img src="https://avatars.githubusercontent.com/u/126459548?v=4&s=48" width="48" height="48" alt="jiulingyun" title="jiulingyun"/></a> <a href="https://github.com/latitudeki5223"><img src="https://avatars.githubusercontent.com/u/119656367?v=4&s=48" width="48" height="48" alt="latitudeki5223" title="latitudeki5223"/></a> <a href="https://github.com/search?q=Manuel%20Maly"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Manuel Maly" title="Manuel Maly"/></a> <a href="https://github.com/search?q=Mourad%20Boustani"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Mourad Boustani" title="Mourad Boustani"/></a> <a href="https://github.com/odrobnik"><img src="https://avatars.githubusercontent.com/u/333270?v=4&s=48" width="48" height="48" alt="odrobnik" title="odrobnik"/></a> <a href="https://github.com/pcty-nextgen-ios-builder"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="pcty-nextgen-ios-builder" title="pcty-nextgen-ios-builder"/></a> <a href="https://github.com/search?q=Quentin"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Quentin" title="Quentin"/></a>
|
||||||
|
<a href="https://github.com/search?q=Randy%20Torres"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Randy Torres" title="Randy Torres"/></a> <a href="https://github.com/rhjoh"><img src="https://avatars.githubusercontent.com/u/105699450?v=4&s=48" width="48" height="48" alt="rhjoh" title="rhjoh"/></a> <a href="https://github.com/search?q=Rolf%20Fredheim"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="Rolf Fredheim" title="Rolf Fredheim"/></a> <a href="https://github.com/ronak-guliani"><img src="https://avatars.githubusercontent.com/u/23518228?v=4&s=48" width="48" height="48" alt="ronak-guliani" title="ronak-guliani"/></a> <a href="https://github.com/search?q=William%20Stock"><img src="assets/avatar-placeholder.svg" width="48" height="48" alt="William Stock" title="William Stock"/></a>
|
||||||
</p>
|
</p>
|
||||||
|
|
|
||||||
|
|
@ -163,4 +163,4 @@
|
||||||
<enclosure url="https://github.com/openclaw/openclaw/releases/download/v2026.2.1/OpenClaw-2026.2.1.zip" length="22458919" type="application/octet-stream" sparkle:edSignature="kA/8VQlVdtYphcB1iuFrhWczwWKgkVZMfDfQ7T9WD405D8JKTv5CZ1n8lstIVkpk4xog3UhrfaaoTG8Bf8DMAQ=="/>
|
<enclosure url="https://github.com/openclaw/openclaw/releases/download/v2026.2.1/OpenClaw-2026.2.1.zip" length="22458919" type="application/octet-stream" sparkle:edSignature="kA/8VQlVdtYphcB1iuFrhWczwWKgkVZMfDfQ7T9WD405D8JKTv5CZ1n8lstIVkpk4xog3UhrfaaoTG8Bf8DMAQ=="/>
|
||||||
</item>
|
</item>
|
||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ android {
|
||||||
minSdk = 31
|
minSdk = 31
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 202602030
|
versionCode = 202602030
|
||||||
versionName = "2026.2.3"
|
versionName = "2026.2.4"
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2026.2.3</string>
|
<string>2026.2.4</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>20260202</string>
|
<string>20260202</string>
|
||||||
<key>NSAppTransportSecurity</key>
|
<key>NSAppTransportSecurity</key>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>BNDL</string>
|
<string>BNDL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2026.2.3</string>
|
<string>2026.2.4</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>20260202</string>
|
<string>20260202</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ targets:
|
||||||
properties:
|
properties:
|
||||||
CFBundleDisplayName: OpenClaw
|
CFBundleDisplayName: OpenClaw
|
||||||
CFBundleIconName: AppIcon
|
CFBundleIconName: AppIcon
|
||||||
CFBundleShortVersionString: "2026.2.3"
|
CFBundleShortVersionString: "2026.2.4"
|
||||||
CFBundleVersion: "20260202"
|
CFBundleVersion: "20260202"
|
||||||
UILaunchScreen: {}
|
UILaunchScreen: {}
|
||||||
UIApplicationSceneManifest:
|
UIApplicationSceneManifest:
|
||||||
|
|
@ -130,5 +130,5 @@ targets:
|
||||||
path: Tests/Info.plist
|
path: Tests/Info.plist
|
||||||
properties:
|
properties:
|
||||||
CFBundleDisplayName: OpenClawTests
|
CFBundleDisplayName: OpenClawTests
|
||||||
CFBundleShortVersionString: "2026.2.3"
|
CFBundleShortVersionString: "2026.2.4"
|
||||||
CFBundleVersion: "20260202"
|
CFBundleVersion: "20260202"
|
||||||
|
|
|
||||||
|
|
@ -335,7 +335,7 @@ extension OnboardingView {
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
.frame(maxWidth: 540)
|
.frame(maxWidth: 540)
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
Text("OpenClaw supports any model — we strongly recommend Opus 4.5 for the best experience.")
|
Text("OpenClaw supports any model — we strongly recommend Opus 4.6 for the best experience.")
|
||||||
.font(.callout)
|
.font(.callout)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>2026.2.3</string>
|
<string>2026.2.4</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>202602020</string>
|
<string>202602020</string>
|
||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,7 @@ extension SessionRow {
|
||||||
systemSent: true,
|
systemSent: true,
|
||||||
abortedLastRun: true,
|
abortedLastRun: true,
|
||||||
tokens: SessionTokenStats(input: 5000, output: 1200, total: 6200, contextTokens: 200_000),
|
tokens: SessionTokenStats(input: 5000, output: 1200, total: 6200, contextTokens: 200_000),
|
||||||
model: "claude-opus-4-5"),
|
model: "claude-opus-4-6"),
|
||||||
SessionRow(
|
SessionRow(
|
||||||
id: "global",
|
id: "global",
|
||||||
key: "global",
|
key: "global",
|
||||||
|
|
@ -242,7 +242,7 @@ struct SessionStoreSnapshot {
|
||||||
|
|
||||||
@MainActor
|
@MainActor
|
||||||
enum SessionLoader {
|
enum SessionLoader {
|
||||||
static let fallbackModel = "claude-opus-4-5"
|
static let fallbackModel = "claude-opus-4-6"
|
||||||
static let fallbackContextTokens = 200_000
|
static let fallbackContextTokens = 200_000
|
||||||
|
|
||||||
static let defaultStorePath = standardize(
|
static let defaultStorePath = standardize(
|
||||||
|
|
|
||||||
|
|
@ -1119,6 +1119,35 @@ public struct SessionsCompactParams: Codable, Sendable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct SessionsUsageParams: Codable, Sendable {
|
||||||
|
public let key: String?
|
||||||
|
public let startdate: String?
|
||||||
|
public let enddate: String?
|
||||||
|
public let limit: Int?
|
||||||
|
public let includecontextweight: Bool?
|
||||||
|
|
||||||
|
public init(
|
||||||
|
key: String?,
|
||||||
|
startdate: String?,
|
||||||
|
enddate: String?,
|
||||||
|
limit: Int?,
|
||||||
|
includecontextweight: Bool?
|
||||||
|
) {
|
||||||
|
self.key = key
|
||||||
|
self.startdate = startdate
|
||||||
|
self.enddate = enddate
|
||||||
|
self.limit = limit
|
||||||
|
self.includecontextweight = includecontextweight
|
||||||
|
}
|
||||||
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
case key
|
||||||
|
case startdate = "startDate"
|
||||||
|
case enddate = "endDate"
|
||||||
|
case limit
|
||||||
|
case includecontextweight = "includeContextWeight"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct ConfigGetParams: Codable, Sendable {
|
public struct ConfigGetParams: Codable, Sendable {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ struct MenuSessionsInjectorTests {
|
||||||
let injector = MenuSessionsInjector()
|
let injector = MenuSessionsInjector()
|
||||||
injector.setTestingControlChannelConnected(true)
|
injector.setTestingControlChannelConnected(true)
|
||||||
|
|
||||||
let defaults = SessionDefaults(model: "anthropic/claude-opus-4-5", contextTokens: 200_000)
|
let defaults = SessionDefaults(model: "anthropic/claude-opus-4-6", contextTokens: 200_000)
|
||||||
let rows = [
|
let rows = [
|
||||||
SessionRow(
|
SessionRow(
|
||||||
id: "main",
|
id: "main",
|
||||||
|
|
@ -41,7 +41,7 @@ struct MenuSessionsInjectorTests {
|
||||||
systemSent: false,
|
systemSent: false,
|
||||||
abortedLastRun: false,
|
abortedLastRun: false,
|
||||||
tokens: SessionTokenStats(input: 10, output: 20, total: 30, contextTokens: 200_000),
|
tokens: SessionTokenStats(input: 10, output: 20, total: 30, contextTokens: 200_000),
|
||||||
model: "claude-opus-4-5"),
|
model: "claude-opus-4-6"),
|
||||||
SessionRow(
|
SessionRow(
|
||||||
id: "discord:group:alpha",
|
id: "discord:group:alpha",
|
||||||
key: "discord:group:alpha",
|
key: "discord:group:alpha",
|
||||||
|
|
@ -58,7 +58,7 @@ struct MenuSessionsInjectorTests {
|
||||||
systemSent: true,
|
systemSent: true,
|
||||||
abortedLastRun: true,
|
abortedLastRun: true,
|
||||||
tokens: SessionTokenStats(input: 50, output: 50, total: 100, contextTokens: 200_000),
|
tokens: SessionTokenStats(input: 50, output: 50, total: 100, contextTokens: 200_000),
|
||||||
model: "claude-opus-4-5"),
|
model: "claude-opus-4-6"),
|
||||||
]
|
]
|
||||||
let snapshot = SessionStoreSnapshot(
|
let snapshot = SessionStoreSnapshot(
|
||||||
storePath: "/tmp/sessions.json",
|
storePath: "/tmp/sessions.json",
|
||||||
|
|
|
||||||
|
|
@ -1119,6 +1119,35 @@ public struct SessionsCompactParams: Codable, Sendable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct SessionsUsageParams: Codable, Sendable {
|
||||||
|
public let key: String?
|
||||||
|
public let startdate: String?
|
||||||
|
public let enddate: String?
|
||||||
|
public let limit: Int?
|
||||||
|
public let includecontextweight: Bool?
|
||||||
|
|
||||||
|
public init(
|
||||||
|
key: String?,
|
||||||
|
startdate: String?,
|
||||||
|
enddate: String?,
|
||||||
|
limit: Int?,
|
||||||
|
includecontextweight: Bool?
|
||||||
|
) {
|
||||||
|
self.key = key
|
||||||
|
self.startdate = startdate
|
||||||
|
self.enddate = enddate
|
||||||
|
self.limit = limit
|
||||||
|
self.includecontextweight = includecontextweight
|
||||||
|
}
|
||||||
|
private enum CodingKeys: String, CodingKey {
|
||||||
|
case key
|
||||||
|
case startdate = "startDate"
|
||||||
|
case enddate = "endDate"
|
||||||
|
case limit
|
||||||
|
case includecontextweight = "includeContextWeight"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct ConfigGetParams: Codable, Sendable {
|
public struct ConfigGetParams: Codable, Sendable {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 155 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 162 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 312 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 312 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 362 KiB |
|
|
@ -78,8 +78,8 @@ export AWS_BEARER_TOKEN_BEDROCK="..."
|
||||||
auth: "aws-sdk",
|
auth: "aws-sdk",
|
||||||
models: [
|
models: [
|
||||||
{
|
{
|
||||||
id: "anthropic.claude-opus-4-5-20251101-v1:0",
|
id: "us.anthropic.claude-opus-4-6-v1:0",
|
||||||
name: "Claude Opus 4.5 (Bedrock)",
|
name: "Claude Opus 4.6 (Bedrock)",
|
||||||
reasoning: true,
|
reasoning: true,
|
||||||
input: ["text", "image"],
|
input: ["text", "image"],
|
||||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||||
|
|
@ -92,7 +92,7 @@ export AWS_BEARER_TOKEN_BEDROCK="..."
|
||||||
},
|
},
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "amazon-bedrock/anthropic.claude-opus-4-5-20251101-v1:0" },
|
model: { primary: "amazon-bedrock/us.anthropic.claude-opus-4-6-v1:0" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -196,6 +196,7 @@ Notes:
|
||||||
- If `channels` is present, any channel not listed is denied by default.
|
- If `channels` is present, any channel not listed is denied by default.
|
||||||
- Use a `"*"` channel entry to apply defaults across all channels; explicit channel entries override the wildcard.
|
- Use a `"*"` channel entry to apply defaults across all channels; explicit channel entries override the wildcard.
|
||||||
- Threads inherit parent channel config (allowlist, `requireMention`, skills, prompts, etc.) unless you add the thread channel id explicitly.
|
- Threads inherit parent channel config (allowlist, `requireMention`, skills, prompts, etc.) unless you add the thread channel id explicitly.
|
||||||
|
- Owner hint: when a per-guild or per-channel `users` allowlist matches the sender, OpenClaw treats that sender as the owner in the system prompt. For a global owner across channels, set `commands.ownerAllowFrom`.
|
||||||
- Bot-authored messages are ignored by default; set `channels.discord.allowBots=true` to allow them (own messages remain filtered).
|
- Bot-authored messages are ignored by default; set `channels.discord.allowBots=true` to allow them (own messages remain filtered).
|
||||||
- Warning: If you allow replies to other bots (`channels.discord.allowBots=true`), prevent bot-to-bot reply loops with `requireMention`, `channels.discord.guilds.*.channels.<id>.users` allowlists, and/or clear guardrails in `AGENTS.md` and `SOUL.md`.
|
- Warning: If you allow replies to other bots (`channels.discord.allowBots=true`), prevent bot-to-bot reply loops with `requireMention`, `channels.discord.guilds.*.channels.<id>.users` allowlists, and/or clear guardrails in `AGENTS.md` and `SOUL.md`.
|
||||||
|
|
||||||
|
|
@ -334,7 +335,7 @@ ack reaction after the bot replies.
|
||||||
- `guilds.<id>.channels.<channel>.toolsBySender`: optional per-sender tool policy overrides within the channel (`"*"` wildcard supported).
|
- `guilds.<id>.channels.<channel>.toolsBySender`: optional per-sender tool policy overrides within the channel (`"*"` wildcard supported).
|
||||||
- `guilds.<id>.channels.<channel>.users`: optional per-channel user allowlist.
|
- `guilds.<id>.channels.<channel>.users`: optional per-channel user allowlist.
|
||||||
- `guilds.<id>.channels.<channel>.skills`: skill filter (omit = all skills, empty = none).
|
- `guilds.<id>.channels.<channel>.skills`: skill filter (omit = all skills, empty = none).
|
||||||
- `guilds.<id>.channels.<channel>.systemPrompt`: extra system prompt for the channel (combined with channel topic).
|
- `guilds.<id>.channels.<channel>.systemPrompt`: extra system prompt for the channel. Discord channel topics are injected as **untrusted** context (not system prompt).
|
||||||
- `guilds.<id>.channels.<channel>.enabled`: set `false` to disable the channel.
|
- `guilds.<id>.channels.<channel>.enabled`: set `false` to disable the channel.
|
||||||
- `guilds.<id>.channels`: channel rules (keys are channel slugs or ids).
|
- `guilds.<id>.channels`: channel rules (keys are channel slugs or ids).
|
||||||
- `guilds.<id>.requireMention`: per-guild mention requirement (overridable per channel).
|
- `guilds.<id>.requireMention`: per-guild mention requirement (overridable per channel).
|
||||||
|
|
|
||||||
|
|
@ -447,7 +447,75 @@ openclaw pairing list feishu
|
||||||
|
|
||||||
### Streaming
|
### Streaming
|
||||||
|
|
||||||
Feishu does not support message editing, so block streaming is enabled by default (`blockStreaming: true`). The bot waits for the full reply before sending.
|
Feishu supports streaming replies via interactive cards. When enabled, the bot updates a card as it generates text.
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
channels: {
|
||||||
|
feishu: {
|
||||||
|
streaming: true, // enable streaming card output (default true)
|
||||||
|
blockStreaming: true, // enable block-level streaming (default true)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Set `streaming: false` to wait for the full reply before sending.
|
||||||
|
|
||||||
|
### Multi-agent routing
|
||||||
|
|
||||||
|
Use `bindings` to route Feishu DMs or groups to different agents.
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
agents: {
|
||||||
|
list: [
|
||||||
|
{ id: "main" },
|
||||||
|
{
|
||||||
|
id: "clawd-fan",
|
||||||
|
workspace: "/home/user/clawd-fan",
|
||||||
|
agentDir: "/home/user/.openclaw/agents/clawd-fan/agent",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "clawd-xi",
|
||||||
|
workspace: "/home/user/clawd-xi",
|
||||||
|
agentDir: "/home/user/.openclaw/agents/clawd-xi/agent",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
bindings: [
|
||||||
|
{
|
||||||
|
agentId: "main",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "dm", id: "ou_xxx" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
agentId: "clawd-fan",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "dm", id: "ou_yyy" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
agentId: "clawd-xi",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "group", id: "oc_zzz" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Routing fields:
|
||||||
|
|
||||||
|
- `match.channel`: `"feishu"`
|
||||||
|
- `match.peer.kind`: `"dm"` or `"group"`
|
||||||
|
- `match.peer.id`: user Open ID (`ou_xxx`) or group ID (`oc_xxx`)
|
||||||
|
|
||||||
|
See [Get group/user IDs](#get-groupuser-ids) for lookup tips.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -472,7 +540,8 @@ Key options:
|
||||||
| `channels.feishu.groups.<chat_id>.enabled` | Enable group | `true` |
|
| `channels.feishu.groups.<chat_id>.enabled` | Enable group | `true` |
|
||||||
| `channels.feishu.textChunkLimit` | Message chunk size | `2000` |
|
| `channels.feishu.textChunkLimit` | Message chunk size | `2000` |
|
||||||
| `channels.feishu.mediaMaxMb` | Media size limit | `30` |
|
| `channels.feishu.mediaMaxMb` | Media size limit | `30` |
|
||||||
| `channels.feishu.blockStreaming` | Disable streaming | `true` |
|
| `channels.feishu.streaming` | Enable streaming card output | `true` |
|
||||||
|
| `channels.feishu.blockStreaming` | Enable block streaming | `true` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -492,6 +561,7 @@ Key options:
|
||||||
### Receive
|
### Receive
|
||||||
|
|
||||||
- ✅ Text
|
- ✅ Text
|
||||||
|
- ✅ Rich text (post)
|
||||||
- ✅ Images
|
- ✅ Images
|
||||||
- ✅ Files
|
- ✅ Files
|
||||||
- ✅ Audio
|
- ✅ Audio
|
||||||
|
|
|
||||||
|
|
@ -392,6 +392,23 @@ Two independent controls:
|
||||||
|
|
||||||
Most users want: `groupPolicy: "allowlist"` + `groupAllowFrom` + specific groups listed in `channels.telegram.groups`
|
Most users want: `groupPolicy: "allowlist"` + `groupAllowFrom` + specific groups listed in `channels.telegram.groups`
|
||||||
|
|
||||||
|
To allow **any group member** to talk in a specific group (while still keeping control commands restricted to authorized senders), set a per-group override:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
channels: {
|
||||||
|
telegram: {
|
||||||
|
groups: {
|
||||||
|
"-1001234567890": {
|
||||||
|
groupPolicy: "open",
|
||||||
|
requireMention: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## Long-polling vs webhook
|
## Long-polling vs webhook
|
||||||
|
|
||||||
- Default: long-polling (no public URL required).
|
- Default: long-polling (no public URL required).
|
||||||
|
|
@ -714,12 +731,14 @@ Provider options:
|
||||||
- `channels.telegram.groupPolicy`: `open | allowlist | disabled` (default: allowlist).
|
- `channels.telegram.groupPolicy`: `open | allowlist | disabled` (default: allowlist).
|
||||||
- `channels.telegram.groupAllowFrom`: group sender allowlist (ids/usernames).
|
- `channels.telegram.groupAllowFrom`: group sender allowlist (ids/usernames).
|
||||||
- `channels.telegram.groups`: per-group defaults + allowlist (use `"*"` for global defaults).
|
- `channels.telegram.groups`: per-group defaults + allowlist (use `"*"` for global defaults).
|
||||||
|
- `channels.telegram.groups.<id>.groupPolicy`: per-group override for groupPolicy (`open | allowlist | disabled`).
|
||||||
- `channels.telegram.groups.<id>.requireMention`: mention gating default.
|
- `channels.telegram.groups.<id>.requireMention`: mention gating default.
|
||||||
- `channels.telegram.groups.<id>.skills`: skill filter (omit = all skills, empty = none).
|
- `channels.telegram.groups.<id>.skills`: skill filter (omit = all skills, empty = none).
|
||||||
- `channels.telegram.groups.<id>.allowFrom`: per-group sender allowlist override.
|
- `channels.telegram.groups.<id>.allowFrom`: per-group sender allowlist override.
|
||||||
- `channels.telegram.groups.<id>.systemPrompt`: extra system prompt for the group.
|
- `channels.telegram.groups.<id>.systemPrompt`: extra system prompt for the group.
|
||||||
- `channels.telegram.groups.<id>.enabled`: disable the group when `false`.
|
- `channels.telegram.groups.<id>.enabled`: disable the group when `false`.
|
||||||
- `channels.telegram.groups.<id>.topics.<threadId>.*`: per-topic overrides (same fields as group).
|
- `channels.telegram.groups.<id>.topics.<threadId>.*`: per-topic overrides (same fields as group).
|
||||||
|
- `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: per-topic override for groupPolicy (`open | allowlist | disabled`).
|
||||||
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: per-topic mention gating override.
|
- `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: per-topic mention gating override.
|
||||||
- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist).
|
- `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist).
|
||||||
- `channels.telegram.accounts.<account>.capabilities.inlineButtons`: per-account override.
|
- `channels.telegram.accounts.<account>.capabilities.inlineButtons`: per-account override.
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,12 @@ title: "onboard"
|
||||||
|
|
||||||
Interactive onboarding wizard (local or remote Gateway setup).
|
Interactive onboarding wizard (local or remote Gateway setup).
|
||||||
|
|
||||||
Related:
|
## Related guides
|
||||||
|
|
||||||
- Wizard guide: [Onboarding](/start/onboarding)
|
- CLI onboarding hub: [Onboarding Wizard (CLI)](/start/wizard)
|
||||||
|
- CLI onboarding reference: [CLI Onboarding Reference](/start/wizard-cli-reference)
|
||||||
|
- CLI automation: [CLI Automation](/start/wizard-cli-automation)
|
||||||
|
- macOS onboarding: [Onboarding (macOS App)](/start/onboarding)
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|
@ -27,3 +30,14 @@ Flow notes:
|
||||||
- `quickstart`: minimal prompts, auto-generates a gateway token.
|
- `quickstart`: minimal prompts, auto-generates a gateway token.
|
||||||
- `manual`: full prompts for port/bind/auth (alias of `advanced`).
|
- `manual`: full prompts for port/bind/auth (alias of `advanced`).
|
||||||
- Fastest first chat: `openclaw dashboard` (Control UI, no channel setup).
|
- Fastest first chat: `openclaw dashboard` (Control UI, no channel setup).
|
||||||
|
|
||||||
|
## Common follow-up commands
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw configure
|
||||||
|
openclaw agents add <name>
|
||||||
|
```
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
`--json` does not imply non-interactive mode. Use `--non-interactive` for scripts.
|
||||||
|
</Note>
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ The default workspace layout uses two memory layers:
|
||||||
- **Only load in the main, private session** (never in group contexts).
|
- **Only load in the main, private session** (never in group contexts).
|
||||||
|
|
||||||
These files live under the workspace (`agents.defaults.workspace`, default
|
These files live under the workspace (`agents.defaults.workspace`, default
|
||||||
`~/clawd`). See [Agent workspace](/concepts/agent-workspace) for the full layout.
|
`~/.openclaw/workspace`). See [Agent workspace](/concepts/agent-workspace) for the full layout.
|
||||||
|
|
||||||
## When to write memory
|
## When to write memory
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ For model selection rules, see [/concepts/models](/concepts/models).
|
||||||
|
|
||||||
## Quick rules
|
## Quick rules
|
||||||
|
|
||||||
- Model refs use `provider/model` (example: `opencode/claude-opus-4-5`).
|
- Model refs use `provider/model` (example: `opencode/claude-opus-4-6`).
|
||||||
- If you set `agents.defaults.models`, it becomes the allowlist.
|
- If you set `agents.defaults.models`, it becomes the allowlist.
|
||||||
- CLI helpers: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
|
- CLI helpers: `openclaw onboard`, `openclaw models list`, `openclaw models set <provider/model>`.
|
||||||
|
|
||||||
|
|
@ -26,12 +26,12 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no**
|
||||||
|
|
||||||
- Provider: `openai`
|
- Provider: `openai`
|
||||||
- Auth: `OPENAI_API_KEY`
|
- Auth: `OPENAI_API_KEY`
|
||||||
- Example model: `openai/gpt-5.2`
|
- Example model: `openai/gpt-5.1-codex`
|
||||||
- CLI: `openclaw onboard --auth-choice openai-api-key`
|
- CLI: `openclaw onboard --auth-choice openai-api-key`
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "openai/gpt-5.2" } } },
|
agents: { defaults: { model: { primary: "openai/gpt-5.1-codex" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -39,12 +39,12 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no**
|
||||||
|
|
||||||
- Provider: `anthropic`
|
- Provider: `anthropic`
|
||||||
- Auth: `ANTHROPIC_API_KEY` or `claude setup-token`
|
- Auth: `ANTHROPIC_API_KEY` or `claude setup-token`
|
||||||
- Example model: `anthropic/claude-opus-4-5`
|
- Example model: `anthropic/claude-opus-4-6`
|
||||||
- CLI: `openclaw onboard --auth-choice token` (paste setup-token) or `openclaw models auth paste-token --provider anthropic`
|
- CLI: `openclaw onboard --auth-choice token` (paste setup-token) or `openclaw models auth paste-token --provider anthropic`
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -52,12 +52,12 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no**
|
||||||
|
|
||||||
- Provider: `openai-codex`
|
- Provider: `openai-codex`
|
||||||
- Auth: OAuth (ChatGPT)
|
- Auth: OAuth (ChatGPT)
|
||||||
- Example model: `openai-codex/gpt-5.2`
|
- Example model: `openai-codex/gpt-5.3-codex`
|
||||||
- CLI: `openclaw onboard --auth-choice openai-codex` or `openclaw models auth login --provider openai-codex`
|
- CLI: `openclaw onboard --auth-choice openai-codex` or `openclaw models auth login --provider openai-codex`
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "openai-codex/gpt-5.2" } } },
|
agents: { defaults: { model: { primary: "openai-codex/gpt-5.3-codex" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -65,12 +65,12 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no**
|
||||||
|
|
||||||
- Provider: `opencode`
|
- Provider: `opencode`
|
||||||
- Auth: `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`)
|
- Auth: `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`)
|
||||||
- Example model: `opencode/claude-opus-4-5`
|
- Example model: `opencode/claude-opus-4-6`
|
||||||
- CLI: `openclaw onboard --auth-choice opencode-zen`
|
- CLI: `openclaw onboard --auth-choice opencode-zen`
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "opencode/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "opencode/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -106,7 +106,7 @@ OpenClaw ships with the pi‑ai catalog. These providers require **no**
|
||||||
|
|
||||||
- Provider: `vercel-ai-gateway`
|
- Provider: `vercel-ai-gateway`
|
||||||
- Auth: `AI_GATEWAY_API_KEY`
|
- Auth: `AI_GATEWAY_API_KEY`
|
||||||
- Example model: `vercel-ai-gateway/anthropic/claude-opus-4.5`
|
- Example model: `vercel-ai-gateway/anthropic/claude-opus-4.6`
|
||||||
- CLI: `openclaw onboard --auth-choice ai-gateway-api-key`
|
- CLI: `openclaw onboard --auth-choice ai-gateway-api-key`
|
||||||
|
|
||||||
### Other built-in providers
|
### Other built-in providers
|
||||||
|
|
@ -309,7 +309,7 @@ Notes:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw onboard --auth-choice opencode-zen
|
openclaw onboard --auth-choice opencode-zen
|
||||||
openclaw models set opencode/claude-opus-4-5
|
openclaw models set opencode/claude-opus-4-6
|
||||||
openclaw models list
|
openclaw models list
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ Example allowlist config:
|
||||||
model: { primary: "anthropic/claude-sonnet-4-5" },
|
model: { primary: "anthropic/claude-sonnet-4-5" },
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-sonnet-4-5": { alias: "Sonnet" },
|
"anthropic/claude-sonnet-4-5": { alias: "Sonnet" },
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -221,7 +221,7 @@ Split by channel: route WhatsApp to a fast everyday agent and Telegram to an Opu
|
||||||
id: "opus",
|
id: "opus",
|
||||||
name: "Deep Work",
|
name: "Deep Work",
|
||||||
workspace: "~/.openclaw/workspace-opus",
|
workspace: "~/.openclaw/workspace-opus",
|
||||||
model: "anthropic/claude-opus-4-5",
|
model: "anthropic/claude-opus-4-6",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
@ -255,7 +255,7 @@ Keep WhatsApp on the fast agent, but route one DM to Opus:
|
||||||
id: "opus",
|
id: "opus",
|
||||||
name: "Deep Work",
|
name: "Deep Work",
|
||||||
workspace: "~/.openclaw/workspace-opus",
|
workspace: "~/.openclaw/workspace-opus",
|
||||||
model: "anthropic/claude-opus-4-5",
|
model: "anthropic/claude-opus-4-6",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,17 @@ Use `session.dmScope` to control how **direct messages** are grouped:
|
||||||
- `per-account-channel-peer`: isolate by account + channel + sender (recommended for multi-account inboxes).
|
- `per-account-channel-peer`: isolate by account + channel + sender (recommended for multi-account inboxes).
|
||||||
Use `session.identityLinks` to map provider-prefixed peer ids to a canonical identity so the same person shares a DM session across channels when using `per-peer`, `per-channel-peer`, or `per-account-channel-peer`.
|
Use `session.identityLinks` to map provider-prefixed peer ids to a canonical identity so the same person shares a DM session across channels when using `per-peer`, `per-channel-peer`, or `per-account-channel-peer`.
|
||||||
|
|
||||||
### Secure DM mode (recommended)
|
### Secure DM mode (recommended for multi-user setups)
|
||||||
|
|
||||||
If your agent can receive DMs from **multiple people** (pairing approvals for more than one sender, a DM allowlist with multiple entries, or `dmPolicy: "open"`), enable **secure DM mode** to avoid cross-user context leakage:
|
> **Security Warning:** If your agent can receive DMs from **multiple people**, you should strongly consider enabling secure DM mode. Without it, all users share the same conversation context, which can leak private information between users.
|
||||||
|
|
||||||
|
**Example of the problem with default settings:**
|
||||||
|
|
||||||
|
- Alice (`<SENDER_A>`) messages your agent about a private topic (for example, a medical appointment)
|
||||||
|
- Bob (`<SENDER_B>`) messages your agent asking "What were we talking about?"
|
||||||
|
- Because both DMs share the same session, the model may answer Bob using Alice's prior context.
|
||||||
|
|
||||||
|
**The fix:** Set `dmScope` to isolate sessions per user:
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
// ~/.openclaw/openclaw.json
|
// ~/.openclaw/openclaw.json
|
||||||
|
|
@ -31,11 +39,19 @@ If your agent can receive DMs from **multiple people** (pairing approvals for mo
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**When to enable this:**
|
||||||
|
|
||||||
|
- You have pairing approvals for more than one sender
|
||||||
|
- You use a DM allowlist with multiple entries
|
||||||
|
- You set `dmPolicy: "open"`
|
||||||
|
- Multiple phone numbers or accounts can message your agent
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
- Default is `dmScope: "main"` for continuity (all DMs share the main session).
|
- Default is `dmScope: "main"` for continuity (all DMs share the main session). This is fine for single-user setups.
|
||||||
- For multi-account inboxes on the same channel, prefer `per-account-channel-peer`.
|
- For multi-account inboxes on the same channel, prefer `per-account-channel-peer`.
|
||||||
- If the same person contacts you on multiple channels, use `session.identityLinks` to collapse their DM sessions into one canonical identity.
|
- If the same person contacts you on multiple channels, use `session.identityLinks` to collapse their DM sessions into one canonical identity.
|
||||||
|
- You can verify your DM settings with `openclaw security audit` (see [security](/cli/security)).
|
||||||
|
|
||||||
## Gateway is the source of truth
|
## Gateway is the source of truth
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
#content-area h1:first-of-type,
|
|
||||||
.prose h1:first-of-type {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
547
docs/docs.json
547
docs/docs.json
|
|
@ -338,6 +338,14 @@
|
||||||
"source": "/getting-started",
|
"source": "/getting-started",
|
||||||
"destination": "/start/getting-started"
|
"destination": "/start/getting-started"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"source": "/quickstart",
|
||||||
|
"destination": "/start/getting-started"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/start/quickstart",
|
||||||
|
"destination": "/start/getting-started"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"source": "/gmail-pubsub",
|
"source": "/gmail-pubsub",
|
||||||
"destination": "/automation/gmail-pubsub"
|
"destination": "/automation/gmail-pubsub"
|
||||||
|
|
@ -694,6 +702,18 @@
|
||||||
"source": "/wizard",
|
"source": "/wizard",
|
||||||
"destination": "/start/wizard"
|
"destination": "/start/wizard"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"source": "/start/wizard-cli-flow",
|
||||||
|
"destination": "/start/wizard-cli-reference"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/start/wizard-cli-auth",
|
||||||
|
"destination": "/start/wizard-cli-reference"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/start/wizard-cli-outputs",
|
||||||
|
"destination": "/start/wizard-cli-reference"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"source": "/start/faq",
|
"source": "/start/faq",
|
||||||
"destination": "/help/faq"
|
"destination": "/help/faq"
|
||||||
|
|
@ -707,20 +727,52 @@
|
||||||
"destination": "/plugin"
|
"destination": "/plugin"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "/install/railway",
|
"source": "/railway",
|
||||||
"destination": "/railway"
|
"destination": "/install/railway"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "/install/northflank",
|
"source": "/northflank",
|
||||||
"destination": "/northflank"
|
"destination": "/install/northflank"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "/install/northflank/",
|
"source": "/render",
|
||||||
"destination": "/northflank"
|
"destination": "/install/render"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"source": "/gcp",
|
"source": "/gcp",
|
||||||
"destination": "/platforms/gcp"
|
"destination": "/install/gcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/fly",
|
||||||
|
"destination": "/install/fly"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/hetzner",
|
||||||
|
"destination": "/install/hetzner"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/gcp",
|
||||||
|
"destination": "/install/gcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/macos-vm",
|
||||||
|
"destination": "/install/macos-vm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/exe-dev",
|
||||||
|
"destination": "/install/exe-dev"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/railway",
|
||||||
|
"destination": "/install/railway"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/render",
|
||||||
|
"destination": "/install/render"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"source": "/platforms/northflank",
|
||||||
|
"destination": "/install/northflank"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"navigation": {
|
"navigation": {
|
||||||
|
|
@ -733,46 +785,55 @@
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Overview",
|
"group": "Overview",
|
||||||
"pages": ["index", "concepts/features", "start/showcase", "start/lore"]
|
"pages": ["index", "concepts/features", "start/showcase"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Installation",
|
"group": "First steps",
|
||||||
|
"pages": ["start/getting-started", "start/wizard", "start/onboarding"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Guides",
|
||||||
|
"pages": ["start/openclaw"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab": "Install",
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"group": "Install overview",
|
||||||
|
"pages": ["install/index", "install/installer"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Install methods",
|
||||||
"pages": [
|
"pages": [
|
||||||
"install/index",
|
"install/node",
|
||||||
"install/installer",
|
|
||||||
"install/docker",
|
"install/docker",
|
||||||
"install/bun",
|
|
||||||
"install/nix",
|
"install/nix",
|
||||||
"install/ansible",
|
"install/ansible",
|
||||||
"install/development-channels",
|
"install/bun"
|
||||||
"install/updating",
|
|
||||||
"install/uninstall"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Setup",
|
"group": "Maintenance",
|
||||||
|
"pages": ["install/updating", "install/migrating", "install/uninstall"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Hosting and deployment",
|
||||||
"pages": [
|
"pages": [
|
||||||
"start/getting-started",
|
"install/fly",
|
||||||
"start/quickstart",
|
"install/hetzner",
|
||||||
"start/wizard",
|
"install/gcp",
|
||||||
"start/setup",
|
"install/macos-vm",
|
||||||
"start/onboarding",
|
"install/exe-dev",
|
||||||
"start/pairing",
|
"install/railway",
|
||||||
"start/openclaw",
|
"install/render",
|
||||||
"start/hubs",
|
"install/northflank"
|
||||||
"start/docs-directory"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Platforms",
|
"group": "Advanced",
|
||||||
"pages": [
|
"pages": ["install/development-channels"]
|
||||||
"platforms/index",
|
|
||||||
"platforms/macos",
|
|
||||||
"platforms/linux",
|
|
||||||
"platforms/windows",
|
|
||||||
"platforms/android",
|
|
||||||
"platforms/ios"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -806,6 +867,7 @@
|
||||||
{
|
{
|
||||||
"group": "Configuration",
|
"group": "Configuration",
|
||||||
"pages": [
|
"pages": [
|
||||||
|
"start/pairing",
|
||||||
"concepts/group-messages",
|
"concepts/group-messages",
|
||||||
"concepts/groups",
|
"concepts/groups",
|
||||||
"broadcast-groups",
|
"broadcast-groups",
|
||||||
|
|
@ -828,6 +890,7 @@
|
||||||
"concepts/system-prompt",
|
"concepts/system-prompt",
|
||||||
"concepts/context",
|
"concepts/context",
|
||||||
"concepts/agent-workspace",
|
"concepts/agent-workspace",
|
||||||
|
"start/bootstrapping",
|
||||||
"concepts/oauth"
|
"concepts/oauth"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -960,7 +1023,46 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Infrastructure",
|
"tab": "Platforms",
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"group": "Platforms overview",
|
||||||
|
"pages": [
|
||||||
|
"platforms/index",
|
||||||
|
"platforms/macos",
|
||||||
|
"platforms/linux",
|
||||||
|
"platforms/windows",
|
||||||
|
"platforms/android",
|
||||||
|
"platforms/ios"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "macOS companion app",
|
||||||
|
"pages": [
|
||||||
|
"platforms/mac/dev-setup",
|
||||||
|
"platforms/mac/menu-bar",
|
||||||
|
"platforms/mac/voicewake",
|
||||||
|
"platforms/mac/voice-overlay",
|
||||||
|
"platforms/mac/webchat",
|
||||||
|
"platforms/mac/canvas",
|
||||||
|
"platforms/mac/child-process",
|
||||||
|
"platforms/mac/health",
|
||||||
|
"platforms/mac/icon",
|
||||||
|
"platforms/mac/logging",
|
||||||
|
"platforms/mac/permissions",
|
||||||
|
"platforms/mac/remote",
|
||||||
|
"platforms/mac/signing",
|
||||||
|
"platforms/mac/release",
|
||||||
|
"platforms/mac/bundled-gateway",
|
||||||
|
"platforms/mac/xpc",
|
||||||
|
"platforms/mac/skills",
|
||||||
|
"platforms/mac/peekaboo"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab": "Gateway & Ops",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Gateway",
|
"group": "Gateway",
|
||||||
|
|
@ -1013,20 +1115,8 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Remote access and deployment",
|
"group": "Remote access",
|
||||||
"pages": [
|
"pages": ["gateway/remote", "gateway/remote-gateway-readme", "gateway/tailscale"]
|
||||||
"gateway/remote",
|
|
||||||
"gateway/remote-gateway-readme",
|
|
||||||
"gateway/tailscale",
|
|
||||||
"platforms/fly",
|
|
||||||
"platforms/hetzner",
|
|
||||||
"platforms/gcp",
|
|
||||||
"platforms/macos-vm",
|
|
||||||
"platforms/exe-dev",
|
|
||||||
"railway",
|
|
||||||
"render",
|
|
||||||
"northflank"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Security",
|
"group": "Security",
|
||||||
|
|
@ -1035,29 +1125,6 @@
|
||||||
{
|
{
|
||||||
"group": "Web interfaces",
|
"group": "Web interfaces",
|
||||||
"pages": ["web/index", "web/control-ui", "web/dashboard", "web/webchat", "tui"]
|
"pages": ["web/index", "web/control-ui", "web/dashboard", "web/webchat", "tui"]
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "macOS companion app",
|
|
||||||
"pages": [
|
|
||||||
"platforms/mac/dev-setup",
|
|
||||||
"platforms/mac/menu-bar",
|
|
||||||
"platforms/mac/voicewake",
|
|
||||||
"platforms/mac/voice-overlay",
|
|
||||||
"platforms/mac/webchat",
|
|
||||||
"platforms/mac/canvas",
|
|
||||||
"platforms/mac/child-process",
|
|
||||||
"platforms/mac/health",
|
|
||||||
"platforms/mac/icon",
|
|
||||||
"platforms/mac/logging",
|
|
||||||
"platforms/mac/permissions",
|
|
||||||
"platforms/mac/remote",
|
|
||||||
"platforms/mac/signing",
|
|
||||||
"platforms/mac/release",
|
|
||||||
"platforms/mac/bundled-gateway",
|
|
||||||
"platforms/mac/xpc",
|
|
||||||
"platforms/mac/skills",
|
|
||||||
"platforms/mac/peekaboo"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
@ -1126,6 +1193,7 @@
|
||||||
{
|
{
|
||||||
"group": "Technical reference",
|
"group": "Technical reference",
|
||||||
"pages": [
|
"pages": [
|
||||||
|
"reference/wizard",
|
||||||
"concepts/typebox",
|
"concepts/typebox",
|
||||||
"concepts/markdown-formatting",
|
"concepts/markdown-formatting",
|
||||||
"concepts/typing-indicators",
|
"concepts/typing-indicators",
|
||||||
|
|
@ -1151,6 +1219,10 @@
|
||||||
"group": "Help",
|
"group": "Help",
|
||||||
"pages": ["help/index", "help/troubleshooting", "help/faq"]
|
"pages": ["help/index", "help/troubleshooting", "help/faq"]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"group": "Community",
|
||||||
|
"pages": ["start/lore"]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"group": "Environment and debugging",
|
"group": "Environment and debugging",
|
||||||
"pages": [
|
"pages": [
|
||||||
|
|
@ -1160,6 +1232,14 @@
|
||||||
"scripts",
|
"scripts",
|
||||||
"reference/session-management-compaction"
|
"reference/session-management-compaction"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Developer workflows",
|
||||||
|
"pages": ["start/setup", "help/submitting-a-pr", "help/submitting-an-issue"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Docs meta",
|
||||||
|
"pages": ["start/hubs", "start/docs-directory"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
@ -1169,60 +1249,79 @@
|
||||||
"language": "zh-Hans",
|
"language": "zh-Hans",
|
||||||
"tabs": [
|
"tabs": [
|
||||||
{
|
{
|
||||||
"tab": "Get started",
|
"tab": "快速开始",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Overview",
|
"group": "概览",
|
||||||
"pages": ["zh-CN/index", "zh-CN/start/showcase", "zh-CN/start/lore"]
|
"pages": ["zh-CN/index", "zh-CN/concepts/features", "zh-CN/start/showcase"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Installation",
|
"group": "第一步",
|
||||||
"pages": [
|
|
||||||
"zh-CN/install/index",
|
|
||||||
"zh-CN/install/installer",
|
|
||||||
"zh-CN/install/docker",
|
|
||||||
"zh-CN/install/bun",
|
|
||||||
"zh-CN/install/nix",
|
|
||||||
"zh-CN/install/ansible",
|
|
||||||
"zh-CN/install/development-channels",
|
|
||||||
"zh-CN/install/updating",
|
|
||||||
"zh-CN/install/uninstall"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Setup",
|
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/start/getting-started",
|
"zh-CN/start/getting-started",
|
||||||
"zh-CN/start/wizard",
|
"zh-CN/start/wizard",
|
||||||
"zh-CN/start/setup",
|
"zh-CN/start/onboarding"
|
||||||
"zh-CN/start/onboarding",
|
|
||||||
"zh-CN/start/pairing",
|
|
||||||
"zh-CN/start/openclaw",
|
|
||||||
"zh-CN/start/hubs"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Platforms",
|
"group": "指南",
|
||||||
"pages": [
|
"pages": ["zh-CN/start/openclaw"]
|
||||||
"zh-CN/platforms/index",
|
|
||||||
"zh-CN/platforms/macos",
|
|
||||||
"zh-CN/platforms/linux",
|
|
||||||
"zh-CN/platforms/windows",
|
|
||||||
"zh-CN/platforms/android",
|
|
||||||
"zh-CN/platforms/ios"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Channels",
|
"tab": "安装",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Overview",
|
"group": "安装概览",
|
||||||
|
"pages": ["zh-CN/install/index", "zh-CN/install/installer"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "安装方式",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/install/node",
|
||||||
|
"zh-CN/install/docker",
|
||||||
|
"zh-CN/install/nix",
|
||||||
|
"zh-CN/install/ansible",
|
||||||
|
"zh-CN/install/bun"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "维护",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/install/updating",
|
||||||
|
"zh-CN/install/migrating",
|
||||||
|
"zh-CN/install/uninstall"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "托管与部署",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/install/fly",
|
||||||
|
"zh-CN/install/hetzner",
|
||||||
|
"zh-CN/install/gcp",
|
||||||
|
"zh-CN/install/macos-vm",
|
||||||
|
"zh-CN/install/exe-dev",
|
||||||
|
"zh-CN/install/railway",
|
||||||
|
"zh-CN/install/render",
|
||||||
|
"zh-CN/install/northflank"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "高级",
|
||||||
|
"pages": ["zh-CN/install/development-channels"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab": "消息渠道",
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"group": "概览",
|
||||||
"pages": ["zh-CN/channels/index"]
|
"pages": ["zh-CN/channels/index"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Messaging platforms",
|
"group": "消息平台",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/channels/whatsapp",
|
"zh-CN/channels/whatsapp",
|
||||||
"zh-CN/channels/telegram",
|
"zh-CN/channels/telegram",
|
||||||
|
|
@ -1242,8 +1341,9 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Configuration",
|
"group": "配置",
|
||||||
"pages": [
|
"pages": [
|
||||||
|
"zh-CN/start/pairing",
|
||||||
"zh-CN/concepts/group-messages",
|
"zh-CN/concepts/group-messages",
|
||||||
"zh-CN/concepts/groups",
|
"zh-CN/concepts/groups",
|
||||||
"zh-CN/broadcast-groups",
|
"zh-CN/broadcast-groups",
|
||||||
|
|
@ -1255,10 +1355,10 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Agents",
|
"tab": "代理",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Fundamentals",
|
"group": "基础",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/concepts/architecture",
|
"zh-CN/concepts/architecture",
|
||||||
"zh-CN/concepts/agent",
|
"zh-CN/concepts/agent",
|
||||||
|
|
@ -1270,7 +1370,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Sessions and memory",
|
"group": "会话与记忆",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/concepts/session",
|
"zh-CN/concepts/session",
|
||||||
"zh-CN/concepts/sessions",
|
"zh-CN/concepts/sessions",
|
||||||
|
|
@ -1281,11 +1381,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Multi-agent",
|
"group": "多代理",
|
||||||
"pages": ["zh-CN/concepts/multi-agent", "zh-CN/concepts/presence"]
|
"pages": ["zh-CN/concepts/multi-agent", "zh-CN/concepts/presence"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Messages and delivery",
|
"group": "消息与投递",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/concepts/messages",
|
"zh-CN/concepts/messages",
|
||||||
"zh-CN/concepts/streaming",
|
"zh-CN/concepts/streaming",
|
||||||
|
|
@ -1296,14 +1396,14 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Tools",
|
"tab": "工具",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Overview",
|
"group": "概览",
|
||||||
"pages": ["zh-CN/tools/index"]
|
"pages": ["zh-CN/tools/index"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Built-in tools",
|
"group": "内置工具",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/tools/lobster",
|
"zh-CN/tools/lobster",
|
||||||
"zh-CN/tools/llm-task",
|
"zh-CN/tools/llm-task",
|
||||||
|
|
@ -1316,7 +1416,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Browser",
|
"group": "浏览器",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/tools/browser",
|
"zh-CN/tools/browser",
|
||||||
"zh-CN/tools/browser-login",
|
"zh-CN/tools/browser-login",
|
||||||
|
|
@ -1325,7 +1425,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Agent coordination",
|
"group": "代理协作",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/tools/agent-send",
|
"zh-CN/tools/agent-send",
|
||||||
"zh-CN/tools/subagents",
|
"zh-CN/tools/subagents",
|
||||||
|
|
@ -1333,7 +1433,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Skills and extensions",
|
"group": "技能与扩展",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/tools/slash-commands",
|
"zh-CN/tools/slash-commands",
|
||||||
"zh-CN/tools/skills",
|
"zh-CN/tools/skills",
|
||||||
|
|
@ -1345,7 +1445,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Automation",
|
"group": "自动化",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/hooks",
|
"zh-CN/hooks",
|
||||||
"zh-CN/hooks/soul-evil",
|
"zh-CN/hooks/soul-evil",
|
||||||
|
|
@ -1358,7 +1458,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Media and devices",
|
"group": "媒体与设备",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/nodes/index",
|
"zh-CN/nodes/index",
|
||||||
"zh-CN/nodes/images",
|
"zh-CN/nodes/images",
|
||||||
|
|
@ -1372,10 +1472,10 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Models",
|
"tab": "模型",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Overview",
|
"group": "概览",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/providers/index",
|
"zh-CN/providers/index",
|
||||||
"zh-CN/providers/models",
|
"zh-CN/providers/models",
|
||||||
|
|
@ -1383,11 +1483,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Configuration",
|
"group": "配置",
|
||||||
"pages": ["zh-CN/concepts/model-providers", "zh-CN/concepts/model-failover"]
|
"pages": ["zh-CN/concepts/model-providers", "zh-CN/concepts/model-failover"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Providers",
|
"group": "提供商",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/providers/anthropic",
|
"zh-CN/providers/anthropic",
|
||||||
"zh-CN/providers/openai",
|
"zh-CN/providers/openai",
|
||||||
|
|
@ -1405,89 +1505,21 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Infrastructure",
|
"tab": "平台",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Gateway",
|
"group": "平台概览",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/gateway/index",
|
"zh-CN/platforms/index",
|
||||||
{
|
"zh-CN/platforms/macos",
|
||||||
"group": "Configuration and operations",
|
"zh-CN/platforms/linux",
|
||||||
"pages": [
|
"zh-CN/platforms/windows",
|
||||||
"zh-CN/gateway/configuration",
|
"zh-CN/platforms/android",
|
||||||
"zh-CN/gateway/configuration-examples",
|
"zh-CN/platforms/ios"
|
||||||
"zh-CN/gateway/authentication",
|
|
||||||
"zh-CN/gateway/health",
|
|
||||||
"zh-CN/gateway/heartbeat",
|
|
||||||
"zh-CN/gateway/doctor",
|
|
||||||
"zh-CN/gateway/logging",
|
|
||||||
"zh-CN/gateway/gateway-lock",
|
|
||||||
"zh-CN/gateway/background-process",
|
|
||||||
"zh-CN/gateway/multiple-gateways",
|
|
||||||
"zh-CN/gateway/troubleshooting"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Security and sandboxing",
|
|
||||||
"pages": [
|
|
||||||
"zh-CN/gateway/security/index",
|
|
||||||
"zh-CN/gateway/sandboxing",
|
|
||||||
"zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Protocols and APIs",
|
|
||||||
"pages": [
|
|
||||||
"zh-CN/gateway/protocol",
|
|
||||||
"zh-CN/gateway/bridge-protocol",
|
|
||||||
"zh-CN/gateway/openai-http-api",
|
|
||||||
"zh-CN/gateway/tools-invoke-http-api",
|
|
||||||
"zh-CN/gateway/cli-backends",
|
|
||||||
"zh-CN/gateway/local-models"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Networking and discovery",
|
|
||||||
"pages": [
|
|
||||||
"zh-CN/gateway/pairing",
|
|
||||||
"zh-CN/gateway/discovery",
|
|
||||||
"zh-CN/gateway/bonjour"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Remote access and deployment",
|
"group": "macOS 配套应用",
|
||||||
"pages": [
|
|
||||||
"zh-CN/gateway/remote",
|
|
||||||
"zh-CN/gateway/remote-gateway-readme",
|
|
||||||
"zh-CN/gateway/tailscale",
|
|
||||||
"zh-CN/platforms/fly",
|
|
||||||
"zh-CN/platforms/hetzner",
|
|
||||||
"zh-CN/platforms/gcp",
|
|
||||||
"zh-CN/platforms/macos-vm",
|
|
||||||
"zh-CN/platforms/exe-dev",
|
|
||||||
"zh-CN/railway",
|
|
||||||
"zh-CN/render",
|
|
||||||
"zh-CN/northflank"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Security",
|
|
||||||
"pages": ["zh-CN/security/formal-verification"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Web interfaces",
|
|
||||||
"pages": [
|
|
||||||
"zh-CN/web/index",
|
|
||||||
"zh-CN/web/control-ui",
|
|
||||||
"zh-CN/web/dashboard",
|
|
||||||
"zh-CN/web/webchat",
|
|
||||||
"zh-CN/tui"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "macOS companion app",
|
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/platforms/mac/dev-setup",
|
"zh-CN/platforms/mac/dev-setup",
|
||||||
"zh-CN/platforms/mac/menu-bar",
|
"zh-CN/platforms/mac/menu-bar",
|
||||||
|
|
@ -1512,10 +1544,87 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Reference",
|
"tab": "网关与运维",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "CLI commands",
|
"group": "网关",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/index",
|
||||||
|
{
|
||||||
|
"group": "配置与运维",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/configuration",
|
||||||
|
"zh-CN/gateway/configuration-examples",
|
||||||
|
"zh-CN/gateway/authentication",
|
||||||
|
"zh-CN/gateway/health",
|
||||||
|
"zh-CN/gateway/heartbeat",
|
||||||
|
"zh-CN/gateway/doctor",
|
||||||
|
"zh-CN/gateway/logging",
|
||||||
|
"zh-CN/gateway/gateway-lock",
|
||||||
|
"zh-CN/gateway/background-process",
|
||||||
|
"zh-CN/gateway/multiple-gateways",
|
||||||
|
"zh-CN/gateway/troubleshooting"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "安全与沙箱",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/security/index",
|
||||||
|
"zh-CN/gateway/sandboxing",
|
||||||
|
"zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "协议与 API",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/protocol",
|
||||||
|
"zh-CN/gateway/bridge-protocol",
|
||||||
|
"zh-CN/gateway/openai-http-api",
|
||||||
|
"zh-CN/gateway/tools-invoke-http-api",
|
||||||
|
"zh-CN/gateway/cli-backends",
|
||||||
|
"zh-CN/gateway/local-models"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "网络与发现",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/network-model",
|
||||||
|
"zh-CN/gateway/pairing",
|
||||||
|
"zh-CN/gateway/discovery",
|
||||||
|
"zh-CN/gateway/bonjour"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "远程访问",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/gateway/remote",
|
||||||
|
"zh-CN/gateway/remote-gateway-readme",
|
||||||
|
"zh-CN/gateway/tailscale"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "安全",
|
||||||
|
"pages": ["zh-CN/security/formal-verification"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "Web 界面",
|
||||||
|
"pages": [
|
||||||
|
"zh-CN/web/index",
|
||||||
|
"zh-CN/web/control-ui",
|
||||||
|
"zh-CN/web/dashboard",
|
||||||
|
"zh-CN/web/webchat",
|
||||||
|
"zh-CN/tui"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tab": "参考",
|
||||||
|
"groups": [
|
||||||
|
{
|
||||||
|
"group": "CLI 命令",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/cli/index",
|
"zh-CN/cli/index",
|
||||||
"zh-CN/cli/agent",
|
"zh-CN/cli/agent",
|
||||||
|
|
@ -1556,11 +1665,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "RPC and API",
|
"group": "RPC 与 API",
|
||||||
"pages": ["zh-CN/reference/rpc", "zh-CN/reference/device-models"]
|
"pages": ["zh-CN/reference/rpc", "zh-CN/reference/device-models"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Templates",
|
"group": "模板",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/reference/AGENTS.default",
|
"zh-CN/reference/AGENTS.default",
|
||||||
"zh-CN/reference/templates/AGENTS",
|
"zh-CN/reference/templates/AGENTS",
|
||||||
|
|
@ -1574,7 +1683,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Technical reference",
|
"group": "技术参考",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/concepts/typebox",
|
"zh-CN/concepts/typebox",
|
||||||
"zh-CN/concepts/markdown-formatting",
|
"zh-CN/concepts/markdown-formatting",
|
||||||
|
|
@ -1585,20 +1694,28 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Release notes",
|
"group": "项目",
|
||||||
|
"pages": ["zh-CN/reference/credits"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "发布说明",
|
||||||
"pages": ["zh-CN/reference/RELEASING", "zh-CN/reference/test"]
|
"pages": ["zh-CN/reference/RELEASING", "zh-CN/reference/test"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tab": "Help",
|
"tab": "帮助",
|
||||||
"groups": [
|
"groups": [
|
||||||
{
|
{
|
||||||
"group": "Help",
|
"group": "帮助",
|
||||||
"pages": ["zh-CN/help/index", "zh-CN/help/troubleshooting", "zh-CN/help/faq"]
|
"pages": ["zh-CN/help/index", "zh-CN/help/troubleshooting", "zh-CN/help/faq"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"group": "Environment and debugging",
|
"group": "社区",
|
||||||
|
"pages": ["zh-CN/start/lore"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "环境与调试",
|
||||||
"pages": [
|
"pages": [
|
||||||
"zh-CN/environment",
|
"zh-CN/environment",
|
||||||
"zh-CN/debugging",
|
"zh-CN/debugging",
|
||||||
|
|
@ -1606,6 +1723,14 @@
|
||||||
"zh-CN/scripts",
|
"zh-CN/scripts",
|
||||||
"zh-CN/reference/session-management-compaction"
|
"zh-CN/reference/session-management-compaction"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "开发者工作流",
|
||||||
|
"pages": ["zh-CN/start/setup"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"group": "文档元信息",
|
||||||
|
"pages": ["zh-CN/start/hubs", "zh-CN/start/docs-directory"]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,13 +25,13 @@ want “always works” text responses without relying on external APIs.
|
||||||
You can use Claude Code CLI **without any config** (OpenClaw ships a built-in default):
|
You can use Claude Code CLI **without any config** (OpenClaw ships a built-in default):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw agent --message "hi" --model claude-cli/opus-4.5
|
openclaw agent --message "hi" --model claude-cli/opus-4.6
|
||||||
```
|
```
|
||||||
|
|
||||||
Codex CLI also works out of the box:
|
Codex CLI also works out of the box:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw agent --message "hi" --model codex-cli/gpt-5.2-codex
|
openclaw agent --message "hi" --model codex-cli/gpt-5.3-codex
|
||||||
```
|
```
|
||||||
|
|
||||||
If your gateway runs under launchd/systemd and PATH is minimal, add just the
|
If your gateway runs under launchd/systemd and PATH is minimal, add just the
|
||||||
|
|
@ -62,11 +62,12 @@ Add a CLI backend to your fallback list so it only runs when primary models fail
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-opus-4-5",
|
primary: "anthropic/claude-opus-4-6",
|
||||||
fallbacks: ["claude-cli/opus-4.5"],
|
fallbacks: ["claude-cli/opus-4.6", "claude-cli/opus-4.5"],
|
||||||
},
|
},
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
|
"claude-cli/opus-4.6": {},
|
||||||
"claude-cli/opus-4.5": {},
|
"claude-cli/opus-4.5": {},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -112,6 +113,7 @@ The provider id becomes the left side of your model ref:
|
||||||
input: "arg",
|
input: "arg",
|
||||||
modelArg: "--model",
|
modelArg: "--model",
|
||||||
modelAliases: {
|
modelAliases: {
|
||||||
|
"claude-opus-4-6": "opus",
|
||||||
"claude-opus-4-5": "opus",
|
"claude-opus-4-5": "opus",
|
||||||
"claude-sonnet-4-5": "sonnet",
|
"claude-sonnet-4-5": "sonnet",
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -226,13 +226,13 @@ Save to `~/.openclaw/openclaw.json` and you can DM the bot from that number.
|
||||||
userTimezone: "America/Chicago",
|
userTimezone: "America/Chicago",
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-sonnet-4-5",
|
primary: "anthropic/claude-sonnet-4-5",
|
||||||
fallbacks: ["anthropic/claude-opus-4-5", "openai/gpt-5.2"],
|
fallbacks: ["anthropic/claude-opus-4-6", "openai/gpt-5.2"],
|
||||||
},
|
},
|
||||||
imageModel: {
|
imageModel: {
|
||||||
primary: "openrouter/anthropic/claude-sonnet-4-5",
|
primary: "openrouter/anthropic/claude-sonnet-4-5",
|
||||||
},
|
},
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "opus" },
|
"anthropic/claude-opus-4-6": { alias: "opus" },
|
||||||
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
|
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
|
||||||
"openai/gpt-5.2": { alias: "gpt" },
|
"openai/gpt-5.2": { alias: "gpt" },
|
||||||
},
|
},
|
||||||
|
|
@ -496,7 +496,7 @@ If more than one person can DM your bot (multiple entries in `allowFrom`, pairin
|
||||||
workspace: "~/.openclaw/workspace",
|
workspace: "~/.openclaw/workspace",
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-sonnet-4-5",
|
primary: "anthropic/claude-sonnet-4-5",
|
||||||
fallbacks: ["anthropic/claude-opus-4-5"],
|
fallbacks: ["anthropic/claude-opus-4-6"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -534,7 +534,7 @@ If more than one person can DM your bot (multiple entries in `allowFrom`, pairin
|
||||||
agent: {
|
agent: {
|
||||||
workspace: "~/.openclaw/workspace",
|
workspace: "~/.openclaw/workspace",
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-opus-4-5",
|
primary: "anthropic/claude-opus-4-6",
|
||||||
fallbacks: ["minimax/MiniMax-M2.1"],
|
fallbacks: ["minimax/MiniMax-M2.1"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1547,8 +1547,8 @@ The `responsePrefix` string can include template variables that resolve dynamica
|
||||||
|
|
||||||
| Variable | Description | Example |
|
| Variable | Description | Example |
|
||||||
| ----------------- | ---------------------- | --------------------------- |
|
| ----------------- | ---------------------- | --------------------------- |
|
||||||
| `{model}` | Short model name | `claude-opus-4-5`, `gpt-4o` |
|
| `{model}` | Short model name | `claude-opus-4-6`, `gpt-4o` |
|
||||||
| `{modelFull}` | Full model identifier | `anthropic/claude-opus-4-5` |
|
| `{modelFull}` | Full model identifier | `anthropic/claude-opus-4-6` |
|
||||||
| `{provider}` | Provider name | `anthropic`, `openai` |
|
| `{provider}` | Provider name | `anthropic`, `openai` |
|
||||||
| `{thinkingLevel}` | Current thinking level | `high`, `low`, `off` |
|
| `{thinkingLevel}` | Current thinking level | `high`, `low`, `off` |
|
||||||
| `{identity.name}` | Agent identity name | (same as `"auto"` mode) |
|
| `{identity.name}` | Agent identity name | (same as `"auto"` mode) |
|
||||||
|
|
@ -1564,7 +1564,7 @@ Unresolved variables remain as literal text.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Example output: `[claude-opus-4-5 | think:high] Here's my response...`
|
Example output: `[claude-opus-4-6 | think:high] Here's my response...`
|
||||||
|
|
||||||
WhatsApp inbound prefix is configured via `channels.whatsapp.messagePrefix` (deprecated:
|
WhatsApp inbound prefix is configured via `channels.whatsapp.messagePrefix` (deprecated:
|
||||||
`messages.messagePrefix`). Default stays **unchanged**: `"[openclaw]"` when
|
`messages.messagePrefix`). Default stays **unchanged**: `"[openclaw]"` when
|
||||||
|
|
@ -1710,7 +1710,7 @@ Z.AI GLM-4.x models automatically enable thinking mode unless you:
|
||||||
OpenClaw also ships a few built-in alias shorthands. Defaults only apply when the model
|
OpenClaw also ships a few built-in alias shorthands. Defaults only apply when the model
|
||||||
is already present in `agents.defaults.models`:
|
is already present in `agents.defaults.models`:
|
||||||
|
|
||||||
- `opus` -> `anthropic/claude-opus-4-5`
|
- `opus` -> `anthropic/claude-opus-4-6`
|
||||||
- `sonnet` -> `anthropic/claude-sonnet-4-5`
|
- `sonnet` -> `anthropic/claude-sonnet-4-5`
|
||||||
- `gpt` -> `openai/gpt-5.2`
|
- `gpt` -> `openai/gpt-5.2`
|
||||||
- `gpt-mini` -> `openai/gpt-5-mini`
|
- `gpt-mini` -> `openai/gpt-5-mini`
|
||||||
|
|
@ -1719,18 +1719,18 @@ is already present in `agents.defaults.models`:
|
||||||
|
|
||||||
If you configure the same alias name (case-insensitive) yourself, your value wins (defaults never override).
|
If you configure the same alias name (case-insensitive) yourself, your value wins (defaults never override).
|
||||||
|
|
||||||
Example: Opus 4.5 primary with MiniMax M2.1 fallback (hosted MiniMax):
|
Example: Opus 4.6 primary with MiniMax M2.1 fallback (hosted MiniMax):
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "opus" },
|
"anthropic/claude-opus-4-6": { alias: "opus" },
|
||||||
"minimax/MiniMax-M2.1": { alias: "minimax" },
|
"minimax/MiniMax-M2.1": { alias: "minimax" },
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-opus-4-5",
|
primary: "anthropic/claude-opus-4-6",
|
||||||
fallbacks: ["minimax/MiniMax-M2.1"],
|
fallbacks: ["minimax/MiniMax-M2.1"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -1786,7 +1786,7 @@ Example:
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
"anthropic/claude-sonnet-4-1": { alias: "Sonnet" },
|
"anthropic/claude-sonnet-4-1": { alias: "Sonnet" },
|
||||||
"openrouter/deepseek/deepseek-r1:free": {},
|
"openrouter/deepseek/deepseek-r1:free": {},
|
||||||
"zai/glm-4.7": {
|
"zai/glm-4.7": {
|
||||||
|
|
@ -1800,7 +1800,7 @@ Example:
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-opus-4-5",
|
primary: "anthropic/claude-opus-4-6",
|
||||||
fallbacks: [
|
fallbacks: [
|
||||||
"openrouter/deepseek/deepseek-r1:free",
|
"openrouter/deepseek/deepseek-r1:free",
|
||||||
"openrouter/meta-llama/llama-3.3-70b-instruct:free",
|
"openrouter/meta-llama/llama-3.3-70b-instruct:free",
|
||||||
|
|
@ -2011,7 +2011,7 @@ Typing indicators:
|
||||||
- `session.typingIntervalSeconds`: per-session override for the refresh interval.
|
- `session.typingIntervalSeconds`: per-session override for the refresh interval.
|
||||||
See [/concepts/typing-indicators](/concepts/typing-indicators) for behavior details.
|
See [/concepts/typing-indicators](/concepts/typing-indicators) for behavior details.
|
||||||
|
|
||||||
`agents.defaults.model.primary` should be set as `provider/model` (e.g. `anthropic/claude-opus-4-5`).
|
`agents.defaults.model.primary` should be set as `provider/model` (e.g. `anthropic/claude-opus-4-6`).
|
||||||
Aliases come from `agents.defaults.models.*.alias` (e.g. `Opus`).
|
Aliases come from `agents.defaults.models.*.alias` (e.g. `Opus`).
|
||||||
If you omit the provider, OpenClaw currently assumes `anthropic` as a temporary
|
If you omit the provider, OpenClaw currently assumes `anthropic` as a temporary
|
||||||
deprecation fallback.
|
deprecation fallback.
|
||||||
|
|
@ -2485,7 +2485,7 @@ the built-in `opencode` provider from pi-ai; set `OPENCODE_API_KEY` (or
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
- Model refs use `opencode/<modelId>` (example: `opencode/claude-opus-4-5`).
|
- Model refs use `opencode/<modelId>` (example: `opencode/claude-opus-4-6`).
|
||||||
- If you enable an allowlist via `agents.defaults.models`, add each model you plan to use.
|
- If you enable an allowlist via `agents.defaults.models`, add each model you plan to use.
|
||||||
- Shortcut: `openclaw onboard --auth-choice opencode-zen`.
|
- Shortcut: `openclaw onboard --auth-choice opencode-zen`.
|
||||||
|
|
||||||
|
|
@ -2493,8 +2493,8 @@ Notes:
|
||||||
{
|
{
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "opencode/claude-opus-4-5" },
|
model: { primary: "opencode/claude-opus-4-6" },
|
||||||
models: { "opencode/claude-opus-4-5": { alias: "Opus" } },
|
models: { "opencode/claude-opus-4-6": { alias: "Opus" } },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -2652,7 +2652,7 @@ Use MiniMax M2.1 directly without LM Studio:
|
||||||
agent: {
|
agent: {
|
||||||
model: { primary: "minimax/MiniMax-M2.1" },
|
model: { primary: "minimax/MiniMax-M2.1" },
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
"minimax/MiniMax-M2.1": { alias: "Minimax" },
|
"minimax/MiniMax-M2.1": { alias: "Minimax" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -3173,8 +3173,7 @@ Defaults:
|
||||||
Requests must include the hook token:
|
Requests must include the hook token:
|
||||||
|
|
||||||
- `Authorization: Bearer <token>` **or**
|
- `Authorization: Bearer <token>` **or**
|
||||||
- `x-openclaw-token: <token>` **or**
|
- `x-openclaw-token: <token>`
|
||||||
- `?token=<token>`
|
|
||||||
|
|
||||||
Endpoints:
|
Endpoints:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ and logged; a message that is only `HEARTBEAT_OK` is dropped.
|
||||||
defaults: {
|
defaults: {
|
||||||
heartbeat: {
|
heartbeat: {
|
||||||
every: "30m", // default: 30m (0m disables)
|
every: "30m", // default: 30m (0m disables)
|
||||||
model: "anthropic/claude-opus-4-5",
|
model: "anthropic/claude-opus-4-6",
|
||||||
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
|
includeReasoning: false, // default: false (deliver separate Reasoning: message when available)
|
||||||
target: "last", // last | none | <channel id> (core or plugin, e.g. "bluebubbles")
|
target: "last", // last | none | <channel id> (core or plugin, e.g. "bluebubbles")
|
||||||
to: "+15551234567", // optional channel-specific override
|
to: "+15551234567", // optional channel-specific override
|
||||||
|
|
@ -137,6 +137,30 @@ Example: two agents, only the second agent runs heartbeats.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Active hours example
|
||||||
|
|
||||||
|
Restrict heartbeats to business hours in a specific timezone:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
agents: {
|
||||||
|
defaults: {
|
||||||
|
heartbeat: {
|
||||||
|
every: "30m",
|
||||||
|
target: "last",
|
||||||
|
activeHours: {
|
||||||
|
start: "09:00",
|
||||||
|
end: "22:00",
|
||||||
|
timezone: "America/New_York", // optional; uses your userTimezone if set, otherwise host tz
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Outside this window (before 9am or after 10pm Eastern), heartbeats are skipped. The next scheduled tick inside the window will run normally.
|
||||||
|
|
||||||
### Multi account example
|
### Multi account example
|
||||||
|
|
||||||
Use `accountId` to target a specific account on multi-account channels like Telegram:
|
Use `accountId` to target a specific account on multi-account channels like Telegram:
|
||||||
|
|
@ -183,6 +207,11 @@ Use `accountId` to target a specific account on multi-account channels like Tele
|
||||||
- `accountId`: optional account id for multi-account channels. When `target: "last"`, the account id applies to the resolved last channel if it supports accounts; otherwise it is ignored. If the account id does not match a configured account for the resolved channel, delivery is skipped.
|
- `accountId`: optional account id for multi-account channels. When `target: "last"`, the account id applies to the resolved last channel if it supports accounts; otherwise it is ignored. If the account id does not match a configured account for the resolved channel, delivery is skipped.
|
||||||
- `prompt`: overrides the default prompt body (not merged).
|
- `prompt`: overrides the default prompt body (not merged).
|
||||||
- `ackMaxChars`: max chars allowed after `HEARTBEAT_OK` before delivery.
|
- `ackMaxChars`: max chars allowed after `HEARTBEAT_OK` before delivery.
|
||||||
|
- `activeHours`: restricts heartbeat runs to a time window. Object with `start` (HH:MM, inclusive), `end` (HH:MM exclusive; `24:00` allowed for end-of-day), and optional `timezone`.
|
||||||
|
- Omitted or `"user"`: uses your `agents.defaults.userTimezone` if set, otherwise falls back to the host system timezone.
|
||||||
|
- `"local"`: always uses the host system timezone.
|
||||||
|
- Any IANA identifier (e.g. `America/New_York`): used directly; if invalid, falls back to the `"user"` behavior above.
|
||||||
|
- Outside the active window, heartbeats are skipped until the next tick inside the window.
|
||||||
|
|
||||||
## Delivery behavior
|
## Delivery behavior
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ Best current local stack. Load MiniMax M2.1 in LM Studio, enable the local serve
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "lmstudio/minimax-m2.1-gs32" },
|
model: { primary: "lmstudio/minimax-m2.1-gs32" },
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
"lmstudio/minimax-m2.1-gs32": { alias: "Minimax" },
|
"lmstudio/minimax-m2.1-gs32": { alias: "Minimax" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -68,12 +68,12 @@ Keep hosted models configured even when running local; use `models.mode: "merge"
|
||||||
defaults: {
|
defaults: {
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-sonnet-4-5",
|
primary: "anthropic/claude-sonnet-4-5",
|
||||||
fallbacks: ["lmstudio/minimax-m2.1-gs32", "anthropic/claude-opus-4-5"],
|
fallbacks: ["lmstudio/minimax-m2.1-gs32", "anthropic/claude-opus-4-6"],
|
||||||
},
|
},
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-sonnet-4-5": { alias: "Sonnet" },
|
"anthropic/claude-sonnet-4-5": { alias: "Sonnet" },
|
||||||
"lmstudio/minimax-m2.1-gs32": { alias: "MiniMax Local" },
|
"lmstudio/minimax-m2.1-gs32": { alias: "MiniMax Local" },
|
||||||
"anthropic/claude-opus-4-5": { alias: "Opus" },
|
"anthropic/claude-opus-4-6": { alias: "Opus" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ Run the Gateway on a persistent host and reach it via **Tailscale** or SSH.
|
||||||
|
|
||||||
- **Best UX:** keep `gateway.bind: "loopback"` and use **Tailscale Serve** for the Control UI.
|
- **Best UX:** keep `gateway.bind: "loopback"` and use **Tailscale Serve** for the Control UI.
|
||||||
- **Fallback:** keep loopback + SSH tunnel from any machine that needs access.
|
- **Fallback:** keep loopback + SSH tunnel from any machine that needs access.
|
||||||
- **Examples:** [exe.dev](/platforms/exe-dev) (easy VM) or [Hetzner](/platforms/hetzner) (production VPS).
|
- **Examples:** [exe.dev](/install/exe-dev) (easy VM) or [Hetzner](/install/hetzner) (production VPS).
|
||||||
|
|
||||||
This is ideal when your laptop sleeps often but you want the agent always-on.
|
This is ideal when your laptop sleeps often but you want the agent always-on.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -243,7 +243,7 @@ Even with strong system prompts, **prompt injection is not solved**. System prom
|
||||||
- Run sensitive tool execution in a sandbox; keep secrets out of the agent’s reachable filesystem.
|
- Run sensitive tool execution in a sandbox; keep secrets out of the agent’s reachable filesystem.
|
||||||
- Note: sandboxing is opt-in. If sandbox mode is off, exec runs on the gateway host even though tools.exec.host defaults to sandbox, and host exec does not require approvals unless you set host=gateway and configure exec approvals.
|
- Note: sandboxing is opt-in. If sandbox mode is off, exec runs on the gateway host even though tools.exec.host defaults to sandbox, and host exec does not require approvals unless you set host=gateway and configure exec approvals.
|
||||||
- Limit high-risk tools (`exec`, `browser`, `web_fetch`, `web_search`) to trusted agents or explicit allowlists.
|
- Limit high-risk tools (`exec`, `browser`, `web_fetch`, `web_search`) to trusted agents or explicit allowlists.
|
||||||
- **Model choice matters:** older/legacy models can be less robust against prompt injection and tool misuse. Prefer modern, instruction-hardened models for any bot with tools. We recommend Anthropic Opus 4.5 because it’s quite good at recognizing prompt injections (see [“A step forward on safety”](https://www.anthropic.com/news/claude-opus-4-5)).
|
- **Model choice matters:** older/legacy models can be less robust against prompt injection and tool misuse. Prefer modern, instruction-hardened models for any bot with tools. We recommend Anthropic Opus 4.6 (or the latest Opus) because it’s strong at recognizing prompt injections (see [“A step forward on safety”](https://www.anthropic.com/news/claude-opus-4-5)).
|
||||||
|
|
||||||
Red flags to treat as untrusted:
|
Red flags to treat as untrusted:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ Quick answers plus deeper troubleshooting for real-world setups (local dev, VPS,
|
||||||
- [Can I use self-hosted models (llama.cpp, vLLM, Ollama)?](#can-i-use-selfhosted-models-llamacpp-vllm-ollama)
|
- [Can I use self-hosted models (llama.cpp, vLLM, Ollama)?](#can-i-use-selfhosted-models-llamacpp-vllm-ollama)
|
||||||
- [What do OpenClaw, Flawd, and Krill use for models?](#what-do-openclaw-flawd-and-krill-use-for-models)
|
- [What do OpenClaw, Flawd, and Krill use for models?](#what-do-openclaw-flawd-and-krill-use-for-models)
|
||||||
- [How do I switch models on the fly (without restarting)?](#how-do-i-switch-models-on-the-fly-without-restarting)
|
- [How do I switch models on the fly (without restarting)?](#how-do-i-switch-models-on-the-fly-without-restarting)
|
||||||
- [Can I use GPT 5.2 for daily tasks and Codex 5.2 for coding](#can-i-use-gpt-52-for-daily-tasks-and-codex-52-for-coding)
|
- [Can I use GPT 5.2 for daily tasks and Codex 5.3 for coding](#can-i-use-gpt-52-for-daily-tasks-and-codex-53-for-coding)
|
||||||
- [Why do I see "Model … is not allowed" and then no reply?](#why-do-i-see-model-is-not-allowed-and-then-no-reply)
|
- [Why do I see "Model … is not allowed" and then no reply?](#why-do-i-see-model-is-not-allowed-and-then-no-reply)
|
||||||
- [Why do I see "Unknown model: minimax/MiniMax-M2.1"?](#why-do-i-see-unknown-model-minimaxminimaxm21)
|
- [Why do I see "Unknown model: minimax/MiniMax-M2.1"?](#why-do-i-see-unknown-model-minimaxminimaxm21)
|
||||||
- [Can I use MiniMax as my default and OpenAI for complex tasks?](#can-i-use-minimax-as-my-default-and-openai-for-complex-tasks)
|
- [Can I use MiniMax as my default and OpenAI for complex tasks?](#can-i-use-minimax-as-my-default-and-openai-for-complex-tasks)
|
||||||
|
|
@ -334,21 +334,21 @@ If you don't have a global install yet, run it via `pnpm openclaw onboard`.
|
||||||
|
|
||||||
### How do I open the dashboard after onboarding
|
### How do I open the dashboard after onboarding
|
||||||
|
|
||||||
The wizard now opens your browser with a tokenized dashboard URL right after onboarding and also prints the full link (with token) in the summary. Keep that tab open; if it didn't launch, copy/paste the printed URL on the same machine. Tokens stay local to your host-nothing is fetched from the browser.
|
The wizard opens your browser with a clean (non-tokenized) dashboard URL right after onboarding and also prints the link in the summary. Keep that tab open; if it didn't launch, copy/paste the printed URL on the same machine.
|
||||||
|
|
||||||
### How do I authenticate the dashboard token on localhost vs remote
|
### How do I authenticate the dashboard token on localhost vs remote
|
||||||
|
|
||||||
**Localhost (same machine):**
|
**Localhost (same machine):**
|
||||||
|
|
||||||
- Open `http://127.0.0.1:18789/`.
|
- Open `http://127.0.0.1:18789/`.
|
||||||
- If it asks for auth, run `openclaw dashboard` and use the tokenized link (`?token=...`).
|
- If it asks for auth, paste the token from `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`) into Control UI settings.
|
||||||
- The token is the same value as `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`) and is stored by the UI after first load.
|
- Retrieve it from the gateway host: `openclaw config get gateway.auth.token` (or generate one: `openclaw doctor --generate-gateway-token`).
|
||||||
|
|
||||||
**Not on localhost:**
|
**Not on localhost:**
|
||||||
|
|
||||||
- **Tailscale Serve** (recommended): keep bind loopback, run `openclaw gateway --tailscale serve`, open `https://<magicdns>/`. If `gateway.auth.allowTailscale` is `true`, identity headers satisfy auth (no token).
|
- **Tailscale Serve** (recommended): keep bind loopback, run `openclaw gateway --tailscale serve`, open `https://<magicdns>/`. If `gateway.auth.allowTailscale` is `true`, identity headers satisfy auth (no token).
|
||||||
- **Tailnet bind**: run `openclaw gateway --bind tailnet --token "<token>"`, open `http://<tailscale-ip>:18789/`, paste token in dashboard settings.
|
- **Tailnet bind**: run `openclaw gateway --bind tailnet --token "<token>"`, open `http://<tailscale-ip>:18789/`, paste token in dashboard settings.
|
||||||
- **SSH tunnel**: `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/?token=...` from `openclaw dashboard`.
|
- **SSH tunnel**: `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/` and paste the token in Control UI settings.
|
||||||
|
|
||||||
See [Dashboard](/web/dashboard) and [Web surfaces](/web) for bind modes and auth details.
|
See [Dashboard](/web/dashboard) and [Web surfaces](/web) for bind modes and auth details.
|
||||||
|
|
||||||
|
|
@ -591,7 +591,7 @@ Short answer: follow the Linux guide, then run the onboarding wizard.
|
||||||
|
|
||||||
Any Linux VPS works. Install on the server, then use SSH/Tailscale to reach the Gateway.
|
Any Linux VPS works. Install on the server, then use SSH/Tailscale to reach the Gateway.
|
||||||
|
|
||||||
Guides: [exe.dev](/platforms/exe-dev), [Hetzner](/platforms/hetzner), [Fly.io](/platforms/fly).
|
Guides: [exe.dev](/install/exe-dev), [Hetzner](/install/hetzner), [Fly.io](/install/fly).
|
||||||
Remote access: [Gateway remote](/gateway/remote).
|
Remote access: [Gateway remote](/gateway/remote).
|
||||||
|
|
||||||
### Where are the cloudVPS install guides
|
### Where are the cloudVPS install guides
|
||||||
|
|
@ -599,9 +599,9 @@ Remote access: [Gateway remote](/gateway/remote).
|
||||||
We keep a **hosting hub** with the common providers. Pick one and follow the guide:
|
We keep a **hosting hub** with the common providers. Pick one and follow the guide:
|
||||||
|
|
||||||
- [VPS hosting](/vps) (all providers in one place)
|
- [VPS hosting](/vps) (all providers in one place)
|
||||||
- [Fly.io](/platforms/fly)
|
- [Fly.io](/install/fly)
|
||||||
- [Hetzner](/platforms/hetzner)
|
- [Hetzner](/install/hetzner)
|
||||||
- [exe.dev](/platforms/exe-dev)
|
- [exe.dev](/install/exe-dev)
|
||||||
|
|
||||||
How it works in the cloud: the **Gateway runs on the server**, and you access it
|
How it works in the cloud: the **Gateway runs on the server**, and you access it
|
||||||
from your laptop/phone via the Control UI (or Tailscale/SSH). Your state + workspace
|
from your laptop/phone via the Control UI (or Tailscale/SSH). Your state + workspace
|
||||||
|
|
@ -707,7 +707,7 @@ Yes - via pi-ai's **Amazon Bedrock (Converse)** provider with **manual config**.
|
||||||
|
|
||||||
### How does Codex auth work
|
### How does Codex auth work
|
||||||
|
|
||||||
OpenClaw supports **OpenAI Code (Codex)** via OAuth (ChatGPT sign-in). The wizard can run the OAuth flow and will set the default model to `openai-codex/gpt-5.2` when appropriate. See [Model providers](/concepts/model-providers) and [Wizard](/start/wizard).
|
OpenClaw supports **OpenAI Code (Codex)** via OAuth (ChatGPT sign-in). The wizard can run the OAuth flow and will set the default model to `openai-codex/gpt-5.3-codex` when appropriate. See [Model providers](/concepts/model-providers) and [Wizard](/start/wizard).
|
||||||
|
|
||||||
### Do you support OpenAI subscription auth Codex OAuth
|
### Do you support OpenAI subscription auth Codex OAuth
|
||||||
|
|
||||||
|
|
@ -910,7 +910,7 @@ Baseline guidance:
|
||||||
|
|
||||||
If you are on Windows, **WSL2 is the easiest VM style setup** and has the best tooling
|
If you are on Windows, **WSL2 is the easiest VM style setup** and has the best tooling
|
||||||
compatibility. See [Windows](/platforms/windows), [VPS hosting](/vps).
|
compatibility. See [Windows](/platforms/windows), [VPS hosting](/vps).
|
||||||
If you are running macOS in a VM, see [macOS VM](/platforms/macos-vm).
|
If you are running macOS in a VM, see [macOS VM](/install/macos-vm).
|
||||||
|
|
||||||
## What is OpenClaw?
|
## What is OpenClaw?
|
||||||
|
|
||||||
|
|
@ -1936,11 +1936,11 @@ OpenClaw's default model is whatever you set as:
|
||||||
agents.defaults.model.primary
|
agents.defaults.model.primary
|
||||||
```
|
```
|
||||||
|
|
||||||
Models are referenced as `provider/model` (example: `anthropic/claude-opus-4-5`). If you omit the provider, OpenClaw currently assumes `anthropic` as a temporary deprecation fallback - but you should still **explicitly** set `provider/model`.
|
Models are referenced as `provider/model` (example: `anthropic/claude-opus-4-6`). If you omit the provider, OpenClaw currently assumes `anthropic` as a temporary deprecation fallback - but you should still **explicitly** set `provider/model`.
|
||||||
|
|
||||||
### What model do you recommend
|
### What model do you recommend
|
||||||
|
|
||||||
**Recommended default:** `anthropic/claude-opus-4-5`.
|
**Recommended default:** `anthropic/claude-opus-4-6`.
|
||||||
**Good alternative:** `anthropic/claude-sonnet-4-5`.
|
**Good alternative:** `anthropic/claude-sonnet-4-5`.
|
||||||
**Reliable (less character):** `openai/gpt-5.2` - nearly as good as Opus, just less personality.
|
**Reliable (less character):** `openai/gpt-5.2` - nearly as good as Opus, just less personality.
|
||||||
**Budget:** `zai/glm-4.7`.
|
**Budget:** `zai/glm-4.7`.
|
||||||
|
|
@ -1989,7 +1989,7 @@ Docs: [Models](/concepts/models), [Configure](/cli/configure), [Config](/cli/con
|
||||||
|
|
||||||
### What do OpenClaw, Flawd, and Krill use for models
|
### What do OpenClaw, Flawd, and Krill use for models
|
||||||
|
|
||||||
- **OpenClaw + Flawd:** Anthropic Opus (`anthropic/claude-opus-4-5`) - see [Anthropic](/providers/anthropic).
|
- **OpenClaw + Flawd:** Anthropic Opus (`anthropic/claude-opus-4-6`) - see [Anthropic](/providers/anthropic).
|
||||||
- **Krill:** MiniMax M2.1 (`minimax/MiniMax-M2.1`) - see [MiniMax](/providers/minimax).
|
- **Krill:** MiniMax M2.1 (`minimax/MiniMax-M2.1`) - see [MiniMax](/providers/minimax).
|
||||||
|
|
||||||
### How do I switch models on the fly without restarting
|
### How do I switch models on the fly without restarting
|
||||||
|
|
@ -2029,18 +2029,18 @@ It also shows the configured provider endpoint (`baseUrl`) and API mode (`api`)
|
||||||
Re-run `/model` **without** the `@profile` suffix:
|
Re-run `/model` **without** the `@profile` suffix:
|
||||||
|
|
||||||
```
|
```
|
||||||
/model anthropic/claude-opus-4-5
|
/model anthropic/claude-opus-4-6
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to return to the default, pick it from `/model` (or send `/model <default provider/model>`).
|
If you want to return to the default, pick it from `/model` (or send `/model <default provider/model>`).
|
||||||
Use `/model status` to confirm which auth profile is active.
|
Use `/model status` to confirm which auth profile is active.
|
||||||
|
|
||||||
### Can I use GPT 5.2 for daily tasks and Codex 5.2 for coding
|
### Can I use GPT 5.2 for daily tasks and Codex 5.3 for coding
|
||||||
|
|
||||||
Yes. Set one as default and switch as needed:
|
Yes. Set one as default and switch as needed:
|
||||||
|
|
||||||
- **Quick switch (per session):** `/model gpt-5.2` for daily tasks, `/model gpt-5.2-codex` for coding.
|
- **Quick switch (per session):** `/model gpt-5.2` for daily tasks, `/model gpt-5.3-codex` for coding.
|
||||||
- **Default + switch:** set `agents.defaults.model.primary` to `openai-codex/gpt-5.2`, then switch to `openai-codex/gpt-5.2-codex` when coding (or the other way around).
|
- **Default + switch:** set `agents.defaults.model.primary` to `openai/gpt-5.2`, then switch to `openai-codex/gpt-5.3-codex` when coding (or the other way around).
|
||||||
- **Sub-agents:** route coding tasks to sub-agents with a different default model.
|
- **Sub-agents:** route coding tasks to sub-agents with a different default model.
|
||||||
|
|
||||||
See [Models](/concepts/models) and [Slash commands](/tools/slash-commands).
|
See [Models](/concepts/models) and [Slash commands](/tools/slash-commands).
|
||||||
|
|
@ -2118,7 +2118,7 @@ Docs: [Models](/concepts/models), [Multi-Agent Routing](/concepts/multi-agent),
|
||||||
|
|
||||||
Yes. OpenClaw ships a few default shorthands (only applied when the model exists in `agents.defaults.models`):
|
Yes. OpenClaw ships a few default shorthands (only applied when the model exists in `agents.defaults.models`):
|
||||||
|
|
||||||
- `opus` → `anthropic/claude-opus-4-5`
|
- `opus` → `anthropic/claude-opus-4-6`
|
||||||
- `sonnet` → `anthropic/claude-sonnet-4-5`
|
- `sonnet` → `anthropic/claude-sonnet-4-5`
|
||||||
- `gpt` → `openai/gpt-5.2`
|
- `gpt` → `openai/gpt-5.2`
|
||||||
- `gpt-mini` → `openai/gpt-5-mini`
|
- `gpt-mini` → `openai/gpt-5-mini`
|
||||||
|
|
@ -2135,9 +2135,9 @@ Aliases come from `agents.defaults.models.<modelId>.alias`. Example:
|
||||||
{
|
{
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "anthropic/claude-opus-4-5" },
|
model: { primary: "anthropic/claude-opus-4-6" },
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "opus" },
|
"anthropic/claude-opus-4-6": { alias: "opus" },
|
||||||
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
|
"anthropic/claude-sonnet-4-5": { alias: "sonnet" },
|
||||||
"anthropic/claude-haiku-4-5": { alias: "haiku" },
|
"anthropic/claude-haiku-4-5": { alias: "haiku" },
|
||||||
},
|
},
|
||||||
|
|
@ -2383,15 +2383,14 @@ Your gateway is running with auth enabled (`gateway.auth.*`), but the UI is not
|
||||||
Facts (from code):
|
Facts (from code):
|
||||||
|
|
||||||
- The Control UI stores the token in browser localStorage key `openclaw.control.settings.v1`.
|
- The Control UI stores the token in browser localStorage key `openclaw.control.settings.v1`.
|
||||||
- The UI can import `?token=...` (and/or `?password=...`) once, then strips it from the URL.
|
|
||||||
|
|
||||||
Fix:
|
Fix:
|
||||||
|
|
||||||
- Fastest: `openclaw dashboard` (prints + copies tokenized link, tries to open; shows SSH hint if headless).
|
- Fastest: `openclaw dashboard` (prints + copies the dashboard URL, tries to open; shows SSH hint if headless).
|
||||||
- If you don't have a token yet: `openclaw doctor --generate-gateway-token`.
|
- If you don't have a token yet: `openclaw doctor --generate-gateway-token`.
|
||||||
- If remote, tunnel first: `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/?token=...`.
|
- If remote, tunnel first: `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/`.
|
||||||
- Set `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`) on the gateway host.
|
- Set `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`) on the gateway host.
|
||||||
- In the Control UI settings, paste the same token (or refresh with a one-time `?token=...` link).
|
- In the Control UI settings, paste the same token.
|
||||||
- Still stuck? Run `openclaw status --all` and follow [Troubleshooting](/gateway/troubleshooting). See [Dashboard](/web/dashboard) for auth details.
|
- Still stuck? Run `openclaw status --all` and follow [Troubleshooting](/gateway/troubleshooting). See [Dashboard](/web/dashboard) for auth details.
|
||||||
|
|
||||||
### I set gatewaybind tailnet but it cant bind nothing listens
|
### I set gatewaybind tailnet but it cant bind nothing listens
|
||||||
|
|
@ -2823,7 +2822,7 @@ You can add options like `debounce:2s cap:25 drop:summarize` for followup modes.
|
||||||
|
|
||||||
**Q: "What's the default model for Anthropic with an API key?"**
|
**Q: "What's the default model for Anthropic with an API key?"**
|
||||||
|
|
||||||
**A:** In OpenClaw, credentials and model selection are separate. Setting `ANTHROPIC_API_KEY` (or storing an Anthropic API key in auth profiles) enables authentication, but the actual default model is whatever you configure in `agents.defaults.model.primary` (for example, `anthropic/claude-sonnet-4-5` or `anthropic/claude-opus-4-5`). If you see `No credentials found for profile "anthropic:default"`, it means the Gateway couldn't find Anthropic credentials in the expected `auth-profiles.json` for the agent that's running.
|
**A:** In OpenClaw, credentials and model selection are separate. Setting `ANTHROPIC_API_KEY` (or storing an Anthropic API key in auth profiles) enables authentication, but the actual default model is whatever you configure in `agents.defaults.model.primary` (for example, `anthropic/claude-sonnet-4-5` or `anthropic/claude-opus-4-6`). If you see `No credentials found for profile "anthropic:default"`, it means the Gateway couldn't find Anthropic credentials in the expected `auth-profiles.json` for the agent that's running.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,214 @@
|
||||||
|
---
|
||||||
|
summary: "How to submit a high signal PR"
|
||||||
|
title: "Submitting a PR"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Submitting a PR
|
||||||
|
|
||||||
|
Good PRs make it easy for reviewers to understand intent, verify behavior, and land changes safely. This guide focuses on high-signal, low-noise submissions that work well with both human review and LLM-assisted review.
|
||||||
|
|
||||||
|
## What makes a good PR
|
||||||
|
|
||||||
|
- [ ] Clear intent: explain the problem, why it matters, and what the change does.
|
||||||
|
- [ ] Tight scope: keep changes focused and avoid drive-by refactors.
|
||||||
|
- [ ] Behavior summary: call out user-visible changes, config changes, and defaults.
|
||||||
|
- [ ] Tests: list what ran, what was skipped, and why.
|
||||||
|
- [ ] Evidence: include logs, screenshots, or short recordings for UI or workflows.
|
||||||
|
- [ ] Code word: include “lobster-biscuit” somewhere in the PR description to confirm you read this guide.
|
||||||
|
- [ ] Baseline checks: run the relevant `pnpm` commands for this repo and fix failures before opening the PR.
|
||||||
|
- [ ] Due diligence: search the codebase for existing functionality and check GitHub for related issues or prior fixes.
|
||||||
|
- [ ] Grounded in reality: claims should be backed by evidence, reproduction, or direct observation.
|
||||||
|
- [ ] Title guidance: use a verb + scope + outcome (for example `Docs: add PR and issue templates`).
|
||||||
|
|
||||||
|
Guideline: concision > grammar. Be terse if it makes review faster.
|
||||||
|
|
||||||
|
Baseline validation commands (run as appropriate for the change, and fix failures before submitting):
|
||||||
|
|
||||||
|
- `pnpm lint`
|
||||||
|
- `pnpm check`
|
||||||
|
- `pnpm build`
|
||||||
|
- `pnpm test`
|
||||||
|
- If you touch protocol code: `pnpm protocol:check`
|
||||||
|
|
||||||
|
## Progressive disclosure
|
||||||
|
|
||||||
|
Use a short top section, then deeper details as needed.
|
||||||
|
|
||||||
|
1. Summary and intent
|
||||||
|
2. Behavior changes and risks
|
||||||
|
3. Tests and verification
|
||||||
|
4. Implementation details and evidence
|
||||||
|
|
||||||
|
This keeps review fast while preserving deep context for anyone who needs it.
|
||||||
|
|
||||||
|
## Common PR types and expectations
|
||||||
|
|
||||||
|
- [ ] Fix: include clear repro, root cause summary, and verification steps.
|
||||||
|
- [ ] Feature: include use cases, behavior changes, and screenshots or demos when UI is involved.
|
||||||
|
- [ ] Refactor: explicitly state “no behavior change” and list what moved or was simplified.
|
||||||
|
- [ ] Chore/Maintenance: note why it matters (build time, CI stability, dependency hygiene).
|
||||||
|
- [ ] Docs: include before/after context and link to the updated page. Run `pnpm format`.
|
||||||
|
- [ ] Test: explain the gap it covers and how it prevents regressions.
|
||||||
|
- [ ] Perf: include baseline and after metrics, plus how they were measured.
|
||||||
|
- [ ] UX/UI: include screenshots or short recordings and any accessibility impact.
|
||||||
|
- [ ] Infra/Build: call out affected environments and how to validate.
|
||||||
|
- [ ] Security: include threat or risk summary, repro steps, and verification plan. Avoid sensitive data in public logs.
|
||||||
|
- [ ] Security: keep reports grounded in reality; avoid speculative claims.
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] Problem and intent are clear
|
||||||
|
- [ ] Scope is focused
|
||||||
|
- [ ] Behavior changes are listed
|
||||||
|
- [ ] Tests are listed with results
|
||||||
|
- [ ] Evidence is attached when needed
|
||||||
|
- [ ] No secrets or private data
|
||||||
|
- [ ] Grounded in reality: no guesswork or invented context.
|
||||||
|
|
||||||
|
## Template
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Behavior Changes
|
||||||
|
|
||||||
|
## Codebase and GitHub Search
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
## Evidence
|
||||||
|
```
|
||||||
|
|
||||||
|
## Templates by PR type
|
||||||
|
|
||||||
|
### Fix
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Repro Steps
|
||||||
|
|
||||||
|
## Root Cause
|
||||||
|
|
||||||
|
## Behavior Changes
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
## Evidence
|
||||||
|
```
|
||||||
|
|
||||||
|
### Feature
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Use Cases
|
||||||
|
|
||||||
|
## Behavior Changes
|
||||||
|
|
||||||
|
## Existing Functionality Check
|
||||||
|
|
||||||
|
I searched the codebase for existing functionality before implementing this.
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
## Evidence
|
||||||
|
```
|
||||||
|
|
||||||
|
### Refactor
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
## No Behavior Change Statement
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Chore/Maintenance
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Why This Matters
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docs
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Pages Updated
|
||||||
|
|
||||||
|
## Screenshots or Before/After
|
||||||
|
|
||||||
|
## Formatting
|
||||||
|
|
||||||
|
pnpm format
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Gap Covered
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Perf
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Baseline
|
||||||
|
|
||||||
|
## After
|
||||||
|
|
||||||
|
## Measurement Method
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### UX/UI
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Screenshots or Video
|
||||||
|
|
||||||
|
## Accessibility Impact
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Infra/Build
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Environments Affected
|
||||||
|
|
||||||
|
## Validation Steps
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Risk Summary
|
||||||
|
|
||||||
|
## Repro Steps
|
||||||
|
|
||||||
|
## Mitigation or Fix
|
||||||
|
|
||||||
|
## Verification
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
```
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
---
|
||||||
|
summary: "How to file high signal issues and bug reports"
|
||||||
|
title: "Submitting an Issue"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Submitting an Issue
|
||||||
|
|
||||||
|
Good issues make it easy to reproduce, diagnose, and fix problems quickly. This guide covers what to include for bugs, regressions, and feature gaps.
|
||||||
|
|
||||||
|
## What makes a good issue
|
||||||
|
|
||||||
|
- [ ] Clear title: include the area and the symptom.
|
||||||
|
- [ ] Repro steps: minimal steps that consistently reproduce the issue.
|
||||||
|
- [ ] Expected vs actual: what you thought would happen and what did.
|
||||||
|
- [ ] Impact: who is affected and how severe the problem is.
|
||||||
|
- [ ] Environment: OS, runtime, versions, and relevant config.
|
||||||
|
- [ ] Evidence: logs, screenshots, or recordings (redacted; prefer non-PII data).
|
||||||
|
- [ ] Scope: note if it is new, regression, or long-standing.
|
||||||
|
- [ ] Code word: include “lobster-biscuit” somewhere in the issue description to confirm you read this guide.
|
||||||
|
- [ ] Due diligence: search the codebase for existing functionality and check GitHub to see if the issue is already filed or fixed.
|
||||||
|
- [ ] I searched for existing and recently closed issues/PRs.
|
||||||
|
- [ ] For security reports: confirmed it has not already been fixed or addressed recently.
|
||||||
|
- [ ] Grounded in reality: claims should be backed by evidence, reproduction, or direct observation.
|
||||||
|
|
||||||
|
Guideline: concision > grammar. Be terse if it makes review faster.
|
||||||
|
|
||||||
|
Baseline validation commands (run as appropriate for the change, and fix failures before submitting a PR):
|
||||||
|
|
||||||
|
- `pnpm lint`
|
||||||
|
- `pnpm check`
|
||||||
|
- `pnpm build`
|
||||||
|
- `pnpm test`
|
||||||
|
- If you touch protocol code: `pnpm protocol:check`
|
||||||
|
|
||||||
|
## Templates
|
||||||
|
|
||||||
|
### Bug report
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Bug report checklist
|
||||||
|
|
||||||
|
- [ ] Minimal repro steps
|
||||||
|
- [ ] Expected vs actual
|
||||||
|
- [ ] Versions and environment
|
||||||
|
- [ ] Affected channels and where it does not reproduce
|
||||||
|
- [ ] Logs or screenshots
|
||||||
|
- [ ] Evidence is redacted and non-PII where possible
|
||||||
|
- [ ] Impact and severity
|
||||||
|
- [ ] Any known workarounds
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Repro Steps
|
||||||
|
|
||||||
|
## Expected
|
||||||
|
|
||||||
|
## Actual
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
## Logs or Evidence
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
## Workarounds
|
||||||
|
```
|
||||||
|
|
||||||
|
### Security issue
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
## Affected Versions
|
||||||
|
|
||||||
|
## Repro Steps (if safe to share)
|
||||||
|
|
||||||
|
## Mitigation or Workaround
|
||||||
|
|
||||||
|
## Evidence (redacted)
|
||||||
|
```
|
||||||
|
|
||||||
|
Security note: avoid posting secrets or exploit details in public issues. If the report is sensitive, keep repro details minimal and ask for a private disclosure path.
|
||||||
|
|
||||||
|
### Regression report
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Last Known Good
|
||||||
|
|
||||||
|
## First Known Bad
|
||||||
|
|
||||||
|
## Repro Steps
|
||||||
|
|
||||||
|
## Expected
|
||||||
|
|
||||||
|
## Actual
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
## Logs or Evidence
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
```
|
||||||
|
|
||||||
|
### Feature request
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
## Proposed Solution
|
||||||
|
|
||||||
|
## Alternatives Considered
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
|
||||||
|
## Evidence or Examples
|
||||||
|
```
|
||||||
|
|
||||||
|
### Enhancement request
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Current Behavior
|
||||||
|
|
||||||
|
## Desired Behavior
|
||||||
|
|
||||||
|
## Why This Matters
|
||||||
|
|
||||||
|
## Alternatives Considered
|
||||||
|
|
||||||
|
## Evidence or Examples
|
||||||
|
```
|
||||||
|
|
||||||
|
### Investigation request
|
||||||
|
|
||||||
|
```md
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
## Symptoms
|
||||||
|
|
||||||
|
## What Was Tried
|
||||||
|
|
||||||
|
## Environment
|
||||||
|
|
||||||
|
## Logs or Evidence
|
||||||
|
|
||||||
|
## Impact
|
||||||
|
```
|
||||||
|
|
||||||
|
## If you are submitting a fix PR
|
||||||
|
|
||||||
|
Creating a separate issue first is optional. If you skip it, include the relevant details in the PR description.
|
||||||
|
|
||||||
|
- Keep the PR focused on the issue.
|
||||||
|
- Include the issue number in the PR description.
|
||||||
|
- Add tests when possible, or explain why they are not feasible.
|
||||||
|
- Note any behavior changes and risks.
|
||||||
|
- Include redacted logs, screenshots, or videos that validate the fix.
|
||||||
|
- Run relevant `pnpm` validation commands and report results when appropriate.
|
||||||
|
|
@ -41,7 +41,20 @@ title: "OpenClaw"
|
||||||
</Card>
|
</Card>
|
||||||
</Columns>
|
</Columns>
|
||||||
|
|
||||||
OpenClaw connects chat apps to coding agents like Pi through a single Gateway process. It powers the OpenClaw assistant and supports local or remote setups.
|
## What is OpenClaw?
|
||||||
|
|
||||||
|
OpenClaw is a **self-hosted gateway** that connects your favorite chat apps — WhatsApp, Telegram, Discord, iMessage, and more — to AI coding agents like Pi. You run a single Gateway process on your own machine (or a server), and it becomes the bridge between your messaging apps and an always-available AI assistant.
|
||||||
|
|
||||||
|
**Who is it for?** Developers and power users who want a personal AI assistant they can message from anywhere — without giving up control of their data or relying on a hosted service.
|
||||||
|
|
||||||
|
**What makes it different?**
|
||||||
|
|
||||||
|
- **Self-hosted**: runs on your hardware, your rules
|
||||||
|
- **Multi-channel**: one Gateway serves WhatsApp, Telegram, Discord, and more simultaneously
|
||||||
|
- **Agent-native**: built for coding agents with tool use, sessions, memory, and multi-agent routing
|
||||||
|
- **Open source**: MIT licensed, community-driven
|
||||||
|
|
||||||
|
**What do you need?** Node 22+, an API key (Anthropic recommended), and 5 minutes.
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,14 +56,14 @@ After it finishes:
|
||||||
|
|
||||||
- Open `http://127.0.0.1:18789/` in your browser.
|
- Open `http://127.0.0.1:18789/` in your browser.
|
||||||
- Paste the token into the Control UI (Settings → token).
|
- Paste the token into the Control UI (Settings → token).
|
||||||
- Need the tokenized URL again? Run `docker compose run --rm openclaw-cli dashboard --no-open`.
|
- Need the URL again? Run `docker compose run --rm openclaw-cli dashboard --no-open`.
|
||||||
|
|
||||||
It writes config/workspace on the host:
|
It writes config/workspace on the host:
|
||||||
|
|
||||||
- `~/.openclaw/`
|
- `~/.openclaw/`
|
||||||
- `~/.openclaw/workspace`
|
- `~/.openclaw/workspace`
|
||||||
|
|
||||||
Running on a VPS? See [Hetzner (Docker VPS)](/platforms/hetzner).
|
Running on a VPS? See [Hetzner (Docker VPS)](/install/hetzner).
|
||||||
|
|
||||||
### Manual flow (compose)
|
### Manual flow (compose)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,9 +103,10 @@ server {
|
||||||
|
|
||||||
## 5) Access OpenClaw and grant privileges
|
## 5) Access OpenClaw and grant privileges
|
||||||
|
|
||||||
Access `https://<vm-name>.exe.xyz/?token=YOUR-TOKEN-FROM-TERMINAL` (see the Control UI output from onboarding). Approve
|
Access `https://<vm-name>.exe.xyz/` (see the Control UI output from onboarding). If it prompts for auth, paste the
|
||||||
devices with `openclaw devices list` and `openclaw devices approve <requestId>`. When in doubt,
|
token from `gateway.auth.token` on the VM (retrieve with `openclaw config get gateway.auth.token`, or generate one
|
||||||
use Shelley from your browser!
|
with `openclaw doctor --generate-gateway-token`). Approve devices with `openclaw devices list` and
|
||||||
|
`openclaw devices approve <requestId>`. When in doubt, use Shelley from your browser!
|
||||||
|
|
||||||
## Remote Access
|
## Remote Access
|
||||||
|
|
||||||
|
|
@ -148,7 +148,7 @@ cat > /data/openclaw.json << 'EOF'
|
||||||
"agents": {
|
"agents": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"model": {
|
"model": {
|
||||||
"primary": "anthropic/claude-opus-4-5",
|
"primary": "anthropic/claude-opus-4-6",
|
||||||
"fallbacks": ["anthropic/claude-sonnet-4-5", "openai/gpt-4o"]
|
"fallbacks": ["anthropic/claude-sonnet-4-5", "openai/gpt-4o"]
|
||||||
},
|
},
|
||||||
"maxConcurrent": 4
|
"maxConcurrent": 4
|
||||||
|
|
@ -3,10 +3,10 @@ summary: "Install OpenClaw (recommended installer, global install, or from sourc
|
||||||
read_when:
|
read_when:
|
||||||
- Installing OpenClaw
|
- Installing OpenClaw
|
||||||
- You want to install from GitHub
|
- You want to install from GitHub
|
||||||
title: "Install"
|
title: "Install Overview"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Install
|
# Install Overview
|
||||||
|
|
||||||
Use the installer unless you have a reason not to. It sets up the CLI and runs onboarding.
|
Use the installer unless you have a reason not to. It sets up the CLI and runs onboarding.
|
||||||
|
|
||||||
|
|
@ -102,6 +102,8 @@ openclaw onboard --install-daemon
|
||||||
|
|
||||||
Tip: if you don’t have a global install yet, run repo commands via `pnpm openclaw ...`.
|
Tip: if you don’t have a global install yet, run repo commands via `pnpm openclaw ...`.
|
||||||
|
|
||||||
|
For deeper development workflows, see [Setup](/start/setup).
|
||||||
|
|
||||||
### 4) Other install options
|
### 4) Other install options
|
||||||
|
|
||||||
- Docker: [Docker](/install/docker)
|
- Docker: [Docker](/install/docker)
|
||||||
|
|
|
||||||
|
|
@ -186,7 +186,7 @@ If you omit `capabilities`, the entry is eligible for the list it appears in.
|
||||||
**Image**
|
**Image**
|
||||||
|
|
||||||
- Prefer your active model if it supports images.
|
- Prefer your active model if it supports images.
|
||||||
- Good defaults: `openai/gpt-5.2`, `anthropic/claude-opus-4-5`, `google/gemini-3-pro-preview`.
|
- Good defaults: `openai/gpt-5.2`, `anthropic/claude-opus-4-6`, `google/gemini-3-pro-preview`.
|
||||||
|
|
||||||
**Audio**
|
**Audio**
|
||||||
|
|
||||||
|
|
@ -300,7 +300,7 @@ When `mode: "all"`, outputs are labeled `[Image 1/2]`, `[Audio 2/2]`, etc.
|
||||||
maxChars: 500,
|
maxChars: 500,
|
||||||
models: [
|
models: [
|
||||||
{ provider: "openai", model: "gpt-5.2" },
|
{ provider: "openai", model: "gpt-5.2" },
|
||||||
{ provider: "anthropic", model: "claude-opus-4-5" },
|
{ provider: "anthropic", model: "claude-opus-4-6" },
|
||||||
{
|
{
|
||||||
type: "cli",
|
type: "cli",
|
||||||
command: "gemini",
|
command: "gemini",
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ If you want a $0/month option and don’t mind ARM + provider-specific setup, se
|
||||||
**Picking a provider:**
|
**Picking a provider:**
|
||||||
|
|
||||||
- DigitalOcean: simplest UX + predictable setup (this guide)
|
- DigitalOcean: simplest UX + predictable setup (this guide)
|
||||||
- Hetzner: good price/perf (see [Hetzner guide](/platforms/hetzner))
|
- Hetzner: good price/perf (see [Hetzner guide](/install/hetzner))
|
||||||
- Oracle Cloud: can be $0/month, but is more finicky and ARM-only (see [Oracle guide](/platforms/oracle))
|
- Oracle Cloud: can be $0/month, but is more finicky and ARM-only (see [Oracle guide](/platforms/oracle))
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
@ -256,7 +256,7 @@ free -h
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- [Hetzner guide](/platforms/hetzner) — cheaper, more powerful
|
- [Hetzner guide](/install/hetzner) — cheaper, more powerful
|
||||||
- [Docker install](/install/docker) — containerized setup
|
- [Docker install](/install/docker) — containerized setup
|
||||||
- [Tailscale](/gateway/tailscale) — secure remote access
|
- [Tailscale](/gateway/tailscale) — secure remote access
|
||||||
- [Configuration](/gateway/configuration) — full config reference
|
- [Configuration](/gateway/configuration) — full config reference
|
||||||
|
|
|
||||||
|
|
@ -26,10 +26,10 @@ Native companion apps for Windows are also planned; the Gateway is recommended v
|
||||||
## VPS & hosting
|
## VPS & hosting
|
||||||
|
|
||||||
- VPS hub: [VPS hosting](/vps)
|
- VPS hub: [VPS hosting](/vps)
|
||||||
- Fly.io: [Fly.io](/platforms/fly)
|
- Fly.io: [Fly.io](/install/fly)
|
||||||
- Hetzner (Docker): [Hetzner](/platforms/hetzner)
|
- Hetzner (Docker): [Hetzner](/install/hetzner)
|
||||||
- GCP (Compute Engine): [GCP](/platforms/gcp)
|
- GCP (Compute Engine): [GCP](/install/gcp)
|
||||||
- exe.dev (VM + HTTPS proxy): [exe.dev](/platforms/exe-dev)
|
- exe.dev (VM + HTTPS proxy): [exe.dev](/install/exe-dev)
|
||||||
|
|
||||||
## Common links
|
## Common links
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ Native Linux companion apps are planned. Contributions are welcome if you want t
|
||||||
4. From your laptop: `ssh -N -L 18789:127.0.0.1:18789 <user>@<host>`
|
4. From your laptop: `ssh -N -L 18789:127.0.0.1:18789 <user>@<host>`
|
||||||
5. Open `http://127.0.0.1:18789/` and paste your token
|
5. Open `http://127.0.0.1:18789/` and paste your token
|
||||||
|
|
||||||
Step-by-step VPS guide: [exe.dev](/platforms/exe-dev)
|
Step-by-step VPS guide: [exe.dev](/install/exe-dev)
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,17 +34,17 @@ Notes:
|
||||||
# From repo root; set release IDs so Sparkle feed is enabled.
|
# From repo root; set release IDs so Sparkle feed is enabled.
|
||||||
# APP_BUILD must be numeric + monotonic for Sparkle compare.
|
# APP_BUILD must be numeric + monotonic for Sparkle compare.
|
||||||
BUNDLE_ID=bot.molt.mac \
|
BUNDLE_ID=bot.molt.mac \
|
||||||
APP_VERSION=2026.2.3 \
|
APP_VERSION=2026.2.4 \
|
||||||
APP_BUILD="$(git rev-list --count HEAD)" \
|
APP_BUILD="$(git rev-list --count HEAD)" \
|
||||||
BUILD_CONFIG=release \
|
BUILD_CONFIG=release \
|
||||||
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
|
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
|
||||||
scripts/package-mac-app.sh
|
scripts/package-mac-app.sh
|
||||||
|
|
||||||
# Zip for distribution (includes resource forks for Sparkle delta support)
|
# Zip for distribution (includes resource forks for Sparkle delta support)
|
||||||
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.2.3.zip
|
ditto -c -k --sequesterRsrc --keepParent dist/OpenClaw.app dist/OpenClaw-2026.2.4.zip
|
||||||
|
|
||||||
# Optional: also build a styled DMG for humans (drag to /Applications)
|
# Optional: also build a styled DMG for humans (drag to /Applications)
|
||||||
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.2.3.dmg
|
scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.2.4.dmg
|
||||||
|
|
||||||
# Recommended: build + notarize/staple zip + DMG
|
# Recommended: build + notarize/staple zip + DMG
|
||||||
# First, create a keychain profile once:
|
# First, create a keychain profile once:
|
||||||
|
|
@ -52,14 +52,14 @@ scripts/create-dmg.sh dist/OpenClaw.app dist/OpenClaw-2026.2.3.dmg
|
||||||
# --apple-id "<apple-id>" --team-id "<team-id>" --password "<app-specific-password>"
|
# --apple-id "<apple-id>" --team-id "<team-id>" --password "<app-specific-password>"
|
||||||
NOTARIZE=1 NOTARYTOOL_PROFILE=openclaw-notary \
|
NOTARIZE=1 NOTARYTOOL_PROFILE=openclaw-notary \
|
||||||
BUNDLE_ID=bot.molt.mac \
|
BUNDLE_ID=bot.molt.mac \
|
||||||
APP_VERSION=2026.2.3 \
|
APP_VERSION=2026.2.4 \
|
||||||
APP_BUILD="$(git rev-list --count HEAD)" \
|
APP_BUILD="$(git rev-list --count HEAD)" \
|
||||||
BUILD_CONFIG=release \
|
BUILD_CONFIG=release \
|
||||||
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
|
SIGN_IDENTITY="Developer ID Application: <Developer Name> (<TEAMID>)" \
|
||||||
scripts/package-mac-dist.sh
|
scripts/package-mac-dist.sh
|
||||||
|
|
||||||
# Optional: ship dSYM alongside the release
|
# Optional: ship dSYM alongside the release
|
||||||
ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenClaw-2026.2.3.dSYM.zip
|
ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenClaw-2026.2.4.dSYM.zip
|
||||||
```
|
```
|
||||||
|
|
||||||
## Appcast entry
|
## Appcast entry
|
||||||
|
|
@ -67,7 +67,7 @@ ditto -c -k --keepParent apps/macos/.build/release/OpenClaw.app.dSYM dist/OpenCl
|
||||||
Use the release note generator so Sparkle renders formatted HTML notes:
|
Use the release note generator so Sparkle renders formatted HTML notes:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.2.3.zip https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml
|
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-private-key scripts/make_appcast.sh dist/OpenClaw-2026.2.4.zip https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml
|
||||||
```
|
```
|
||||||
|
|
||||||
Generates HTML release notes from `CHANGELOG.md` (via [`scripts/changelog-to-html.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/changelog-to-html.sh)) and embeds them in the appcast entry.
|
Generates HTML release notes from `CHANGELOG.md` (via [`scripts/changelog-to-html.sh`](https://github.com/openclaw/openclaw/blob/main/scripts/changelog-to-html.sh)) and embeds them in the appcast entry.
|
||||||
|
|
@ -75,7 +75,7 @@ Commit the updated `appcast.xml` alongside the release assets (zip + dSYM) when
|
||||||
|
|
||||||
## Publish & verify
|
## Publish & verify
|
||||||
|
|
||||||
- Upload `OpenClaw-2026.2.3.zip` (and `OpenClaw-2026.2.3.dSYM.zip`) to the GitHub release for tag `v2026.2.3`.
|
- Upload `OpenClaw-2026.2.4.zip` (and `OpenClaw-2026.2.4.dSYM.zip`) to the GitHub release for tag `v2026.2.4`.
|
||||||
- Ensure the raw appcast URL matches the baked feed: `https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml`.
|
- Ensure the raw appcast URL matches the baked feed: `https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml`.
|
||||||
- Sanity checks:
|
- Sanity checks:
|
||||||
- `curl -I https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml` returns 200.
|
- `curl -I https://raw.githubusercontent.com/openclaw/openclaw/main/appcast.xml` returns 200.
|
||||||
|
|
|
||||||
|
|
@ -300,4 +300,4 @@ tar -czvf openclaw-backup.tar.gz ~/.openclaw ~/.openclaw/workspace
|
||||||
- [Tailscale integration](/gateway/tailscale) — full Tailscale docs
|
- [Tailscale integration](/gateway/tailscale) — full Tailscale docs
|
||||||
- [Gateway configuration](/gateway/configuration) — all config options
|
- [Gateway configuration](/gateway/configuration) — all config options
|
||||||
- [DigitalOcean guide](/platforms/digitalocean) — if you want paid + easier signup
|
- [DigitalOcean guide](/platforms/digitalocean) — if you want paid + easier signup
|
||||||
- [Hetzner guide](/platforms/hetzner) — Docker-based alternative
|
- [Hetzner guide](/install/hetzner) — Docker-based alternative
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,6 @@ echo 'wireless-power off' | sudo tee -a /etc/network/interfaces
|
||||||
|
|
||||||
- [Linux guide](/platforms/linux) — general Linux setup
|
- [Linux guide](/platforms/linux) — general Linux setup
|
||||||
- [DigitalOcean guide](/platforms/digitalocean) — cloud alternative
|
- [DigitalOcean guide](/platforms/digitalocean) — cloud alternative
|
||||||
- [Hetzner guide](/platforms/hetzner) — Docker setup
|
- [Hetzner guide](/install/hetzner) — Docker setup
|
||||||
- [Tailscale](/gateway/tailscale) — remote access
|
- [Tailscale](/gateway/tailscale) — remote access
|
||||||
- [Nodes](/nodes) — pair your laptop/phone with the Pi gateway
|
- [Nodes](/nodes) — pair your laptop/phone with the Pi gateway
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ openclaw onboard --anthropic-api-key "$ANTHROPIC_API_KEY"
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
env: { ANTHROPIC_API_KEY: "sk-ant-..." },
|
env: { ANTHROPIC_API_KEY: "sk-ant-..." },
|
||||||
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -54,7 +54,7 @@ Use the `cacheRetention` parameter in your model config:
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": {
|
"anthropic/claude-opus-4-6": {
|
||||||
params: { cacheRetention: "long" },
|
params: { cacheRetention: "long" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -114,7 +114,7 @@ openclaw onboard --auth-choice setup-token
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ See [Venice AI](/providers/venice).
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ Configure via CLI:
|
||||||
|
|
||||||
### MiniMax M2.1 as fallback (Opus primary)
|
### MiniMax M2.1 as fallback (Opus primary)
|
||||||
|
|
||||||
**Best for:** keep Opus 4.5 as primary, fail over to MiniMax M2.1.
|
**Best for:** keep Opus 4.6 as primary, fail over to MiniMax M2.1.
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
|
|
@ -104,11 +104,11 @@ Configure via CLI:
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
models: {
|
models: {
|
||||||
"anthropic/claude-opus-4-5": { alias: "opus" },
|
"anthropic/claude-opus-4-6": { alias: "opus" },
|
||||||
"minimax/MiniMax-M2.1": { alias: "minimax" },
|
"minimax/MiniMax-M2.1": { alias: "minimax" },
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
primary: "anthropic/claude-opus-4-5",
|
primary: "anthropic/claude-opus-4-6",
|
||||||
fallbacks: ["minimax/MiniMax-M2.1"],
|
fallbacks: ["minimax/MiniMax-M2.1"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ See [Venice AI](/providers/venice).
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "anthropic/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ Ollama is a local LLM runtime that makes it easy to run open-source models on yo
|
||||||
2. Pull a model:
|
2. Pull a model:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
ollama pull gpt-oss:20b
|
||||||
|
# or
|
||||||
ollama pull llama3.3
|
ollama pull llama3.3
|
||||||
# or
|
# or
|
||||||
ollama pull qwen2.5-coder:32b
|
ollama pull qwen2.5-coder:32b
|
||||||
|
|
@ -40,7 +42,7 @@ openclaw config set models.providers.ollama.apiKey "ollama-local"
|
||||||
{
|
{
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "ollama/llama3.3" },
|
model: { primary: "ollama/gpt-oss:20b" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
@ -105,8 +107,8 @@ Use explicit config when:
|
||||||
api: "openai-completions",
|
api: "openai-completions",
|
||||||
models: [
|
models: [
|
||||||
{
|
{
|
||||||
id: "llama3.3",
|
id: "gpt-oss:20b",
|
||||||
name: "Llama 3.3",
|
name: "GPT-OSS 20B",
|
||||||
reasoning: false,
|
reasoning: false,
|
||||||
input: ["text"],
|
input: ["text"],
|
||||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
||||||
|
|
@ -148,8 +150,8 @@ Once configured, all your Ollama models are available:
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: {
|
model: {
|
||||||
primary: "ollama/llama3.3",
|
primary: "ollama/gpt-oss:20b",
|
||||||
fallback: ["ollama/qwen2.5-coder:32b"],
|
fallbacks: ["ollama/llama3.3", "ollama/qwen2.5-coder:32b"],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -170,6 +172,48 @@ ollama pull deepseek-r1:32b
|
||||||
|
|
||||||
Ollama is free and runs locally, so all model costs are set to $0.
|
Ollama is free and runs locally, so all model costs are set to $0.
|
||||||
|
|
||||||
|
### Streaming Configuration
|
||||||
|
|
||||||
|
Due to a [known issue](https://github.com/badlogic/pi-mono/issues/1205) in the underlying SDK with Ollama's response format, **streaming is disabled by default** for Ollama models. This prevents corrupted responses when using tool-capable models.
|
||||||
|
|
||||||
|
When streaming is disabled, responses are delivered all at once (non-streaming mode), which avoids the issue where interleaved content/reasoning deltas cause garbled output.
|
||||||
|
|
||||||
|
#### Re-enable Streaming (Advanced)
|
||||||
|
|
||||||
|
If you want to re-enable streaming for Ollama (may cause issues with tool-capable models):
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
agents: {
|
||||||
|
defaults: {
|
||||||
|
models: {
|
||||||
|
"ollama/gpt-oss:20b": {
|
||||||
|
streaming: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Disable Streaming for Other Providers
|
||||||
|
|
||||||
|
You can also disable streaming for any provider if needed:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
agents: {
|
||||||
|
defaults: {
|
||||||
|
models: {
|
||||||
|
"openai/gpt-4": {
|
||||||
|
streaming: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Context windows
|
### Context windows
|
||||||
|
|
||||||
For auto-discovered models, OpenClaw uses the context window reported by Ollama when available, otherwise it defaults to `8192`. You can override `contextWindow` and `maxTokens` in explicit provider config.
|
For auto-discovered models, OpenClaw uses the context window reported by Ollama when available, otherwise it defaults to `8192`. You can override `contextWindow` and `maxTokens` in explicit provider config.
|
||||||
|
|
@ -201,7 +245,8 @@ To add models:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
ollama list # See what's installed
|
ollama list # See what's installed
|
||||||
ollama pull llama3.3 # Pull a model
|
ollama pull gpt-oss:20b # Pull a tool-capable model
|
||||||
|
ollama pull llama3.3 # Or another model
|
||||||
```
|
```
|
||||||
|
|
||||||
### Connection refused
|
### Connection refused
|
||||||
|
|
@ -216,6 +261,15 @@ ps aux | grep ollama
|
||||||
ollama serve
|
ollama serve
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Corrupted responses or tool names in output
|
||||||
|
|
||||||
|
If you see garbled responses containing tool names (like `sessions_send`, `memory_get`) or fragmented text when using Ollama models, this is due to an upstream SDK issue with streaming responses. **This is fixed by default** in the latest OpenClaw version by disabling streaming for Ollama models.
|
||||||
|
|
||||||
|
If you manually enabled streaming and experience this issue:
|
||||||
|
|
||||||
|
1. Remove the `streaming: true` configuration from your Ollama model entries, or
|
||||||
|
2. Explicitly set `streaming: false` for Ollama models (see [Streaming Configuration](#streaming-configuration))
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
- [Model Providers](/concepts/model-providers) - Overview of all providers
|
- [Model Providers](/concepts/model-providers) - Overview of all providers
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ openclaw onboard --openai-api-key "$OPENAI_API_KEY"
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
env: { OPENAI_API_KEY: "sk-..." },
|
env: { OPENAI_API_KEY: "sk-..." },
|
||||||
agents: { defaults: { model: { primary: "openai/gpt-5.2" } } },
|
agents: { defaults: { model: { primary: "openai/gpt-5.1-codex" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -52,7 +52,7 @@ openclaw models auth login --provider openai-codex
|
||||||
|
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
agents: { defaults: { model: { primary: "openai-codex/gpt-5.2" } } },
|
agents: { defaults: { model: { primary: "openai-codex/gpt-5.3-codex" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ openclaw onboard --opencode-zen-api-key "$OPENCODE_API_KEY"
|
||||||
```json5
|
```json5
|
||||||
{
|
{
|
||||||
env: { OPENCODE_API_KEY: "sk-..." },
|
env: { OPENCODE_API_KEY: "sk-..." },
|
||||||
agents: { defaults: { model: { primary: "opencode/claude-opus-4-5" } } },
|
agents: { defaults: { model: { primary: "opencode/claude-opus-4-6" } } },
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ openclaw onboard --auth-choice ai-gateway-api-key
|
||||||
{
|
{
|
||||||
agents: {
|
agents: {
|
||||||
defaults: {
|
defaults: {
|
||||||
model: { primary: "vercel-ai-gateway/anthropic/claude-opus-4.5" },
|
model: { primary: "vercel-ai-gateway/anthropic/claude-opus-4.6" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,268 @@
|
||||||
|
---
|
||||||
|
summary: "Full reference for the CLI onboarding wizard: every step, flag, and config field"
|
||||||
|
read_when:
|
||||||
|
- Looking up a specific wizard step or flag
|
||||||
|
- Automating onboarding with non-interactive mode
|
||||||
|
- Debugging wizard behavior
|
||||||
|
title: "Onboarding Wizard Reference"
|
||||||
|
sidebarTitle: "Wizard Reference"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Onboarding Wizard Reference
|
||||||
|
|
||||||
|
This is the full reference for the `openclaw onboard` CLI wizard.
|
||||||
|
For a high-level overview, see [Onboarding Wizard](/start/wizard).
|
||||||
|
|
||||||
|
## Flow details (local mode)
|
||||||
|
|
||||||
|
<Steps>
|
||||||
|
<Step title="Existing config detection">
|
||||||
|
- If `~/.openclaw/openclaw.json` exists, choose **Keep / Modify / Reset**.
|
||||||
|
- Re-running the wizard does **not** wipe anything unless you explicitly choose **Reset**
|
||||||
|
(or pass `--reset`).
|
||||||
|
- If the config is invalid or contains legacy keys, the wizard stops and asks
|
||||||
|
you to run `openclaw doctor` before continuing.
|
||||||
|
- Reset uses `trash` (never `rm`) and offers scopes:
|
||||||
|
- Config only
|
||||||
|
- Config + credentials + sessions
|
||||||
|
- Full reset (also removes workspace)
|
||||||
|
</Step>
|
||||||
|
<Step title="Model/Auth">
|
||||||
|
- **Anthropic API key (recommended)**: uses `ANTHROPIC_API_KEY` if present or prompts for a key, then saves it for daemon use.
|
||||||
|
- **Anthropic OAuth (Claude Code CLI)**: on macOS the wizard checks Keychain item "Claude Code-credentials" (choose "Always Allow" so launchd starts don't block); on Linux/Windows it reuses `~/.claude/.credentials.json` if present.
|
||||||
|
- **Anthropic token (paste setup-token)**: run `claude setup-token` on any machine, then paste the token (you can name it; blank = default).
|
||||||
|
- **OpenAI Code (Codex) subscription (Codex CLI)**: if `~/.codex/auth.json` exists, the wizard can reuse it.
|
||||||
|
- **OpenAI Code (Codex) subscription (OAuth)**: browser flow; paste the `code#state`.
|
||||||
|
- Sets `agents.defaults.model` to `openai-codex/gpt-5.2` when model is unset or `openai/*`.
|
||||||
|
- **OpenAI API key**: uses `OPENAI_API_KEY` if present or prompts for a key, then saves it to `~/.openclaw/.env` so launchd can read it.
|
||||||
|
- **OpenCode Zen (multi-model proxy)**: prompts for `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`, get it at https://opencode.ai/auth).
|
||||||
|
- **API key**: stores the key for you.
|
||||||
|
- **Vercel AI Gateway (multi-model proxy)**: prompts for `AI_GATEWAY_API_KEY`.
|
||||||
|
- More detail: [Vercel AI Gateway](/providers/vercel-ai-gateway)
|
||||||
|
- **Cloudflare AI Gateway**: prompts for Account ID, Gateway ID, and `CLOUDFLARE_AI_GATEWAY_API_KEY`.
|
||||||
|
- More detail: [Cloudflare AI Gateway](/providers/cloudflare-ai-gateway)
|
||||||
|
- **MiniMax M2.1**: config is auto-written.
|
||||||
|
- More detail: [MiniMax](/providers/minimax)
|
||||||
|
- **Synthetic (Anthropic-compatible)**: prompts for `SYNTHETIC_API_KEY`.
|
||||||
|
- More detail: [Synthetic](/providers/synthetic)
|
||||||
|
- **Moonshot (Kimi K2)**: config is auto-written.
|
||||||
|
- **Kimi Coding**: config is auto-written.
|
||||||
|
- More detail: [Moonshot AI (Kimi + Kimi Coding)](/providers/moonshot)
|
||||||
|
- **Skip**: no auth configured yet.
|
||||||
|
- Pick a default model from detected options (or enter provider/model manually).
|
||||||
|
- Wizard runs a model check and warns if the configured model is unknown or missing auth.
|
||||||
|
- OAuth credentials live in `~/.openclaw/credentials/oauth.json`; auth profiles live in `~/.openclaw/agents/<agentId>/agent/auth-profiles.json` (API keys + OAuth).
|
||||||
|
- More detail: [/concepts/oauth](/concepts/oauth)
|
||||||
|
<Note>
|
||||||
|
Headless/server tip: complete OAuth on a machine with a browser, then copy
|
||||||
|
`~/.openclaw/credentials/oauth.json` (or `$OPENCLAW_STATE_DIR/credentials/oauth.json`) to the
|
||||||
|
gateway host.
|
||||||
|
</Note>
|
||||||
|
</Step>
|
||||||
|
<Step title="Workspace">
|
||||||
|
- Default `~/.openclaw/workspace` (configurable).
|
||||||
|
- Seeds the workspace files needed for the agent bootstrap ritual.
|
||||||
|
- Full workspace layout + backup guide: [Agent workspace](/concepts/agent-workspace)
|
||||||
|
</Step>
|
||||||
|
<Step title="Gateway">
|
||||||
|
- Port, bind, auth mode, tailscale exposure.
|
||||||
|
- Auth recommendation: keep **Token** even for loopback so local WS clients must authenticate.
|
||||||
|
- Disable auth only if you fully trust every local process.
|
||||||
|
- Non‑loopback binds still require auth.
|
||||||
|
</Step>
|
||||||
|
<Step title="Channels">
|
||||||
|
- [WhatsApp](/channels/whatsapp): optional QR login.
|
||||||
|
- [Telegram](/channels/telegram): bot token.
|
||||||
|
- [Discord](/channels/discord): bot token.
|
||||||
|
- [Google Chat](/channels/googlechat): service account JSON + webhook audience.
|
||||||
|
- [Mattermost](/channels/mattermost) (plugin): bot token + base URL.
|
||||||
|
- [Signal](/channels/signal): optional `signal-cli` install + account config.
|
||||||
|
- [BlueBubbles](/channels/bluebubbles): **recommended for iMessage**; server URL + password + webhook.
|
||||||
|
- [iMessage](/channels/imessage): legacy `imsg` CLI path + DB access.
|
||||||
|
- DM security: default is pairing. First DM sends a code; approve via `openclaw pairing approve <channel> <code>` or use allowlists.
|
||||||
|
</Step>
|
||||||
|
<Step title="Daemon install">
|
||||||
|
- macOS: LaunchAgent
|
||||||
|
- Requires a logged-in user session; for headless, use a custom LaunchDaemon (not shipped).
|
||||||
|
- Linux (and Windows via WSL2): systemd user unit
|
||||||
|
- Wizard attempts to enable lingering via `loginctl enable-linger <user>` so the Gateway stays up after logout.
|
||||||
|
- May prompt for sudo (writes `/var/lib/systemd/linger`); it tries without sudo first.
|
||||||
|
- **Runtime selection:** Node (recommended; required for WhatsApp/Telegram). Bun is **not recommended**.
|
||||||
|
</Step>
|
||||||
|
<Step title="Health check">
|
||||||
|
- Starts the Gateway (if needed) and runs `openclaw health`.
|
||||||
|
- Tip: `openclaw status --deep` adds gateway health probes to status output (requires a reachable gateway).
|
||||||
|
</Step>
|
||||||
|
<Step title="Skills (recommended)">
|
||||||
|
- Reads the available skills and checks requirements.
|
||||||
|
- Lets you choose a node manager: **npm / pnpm** (bun not recommended).
|
||||||
|
- Installs optional dependencies (some use Homebrew on macOS).
|
||||||
|
</Step>
|
||||||
|
<Step title="Finish">
|
||||||
|
- Summary + next steps, including iOS/Android/macOS apps for extra features.
|
||||||
|
</Step>
|
||||||
|
</Steps>
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
If no GUI is detected, the wizard prints SSH port-forward instructions for the Control UI instead of opening a browser.
|
||||||
|
If the Control UI assets are missing, the wizard attempts to build them; fallback is `pnpm ui:build` (auto-installs UI deps).
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Non-interactive mode
|
||||||
|
|
||||||
|
Use `--non-interactive` to automate or script onboarding:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice apiKey \
|
||||||
|
--anthropic-api-key "$ANTHROPIC_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback \
|
||||||
|
--install-daemon \
|
||||||
|
--daemon-runtime node \
|
||||||
|
--skip-skills
|
||||||
|
```
|
||||||
|
|
||||||
|
Add `--json` for a machine‑readable summary.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
`--json` does **not** imply non-interactive mode. Use `--non-interactive` (and `--workspace`) for scripts.
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
<AccordionGroup>
|
||||||
|
<Accordion title="Gemini example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice gemini-api-key \
|
||||||
|
--gemini-api-key "$GEMINI_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Z.AI example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice zai-api-key \
|
||||||
|
--zai-api-key "$ZAI_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Vercel AI Gateway example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice ai-gateway-api-key \
|
||||||
|
--ai-gateway-api-key "$AI_GATEWAY_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Cloudflare AI Gateway example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice cloudflare-ai-gateway-api-key \
|
||||||
|
--cloudflare-ai-gateway-account-id "your-account-id" \
|
||||||
|
--cloudflare-ai-gateway-gateway-id "your-gateway-id" \
|
||||||
|
--cloudflare-ai-gateway-api-key "$CLOUDFLARE_AI_GATEWAY_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Moonshot example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice moonshot-api-key \
|
||||||
|
--moonshot-api-key "$MOONSHOT_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Synthetic example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice synthetic-api-key \
|
||||||
|
--synthetic-api-key "$SYNTHETIC_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenCode Zen example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice opencode-zen \
|
||||||
|
--opencode-zen-api-key "$OPENCODE_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
</AccordionGroup>
|
||||||
|
|
||||||
|
### Add agent (non-interactive)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw agents add work \
|
||||||
|
--workspace ~/.openclaw/workspace-work \
|
||||||
|
--model openai/gpt-5.2 \
|
||||||
|
--bind whatsapp:biz \
|
||||||
|
--non-interactive \
|
||||||
|
--json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Gateway wizard RPC
|
||||||
|
|
||||||
|
The Gateway exposes the wizard flow over RPC (`wizard.start`, `wizard.next`, `wizard.cancel`, `wizard.status`).
|
||||||
|
Clients (macOS app, Control UI) can render steps without re‑implementing onboarding logic.
|
||||||
|
|
||||||
|
## Signal setup (signal-cli)
|
||||||
|
|
||||||
|
The wizard can install `signal-cli` from GitHub releases:
|
||||||
|
|
||||||
|
- Downloads the appropriate release asset.
|
||||||
|
- Stores it under `~/.openclaw/tools/signal-cli/<version>/`.
|
||||||
|
- Writes `channels.signal.cliPath` to your config.
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- JVM builds require **Java 21**.
|
||||||
|
- Native builds are used when available.
|
||||||
|
- Windows uses WSL2; signal-cli install follows the Linux flow inside WSL.
|
||||||
|
|
||||||
|
## What the wizard writes
|
||||||
|
|
||||||
|
Typical fields in `~/.openclaw/openclaw.json`:
|
||||||
|
|
||||||
|
- `agents.defaults.workspace`
|
||||||
|
- `agents.defaults.model` / `models.providers` (if Minimax chosen)
|
||||||
|
- `gateway.*` (mode, bind, auth, tailscale)
|
||||||
|
- `channels.telegram.botToken`, `channels.discord.token`, `channels.signal.*`, `channels.imessage.*`
|
||||||
|
- Channel allowlists (Slack/Discord/Matrix/Microsoft Teams) when you opt in during the prompts (names resolve to IDs when possible).
|
||||||
|
- `skills.install.nodeManager`
|
||||||
|
- `wizard.lastRunAt`
|
||||||
|
- `wizard.lastRunVersion`
|
||||||
|
- `wizard.lastRunCommit`
|
||||||
|
- `wizard.lastRunCommand`
|
||||||
|
- `wizard.lastRunMode`
|
||||||
|
|
||||||
|
`openclaw agents add` writes `agents.list[]` and optional `bindings`.
|
||||||
|
|
||||||
|
WhatsApp credentials go under `~/.openclaw/credentials/whatsapp/<accountId>/`.
|
||||||
|
Sessions are stored under `~/.openclaw/agents/<agentId>/sessions/`.
|
||||||
|
|
||||||
|
Some channels are delivered as plugins. When you pick one during onboarding, the wizard
|
||||||
|
will prompt to install it (npm or a local path) before it can be configured.
|
||||||
|
|
||||||
|
## Related docs
|
||||||
|
|
||||||
|
- Wizard overview: [Onboarding Wizard](/start/wizard)
|
||||||
|
- macOS app onboarding: [Onboarding](/start/onboarding)
|
||||||
|
- Config reference: [Gateway configuration](/gateway/configuration)
|
||||||
|
- Providers: [WhatsApp](/channels/whatsapp), [Telegram](/channels/telegram), [Discord](/channels/discord), [Google Chat](/channels/googlechat), [Signal](/channels/signal), [BlueBubbles](/channels/bluebubbles) (iMessage), [iMessage](/channels/imessage) (legacy)
|
||||||
|
- Skills: [Skills](/tools/skills), [Skills config](/tools/skills-config)
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
---
|
||||||
|
summary: "Agent bootstrapping ritual that seeds the workspace and identity files"
|
||||||
|
read_when:
|
||||||
|
- Understanding what happens on the first agent run
|
||||||
|
- Explaining where bootstrapping files live
|
||||||
|
- Debugging onboarding identity setup
|
||||||
|
title: "Agent Bootstrapping"
|
||||||
|
sidebarTitle: "Bootstrapping"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Agent Bootstrapping
|
||||||
|
|
||||||
|
Bootstrapping is the **first‑run** ritual that prepares an agent workspace and
|
||||||
|
collects identity details. It happens after onboarding, when the agent starts
|
||||||
|
for the first time.
|
||||||
|
|
||||||
|
## What bootstrapping does
|
||||||
|
|
||||||
|
On the first agent run, OpenClaw bootstraps the workspace (default
|
||||||
|
`~/.openclaw/workspace`):
|
||||||
|
|
||||||
|
- Seeds `AGENTS.md`, `BOOTSTRAP.md`, `IDENTITY.md`, `USER.md`.
|
||||||
|
- Runs a short Q&A ritual (one question at a time).
|
||||||
|
- Writes identity + preferences to `IDENTITY.md`, `USER.md`, `SOUL.md`.
|
||||||
|
- Removes `BOOTSTRAP.md` when finished so it only runs once.
|
||||||
|
|
||||||
|
## Where it runs
|
||||||
|
|
||||||
|
Bootstrapping always runs on the **gateway host**. If the macOS app connects to
|
||||||
|
a remote Gateway, the workspace and bootstrapping files live on that remote
|
||||||
|
machine.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
When the Gateway runs on another machine, edit workspace files on the gateway
|
||||||
|
host (for example, `user@gateway-host:~/.openclaw/workspace`).
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Related docs
|
||||||
|
|
||||||
|
- macOS app onboarding: [Onboarding](/start/onboarding)
|
||||||
|
- Workspace layout: [Agent workspace](/concepts/agent-workspace)
|
||||||
|
|
@ -6,6 +6,7 @@ title: "Docs directory"
|
||||||
---
|
---
|
||||||
|
|
||||||
<Note>
|
<Note>
|
||||||
|
This page is a curated index. If you are new, start with [Getting Started](/start/getting-started).
|
||||||
For a complete map of the docs, see [Docs hubs](/start/hubs).
|
For a complete map of the docs, see [Docs hubs](/start/hubs).
|
||||||
</Note>
|
</Note>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,208 +1,120 @@
|
||||||
---
|
---
|
||||||
summary: "Beginner guide: from zero to first message (wizard, auth, channels, pairing)"
|
summary: "Get OpenClaw installed and run your first chat in minutes."
|
||||||
read_when:
|
read_when:
|
||||||
- First time setup from zero
|
- First time setup from zero
|
||||||
- You want the fastest path from install → onboarding → first message
|
- You want the fastest path to a working chat
|
||||||
title: "Getting Started"
|
title: "Getting Started"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Getting Started
|
# Getting Started
|
||||||
|
|
||||||
Goal: go from **zero** → **first working chat** (with sane defaults) as quickly as possible.
|
Goal: go from zero to a first working chat with minimal setup.
|
||||||
|
|
||||||
|
<Info>
|
||||||
Fastest chat: open the Control UI (no channel setup needed). Run `openclaw dashboard`
|
Fastest chat: open the Control UI (no channel setup needed). Run `openclaw dashboard`
|
||||||
and chat in the browser, or open `http://127.0.0.1:18789/` on the gateway host.
|
and chat in the browser, or open `http://127.0.0.1:18789/` on the
|
||||||
|
<Tooltip headline="Gateway host" tip="The machine running the OpenClaw gateway service.">gateway host</Tooltip>.
|
||||||
Docs: [Dashboard](/web/dashboard) and [Control UI](/web/control-ui).
|
Docs: [Dashboard](/web/dashboard) and [Control UI](/web/control-ui).
|
||||||
|
</Info>
|
||||||
|
|
||||||
Recommended path: use the **CLI onboarding wizard** (`openclaw onboard`). It sets up:
|
## Prereqs
|
||||||
|
|
||||||
- model/auth (OAuth recommended)
|
- Node 22 or newer
|
||||||
- gateway settings
|
|
||||||
- channels (WhatsApp/Telegram/Discord/Mattermost (plugin)/...)
|
|
||||||
- pairing defaults (secure DMs)
|
|
||||||
- workspace bootstrap + skills
|
|
||||||
- optional background service
|
|
||||||
|
|
||||||
If you want the deeper reference pages, jump to: [Wizard](/start/wizard), [Setup](/start/setup), [Pairing](/start/pairing), [Security](/gateway/security).
|
<Tip>
|
||||||
|
Check your Node version with `node --version` if you are unsure.
|
||||||
|
</Tip>
|
||||||
|
|
||||||
Sandboxing note: `agents.defaults.sandbox.mode: "non-main"` uses `session.mainKey` (default `"main"`),
|
## Quick setup (CLI)
|
||||||
so group/channel sessions are sandboxed. If you want the main agent to always
|
|
||||||
run on host, set an explicit per-agent override:
|
|
||||||
|
|
||||||
```json
|
<Steps>
|
||||||
{
|
<Step title="Install OpenClaw (recommended)">
|
||||||
"routing": {
|
<Tabs>
|
||||||
"agents": {
|
<Tab title="macOS/Linux">
|
||||||
"main": {
|
```bash
|
||||||
"workspace": "~/.openclaw/workspace",
|
curl -fsSL https://openclaw.ai/install.sh | bash
|
||||||
"sandbox": { "mode": "off" }
|
```
|
||||||
}
|
</Tab>
|
||||||
}
|
<Tab title="Windows (PowerShell)">
|
||||||
}
|
```powershell
|
||||||
}
|
iwr -useb https://openclaw.ai/install.ps1 | iex
|
||||||
```
|
```
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
## 0) Prereqs
|
<Note>
|
||||||
|
Other install methods and requirements: [Install](/install).
|
||||||
|
</Note>
|
||||||
|
|
||||||
- Node `>=22`
|
</Step>
|
||||||
- `pnpm` (optional; recommended if you build from source)
|
<Step title="Run the onboarding wizard">
|
||||||
- **Recommended:** Brave Search API key for web search. Easiest path:
|
```bash
|
||||||
`openclaw configure --section web` (stores `tools.web.search.apiKey`).
|
openclaw onboard --install-daemon
|
||||||
See [Web tools](/tools/web).
|
```
|
||||||
|
|
||||||
macOS: if you plan to build the apps, install Xcode / CLT. For the CLI + gateway only, Node is enough.
|
The wizard configures auth, gateway settings, and optional channels.
|
||||||
Windows: use **WSL2** (Ubuntu recommended). WSL2 is strongly recommended; native Windows is untested, more problematic, and has poorer tool compatibility. Install WSL2 first, then run the Linux steps inside WSL. See [Windows (WSL2)](/platforms/windows).
|
See [Onboarding Wizard](/start/wizard) for details.
|
||||||
|
|
||||||
## 1) Install the CLI (recommended)
|
</Step>
|
||||||
|
<Step title="Check the Gateway">
|
||||||
|
If you installed the service, it should already be running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://openclaw.ai/install.sh | bash
|
openclaw gateway status
|
||||||
```
|
```
|
||||||
|
|
||||||
Installer options (install method, non-interactive, from GitHub): [Install](/install).
|
</Step>
|
||||||
|
<Step title="Open the Control UI">
|
||||||
|
```bash
|
||||||
|
openclaw dashboard
|
||||||
|
```
|
||||||
|
</Step>
|
||||||
|
</Steps>
|
||||||
|
|
||||||
Windows (PowerShell):
|
<Check>
|
||||||
|
If the Control UI loads, your Gateway is ready for use.
|
||||||
|
</Check>
|
||||||
|
|
||||||
```powershell
|
## Optional checks and extras
|
||||||
iwr -useb https://openclaw.ai/install.ps1 | iex
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternative (global install):
|
<AccordionGroup>
|
||||||
|
<Accordion title="Run the Gateway in the foreground">
|
||||||
|
Useful for quick tests or troubleshooting.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install -g openclaw@latest
|
openclaw gateway --port 18789
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
</Accordion>
|
||||||
pnpm add -g openclaw@latest
|
<Accordion title="Send a test message">
|
||||||
```
|
Requires a configured channel.
|
||||||
|
|
||||||
## 2) Run the onboarding wizard (and install the service)
|
```bash
|
||||||
|
openclaw message send --target +15555550123 --message "Hello from OpenClaw"
|
||||||
|
```
|
||||||
|
|
||||||
```bash
|
</Accordion>
|
||||||
openclaw onboard --install-daemon
|
</AccordionGroup>
|
||||||
```
|
|
||||||
|
|
||||||
What you’ll choose:
|
## Go deeper
|
||||||
|
|
||||||
- **Local vs Remote** gateway
|
<Columns>
|
||||||
- **Auth**: OpenAI Code (Codex) subscription (OAuth) or API keys. For Anthropic we recommend an API key; `claude setup-token` is also supported.
|
<Card title="Onboarding Wizard (details)" href="/start/wizard">
|
||||||
- **Providers**: WhatsApp QR login, Telegram/Discord bot tokens, Mattermost plugin tokens, etc.
|
Full CLI wizard reference and advanced options.
|
||||||
- **Daemon**: background install (launchd/systemd; WSL2 uses systemd)
|
</Card>
|
||||||
- **Runtime**: Node (recommended; required for WhatsApp/Telegram). Bun is **not recommended**.
|
<Card title="macOS app onboarding" href="/start/onboarding">
|
||||||
- **Gateway token**: the wizard generates one by default (even on loopback) and stores it in `gateway.auth.token`.
|
First run flow for the macOS app.
|
||||||
|
</Card>
|
||||||
|
</Columns>
|
||||||
|
|
||||||
Wizard doc: [Wizard](/start/wizard)
|
## What you will have
|
||||||
|
|
||||||
### Auth: where it lives (important)
|
- A running Gateway
|
||||||
|
- Auth configured
|
||||||
|
- Control UI access or a connected channel
|
||||||
|
|
||||||
- **Recommended Anthropic path:** set an API key (wizard can store it for service use). `claude setup-token` is also supported if you want to reuse Claude Code credentials.
|
## Next steps
|
||||||
|
|
||||||
- OAuth credentials (legacy import): `~/.openclaw/credentials/oauth.json`
|
- DM safety and approvals: [Pairing](/start/pairing)
|
||||||
- Auth profiles (OAuth + API keys): `~/.openclaw/agents/<agentId>/agent/auth-profiles.json`
|
- Connect more channels: [Channels](/channels)
|
||||||
|
- Advanced workflows and from source: [Setup](/start/setup)
|
||||||
Headless/server tip: do OAuth on a normal machine first, then copy `oauth.json` to the gateway host.
|
|
||||||
|
|
||||||
## 3) Start the Gateway
|
|
||||||
|
|
||||||
If you installed the service during onboarding, the Gateway should already be running:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw gateway status
|
|
||||||
```
|
|
||||||
|
|
||||||
Manual run (foreground):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw gateway --port 18789 --verbose
|
|
||||||
```
|
|
||||||
|
|
||||||
Dashboard (local loopback): `http://127.0.0.1:18789/`
|
|
||||||
If a token is configured, paste it into the Control UI settings (stored as `connect.params.auth.token`).
|
|
||||||
|
|
||||||
⚠️ **Bun warning (WhatsApp + Telegram):** Bun has known issues with these
|
|
||||||
channels. If you use WhatsApp or Telegram, run the Gateway with **Node**.
|
|
||||||
|
|
||||||
## 3.5) Quick verify (2 min)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw status
|
|
||||||
openclaw health
|
|
||||||
openclaw security audit --deep
|
|
||||||
```
|
|
||||||
|
|
||||||
## 4) Pair + connect your first chat surface
|
|
||||||
|
|
||||||
### WhatsApp (QR login)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw channels login
|
|
||||||
```
|
|
||||||
|
|
||||||
Scan via WhatsApp → Settings → Linked Devices.
|
|
||||||
|
|
||||||
WhatsApp doc: [WhatsApp](/channels/whatsapp)
|
|
||||||
|
|
||||||
### Telegram / Discord / others
|
|
||||||
|
|
||||||
The wizard can write tokens/config for you. If you prefer manual config, start with:
|
|
||||||
|
|
||||||
- Telegram: [Telegram](/channels/telegram)
|
|
||||||
- Discord: [Discord](/channels/discord)
|
|
||||||
- Mattermost (plugin): [Mattermost](/channels/mattermost)
|
|
||||||
|
|
||||||
**Telegram DM tip:** your first DM returns a pairing code. Approve it (see next step) or the bot won’t respond.
|
|
||||||
|
|
||||||
## 5) DM safety (pairing approvals)
|
|
||||||
|
|
||||||
Default posture: unknown DMs get a short code and messages are not processed until approved.
|
|
||||||
If your first DM gets no reply, approve the pairing:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw pairing list whatsapp
|
|
||||||
openclaw pairing approve whatsapp <code>
|
|
||||||
```
|
|
||||||
|
|
||||||
Pairing doc: [Pairing](/start/pairing)
|
|
||||||
|
|
||||||
## From source (development)
|
|
||||||
|
|
||||||
If you’re hacking on OpenClaw itself, run from source:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/openclaw/openclaw.git
|
|
||||||
cd openclaw
|
|
||||||
pnpm install
|
|
||||||
pnpm ui:build # auto-installs UI deps on first run
|
|
||||||
pnpm build
|
|
||||||
openclaw onboard --install-daemon
|
|
||||||
```
|
|
||||||
|
|
||||||
If you don’t have a global install yet, run the onboarding step via `pnpm openclaw ...` from the repo.
|
|
||||||
`pnpm build` also bundles A2UI assets; if you need to run just that step, use `pnpm canvas:a2ui:bundle`.
|
|
||||||
|
|
||||||
Gateway (from this repo):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
node openclaw.mjs gateway --port 18789 --verbose
|
|
||||||
```
|
|
||||||
|
|
||||||
## 7) Verify end-to-end
|
|
||||||
|
|
||||||
In a new terminal, send a test message:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw message send --target +15555550123 --message "Hello from OpenClaw"
|
|
||||||
```
|
|
||||||
|
|
||||||
If `openclaw health` shows “no auth configured”, go back to the wizard and set OAuth/key auth — the agent won’t be able to respond without it.
|
|
||||||
|
|
||||||
Tip: `openclaw status --all` is the best pasteable, read-only debug report.
|
|
||||||
Health probes: `openclaw health` (or `openclaw status --deep`) asks the running gateway for a health snapshot.
|
|
||||||
|
|
||||||
## Next steps (optional, but great)
|
|
||||||
|
|
||||||
- macOS menu bar app + voice wake: [macOS app](/platforms/macos)
|
|
||||||
- iOS/Android nodes (Canvas/camera/voice): [Nodes](/nodes)
|
|
||||||
- Remote access (SSH tunnel / Tailscale Serve): [Remote access](/gateway/remote) and [Tailscale](/gateway/tailscale)
|
|
||||||
- Always-on / VPN setups: [Remote access](/gateway/remote), [exe.dev](/platforms/exe-dev), [Hetzner](/platforms/hetzner), [macOS remote](/platforms/mac/remote)
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,10 @@ title: "Docs Hubs"
|
||||||
|
|
||||||
# Docs hubs
|
# Docs hubs
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
If you are new to OpenClaw, start with [Getting Started](/start/getting-started).
|
||||||
|
</Note>
|
||||||
|
|
||||||
Use these hubs to discover every page, including deep dives and reference docs that don’t appear in the left nav.
|
Use these hubs to discover every page, including deep dives and reference docs that don’t appear in the left nav.
|
||||||
|
|
||||||
## Start here
|
## Start here
|
||||||
|
|
|
||||||
|
|
@ -3,108 +3,78 @@ summary: "First-run onboarding flow for OpenClaw (macOS app)"
|
||||||
read_when:
|
read_when:
|
||||||
- Designing the macOS onboarding assistant
|
- Designing the macOS onboarding assistant
|
||||||
- Implementing auth or identity setup
|
- Implementing auth or identity setup
|
||||||
title: "Onboarding"
|
title: "Onboarding (macOS App)"
|
||||||
|
sidebarTitle: "Onboarding: macOS App"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Onboarding (macOS app)
|
# Onboarding (macOS App)
|
||||||
|
|
||||||
This doc describes the **current** first‑run onboarding flow. The goal is a
|
This doc describes the **current** first‑run onboarding flow. The goal is a
|
||||||
smooth “day 0” experience: pick where the Gateway runs, connect auth, run the
|
smooth “day 0” experience: pick where the Gateway runs, connect auth, run the
|
||||||
wizard, and let the agent bootstrap itself.
|
wizard, and let the agent bootstrap itself.
|
||||||
|
|
||||||
## Page order (current)
|
<Steps>
|
||||||
|
<Step title="Approve macOS warning">
|
||||||
1. Welcome + security notice
|
<Frame>
|
||||||
2. **Gateway selection** (Local / Remote / Configure later)
|
<img src="/assets/macos-onboarding/01-macos-warning.jpeg" alt="" />
|
||||||
3. **Auth (Anthropic OAuth)** — local only
|
</Frame>
|
||||||
4. **Setup Wizard** (Gateway‑driven)
|
</Step>
|
||||||
5. **Permissions** (TCC prompts)
|
<Step title="Approve find local networks">
|
||||||
6. **CLI** (optional)
|
<Frame>
|
||||||
7. **Onboarding chat** (dedicated session)
|
<img src="/assets/macos-onboarding/02-local-networks.jpeg" alt="" />
|
||||||
8. Ready
|
</Frame>
|
||||||
|
</Step>
|
||||||
## 1) Welcome + security notice
|
<Step title="Welcome and security notice">
|
||||||
|
<Frame caption="Read the security notice displayed and decide accordingly">
|
||||||
Read the security notice displayed and decide accordingly.
|
<img src="/assets/macos-onboarding/03-security-notice.png" alt="" />
|
||||||
|
</Frame>
|
||||||
## 2) Local vs Remote
|
</Step>
|
||||||
|
<Step title="Local vs Remote">
|
||||||
|
<Frame>
|
||||||
|
<img src="/assets/macos-onboarding/04-choose-gateway.png" alt="" />
|
||||||
|
</Frame>
|
||||||
|
|
||||||
Where does the **Gateway** run?
|
Where does the **Gateway** run?
|
||||||
|
|
||||||
- **Local (this Mac):** onboarding can run OAuth flows and write credentials
|
- **This Mac (Local only):** onboarding can run OAuth flows and write credentials
|
||||||
locally.
|
locally.
|
||||||
- **Remote (over SSH/Tailnet):** onboarding does **not** run OAuth locally;
|
- **Remote (over SSH/Tailnet):** onboarding does **not** run OAuth locally;
|
||||||
credentials must exist on the gateway host.
|
credentials must exist on the gateway host.
|
||||||
- **Configure later:** skip setup and leave the app unconfigured.
|
- **Configure later:** skip setup and leave the app unconfigured.
|
||||||
|
|
||||||
Gateway auth tip:
|
<Tip>
|
||||||
|
**Gateway auth tip:**
|
||||||
- The wizard now generates a **token** even for loopback, so local WS clients must authenticate.
|
- The wizard now generates a **token** even for loopback, so local WS clients must authenticate.
|
||||||
- If you disable auth, any local process can connect; use that only on fully trusted machines.
|
- If you disable auth, any local process can connect; use that only on fully trusted machines.
|
||||||
- Use a **token** for multi‑machine access or non‑loopback binds.
|
- Use a **token** for multi‑machine access or non‑loopback binds.
|
||||||
|
</Tip>
|
||||||
## 3) Local-only auth (Anthropic OAuth)
|
</Step>
|
||||||
|
<Step title="Permissions">
|
||||||
The macOS app supports Anthropic OAuth (Claude Pro/Max). The flow:
|
<Frame caption="Choose what permissions do you want to give OpenClaw">
|
||||||
|
<img src="/assets/macos-onboarding/05-permissions.png" alt="" />
|
||||||
- Opens the browser for OAuth (PKCE)
|
</Frame>
|
||||||
- Asks the user to paste the `code#state` value
|
|
||||||
- Writes credentials to `~/.openclaw/credentials/oauth.json`
|
|
||||||
|
|
||||||
Other providers (OpenAI, custom APIs) are configured via environment variables
|
|
||||||
or config files for now.
|
|
||||||
|
|
||||||
## 4) Setup Wizard (Gateway‑driven)
|
|
||||||
|
|
||||||
The app can run the same setup wizard as the CLI. This keeps onboarding in sync
|
|
||||||
with Gateway‑side behavior and avoids duplicating logic in SwiftUI.
|
|
||||||
|
|
||||||
## 5) Permissions
|
|
||||||
|
|
||||||
Onboarding requests TCC permissions needed for:
|
Onboarding requests TCC permissions needed for:
|
||||||
|
|
||||||
|
- Automation (AppleScript)
|
||||||
- Notifications
|
- Notifications
|
||||||
- Accessibility
|
- Accessibility
|
||||||
- Screen Recording
|
- Screen Recording
|
||||||
- Microphone / Speech Recognition
|
- Microphone
|
||||||
- Automation (AppleScript)
|
- Speech Recognition
|
||||||
|
- Camera
|
||||||
|
- Location
|
||||||
|
|
||||||
## 6) CLI (optional)
|
</Step>
|
||||||
|
<Step title="CLI">
|
||||||
The app can install the global `openclaw` CLI via npm/pnpm so terminal
|
<Info>This step is optional</Info>
|
||||||
workflows and launchd tasks work out of the box.
|
The app can install the global `openclaw` CLI via npm/pnpm so terminal
|
||||||
|
workflows and launchd tasks work out of the box.
|
||||||
## 7) Onboarding chat (dedicated session)
|
</Step>
|
||||||
|
<Step title="Onboarding Chat (dedicated session)">
|
||||||
After setup, the app opens a dedicated onboarding chat session so the agent can
|
After setup, the app opens a dedicated onboarding chat session so the agent can
|
||||||
introduce itself and guide next steps. This keeps first‑run guidance separate
|
introduce itself and guide next steps. This keeps first‑run guidance separate
|
||||||
from your normal conversation.
|
from your normal conversation. See [Bootstrapping](/start/bootstrapping) for
|
||||||
|
what happens on the gateway host during the first agent run.
|
||||||
## Agent bootstrap ritual
|
</Step>
|
||||||
|
</Steps>
|
||||||
On the first agent run, OpenClaw bootstraps a workspace (default `~/.openclaw/workspace`):
|
|
||||||
|
|
||||||
- Seeds `AGENTS.md`, `BOOTSTRAP.md`, `IDENTITY.md`, `USER.md`
|
|
||||||
- Runs a short Q&A ritual (one question at a time)
|
|
||||||
- Writes identity + preferences to `IDENTITY.md`, `USER.md`, `SOUL.md`
|
|
||||||
- Removes `BOOTSTRAP.md` when finished so it only runs once
|
|
||||||
|
|
||||||
## Optional: Gmail hooks (manual)
|
|
||||||
|
|
||||||
Gmail Pub/Sub setup is currently a manual step. Use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw webhooks gmail setup --account you@gmail.com
|
|
||||||
```
|
|
||||||
|
|
||||||
See [/automation/gmail-pubsub](/automation/gmail-pubsub) for details.
|
|
||||||
|
|
||||||
## Remote mode notes
|
|
||||||
|
|
||||||
When the Gateway runs on another machine, credentials and workspace files live
|
|
||||||
**on that host**. If you need OAuth in remote mode, create:
|
|
||||||
|
|
||||||
- `~/.openclaw/credentials/oauth.json`
|
|
||||||
- `~/.openclaw/agents/<agentId>/agent/auth-profiles.json`
|
|
||||||
|
|
||||||
on the gateway host.
|
|
||||||
|
|
|
||||||
|
|
@ -26,26 +26,9 @@ Start conservative:
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
- Node **22+**
|
- OpenClaw installed and onboarded — see [Getting Started](/start/getting-started) if you haven't done this yet
|
||||||
- OpenClaw available on PATH (recommended: global install)
|
|
||||||
- A second phone number (SIM/eSIM/prepaid) for the assistant
|
- A second phone number (SIM/eSIM/prepaid) for the assistant
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install -g openclaw@latest
|
|
||||||
# or: pnpm add -g openclaw@latest
|
|
||||||
```
|
|
||||||
|
|
||||||
From source (development):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone https://github.com/openclaw/openclaw.git
|
|
||||||
cd openclaw
|
|
||||||
pnpm install
|
|
||||||
pnpm ui:build # auto-installs UI deps on first run
|
|
||||||
pnpm build
|
|
||||||
pnpm link --global
|
|
||||||
```
|
|
||||||
|
|
||||||
## The two-phone setup (recommended)
|
## The two-phone setup (recommended)
|
||||||
|
|
||||||
You want this:
|
You want this:
|
||||||
|
|
@ -91,7 +74,7 @@ openclaw gateway --port 18789
|
||||||
|
|
||||||
Now message the assistant number from your allowlisted phone.
|
Now message the assistant number from your allowlisted phone.
|
||||||
|
|
||||||
When onboarding finishes, we auto-open the dashboard with your gateway token and print the tokenized link. To reopen later: `openclaw dashboard`.
|
When onboarding finishes, we auto-open the dashboard and print a clean (non-tokenized) link. If it prompts for auth, paste the token from `gateway.auth.token` into Control UI settings. To reopen later: `openclaw dashboard`.
|
||||||
|
|
||||||
## Give the agent a workspace (AGENTS)
|
## Give the agent a workspace (AGENTS)
|
||||||
|
|
||||||
|
|
@ -142,7 +125,7 @@ Example:
|
||||||
{
|
{
|
||||||
logging: { level: "info" },
|
logging: { level: "info" },
|
||||||
agent: {
|
agent: {
|
||||||
model: "anthropic/claude-opus-4-5",
|
model: "anthropic/claude-opus-4-6",
|
||||||
workspace: "~/.openclaw/workspace",
|
workspace: "~/.openclaw/workspace",
|
||||||
thinkingDefault: "high",
|
thinkingDefault: "high",
|
||||||
timeoutSeconds: 1800,
|
timeoutSeconds: 1800,
|
||||||
|
|
|
||||||
|
|
@ -1,81 +1,22 @@
|
||||||
---
|
---
|
||||||
summary: "Install OpenClaw, onboard the Gateway, and pair your first channel."
|
summary: "Quick start has moved to Getting Started."
|
||||||
read_when:
|
read_when:
|
||||||
- You want the fastest path from install to a working Gateway
|
- You are looking for the fastest setup steps
|
||||||
|
- You were sent here from an older link
|
||||||
title: "Quick start"
|
title: "Quick start"
|
||||||
---
|
---
|
||||||
|
|
||||||
<Note>
|
# Quick start
|
||||||
OpenClaw requires Node 22 or newer.
|
|
||||||
</Note>
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
<Tabs>
|
|
||||||
<Tab title="npm">
|
|
||||||
```bash
|
|
||||||
npm install -g openclaw@latest
|
|
||||||
```
|
|
||||||
</Tab>
|
|
||||||
<Tab title="pnpm">
|
|
||||||
```bash
|
|
||||||
pnpm add -g openclaw@latest
|
|
||||||
```
|
|
||||||
</Tab>
|
|
||||||
</Tabs>
|
|
||||||
|
|
||||||
## Onboard and run the Gateway
|
|
||||||
|
|
||||||
<Steps>
|
|
||||||
<Step title="Onboard and install the service">
|
|
||||||
```bash
|
|
||||||
openclaw onboard --install-daemon
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
<Step title="Pair WhatsApp">
|
|
||||||
```bash
|
|
||||||
openclaw channels login
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
<Step title="Start the Gateway">
|
|
||||||
```bash
|
|
||||||
openclaw gateway --port 18789
|
|
||||||
```
|
|
||||||
</Step>
|
|
||||||
</Steps>
|
|
||||||
|
|
||||||
After onboarding, the Gateway runs via the user service. You can still run it manually with `openclaw gateway`.
|
|
||||||
|
|
||||||
<Info>
|
<Info>
|
||||||
Switching between npm and git installs later is easy. Install the other flavor and run
|
Quick start is now part of [Getting Started](/start/getting-started).
|
||||||
`openclaw doctor` to update the gateway service entrypoint.
|
|
||||||
</Info>
|
</Info>
|
||||||
|
|
||||||
## From source (development)
|
<Columns>
|
||||||
|
<Card title="Getting Started" href="/start/getting-started">
|
||||||
```bash
|
Install OpenClaw and run your first chat in minutes.
|
||||||
git clone https://github.com/openclaw/openclaw.git
|
</Card>
|
||||||
cd openclaw
|
<Card title="Onboarding Wizard" href="/start/wizard">
|
||||||
pnpm install
|
Full CLI wizard reference and advanced options.
|
||||||
pnpm ui:build # auto-installs UI deps on first run
|
</Card>
|
||||||
pnpm build
|
</Columns>
|
||||||
openclaw onboard --install-daemon
|
|
||||||
```
|
|
||||||
|
|
||||||
If you do not have a global install yet, run onboarding via `pnpm openclaw ...` from the repo.
|
|
||||||
|
|
||||||
## Multi instance quickstart (optional)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
OPENCLAW_CONFIG_PATH=~/.openclaw/a.json \
|
|
||||||
OPENCLAW_STATE_DIR=~/.openclaw-a \
|
|
||||||
openclaw gateway --port 19001
|
|
||||||
```
|
|
||||||
|
|
||||||
## Send a test message
|
|
||||||
|
|
||||||
Requires a running Gateway.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw message send --target +15555550123 --message "Hello from OpenClaw"
|
|
||||||
```
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
summary: "Setup guide: keep your OpenClaw setup tailored while staying up-to-date"
|
summary: "Advanced setup and development workflows for OpenClaw"
|
||||||
read_when:
|
read_when:
|
||||||
- Setting up a new machine
|
- Setting up a new machine
|
||||||
- You want “latest + greatest” without breaking your personal setup
|
- You want “latest + greatest” without breaking your personal setup
|
||||||
|
|
@ -8,6 +8,11 @@ title: "Setup"
|
||||||
|
|
||||||
# Setup
|
# Setup
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
If you are setting up for the first time, start with [Getting Started](/start/getting-started).
|
||||||
|
For wizard details, see [Onboarding Wizard](/start/wizard).
|
||||||
|
</Note>
|
||||||
|
|
||||||
Last updated: 2026-01-01
|
Last updated: 2026-01-01
|
||||||
|
|
||||||
## TL;DR
|
## TL;DR
|
||||||
|
|
@ -43,6 +48,14 @@ openclaw setup
|
||||||
|
|
||||||
If you don’t have a global install yet, run it via `pnpm openclaw setup`.
|
If you don’t have a global install yet, run it via `pnpm openclaw setup`.
|
||||||
|
|
||||||
|
## Run the Gateway from this repo
|
||||||
|
|
||||||
|
After `pnpm build`, you can run the packaged CLI directly:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node openclaw.mjs gateway --port 18789 --verbose
|
||||||
|
```
|
||||||
|
|
||||||
## Stable workflow (macOS app first)
|
## Stable workflow (macOS app first)
|
||||||
|
|
||||||
1. Install + launch **OpenClaw.app** (menu bar).
|
1. Install + launch **OpenClaw.app** (menu bar).
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,141 @@
|
||||||
|
---
|
||||||
|
summary: "Scripted onboarding and agent setup for the OpenClaw CLI"
|
||||||
|
read_when:
|
||||||
|
- You are automating onboarding in scripts or CI
|
||||||
|
- You need non-interactive examples for specific providers
|
||||||
|
title: "CLI Automation"
|
||||||
|
sidebarTitle: "CLI automation"
|
||||||
|
---
|
||||||
|
|
||||||
|
# CLI Automation
|
||||||
|
|
||||||
|
Use `--non-interactive` to automate `openclaw onboard`.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
`--json` does not imply non-interactive mode. Use `--non-interactive` (and `--workspace`) for scripts.
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Baseline non-interactive example
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice apiKey \
|
||||||
|
--anthropic-api-key "$ANTHROPIC_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback \
|
||||||
|
--install-daemon \
|
||||||
|
--daemon-runtime node \
|
||||||
|
--skip-skills
|
||||||
|
```
|
||||||
|
|
||||||
|
Add `--json` for a machine-readable summary.
|
||||||
|
|
||||||
|
## Provider-specific examples
|
||||||
|
|
||||||
|
<AccordionGroup>
|
||||||
|
<Accordion title="Gemini example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice gemini-api-key \
|
||||||
|
--gemini-api-key "$GEMINI_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Z.AI example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice zai-api-key \
|
||||||
|
--zai-api-key "$ZAI_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Vercel AI Gateway example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice ai-gateway-api-key \
|
||||||
|
--ai-gateway-api-key "$AI_GATEWAY_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Cloudflare AI Gateway example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice cloudflare-ai-gateway-api-key \
|
||||||
|
--cloudflare-ai-gateway-account-id "your-account-id" \
|
||||||
|
--cloudflare-ai-gateway-gateway-id "your-gateway-id" \
|
||||||
|
--cloudflare-ai-gateway-api-key "$CLOUDFLARE_AI_GATEWAY_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Moonshot example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice moonshot-api-key \
|
||||||
|
--moonshot-api-key "$MOONSHOT_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Synthetic example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice synthetic-api-key \
|
||||||
|
--synthetic-api-key "$SYNTHETIC_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenCode Zen example">
|
||||||
|
```bash
|
||||||
|
openclaw onboard --non-interactive \
|
||||||
|
--mode local \
|
||||||
|
--auth-choice opencode-zen \
|
||||||
|
--opencode-zen-api-key "$OPENCODE_API_KEY" \
|
||||||
|
--gateway-port 18789 \
|
||||||
|
--gateway-bind loopback
|
||||||
|
```
|
||||||
|
</Accordion>
|
||||||
|
</AccordionGroup>
|
||||||
|
|
||||||
|
## Add another agent
|
||||||
|
|
||||||
|
Use `openclaw agents add <name>` to create a separate agent with its own workspace,
|
||||||
|
sessions, and auth profiles. Running without `--workspace` launches the wizard.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
openclaw agents add work \
|
||||||
|
--workspace ~/.openclaw/workspace-work \
|
||||||
|
--model openai/gpt-5.2 \
|
||||||
|
--bind whatsapp:biz \
|
||||||
|
--non-interactive \
|
||||||
|
--json
|
||||||
|
```
|
||||||
|
|
||||||
|
What it sets:
|
||||||
|
|
||||||
|
- `agents.list[].name`
|
||||||
|
- `agents.list[].workspace`
|
||||||
|
- `agents.list[].agentDir`
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
|
||||||
|
- Default workspaces follow `~/.openclaw/workspace-<agentId>`.
|
||||||
|
- Add `bindings` to route inbound messages (the wizard can do this).
|
||||||
|
- Non-interactive flags: `--model`, `--agent-dir`, `--bind`, `--non-interactive`.
|
||||||
|
|
||||||
|
## Related docs
|
||||||
|
|
||||||
|
- Onboarding hub: [Onboarding Wizard (CLI)](/start/wizard)
|
||||||
|
- Full reference: [CLI Onboarding Reference](/start/wizard-cli-reference)
|
||||||
|
- Command reference: [`openclaw onboard`](/cli/onboard)
|
||||||
|
|
@ -0,0 +1,244 @@
|
||||||
|
---
|
||||||
|
summary: "Complete reference for CLI onboarding flow, auth/model setup, outputs, and internals"
|
||||||
|
read_when:
|
||||||
|
- You need detailed behavior for openclaw onboard
|
||||||
|
- You are debugging onboarding results or integrating onboarding clients
|
||||||
|
title: "CLI Onboarding Reference"
|
||||||
|
sidebarTitle: "CLI reference"
|
||||||
|
---
|
||||||
|
|
||||||
|
# CLI Onboarding Reference
|
||||||
|
|
||||||
|
This page is the full reference for `openclaw onboard`.
|
||||||
|
For the short guide, see [Onboarding Wizard (CLI)](/start/wizard).
|
||||||
|
|
||||||
|
## What the wizard does
|
||||||
|
|
||||||
|
Local mode (default) walks you through:
|
||||||
|
|
||||||
|
- Model and auth setup (OpenAI Code subscription OAuth, Anthropic API key or setup token, plus MiniMax, GLM, Moonshot, and AI Gateway options)
|
||||||
|
- Workspace location and bootstrap files
|
||||||
|
- Gateway settings (port, bind, auth, tailscale)
|
||||||
|
- Channels and providers (Telegram, WhatsApp, Discord, Google Chat, Mattermost plugin, Signal)
|
||||||
|
- Daemon install (LaunchAgent or systemd user unit)
|
||||||
|
- Health check
|
||||||
|
- Skills setup
|
||||||
|
|
||||||
|
Remote mode configures this machine to connect to a gateway elsewhere.
|
||||||
|
It does not install or modify anything on the remote host.
|
||||||
|
|
||||||
|
## Local flow details
|
||||||
|
|
||||||
|
<Steps>
|
||||||
|
<Step title="Existing config detection">
|
||||||
|
- If `~/.openclaw/openclaw.json` exists, choose Keep, Modify, or Reset.
|
||||||
|
- Re-running the wizard does not wipe anything unless you explicitly choose Reset (or pass `--reset`).
|
||||||
|
- If config is invalid or contains legacy keys, the wizard stops and asks you to run `openclaw doctor` before continuing.
|
||||||
|
- Reset uses `trash` and offers scopes:
|
||||||
|
- Config only
|
||||||
|
- Config + credentials + sessions
|
||||||
|
- Full reset (also removes workspace)
|
||||||
|
</Step>
|
||||||
|
<Step title="Model and auth">
|
||||||
|
- Full option matrix is in [Auth and model options](#auth-and-model-options).
|
||||||
|
</Step>
|
||||||
|
<Step title="Workspace">
|
||||||
|
- Default `~/.openclaw/workspace` (configurable).
|
||||||
|
- Seeds workspace files needed for first-run bootstrap ritual.
|
||||||
|
- Workspace layout: [Agent workspace](/concepts/agent-workspace).
|
||||||
|
</Step>
|
||||||
|
<Step title="Gateway">
|
||||||
|
- Prompts for port, bind, auth mode, and tailscale exposure.
|
||||||
|
- Recommended: keep token auth enabled even for loopback so local WS clients must authenticate.
|
||||||
|
- Disable auth only if you fully trust every local process.
|
||||||
|
- Non-loopback binds still require auth.
|
||||||
|
</Step>
|
||||||
|
<Step title="Channels">
|
||||||
|
- [WhatsApp](/channels/whatsapp): optional QR login
|
||||||
|
- [Telegram](/channels/telegram): bot token
|
||||||
|
- [Discord](/channels/discord): bot token
|
||||||
|
- [Google Chat](/channels/googlechat): service account JSON + webhook audience
|
||||||
|
- [Mattermost](/channels/mattermost) plugin: bot token + base URL
|
||||||
|
- [Signal](/channels/signal): optional `signal-cli` install + account config
|
||||||
|
- [BlueBubbles](/channels/bluebubbles): recommended for iMessage; server URL + password + webhook
|
||||||
|
- [iMessage](/channels/imessage): legacy `imsg` CLI path + DB access
|
||||||
|
- DM security: default is pairing. First DM sends a code; approve via
|
||||||
|
`openclaw pairing approve <channel> <code>` or use allowlists.
|
||||||
|
</Step>
|
||||||
|
<Step title="Daemon install">
|
||||||
|
- macOS: LaunchAgent
|
||||||
|
- Requires logged-in user session; for headless, use a custom LaunchDaemon (not shipped).
|
||||||
|
- Linux and Windows via WSL2: systemd user unit
|
||||||
|
- Wizard attempts `loginctl enable-linger <user>` so gateway stays up after logout.
|
||||||
|
- May prompt for sudo (writes `/var/lib/systemd/linger`); it tries without sudo first.
|
||||||
|
- Runtime selection: Node (recommended; required for WhatsApp and Telegram). Bun is not recommended.
|
||||||
|
</Step>
|
||||||
|
<Step title="Health check">
|
||||||
|
- Starts gateway (if needed) and runs `openclaw health`.
|
||||||
|
- `openclaw status --deep` adds gateway health probes to status output.
|
||||||
|
</Step>
|
||||||
|
<Step title="Skills">
|
||||||
|
- Reads available skills and checks requirements.
|
||||||
|
- Lets you choose node manager: npm or pnpm (bun not recommended).
|
||||||
|
- Installs optional dependencies (some use Homebrew on macOS).
|
||||||
|
</Step>
|
||||||
|
<Step title="Finish">
|
||||||
|
- Summary and next steps, including iOS, Android, and macOS app options.
|
||||||
|
</Step>
|
||||||
|
</Steps>
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
If no GUI is detected, the wizard prints SSH port-forward instructions for the Control UI instead of opening a browser.
|
||||||
|
If Control UI assets are missing, the wizard attempts to build them; fallback is `pnpm ui:build` (auto-installs UI deps).
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Remote mode details
|
||||||
|
|
||||||
|
Remote mode configures this machine to connect to a gateway elsewhere.
|
||||||
|
|
||||||
|
<Info>
|
||||||
|
Remote mode does not install or modify anything on the remote host.
|
||||||
|
</Info>
|
||||||
|
|
||||||
|
What you set:
|
||||||
|
|
||||||
|
- Remote gateway URL (`ws://...`)
|
||||||
|
- Token if remote gateway auth is required (recommended)
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
- If gateway is loopback-only, use SSH tunneling or a tailnet.
|
||||||
|
- Discovery hints:
|
||||||
|
- macOS: Bonjour (`dns-sd`)
|
||||||
|
- Linux: Avahi (`avahi-browse`)
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Auth and model options
|
||||||
|
|
||||||
|
<AccordionGroup>
|
||||||
|
<Accordion title="Anthropic API key (recommended)">
|
||||||
|
Uses `ANTHROPIC_API_KEY` if present or prompts for a key, then saves it for daemon use.
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Anthropic OAuth (Claude Code CLI)">
|
||||||
|
- macOS: checks Keychain item "Claude Code-credentials"
|
||||||
|
- Linux and Windows: reuses `~/.claude/.credentials.json` if present
|
||||||
|
|
||||||
|
On macOS, choose "Always Allow" so launchd starts do not block.
|
||||||
|
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Anthropic token (setup-token paste)">
|
||||||
|
Run `claude setup-token` on any machine, then paste the token.
|
||||||
|
You can name it; blank uses default.
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenAI Code subscription (Codex CLI reuse)">
|
||||||
|
If `~/.codex/auth.json` exists, the wizard can reuse it.
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenAI Code subscription (OAuth)">
|
||||||
|
Browser flow; paste `code#state`.
|
||||||
|
|
||||||
|
Sets `agents.defaults.model` to `openai-codex/gpt-5.3-codex` when model is unset or `openai/*`.
|
||||||
|
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenAI API key">
|
||||||
|
Uses `OPENAI_API_KEY` if present or prompts for a key, then saves it to
|
||||||
|
`~/.openclaw/.env` so launchd can read it.
|
||||||
|
|
||||||
|
Sets `agents.defaults.model` to `openai/gpt-5.1-codex` when model is unset, `openai/*`, or `openai-codex/*`.
|
||||||
|
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="OpenCode Zen">
|
||||||
|
Prompts for `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`).
|
||||||
|
Setup URL: [opencode.ai/auth](https://opencode.ai/auth).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="API key (generic)">
|
||||||
|
Stores the key for you.
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Vercel AI Gateway">
|
||||||
|
Prompts for `AI_GATEWAY_API_KEY`.
|
||||||
|
More detail: [Vercel AI Gateway](/providers/vercel-ai-gateway).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Cloudflare AI Gateway">
|
||||||
|
Prompts for account ID, gateway ID, and `CLOUDFLARE_AI_GATEWAY_API_KEY`.
|
||||||
|
More detail: [Cloudflare AI Gateway](/providers/cloudflare-ai-gateway).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="MiniMax M2.1">
|
||||||
|
Config is auto-written.
|
||||||
|
More detail: [MiniMax](/providers/minimax).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Synthetic (Anthropic-compatible)">
|
||||||
|
Prompts for `SYNTHETIC_API_KEY`.
|
||||||
|
More detail: [Synthetic](/providers/synthetic).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Moonshot and Kimi Coding">
|
||||||
|
Moonshot (Kimi K2) and Kimi Coding configs are auto-written.
|
||||||
|
More detail: [Moonshot AI (Kimi + Kimi Coding)](/providers/moonshot).
|
||||||
|
</Accordion>
|
||||||
|
<Accordion title="Skip">
|
||||||
|
Leaves auth unconfigured.
|
||||||
|
</Accordion>
|
||||||
|
</AccordionGroup>
|
||||||
|
|
||||||
|
Model behavior:
|
||||||
|
|
||||||
|
- Pick default model from detected options, or enter provider and model manually.
|
||||||
|
- Wizard runs a model check and warns if the configured model is unknown or missing auth.
|
||||||
|
|
||||||
|
Credential and profile paths:
|
||||||
|
|
||||||
|
- OAuth credentials: `~/.openclaw/credentials/oauth.json`
|
||||||
|
- Auth profiles (API keys + OAuth): `~/.openclaw/agents/<agentId>/agent/auth-profiles.json`
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
Headless and server tip: complete OAuth on a machine with a browser, then copy
|
||||||
|
`~/.openclaw/credentials/oauth.json` (or `$OPENCLAW_STATE_DIR/credentials/oauth.json`)
|
||||||
|
to the gateway host.
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
## Outputs and internals
|
||||||
|
|
||||||
|
Typical fields in `~/.openclaw/openclaw.json`:
|
||||||
|
|
||||||
|
- `agents.defaults.workspace`
|
||||||
|
- `agents.defaults.model` / `models.providers` (if Minimax chosen)
|
||||||
|
- `gateway.*` (mode, bind, auth, tailscale)
|
||||||
|
- `channels.telegram.botToken`, `channels.discord.token`, `channels.signal.*`, `channels.imessage.*`
|
||||||
|
- Channel allowlists (Slack, Discord, Matrix, Microsoft Teams) when you opt in during prompts (names resolve to IDs when possible)
|
||||||
|
- `skills.install.nodeManager`
|
||||||
|
- `wizard.lastRunAt`
|
||||||
|
- `wizard.lastRunVersion`
|
||||||
|
- `wizard.lastRunCommit`
|
||||||
|
- `wizard.lastRunCommand`
|
||||||
|
- `wizard.lastRunMode`
|
||||||
|
|
||||||
|
`openclaw agents add` writes `agents.list[]` and optional `bindings`.
|
||||||
|
|
||||||
|
WhatsApp credentials go under `~/.openclaw/credentials/whatsapp/<accountId>/`.
|
||||||
|
Sessions are stored under `~/.openclaw/agents/<agentId>/sessions/`.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
Some channels are delivered as plugins. When selected during onboarding, the wizard
|
||||||
|
prompts to install the plugin (npm or local path) before channel configuration.
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
Gateway wizard RPC:
|
||||||
|
|
||||||
|
- `wizard.start`
|
||||||
|
- `wizard.next`
|
||||||
|
- `wizard.cancel`
|
||||||
|
- `wizard.status`
|
||||||
|
|
||||||
|
Clients (macOS app and Control UI) can render steps without re-implementing onboarding logic.
|
||||||
|
|
||||||
|
Signal setup behavior:
|
||||||
|
|
||||||
|
- Downloads the appropriate release asset
|
||||||
|
- Stores it under `~/.openclaw/tools/signal-cli/<version>/`
|
||||||
|
- Writes `channels.signal.cliPath` in config
|
||||||
|
- JVM builds require Java 21
|
||||||
|
- Native builds are used when available
|
||||||
|
- Windows uses WSL2 and follows Linux signal-cli flow inside WSL
|
||||||
|
|
||||||
|
## Related docs
|
||||||
|
|
||||||
|
- Onboarding hub: [Onboarding Wizard (CLI)](/start/wizard)
|
||||||
|
- Automation and scripts: [CLI Automation](/start/wizard-cli-automation)
|
||||||
|
- Command reference: [`openclaw onboard`](/cli/onboard)
|
||||||
|
|
@ -3,7 +3,8 @@ summary: "CLI onboarding wizard: guided setup for gateway, workspace, channels,
|
||||||
read_when:
|
read_when:
|
||||||
- Running or configuring the onboarding wizard
|
- Running or configuring the onboarding wizard
|
||||||
- Setting up a new machine
|
- Setting up a new machine
|
||||||
title: "Onboarding Wizard"
|
title: "Onboarding Wizard (CLI)"
|
||||||
|
sidebarTitle: "Onboarding: CLI"
|
||||||
---
|
---
|
||||||
|
|
||||||
# Onboarding Wizard (CLI)
|
# Onboarding Wizard (CLI)
|
||||||
|
|
@ -13,166 +14,70 @@ Linux, or Windows (via WSL2; strongly recommended).
|
||||||
It configures a local Gateway or a remote Gateway connection, plus channels, skills,
|
It configures a local Gateway or a remote Gateway connection, plus channels, skills,
|
||||||
and workspace defaults in one guided flow.
|
and workspace defaults in one guided flow.
|
||||||
|
|
||||||
Primary entrypoint:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw onboard
|
openclaw onboard
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<Info>
|
||||||
Fastest first chat: open the Control UI (no channel setup needed). Run
|
Fastest first chat: open the Control UI (no channel setup needed). Run
|
||||||
`openclaw dashboard` and chat in the browser. Docs: [Dashboard](/web/dashboard).
|
`openclaw dashboard` and chat in the browser. Docs: [Dashboard](/web/dashboard).
|
||||||
|
</Info>
|
||||||
|
|
||||||
Follow‑up reconfiguration:
|
To reconfigure later:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
openclaw configure
|
openclaw configure
|
||||||
|
openclaw agents add <name>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
`--json` does not imply non-interactive mode. For scripts, use `--non-interactive`.
|
||||||
|
</Note>
|
||||||
|
|
||||||
|
<Tip>
|
||||||
Recommended: set up a Brave Search API key so the agent can use `web_search`
|
Recommended: set up a Brave Search API key so the agent can use `web_search`
|
||||||
(`web_fetch` works without a key). Easiest path: `openclaw configure --section web`
|
(`web_fetch` works without a key). Easiest path: `openclaw configure --section web`
|
||||||
which stores `tools.web.search.apiKey`. Docs: [Web tools](/tools/web).
|
which stores `tools.web.search.apiKey`. Docs: [Web tools](/tools/web).
|
||||||
|
</Tip>
|
||||||
|
|
||||||
## QuickStart vs Advanced
|
## QuickStart vs Advanced
|
||||||
|
|
||||||
The wizard starts with **QuickStart** (defaults) vs **Advanced** (full control).
|
The wizard starts with **QuickStart** (defaults) vs **Advanced** (full control).
|
||||||
|
|
||||||
**QuickStart** keeps the defaults:
|
<Tabs>
|
||||||
|
<Tab title="QuickStart (defaults)">
|
||||||
|
- Local gateway (loopback)
|
||||||
|
- Workspace default (or existing workspace)
|
||||||
|
- Gateway port **18789**
|
||||||
|
- Gateway auth **Token** (auto‑generated, even on loopback)
|
||||||
|
- Tailscale exposure **Off**
|
||||||
|
- Telegram + WhatsApp DMs default to **allowlist** (you'll be prompted for your phone number)
|
||||||
|
</Tab>
|
||||||
|
<Tab title="Advanced (full control)">
|
||||||
|
- Exposes every step (mode, workspace, gateway, channels, daemon, skills).
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
- Local gateway (loopback)
|
## What the wizard configures
|
||||||
- Workspace default (or existing workspace)
|
|
||||||
- Gateway port **18789**
|
|
||||||
- Gateway auth **Token** (auto‑generated, even on loopback)
|
|
||||||
- Tailscale exposure **Off**
|
|
||||||
- Telegram + WhatsApp DMs default to **allowlist** (you’ll be prompted for your phone number)
|
|
||||||
|
|
||||||
**Advanced** exposes every step (mode, workspace, gateway, channels, daemon, skills).
|
**Local mode (default)** walks you through these steps:
|
||||||
|
|
||||||
## What the wizard does
|
1. **Model/Auth** — Anthropic API key (recommended), OAuth, OpenAI, or other providers. Pick a default model.
|
||||||
|
2. **Workspace** — Location for agent files (default `~/.openclaw/workspace`). Seeds bootstrap files.
|
||||||
|
3. **Gateway** — Port, bind address, auth mode, Tailscale exposure.
|
||||||
|
4. **Channels** — WhatsApp, Telegram, Discord, Google Chat, Mattermost, Signal, BlueBubbles, or iMessage.
|
||||||
|
5. **Daemon** — Installs a LaunchAgent (macOS) or systemd user unit (Linux/WSL2).
|
||||||
|
6. **Health check** — Starts the Gateway and verifies it's running.
|
||||||
|
7. **Skills** — Installs recommended skills and optional dependencies.
|
||||||
|
|
||||||
**Local mode (default)** walks you through:
|
<Note>
|
||||||
|
Re-running the wizard does **not** wipe anything unless you explicitly choose **Reset** (or pass `--reset`).
|
||||||
- Model/auth (OpenAI Code (Codex) subscription OAuth, Anthropic API key (recommended) or setup-token (paste), plus MiniMax/GLM/Moonshot/AI Gateway options)
|
If the config is invalid or contains legacy keys, the wizard asks you to run `openclaw doctor` first.
|
||||||
- Workspace location + bootstrap files
|
</Note>
|
||||||
- Gateway settings (port/bind/auth/tailscale)
|
|
||||||
- Providers (Telegram, WhatsApp, Discord, Google Chat, Mattermost (plugin), Signal)
|
|
||||||
- Daemon install (LaunchAgent / systemd user unit)
|
|
||||||
- Health check
|
|
||||||
- Skills (recommended)
|
|
||||||
|
|
||||||
**Remote mode** only configures the local client to connect to a Gateway elsewhere.
|
**Remote mode** only configures the local client to connect to a Gateway elsewhere.
|
||||||
It does **not** install or change anything on the remote host.
|
It does **not** install or change anything on the remote host.
|
||||||
|
|
||||||
To add more isolated agents (separate workspace + sessions + auth), use:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw agents add <name>
|
|
||||||
```
|
|
||||||
|
|
||||||
Tip: `--json` does **not** imply non-interactive mode. Use `--non-interactive` (and `--workspace`) for scripts.
|
|
||||||
|
|
||||||
## Flow details (local)
|
|
||||||
|
|
||||||
1. **Existing config detection**
|
|
||||||
- If `~/.openclaw/openclaw.json` exists, choose **Keep / Modify / Reset**.
|
|
||||||
- Re-running the wizard does **not** wipe anything unless you explicitly choose **Reset**
|
|
||||||
(or pass `--reset`).
|
|
||||||
- If the config is invalid or contains legacy keys, the wizard stops and asks
|
|
||||||
you to run `openclaw doctor` before continuing.
|
|
||||||
- Reset uses `trash` (never `rm`) and offers scopes:
|
|
||||||
- Config only
|
|
||||||
- Config + credentials + sessions
|
|
||||||
- Full reset (also removes workspace)
|
|
||||||
|
|
||||||
2. **Model/Auth**
|
|
||||||
- **Anthropic API key (recommended)**: uses `ANTHROPIC_API_KEY` if present or prompts for a key, then saves it for daemon use.
|
|
||||||
- **Anthropic OAuth (Claude Code CLI)**: on macOS the wizard checks Keychain item "Claude Code-credentials" (choose "Always Allow" so launchd starts don't block); on Linux/Windows it reuses `~/.claude/.credentials.json` if present.
|
|
||||||
- **Anthropic token (paste setup-token)**: run `claude setup-token` on any machine, then paste the token (you can name it; blank = default).
|
|
||||||
- **OpenAI Code (Codex) subscription (Codex CLI)**: if `~/.codex/auth.json` exists, the wizard can reuse it.
|
|
||||||
- **OpenAI Code (Codex) subscription (OAuth)**: browser flow; paste the `code#state`.
|
|
||||||
- Sets `agents.defaults.model` to `openai-codex/gpt-5.2` when model is unset or `openai/*`.
|
|
||||||
- **OpenAI API key**: uses `OPENAI_API_KEY` if present or prompts for a key, then saves it to `~/.openclaw/.env` so launchd can read it.
|
|
||||||
- **OpenCode Zen (multi-model proxy)**: prompts for `OPENCODE_API_KEY` (or `OPENCODE_ZEN_API_KEY`, get it at https://opencode.ai/auth).
|
|
||||||
- **API key**: stores the key for you.
|
|
||||||
- **Vercel AI Gateway (multi-model proxy)**: prompts for `AI_GATEWAY_API_KEY`.
|
|
||||||
- More detail: [Vercel AI Gateway](/providers/vercel-ai-gateway)
|
|
||||||
- **Cloudflare AI Gateway**: prompts for Account ID, Gateway ID, and `CLOUDFLARE_AI_GATEWAY_API_KEY`.
|
|
||||||
- More detail: [Cloudflare AI Gateway](/providers/cloudflare-ai-gateway)
|
|
||||||
- **MiniMax M2.1**: config is auto-written.
|
|
||||||
- More detail: [MiniMax](/providers/minimax)
|
|
||||||
- **Synthetic (Anthropic-compatible)**: prompts for `SYNTHETIC_API_KEY`.
|
|
||||||
- More detail: [Synthetic](/providers/synthetic)
|
|
||||||
- **Moonshot (Kimi K2)**: config is auto-written.
|
|
||||||
- **Kimi Coding**: config is auto-written.
|
|
||||||
- More detail: [Moonshot AI (Kimi + Kimi Coding)](/providers/moonshot)
|
|
||||||
- **Skip**: no auth configured yet.
|
|
||||||
- Pick a default model from detected options (or enter provider/model manually).
|
|
||||||
- Wizard runs a model check and warns if the configured model is unknown or missing auth.
|
|
||||||
|
|
||||||
- OAuth credentials live in `~/.openclaw/credentials/oauth.json`; auth profiles live in `~/.openclaw/agents/<agentId>/agent/auth-profiles.json` (API keys + OAuth).
|
|
||||||
- More detail: [/concepts/oauth](/concepts/oauth)
|
|
||||||
|
|
||||||
3. **Workspace**
|
|
||||||
- Default `~/.openclaw/workspace` (configurable).
|
|
||||||
- Seeds the workspace files needed for the agent bootstrap ritual.
|
|
||||||
- Full workspace layout + backup guide: [Agent workspace](/concepts/agent-workspace)
|
|
||||||
|
|
||||||
4. **Gateway**
|
|
||||||
- Port, bind, auth mode, tailscale exposure.
|
|
||||||
- Auth recommendation: keep **Token** even for loopback so local WS clients must authenticate.
|
|
||||||
- Disable auth only if you fully trust every local process.
|
|
||||||
- Non‑loopback binds still require auth.
|
|
||||||
|
|
||||||
5. **Channels**
|
|
||||||
- [WhatsApp](/channels/whatsapp): optional QR login.
|
|
||||||
- [Telegram](/channels/telegram): bot token.
|
|
||||||
- [Discord](/channels/discord): bot token.
|
|
||||||
- [Google Chat](/channels/googlechat): service account JSON + webhook audience.
|
|
||||||
- [Mattermost](/channels/mattermost) (plugin): bot token + base URL.
|
|
||||||
- [Signal](/channels/signal): optional `signal-cli` install + account config.
|
|
||||||
- [BlueBubbles](/channels/bluebubbles): **recommended for iMessage**; server URL + password + webhook.
|
|
||||||
- [iMessage](/channels/imessage): legacy `imsg` CLI path + DB access.
|
|
||||||
- DM security: default is pairing. First DM sends a code; approve via `openclaw pairing approve <channel> <code>` or use allowlists.
|
|
||||||
|
|
||||||
6. **Daemon install**
|
|
||||||
- macOS: LaunchAgent
|
|
||||||
- Requires a logged-in user session; for headless, use a custom LaunchDaemon (not shipped).
|
|
||||||
- Linux (and Windows via WSL2): systemd user unit
|
|
||||||
- Wizard attempts to enable lingering via `loginctl enable-linger <user>` so the Gateway stays up after logout.
|
|
||||||
- May prompt for sudo (writes `/var/lib/systemd/linger`); it tries without sudo first.
|
|
||||||
- **Runtime selection:** Node (recommended; required for WhatsApp/Telegram). Bun is **not recommended**.
|
|
||||||
|
|
||||||
7. **Health check**
|
|
||||||
- Starts the Gateway (if needed) and runs `openclaw health`.
|
|
||||||
- Tip: `openclaw status --deep` adds gateway health probes to status output (requires a reachable gateway).
|
|
||||||
|
|
||||||
8. **Skills (recommended)**
|
|
||||||
- Reads the available skills and checks requirements.
|
|
||||||
- Lets you choose a node manager: **npm / pnpm** (bun not recommended).
|
|
||||||
- Installs optional dependencies (some use Homebrew on macOS).
|
|
||||||
|
|
||||||
9. **Finish**
|
|
||||||
- Summary + next steps, including iOS/Android/macOS apps for extra features.
|
|
||||||
|
|
||||||
- If no GUI is detected, the wizard prints SSH port-forward instructions for the Control UI instead of opening a browser.
|
|
||||||
- If the Control UI assets are missing, the wizard attempts to build them; fallback is `pnpm ui:build` (auto-installs UI deps).
|
|
||||||
|
|
||||||
## Remote mode
|
|
||||||
|
|
||||||
Remote mode configures a local client to connect to a Gateway elsewhere.
|
|
||||||
|
|
||||||
What you’ll set:
|
|
||||||
|
|
||||||
- Remote Gateway URL (`ws://...`)
|
|
||||||
- Token if the remote Gateway requires auth (recommended)
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
- No remote installs or daemon changes are performed.
|
|
||||||
- If the Gateway is loopback‑only, use SSH tunneling or a tailnet.
|
|
||||||
- Discovery hints:
|
|
||||||
- macOS: Bonjour (`dns-sd`)
|
|
||||||
- Linux: Avahi (`avahi-browse`)
|
|
||||||
|
|
||||||
## Add another agent
|
## Add another agent
|
||||||
|
|
||||||
Use `openclaw agents add <name>` to create a separate agent with its own workspace,
|
Use `openclaw agents add <name>` to create a separate agent with its own workspace,
|
||||||
|
|
@ -190,160 +95,14 @@ Notes:
|
||||||
- Add `bindings` to route inbound messages (the wizard can do this).
|
- Add `bindings` to route inbound messages (the wizard can do this).
|
||||||
- Non-interactive flags: `--model`, `--agent-dir`, `--bind`, `--non-interactive`.
|
- Non-interactive flags: `--model`, `--agent-dir`, `--bind`, `--non-interactive`.
|
||||||
|
|
||||||
## Non‑interactive mode
|
## Full reference
|
||||||
|
|
||||||
Use `--non-interactive` to automate or script onboarding:
|
For detailed step-by-step breakdowns, non-interactive scripting, Signal setup,
|
||||||
|
RPC API, and a full list of config fields the wizard writes, see the
|
||||||
```bash
|
[Wizard Reference](/reference/wizard).
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice apiKey \
|
|
||||||
--anthropic-api-key "$ANTHROPIC_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback \
|
|
||||||
--install-daemon \
|
|
||||||
--daemon-runtime node \
|
|
||||||
--skip-skills
|
|
||||||
```
|
|
||||||
|
|
||||||
Add `--json` for a machine‑readable summary.
|
|
||||||
|
|
||||||
Gemini example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice gemini-api-key \
|
|
||||||
--gemini-api-key "$GEMINI_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Z.AI example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice zai-api-key \
|
|
||||||
--zai-api-key "$ZAI_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Vercel AI Gateway example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice ai-gateway-api-key \
|
|
||||||
--ai-gateway-api-key "$AI_GATEWAY_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Cloudflare AI Gateway example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice cloudflare-ai-gateway-api-key \
|
|
||||||
--cloudflare-ai-gateway-account-id "your-account-id" \
|
|
||||||
--cloudflare-ai-gateway-gateway-id "your-gateway-id" \
|
|
||||||
--cloudflare-ai-gateway-api-key "$CLOUDFLARE_AI_GATEWAY_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Moonshot example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice moonshot-api-key \
|
|
||||||
--moonshot-api-key "$MOONSHOT_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Synthetic example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice synthetic-api-key \
|
|
||||||
--synthetic-api-key "$SYNTHETIC_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
OpenCode Zen example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw onboard --non-interactive \
|
|
||||||
--mode local \
|
|
||||||
--auth-choice opencode-zen \
|
|
||||||
--opencode-zen-api-key "$OPENCODE_API_KEY" \
|
|
||||||
--gateway-port 18789 \
|
|
||||||
--gateway-bind loopback
|
|
||||||
```
|
|
||||||
|
|
||||||
Add agent (non‑interactive) example:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
openclaw agents add work \
|
|
||||||
--workspace ~/.openclaw/workspace-work \
|
|
||||||
--model openai/gpt-5.2 \
|
|
||||||
--bind whatsapp:biz \
|
|
||||||
--non-interactive \
|
|
||||||
--json
|
|
||||||
```
|
|
||||||
|
|
||||||
## Gateway wizard RPC
|
|
||||||
|
|
||||||
The Gateway exposes the wizard flow over RPC (`wizard.start`, `wizard.next`, `wizard.cancel`, `wizard.status`).
|
|
||||||
Clients (macOS app, Control UI) can render steps without re‑implementing onboarding logic.
|
|
||||||
|
|
||||||
## Signal setup (signal-cli)
|
|
||||||
|
|
||||||
The wizard can install `signal-cli` from GitHub releases:
|
|
||||||
|
|
||||||
- Downloads the appropriate release asset.
|
|
||||||
- Stores it under `~/.openclaw/tools/signal-cli/<version>/`.
|
|
||||||
- Writes `channels.signal.cliPath` to your config.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
- JVM builds require **Java 21**.
|
|
||||||
- Native builds are used when available.
|
|
||||||
- Windows uses WSL2; signal-cli install follows the Linux flow inside WSL.
|
|
||||||
|
|
||||||
## What the wizard writes
|
|
||||||
|
|
||||||
Typical fields in `~/.openclaw/openclaw.json`:
|
|
||||||
|
|
||||||
- `agents.defaults.workspace`
|
|
||||||
- `agents.defaults.model` / `models.providers` (if Minimax chosen)
|
|
||||||
- `gateway.*` (mode, bind, auth, tailscale)
|
|
||||||
- `channels.telegram.botToken`, `channels.discord.token`, `channels.signal.*`, `channels.imessage.*`
|
|
||||||
- Channel allowlists (Slack/Discord/Matrix/Microsoft Teams) when you opt in during the prompts (names resolve to IDs when possible).
|
|
||||||
- `skills.install.nodeManager`
|
|
||||||
- `wizard.lastRunAt`
|
|
||||||
- `wizard.lastRunVersion`
|
|
||||||
- `wizard.lastRunCommit`
|
|
||||||
- `wizard.lastRunCommand`
|
|
||||||
- `wizard.lastRunMode`
|
|
||||||
|
|
||||||
`openclaw agents add` writes `agents.list[]` and optional `bindings`.
|
|
||||||
|
|
||||||
WhatsApp credentials go under `~/.openclaw/credentials/whatsapp/<accountId>/`.
|
|
||||||
Sessions are stored under `~/.openclaw/agents/<agentId>/sessions/`.
|
|
||||||
|
|
||||||
Some channels are delivered as plugins. When you pick one during onboarding, the wizard
|
|
||||||
will prompt to install it (npm or a local path) before it can be configured.
|
|
||||||
|
|
||||||
## Related docs
|
## Related docs
|
||||||
|
|
||||||
|
- CLI command reference: [`openclaw onboard`](/cli/onboard)
|
||||||
- macOS app onboarding: [Onboarding](/start/onboarding)
|
- macOS app onboarding: [Onboarding](/start/onboarding)
|
||||||
- Config reference: [Gateway configuration](/gateway/configuration)
|
- Agent first-run ritual: [Agent Bootstrapping](/start/bootstrapping)
|
||||||
- Providers: [WhatsApp](/channels/whatsapp), [Telegram](/channels/telegram), [Discord](/channels/discord), [Google Chat](/channels/googlechat), [Signal](/channels/signal), [BlueBubbles](/channels/bluebubbles) (iMessage), [iMessage](/channels/imessage) (legacy)
|
|
||||||
- Skills: [Skills](/tools/skills), [Skills config](/tools/skills-config)
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,3 @@
|
||||||
|
#content > h1:first-of-type {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
@ -110,7 +110,7 @@ Live tests are split into two layers so we can isolate failures:
|
||||||
- How to select models:
|
- How to select models:
|
||||||
- `OPENCLAW_LIVE_MODELS=modern` to run the modern allowlist (Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)
|
- `OPENCLAW_LIVE_MODELS=modern` to run the modern allowlist (Opus/Sonnet/Haiku 4.5, GPT-5.x + Codex, Gemini 3, GLM 4.7, MiniMax M2.1, Grok 4)
|
||||||
- `OPENCLAW_LIVE_MODELS=all` is an alias for the modern allowlist
|
- `OPENCLAW_LIVE_MODELS=all` is an alias for the modern allowlist
|
||||||
- or `OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-5,..."` (comma allowlist)
|
- or `OPENCLAW_LIVE_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,..."` (comma allowlist)
|
||||||
- How to select providers:
|
- How to select providers:
|
||||||
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (comma allowlist)
|
- `OPENCLAW_LIVE_PROVIDERS="google,google-antigravity,google-gemini-cli"` (comma allowlist)
|
||||||
- Where keys come from:
|
- Where keys come from:
|
||||||
|
|
@ -172,7 +172,7 @@ openclaw models list --json
|
||||||
- Profile: `OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test`
|
- Profile: `OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-token-test`
|
||||||
- Raw token: `OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...`
|
- Raw token: `OPENCLAW_LIVE_SETUP_TOKEN_VALUE=sk-ant-oat01-...`
|
||||||
- Model override (optional):
|
- Model override (optional):
|
||||||
- `OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-5`
|
- `OPENCLAW_LIVE_SETUP_TOKEN_MODEL=anthropic/claude-opus-4-6`
|
||||||
|
|
||||||
Setup example:
|
Setup example:
|
||||||
|
|
||||||
|
|
@ -193,8 +193,8 @@ OPENCLAW_LIVE_SETUP_TOKEN=1 OPENCLAW_LIVE_SETUP_TOKEN_PROFILE=anthropic:setup-to
|
||||||
- Command: `claude`
|
- Command: `claude`
|
||||||
- Args: `["-p","--output-format","json","--dangerously-skip-permissions"]`
|
- Args: `["-p","--output-format","json","--dangerously-skip-permissions"]`
|
||||||
- Overrides (optional):
|
- Overrides (optional):
|
||||||
- `OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-5"`
|
- `OPENCLAW_LIVE_CLI_BACKEND_MODEL="claude-cli/claude-opus-4-6"`
|
||||||
- `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.2-codex"`
|
- `OPENCLAW_LIVE_CLI_BACKEND_MODEL="codex-cli/gpt-5.3-codex"`
|
||||||
- `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"`
|
- `OPENCLAW_LIVE_CLI_BACKEND_COMMAND="/full/path/to/claude"`
|
||||||
- `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'`
|
- `OPENCLAW_LIVE_CLI_BACKEND_ARGS='["-p","--output-format","json","--permission-mode","bypassPermissions"]'`
|
||||||
- `OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'`
|
- `OPENCLAW_LIVE_CLI_BACKEND_CLEAR_ENV='["ANTHROPIC_API_KEY","ANTHROPIC_API_KEY_OLD"]'`
|
||||||
|
|
@ -223,7 +223,7 @@ Narrow, explicit allowlists are fastest and least flaky:
|
||||||
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
||||||
|
|
||||||
- Tool calling across several providers:
|
- Tool calling across several providers:
|
||||||
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-5,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
- `OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,anthropic/claude-opus-4-6,google/gemini-3-flash-preview,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
||||||
|
|
||||||
- Google focus (Gemini API key + Antigravity):
|
- Google focus (Gemini API key + Antigravity):
|
||||||
- Gemini (API key): `OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
- Gemini (API key): `OPENCLAW_LIVE_GATEWAY_MODELS="google/gemini-3-flash-preview" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
||||||
|
|
@ -247,22 +247,22 @@ There is no fixed “CI model list” (live is opt-in), but these are the **reco
|
||||||
This is the “common models” run we expect to keep working:
|
This is the “common models” run we expect to keep working:
|
||||||
|
|
||||||
- OpenAI (non-Codex): `openai/gpt-5.2` (optional: `openai/gpt-5.1`)
|
- OpenAI (non-Codex): `openai/gpt-5.2` (optional: `openai/gpt-5.1`)
|
||||||
- OpenAI Codex: `openai-codex/gpt-5.2` (optional: `openai-codex/gpt-5.2-codex`)
|
- OpenAI Codex: `openai-codex/gpt-5.3-codex` (optional: `openai-codex/gpt-5.3-codex-codex`)
|
||||||
- Anthropic: `anthropic/claude-opus-4-5` (or `anthropic/claude-sonnet-4-5`)
|
- Anthropic: `anthropic/claude-opus-4-6` (or `anthropic/claude-sonnet-4-5`)
|
||||||
- Google (Gemini API): `google/gemini-3-pro-preview` and `google/gemini-3-flash-preview` (avoid older Gemini 2.x models)
|
- Google (Gemini API): `google/gemini-3-pro-preview` and `google/gemini-3-flash-preview` (avoid older Gemini 2.x models)
|
||||||
- Google (Antigravity): `google-antigravity/claude-opus-4-5-thinking` and `google-antigravity/gemini-3-flash`
|
- Google (Antigravity): `google-antigravity/claude-opus-4-5-thinking` and `google-antigravity/gemini-3-flash`
|
||||||
- Z.AI (GLM): `zai/glm-4.7`
|
- Z.AI (GLM): `zai/glm-4.7`
|
||||||
- MiniMax: `minimax/minimax-m2.1`
|
- MiniMax: `minimax/minimax-m2.1`
|
||||||
|
|
||||||
Run gateway smoke with tools + image:
|
Run gateway smoke with tools + image:
|
||||||
`OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.2,anthropic/claude-opus-4-5,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-5-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
`OPENCLAW_LIVE_GATEWAY_MODELS="openai/gpt-5.2,openai-codex/gpt-5.3-codex,anthropic/claude-opus-4-6,google/gemini-3-pro-preview,google/gemini-3-flash-preview,google-antigravity/claude-opus-4-5-thinking,google-antigravity/gemini-3-flash,zai/glm-4.7,minimax/minimax-m2.1" pnpm test:live src/gateway/gateway-models.profiles.live.test.ts`
|
||||||
|
|
||||||
### Baseline: tool calling (Read + optional Exec)
|
### Baseline: tool calling (Read + optional Exec)
|
||||||
|
|
||||||
Pick at least one per provider family:
|
Pick at least one per provider family:
|
||||||
|
|
||||||
- OpenAI: `openai/gpt-5.2` (or `openai/gpt-5-mini`)
|
- OpenAI: `openai/gpt-5.2` (or `openai/gpt-5-mini`)
|
||||||
- Anthropic: `anthropic/claude-opus-4-5` (or `anthropic/claude-sonnet-4-5`)
|
- Anthropic: `anthropic/claude-opus-4-6` (or `anthropic/claude-sonnet-4-5`)
|
||||||
- Google: `google/gemini-3-flash-preview` (or `google/gemini-3-pro-preview`)
|
- Google: `google/gemini-3-flash-preview` (or `google/gemini-3-pro-preview`)
|
||||||
- Z.AI (GLM): `zai/glm-4.7`
|
- Z.AI (GLM): `zai/glm-4.7`
|
||||||
- MiniMax: `minimax/minimax-m2.1`
|
- MiniMax: `minimax/minimax-m2.1`
|
||||||
|
|
|
||||||
|
|
@ -93,9 +93,9 @@ https://docs.anthropic.com/docs/build-with-claude/prompt-caching
|
||||||
agents:
|
agents:
|
||||||
defaults:
|
defaults:
|
||||||
model:
|
model:
|
||||||
primary: "anthropic/claude-opus-4-5"
|
primary: "anthropic/claude-opus-4-6"
|
||||||
models:
|
models:
|
||||||
"anthropic/claude-opus-4-5":
|
"anthropic/claude-opus-4-6":
|
||||||
params:
|
params:
|
||||||
cacheRetention: "long"
|
cacheRetention: "long"
|
||||||
heartbeat:
|
heartbeat:
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ without writing custom OpenClaw code for each workflow.
|
||||||
"defaultProvider": "openai-codex",
|
"defaultProvider": "openai-codex",
|
||||||
"defaultModel": "gpt-5.2",
|
"defaultModel": "gpt-5.2",
|
||||||
"defaultAuthProfileId": "main",
|
"defaultAuthProfileId": "main",
|
||||||
"allowedModels": ["openai-codex/gpt-5.2"],
|
"allowedModels": ["openai-codex/gpt-5.3-codex"],
|
||||||
"maxTokens": 800,
|
"maxTokens": 800,
|
||||||
"timeoutMs": 30000
|
"timeoutMs": 30000
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ title: "Thinking Levels"
|
||||||
- medium → “think harder”
|
- medium → “think harder”
|
||||||
- high → “ultrathink” (max budget)
|
- high → “ultrathink” (max budget)
|
||||||
- xhigh → “ultrathink+” (GPT-5.2 + Codex models only)
|
- xhigh → “ultrathink+” (GPT-5.2 + Codex models only)
|
||||||
|
- `x-high`, `x_high`, `extra-high`, `extra high`, and `extra_high` map to `xhigh`.
|
||||||
- `highest`, `max` map to `high`.
|
- `highest`, `max` map to `high`.
|
||||||
- Provider notes:
|
- Provider notes:
|
||||||
- Z.AI (`zai/*`) only supports binary thinking (`on`/`off`). Any non-`off` level is treated as `on` (mapped to `low`).
|
- Z.AI (`zai/*`) only supports binary thinking (`on`/`off`). Any non-`off` level is treated as `on` (mapped to `low`).
|
||||||
|
|
|
||||||
12
docs/vps.md
12
docs/vps.md
|
|
@ -13,13 +13,13 @@ deployments work at a high level.
|
||||||
|
|
||||||
## Pick a provider
|
## Pick a provider
|
||||||
|
|
||||||
- **Railway** (one‑click + browser setup): [Railway](/railway)
|
- **Railway** (one‑click + browser setup): [Railway](/install/railway)
|
||||||
- **Northflank** (one‑click + browser setup): [Northflank](/northflank)
|
- **Northflank** (one‑click + browser setup): [Northflank](/install/northflank)
|
||||||
- **Oracle Cloud (Always Free)**: [Oracle](/platforms/oracle) — $0/month (Always Free, ARM; capacity/signup can be finicky)
|
- **Oracle Cloud (Always Free)**: [Oracle](/platforms/oracle) — $0/month (Always Free, ARM; capacity/signup can be finicky)
|
||||||
- **Fly.io**: [Fly.io](/platforms/fly)
|
- **Fly.io**: [Fly.io](/install/fly)
|
||||||
- **Hetzner (Docker)**: [Hetzner](/platforms/hetzner)
|
- **Hetzner (Docker)**: [Hetzner](/install/hetzner)
|
||||||
- **GCP (Compute Engine)**: [GCP](/platforms/gcp)
|
- **GCP (Compute Engine)**: [GCP](/install/gcp)
|
||||||
- **exe.dev** (VM + HTTPS proxy): [exe.dev](/platforms/exe-dev)
|
- **exe.dev** (VM + HTTPS proxy): [exe.dev](/install/exe-dev)
|
||||||
- **AWS (EC2/Lightsail/free tier)**: works well too. Video guide:
|
- **AWS (EC2/Lightsail/free tier)**: works well too. Video guide:
|
||||||
https://x.com/techfrenAJ/status/2014934471095812547
|
https://x.com/techfrenAJ/status/2014934471095812547
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,18 +29,18 @@ Prefer localhost, Tailscale Serve, or an SSH tunnel.
|
||||||
|
|
||||||
## Fast path (recommended)
|
## Fast path (recommended)
|
||||||
|
|
||||||
- After onboarding, the CLI now auto-opens the dashboard with your token and prints the same tokenized link.
|
- After onboarding, the CLI auto-opens the dashboard and prints a clean (non-tokenized) link.
|
||||||
- Re-open anytime: `openclaw dashboard` (copies link, opens browser if possible, shows SSH hint if headless).
|
- Re-open anytime: `openclaw dashboard` (copies link, opens browser if possible, shows SSH hint if headless).
|
||||||
- The token stays local (query param only); the UI strips it after first load and saves it in localStorage.
|
- If the UI prompts for auth, paste the token from `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`) into Control UI settings.
|
||||||
|
|
||||||
## Token basics (local vs remote)
|
## Token basics (local vs remote)
|
||||||
|
|
||||||
- **Localhost**: open `http://127.0.0.1:18789/`. If you see “unauthorized,” run `openclaw dashboard` and use the tokenized link (`?token=...`).
|
- **Localhost**: open `http://127.0.0.1:18789/`.
|
||||||
- **Token source**: `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`); the UI stores it after first load.
|
- **Token source**: `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`); the UI stores a copy in localStorage after you connect.
|
||||||
- **Not localhost**: use Tailscale Serve (tokenless if `gateway.auth.allowTailscale: true`), tailnet bind with a token, or an SSH tunnel. See [Web surfaces](/web).
|
- **Not localhost**: use Tailscale Serve (tokenless if `gateway.auth.allowTailscale: true`), tailnet bind with a token, or an SSH tunnel. See [Web surfaces](/web).
|
||||||
|
|
||||||
## If you see “unauthorized” / 1008
|
## If you see “unauthorized” / 1008
|
||||||
|
|
||||||
- Run `openclaw dashboard` to get a fresh tokenized link.
|
- Ensure the gateway is reachable (local: `openclaw status`; remote: SSH tunnel `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/`).
|
||||||
- Ensure the gateway is reachable (local: `openclaw status`; remote: SSH tunnel `ssh -N -L 18789:127.0.0.1:18789 user@host` then open `http://127.0.0.1:18789/?token=...`).
|
- Retrieve the token from the gateway host: `openclaw config get gateway.auth.token` (or generate one: `openclaw doctor --generate-gateway-token`).
|
||||||
- In the dashboard settings, paste the same token you configured in `gateway.auth.token` (or `OPENCLAW_GATEWAY_TOKEN`).
|
- In the dashboard settings, paste the token into the auth field, then connect.
|
||||||
|
|
|
||||||
|
|
@ -109,17 +109,23 @@ Lark(国际版)请使用 https://open.larksuite.com/app,并在配置中设
|
||||||
"application:application.app_message_stats.overview:readonly",
|
"application:application.app_message_stats.overview:readonly",
|
||||||
"application:application:self_manage",
|
"application:application:self_manage",
|
||||||
"application:bot.menu:write",
|
"application:bot.menu:write",
|
||||||
|
"cardkit:card:write",
|
||||||
"contact:user.employee_id:readonly",
|
"contact:user.employee_id:readonly",
|
||||||
"corehr:file:download",
|
"corehr:file:download",
|
||||||
|
"docs:document.content:read",
|
||||||
"event:ip_list",
|
"event:ip_list",
|
||||||
|
"im:chat",
|
||||||
"im:chat.access_event.bot_p2p_chat:read",
|
"im:chat.access_event.bot_p2p_chat:read",
|
||||||
"im:chat.members:bot_access",
|
"im:chat.members:bot_access",
|
||||||
"im:message",
|
"im:message",
|
||||||
"im:message.group_at_msg:readonly",
|
"im:message.group_at_msg:readonly",
|
||||||
|
"im:message.group_msg",
|
||||||
"im:message.p2p_msg:readonly",
|
"im:message.p2p_msg:readonly",
|
||||||
"im:message:readonly",
|
"im:message:readonly",
|
||||||
"im:message:send_as_bot",
|
"im:message:send_as_bot",
|
||||||
"im:resource"
|
"im:resource",
|
||||||
|
"sheets:spreadsheet",
|
||||||
|
"wiki:wiki:readonly"
|
||||||
],
|
],
|
||||||
"user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"]
|
"user": ["aily:file:read", "aily:file:write", "im:chat.access_event.bot_p2p_chat:read"]
|
||||||
}
|
}
|
||||||
|
|
@ -453,7 +459,116 @@ openclaw pairing list feishu
|
||||||
|
|
||||||
### 流式输出
|
### 流式输出
|
||||||
|
|
||||||
飞书目前不支持消息编辑,因此默认禁用流式输出(`blockStreaming: true`)。机器人会等待完整回复后一次性发送。
|
飞书支持通过交互式卡片实现流式输出,机器人会实时更新卡片内容显示生成进度。默认配置:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
channels: {
|
||||||
|
feishu: {
|
||||||
|
streaming: true, // 启用流式卡片输出(默认 true)
|
||||||
|
blockStreaming: true, // 启用块级流式(默认 true)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
如需禁用流式输出(等待完整回复后一次性发送),可设置 `streaming: false`。
|
||||||
|
|
||||||
|
### 消息引用
|
||||||
|
|
||||||
|
在群聊中,机器人的回复可以引用用户发送的原始消息,让对话上下文更加清晰。
|
||||||
|
|
||||||
|
配置选项:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
channels: {
|
||||||
|
feishu: {
|
||||||
|
// 账户级别配置(默认 "all")
|
||||||
|
replyToMode: "all",
|
||||||
|
groups: {
|
||||||
|
oc_xxx: {
|
||||||
|
// 特定群组可以覆盖
|
||||||
|
replyToMode: "first",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
`replyToMode` 值说明:
|
||||||
|
|
||||||
|
| 值 | 行为 |
|
||||||
|
| --------- | ---------------------------------- |
|
||||||
|
| `"off"` | 不引用原消息(私聊默认值) |
|
||||||
|
| `"first"` | 仅在第一条回复时引用原消息 |
|
||||||
|
| `"all"` | 所有回复都引用原消息(群聊默认值) |
|
||||||
|
|
||||||
|
> 注意:消息引用功能与流式卡片输出(`streaming: true`)不能同时使用。当启用流式输出时,回复会以卡片形式呈现,不会显示引用。
|
||||||
|
|
||||||
|
### 多 Agent 路由
|
||||||
|
|
||||||
|
通过 `bindings` 配置,您可以用一个飞书机器人对接多个不同功能或性格的 Agent。系统会根据用户 ID 或群组 ID 自动将对话分发到对应的 Agent。
|
||||||
|
|
||||||
|
配置示例:
|
||||||
|
|
||||||
|
```json5
|
||||||
|
{
|
||||||
|
agents: {
|
||||||
|
list: [
|
||||||
|
{ id: "main" },
|
||||||
|
{
|
||||||
|
id: "clawd-fan",
|
||||||
|
workspace: "/home/user/clawd-fan",
|
||||||
|
agentDir: "/home/user/.openclaw/agents/clawd-fan/agent",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "clawd-xi",
|
||||||
|
workspace: "/home/user/clawd-xi",
|
||||||
|
agentDir: "/home/user/.openclaw/agents/clawd-xi/agent",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
bindings: [
|
||||||
|
{
|
||||||
|
// 用户 A 的私聊 → main agent
|
||||||
|
agentId: "main",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "dm", id: "ou_28b31a88..." },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 用户 B 的私聊 → clawd-fan agent
|
||||||
|
agentId: "clawd-fan",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "dm", id: "ou_0fe6b1c9..." },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 某个群组 → clawd-xi agent
|
||||||
|
agentId: "clawd-xi",
|
||||||
|
match: {
|
||||||
|
channel: "feishu",
|
||||||
|
peer: { kind: "group", id: "oc_xxx..." },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
匹配规则说明:
|
||||||
|
|
||||||
|
| 字段 | 说明 |
|
||||||
|
| ----------------- | --------------------------------------------- |
|
||||||
|
| `agentId` | 目标 Agent 的 ID,需要在 `agents.list` 中定义 |
|
||||||
|
| `match.channel` | 渠道类型,这里固定为 `"feishu"` |
|
||||||
|
| `match.peer.kind` | 对话类型:`"dm"`(私聊)或 `"group"`(群组) |
|
||||||
|
| `match.peer.id` | 用户 Open ID(`ou_xxx`)或群组 ID(`oc_xxx`) |
|
||||||
|
|
||||||
|
> 获取 ID 的方法:参见上文 [获取群组/用户 ID](#获取群组用户-id) 章节。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -478,7 +593,8 @@ openclaw pairing list feishu
|
||||||
| `channels.feishu.groups.<chat_id>.enabled` | 是否启用该群组 | `true` |
|
| `channels.feishu.groups.<chat_id>.enabled` | 是否启用该群组 | `true` |
|
||||||
| `channels.feishu.textChunkLimit` | 消息分块大小 | `2000` |
|
| `channels.feishu.textChunkLimit` | 消息分块大小 | `2000` |
|
||||||
| `channels.feishu.mediaMaxMb` | 媒体大小限制 | `30` |
|
| `channels.feishu.mediaMaxMb` | 媒体大小限制 | `30` |
|
||||||
| `channels.feishu.blockStreaming` | 禁用流式输出 | `true` |
|
| `channels.feishu.streaming` | 启用流式卡片输出 | `true` |
|
||||||
|
| `channels.feishu.blockStreaming` | 启用块级流式 | `true` |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ x-i18n:
|
||||||
|
|
||||||
- **最佳用户体验:** 保持 `gateway.bind: "loopback"` 并使用 **Tailscale Serve** 作为控制 UI。
|
- **最佳用户体验:** 保持 `gateway.bind: "loopback"` 并使用 **Tailscale Serve** 作为控制 UI。
|
||||||
- **回退方案:** 保持 loopback + 从任何需要访问的机器建立 SSH 隧道。
|
- **回退方案:** 保持 loopback + 从任何需要访问的机器建立 SSH 隧道。
|
||||||
- **示例:** [exe.dev](/platforms/exe-dev)(简易 VM)或 [Hetzner](/platforms/hetzner)(生产 VPS)。
|
- **示例:** [exe.dev](/install/exe-dev)(简易 VM)或 [Hetzner](/install/hetzner)(生产 VPS)。
|
||||||
|
|
||||||
当你的笔记本电脑经常休眠但你希望智能体始终在线时,这是理想的选择。
|
当你的笔记本电脑经常休眠但你希望智能体始终在线时,这是理想的选择。
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -572,7 +572,7 @@ curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git
|
||||||
|
|
||||||
任何 Linux VPS 都可以。在服务器上安装,然后使用 SSH/Tailscale 访问 Gateway 网关。
|
任何 Linux VPS 都可以。在服务器上安装,然后使用 SSH/Tailscale 访问 Gateway 网关。
|
||||||
|
|
||||||
指南:[exe.dev](/platforms/exe-dev)、[Hetzner](/platforms/hetzner)、[Fly.io](/platforms/fly)。
|
指南:[exe.dev](/install/exe-dev)、[Hetzner](/install/hetzner)、[Fly.io](/install/fly)。
|
||||||
远程访问:[Gateway 网关远程](/gateway/remote)。
|
远程访问:[Gateway 网关远程](/gateway/remote)。
|
||||||
|
|
||||||
### 云/VPS 安装指南在哪里
|
### 云/VPS 安装指南在哪里
|
||||||
|
|
@ -580,9 +580,9 @@ curl -fsSL https://openclaw.ai/install.sh | bash -s -- --install-method git
|
||||||
我们维护了一个**托管中心**,涵盖常见提供商。选择一个并按指南操作:
|
我们维护了一个**托管中心**,涵盖常见提供商。选择一个并按指南操作:
|
||||||
|
|
||||||
- [VPS 托管](/vps)(所有提供商汇总)
|
- [VPS 托管](/vps)(所有提供商汇总)
|
||||||
- [Fly.io](/platforms/fly)
|
- [Fly.io](/install/fly)
|
||||||
- [Hetzner](/platforms/hetzner)
|
- [Hetzner](/install/hetzner)
|
||||||
- [exe.dev](/platforms/exe-dev)
|
- [exe.dev](/install/exe-dev)
|
||||||
|
|
||||||
在云端的工作方式:**Gateway 网关运行在服务器上**,你通过控制 UI(或 Tailscale/SSH)从笔记本/手机访问。你的状态 + 工作区位于服务器上,因此将主机视为数据来源并做好备份。
|
在云端的工作方式:**Gateway 网关运行在服务器上**,你通过控制 UI(或 Tailscale/SSH)从笔记本/手机访问。你的状态 + 工作区位于服务器上,因此将主机视为数据来源并做好备份。
|
||||||
|
|
||||||
|
|
@ -863,7 +863,7 @@ OpenClaw 是轻量级的。对于基本的 Gateway 网关 + 一个聊天渠道
|
||||||
- **操作系统:** Ubuntu LTS 或其他现代 Debian/Ubuntu。
|
- **操作系统:** Ubuntu LTS 或其他现代 Debian/Ubuntu。
|
||||||
|
|
||||||
如果你使用 Windows,**WSL2 是最简单的虚拟机式设置**,具有最佳的工具兼容性。参阅 [Windows](/platforms/windows)、[VPS 托管](/vps)。
|
如果你使用 Windows,**WSL2 是最简单的虚拟机式设置**,具有最佳的工具兼容性。参阅 [Windows](/platforms/windows)、[VPS 托管](/vps)。
|
||||||
如果你在虚拟机中运行 macOS,参阅 [macOS VM](/platforms/macos-vm)。
|
如果你在虚拟机中运行 macOS,参阅 [macOS VM](/install/macos-vm)。
|
||||||
|
|
||||||
## 什么是 OpenClaw?
|
## 什么是 OpenClaw?
|
||||||
|
|
||||||
|
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue