Retained records: {{ retained }} / {{ capacity }}

{% if not recording_enabled %}

404 recording is disabled in the server configuration. Existing records are kept.

{% endif %} {% if retained >= capacity %}

Capacity reached. New paths are no longer recorded. Run 404 record cleanup to remove dismissed or redirected records, or raise the configured limit. Ignored records also count toward capacity. To deliberately remove their suppression and hit history, preview with bragi notfound prune --site {{ site.slug }} --include-ignored --dry-run, then confirm with bragi notfound prune --site {{ site.slug }} --include-ignored --yes. Removed ignored paths can be recorded again.

{% endif %}

Recording is rate-limited and may be skipped when the database is busy. Counts and times reflect recorded hits only.

{% if entries %} {% for e in entries %} {% set nf = e.nf %} {% endfor %}
Path Recorded hits Last recorded Referrer Suggestion Actions
{{ nf.path }} {{ nf.count }} {{ nf.last_seen.strftime('%Y-%m-%d') }} {% if nf.last_referrer %} {% if e.referrer_edit_url %} {{ nf.last_referrer }} {% else %} {{ nf.last_referrer }} {% endif %} {% else %}(none){% endif %} {% if e.suggestion and e.suggestion.kind == 'redirect' %} → {{ e.suggestion.candidate.url }} {% elif e.suggestion and e.suggestion.kind == 'archived' %} archived: {{ e.suggestion.candidate.title }} {% else %} (none) {% endif %} {# The resolving actions collapse into one dropdown so the row isn't a wall of buttons; the permanent Ignore stays standalone (destructive, one click). Panel items are plain menu rows (no `btn` class) so `.dropdown-panel` styles them. #}
Actions ▾
{# Ignore = permanent: never show this path again. #}
{# Bulk actions. Buttons gather the checked row ids into the hidden form (below) and POST it -- the table can't be wrapped in a
because the per-row action dropdown already contains forms (no nested forms). Wiring lives in the delegated script in notfound_list.html. #}
0 selected
{% else %}

No detected 404s for this site.

{% endif %}