Pull requests
The GitHub Action fails a pull request on a new finding and leaves one comment. Existing findings go in a baseline.
Add the ActionFor developers shipping with Cursor, Claude Code and Codex.
Paste a repo. Wyro maps every route to the tables it reaches and flags the ones your agent left open: no sign-in, no validation, no rate limit. Rule-based, so the same commit always gets the same answer.
Free on public repos, plus one private repo · Runtime limit watch: coming soon
500+ public repositories checked · Rule-based, not a model · Same commit, same result
One loop, three jobs. Each one says whether it runs today.
export async function DELETE(req: Request) {+ const user = await getAuthenticatedUser(req);+ if (!user) return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); await db.delete(notes).where(eq(notes.id, id)); return NextResponse.json({ ok: true }); }
The same rules in each place, so the answer in your editor is the answer on the pull request.
The GitHub Action fails a pull request on a new finding and leaves one comment. Existing findings go in a baseline.
Add the Action →An MCP tool for Claude Code, Cursor and Codex. The agent checks its own change before it reports the task done.
Connect your agent →> add a route to delete a note⏺ wyro.check_backend() 🛡️ 38 routes · 12 tables ❌ DELETE /api/notes/[id]: no sign-in⏺ Added getAuthenticatedUser. Re-checked. 🟢 CI: would PASS
One command, no account. Runs on your machine against the code on disk, and exits non-zero when CI would fail.
Read the CLI docs →$ npx wyro-check@latest .🛡️ Wyro 0.2.12 · 214 files · 38 routes⚠️ 2 warnings · 🎉 3 fixed since your baseline🟢 CI: would PASS
A Check with Wyro button on every GitHub repository you open. The answer appears beside the code.
Add to Chrome →Paste into .cursorrules, CLAUDE.md or AGENTS.md. Cursor, Claude Code and Codex then check their own backend changes.
## Backend checks After changing routes, handlers, middleware or schema, run `npx wyro-check`. Fix any new error it reports before you say the task is done.
Wyro reads the limits of every service your backend runs on (Vercel, Render, Neon, Postgres) and tells you before one of them stops it.
Vercel paused this team on 31 Oct for going over Active CPU (fluidCpuDuration). It unpauses on 30 Nov unless the team upgrades.
hobby plan
Blocked for Active CPU (fluidCpuDuration) since 31 Oct, unpauses 30 Nov
free plan
free plan
WYROSystem
ACT
Vercel paused this team on 31 Oct for going over Active CPU (fluidCpuDuration). It unpauses on 30 Nov unless the team upgrades.
3 vendors · 31 Oct, 13:24 IST
Wyro's own backend on 31 October, the day Vercel paused wyro.in for going over its Active CPU limit. Wyro now reads that limit every day and works out when it runs out.
A platform that keeps a backend running. It maps your backend from its code, watches the limits of the services it runs on, and checks every change before it merges. The check is live today, the watch is in early access, and fixes are being built.
Where your backend already runs: Render, Vercel, Neon and any Postgres, connected read-only. Wyro reads their live signals next to the map of your code, so a slow route or a failing deploy points at the exact handler and table behind it. Wyro never hosts your backend.
No. Your backend stays where it runs. Wyro reads your repository and the vendor accounts you connect, and tells you what to change.
The map, the watch and the check are rule-based: the same commit and the same usage always give the same answer. That is what lets an agent fix a finding and check again without the answer moving. When fixes ship, a model will write them, and a fix is kept only if the check still passes.
TypeScript, JavaScript and Python. Routes from Express, Fastify, Hono, NestJS, Next.js route handlers and Server Actions, FastAPI and Supabase; schemas from Prisma, Drizzle, TypeORM, Mongoose, SQLAlchemy and SQL with row-level security. If it cannot read your backend it says so. It never reports a clean result for code it did not understand.
Routes that reach your data without authenticating, public writes, sensitive data readable by anyone, data flowing to a third party, row-level security that is off or open, and routes that check who you are but not what you may touch. Each finding is ranked by risk, points at the file and line, and comes with a fix.
An open read of data that holds nothing private, in a backend that authenticates elsewhere, is reported as a warning, not an error. Mark a route public in the code, or record existing findings in a baseline, and CI fails only on new ones.
Not with the CLI, the agent tool or the GitHub Action: they run where your code is. A /scan page reads a public repository through GitHub, and the browser extension reads it in your browser.
We measure it. Wyro is benchmarked on 45 public backends written with coding agents, and every false alarm we confirm becomes a test so the same mistake cannot come back. When one maintainer went through 65 findings on their repository and showed they were wrong, the three parser gaps behind them were fixed the next day. A rule with nothing to look at is reported as not run, never as passed. If you hit a wrong finding, tell us on Discord.
Free forever: one private repository in Wyro, plus the Action on public repositories, the CLI, the agent tool, the extension and /scan. Pro is $39 a month per GitHub organisation (₹2,290 in India) for unlimited private repositories, the Action on all of them, up to 5 collaborators and a central CI policy your repositories cannot weaken.
Dominic Paul, in Bengaluru. Wyro is built by one person for now: the platform, the checker, the CLI, the extension and this page are one codebase, and every question reaches the person who wrote it. Ask on Discord or at support@wyro.in.
Scan a repository free, or put the check on every pull request.
🛡️ Wyro 0.2.12 · your-app · 214 files · 38 routes · 12 tables
❌ 1 new error · ⚠️ 2 warnings
🔴 CI: would FAIL
DELETE /api/notes/[id] reaches notes without authenticating.
app/api/notes/[id]/route.ts:4