crudkit
A metadata-driven CRUD framework for Django. Define models; get typed object IDs, soft delete, merge, change logging, an activity feed, saved views, AI-populated fields and a generic REST API — without writing per-model serializers, viewsets or routes.
Core concepts
Every CrudKit model inherits BaseCrudKitModel and declares a 3-letter
TYPE_ID. Object IDs are rendered as <TYPE_ID><pk> (e.g. CUS42) across
the API and UI.
from django.db import models
from crudkit.models import BaseCrudKitModel
class Customer(BaseCrudKitModel):
TYPE_ID = "CUS"
name = models.CharField(max_length=255)
class CrudKitSettings(BaseCrudKitModel.CrudKitSettings):
search_fields = ["name"]
Included with every model: created_by/updated_by/created_at/updated_at
audit columns, a deleted soft-delete flag (soft_delete()), merge support
(delete_and_merge_with()), a change log, an activity feed (FeedItem),
external-system sync (ExternalObject), saved views/layouts, and optional AI
fields (AISummaryField, AICategoryField, AIBooleanField, AITagsField,
AIForeignKeyField) populated asynchronously via Celery and pydantic-ai.
Installation
pip install crudkit[api] # REST API included
pip install crudkit[assistant] # + per-object AI assistant (Channels)
INSTALLED_APPS = [
...,
"rest_framework",
"crudkit",
"crudkit_assistant", # optional
]
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"crudkit_api.permissions.CrudKitModelPermissions",
],
"DEFAULT_PAGINATION_CLASS": "crudkit_api.pagination.CrudKitPagination",
"DEFAULT_FILTER_BACKENDS": ["crudkit_api.filters.BasicFilter"],
"PAGE_SIZE": 50,
}
# urls.py — one include registers a full CRUD API for every TYPE_ID model
urlpatterns = [path("api/v1/", include("crudkit_api.urls"))]
CrudKit requires the standard Django model permissions for every API and
assistant operation. Projects that need row-level rules can override
CrudKitSettings.get_authorized_queryset(user, queryset, action); action
is one of view, add, change, or delete. Model actions require change
permission and can be narrowed further with
CrudKitSettings.has_action_permission(user, instance, action_name).
Settings
| Setting | Purpose |
|---|---|
CRUDKIT_AI_MODEL |
pydantic-ai model string (e.g. "mistral:mistral-large-latest") enabling AI fields/assistant |
CRUDKIT_AI_MODEL_FACTORY |
dotted path to an async context manager yielding a pydantic-ai Model (advanced) |
CRUDKIT_USER_PROFILE_ADAPTER |
dotted path to a class supplying preferred language + avatar images for users |
CRUDKIT_EXTRA_GENERIC_RELATIONS |
project models surfaced as generic relations in object metadata |
CRUDKIT_DEFAULT_CURRENCY, CRUDKIT_CURRENCY_CHOICES |
currency configuration for MoneyField |
CRUDKIT_GRAVATAR_FALLBACK_EMAIL |
fallback avatar email (gravatar mp default otherwise) |
CRUDKIT_DASHBOARD_WIDGETS |
dotted path to a dashboard_for_user(user) widget provider |
CRUDKIT_ASSISTANT_NAME, CRUDKIT_ASSISTANT_SYSTEM_PROMPT, CRUDKIT_ASSISTANT_AVATAR_URL |
assistant branding |
CRUDKIT_FRONTEND_CONFIG |
dict injected into the bundled SPA at runtime (app_name, logo_url, ...) |
CRUDKIT_FRONTEND_LOGIN_REQUIRED |
redirect anonymous users of the SPA view to LOGIN_URL |
Bundled frontend
The wheel ships the built CrudKit web SPA. To serve it, add the app, the context processor, a config dict, and a catch-all url include (last!):
INSTALLED_APPS = [..., "crudkit_frontend"]
TEMPLATES = [{
...,
"OPTIONS": {"context_processors": [
...,
"crudkit_frontend.context_processors.crudkit_config",
]},
}]
CRUDKIT_FRONTEND_CONFIG = {"app_name": "My App"} # injected into the SPA at runtime
CRUDKIT_FRONTEND_LOGIN_REQUIRED = False # True → redirect anonymous users to LOGIN_URL
# urls.py — must be the LAST pattern; everything unmatched serves the SPA
urlpatterns = [..., path("", include("crudkit_frontend.urls"))]
Static assets are served by django.contrib.staticfiles (or WhiteNoise et
al.) from crudkit_frontend/static/, under whatever STATIC_URL the project
uses — nothing assumes the default static/ prefix. Contributors hacking on
the SPA itself
run the Vite dev server from ../frontend against any CrudKit
backend; npm run build there regenerates the bundled assets.
Running the tests
cd backend
uv sync --all-extras
uv run manage.py test crudkit crudkit_api crudkit_assistant crudkit_frontend tests
License
MIT
Release files for crudkit 0.2.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| crudkit-0.2.3.tar.gz | 613.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| crudkit-0.2.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / crudkit-0.2.3.tar.gz
| Download URL | crudkit-0.2.3.tar.gz |
|---|---|
| Size | 613.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f079e947491909aacc6b6e8965b38609d636919f67f188e1c52bb4719d783d9e
|
|
BLAKE2b-256 checksum How to use checksums |
cc5f026ab614434d73373333e19f3ac17de596ea329672c14a61a53bbdebb197
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / crudkit-0.2.3-py3-none-any.whl
| Download URL | crudkit-0.2.3-py3-none-any.whl |
|---|---|
| Size | 611.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ec83065f7b9064ed4045beb147fe95bd0f844277b30b45ae67884648603799b5
|
|
BLAKE2b-256 checksum How to use checksums |
ecd1a5d672d9cc2bdcf95a24db2094db57e00c66a5ffba16a5b73ca8acecafd1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log