A GitHub Action that integrates dcode directly into your GitHub workflow.
Mention /dcode in your comment, and dcode will execute tasks within your GitHub Actions runner.
Leave the following comment on a GitHub issue. dcode will read the entire thread, including all comments, and reply with a clear explanation.
/dcode explain this issue
Leave the following comment on a GitHub issue. dcode will create a new branch, implement the changes, and open a PR with the changes.
/dcode fix this
Leave the following comment on a GitHub PR. dcode will implement the requested change and commit it to the same PR.
Delete the attachment from S3 when the note is removed /oc
Leave a comment directly on code lines in the PR's "Files" tab. dcode will automatically detect the file, line numbers, and diff context to provide precise responses.
[Comment on specific lines in Files tab]
/oc add error handling here
When commenting on specific lines, dcode receives:
- The exact file being reviewed
- The specific lines of code
- The surrounding diff context
- Line number information
This allows for more targeted requests without needing to specify file paths or line numbers manually.
-
Install the GitHub app https://github.com/apps/dcode-run. Make sure it is installed on the target repository.
-
Create a GitHub Actions secret named
DCODE_API_KEYwith a dcode cloud auth token for a user on the team you want the action to run as.- On a machine already logged in (
dcode auth login), the token is thetokenfield in the cloud session file (typically~/.local/share/dcode/cloud.json). - Or redeem a device-code login for an
access_tokenagainst your cloud (https://dcode.w3api.devby default) and store that value. - That bearer token authenticates the runner to the cloud inference router as that user, so the team's model allowlist and provider credentials apply — you do not need to put Anthropic/OpenAI keys in the workflow.
- On a machine already logged in (
-
Add the following workflow file to
.github/workflows/dcode.ymlin your repo. Pointmodelat a team-allowed model under thedcodeprovider (same ids your team sees after login).name: dcode on: issue_comment: types: [created] pull_request_review_comment: types: [created] jobs: dcode: if: | contains(github.event.comment.body, '/oc') || contains(github.event.comment.body, '/dcode') runs-on: ubuntu-latest permissions: id-token: write steps: - name: Checkout repository uses: actions/checkout@v6 with: fetch-depth: 1 persist-credentials: false - name: Run dcode uses: W3Dev/dcode-action@v0.0.4 env: # Cloud auth token — team models + credentials via dcode cloud DCODE_API_KEY: ${{ secrets.DCODE_API_KEY }} # Optional: override cloud origin (default https://dcode.w3api.dev) # CLOUD_URL: https://dcode.w3api.dev GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: model: dcode/anthropic/claude-sonnet-4-20250514 use_github_token: true
-
Store secrets under the organization or repository Settings → Secrets and variables → Actions. At minimum set
DCODE_API_KEY.
dcode still accepts direct provider credentials (for example ANTHROPIC_API_KEY, OPENAI_API_KEY) when you want the action to call a provider outside team cloud config. Prefer DCODE_API_KEY whenever the run should use the team's shared auth and allowlist.
- name: Run dcode uses: W3Dev/dcode-action@v0.0.4 env: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: model: anthropic/claude-sonnet-4-20250514 use_github_token: true
This is an early release. If you encounter issues or have feedback, please create an issue at https://github.com/W3Dev/dcode-action/issues.
The production action installs the public dcode CLI (https://dcode.run/install) and runs dcode github run. The index.ts entry here is for local mock testing of the GitHub event flow.
To test locally:
-
Navigate to a test repo (e.g.
hello-world):cd hello-world -
Install dependencies in this action repo (
bun install). For localindex.tsruns you also need@devpod/code-sdkavailable (link or install a build from the private dcode monorepo vendor tarball). -
Run:
MODEL=dcode/anthropic/claude-sonnet-4-20250514 \ DCODE_API_KEY=<cloud-auth-token> \ GITHUB_RUN_ID=dummy \ MOCK_TOKEN=github_pat_1234567890 \ MOCK_EVENT='{"eventName":"issue_comment",...}' \ bun /path/to/dcode-action/index.ts
MODEL: The model used by dcode. Prefer a team-alloweddcode/...model when using cloud auth.DCODE_API_KEY: Cloud auth / bearer token for the team user (preferred). Provider keys such asANTHROPIC_API_KEYare an alternative for external endpoints.GITHUB_RUN_ID: Dummy value to emulate GitHub action environment.MOCK_TOKEN: A GitHub personal access token. This token is used to verify you haveadminorwriteaccess to the test repo. Generate a token here.MOCK_EVENT: Mock GitHub event payload (see templates below).
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4},"comment":{"id":1,"body":"hey dcode, summarize thread"}}}'
Replace:
"owner":"sst"with repo owner"repo":"hello-world"with repo name"actor":"fwang"with the GitHub username of commenter"number":4with the GitHub issue id"body":"hey dcode, summarize thread"with comment body
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4},"comment":{"id":1,"body":"hey dcode, what is in my image "}}}'
Replace the image URL https://github.com/user-attachments/assets/xxxxxxxx with a valid GitHub attachment (you can generate one by commenting with an image in any issue).
MOCK_EVENT='{"eventName":"issue_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"issue":{"number":4,"pull_request":{}},"comment":{"id":1,"body":"hey dcode, summarize thread"}}}'
MOCK_EVENT='{"eventName":"pull_request_review_comment","repo":{"owner":"sst","repo":"hello-world"},"actor":"fwang","payload":{"pull_request":{"number":7},"comment":{"id":1,"body":"hey dcode, add error handling","path":"src/components/Button.tsx","diff_hunk":"@@ -45,8 +45,11 @@\n- const handleClick = () => {\n- console.log('clicked')\n+ const handleClick = useCallback(() => {\n+ console.log('clicked')\n+ doSomething()\n+ }, [doSomething])","line":47,"original_line":45,"position":10,"commit_id":"abc123","original_commit_id":"def456"}}}'