Silky smooth profiling for the Django Framework — modernized UI fork of django-silk
Project description
django-silky
django-silky is a modernized-UI fork of django-silk — a live profiling and inspection tool for the Django framework.
It keeps 100 % of the original functionality (request/response recording, SQL inspection, code profiling, dynamic profiling) while shipping a fully redesigned interface built on CSS custom properties (light and dark mode), Lucide icons, an inline filter bar, multi-column sort chips, and proper pagination.
What's different from django-silk?
| Feature | django-silk | django-silky |
|---|---|---|
| Theme | Fixed dark nav, light body | Full light/dark toggle, persisted in localStorage |
| Filter UI | 300 px slide-out drawer | Inline collapsible filter bar |
| Filter selectors | Single-value dropdowns | Multi-select for method, status code, and path (with search) |
| Sort | Single column, GET param | Multi-column sort chips (session-persisted) |
| Pagination | Query-slice (LIMIT N) |
Real Django Paginator with prev/next/page numbers |
| Detail pages | Plain tables | Hero bar + metric pills + section cards |
| Icons | Font Awesome (CDN) | Lucide (self-hosted, no external requests) |
| URL sharing | State lost on reload | Sort + per-page encoded in URL; filter bar state in localStorage |
Screenshots
Analytics dashboard — activity timeline, status donut, method bars, RT histogram, latency percentiles, queries-per-request histogram |
Requests list — inline filter bar with multi-select method, status, path, and view filters; multi-column sort chips |
N+1 detection — banner with detected pattern, query count badge, and per-query cost; offending rows highlighted |
Profile detail — source file, function code highlighted, and associated SQL queries |
cProfile output — raw cProfile dump with ncalls, tottime, cumtime, and filename:function |
Settings — colour scheme picker (Light / Dark / Midnight / High Contrast) and selective data-clear controls |
Migrating from django-silk
django-silky is a drop-in replacement — same app label (silk), same
database schema (migrations 0001 – 0008), all your existing data is retained.
pip uninstall django-silk
pip install django-silky
# No manage.py migrate needed — schema is identical
For full instructions, version compatibility details, and rollback steps see MIGRATING.md.
Requirements
- Django 4.2, 5.1, 5.2, 6.0
- Python 3.10, 3.11, 3.12, 3.13, 3.14
Installation
pip install django-silky
With optional request body formatting:
pip install django-silky[formatting]
settings.py
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
...
]
TEMPLATES = [{
...
'OPTIONS': {
'context_processors': [
...
'django.template.context_processors.request',
],
},
}]
INSTALLED_APPS = [
...
'silk',
]
Middleware order: Any middleware placed before
SilkyMiddlewarethat returns a response without callingget_responsewill prevent Silk from running. If you usedjango.middleware.gzip.GZipMiddleware, place it beforeSilkyMiddleware.
urls.py
from django.urls import include, path
urlpatterns += [
path('silk/', include('silk.urls', namespace='silk')),
]
Migrate and collect static
python manage.py migrate
python manage.py collectstatic
The UI is now available at /silk/.
Features
Request Inspection
Silk's middleware records every HTTP request and response — method, status code, path, timing, SQL query count, and headers/bodies — and presents them in a filterable, sortable, paginated table.
SQL Inspection
Every SQL query executed during a request is captured with its execution time, tables involved, number of joins, and a full stack trace so you can see exactly where in your code it was triggered.
Code Profiling
Decorator / context manager
from silk.profiling.profiler import silk_profile
@silk_profile(name='View Blog Post')
def post(request, post_id):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {'post': p})
def post(request, post_id):
with silk_profile(name='View Blog Post #%d' % post_id):
p = Post.objects.get(pk=post_id)
return render(request, 'post.html', {'post': p})
cProfile integration
SILKY_PYTHON_PROFILER = True
SILKY_PYTHON_PROFILER_BINARY = True # also save .prof files
When enabled, a call-graph coloured by time is shown on the profile detail page.
Dynamic profiling
Profile third-party code without touching its source:
SILKY_DYNAMIC_PROFILING = [{
'module': 'path.to.module',
'function': 'MyClass.bar',
}]
Code Generation
Silk generates a curl command and a Django test-client snippet for every request, making it easy to replay a captured request from the terminal or a unit test.
Configuration
Authentication
Silk is locked down by default. Unauthenticated or non-staff requests to /silk/ return 404 Not Found — as if the app weren't mounted — so an accidental production deployment can't leak profiling data.
# To expose the UI publicly (internal dev-only, not recommended):
SILKY_AUTHENTICATION = False
SILKY_AUTHORISATION = False
# To change who is allowed in (default: user.is_staff):
SILKY_PERMISSIONS = lambda user: user.is_superuser
Request / response body limits
SILKY_MAX_REQUEST_BODY_SIZE = -1 # -1 = no limit
SILKY_MAX_RESPONSE_BODY_SIZE = 1024 # bytes; larger bodies are discarded
Sampling (high-traffic sites)
SILKY_INTERCEPT_PERCENT = 50 # record only 50 % of requests
# or
SILKY_INTERCEPT_FUNC = lambda request: 'profile' in request.session
Garbage collection
SILKY_MAX_RECORDED_REQUESTS = 10_000
SILKY_MAX_RECORDED_REQUESTS_CHECK_PERCENT = 10 # GC runs on 10 % of requests
Trigger manually (e.g. from a cron job):
python manage.py silk_request_garbage_collect
Clear all data immediately:
python manage.py silk_clear_request_log
Query analysis
SILKY_ANALYZE_QUERIES = True
SILKY_EXPLAIN_FLAGS = {'format': 'JSON', 'costs': True}
Warning:
EXPLAIN ANALYZEon PostgreSQL actually executes the query, which may cause unintended side effects. Use with caution.
Meta-profiling
SILKY_META = True # shows how long Silk itself takes per request
Sensitive data masking
# Default set — case insensitive
SILKY_SENSITIVE_KEYS = {'username', 'api', 'token', 'key', 'secret', 'password', 'signature'}
Custom profiler storage
# Django >= 4.2
STORAGES = {
'SILKY_STORAGE': {
'BACKEND': 'path.to.StorageClass',
},
}
SILKY_PYTHON_PROFILER_RESULT_PATH = '/path/to/profiles/'
Development
git clone https://github.com/VaishnavGhenge/django-silky.git
cd django-silky
python -m venv .venv && source .venv/bin/activate
pip install -e ".[formatting]"
pip install -r project/requirements.txt
# Run the example project
DB_ENGINE=sqlite3 python project/manage.py migrate
DB_ENGINE=sqlite3 python project/manage.py runserver
# Visit http://127.0.0.1:8000/silk/ (login: admin / admin)
# Watch SCSS while editing UI
npx gulp watch
# Run tests
DB_ENGINE=sqlite3 python -m pytest project/tests/ -q
Credits
django-silky is a fork of django-silk, originally created by Michael Ford and maintained by Jazzband. All core profiling functionality comes from the upstream project; this fork focuses solely on UI improvements.
License
MIT — same as the upstream django-silk.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file django_silky-1.2.0.tar.gz.
File metadata
- Download URL: django_silky-1.2.0.tar.gz
- Upload date:
- Size: 8.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
53599d81856b6a34b31030f318817ab08a513966829a75ced07e89d2dec229d4
|
|
| MD5 |
2d7b3e0a92a22d5e2bd48a65c7fd83ab
|
|
| BLAKE2b-256 |
3a97d040b1fcb34abbc71658c367152056f83390dcf974895027d64993956064
|
Provenance
The following attestation bundles were made for django_silky-1.2.0.tar.gz:
Publisher:
release.yml on VaishnavGhenge/django-silky
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_silky-1.2.0.tar.gz -
Subject digest:
53599d81856b6a34b31030f318817ab08a513966829a75ced07e89d2dec229d4 - Sigstore transparency entry: 1326171844
- Sigstore integration time:
-
Permalink:
VaishnavGhenge/django-silky@ce4368bf82d0ca8fd7068dbd3b0b1ff65dda6e43 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/VaishnavGhenge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ce4368bf82d0ca8fd7068dbd3b0b1ff65dda6e43 -
Trigger Event:
push
-
Statement type:
File details
Details for the file django_silky-1.2.0-py3-none-any.whl.
File metadata
- Download URL: django_silky-1.2.0-py3-none-any.whl
- Upload date:
- Size: 2.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71c0f0ef7428af11c43d05f654b3ad1585a05eb884b1024bc44ab5275e3e7fc0
|
|
| MD5 |
6de788399d6471318bae81e36f38d942
|
|
| BLAKE2b-256 |
dc42999276855377b15eb5d9dea776106f30841b50122262c1a027bda2d285c1
|
Provenance
The following attestation bundles were made for django_silky-1.2.0-py3-none-any.whl:
Publisher:
release.yml on VaishnavGhenge/django-silky
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
django_silky-1.2.0-py3-none-any.whl -
Subject digest:
71c0f0ef7428af11c43d05f654b3ad1585a05eb884b1024bc44ab5275e3e7fc0 - Sigstore transparency entry: 1326171987
- Sigstore integration time:
-
Permalink:
VaishnavGhenge/django-silky@ce4368bf82d0ca8fd7068dbd3b0b1ff65dda6e43 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/VaishnavGhenge
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ce4368bf82d0ca8fd7068dbd3b0b1ff65dda6e43 -
Trigger Event:
push
-
Statement type: