Skip to content

Configuration

Dj Signals Panel works out of the box with no required configuration. All options are set via a DJ_SIGNALS_PANEL_SETTINGS dict in your Django settings.

For access control specifically (locking down individual views or MCP tools by group), see Scopes.

DJ_SIGNALS_PANEL_SETTINGS = {
    'SHOW_SOURCE': False,
    'SIGNAL_MODULES': [],
    'LOAD_DEFAULT_CSS': True,
    'EXTRA_CSS': [],
}

Settings Reference

SHOW_SOURCE

Type: bool
Default: False
Description: Every receiver row on the signal detail page includes an expandable section for its file path/line (labelled View Location). When SHOW_SOURCE is True, that same section is relabelled View Source and additionally renders the receiver's source code with syntax highlighting.

DJ_SIGNALS_PANEL_SETTINGS = {
    'SHOW_SOURCE': True,
}

SIGNAL_MODULES

Type: list[str]
Default: []
Description: Additional Python module paths to include in signal discovery, on top of what is found automatically. Useful when your signals are defined in modules that are not picked up by default.

DJ_SIGNALS_PANEL_SETTINGS = {
    'SIGNAL_MODULES': [
        'myapp.signals',
        'otherapp.events',
    ],
}

LOAD_DEFAULT_CSS

Type: bool
Default: True
Description: Whether to load the built-in Signals Panel stylesheet. Set to False to provide your own styles from scratch.

EXTRA_CSS

Type: list[str]
Default: []
Description: Additional stylesheets to load after the default CSS. Accepts static file paths or full URLs.

Static file paths are relative to your app's static/ subdirectory (same convention as Django's {% static %} tag). A file at myapp/static/myapp/css/overrides.css is referenced as myapp/css/overrides.css.

DJ_SIGNALS_PANEL_SETTINGS = {
    'EXTRA_CSS': [
        # File lives at: myapp/static/myapp/css/overrides.css
        'myapp/css/overrides.css',
        # Full URLs are also supported
        'https://cdn.example.com/theme.css',
    ],
}

Theme adapters

Dj Signals Panel builds on dj-control-room-base, which ships optional token-override stylesheets for admin skins that don't match the classic Django admin palette. These aren't loaded automatically - add the one you need to EXTRA_CSS:

DJ_SIGNALS_PANEL_SETTINGS = {
    'EXTRA_CSS': ['dj_control_room_base/css/themes/unfold.css'],
}

Currently available:

File For
themes/unfold.css Projects using django-unfold as their admin skin.

themes/unfold.css remaps Dj Signals Panel's accent/surface/border/muted tokens to Unfold's own CSS variables, so the panel matches the host site's configured brand color instead of the classic-admin blue.

Signal List with django-unfold theme

See the dj-control-room-base configuration docs for more on how theme adapters work and how to build your own.

Panel Tools (MCP)

Dj Signals Panel ships dj_signals_panel/tools.py, a ToolRegistry of MCP-facing tools that dj-control-room aggregates and exposes to AI agents (Cursor, Claude, etc.) over its MCP endpoint.

Tool Description
list_signals List every signal Dj Signals Panel can see (Django built-ins and app-defined), with receiver counts and bound senders. Filter by app_label and query.
get_receivers List the receivers connected to a signal: dotted path, dispatch_uid, weak/strong ref, and sender filter. Look up by signal (dotted signal id).
find_signal_by_sender Reverse lookup: given a model, find every signal/receiver that fires for it (e.g. "what fires when Order is saved").
inspect_receiver Resolve a receiver's dotted_path to its source file/line and any signals it's currently connected to, so an agent can jump straight to the function instead of grepping.

inspect_receiver only returns metadata by default. Enable a source code preview in its results with the same SHOW_SOURCE setting used by the admin UI's receiver detail view:

DJ_SIGNALS_PANEL_SETTINGS = {
    'SHOW_SOURCE': True,
}

SCOPE_PERMISSIONS

Type: dict
Default: {}
Description: Restrict individual tool scopes (or view scopes) independently of the panel's default permission checks. Each of the four panel tools ships under its own scope (agent_signal_list, agent_receiver_list, agent_signal_lookup, agent_receiver_inspect), separate from the view scopes humans hit in the admin UI, so agent access can be governed independently.

DJ_SIGNALS_PANEL_SETTINGS = {
    'SCOPE_PERMISSIONS': {
        'agent_receiver_inspect': {'ALLOWED_GROUPS': ['ai-agents']},
    },
}

See Scopes for the full list of view and tool scopes, and the dj-control-room-base Panel Tools guide for the underlying API.

URLs Configuration

# urls.py
urlpatterns = [
    path('admin/dj-signals-panel/', include('dj_signals_panel.urls')),
    path('admin/', admin.site.urls),
]

Security

Dj Signals Panel uses Django's built-in admin authentication:

  • Only staff users (is_staff=True) can access the panel
  • All views require authentication via @staff_member_required
  • No additional security configuration needed