diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf9a303..e32ba18 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
- **Proxy URL scheme validation in `load_proxy_tiers()`** — URLs in `PROXY_URLS_DATACENTER` / `PROXY_URLS_RESIDENTIAL` that are missing an `http://` or `https://` scheme are now logged as a warning and skipped, rather than being passed through and causing SSL handshake failures or connection errors at request time. Also fixed a missing `http://` prefix in the dev `.env` `PROXY_URLS_DATACENTER` entry.
### Changed
+- **Unified confirm dialog — pure HTMX `hx-confirm` + `
+
Delete
{% endif %}
diff --git a/web/src/padelnomics/admin/templates/admin/affiliate_program_form.html b/web/src/padelnomics/admin/templates/admin/affiliate_program_form.html
index 70c62a9..524d47f 100644
--- a/web/src/padelnomics/admin/templates/admin/affiliate_program_form.html
+++ b/web/src/padelnomics/admin/templates/admin/affiliate_program_form.html
@@ -120,10 +120,9 @@ document.addEventListener('DOMContentLoaded', function() {
Cancel
{% if editing %}
-
+
Delete
{% endif %}
diff --git a/web/src/padelnomics/admin/templates/admin/articles.html b/web/src/padelnomics/admin/templates/admin/articles.html
index c8133d4..80acc2a 100644
--- a/web/src/padelnomics/admin/templates/admin/articles.html
+++ b/web/src/padelnomics/admin/templates/admin/articles.html
@@ -11,9 +11,10 @@
diff --git a/web/src/padelnomics/admin/templates/admin/audience_contacts.html b/web/src/padelnomics/admin/templates/admin/audience_contacts.html
index b48de55..e3e2187 100644
--- a/web/src/padelnomics/admin/templates/admin/audience_contacts.html
+++ b/web/src/padelnomics/admin/templates/admin/audience_contacts.html
@@ -27,10 +27,11 @@
{{ c.email if c.email is defined else (c.get('email', '-') if c is mapping else '-') }}
{{ (c.created_at if c.created_at is defined else (c.get('created_at', '-') if c is mapping else '-'))[:16] if c else '-' }}
-
+
- Remove
+ Remove
diff --git a/web/src/padelnomics/admin/templates/admin/base_admin.html b/web/src/padelnomics/admin/templates/admin/base_admin.html
index 9cc68ef..6f8c0aa 100644
--- a/web/src/padelnomics/admin/templates/admin/base_admin.html
+++ b/web/src/padelnomics/admin/templates/admin/base_admin.html
@@ -228,36 +228,29 @@
-
- Cancel
- Confirm
-
+
+ Cancel
+ Confirm
+
{% endblock %}
diff --git a/web/src/padelnomics/admin/templates/admin/generate_form.html b/web/src/padelnomics/admin/templates/admin/generate_form.html
index 1b7c137..33e3298 100644
--- a/web/src/padelnomics/admin/templates/admin/generate_form.html
+++ b/web/src/padelnomics/admin/templates/admin/generate_form.html
@@ -19,7 +19,7 @@
No data rows found. Run the data pipeline to populate {{ config_data.data_table }}.
{% else %}
-
+
@@ -45,7 +45,8 @@
-
+
Generate Articles
diff --git a/web/src/padelnomics/admin/templates/admin/partials/affiliate_program_results.html b/web/src/padelnomics/admin/templates/admin/partials/affiliate_program_results.html
index 71f7b41..66c3a1d 100644
--- a/web/src/padelnomics/admin/templates/admin/partials/affiliate_program_results.html
+++ b/web/src/padelnomics/admin/templates/admin/partials/affiliate_program_results.html
@@ -21,10 +21,9 @@
Edit
-
+
Delete
diff --git a/web/src/padelnomics/admin/templates/admin/partials/affiliate_row.html b/web/src/padelnomics/admin/templates/admin/partials/affiliate_row.html
index 3d62461..7663208 100644
--- a/web/src/padelnomics/admin/templates/admin/partials/affiliate_row.html
+++ b/web/src/padelnomics/admin/templates/admin/partials/affiliate_row.html
@@ -20,10 +20,9 @@
{{ product.click_count or 0 }}
Edit
-
+
Delete
diff --git a/web/src/padelnomics/admin/templates/admin/partials/pipeline_extractions.html b/web/src/padelnomics/admin/templates/admin/partials/pipeline_extractions.html
index de54678..40a6691 100644
--- a/web/src/padelnomics/admin/templates/admin/partials/pipeline_extractions.html
+++ b/web/src/padelnomics/admin/templates/admin/partials/pipeline_extractions.html
@@ -29,10 +29,10 @@
-
+
-
+
Run All Extractors
@@ -112,11 +112,11 @@
{% if run.status == 'running' %}
+ class="m-0" hx-boost="true">
-
+ hx-confirm="Mark run #{{ run.run_id }} as failed? Only do this if the process is definitely dead.">
Mark Failed
diff --git a/web/src/padelnomics/admin/templates/admin/partials/scenario_results.html b/web/src/padelnomics/admin/templates/admin/partials/scenario_results.html
index d742914..3ba3047 100644
--- a/web/src/padelnomics/admin/templates/admin/partials/scenario_results.html
+++ b/web/src/padelnomics/admin/templates/admin/partials/scenario_results.html
@@ -36,9 +36,10 @@
PDF EN
PDF DE
Edit
-
+
- Delete
+ Delete
diff --git a/web/src/padelnomics/admin/templates/admin/pipeline.html b/web/src/padelnomics/admin/templates/admin/pipeline.html
index 511b11b..96ea282 100644
--- a/web/src/padelnomics/admin/templates/admin/pipeline.html
+++ b/web/src/padelnomics/admin/templates/admin/pipeline.html
@@ -57,11 +57,11 @@
Extraction status, data catalog, and ad-hoc query editor
-
+
-
+
Run Pipeline
diff --git a/web/src/padelnomics/admin/templates/admin/template_detail.html b/web/src/padelnomics/admin/templates/admin/template_detail.html
index d0ca524..5395c02 100644
--- a/web/src/padelnomics/admin/templates/admin/template_detail.html
+++ b/web/src/padelnomics/admin/templates/admin/template_detail.html
@@ -13,9 +13,10 @@