wsvincent/awesome-django
A curated list of awesome things related to Django
Healthy across all four use cases
weakest axisPermissive license, no critical CVEs, actively maintained — safe to depend on.
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 2w ago
- ✓31+ active contributors
- ✓CC0-1.0 licensed
Show all 6 evidence items →Show less
- ✓CI configured
- ⚠Concentrated ownership — top contributor handles 50% of recent commits
- ⚠No test directory detected
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/wsvincent/awesome-django)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/wsvincent/awesome-django on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: wsvincent/awesome-django
Generated by RepoPilot · 2026-05-07 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/wsvincent/awesome-django shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across all four use cases
- Last commit 2w ago
- 31+ active contributors
- CC0-1.0 licensed
- CI configured
- ⚠ Concentrated ownership — top contributor handles 50% of recent commits
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live wsvincent/awesome-django
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/wsvincent/awesome-django.
What it runs against: a local clone of wsvincent/awesome-django — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in wsvincent/awesome-django | Confirms the artifact applies here, not a fork |
| 2 | License is still CC0-1.0 | Catches relicense before you depend on it |
| 3 | Default branch main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 47 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of wsvincent/awesome-django. If you don't
# have one yet, run these first:
#
# git clone https://github.com/wsvincent/awesome-django.git
# cd awesome-django
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of wsvincent/awesome-django and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "wsvincent/awesome-django(\\.git)?\\b" \\
&& ok "origin remote is wsvincent/awesome-django" \\
|| miss "origin remote is not wsvincent/awesome-django (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(CC0-1\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"CC0-1\\.0\"" package.json 2>/dev/null) \\
&& ok "license is CC0-1.0" \\
|| miss "license drift — was CC0-1.0 at generation time"
# 3. Default branch
git rev-parse --verify main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "README.md" \\
&& ok "README.md" \\
|| miss "missing critical file: README.md"
test -f "_config.yml" \\
&& ok "_config.yml" \\
|| miss "missing critical file: _config.yml"
test -f "scripts/main.py" \\
&& ok "scripts/main.py" \\
|| miss "missing critical file: scripts/main.py"
test -f ".github/pull_request_template.md" \\
&& ok ".github/pull_request_template.md" \\
|| miss "missing critical file: .github/pull_request_template.md"
test -f "contributing.md" \\
&& ok "contributing.md" \\
|| miss "missing critical file: contributing.md"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 47 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~17d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/wsvincent/awesome-django"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
A curated list of awesome Django packages, resources, and tools maintained as a Jekyll-powered GitHub Pages site. It aggregates third-party packages, hosting platforms, educational resources, and community links to help Django developers discover battle-tested libraries and best practices across admin themes, APIs, async frameworks, testing tools, and 35+ other categories. Jekyll-based static site: README.md and contributing.md serve as the content sources; _includes/ contains reusable HTML templates (head_custom.html); _sass/ holds SCSS styling (color_schemes/django.scss for theming); scripts/main.py likely validates links or metadata; justfile and modd.conf provide development automation; compose.yml may orchestrate local preview tools.
👥Who it's for
Django developers (from beginners to experts) looking for vetted third-party packages, learning resources, and community knowledge; maintainers of Django packages seeking visibility; contributors who want to help curate and organize the Django ecosystem.
🌱Maturity & risk
Actively maintained curator-driven list with contributions from Will Vincent and Jeff Triplett, two prominent Django community members. The repository shows ongoing curation (pull requests for new packages, resource updates) and uses Jekyll + GitHub Pages (Jekyll is production-grade static site generation). This is a stable, community-trusted resource but not a traditional software project with releases or versioning.
Low technical risk: it's a static Jekyll site with no runtime dependencies or deployments. Primary risk is curation drift—quality depends entirely on maintainer reviews and community contributions. Single-maintainer risk exists (Will Vincent is listed first), though Jeff Triplett provides support. No CI pipeline is active (lint.yml.disabled) which could allow formatting inconsistencies.
Active areas of work
The repo is in steady-state curation mode. The lint.yml workflow is disabled (suggesting past CI issues), but stale.yml is active for issue/PR management. Recent activity is likely pull requests adding new packages to categories or updating existing entries. No active development milestones visible, but the repo accepts contributions via pull_request_template.md.
🚀Get running
Clone the repo and preview locally: git clone https://github.com/wsvincent/awesome-django.git && cd awesome-django. Install dependencies via bundle install (Gemfile indicates Jekyll/Ruby). Run bundle exec jekyll serve or use just tasks (justfile present) to start the local preview server. Visit http://localhost:4000 to see the site.
Daily commands:
bundle install && bundle exec jekyll serve starts the dev server on http://localhost:4000. Alternatively, use just commands defined in justfile for shortcuts (e.g., just serve). modd.conf may auto-reload on file changes.
🗺️Map of the codebase
README.md— Primary entry point and curated list index—defines the entire scope of awesome Django resources that contributors must maintain and extend._config.yml— Jekyll site configuration file that controls how the awesome list is built and deployed as a static site.scripts/main.py— Automation script for linting, validating, and maintaining the curated list—essential for CI/CD and data integrity..github/pull_request_template.md— Defines contribution guidelines and submission criteria that every contributor must follow when adding resources.contributing.md— Comprehensive contributor guidelines explaining how to add entries, format, and maintain quality standards for the curated list..pre-commit-config.yaml— Git hooks configuration that enforces code quality and validation rules before commits—prevents invalid entries.pyproject.toml— Python project metadata and tool configuration for linting and validation pipelines used to maintain list integrity.
🧩Components & responsibilities
- README.md (Markdown, Jekyll templating) — Authoritative source of all curated Django resources, organized by category
- Failure mode: Broken links, duplicate entries, or outdated resources reduce credibility; mitigated by scripts/main.py validation
- scripts/main.py (Python (requests, yaml, regex)) — Validates list integrity: checks HTTP status codes, detects duplicates, enforces consistent formatting
- Failure mode: False negatives allow broken links to publish; false positives block valid submissions. Regularly updated to reduce both
- Jekyll site build (Jekyll, Liquid templates, SCSS) — Transforms Markdown list into styled HTML pages deployed to GitHub Pages
- Failure mode: Build failure prevents deployment; caught by CI before merge. Theme changes (color_schemes/django.scss) can break styling
- GitHub Actions workflows (GitHub Actions, YAML) — Orchestrates CI/CD: runs validation, builds site, deploys to Pages, manages stale issues
- Failure mode: Workflow misconfiguration blocks deployments; stale bot misbehavior auto-closes valid issues. Monitored via GitHub UI
- Pre-commit hooks (.pre-commit-config.yaml, Python) — Local validation gate that prevents developers from committing invalid entries
- Failure mode: If disabled by contributor, invalid entries bypass local checks; relies on CI to catch them later
🔀Data flow
Contributor→undefined— undefined
🛠️How to make changes
Add a New Curated Resource
- Edit README.md and add your resource under the appropriate category (e.g., Admin, APIs, Testing) in the correct alphabetical position (
README.md) - Ensure the resource follows the format: Resource Name - One-line description explaining what it does and why it's useful for Django developers (
README.md) - Verify your entry passes validation by running scripts/main.py locally to check for broken links, duplicates, and formatting errors (
scripts/main.py) - Submit a pull request using .github/pull_request_template.md, including a brief description of why this resource is awesome and relevant to the Django community (
.github/pull_request_template.md)
Set Up Local Development Environment
- Install Ruby gems defined in Gemfile for Jekyll and dependencies using bundler (
Gemfile) - Install Python dependencies in pyproject.toml for linting and validation scripts (
pyproject.toml) - Use justfile to run common tasks:
just buildto generate site,just lintto validate the list (justfile) - Enable modd.conf file watcher to auto-rebuild the Jekyll site on README or config changes during development (
modd.conf)
Run Validation and Quality Checks
- Execute scripts/main.py to validate all links, check for duplicates, and ensure consistent formatting across the README (
scripts/main.py) - Configure pre-commit hooks in .pre-commit-config.yaml to automatically run validation before each commit (
.pre-commit-config.yaml) - Review CI workflow results from .github/workflows/lint.yml to ensure automated checks pass on pull requests (
.github/workflows/lint.yml.disabled) - Check contributing.md guidelines to ensure new entries meet the community's quality and relevance standards (
contributing.md)
🔧Why these technologies
- Jekyll + GitHub Pages — Free static site hosting with automatic deployment on push to main branch; perfect for documentation-heavy projects like curated lists
- Python (scripts/main.py) — Enables robust link validation, duplicate detection, and custom formatting checks that Jekyll alone cannot provide
- Pre-commit hooks — Enforces quality gates before commits, preventing malformed entries from being pushed and reducing CI failures
- Docker Compose — Standardizes local development environment across contributors; eliminates 'works on my machine' issues for Jekyll builds
- GitHub Workflows + Stale bot — Automates routine maintenance: link validation, PR linting, and cleanup of old/inactive issues without manual effort
⚖️Trade-offs already made
-
Using a static site (Jekyll) instead of a dynamic CMS
- Why: Awesome lists are primarily read-heavy, rarely need real-time updates, and require version control for contributions
- Consequence: Lower operational complexity and zero hosting costs, but harder to add interactive features; new resources require rebuild (~30s)
-
Python validation script instead of shell/Ruby
- Why: Python has better libraries (requests, yaml) for link validation and structured checking; more readable for contributors
- Consequence: Adds Python dependency, but easier to maintain and extend validation logic without learning shell scripting
-
Manual curation vs. automated scraping
- Why: Awesome lists depend on human judgment and community vetting to maintain quality; automatic inclusion would dilute the list
- Consequence: Scalability limited by review bandwidth, but ensures only genuinely useful resources are included
🚫Non-goals (don't propose these)
- Not a real-time resource discovery engine—resources are added through manual pull requests, not auto-detected
- Not a package manager or dependency resolver—this is purely a curated index, not a tool for installing Django packages
- Not a discussion forum—GitHub issues/PRs are used only for curation; complex discussions belong in Django forums
- Not a replacement for Django's official documentation—focuses on complementary third-party packages and learning resources
🪤Traps & gotchas
No active linting CI: lint.yml is disabled, so markdown formatting or broken links may slip through. Manual doctoc updates: The <!-- START doctoc --> comments in README.md must be regenerated via doctoc README.md when categories change, or the ToC falls out of sync. Jekyll build caching: _site/ directory is gitignored but can cause stale previews; run jekyll clean if changes don't appear. Ruby version sensitivity: Gemfile likely pins Jekyll version; running bundle install is required, not just gem install jekyll. No automated link validation: scripts/main.py exists but may not run on CI; dead package links must be caught manually.
🏗️Architecture
💡Concepts to learn
- Curated-List-as-GitHub-Repo Pattern — This repo exemplifies the community-driven curation model (pull-request-based, version-controlled content) used across the awesome-* ecosystem on GitHub; understanding how content quality is maintained via human review is central to the repo's governance.
- Jekyll Static Site Generation — The entire site is built and hosted via Jekyll + GitHub Pages (zero runtime server required); knowing Jekyll's template language (Liquid), asset pipeline, and configuration model is essential to modifying the site.
- SCSS/CSS Theming with Color Schemes — The _sass/color_schemes/django.scss file shows how to implement dark/light mode switching and Django-branded styling; this is a key UX pattern for modern documentation sites.
- Doctoc Auto-Generated Table of Contents — The README.md uses doctoc comments to auto-generate a ToC from markdown headers, preventing manual sync issues; this is a practical solution for long curated lists.
- Pre-commit Hooks for Content Validation — The .pre-commit-config.yaml enforces markdown linting and link validation before commits, preventing common curation errors without CI overhead; this is a lightweight alternative to traditional CI/CD.
- GitHub Pages CNAME Configuration — The CNAME file enables custom domain hosting (e.g., awesome-django.readthedocs style), removing reliance on github.io subdomains and improving discoverability.
🔗Related repos
vinta/awesome-python— Similar curated-list-as-GitHub-repo pattern for general Python packages; shares curation philosophy and community-driven maintenance model.rosarior/awesome-django-cms— Narrower Django CMS ecosystem curated list; complements awesome-django by deep-diving into CMS-specific packages.django/django— The canonical Django repository; awesome-django's entire purpose is to aggregate tools and resources for this project.encode/django-rest-framework— Major Django REST Framework repo; given its dedicated section in awesome-django (DRF Resources, DRF Tutorials), this is a key ecosystem reference.wagtail/wagtail— Wagtail CMS has dedicated section in awesome-django; understanding this package helps contextualize the 'Wagtail' category recommendations.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Enable and Enhance lint.yml GitHub Action Workflow
The lint.yml workflow is currently disabled (.github/workflows/lint.yml.disabled). This repo has a .pre-commit-config.yaml and contributing.md guidelines, but no active CI validation. Enabling and configuring the lint workflow would automatically validate PR submissions against the awesome-list standards, reducing manual review overhead and ensuring consistent formatting of new contributions.
- [ ] Rename .github/workflows/lint.yml.disabled to lint.yml
- [ ] Configure the workflow to run on pull_request events and validate markdown formatting using tools like markdownlint or awesome-lint
- [ ] Add validation checks for link validity and description quality per the awesome-list spec
- [ ] Update .github/pull_request_template.md to reference the automated lint checks
Create Automated Link Validation GitHub Action
As a curated list repo, broken links are a critical issue. The repo has a scripts/main.py file suggesting some automation exists, but there's no CI workflow to validate all URLs. This would catch dead links before they merge and keep the list quality high.
- [ ] Create .github/workflows/link-check.yml to run on scheduled intervals and pull requests
- [ ] Implement or integrate a link validation tool (e.g., awesome-lint or custom Python script in scripts/) to check all URLs in README.md
- [ ] Configure the workflow to create issues or comment on PRs with broken link reports
- [ ] Add link checking to the contributing.md guidelines
Add Contribution Stats and Metrics Dashboard Documentation
The repo has stale.yml workflow and CODEOWNERS file, indicating maintenance concerns. Creating automated contributor acknowledgment and metrics documentation would help recognize contributions and show repo health, improving community engagement.
- [ ] Create .github/workflows/contributors.yml to auto-generate a CONTRIBUTORS.md file or section in README.md
- [ ] Document contribution metrics in contributing.md (e.g., categories added, links approved, reviews completed)
- [ ] Add GitHub Actions workflow to sync contributor recognition from .github/CODEOWNERS to a public-facing page
- [ ] Update .github/issue_template.md to track contribution type (new category, new resource, link fix, etc.)
🌿Good first issues
- Enable and fix the disabled lint.yml workflow: Review why .github/workflows/lint.yml.disabled was disabled, re-enable it, and resolve any markdown/link validation errors in README.md to prevent future inconsistencies.
- Add a link validator script: Extend scripts/main.py to crawl all package URLs in README.md (via regex parsing) and report 404s or dead links, then document the validation process in contributing.md.
- Create a CONTRIBUTORS.md or HALL_OF_FAME.md: Generate a list of all past PR contributors (via git log or GitHub API) to acknowledge community effort and encourage future contributions.
⭐Top contributors
Click to expand
Top contributors
- @jefftriplett — 50 commits
- @wsvincent — 11 commits
- @thibaudcolas — 6 commits
- @trey — 2 commits
- @DjangoCRM — 2 commits
📝Recent commits
Click to expand
Recent commits
f398ec9— :handshake: Adddjango-modern-rest(#360) (sobolevn)137c2ea— :pencil: Tighten PR template: clearer close policy, firm 100-star threshold, trimmed questions (jefftriplett)9d50468— :handshake: Add django-structlog to Logging section (#349) (cosmosgenius)3b89415— :pencil: Update PR template to broaden exclusions and clarify maintenance expectations (jefftriplett)6d37cc1— :handshake: Add dj-control-room to the list of Django packages for Admin (#345) (yassi)575e53c— :pencil: Update Django News Jobs to Django Job Board (jefftriplett)f41d17e— update Podcasts section (wsvincent)90a70a2— :sparkles: Add Django LiveView to full-stack frameworks (#341) (tanrax)7f33c53— :pencil: Strengthen PR template requirement wording (jefftriplett)1b78930— :art: Expand Django color scheme variables (jefftriplett)
🔒Security observations
This repository is a curated list (documentation/metadata project) with minimal security risk. No hardcoded secrets, dangerous dependencies, or injection vulnerabilities detected. The main concerns are process-related: disabled linting workflow and missing explicit security header configuration. The codebase does not contain application code that processes user input or manages sensitive data directly, significantly reducing attack surface. Overall security posture is good for a documentation repository.
- Low · Disabled Linting Workflow —
.github/workflows/lint.yml.disabled. The lint workflow file (.github/workflows/lint.yml.disabled) is disabled, which means automated code quality and security linting checks are not running in CI/CD pipeline. This could allow issues to slip through without detection. Fix: Re-enable the lint workflow by renaming the file to lint.yml and ensure pre-commit hooks are properly configured to catch issues before merge. - Low · Missing Security Headers Configuration —
_config.yml. No explicit security headers configuration found in Jekyll/GitHub Pages configuration (_config.yml). The site should include security headers like CSP, X-Frame-Options, and X-Content-Type-Options. Fix: Add security headers configuration to _config.yml or implement them via GitHub Pages settings and/or a custom headers file. - Low · No HTTPS Enforcement Documentation —
CNAME, _config.yml. While CNAME file exists (suggesting custom domain), there is no visible documentation ensuring HTTPS is enforced for the GitHub Pages site. Fix: Document and verify that 'Enforce HTTPS' is enabled in GitHub Pages settings. Add enforce_https or equivalent configuration.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.