About domain-mask
domain-mask is a skill for presenting a real webpage under a custom domain during demos or recordings. It starts a local HTTPS reverse proxy with a trusted mkcert certificate and manages the required hosts entry; it is limited to macOS and one domain per run.
Key features
- 01Proxy a target URL under a display domain
- 02Serve through a local HTTPS reverse proxy
- 03Generate a trusted certificate with mkcert
- 04Add and remove a hosts-file entry
- 05Run one display domain per invocation
Use cases
- 01Show a clean domain in a demo address bar
- 02Record a webpage under a custom domain
- 03Preview a target site over trusted local HTTPS
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ adobe/ skills --skill domain-maskAfter installing, type/domain-maskin Claude Code to confirm it loaded.
Bundled files.releaserc.jsonpackage.json
Details
From the project READMEdomain-mask
Mask a URL behind a custom domain for demos and recordings. An HTTPS reverse
proxy makes the address bar show a clean domain (e.g. wknd.adventures) while
content is served from the real URL (e.g. https://main--mysite--org.aem.page).
Trusted certificate via mkcert, no browser warnings.
Requirements
- Node 22+, mkcert (
brew install mkcert && mkcert -install), sudo (port 443 and/etc/hosts) - The
webCLI (playwright-cliis not needed for this command). Locate it once:
# <skill-dir> is the directory containing this SKILL.md
WEB=$(command -v web || echo "node <skill-dir>/../../cli/dist/web.mjs")
then run $WEB …; it prints exactly one JSON document on stdout,
so $WEB … > file.json is safe.
Fallback when published: npx -y @adobe/web-cli. Use an absolute <skill-dir>; don't cd into it.
Workflow
Step 1: Gather inputs
Ask the user for (or extract from their message):
- Display domain: the domain to show (e.g.
wknd.adventures) - Target URL: the real URL to proxy (e.g.
https://gabrielwalt.github.io)
Step 2: Check prerequisites
which mkcert || echo "Install mkcert: brew install mkcert && mkcert -install"
If mkcert is missing, tell the user to install it and run mkcert -install once.
Step 3: Have the user start the proxy
The command prompts for the sudo password and stays in the foreground until
Ctrl+C, so the user runs it in their own terminal. Give them the command with
WEB expanded to the resolved form:
sudo env CAROOT="$(mkcert -CAROOT)" $WEB mask "<display-domain>" "<target-url>"
CAROOT is resolved before sudo, so mkcert signs with the CA the user
installed rather than one under root's home, which the browser would not trust.
Without root the command exits 2 (USAGE).
It adds 127.0.0.1 <display-domain> to /etc/hosts, generates a trusted
certificate via mkcert, starts an HTTPS reverse proxy on port 443, and prints
{ url, displayDomain, targetUrl }.
Tell the user:
- Open
https://<display-domain>; the address bar shows the display domain with a padlock - Press Ctrl+C when done: the hosts entry is removed and the certs are cleaned up
Step 4: Confirm cleanup
After the user stops the proxy, check that the hosts entry is gone (no output means clean):
grep -Fx '127.0.0.1 <display-domain>' /etc/hosts
If the line is still there, have the user remove it. Escape the dots so sed
matches only that line, e.g. for wknd.adventures:
sudo sed -i '' '/^127\.0\.0\.1 wknd\.adventures$/d' /etc/hosts
Limitations
- macOS only (
/etc/hostspath,brew install mkcert) - Requires sudo (privileged port 443 + hosts file)
- One display domain per invocation
- Does not rewrite URLs inside HTML/CSS/JS response bodies