diff --git a/app/(app)/door/manage/door-manage-client.tsx b/app/(app)/door/manage/door-manage-client.tsx
index 36eaf9b..e061447 100644
--- a/app/(app)/door/manage/door-manage-client.tsx
+++ b/app/(app)/door/manage/door-manage-client.tsx
@@ -14,6 +14,7 @@ import {
deleteDoorConnection,
testDoorConnection,
} from '@/lib/actions'
+import { KNOWN_DOOR_CONTROLLERS, controllerForAdapter } from '@/lib/door-logic'
type Conn = {
id: string
@@ -155,9 +156,12 @@ export function DoorManageClient({
- A connection targets a door controller on your LAN. The shared password is read
- from your encrypted Secrets vault, never stored here. The server only ever calls
- the exact pinned host, never follows redirects, and records every action in the
+ A connection targets a door controller. Because this app is cloud-hosted, the
+ target can be a publicly reachable controller or proxy, or a VPN-reachable
+ device on your LAN. The shared password is read from your encrypted Secrets
+ vault and never stored here. The server only ever calls the exact pinned host
+ (any public or private host you set, except cloud-metadata/link-local), never
+ follows redirects, caps time and response size, and records every action in the
access log with secrets redacted.
+ Per-verb request templates. The template is appended to the base URL and
+ sent as an HTTP GET to the pinned host
+ (no redirects followed). Placeholders are URL-encoded and substituted:
+
+
+
{'{slot}'} — the member’s integer card slot
+
{'{tag}'} — the card UID / tag value
+
{'{perm}'} — permission level (default 1)
+
{'{door}'} — door identifier (for open/lock verbs)
+
{'{pw}'} — the shared password from your Secrets vault (server-side only; never shown or logged)
+
+
+ Leave a verb blank if your controller does not support it. Example
+ (HeatSync-style): ?m{'{slot}'}&p001&t{'{tag}'}&e={'{pw}'}
+