Agent skill

Fastcrud

by benavlabs in benavlabs/fastcrud

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…

MITAuto-check passedBackend & APIs

Install Fastcrud

skills CLI
$ npx skills add benavlabs/fastcrud --skill fastcrud -a claude-code

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

GitHub CLI
$ gh skill install benavlabs/fastcrud fastcrud --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/benavlabs/fastcrud.git skills-src && mkdir -p .claude/skills && cp -r skills-src/fastcrud/.agents/skills/fastcrud .claude/skills/fastcrud && 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
fastcrud
GitHub stars
1.6k
Token cost
~5k tokens
SKILL.md length
1,407 words
Files
6 (incl. references)
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

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…

  • Works in 2 steps: Auto-detect relationships (zero config,… → Manual JoinConfig (when you need…
  • Modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD
  • SKILL.md covers Canonical setup, Choosing the right method, Avoiding N+1 — the most common… and limit=None — the second…, plus 7 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

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.

When your agent uses it

  • Modifying CRUD endpoints with FastCRUD (the fastcrud PyPI package) in a FastAPI project — covers FastCRUD
  • EndpointCreator
  • Auto-relationship detection
  • The filter operator syntax (gte

Example prompts

  • “/fastcrud”

Requirements

  • Python 3

Workflow steps

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

  1. Auto-detect relationships (zero config, default for v0.21+)
  2. Manual JoinConfig (when you need explicit control)

What it can do on your machine

Read from SKILL.md and the folder at commit 1856653. 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

    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.

  • Network

    No URLs in SKILL.md.

    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

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.

Always · name and description, kept in context so the agent knows when to use it
~158
When it runs · the whole SKILL.md, loaded when a task matches
~5k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~14k

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 benavlabs/fastcrud at commit 1856653, republished under its MIT licence (© benavlabs). 1,407 words, ~4,951 tokens.

Download SKILL.mdSave it as .claude/skills/fastcrud/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
fastcrud
description
Use when building or modifying CRUD endpoints with FastCRUD (the `fastcrud` PyPI package) in a FastAPI project — covers `FastCRUD`, `crud_router`, `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, `crud_router`, `FastCRUD()`, `FilterConfig`, `JoinConfig`, or asks how to build CRUD endpoints / generate REST APIs from SQLAlchemy or SQLModel models, even if the user doesn't name the library directly.
license
MIT
metadata.author
benav-labs
metadata.package
fastcrud

FastCRUD

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.


Canonical setup

The minimal viable pattern. Always start here, then add filters/joins/relationships as needed.

python
# 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")
python
# 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
python
# 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).


Choosing the right method

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.

NeedUse
Single row, no joinsget(db, id=...)
Single row with related dataget_joined(db, id=...)
Paginated list, no joinsget_multi(db, offset, limit)
Paginated list with related dataget_multi_joined(db, ...)
Cursor-paginated list (infinite scroll)get_multi_by_cursor(db, ...)
Insertcreate(db, schema)
Insert-or-update by unique constraintupsert(db, schema) / upsert_multi(db, list)
Patch by filtersupdate(db, schema, **kwargs)
Soft delete (if configured)delete(db, **kwargs)
Hard delete (always removes row)db_delete(db, **kwargs)
Countcount(db, **kwargs)
Boolean existence checkexists(db, **kwargs)

Avoiding N+1 — the most common mistake

FastCRUD has two mechanisms to prevent N+1 when fetching related data. Use one of them — never iterate.

1. Auto-detect relationships (zero config, default for v0.21+)

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.

python
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:

python
include_relationships=["tier", "department"]   # whitelist

Gotcha: One-to-many relationships are excluded by default because they can return unbounded data. Opt in explicitly:

python
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.

2. Manual JoinConfig (when you need explicit control)

For self-joins, aliases, custom join conditions, or per-join schemas:

python
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:

python
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 footgun

get_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.

Safe — scoped by a WHERE clause
python
# 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)
Unsafe — unbounded growth
python
# 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)
Pattern: sanity-check limit=None results

When limit=None is justified, log when results unexpectedly explode so drift is caught before it becomes an incident:

python
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")
Three-tier default
SurfaceDefault
HTTP list endpointlimit = min(requested, MAX_LIMIT)
Worker fetch of bounded child collectionExplicit cap (limit=RENDER_MAX_CLIPS)
Bulk fan-out across a large tableget_multi_by_cursor(limit=BATCH)

When NOT to use FastCRUD

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 shapeUse instead
Aggregate roll-up (SUM, conditional COUNT FILTER WHERE, HAVING)select(func.sum(...), func.count().filter(...))
CTEs, correlated subqueries, EXISTS() filtersselect(...).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 RHSupdate(...).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 forFastCRUD 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.

Anti-patterns to refactor on sight
  1. Per-ID loop calling crud.get() — classic N+1.
    python
    # 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)
  2. db.scalar(select(Model).where(...).exists()) — use await crud.exists(**filters).
  3. get_multi(limit=None) then Python filtering — push the filter into kwargs so the database does the work.
  4. crud.get() in a hot path without schema_to_select — selects every column. Pass a minimal schema to cut payload size.
  5. Loop of crud.create() — calls go one-at-a-time. For >10 rows use crud.upsert_multi(...) or raw db.execute(insert(Model), records).

Filter syntax

FastCRUD accepts filters as keyword arguments on every read/update/delete method, and via FilterConfig for crud_router's GET /list endpoint.

Operator suffix on the field name

The operator goes after a double underscore:

python
await crud.get_multi(db, price__gte=10, name__ilike="%admin%", id__in=[1, 2, 3])
SuffixSQLNotes
(none)=bare field name is equality
__eq=explicit form
__ne<>
__gt __gte> >=
__lt __lte< <=
__inIN (...)value must be list/tuple/set
__not_inNOT IN (...)same
__betweenBETWEEN a AND bvalue must be a 2-element sequence
__likeLIKEcase-sensitive
__ilikeILIKEcase-insensitive (Postgres)
__startswith __endswith __containssubstring match (auto-wraps with %)pass the bare substring — do NOT add % yourself
__is __is_notIS IS NOTfor NULL checks
__matchengine-specific full-textdepends on dialect
Show full SKILL.md (556 more words)Show less
Joined filters

Walk relationships with .:

python
await crud.get_multi_joined(db, **{"tier.name__eq": "premium"})

Or, equivalently, build the kwargs dict literal-style. In FilterConfig:

python
FilterConfig({
    "name__ilike": None,           # query string param: ?name__ilike=foo
    "price__gte": None,
    "tier.name": None,             # joined filter — auto-includes the tier relationship
})
Bool coercion

?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.


Return semantics — read carefully

The biggest footgun. Several methods have non-obvious defaults that changed in v0.20:

create()
  • Without schema_to_select: returns None (since v0.20.0 — was the model in earlier versions).
  • With schema_to_select: returns a dict.
  • With schema_to_select + return_as_model=True: returns a Pydantic instance.
python
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)                                    # → UserRead

return_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:

python
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 | None
update(return_columns=...) must be a list (v0.22+)

return_columns=True raises ValueError. Pass a list:

python
await crud.update(db, schema=UserUpdate(name="X"), return_columns=["id", "name"], id=1)
commit=False for transactions

All write methods take commit=False. Use it when chaining multiple operations under a single transaction; commit once at the end with await db.commit().


Soft delete

Configure at the FastCRUD level:

python
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 row

Reads do NOT auto-filter soft-deleted rows. This is the most common surprise — you have to filter explicitly:

python
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.


Gotchas (read these before writing code)

  1. limit=None fetches every matching row. Only safe when a WHERE clause domain-bounds the result. See the dedicated section.
  2. Async session only. All methods require AsyncSession. Sync Session support for count()/exists() is in flight (PR #333) but not merged.
  3. One-to-many relationships excluded from auto-detect. Add include_one_to_many=True and set default_nested_limit (or nested_limit per JoinConfig).
  4. Filter operator separator is __ (two underscores). price_gte is just a column name price_gte; price__gte is price >= ....
  5. create() returns None by default (no schema_to_select). Don't expect the model back.
  6. return_as_model=True without schema_to_select raises. Always pair them.
  7. update(return_columns=True) raises since v0.22.0. Use a list of column names.
  8. Joined filters need . not __ for the relationship part. "tier.name__eq", not "tier__name__eq".
  9. session parameter on crud_router is a callable (a FastAPI dependency that yields/returns an AsyncSession), not a session instance.
  10. include_relationships and joins_config are mutually exclusive on crud_router. Pick one.
  11. Joined-table polymorphic inheritance is supported. v0.22.0 fixed auto-aliasing when primary and joined share a base table; v0.22.2 fixed inherited columns missing from create() responses.
  12. SQLModel joined-table inheritance is fragile — redeclaring id in a subclass breaks the SQLModel metaclass mapping. Stick to plain SQLAlchemy if you need polymorphism.
  13. Python 3.10+ required. Python 3.14 works since v0.22.1 (earlier versions crashed at import under PEP 649).

When to drill into references

Load these on demand:

  • references/methods.md — full signatures and overloads for every FastCRUD method
  • references/filters.md — every operator, FilterConfig, dependency-based filters, custom operators
  • references/joins.md — JoinConfig fields, auto-detection rules, nested_limit mechanics, polymorphism
  • references/pagination.md — offset vs cursor pagination, paginated_response, CursorPaginatedRequestQuery
  • references/endpoints.md — crud_router full signature, EndpointCreator subclassing, included_methods, per-method dependencies, soft delete, custom endpoint names

SQLModel notes (when the project uses SQLModel instead)

The library works the same way; substitute the model definition:

python
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:

  • Joined-table inheritance is unreliable — see gotcha #11. For polymorphic models, drop to plain SQLAlchemy.

© benavlabs, MIT. 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 5 other files (references) in fastcrud/.agents/skills/fastcrud of benavlabs/fastcrud.

  • SKILL.md
  • references/endpoints.md
  • references/filters.md
  • references/joins.md
  • references/methods.md
  • references/pagination.md

Open the folder on GitHubat commit 1856653

Compare with similar skills

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.

Fastcrud compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Fastcrud this skillbenavlabs/fastcrud1.6k—~5kAutomated safety check: PassMIT
FastAPI ExpertJeffallan/claude-skills12k—~1.8kAutomated safety check: PassMIT
Backend Fastapi Pythonavibebuilder/claude-prime120—~997Automated safety check: PassMIT
Python Best Practicesc0x12c/ai-toolkit106—~676Automated safety check: PassNone
PythonMadAppGang/claude-code285—~2.8kAutomated safety check: NotesMIT
Fastapi Appccplugins/awesome-claude-code-plugins970—~1.1kAutomated safety check: NotesApache-2.0

Similar skills

  • 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.

    12k GitHub stars~1.8k tokensUpdated 6 days ago
    Backend & APIsAuto-check passed
  • Backend Fastapi Python

    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…

    120 GitHub stars~997 tokensUpdated 4 mo ago
    Backend & APIsAuto-check passed
  • Python Best Practices

    c0x12c/ai-toolkit

    Python/FastAPI coding standards including async patterns, Pydantic v2, SQLAlchemy 2.0, and project structure.

    106 GitHub stars~676 tokensUpdated 3 mo ago
    Backend & APIsAuto-check passed
  • Python

    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.

    285 GitHub stars~2.8k tokensUpdated 6 mo ago
    Backend & APIsAuto-check: notes
  • Fastapi App

    ccplugins/awesome-claude-code-plugins

    Bootstrap a new FastAPI backend with async SQLAlchemy 2.0, asyncpg, Alembic, Pydantic v2, and no deprecated APIs.

    970 GitHub stars~1.1k tokensUpdated 1 mo ago
    Backend & APIsAuto-check: notes
  • Mastering Python Skill

    SpillwaveSolutions/agent-brain

    Modern Python coaching covering language foundations through advanced production patterns.

    119 GitHub stars~1.4k tokensUpdated 20 days ago
    DevelopmentAuto-check: notes

Questions about Fastcrud

What does Fastcrud do?

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.

When should I use Fastcrud?

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.

How do I install Fastcrud in Claude Code?

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.

How do I install Fastcrud in Codex?

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.

Can I use Fastcrud 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 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.

What does Fastcrud need to run?

SKILL.md names no scripts, command-line tools or credentials: Fastcrud is instructions for the agent only. Our summary lists: Python 3.

Does Fastcrud access the network?

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.

Is Fastcrud 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 Fastcrud use?

Fastcrud is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Fastcrud use?

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.

What are the alternatives to Fastcrud?

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.

Who maintains Fastcrud?

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.