2026 OpenClaw Frontend on a Remote Mac:
One PR Gate Summary from Oxlint JSON + Biome Reporter JSON
Who this is for: teams on Oxc plus Biome that still want one reviewer digest per pull request. This HowTo runs both tools on workers—including a leased remote Mac—then lets an OpenClaw-style gateway merge trees, evaluate budgets, and upsert one comment. For a different toolchain, see classic linter JSON merge. For secrets, use scoped automation for summaries.
00 HowTo: reproducible checklist
Follow the same ordering on your laptop, CI, and the remote Mac so hashes and paths line up when the gateway merges reports.
- Install pinned
oxlintand@biomejs/biomeversions; commit them topackage.jsonso Apple Silicon caches stay warm. - Emit Oxlint JSON with
oxlint --format jsonredirected to.openclaw/reports/oxlint.json(diagnostics array at the top level). - Emit Biome JSON with
biome check --reporter=jsonorbiome ci --reporter=jsonto.openclaw/reports/biome.json; keep stderr clean for other stages. - Upload both files plus
GIT_SHA,PR_NUMBER, andREPO_ROOThints to the OpenClaw gateway that runs beside your Git host. - Run the merge script, evaluate the threshold table below, write
pr_lint_gate_summary.md, then call the provider API to upsert the PR comment. - Optionally enqueue a second job that reads only the Markdown digest and calls an OpenAI-compatible chat completion—never send raw secrets.
Stage ordering with browser work stays compatible with Playwright shard reporting on remote Mac: keep fast static checks before shards fan out.
01 Why two JSON streams still hurt reviewers
- Shape drift: Oxlint wraps findings under
diagnosticswith string severities, while Biome nests rule identifiers undercode.value. Without a merge layer, bots double-count or drop files. - Path noise: absolute paths differ between CI and a developer Mac. Reviewers see flickering filenames unless the gateway strips the repository root consistently.
- Comment spam: posting two bot messages per push trains people to ignore automation. A single upsert with a stable marker keeps signal high.
02 Decision matrix: where each tool wins
Use the matrix to justify budgets to security and frontend leads; it also guides which totals appear first in the Markdown table.
| Concern | Oxlint focus | Biome focus |
|---|---|---|
| Throughput on huge trees | Rust parser, parallel by default | Single toolchain for format plus lint |
| Policy surface | Oxc rule catalog and plugins | Assists, import sorting, JSON files |
| Merge strategy | Treat severity: error as hard fail |
Map diagnostic severity to the same enum |
03 Emitting stable artifacts on Node 22+
Keep stdout reserved for human triage in local shells, but always write JSON to disk in automation. The gateway should never shell out to the linters again unless you detect truncated files.
Snippet — package scripts:
{
"engines": { "node": ">=22" },
"scripts": {
"lint:oxlint:json": "mkdir -p .openclaw/reports && oxlint --format json . > .openclaw/reports/oxlint.json",
"lint:biome:json": "mkdir -p .openclaw/reports && biome check --reporter=json . > .openclaw/reports/biome.json",
"lint:fast:json": "npm run lint:oxlint:json && npm run lint:biome:json"
}
}
If Biome warns that JSON reporters are experimental, pin a minor version and snapshot fixtures so upgrades stay boring.
04 Gateway thresholds you can check in
Store budgets beside the merge script so both humans and the gateway read the same numbers. Exit non-zero when any hard row fails; treat soft rows as warn-only on feature branches if you flip a single flag.
| Signal | Hard fail when | Suggested soft cap |
|---|---|---|
| Oxlint diagnostics with severity error | count > 0 | n/a |
| Biome diagnostics at error level | count > 0 | n/a |
| Combined warnings | release branch only | ≤ 24 until cleanup sprint ends |
| Markdown body length | provider rejects payload | ≤ 32k chars after truncation |
Your merge reducer should emit lint_gate/v2 (or another explicit version) with per-tool totals, top five rules, and at most five files per rule so the PR view stays skimmable.
05 Optional: gateway → OpenAI-compatible client
After the Markdown exists, POST it to any OpenAI-compatible base URL—vLLM, Azure OpenAI, or OpenAI—via chat completions. Keep the system prompt tiny: no invented paths, honor truncation markers, bullets only.
Set OPENAI_BASE_URL and OPENAI_API_KEY on the gateway that already holds Git tokens; log response IDs only. Order: JSON merge, HTTP gate, LLM, PR comment so model outages never block merges.
06 PR comment idempotency and transport retries
Reuse the hidden HTML marker pattern from other OpenClaw digests: hash repo slug, pull number, and both JSON fingerprints, then search prior bot comments before creating a new one. Retry only HTTP 429 and 5xx responses with capped backoff so flaky Wi-Fi on a home runner does not masquerade as a lint failure.
Avoid embedding private preview URLs that require org login; link to public docs on MacWww Help or name CI job numbers instead.
When Oxlint and Biome both write JSON under one directory contract, your OpenClaw gateway on a remote Mac can own policy: merge shapes, enforce budgets, optionally narrate risks through an OpenAI-compatible hop, and still return a single PR-facing summary humans will actually read.
Browse MacWww Home, the Help center, and the blog index for SSH, VNC, and checkout paths.
Run Oxlint + Biome Gates on a Dedicated Remote Mac
Need deterministic Node workers next to Safari smoke tests? Lease an Apple Silicon remote Mac, park your OpenClaw merge scripts there, and open buy.html to finish checkout without creating an account first.