diff --git a/swh/web/archive_coverage/__init__.py b/swh/web/archive_coverage/__init__.py
new file mode 100644
diff --git a/swh/web/templates/misc/coverage.html b/swh/web/archive_coverage/templates/archive-coverage.html
rename from swh/web/templates/misc/coverage.html
rename to swh/web/archive_coverage/templates/archive-coverage.html
diff --git a/swh/web/archive_coverage/urls.py b/swh/web/archive_coverage/urls.py
new file mode 100644
--- /dev/null
+++ b/swh/web/archive_coverage/urls.py
@@ -0,0 +1,12 @@
+# Copyright (C) 2018-2022  The Software Heritage developers
+# See the AUTHORS file at the top-level directory of this distribution
+# License: GNU Affero General Public License version 3, or any later version
+# See top-level LICENSE file for more information
+
+from django.urls import re_path as url
+
+from swh.web.archive_coverage.views import swh_coverage
+
+urlpatterns = [
+    url(r"^coverage/$", swh_coverage, name="swh-coverage"),
+]
diff --git a/swh/web/misc/coverage.py b/swh/web/archive_coverage/views.py
rename from swh/web/misc/coverage.py
rename to swh/web/archive_coverage/views.py
--- a/swh/web/misc/coverage.py
+++ b/swh/web/archive_coverage/views.py
@@ -10,7 +10,6 @@
 from django.http.request import HttpRequest
 from django.http.response import HttpResponse
 from django.shortcuts import render
-from django.urls import re_path as url
 from django.views.decorators.cache import never_cache
 from django.views.decorators.clickjacking import xframe_options_exempt
 
@@ -383,7 +382,7 @@
 
 @xframe_options_exempt
 @never_cache
-def _swh_coverage(request: HttpRequest) -> HttpResponse:
+def swh_coverage(request: HttpRequest) -> HttpResponse:
     use_cache = is_swh_web_production(request)
     listers_metrics = _get_listers_metrics(use_cache)
 
@@ -484,7 +483,7 @@
 
     return render(
         request,
-        "misc/coverage.html",
+        "archive-coverage.html",
         {
             "origins": {
                 "Regular crawling": listed_origins,
@@ -494,8 +493,3 @@
             "focus": focus,
         },
     )
-
-
-urlpatterns = [
-    url(r"^coverage/$", _swh_coverage, name="swh-coverage"),
-]
diff --git a/swh/web/config.py b/swh/web/config.py
--- a/swh/web/config.py
+++ b/swh/web/config.py
@@ -164,6 +164,7 @@
             "swh.web.save_code_now",
             "swh.web.deposit",
             "swh.web.badges",
+            "swh.web.archive_coverage",
         ],
     ),
 }
diff --git a/swh/web/misc/urls.py b/swh/web/misc/urls.py
--- a/swh/web/misc/urls.py
+++ b/swh/web/misc/urls.py
@@ -61,7 +61,6 @@
 
 
 urlpatterns = [
-    url(r"^", include("swh.web.misc.coverage")),
     url(r"^jslicenses/$", _jslicenses, name="jslicenses"),
     url(r"^stat_counters/$", _stat_counters, name="stat-counters"),
     url(r"^metrics/prometheus/$", prometheus_metrics, name="metrics-prometheus"),
diff --git a/swh/web/templates/homepage.html b/swh/web/templates/homepage.html
--- a/swh/web/templates/homepage.html
+++ b/swh/web/templates/homepage.html
@@ -52,11 +52,15 @@
 </p>
 </div>
 
-<div class="p-3">
-<h4>Content</h4>
+{% if "swh.web.archive_coverage" in SWH_DJANGO_APPS %}
 
-<iframe class="swh-coverage-list" src="{% url 'swh-coverage' %}"></iframe>
-</div>
+  <div class="p-3">
+  <h4>Content</h4>
+
+  <iframe class="swh-coverage-iframe" src="{% url 'swh-coverage' %}"></iframe>
+  </div>
+
+{% endif %}
 
 <div class="p-3">
 <h4>Size</h4>
diff --git a/swh/web/tests/archive_coverage/__init__.py b/swh/web/tests/archive_coverage/__init__.py
new file mode 100644
diff --git a/swh/web/tests/archive_coverage/test_app.py b/swh/web/tests/archive_coverage/test_app.py
new file mode 100644
--- /dev/null
+++ b/swh/web/tests/archive_coverage/test_app.py
@@ -0,0 +1,33 @@
+# Copyright (C) 2022  The Software Heritage developers
+# See the AUTHORS file at the top-level directory of this distribution
+# License: GNU Affero General Public License version 3, or any later version
+# See top-level LICENSE file for more information
+
+import pytest
+
+from django.urls import get_resolver
+
+from swh.web.archive_coverage.urls import urlpatterns
+from swh.web.tests.django_asserts import assert_not_contains
+from swh.web.tests.helpers import check_html_get_response
+from swh.web.utils import reverse
+
+
+@pytest.mark.django_db
+def test_archive_coverage_deactivate(client, django_settings):
+    """Check archive coverage feature is deactivated when the swh.web.archive_coverage
+    django application is not in installed apps."""
+
+    django_settings.SWH_DJANGO_APPS = [
+        app
+        for app in django_settings.SWH_DJANGO_APPS
+        if app != "swh.web.archive_coverage"
+    ]
+
+    url = reverse("swh-web-homepage")
+    resp = check_html_get_response(client, url, status_code=200)
+    assert_not_contains(resp, "swh-coverage-iframe")
+
+    archive_coverage_view_names = set(urlpattern.name for urlpattern in urlpatterns)
+    all_view_names = set(get_resolver().reverse_dict.keys())
+    assert archive_coverage_view_names & all_view_names == set()
diff --git a/swh/web/tests/misc/test_coverage.py b/swh/web/tests/archive_coverage/test_coverage.py
rename from swh/web/tests/misc/test_coverage.py
rename to swh/web/tests/archive_coverage/test_coverage.py
--- a/swh/web/tests/misc/test_coverage.py
+++ b/swh/web/tests/archive_coverage/test_coverage.py
@@ -16,8 +16,12 @@
 from django.utils.html import escape
 
 from swh.scheduler.model import LastVisitStatus, ListedOrigin, OriginVisitStats
+from swh.web.archive_coverage.views import (
+    deposited_origins,
+    legacy_origins,
+    listed_origins,
+)
 from swh.web.config import SWH_WEB_SERVER_NAME
-from swh.web.misc.coverage import deposited_origins, legacy_origins, listed_origins
 from swh.web.tests.django_asserts import assert_contains, assert_not_contains
 from swh.web.tests.helpers import check_html_get_response, check_http_get_response
 from swh.web.utils import reverse
@@ -30,7 +34,7 @@
     """
     url = reverse("swh-coverage")
     check_html_get_response(
-        client, url, status_code=200, template_used="misc/coverage.html"
+        client, url, status_code=200, template_used="archive-coverage.html"
     )
 
 
@@ -43,7 +47,7 @@
     that will be consumed by the archive coverage view.
     """
     # mock calls to get nixguix origin counts
-    mock_archive = mocker.patch("swh.web.misc.coverage.archive")
+    mock_archive = mocker.patch("swh.web.archive_coverage.views.archive")
     mock_archive.lookup_latest_origin_snapshot.return_value = {"id": "some-snapshot"}
     mock_archive.lookup_snapshot_sizes.return_value = {"release": 30095}
 
@@ -98,7 +102,7 @@
                     "status": "done",
                 }
             )
-    get_deposits_list = mocker.patch("swh.web.misc.coverage.get_deposits_list")
+    get_deposits_list = mocker.patch("swh.web.archive_coverage.views.get_deposits_list")
     get_deposits_list.return_value = deposits
 
 
@@ -107,7 +111,7 @@
     # check view gets rendered without errors
     url = reverse("swh-coverage")
     resp = check_html_get_response(
-        client, url, status_code=200, template_used="misc/coverage.html"
+        client, url, status_code=200, template_used="archive-coverage.html"
     )
 
     # check logos and origins search links are present in the rendered page
@@ -153,7 +157,7 @@
     # check view gets rendered without errors
     url = reverse("swh-coverage", query_params={"focus": ",".join(focus)})
     resp = check_html_get_response(
-        client, url, status_code=200, template_used="misc/coverage.html"
+        client, url, status_code=200, template_used="archive-coverage.html"
     )
 
     # check focused elements
@@ -174,7 +178,7 @@
 @pytest.fixture
 def archive_coverage_data_with_non_visited_origins(mocker, swh_scheduler):
     # mock calls to get nixguix origin counts
-    mock_archive = mocker.patch("swh.web.misc.coverage.archive")
+    mock_archive = mocker.patch("swh.web.archive_coverage.views.archive")
     mock_archive.lookup_latest_origin_snapshot.return_value = {"id": "some-snapshot"}
     mock_archive.lookup_snapshot_sizes.return_value = {"release": 30095}
 
@@ -223,7 +227,7 @@
     swh_scheduler.update_metrics()
 
     # set deposit origins as empty
-    get_deposits_list = mocker.patch("swh.web.misc.coverage.get_deposits_list")
+    get_deposits_list = mocker.patch("swh.web.archive_coverage.views.get_deposits_list")
     get_deposits_list.return_value = []
 
 
@@ -239,7 +243,7 @@
         client,
         url,
         status_code=200,
-        template_used="misc/coverage.html",
+        template_used="archive-coverage.html",
         server_name=SWH_WEB_SERVER_NAME,
     )