Skip to content

feat: custom domain handle setup (use my own domain) - #4

Merged
holkexyz merged 1 commit into
stagingfrom
feat/custom-domain-handle
Mar 9, 2026
Merged

feat: custom domain handle setup (use my own domain)#4
holkexyz merged 1 commit into
stagingfrom
feat/custom-domain-handle

Conversation

@holkexyz

@holkexyz holkexyz commented Mar 9, 2026

Copy link
Copy Markdown
Member

Summary

  • Adds a "Use my own domain" button to the Username card on the profile dashboard
  • Opens a step-by-step modal walkthrough for setting up a custom domain as your AT Protocol handle (same flow as Bluesky)

How it works

  1. Step 1 — Enter domain: User enters the domain they own (e.g. alice.com)
  2. Step 2 — Add DNS record: Shows the exact DNS TXT record to add (_atproto.alice.comdid=did:plc:xxx) with copy buttons
  3. Step 3 — Verify: Calls com.atproto.identity.updateHandle to verify the DNS record and apply the new handle

Files changed

  • src/components/dashboard/custom-domain-modal.tsx — New modal component with 3-step walkthrough
  • src/components/dashboard/username-card.tsx — Added "Use my own domain" button + modal integration, new did prop
  • src/components/landing/home-client.tsx — Pass did to UsernameCard
  • src/app/globals.css — CSS for domain button + full modal (responsive, mobile-friendly)

QA checklist

  • "Use my own domain" button visible on profile dashboard username card
  • Modal opens with step-by-step flow
  • DNS record values are correct (host = _atproto.domain, value = did=<user-did>)
  • Copy buttons work for host and value
  • Verify step calls updateHandle and shows success/error states
  • Escape closes modal, backdrop click closes modal
  • Mobile responsive (step labels hidden, buttons stack vertically)
  • tsc + next build pass cleanly

…-step modal

- Add CustomDomainModal component with 3-step walkthrough (enter domain, add DNS TXT record, verify)
- Add 'Use my own domain' button to UsernameCard on the profile dashboard
- DNS record instructions with copy-to-clipboard for host and value
- Verification calls com.atproto.identity.updateHandle to confirm DNS
- Success state with auto-reload to reflect new handle
- Full responsive CSS with mobile support, a11y (Escape to close, focus-visible, aria)
- Reuses existing modal pattern (backdrop blur, slide-up animation)
@vercel

vercel Bot commented Mar 9, 2026

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
certified-app Ready Ready Preview, Comment Mar 9, 2026 9:07pm

Request Review

@coderabbitai

coderabbitai Bot commented Mar 9, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Free

Run ID: 6757df37-089e-4b19-b7f0-39a88a8f33cf

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Note

🎁 Summarized by CodeRabbit Free

Your organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login.

Comment @coderabbitai help to get the list of available commands and usage tips.

@holkexyz
holkexyz merged commit 31d420d into staging Mar 9, 2026
3 checks passed
@holkexyz
holkexyz deleted the feat/custom-domain-handle branch March 15, 2026 06:29
hb-agent pushed a commit that referenced this pull request May 10, 2026
Round-2 reviewer C flagged the link-level analogue of round-1's
top-level forward-compat issue: the additional-links save loop
reconstructed each {url, label} from scratch, dropping any per-item
extras a future writer (CLI or feature) might add (e.g. verified,
addedAt). Each row now carries a `loadedRef` to the original record
item; the save spreads loadedRef under the new url/label, mirroring
the same pattern used for the top-level metadata builder. Cleared
labels still come off the wire because `label: undefined` is dropped
by JSON.stringify.

Same change adds a stable per-row id (round-2 reviewer A nit #4 / C
suggestion #2): inputs are now React-keyed by `row.id` instead of array
index, so removing a middle row no longer reuses DOM nodes / focus /
selection from a different row.

Smaller round-2 nits in the same diff:
- Trash button gains `disabled={isSaving}` for parity with Add link
  (B nit #4); adds disabled-style classes for visual feedback.
- Inline comment on the Type radio onChange documents that
  typeOtherText is intentionally preserved when toggling Other → preset
  (A nit #2). Save logic is unaffected.
- profile-client.tsx: the empty-state branch's redundant
  `editHref &&` guard was removed (B nit #6); converted the wrapping
  `(hasDetails || editHref) && <div>...` block to a clean ternary that
  TypeScript narrows correctly. Also reflowed indentation inside the
  Details `<dl>` after the ternary collapse.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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