Help us improve
Share bugs, ideas, or general feedback.
How this skill is triggered — by the user, by Claude, or both
Slash command
/seedkit:seedkitThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Two paths:
references/analytics.mdreferences/async.mdreferences/auth-hardening.mdreferences/auth.mdreferences/billing.mdreferences/ci.mdreferences/cors.mdreferences/csp.mdreferences/custom-user.mdreferences/database.mdreferences/dbbackup.mdreferences/deploy-github-ssh.mdreferences/deploy-managed.mdreferences/deploy-vps.mdreferences/dev-tasks.mdreferences/dev-tools.mdreferences/devcontainer.mdreferences/docker.mdreferences/email.mdreferences/error-reporting.mdBootstraps new Django projects or adds components (auth, payments, REST, Celery, WebSockets, Tailwind, Docker, CI, Sentry) to existing ones via guided prompts.
Provides Django 5.x expertise for scalable web apps using async views, DRF, Celery, Django Channels, with architecture, testing, security, and deployment guidance.
Sets up Django 6.0 project with uv, direnv, HTMX, OAuth, DRF, Pydantic, pytest, mypy, ruff, Docker PostgreSQL or Supabase, custom user model, and full type annotations. Use for production-ready Django from scratch.
Share bugs, ideas, or general feedback.
Two paths:
.git/ or stub README): run §2 → §6 in order.pyproject.toml and Django code): skip §2–§4. Read references/existing-project.md for the inventory workflow, then jump to §5/§6 and ask only about missing components.Before either path, run uv --version to confirm uv is installed.
For every question that involves a third-party package: 1–2 sentences from the reference's intro on what it adds beyond stock Django, then ask. none (or no) is always a valid answer.
Use answers already given. Before asking any question, scan the user's initial request (and anything they've said since) for the answer. If it's there — explicit ("use PostgreSQL", "with Celery", "no auth") or unambiguous from context — take it as given, note the decision in one line, and move on. Don't re-ask to confirm. Only ask when the answer is genuinely missing or ambiguous.
Preflight — read these before the first tool call of a new-project run: references/new-project.md and references/database.md. Read one reference per add-on the questionnaire selected before its step.
references/uv.md — uv installation and commandsreferences/new-project.md — Two Scoops layout, django-environ, uvreferences/database.md — SQLite vs PostgreSQL (host or Docker)references/async.md — WSGI / ASGI / ASGI+channels request handling (gunicorn worker class, server choice)references/custom-user.md — custom AUTH_USER_MODEL (set before first migrate)references/docker.md — production multi-stage image (uv builder → slim runtime) + optional local services composereferences/existing-project.md — inventory workflow when extending an existing reporeferences/lint.md — Ruff (Django-aware rules)references/pytest.md — pytest + pytest-django + coveragereferences/typecheck.md — pyright + django-stubsreferences/pre-commit.md — pre-commit hook config wiring lint / format / typecheckreferences/devcontainer.md — .devcontainer/devcontainer.json for VS Code / Codespaces / JetBrains Gatewayreferences/dev-tools.md — debug toolbar (orbit / silk), django-extensions, db-safety (zeal / migration-linter / test-migrations)references/dev-tasks.md — task runner (mise / just / make / poe) — short names for the long uv run … commands the README would otherwise listreferences/logging.md — structlog JSON-in-prod / pretty-in-devreferences/auth.md — django-allauth or django-mail-authreferences/auth-hardening.md — django-axes brute-force lockout + 2FAreferences/redis.md — Redis cachereferences/storage-whitenoise.md — static via WhiteNoise + media volume on VPSreferences/storage-s3.md — static + media on S3-compatible storagereferences/tasks-celery.md — Celery + Redisreferences/tasks-django.md — Django Tasks dispatcher (-db.md / -rq.md / -cron.md)references/email.md — console / SMTP / Mailpit / anymailreferences/realtime.md — django-channels routing, sample consumer, channels-redis layer, separate ASGI worker, Caddy WS proxyreferences/tailwind.md — Tailwind CSS standalone CLI; DaisyUI; custom 404/403/500references/i18n.md — gettext, LocaleMiddleware, makemessagesreferences/cors.md — django-cors-headersreferences/robots.md — robots.txtreferences/rest.md — REST API dispatcher (-modern-rest.md / -bolt.md)references/billing.md — Stripe SDK or dj-stripereferences/analytics.md — GoatCounter / Umami / Shynet / GA4references/security.md — Django security settingsreferences/csp.md — django-csp Content Security Policyreferences/healthcheck.md — /healthz + /readyzreferences/error-reporting.md — Bugsink / Sentry / GlitchTipreferences/gdpr.md — PII scrubbing, retention, user export/deletereferences/ci.md — GitHub Actions test workflowreferences/deploy-vps.md — VPS with Docker + Caddyreferences/deploy-managed.md — Fly.io / Railway / Renderreferences/deploy-github-ssh.md — GitHub Actions deploy via SSHreferences/dbbackup.md — django-dbbackup to S3-compatible targetList the groups above, one sentence each. For existing projects: first follow references/existing-project.md and note what's already detected per group. Invite the user to begin.
settings.py or split base/local/production.wsgi / asgi / asgi+channels. Default wsgi. Decide now — Dockerfile CMD, server choice, and the manage.py/wsgi.py/asgi.py settings defaults all hinge on this; switching later means rewriting deploy artefacts. See references/async.md (and references/realtime.md for the channels mode).docker-compose.yml for the local DB only). SQLite users skip.references/custom-user.md).Never bundle questions beyond the explicit pair in step 1.
Generate files from the matching references. .env DATABASE_URL must match DB + dev mode. If custom user = yes, apply references/custom-user.md before the boot check. If DB=SQLite, also apply the production.py block from references/database.md (WAL + IMMEDIATE PRAGMAs) — settings tuning, not a user-facing question.
Run these yourself; do not ask the user. The goal is to catch foundation bugs before piling on add-ons, without making the user type uv run … commands that §5.1 may replace minutes later.
uv run manage.py migrate (start the local Postgres service first with docker compose up -d db when DB=Postgres-in-Docker).uv run manage.py runserver --noreload in the background. --noreload drops the StatReloader so the listener is ready sooner; a sleep 2 then curl can still race on slow CI, so poll: for i in 1 2 3 4 5; do curl -sf http://127.0.0.1:8000/admin/login/ > /dev/null && break; sleep 1; done.kill "$PID"); don't use kill %1 (no job control in non-interactive bash) or pkill -f manage.py (matches the parent harness process).If migrate or the curl fails, fix the foundation before proceeding to §5. createsuperuser and the browser login move to §7 — they need a stable task runner name and a real browser, neither of which exists yet.
For new projects: ask every question. For existing projects: only ask about components not already detected in §1; confirm and skip the rest.
manage.py test. Default no (stock).django-orbit / django-silk / none. Default none.django-zeal / django-migration-linter / django-test-migrations. Default none. Skip django-test-migrations if pytest = no.django-extensions: yes / no. Default no.structlog: yes / no. Default no.mise / just / make / poe / none. Default mise (recommended). Detect what's installed with command -v and offer the first hit; mention the others. See references/dev-tasks.md.django-allauth / django-mail-auth / none. Default none.django-axes brute-force lockout: yes / no. Default yes. Skip if auth = none.allauth.mfa if auth = allauth (via django-allauth[mfa] extra — never allauth-2fa, which is unmaintained), else django-otp.sqlite / redis / locmem / none. Default sqlite when DB=SQLite, else locmem. sqlite wires a separate cache.sqlite3 + CacheRouter + DatabaseCache (see references/database.md); redis adds django-redis; locmem is the per-process in-memory backend.whitenoise / s3 / none. Default none — required before production but not for first boot.celery / django-tasks-db / django-tasks-rq / none. Default django-tasks-db when DB=SQLite, else none.console / smtp / mailpit / anymail / none. Always ask — every project sends mail eventually (password resets, error reports, allauth verification).tailwind / none. Default none.
robots.txt: yes / no. Default no — only for public-facing sites.django-modern-rest / django-bolt / none. Default none.stripe (raw SDK) / dj-stripe / none. Default none.goatcounter / umami / shynet / ga4 / none. Default none.Only ask when Foundation §2.4 = asgi+channels. Otherwise skip the whole group.
channels-redis / InMemoryChannelLayer. Default channels-redis. In-memory is dev-only — it doesn't span processes, so any horizontal scale or separate ASGI worker process breaks broadcast.django-csp? Default yes./healthz, /readyz): yes / no. Default yes. Apply before the deploy target so the deploy reference can wire the matching probe block in compose / fly.toml / nginx.bugsink / sentry / glitchtip / none. Default none.vps / managed / github-ssh / none. Default none.
vps or github-ssh: database backups via django-dbbackup? Default yes. Both deploy to self-managed hosts. Skip for managed — those platforms ship native backups. Also skip when DB=SQLite + deploy=vps if Litestream is already wired (see references/database.md) — Litestream replicates every WAL frame, so dbbackup snapshots are redundant.After §6, ask the user to run, using the task-runner names from §5.1 if one was applied (else uv run manage.py …):
createsuperuser (interactive — the user runs it themselves).collectstatic --noinput only if a static-files add-on was applied./admin/ in a browser and sign in with the new superuser.Wait for the user to confirm the browser login works before §8.
After applying any reference, append the decision and any new commands to README.md. Finalize at the end of the run with stack summary and key commands (install, test, migrate, run, deploy). Don't hardcode dependency versions — read them from pyproject.toml. If a task runner was applied (§5.1), show task-runner names (mise run dev, just test) in the README's main command list — not the raw uv run … invocations.
If a deploy target was applied (§6.6), copy the deploy command block from the matching references/deploy-*.md verbatim into a ## Deploy section in README.md. The block includes the one-shot manage.py migrate step that runs before docker compose up -d — without it, the first up -d --build hits an empty database and every page 500s.
For new projects only, append a final line to README.md: Built with [Seedkit](https://github.com/RobustaRush/seedkit). Skip on existing-project runs.
Each rule has a why so you can judge edge cases.
Snippet integrity
DEFAULT_AUTO_FIELD, gated env defaults, top-level RQ = {"JOB_CLASS": ...}. They look optional and are not.default=<dev-value> if DEBUG else env.NOTSET. env.NOTSET raises ImproperlyConfigured naming the variable when the env var is missing in prod.local.py / production.py that base.py already sets.django-environ (no manual .split(","), no leftover import os).Env vars and .env.example
DJANGO_DEBUG / DJANGO_SECRET_KEY / DJANGO_ALLOWED_HOSTS — these names are referenced across many references..env.example so the file stays the canonical list..env.example comments belong on their own lines, never trailing the value. django-environ reads everything after = verbatim, so EMAIL_URL=consolemail:// # dev becomes the literal URL consolemail:// # dev and breaks any deploy that copies the file.App layout
tasks.py must live inside a registered Django app, not at project root or under config/. Both Celery autodiscovery and django-tasks only scan INSTALLED_APPS. When a fresh project has no app yet, don't auto-create one — wire the task settings / services / Dockerfile so the worker boots and idles, then tell the user where to drop @task functions once they create a domain app. Auto-creating jobs/ dictates app layout the user may not want.After startproject / uv init / startapp
requires-python = ">=3.12" in pyproject.toml immediately after uv init, before the first uv add. The host-derived pin (>=3.14 on recent machines) refuses Django 6.DATABASES = {...} line in references/new-project.md (Option A in settings.py, Option B in base.py), delete the original hardcoded DATABASES block + # Database comment that startproject emitted. Bottom wins; leaving both makes DATABASE_URL dead code.startapp <name>, if Ruff is enabled, run uv run ruff check --fix . — startapp ships admin.py / views.py / tests.py with stub imports that fail F401.startapp <name> before adding <name> to INSTALLED_APPS. manage.py startapp imports settings; if the app is already listed but the directory doesn't exist, the import fails with ModuleNotFoundError.USE_I18N = True line and the # Internationalization comment block that startproject emits. Harmless to leave, but the reference's settings are single-language by default and the orphan block invites confusion.uv run vs python invocation
uv run manage.py …. uv resolves the project venv.exec, prod compose run, Fly release_command, devcontainer postAttach): python manage.py …. /opt/venv/bin is on PATH; the multi-stage runtime image (python:3.X-slim-bookworm) has no uv binary, so uv run breaks there.Add-on scope
django-extensions is an explicit add-on question — apply only if the user said yes.