Agent skill

Convex Security Check

by waynesutton in waynesutton/builder-skills

Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code.

Apache-2.0Auto-check passedDevelopment

Install Convex Security Check

skills CLI
$ npx skills add waynesutton/builder-skills --skill convex-security-check -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install waynesutton/builder-skills convex-security-check --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/waynesutton/builder-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/convex-security-check .claude/skills/convex-security-check && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
convex-security-check
GitHub stars
404
Token cost
~2k tokens
SKILL.md length
788 words
Files
4 (incl. assets)
Skills in repo
17
Repo updated
First seen
Licence
Apache-2.0

At a glance

Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code.

  • Works in 6 steps: Public vs internal → Auth → Validation → …
  • Says quick security check
  • SKILL.md covers When to reach for this, Checklist, One fix, before and after and Common mistakes, plus 2 more sections
  • Calls rg

What it does

Convex Security Check is an agent skill from waynesutton/builder-skills. Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code. Use before merging a pull request, after adding new public functions, or when the user says 'quick security check'.

Its SKILL.md is about 2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 5 other files, including assets (for example `agents/openai.yaml`).

It sits in Development, covering Pull requests. It works with Convex. The repository describes itself as: Builder skills for Convex apps. Convex patterns plus a PRD, task.md, changelog, and files.md workflow for Claude Code, Codex, Cursor, and OpenCode. The licence is Apache-2.0.

When your agent uses it

  • Says quick security check
  • Tasks that involve Pull requests

Example prompts

  • “quick security check”
  • “/convex-security-check”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. Public vs internal
  2. Auth
  3. Validation
  4. Ownership and IDs
  5. Secrets
  6. HTTP and storage

What it can do on your machine

Read from SKILL.md and the folder at commit 82d1ce2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • rg

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • docs.convex.dev

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Convex Security Check loads about 2k tokens when it runs. Until then it costs about 84 tokens; SKILL.md has 788 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~84
When it runs · the whole SKILL.md, loaded when a task matches
~2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from waynesutton/builder-skills at commit 82d1ce2, republished under its Apache-2.0 licence (© waynesutton). 788 words, ~1,955 tokens.

Download SKILL.mdSave it as .claude/skills/convex-security-check/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.
name
convex-security-check
description
Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code. Use before merging a pull request, after adding new public functions, or when the user says 'quick security check'.

Convex security check

A ten minute pass over convex/ that catches the mistakes that ship most often. The one rule: every exported query, mutation, and action is a public endpoint anyone can call with any arguments, so each one must check identity and ownership or be intentionally anonymous.

Run each grep, read what it surfaces, fix or file. This skill finds problems; it does not map the whole system. For that, hand off to convex-security-audit.

When to reach for this

  • Before merging a pull request that touches convex/
  • After adding or renaming public functions
  • The user says "quick security check", "sanity check the backend", or "anything obviously wrong here"
  • Before a dev to prod push, when there is no time for a full audit

Checklist

Run the commands from the project root. Every grep excludes _generated.

1. Public vs internal

Anything only called by other Convex functions, the scheduler, crons, or webhooks should be internalQuery, internalMutation, or internalAction.

bash
rg -n "export const \w+ = (query|mutation|action)\(" convex --glob '!**/_generated/**'
rg -n "\bapi\.\w+\.\w+" convex --glob '!**/_generated/**'

The second grep finds api.* used inside the backend. Server code scheduling or running a public function is almost always a sign that function should be internal.

  • Every public function has a client that needs to call it
  • No api.* inside ctx.scheduler.*, ctx.run*, or crons.*
  • Admin only operations (role changes, credit grants, deletions across users) are internal
2. Auth
bash
rg -l "= (query|mutation|action)\(" convex --glob '!**/_generated/**' \
  | xargs rg -L "getUserIdentity|getCurrentUser|authedQuery|authedMutation"

Files listed contain public functions and no auth call at all. Open each one. A public post list is fine anonymous. Anything that returns or writes user data is not.

  • Every public function checks identity or is documented as intentionally anonymous
  • Auth helpers throw or return early when identity is missing
  • Roles come from the users table, never from client arguments
3. Validation
bash
rg -nU "(query|mutation|action)\(\{\s*handler" convex --glob '!**/_generated/**'
rg -n "v\.any\(\)" convex --glob '!**/_generated/**'

The first grep finds functions whose definition starts with handler, meaning no args. The second finds v.any(), which turns off validation for that field.

  • Every function has args and returns validators
  • No v.any() on arguments that reach the database or an external API
  • Return validators list fields explicitly so passwordHash, stripeCustomerId, and internal flags cannot leak
4. Ownership and IDs

v.id("tasks") proves the string is a valid ID for that table. It does not prove the caller owns the document.

bash
rg -n "ctx\.db\.(get|patch|delete|replace)\(args\." convex --glob '!**/_generated/**'
rg -n "userId: v\.(id|string)\(" convex --glob '!**/_generated/**'

For each hit in the first grep, find the ownership comparison between the read and the write. For the second, a public function that accepts the caller's own userId as an argument is trusting the client to say who it is.

  • Every get, patch, delete, replace by a client supplied ID is followed by an ownership or membership check
  • Caller identity is derived from ctx.auth, never accepted as an argument
  • Lists use withIndex on the owner field, not a full scan plus filter
5. Secrets
bash
rg -n -i "(sk_live|sk_test|whsec_|AKIA[0-9A-Z]{16}|-----BEGIN|api[_-]?key\s*[:=]\s*['\"][A-Za-z0-9])" convex src --glob '!**/_generated/**'
rg -n "process\.env\." src

Anything in src/ that reads process.env or import.meta.env ships to the browser. Only deployment URLs and public client IDs belong there.

  • No secret literals in convex/, src/, tests, or fixtures
  • Secrets read from process.env inside the action or HTTP action that uses them
  • Dev and prod deployments use different keys
Show full SKILL.md (293 more words)Show less
6. HTTP and storage
bash
rg -n "http\.route|httpAction\(" convex/http.ts
rg -n "storage\.(generateUploadUrl|getUrl)" convex --glob '!**/_generated/**'
  • Every http.ts route verifies its caller (webhook signature, bearer token, or getUserIdentity) before parsing the body
  • Routes call internal.*, not api.*
  • generateUploadUrl requires auth
  • getUrl is called on a storage ID read from a document the caller owns, never on a storage ID passed by the client

One fix, before and after

The most common finding: auth is checked, ownership is not.

Before:

typescript
export const updateTask = mutation({
  args: { taskId: v.id("tasks"), title: v.string() },
  returns: v.null(),
  handler: async (ctx, args) => {
    const identity = await ctx.auth.getUserIdentity();
    if (!identity) throw new ConvexError("Sign in required");
    // any signed in user can rename any task
    await ctx.db.patch(args.taskId, { title: args.title });
    return null;
  },
});

After:

typescript
import { mutation } from "./_generated/server";
import { v, ConvexError } from "convex/values";
import { getCurrentUser } from "./lib/auth";

export const updateTask = mutation({
  args: { taskId: v.id("tasks"), title: v.string() },
  returns: v.null(),
  handler: async (ctx, args) => {
    const user = await getCurrentUser(ctx); // throws when signed out
    const task = await ctx.db.get(args.taskId);
    // same error for missing and not owned, so IDs cannot be probed
    if (!task || task.userId !== user._id) {
      throw new ConvexError({ code: "NOT_FOUND", message: "Task not found" });
    }
    await ctx.db.patch(args.taskId, { title: args.title });
    return null;
  },
});

getCurrentUser looks the user up through a by_tokenIdentifier index using identity.tokenIdentifier and throws when there is no identity. Define it once in convex/lib/auth.ts and use it everywhere.

Common mistakes

MistakeWhy it breaksDo this instead
Checking auth in the React component onlyAnyone can call the function from the dashboard or a scriptCheck in the handler
v.id("users") argument for "the current user"Client can pass any user's IDDerive from ctx.auth.getUserIdentity()
Comparing ownership to identity.emailEmails can be reused or unverifiedCompare to user._id
internalMutation treated as safe on its ownThe public caller may pass unverified IDsCheck the call site too
Fixing one hit and moving onThe same pattern usually appears in siblingsFix all hits from the grep

Hand off to convex-security-audit

Stop and run the full audit when any of these are true:

  • More than two or three findings in steps 2 or 4; the pattern is systemic
  • The app has multi tenant data (orgs, teams, workspaces)
  • http.ts has webhook routes or routes that return user data
  • Files are uploaded and served
  • The user asks for a report, a launch review, or a post incident review

The audit maps auth per function, data access per table, HTTP exposure, storage, scheduler trust, rate limiting, and produces a written findings report. This check does not.

Docs

© waynesutton, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 3 other files (assets) in skills/convex-security-check of waynesutton/builder-skills.

  • SKILL.md
  • agents/openai.yaml
  • assets/large-logo.png
  • assets/small-logo.svg

Open the folder on GitHubat commit 82d1ce2

Compare with similar skills

Convex Security Check next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Convex Security Check compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Convex Security Check this skillwaynesutton/builder-skills404—~2kAutomated safety check: PassApache-2.0
YugabyteDB Phorge Diff Creatoryugabyte/yugabyte-db11k—~3.1kAutomated safety check: PassCustom licence
Verdaccio Code Reviewverdaccio/verdaccio18k—~853Automated safety check: PassMIT
Bug Huntercodexstar69/bug-hunter519—~5kAutomated safety check: PassMIT
trace-mcp Pre-Commit Checksnikolai-vysotskyi/trace-mcp186—~565Automated safety check: PassMIT
Code Review with Beads Tasksmaslennikov-ig/claude-code-orchestrator-kit260—~2kAutomated safety check: PassCustom licence

Similar skills

  • YugabyteDB Phorge Diff Creator

    yugabyte/yugabyte-db

    Creates a Phorge code review diff for the current branch with arc diff, while applying public-repo confidentiality rules since Phorge content later lands verbatim on the public GitHub repo.

    11k GitHub stars~3.1k tokensUpdated today
    DevelopmentAuto-check passed
  • Verdaccio Code Review

    verdaccio/verdaccio

    Reviews a verdaccio diff, branch or PR against the repository's review guide, verifies each finding in the code and reports only actionable issues.

    18k GitHub stars~853 tokensUpdated 2 days ago
    DevelopmentAuto-check passed
  • Bug Hunter

    codexstar69/bug-hunter

    Precision-first adversarial bug hunting for runtime, logic, data, concurrency, and security defects.

    519 GitHub stars~5k tokensUpdated 1 mo ago
    DevelopmentAuto-check passed
  • trace-mcp Pre-Commit Checks

    nikolai-vysotskyi/trace-mcp

    Runs trace-mcp security, quality-gate and antipattern checks before a commit or pull request, and builds a symbol-level diff for the PR description.

    186 GitHub stars~565 tokensUpdated today
    DevelopmentAuto-check passed
  • Code Review with Beads Tasks

    maslennikov-ig/claude-code-orchestrator-kit

    Reviews staged changes, a branch, a PR or a path for bugs, security gaps and performance issues, then writes an evidence-based report and creates Beads tasks.

    260 GitHub stars~2k tokensUpdated 7 mo ago
    DevelopmentAuto-check passed
  • Code review covering security, performance, quality and maintainability, with a fixed report layout and two analysis scripts; the SKILL.md itself is in Ukrainian.

    42k GitHub stars~484 tokensUpdated 8 days ago
    DevelopmentAuto-check passed

More from waynesutton/builder-skills

All 17 skills in this repo
  • Convex Agents

    waynesutton/builder-skills

    Builds AI agents on the Convex agent component: threads, messages, tools that call queries and mutations, streaming, RAG with vector search, and workflows for multi step jobs.

    404 GitHub stars~2.2k tokensUpdated 10 days ago
    Auto-check passed
  • Convex Best Practices

    waynesutton/builder-skills

    Production patterns for Convex apps and the rules the @convex-dev/eslint-plugin enforces: validators, indexes, idempotent mutations, avoiding OCC conflicts, thin function wrappers, error handling.

    404 GitHub stars~2.6k tokensUpdated 10 days ago
    Auto-check passed
  • Convex Component Authoring

    waynesutton/builder-skills

    Creates reusable Convex components with defineComponent, a clean client wrapper, their own schema, and an npm publish setup.

    404 GitHub stars~2.6k tokensUpdated 10 days ago
    Auto-check passed
  • Convex Cron Jobs

    waynesutton/builder-skills

    Schedules work in Convex: cron jobs in convex/crons.ts, one off scheduled functions with runAfter and runAt, batching large jobs, and cancelling or inspecting the queue.

    404 GitHub stars~2k tokensUpdated 10 days ago
    Auto-check passed
  • Convex HTTP Actions

    waynesutton/builder-skills

    Adds HTTP endpoints in convex/http.ts: webhook receivers with signature checks, REST style routes, CORS, auth headers, streaming responses, and file uploads over HTTP.

    404 GitHub stars~2.6k tokensUpdated 10 days ago
    Auto-check passed
  • Convex Migrations

    waynesutton/builder-skills

    Changes a live Convex schema without downtime: make a field optional, backfill in batches, flip the validator, then clean up.

    404 GitHub stars~2.1k tokensUpdated 10 days ago
    Auto-check passed

Works with

Questions about Convex Security Check

What does Convex Security Check do?

Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code. Convex Security Check is an agent skill from waynesutton/builder-skills. Ten minute security pass over a Convex backend: public functions that should be internal, missing auth checks, unvalidated args, IDs from the client trusted without ownership checks, secrets in code.

When should I use Convex Security Check?

Convex Security Check fits situations like: says quick security check; tasks that involve Pull requests.

How do I install Convex Security Check in Claude Code?

Run `npx skills add waynesutton/builder-skills --skill convex-security-check -a claude-code`. Or copy the skill folder (skills/convex-security-check in waynesutton/builder-skills) into .claude/skills/convex-security-check in your project. Claude Code loads it when a task matches its description.

How do I install Convex Security Check in Codex?

Run `npx skills add waynesutton/builder-skills --skill convex-security-check -a codex`. Or copy the skill folder (skills/convex-security-check in waynesutton/builder-skills) into .agents/skills/convex-security-check in your project. Codex loads it when a task matches its description.

Can I use Convex Security Check in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add waynesutton/builder-skills --skill convex-security-check -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/convex-security-check, .gemini/skills/convex-security-check, .github/skills/convex-security-check and .opencode/skills/convex-security-check in your project.

What does Convex Security Check need to run?

Going by SKILL.md and its folder, Convex Security Check needs the command-line tools its instructions call (rg).

Does Convex Security Check access the network?

SKILL.md names 1 domain. As links in the text: docs.convex.dev. This is read from the text; nothing was executed.

Is Convex Security Check safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Convex Security Check use?

Convex Security Check is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Convex Security Check use?

About 2k tokens (SKILL.md is roughly 7.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Convex Security Check?

Skills that share tags, products or a category with Convex Security Check: YugabyteDB Phorge Diff Creator (yugabyte/yugabyte-db, 11k stars), Verdaccio Code Review (verdaccio/verdaccio, 18k stars), Bug Hunter (codexstar69/bug-hunter, 519 stars) and trace-mcp Pre-Commit Checks (nikolai-vysotskyi/trace-mcp, 186 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Convex Security Check?

waynesutton (a GitHub user) maintains it in waynesutton/builder-skills, which has 404 GitHub stars. The repository holds 17 skills in this directory. The repository was last updated on September 28, 2026.

Source: waynesutton/builder-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.