Django Celery Expert
vintasoftware/django-ai-plugins
Expert Django Celery guidance for asynchronous task processing.
Add reliable signals (async side-effects via Celery) to a Django feature.
$ npx skills add dvf/opinionated-django --skill dj-signals -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dvf/opinionated-django dj-signals --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/dvf/opinionated-django.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/dj-signals .claude/skills/dj-signals && 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 "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .claude/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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/dvf/opinionated-django/tree/master/skills/dj-signalsType 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 dvf/opinionated-django --skill dj-signals -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dvf/opinionated-django dj-signals --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dvf/opinionated-django.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/dj-signals .agents/skills/dj-signals && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .agents/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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 dvf/opinionated-django --skill dj-signals -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dvf/opinionated-django dj-signals --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dvf/opinionated-django.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/dj-signals .cursor/skills/dj-signals && 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 "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .cursor/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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/dvf/opinionated-django.git --path skills/dj-signals--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 dvf/opinionated-django --skill dj-signals -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dvf/opinionated-django dj-signals --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dvf/opinionated-django.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/dj-signals .gemini/skills/dj-signals && 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 "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .gemini/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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 dvf/opinionated-django dj-signalsInstalls 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 dvf/opinionated-django --skill dj-signals -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dvf/opinionated-django.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/dj-signals .github/skills/dj-signals && 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 "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .github/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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 dvf/opinionated-django --skill dj-signals -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dvf/opinionated-django dj-signals --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dvf/opinionated-django.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/dj-signals .opencode/skills/dj-signals && 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 "dj-signals" agent skill from https://github.com/dvf/opinionated-django/tree/master/skills/dj-signals into .opencode/skills/dj-signals/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "dj-signals", 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.
dj-signalsAdd reliable signals (async side-effects via Celery) to a Django feature.
Dj Signals is an agent skill from dvf/opinionated-django. Add reliable signals (async side-effects via Celery) to a Django feature. Use when a business operation needs to trigger post-commit work like notifications, cache invalidation, analytics, or cross-service coordination — any time the user mentions side-effects, events, or async processing tied to a business action.
Its SKILL.md is about 1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Backend & APIs, covering Backend development, Background jobs and Operations and SOPs. It works with Django. The repository describes itself as: An opinionated Django project with Repository pattern, Pydantic DTOs, svcs DI, and Stripe-style ULID IDs. The licence is MIT.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f17fc2d. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditBashGrepGlobFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
uvFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
hakibenita.comFrom 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.
Dj Signals loads about 1k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 356 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 noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Write, Edit, Bash, Grep, GlobAutomated 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 dvf/opinionated-django at commit f17fc2d, republished under its MIT licence (© dvf). 356 words, ~1,049 tokens.
.claude/skills/dj-signals/SKILL.md (or your agent's skills folder).You are adding a reliable signal to an opinionated Django project. Standard Django signals are synchronous and unreliable — receiver failures propagate to the sender, there's no delivery guarantee if the process crashes after commit, and there's no retry. This project uses the reliable signals pattern with Celery instead.
The pattern implemented here is adapted from Haki Benita's article Reliable Signals in Django. Credit for the original design goes to him — read the full article for the rationale and edge cases.
Signal receiver tasks are enqueued inside the same database transaction as the business operation. If the transaction rolls back, the tasks roll back too. If it commits, the tasks are guaranteed to be in the queue. Celery processes them asynchronously with at-least-once delivery.
Grep for ReliableSignal under src/Glob for src/**/receivers.pyFile: src/<app>/signals.py
from project.signals import ReliableSignal
my_event = ReliableSignal()Call send_reliable() inside a transaction.atomic() block. Arguments MUST be JSON-serializable — pass entity IDs, never model instances:
from django.db import transaction
def create_entity(self, name: str) -> MyEntityDTO:
with transaction.atomic():
entity = self.repo.create(name=name)
my_event.send_reliable(sender=None, entity_id=entity.id)
return entityFile: src/<app>/receivers.py
from django.dispatch import receiver
from .signals import my_event
@receiver(my_event)
def on_my_event(obj_id: str, **kwargs):
# Idempotent: guard against duplicate execution
if already_processed(obj_id):
return
do_work(obj_id)CRITICAL: Every receiver MUST be idempotent. The system guarantees at-least-once delivery, not exactly-once. A receiver may run more than once for the same event. Design accordingly:
apps.pyclass MyAppConfig(AppConfig):
def ready(self):
from . import receivers # noqa: F401Test receivers in isolation. Mock external dependencies. Verify idempotency by calling the receiver twice with the same arguments:
def test_receiver_is_idempotent(mocker):
# First call: not yet processed; second call: guard kicks in.
mocker.patch("my_app.receivers.already_processed", side_effect=[False, True])
do_work = mocker.patch("my_app.receivers.do_work")
on_my_event(obj_id="xxx_fake")
on_my_event(obj_id="xxx_fake") # second call must be safe
assert do_work.call_count == 1send() for post-commit side-effects — use send_reliable()uv run ruff check src
uv run ruff format --check src
uv run pyrefly check src
uv run pytestIf anything fails, fix it and re-run.
© dvf, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/dj-signals of dvf/opinionated-django.
Open the folder on GitHubat commit f17fc2d
Dj Signals 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 |
|---|---|---|---|---|---|---|
| Dj Signals this skilldvf/opinionated-django | 109 | — | ~1k | Automated safety check: Notes | MIT | |
| Django Celery Expertvintasoftware/django-ai-plugins | 153 | — | ~1.2k | Automated safety check: Pass | None | |
| Sentry Python SDKgetsentry/sentry-for-ai | 268 | — | ~4.1k | Automated safety check: Pass | Apache-2.0 | |
| Django Prodavila7/claude-code-templates | 32k | 8 repos | ~1.7k | Automated safety check: Pass | MIT | |
| Django Celeryaffaan-m/ECC | 276k | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Django Celeryaffaan-m/ECC | 276k | — | ~240 | Automated safety check: Pass | MIT |
vintasoftware/django-ai-plugins
Expert Django Celery guidance for asynchronous task processing.
getsentry/sentry-for-ai
Full Sentry SDK setup for Python. An agent skill from getsentry/sentry-for-ai.
davila7/claude-code-templates
Master Django 5.x with async views, DRF, Celery, and Django Channels.
affaan-m/ECC
Django + Celery async task patterns — configuration, task design, beat scheduling, retries, canvas workflows, monitoring, and testing.
affaan-m/ECC
DjangoおよびCeleryを使用した非同期タスク処理。タスクキューイング、ワーカー管理、エラー処理、スケジューリング。Redis/RabbitMQ ブローカー統合。
PostHog/posthog
Keep heavy imports off the django.setup() path that every process (web, celery, temporal, migrate, shell, CI) pays for.
dvf/opinionated-django
Implement a Django feature following the opinionated architecture — prefixed ULID IDs, repository pattern, Pydantic DTOs, svcs service locator, project-scoped django-ninja API, Celery reliable…
dvf/opinionated-django
Structure Django models with proper Meta classes, verbose names, and optimized indexes.
dvf/opinionated-django
Use Stripe-style prefixed ULID primary keys (e.g. An agent skill from dvf/opinionated-django.
dvf/opinionated-django
Set up and write pytest tests for an op-django project — pytest-django configuration, two-sided Celery testing (patched dispatch sites + plain-function task bodies, never eager mode), freezegun for…
dvf/opinionated-django
Set up a Django project into the op-django layout so the architecture, signals, and settings skills have a foundation to build on.
dvf/opinionated-django
Structure Django business logic as plain services that receive their dependencies via constructor injection, and wire them through an svcs registry so they can be resolved anywhere — views, Celery…
Works with
Categories
Add reliable signals (async side-effects via Celery) to a Django feature. Dj Signals is an agent skill from dvf/opinionated-django. Add reliable signals (async side-effects via Celery) to a Django feature.
Dj Signals fits situations like: A business operation needs to trigger post-commit work like notifications; cache invalidation; cross-service coordination — any time the user mentions side-effects; async processing tied to a business action.
Run `npx skills add dvf/opinionated-django --skill dj-signals -a claude-code`. Or copy the skill folder (skills/dj-signals in dvf/opinionated-django) into .claude/skills/dj-signals in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dvf/opinionated-django --skill dj-signals -a codex`. Or copy the skill folder (skills/dj-signals in dvf/opinionated-django) into .agents/skills/dj-signals 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 dvf/opinionated-django --skill dj-signals -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/dj-signals, .gemini/skills/dj-signals, .github/skills/dj-signals and .opencode/skills/dj-signals in your project.
Going by SKILL.md and its folder, Dj Signals needs the command-line tools its instructions call (uv). Our summary lists: Python 3. Its frontmatter pre-approves these tools: Read, Write, Edit, Bash, Grep, Glob.
SKILL.md names 1 domain. As links in the text: hakibenita.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Dj Signals is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1k tokens (SKILL.md is roughly 4.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Dj Signals: Django Celery Expert (vintasoftware/django-ai-plugins, 153 stars), Sentry Python SDK (getsentry/sentry-for-ai, 268 stars), Django Pro (davila7/claude-code-templates, 32k stars) and Django Celery (affaan-m/ECC, 276k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dvf (a GitHub user) maintains it in dvf/opinionated-django, which has 109 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on August 14, 2026.
Source: dvf/opinionated-django on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.