FastAPI Expert
Jeffallan/claude-skills
Builds async Python APIs with FastAPI and Pydantic V2, covering endpoints, JWT authentication, async SQLAlchemy, WebSockets and pytest checks against the OpenAPI docs.
A skill your agent uses when building or modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD, crudrouter, EndpointCreator, FilterConfig…
$ npx skills add benavlabs/fastcrud --skill fastcrud -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install benavlabs/fastcrud fastcrud --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .claude/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .claude/skills/fastcrud && rm -rf skills-srcUse ~/.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/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .claude/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrudType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add benavlabs/fastcrud --skill fastcrud -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install benavlabs/fastcrud fastcrud --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .agents/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .agents/skills/fastcrud && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .agents/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benavlabs/fastcrud --skill fastcrud -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install benavlabs/fastcrud fastcrud --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .cursor/skills/fastcrud && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .cursor/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/benavlabs/fastcrud.git --path fastcrud/.agents/skills/fastcrud--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add benavlabs/fastcrud --skill fastcrud -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install benavlabs/fastcrud fastcrud --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .gemini/skills/fastcrud && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .gemini/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install benavlabs/fastcrud fastcrudInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add benavlabs/fastcrud --skill fastcrud -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .github/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .github/skills/fastcrud && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .github/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add benavlabs/fastcrud --skill fastcrud -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install benavlabs/fastcrud fastcrud --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/benavlabs/fastcrud.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .opencode/skills/fastcrud && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fastcrud" agent skill from https://github.com/benavlabs/fastcrud/tree/main/fastcrud/.agents/skills/fastcrud into .opencode/skills/fastcrud/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fastcrud", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fastcrudA skill your agent uses when building or modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD, crudrouter, EndpointCreator, FilterConfig…
Fastcrud is an agent skill from benavlabs/fastcrud. Use when building or modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD, crudrouter, EndpointCreator, FilterConfig, JoinConfig, auto-relationship detection, the filter operator syntax (gte, in, ilike, etc.), cursor pagination, soft delete, and how to avoid N+1 queries when fetching related data. Activate when the user mentions FastCRUD, crudrouter, FastCRUD(), FilterConfig, JoinConfig, or asks how to build CRUD endpoints / generate REST APIs from SQLAlchemy…
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/endpoints.md`, `references/filters.md` and `references/joins.md`).
It sits in Backend & APIs, covering Backend development, ORMs and data access and REST APIs. It works with SQLAlchemy, FastAPI, Pydantic and Python. The repository describes itself as: FastCRUD is a Python package for FastAPI, offering robust async CRUD operations and flexible endpoint creation utilities. The licence is MIT.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1856653. It shows what the files ask for, not the result of running them.
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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fastcrud loads about 5k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 158 tokens; SKILL.md has 1,407 words of instructions outside code blocks.
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.
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.
The full file from benavlabs/fastcrud at commit 1856653, republished under its MIT licence (© benavlabs). 1,407 words, ~4,951 tokens.
.claude/skills/fastcrud/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.FastCRUD generates async CRUD methods (and optionally CRUD endpoints) for SQLAlchemy 2.0 models inside a FastAPI app. The two entry points are:
FastCRUD(Model) — the data-access class. Use this for per-row CRUD operations (single-record get / create / update / delete, paginated lists, joins with relationships). Real codebases use this in services, workers, and custom endpoints.crud_router(...) — returns an APIRouter with create/read/update/delete endpoints auto-wired. Use this only when you want generated endpoints; many apps skip it and hand-roll FastAPI routes on top of FastCRUD instances.This skill covers the public API across fastcrud >= 0.22. SQLAlchemy is the default ORM in examples; SQLModel works the same way except where noted.
Before reaching for FastCRUD, check the When NOT to use FastCRUD section below. Aggregate roll-ups, CTEs, GROUP BY projections, and bulk writes are SQLAlchemy's job — FastCRUD is for per-row CRUD.
The minimal viable pattern. Always start here, then add filters/joins/relationships as needed.
# models.py
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import DeclarativeBase, relationship
class Base(DeclarativeBase): pass
class Tier(Base):
__tablename__ = "tier"
id = Column(Integer, primary_key=True)
name = Column(String, unique=True)
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String, unique=True)
tier_id = Column(Integer, ForeignKey("tier.id"))
tier = relationship("Tier")# schemas.py
from pydantic import BaseModel, ConfigDict
class UserCreate(BaseModel):
name: str
email: str
tier_id: int
class UserRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str
email: str
tier_id: int
class UserUpdate(BaseModel):
name: str | None = None
email: str | None = None# main.py
from fastapi import FastAPI
from fastcrud import crud_router
from .db import get_async_session
from .models import User
from .schemas import UserCreate, UserRead, UserUpdate
app = FastAPI()
user_router = crud_router(
session=get_async_session, # callable returning AsyncSession (FastAPI dependency)
model=User,
create_schema=UserCreate,
update_schema=UserUpdate,
select_schema=UserRead, # used for read responses
path="/users",
tags=["users"],
)
app.include_router(user_router)This produces POST /users, GET /users/{id}, PATCH /users/{id}, DELETE /users/{id}, DELETE /users/db_delete/{id} (hard delete), and GET /users (paginated list).
When using FastCRUD(Model) directly, pick the method that matches the data shape you actually need. Do not loop over get_multi() and call get_joined() per row — that's the canonical N+1.
| Need | Use |
|---|---|
| Single row, no joins | get(db, id=...) |
| Single row with related data | get_joined(db, id=...) |
| Paginated list, no joins | get_multi(db, offset, limit) |
| Paginated list with related data | get_multi_joined(db, ...) |
| Cursor-paginated list (infinite scroll) | get_multi_by_cursor(db, ...) |
| Insert | create(db, schema) |
| Insert-or-update by unique constraint | upsert(db, schema) / upsert_multi(db, list) |
| Patch by filters | update(db, schema, **kwargs) |
| Soft delete (if configured) | delete(db, **kwargs) |
| Hard delete (always removes row) | db_delete(db, **kwargs) |
| Count | count(db, **kwargs) |
| Boolean existence check | exists(db, **kwargs) |
FastCRUD has two mechanisms to prevent N+1 when fetching related data. Use one of them — never iterate.
Set include_relationships=True on crud_router (or auto_detect_relationships=True on the FastCRUD method directly). FastCRUD inspects the SQLAlchemy mapper, builds the joins, and threads them through a single query.
crud_router(
session=get_async_session,
model=User,
create_schema=UserCreate,
update_schema=UserUpdate,
select_schema=UserWithTier, # schema includes nested tier field
include_relationships=True, # auto-include all relationships
path="/users",
)Or pass a list to include only specific relationships:
include_relationships=["tier", "department"] # whitelistGotcha: One-to-many relationships are excluded by default because they can return unbounded data. Opt in explicitly:
include_relationships=True,
include_one_to_many=True,
default_nested_limit=10, # cap nested rows per parent (uses SQL window function)default_nested_limit uses row_number() OVER (PARTITION BY ...) at the database level — it does not fetch everything and slice in Python.
JoinConfig (when you need explicit control)For self-joins, aliases, custom join conditions, or per-join schemas:
from fastcrud import FastCRUD, JoinConfig
orders_with_user = await crud.get_multi_joined(
db=session,
joins_config=[
JoinConfig(
model=User,
join_on=Order.user_id == User.id,
join_prefix="user_", # avoid column collisions
schema_to_select=UserRead,
),
],
offset=0,
limit=20,
)For one-to-many with per-parent capping:
JoinConfig(
model=Article,
join_on=Article.author_id == Author.id,
relationship_type="one-to-many",
sort_columns="created_at",
sort_orders="desc",
nested_limit=5, # 5 most recent articles per author, computed in SQL
)See references/joins.md for the full JoinConfig spec, polymorphic inheritance, and the auto-detection rules.
limit=None — the second biggest footgunget_multi(...) / get_multi_joined(...) accept limit=None to fetch every matching row. This is the single biggest cause of latency cliffs and OOMs in real-world FastCRUD code.
Rule: limit=None is only safe when a WHERE clause domain-bounds the result to a known-small set. Otherwise, always pass an explicit numeric limit.
# OK: scoped to a single project → bounded by N(clips per project)
clips = await crud_clips.get_multi(db, limit=None, project_id=project.id)
# OK: scoped to a small known set of IDs
tiers = await crud_tiers.get_multi(db, limit=None, id__in=tier_ids)# BAD: grows linearly with the user table forever
users = await crud_users.get_multi(db, limit=None)
# GOOD: HTTP endpoint with a hard ceiling
limit = min(requested_limit, MAX_PAGE_LIMIT)
users = await crud_users.get_multi(db, offset=offset, limit=limit)limit=None resultsWhen limit=None is justified, log when results unexpectedly explode so drift is caught before it becomes an incident:
def handle_query_sanity(items: list, threshold: int, context: str) -> None:
if len(items) > threshold:
logger.warning("query growth: %d > %d threshold (%s)",
len(items), threshold, context)
entitlements = await crud_entitlements.get_multi(db, limit=None, user_id=user.id)
handle_query_sanity(entitlements["data"], threshold=100, context="user_entitlements")| Surface | Default |
|---|---|
| HTTP list endpoint | limit = min(requested, MAX_LIMIT) |
| Worker fetch of bounded child collection | Explicit cap (limit=RENDER_MAX_CLIPS) |
| Bulk fan-out across a large table | get_multi_by_cursor(limit=BATCH) |
FastCRUD is the right tool for per-row CRUD on a single model, optionally with relationship joins. Drop to raw SQLAlchemy when the query shape is anything else. In a typical app the split is roughly 80/20 — most data access is FastCRUD's territory, but the 20% that isn't is firmly SQLAlchemy's.
| Query shape | Use instead |
|---|---|
Aggregate roll-up (SUM, conditional COUNT FILTER WHERE, HAVING) | select(func.sum(...), func.count().filter(...)) |
CTEs, correlated subqueries, EXISTS() filters | select(...).where(~exists().where(...)) |
GROUP BY with derived columns (Project + count(clips)) | select(Project, func.count(Clip.id)).group_by(Project.id) |
Bulk UPDATE ... WHERE id IN (...) with column-expression RHS | update(...).values(expires_at=Model.expires_at + interval) |
Bulk INSERT (more than ~10 rows) | db.execute(insert(Model), records) |
Dialect-specific features (Postgres advisory locks, array_agg, JSONB) | text("SELECT pg_advisory_xact_lock(...)") etc. |
Anything you'd reach for joinedload / selectinload / contains_eager for | FastCRUD JoinConfig — it covers this |
crud_router itself is optional. Production codebases often use FastCRUD instances as the data-access layer behind hand-written FastAPI routes, skipping crud_router entirely so they can compose auth, validation, and business logic without subclassing EndpointCreator.
crud.get() — classic N+1.# BAD
for tier_id in tier_ids:
tier = await crud_tiers.get(db, id=tier_id)
# GOOD — one query
tiers = await crud_tiers.get_multi(db, id__in=tier_ids, limit=None)db.scalar(select(Model).where(...).exists()) — use await crud.exists(**filters).get_multi(limit=None) then Python filtering — push the filter into kwargs so the database does the work.crud.get() in a hot path without schema_to_select — selects every column. Pass a minimal schema to cut payload size.crud.create() — calls go one-at-a-time. For >10 rows use crud.upsert_multi(...) or raw db.execute(insert(Model), records).FastCRUD accepts filters as keyword arguments on every read/update/delete method, and via FilterConfig for crud_router's GET /list endpoint.
The operator goes after a double underscore:
await crud.get_multi(db, price__gte=10, name__ilike="%admin%", id__in=[1, 2, 3])| Suffix | SQL | Notes |
|---|---|---|
| (none) | = | bare field name is equality |
__eq | = | explicit form |
__ne | <> | |
__gt __gte | > >= | |
__lt __lte | < <= | |
__in | IN (...) | value must be list/tuple/set |
__not_in | NOT IN (...) | same |
__between | BETWEEN a AND b | value must be a 2-element sequence |
__like | LIKE | case-sensitive |
__ilike | ILIKE | case-insensitive (Postgres) |
__startswith __endswith __contains | substring match (auto-wraps with %) | pass the bare substring — do NOT add % yourself |
__is __is_not | IS IS NOT | for NULL checks |
__match | engine-specific full-text | depends on dialect |
Walk relationships with .:
await crud.get_multi_joined(db, **{"tier.name__eq": "premium"})Or, equivalently, build the kwargs dict literal-style. In FilterConfig:
FilterConfig({
"name__ilike": None, # query string param: ?name__ilike=foo
"price__gte": None,
"tier.name": None, # joined filter — auto-includes the tier relationship
})?filter=false is correctly parsed (case-insensitive: False, FALSE, 0, true, TRUE, 1). No need to pre-coerce.
See references/filters.md for FilterConfig deep-dive, Depends(...) filters (filter by current user automatically), and custom operator registration.
The biggest footgun. Several methods have non-obvious defaults that changed in v0.20:
create()schema_to_select: returns None (since v0.20.0 — was the model in earlier versions).schema_to_select: returns a dict.schema_to_select + return_as_model=True: returns a Pydantic instance.await crud.create(db, UserCreate(...)) # → None
await crud.create(db, UserCreate(...), schema_to_select=UserRead) # → dict
await crud.create(db, UserCreate(...), schema_to_select=UserRead,
return_as_model=True) # → UserReadreturn_as_model=True requires schema_to_select (else raises ValueError).
get() / get_multi() / get_joined() / etc.Same pattern: return_as_model=True requires schema_to_select. Without schema_to_select, all columns are returned as a dict.
schema_to_select propagates the subclass type (v0.22+)If you pass a subclass override per-call, the return type narrows correctly — no manual cast() needed:
class UserAdminRead(UserRead):
role: str
result = await crud.get(db, id=1, schema_to_select=UserAdminRead, return_as_model=True)
# result is typed as UserAdminRead | None, not UserRead | Noneupdate(return_columns=...) must be a list (v0.22+)return_columns=True raises ValueError. Pass a list:
await crud.update(db, schema=UserUpdate(name="X"), return_columns=["id", "name"], id=1)commit=False for transactionsAll write methods take commit=False. Use it when chaining multiple operations under a single transaction; commit once at the end with await db.commit().
Configure at the FastCRUD level:
crud = FastCRUD(User, is_deleted_column="is_deleted", deleted_at_column="deleted_at")
await crud.delete(db, id=1) # soft: sets is_deleted=True, deleted_at=now
# (requires both columns on the model)
await crud.db_delete(db, id=1) # hard: actual DELETE — always removes the rowReads do NOT auto-filter soft-deleted rows. This is the most common surprise — you have to filter explicitly:
active = await crud.get_multi(db, is_deleted=False)If you want every read to exclude soft-deleted rows automatically, wrap FastCRUD in a subclass that overrides get/get_multi/etc. to add the filter, or pass is_deleted=False as a dependency-based default via FilterConfig on crud_router.
limit=None fetches every matching row. Only safe when a WHERE clause domain-bounds the result. See the dedicated section.AsyncSession. Sync Session support for count()/exists() is in flight (PR #333) but not merged.include_one_to_many=True and set default_nested_limit (or nested_limit per JoinConfig).__ (two underscores). price_gte is just a column name price_gte; price__gte is price >= ....create() returns None by default (no schema_to_select). Don't expect the model back.return_as_model=True without schema_to_select raises. Always pair them.update(return_columns=True) raises since v0.22.0. Use a list of column names.. not __ for the relationship part. "tier.name__eq", not "tier__name__eq".session parameter on crud_router is a callable (a FastAPI dependency that yields/returns an AsyncSession), not a session instance.include_relationships and joins_config are mutually exclusive on crud_router. Pick one.create() responses.id in a subclass breaks the SQLModel metaclass mapping. Stick to plain SQLAlchemy if you need polymorphism.Load these on demand:
references/methods.md — full signatures and overloads for every FastCRUD methodreferences/filters.md — every operator, FilterConfig, dependency-based filters, custom operatorsreferences/joins.md — JoinConfig fields, auto-detection rules, nested_limit mechanics, polymorphismreferences/pagination.md — offset vs cursor pagination, paginated_response, CursorPaginatedRequestQueryreferences/endpoints.md — crud_router full signature, EndpointCreator subclassing, included_methods, per-method dependencies, soft delete, custom endpoint namesThe library works the same way; substitute the model definition:
from sqlmodel import SQLModel, Field
class User(SQLModel, table=True):
__tablename__ = "user"
id: int | None = Field(default=None, primary_key=True)
name: str
email: str = Field(unique=True)
tier_id: int | None = Field(default=None, foreign_key="tier.id")Schemas can also be SQLModel (without table=True) instead of BaseModel. The CRUD layer is identical because SQLModel inherits from SQLAlchemy. One caveat:
© benavlabs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in fastcrud/.agents/skills/fastcrud of benavlabs/fastcrud.
Open the folder on GitHubat commit 1856653
Fastcrud 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fastcrud this skillbenavlabs/fastcrud | 1.6k | — | ~5k | Automated safety check: Pass | MIT | |
| FastAPI ExpertJeffallan/claude-skills | 12k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Backend Fastapi Pythonavibebuilder/claude-prime | 120 | — | ~997 | Automated safety check: Pass | MIT | |
| Python Best Practicesc0x12c/ai-toolkit | 106 | — | ~676 | Automated safety check: Pass | None | |
| PythonMadAppGang/claude-code | 285 | — | ~2.8k | Automated safety check: Notes | MIT | |
| Fastapi Appccplugins/awesome-claude-code-plugins | 970 | — | ~1.1k | Automated safety check: Notes | Apache-2.0 |
Jeffallan/claude-skills
Builds async Python APIs with FastAPI and Pydantic V2, covering endpoints, JWT authentication, async SQLAlchemy, WebSockets and pytest checks against the OpenAPI docs.
avibebuilder/claude-prime
A skill your agent uses for any Python backend work in this project: building FastAPI endpoints, writing service functions, defining Pydantic/SQLModel schemas, running Alembic migrations, or…
c0x12c/ai-toolkit
Python/FastAPI coding standards including async patterns, Pydantic v2, SQLAlchemy 2.0, and project structure.
MadAppGang/claude-code
A skill your agent uses when building FastAPI applications, implementing async endpoints, setting up Pydantic schemas, working with SQLAlchemy, or writing pytest tests for Python backend services.
ccplugins/awesome-claude-code-plugins
Bootstrap a new FastAPI backend with async SQLAlchemy 2.0, asyncpg, Alembic, Pydantic v2, and no deprecated APIs.
SpillwaveSolutions/agent-brain
Modern Python coaching covering language foundations through advanced production patterns.
Works with
Categories
A skill your agent uses when building or modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD, crudrouter, EndpointCreator, FilterConfig…. Fastcrud is an agent skill from benavlabs/fastcrud.), cursor pagination, soft delete, and how to avoid N+1 queries when fetching related data.
Fastcrud fits situations like: modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD; endpointCreator; auto-relationship detection; the filter operator syntax (gte.
Run `npx skills add benavlabs/fastcrud --skill fastcrud -a claude-code`. Or copy the skill folder (fastcrud/.agents/skills/fastcrud in benavlabs/fastcrud) into .claude/skills/fastcrud in your project. Claude Code loads it when a task matches its description.
Run `npx skills add benavlabs/fastcrud --skill fastcrud -a codex`. Or copy the skill folder (fastcrud/.agents/skills/fastcrud in benavlabs/fastcrud) into .agents/skills/fastcrud in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add benavlabs/fastcrud --skill fastcrud -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fastcrud, .gemini/skills/fastcrud, .github/skills/fastcrud and .opencode/skills/fastcrud in your project.
SKILL.md names no scripts, command-line tools or credentials: Fastcrud is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
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.
Fastcrud is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 9.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Fastcrud: FastAPI Expert (Jeffallan/claude-skills, 12k stars), Backend Fastapi Python (avibebuilder/claude-prime, 120 stars), Python Best Practices (c0x12c/ai-toolkit, 106 stars) and Python (MadAppGang/claude-code, 285 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
benavlabs (a GitHub organization) maintains it in benavlabs/fastcrud, which has 1,595 GitHub stars. The repository was last updated on September 24, 2026.
Source: benavlabs/fastcrud on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.