Skip to content

feat(cli): simplify domain add/status output for HTTP-DCV - #214

Merged
Brooooooklyn merged 7 commits into
mainfrom
feat/custom-domain-http-dcv
Jun 4, 2026
Merged

Brooooooklyn merged 7 commits into
mainfrom
feat/custom-domain-http-dcv

Conversation

@Brooooooklyn

@Brooooooklyn Brooooooklyn commented Jun 3, 2026 •

Copy link
Copy Markdown
Member

What

Custom-domain certificate validation is moving from TXT-DCV to HTTP-DCV (validated at Cloudflare's edge once the hostname proxies through it). Under HTTP-DCV there are no user-facing _acme-challenge SSL-validation records and renewals are fully automatic, so the CLI's domain output can be simplified.

This is the framework half of the migration. The platform half (API activation gate + create-flow + janitor) is a separate PR in voidzero-dev/void-platform that bumps the submodule pointer to this commit.

Changes

  • domain add now prints exactly two sections — traffic CNAME + ownership TXT — and drops the "TXT (SSL validation)" section plus its deadline-miss fallback hint (both dead/misleading under HTTP-DCV). Summary updated to "Add both records above".
  • domain status only surfaces the ownership TXT while it is still outstanding; the SSL-DCV record block is removed (issuance and renewals never surface user records). computeRollup state machine is unchanged.

Why

Adding a custom domain previously forced 3+ DNS records (CNAME + _cf-custom-hostname ownership TXT + 1–2 rotating _acme-challenge TXT). The _acme-challenge set rotates on every ~90-day renewal and silently drops domains back to pending/404 when nobody re-publishes it (hit live on viteplus.dev). HTTP-DCV collapses the set to 1 CNAME + 1 non-rotating ownership TXT.

Tests

packages/void/test/unit/domain-command.test.ts — 39 passing (two-section reveal assertions; SSL-record/SSL-pending-block assertions removed).

🤖 Generated with Claude Code


Note

Low Risk
CLI and documentation-only UX changes for custom domains; no auth or deploy logic touched, though users on older TXT-DCV expectations may need the paired platform PR.

Overview
Aligns void domain add and void domain status with HTTP-DCV: users only configure a traffic CNAME and a _cf-custom-hostname ownership TXT. All _acme-challenge / TXT (SSL validation) output and the “records will appear in status shortly” fallback are removed.

domain status now shows pending DNS as CNAME (while ssl_status is not active) + ownership TXT (while present), with singular/plural note titles and issuing_cert diagnostics that mention the CNAME only when a cname_target is actually printed. CLI reference docs are updated (HTTP validation, no wildcards, automatic activation / background reconcile).

Unit tests in domain-command.test.ts are rewritten for the two-record model and the new status pending-block behavior.

Reviewed by Cursor Bugbot for commit 206a073. Bugbot is set up for automated code reviews on this repo. Configure here.

Custom-domain certificate validation now uses HTTP-DCV at Cloudflare's
edge, so there are no user-facing `_acme-challenge` SSL-validation
records and renewals are fully automatic.

- `domain add` now prints two sections — traffic CNAME + ownership TXT —
  and drops the "TXT (SSL validation)" section plus its deadline-miss
  fallback hint (both dead/misleading under HTTP-DCV). Summary updated to
  "Add both records above".
- `domain status` only surfaces the ownership TXT while it is still
  outstanding; the SSL-DCV record block is removed (issuance and renewals
  never surface user records). `computeRollup` is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@netlify

netlify Bot commented Jun 3, 2026 •

Copy link
Copy Markdown

❌ Deploy Preview for staging-void-cloud failed.

Name Link
🔨 Latest commit 206a073
🔍 Latest deploy log https://app.netlify.com/projects/staging-void-cloud/deploys/6a2146ef89141c000805ddd8

Comment thread packages/void/src/cli/domain.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f477b73639

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/void/src/cli/domain.ts Outdated
The `void domain add` summary hardcoded "Add both records above", but the
CNAME and ownership-TXT sections are each conditional. When the API returns
fewer than two records the wording was misleading (and in the zero-record
case pointed at records that weren't displayed). Build the record sections
first and derive the summary from them: singular "the record above" for one,
plural "the records above" for two, and render nothing when there are none.

Addresses inline review on #214.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 22eb5f4356

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/void/src/cli/domain.ts
Brooooooklyn and others added 3 commits June 3, 2026 22:22
…ting

`void domain status` only printed a DNS record while the ownership TXT was
outstanding, so once ownership verified but HTTP-DCV was still pending it
showed "issuing cert... No action needed" with no CNAME — even though a
missing/misconfigured traffic CNAME is exactly what blocks HTTP-DCV (the
hostname must proxy through Cloudflare). Now surface the CNAME whenever
`ssl_status !== 'active'` (suppressed once live), alongside the ownership TXT,
with a count-aware title; and soften the issuing_cert diagnostic to point at
the CNAME. Uses the `cname_target` the status endpoint now returns; degrades
gracefully (renders nothing) against an older API that omits it.

Addresses inline review on #214.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
`void domain add` now prints the traffic CNAME + non-rotating
`_cf-custom-hostname` ownership TXT (no `_acme-challenge`, auto-renew);
`void domain status` surfaces both records while the cert is validating
and notes that activation is automatic via the reconcile cron. Adds a
wildcard-not-supported note. Documentation-only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit bdeff52. Configure here.

Comment thread packages/void/src/cli/domain.ts Outdated
The `issuing_cert` rollup diagnostic cited "confirm the traffic CNAME
below," but the CNAME block only renders when `status.cname_target` is
set — so a target-less status response (e.g. an older API during the
deploy window) showed the hint with no CNAME block. Gate the hint on
`status.cname_target` so it matches exactly when the block renders
(`ssl_status !== 'active'` always holds in this branch), and add unit
tests for both branches.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9976da50c2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/reference/cli.md Outdated
The custom-domain CNAME target is API-provided and varies by environment
(e.g. cname.staging.void.app on staging). The reference now points users
at the target shown in `void domain add` output instead of a fixed
`cname.void.app`, matching what domainAdd() actually prints.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@Brooooooklyn
Brooooooklyn merged commit 2263964 into main Jun 4, 2026
7 of 11 checks passed
@Brooooooklyn
Brooooooklyn deleted the feat/custom-domain-http-dcv branch June 4, 2026 09:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant