+ {!caddy ? (
+
+ ) : !caddy.installed ? (
+
+ ) : null}
+
+ Open a route to issue or renew its certificate. The dashboard
+ displays the exact _acme-challenge TXT record;
+ add it at Cloudflare, wait for propagation, then click
+ Validate.
+
+
+ Certificates are renewed manually from the route page because
+ DNS validation needs your registrar. The route list shows
+ expiry warnings.
+
+
+ The Caddy ingress listens on port {caddy?.https_port || 8443}.
+ It never binds ports 80 or 443.
+
+
+
+ );
+}
diff --git a/src/pages/admin/setup/tls/(sections)/tls-status-section.tsx b/src/pages/admin/setup/tls/(sections)/tls-status-section.tsx
new file mode 100644
index 0000000..f26a1ad
--- /dev/null
+++ b/src/pages/admin/setup/tls/(sections)/tls-status-section.tsx
@@ -0,0 +1,117 @@
+import { RefreshCw } from "lucide-react";
+import Button from "@/src/components/twui/layout/Button";
+import Stack from "@/src/components/twui/layout/Stack";
+import Panel from "@/src/components/general/panel";
+import StatusDot from "@/src/components/general/status-dot";
+import InlineAlert from "@/src/components/general/inline-alert";
+import KeyValueList from "@/src/components/general/key-value-list";
+import type useTlsStatus from "../../(hooks)/use-tls-status";
+
+type Props = {
+ tls: ReturnType